kafka客户端指标上报Prometheus方案(已开源)
已开源 https://github.com/pierre94/kafka-client-prometheus-collector ,这里简单介绍下我的实现思路
一、背景
在我们场景下,需要将海量数据透传到我们的Kafka集群,这时候我们常常会遇到这些问题:
- 我们数据压缩率是多少?后端需要多少资源来支持?
- 我们kafka客户端的负载是怎么样的?能不能承受更高的压力?
- 如何对kafka客户端做生产端调优?怎么提升我们的性能?
在过去我们会根据Kafka官方文档以及他人的经验总结,结合基础监控指标(如CPU、内存、网络等)可以大致总结出一个基础的评估方法。
在实际业务场景下,我们发现这种不具备可观测性的评估方法不能很好的满足我们的需求,所以我们尝试寻找一种完善的Kafka客户端内部指标的采集上报方案。
大数据领域可观测性建设可以系统学习下Apache Calcite Committer forward的文章
相比Kafka的服务端领域,我们发现开源社区普遍不太重视客户端的可观测性建设,没有一个特别完善好用的轮子。所以我们借鉴一些开源组件的思路,实现了这个小巧简单的lib来帮助开发者将kafka客户端的指标上报到Prometheus。
二、功能设计与效果展示
1、功能模块
已具备如下基础功能:
- 支持HTTP Export
- 支持PushGateway(含pushService)
- 支持Producer(含Dashboard)
- 支持Consumer(仅支持collector)
2、设计实现
实现逻辑也比较清晰,使用Kafka客户端Metric相关API获取到metric值,再按照我们对指标的理解翻译成Prometheus的指标值,构建Collector。
受限于kafka和Prometheus的限制,翻译模块的实现还不是很优雅。
3、效果展示
(提供Producer的Grafana DashBoard)
4、项目总结
与业界方案相比,我们具备如下优势:
- 开箱即用,周边完善。与
Prometheus
完美结合, - 覆盖官方客户端的全部指标,后续结合运营经验提供黑白名单参考
- 同时支持
HTTP Export
和PushGateway
的推拉模型 - 支持
Producer
和Consumer
2种客户端类型,同时支持多个client
实例 - 方便地集成到业务代码里,不需要额外部署采集组件
- 开箱即用,周边完善。已有相对完善的
Grafana DashBoard
三、接入使用
目前还没有传到公共仓库,仅供参考
1、接入方法
见: https://github.com/pierre94/kafka-client-prometheus-collector
2、使用方法
目前支持HTTP Export
和PushGateway
2种方法将指标接入到Prometheus
2.1、HTTP Export
Producer<Integer,String> producer = new KafkaProducer<Integer, String>(props);
new KafkaClientMetricCollector(Collections.singletonList(producer)).register();
HTTPServer server = new HTTPServer(8033);
curl http://{ip}:8033/metrics
2.2、 PushGateway
2.2.1 使用本项目的pushService
参照TestKafkaConsumerMetricCollector实现
KafkaConsumer<Integer, String> consumer1 = new KafkaConsumer<>(props);
KafkaConsumer<Integer, String> consumer2 = new KafkaConsumer<>(props);
consumer1.subscribe(Collections.singletonList("kafka_test"));
consumer2.subscribe(Collections.singletonList("kafka_test"));
List<Object> clientList = new ArrayList<>();
clientList.add(consumer1);
clientList.add(consumer2);
new KafkaClientMetricPushService(clientList,System.getenv("pushGateWayServer"), "my_kafka_client");
pushService还支持指定push间隔
// 15s 后启动上报线程,上报周期是60s
new KafkaClientMetricPushService(clientList, System.getenv("pushGateWayServer"), "my_kafka_client",15,60);
2.2.2 业务自定义上报
需要业务自己启动一个单独的push线程。Push
类似HTTP Export
,参考方法如下:
Collector register = new KafkaClientMetricCollector(clientList).register();
PushGateway pg = new PushGateway("127.0.0.1:9091");
pg.push(registry, "my_kafka_client_job");
四、ROADMAP
- 考虑到兼容0.9.0.1的client,使用了deprecated的api
org.apache.kafka.common.Metric.value
,后续考虑替换
五、参考资料
- https://docs.appdynamics.com/display/PRO45/Default+JMX+Metrics+for+Apache+Kafka+Backends
- https://github.com/prometheus/jmx_exporter/pull/413
- https://github.com/sysco-middleware/kafka-client-collector
- https://kafka.apache.org/10/javadoc/index.html?org/apache/kafka/common/Metric.html
- http://cloudurable.com/blog/kafka-tutorial-kafka-producer-advanced-java-examples/index.html
- https://yunlzheng.gitbook.io/prometheus-book/part-ii-prometheus-jin-jie/exporter/custom_exporter_with_java/client_library_java
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android用过TextView实现跑马灯效果的示例
- android如何设置Activity背景色为透明色
- Android 手机防止休眠的两种实现方法
- Android编程实现的首页左右滑动切换功能示例
- 零基础学小程序004----小程序post请求,提交数据到服务器,小程序下单,小程序用户注册功能
- HorizontalScrollView水平滚动控件使用方法详解
- Android Activity生命周期和堆栈管理的详解
- Android学习之SharedPerference存储详解
- Android编程实现对话框Dialog背景透明功能示例
- Android开发中DatePicker日期与时间控件实例代码
- Android Shader应用开发之霓虹闪烁文字效果
- Android中ToggleButton开关状态按钮控件使用方法详解
- 零基础学小程序005---小程序登陆注册功能实现
- Android RecyclerView 复用错乱通用解法详解
- Android把Bitmap保存为PNG图像文件的简单代码