Prometheus Kafka Adapter

在使用 Prometheus 的时候,有时候我们需要把 Prometheus 的数据导出到其他系统里,这样可以有另外的处理方式。

我们可以通过远程写的方式,将 Prometheus 的数据实时的写到其他系统。Prometheus 支持很多远程写的系统,详细的可以查看 Prometheus 的 Remote Endpoints and Storage ,现在我们来看看 Prometheus 怎么写入到 Kafka 系统。

Prometheus 官方推荐了一个中间件,用来连接 Prometheus 和 Kafka ,这个组件就是 prometheus-kafka-adapter ,这个组件的官方地址是 https://github.com/telefonica/prometheus-kafka-adapter 。这个组件最后的更新时间是 2020 年 6 月 4 日,版本是 v1.7.0 ,到现在已经一年多没有更新了。但是没有其他推荐的组件,并且经过测试,当前可以版本还可以继续使用,我们使用 Prometheus 版本是 v2.29.1 。使用这个组件需要 Prometheus 将数据实时的推送到 prometheus-kafka-adapter ,然后 prometheus-kafka-adapter 将数据推送到 Kafka。

启动 adapter

prometheus-kafka-adapter 提供了构建好的 Docker 镜像,存储在 Docker Hub 上,我们将镜像拉取下来以后可以使用如下的 shell 脚本来启动这个镜像。

在启动 prometheus-kafka-adapter 之前我们需要先搭建好 Kafka 并且创建好 Kafka 的 Topic ,这个在 Kafka 的使用中是基础操作,我们就不再描述,大家可以自行搜索学习,也可以让公司的 Kafka 管理员来提供对应的信息。

我们需要先准备好 Kafka 的地址和监听端口,以及专门用来中转数据的 Topic ,我们这次的 Topic 名称是 prometheus-metric .

#!/usr/bin/env bash

docker run -d --name prometheus-kafka-adapter-01 --restart=always -m 2g \
-e KAFKA_BROKER_LIST=192.168.50.90:9093 \
-e KAFKA_TOPIC=prometheus-metric \
-e PORT=10401 \
-e SERIALIZATION_FORMAT=json \
-e GIN_MODE=release \
-e LOG_LEVEL=debug \
-p 10401:10401 \
telefonica/prometheus-kafka-adapter:1.7.0 \

上边的脚本除了启动一个容器以外,还做了一些容器的加固。另外配置 prometheus-kafka-adapter 的监听端口 10401 ,只要 Prometheus 向这个端口推送数据,adapter 就能收到。

当前这个 Kafka 是没有认证的要求的,如果 Kafka 启用了秘钥或者口令的验证方式的话,也可以通过配置环境变量选择相应的参数来进行配置。

基于 SSL 的秘钥认证参数

  • KAFKA_SSL_CLIENT_CERT_FILE: Kafka SSL client 认证文件
  • KAFKA_SSL_CLIENT_KEY_FILE: Kafka SSL client 认证秘钥文件
  • KAFKA_SSL_CLIENT_KEY_PASS: Kafka SSL client 认证秘钥文件的密码,是一个可选项
  • KAFKA_SSL_CA_CERT_FILE: Kafka SSL 的 CA 认证文件

这些选项的默认值都是 ""

基于 SASL/SCRAM 的口令认证参数

  • KAFKA_SECURITY_PROTOCOL: Kafka client 和代理通信的协议, 如果要使用必须设置为 SASL ,无论是普通的还是使用SSL
  • KAFKA_SASL_MECHANISM: 用于身份验证的的机制是 SASL 机制。
  • KAFKA_SASL_USERNAME: SASL 的用户名
  • KAFKA_SASL_PASSWORD: SASL 的密码

Prometheus 配置

Prometheus 的基础配置是老朋友了,不需要特别说明,需要说明的是我们需要打开远程写功能,并且配置 prometheus-kafka-adapter 的地址和端口,像下边这样。

#远程写到 kafka adapter
remote_write:
  - url: "http://10.129.49.251:10410/receive"

scrape_configs:
  - job_name: 'promtsdb'
    static_configs:
      - targets:
      - 127.0.0.1:9090

配置好以后重新加载 Prometheus 的配置文件,然后去 Kafka 的 Topic 里查询数据。可以看到 Kafka 里的每条数据都是大约下边这种格式。

{
  "timestamp": "1970-01-01T00:00:00Z",
  "value": "9876543210",
  "name": "up",

  "labels": {
    "__name__": "up",
    "label1": "value1",
    "label2": "value2"
  }
}

prometheus-kafka-adapter 的使用

上边的配置只是的实现了 Prometheus 将数据发送到了 Kafka 的目的,并且是一对一的关系。生产环境中的需求是多种多样的,我进行了如下尝试,并且获得了成功。

多个 Prometheus 实例向一个 adapter 推送数据

这个我做过测试,在每个 Prometheus 中配置同一个 prometheus-kafka-adapter 的地址和端口就可以实现,并且没有其他问题。

多个 adapter 向一个 Kafka Topic 推送数据

这个我也做过测试,在每个 prometheus-kafka-adapter 启动的时候都指定同一个 Kafka 的 Topic 就可以。Kafka 会正常接收数据,没有其他问题。

一个 adapter 向多个 Kafka Topic 推送数据

这个应该是无法实现的,adapter 启动的时候只能 指定一个 Kafka 的 Topic 。如果有一个 Prometheus 的数据想要推送到多个 Kafka 的 Topic ,应该是启动多个 adapter ,每个 adapter 配置对应点 Kafka 的 Topic ,然后在 Prometheus 的远程写配置中配置多个 adapter 的地址。

一个 Prometheus 想多个 adapter 推送数据

这种场景应该是启动多个 adapter ,每个 adapter 配置对应点 Kafka 的 Topic ,然后在 Prometheus 的远程写配置中配置多个 adapter 的地址。

一个 Prometheus 的部分 Job 向 adapter 推送数据

这个应该是无法实现的。Prometheus 的远程写功能是基于 Prometheus 实例全局来生效的,并不是基于 Prometheus 的 Job 来生效,所以如果一定要实现这种基于 Job 的推送,那么可以对 Prometheus 进行拆分,将需要推送的 Job 集中到一个 Prometheus 实例上,然后配置向 adapter 推送。这种情况需要构建 Prometheus 多实例集群,推荐基于 Thanos 来构建。

results matching ""

    No results matching ""