写点什么

如何使用 Prometheus Kafka Adapter 向 Kafka 推送 Prometheus 数据

作者:耳东@Erdong
  • 2021 年 11 月 14 日
  • 本文字数:2209 字

    阅读完需:约 7 分钟

在使用 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 的地址和端口,像下边这样。


scrape_configs:  - job_name: 'promtsdb'    static_configs:      - targets:      - 127.0.0.1:9090
#远程写到 kafka adapter
remote_write: - url: "http://10.129.49.251:10410/receive"
复制代码


配置好以后重新加载 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 来构建。

发布于: 3 小时前阅读数: 5
用户头像

耳东@Erdong

关注

还未添加个人签名 2020.05.24 加入

主要研究分享运维技术,专注于监控、CICD、操作系统、云原生领域,公众号【耳东学堂】,知识星球同名,坚持原创,希望能和大家在运维路上结伴而行 邮箱:erdong@mail.erdong.site

评论

发布
暂无评论
如何使用 Prometheus Kafka Adapter 向 Kafka 推送 Prometheus 数据