InfluxDB 现在原生支持 Prometheus Remote Read & Write

导航至

上个月,我参加了在慕尼黑举行的年度 Prometheus 会议 PromCon。会议内容包括用户和实施者的演讲,主题涵盖了操作指南、案例研究以及关于 Prometheus 2.0 存储引擎 实施的详细信息。我做了一个关于 集成 InfluxDB 和 Prometheus 的演讲。演讲结束后,许多人来找我,表示对 Prometheus 和 InfluxDB 之间更深入的集成感兴趣。这激励了我们的团队投入更多精力,将原生 Prometheus 支持引入 InfluxDB。我很高兴地宣布,这一目标的第一阶段现已完成:InfluxDB 1.4 的每夜构建版本现在原生支持 Prometheus remote read 和 write API。我将在本文稍后介绍详细信息。

为什么要支持 Prometheus?它们不是在做类似的事情吗?

我经常被问到这个问题,所以让我来解答一下。Prometheus 服务器专注于指标数据,旨在成为一个临时的、基于拉取的存储和监控系统。与此同时,InfluxDB 专注于 时间序列(指标和事件),旨在用作临时数据存储或永久数据记录存储。这是一个重要的区别,对每个项目适用的用例都有很大的影响。对于您想要长期保存数据或将单个事件推送到数据库的情况,InfluxDB 是更合适的选择。对于临时的、基于拉取的数据,任何服务器都适用。

但是 Prometheus 不仅仅是一个服务器。我认为 Prometheus 是一套标准和项目,服务器只是其中更大整体的一部分。从这个角度来看,我认为我们有很多方法可以与整个 Prometheus 生态系统合作,并做出有意义的贡献。

Prometheus 作为标准指标格式

Prometheus 开发了一种 标准公开格式,并提供了出色的 客户端库,以及超过 100 个导出器,以 Prometheus 格式公开指标。服务发现 Prometheus 中的代码也用于其他项目,包括我们自己的 Kapacitor。此外,Prometheus 还有他们的 Alert Manager 项目。我们认为这是一项高质量的工作,我们计划在 InfluxData 生态系统中将 Prometheus 公开格式作为一流公民来支持。

向 InfluxDB 添加 Prometheus Remote API

Prometheus 支持 remote read 和 write API,使其可以将抓取的数据存储在其他数据存储中。写入操作会转发到远程存储。对于读取操作,功能相当基础,因为它会向下推送 Prometheus 查询的开始和停止时间以及查询所需的标签匹配(Influx 中的标签)。所有这些数据都通过网络流式传输,Prometheus 服务器进行计算,将结果返回给用户。

以前,要将 Prometheus 与 InfluxDB 集成,您必须使用 示例 remote storage adapter。这种方法的缺点是它被标记为实验性示例,不适用于生产环境。这也意味着您需要操作和管理另一个基础设施组件。最后,它引入了不必要的编组开销。

在劳动节周末,我决定将对 Prometheus read 和 write API 的原生支持引入 InfluxDB。该实现与 Prometheus 示例实现略有不同。所有标签都转换为标签,指标名称转换为标签 name,就像在底层 Prometheus 实现中一样。所有内容都写入 measurement _,字段名称为 f64。基本上,我们忽略了 measurement 和 field,而是将所有内容都放入标签中。这反映了我们在 新的数据模型和查询语言 中正在努力的方向。

在短期内,这种模型在 InfluxQL 中可能使用起来有些笨拙,但对于在 Prometheus remote read 端拉取数据来说,它更理想。借助新的 “IFQL”语言,它将处于一种与该语言和引擎完美配合的结构中。此功能应被视为 beta 版本。

要开始使用此功能,您需要使用 InfluxDB 的每夜构建版本,并设置 Prometheus 配置的远程部分。以下是配置示例

# Remote write configuration (for Graphite, OpenTSDB, or InfluxDB).
remote_write:
- url: "http://localhost:8086/api/v1/prom/write?u=paul&p=foo&db=prometheus"
# Remote read configuration (for InfluxDB only at the moment).
remote_read:
- url: "http://localhost:8086/api/v1/prom/read?u=paul&p=foo&db=prometheus"

从示例中您可以看到,新的端点是 /api/v1/prom/read 和 /api/v1/prom/write。您可以使用查询参数传入要写入数据的数据库以及可选的用户和密码。将密码保存在配置文件中并不理想,因此最好更新 Prometheus,使其能够从环境变量中读取密码。

一旦此功能集成到我们的 InfluxDB Cloud 产品中,我们的客户将能够使用我们的云产品作为其本地 Prometheus 服务器的长期存储。或者对于我们的 InfluxDB 企业版客户,他们将拥有一个集群的、高可用的长期数据存储,用于存储他们的 Prometheus 数据。

我们将研究其他方法,以便为开源 Prometheus 社区做出贡献,并努力在 Influx 堆栈中添加对 Prometheus 标准和 API 的更多支持。PromCon 2017 是一次很棒的会议,我深受启发,将推动我们的产品在这个新的工具生态系统中良好运行。