当前位置: 首页 > news >正文

Grafana Prometheus 通过JMX监控kafka

第三方kafka exporter方案

目前网上关于使用Prometheus 监控kafka的大部分资料都是使用一个第三方的
kafka exporter,他的原理大概就是启动一个kafka客户端,获取kafka服务器的信息,然后提供一些metric接口供Prometheus使用,随意它能展示的监控信息比较有限,只有每个主题的分区数,每秒/分钟消息数,消费组的lag数。但是kafka本身的JMX有提供500+的监控信息可以进行监控,当然不是说这这么监控指标都很重要,相比kafka exporter直接使用JMX可监控的选项会更多。
在这里插入图片描述

Prometheus官方方案

Prometheus官方提供的jmx_exporter可以将JMX转换为Prometheus Metrics格式。

Prometheus JMX exporter使用方式选择

jmx_exporter提供两种用法:

  • 一种是启动独立的进程。JVM 启动时指定参数,暴露 JMX 的 RMI 接口,JMX_Exporter 调用 RMI 获取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。
  • 一种是JVM进程内启动,通过java agent的形式运行,进程内读取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。官方比较推荐使用这种方式。

使用JMX exporter监控kafka

在kafka-server-start.sh最上面添加下面的代码:

export KAFKA_OPTS="-javaagent:/opt/kafka_2.11-1.1.0/bin/jmx_prometheus_javaagent-0.19.0.jar=9990:/opt/kafka_2.11-1.1.0/bin/kafka-jmx.yml"

jmx_exporter官网下载最新的jmx_prometheus_javaagent-0.19.0.jar包。

kafka-jmx.yml

lowercaseOutputName: truerules:
# Special cases and very specific rules
- pattern : kafka.server<type=(.+), name=(.+), clientId=(.+), topic=(.+), partition=(.*)><>Valuename: kafka_server_$1_$2type: GAUGElabels:clientId: "$3"topic: "$4"partition: "$5"
- pattern : kafka.server<type=(.+), name=(.+), clientId=(.+), brokerHost=(.+), brokerPort=(.+)><>Valuename: kafka_server_$1_$2type: GAUGElabels:clientId: "$3"broker: "$4:$5"
- pattern : kafka.coordinator.(\w+)<type=(.+), name=(.+)><>Valuename: kafka_coordinator_$1_$2_$3type: GAUGE# Generic per-second counters with 0-2 key/value pairs
- pattern: kafka.(\w+)<type=(.+), name=(.+)PerSec\w*, (.+)=(.+), (.+)=(.+)><>Countname: kafka_$1_$2_$3_totaltype: COUNTERlabels:"$4": "$5""$6": "$7"
- pattern: kafka.(\w+)<type=(.+), name=(.+)PerSec\w*, (.+)=(.+)><>Countname: kafka_$1_$2_$3_totaltype: COUNTERlabels:"$4": "$5"
- pattern: kafka.(\w+)<type=(.+), name=(.+)PerSec\w*><>Countname: kafka_$1_$2_$3_totaltype: COUNTER- pattern: kafka.server<type=(.+), client-id=(.+)><>([a-z-]+)name: kafka_server_quota_$3type: GAUGElabels:resource: "$1"clientId: "$2"- pattern: kafka.server<type=(.+), user=(.+), client-id=(.+)><>([a-z-]+)name: kafka_server_quota_$4type: GAUGElabels:resource: "$1"user: "$2"clientId: "$3"# Generic gauges with 0-2 key/value pairs
- pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.+), (.+)=(.+)><>Valuename: kafka_$1_$2_$3type: GAUGElabels:"$4": "$5""$6": "$7"
- pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.+)><>Valuename: kafka_$1_$2_$3type: GAUGElabels:"$4": "$5"
- pattern: kafka.(\w+)<type=(.+), name=(.+)><>Valuename: kafka_$1_$2_$3type: GAUGE# Emulate Prometheus 'Summary' metrics for the exported 'Histogram's.
#
# Note that these are missing the '_sum' metric!
- pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.+), (.+)=(.+)><>Countname: kafka_$1_$2_$3_counttype: COUNTERlabels:"$4": "$5""$6": "$7"
- pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.*), (.+)=(.+)><>(\d+)thPercentilename: kafka_$1_$2_$3type: GAUGElabels:"$4": "$5""$6": "$7"quantile: "0.$8"
- pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.+)><>Countname: kafka_$1_$2_$3_counttype: COUNTERlabels:"$4": "$5"
- pattern: kafka.(\w+)<type=(.+), name=(.+), (.+)=(.*)><>(\d+)thPercentilename: kafka_$1_$2_$3type: GAUGElabels:"$4": "$5"quantile: "0.$6"
- pattern: kafka.(\w+)<type=(.+), name=(.+)><>Countname: kafka_$1_$2_$3_counttype: COUNTER
- pattern: kafka.(\w+)<type=(.+), name=(.+)><>(\d+)thPercentilename: kafka_$1_$2_$3type: GAUGElabels:quantile: "0.$4"	

配置好kafka-server-start.sh后还需要重启kafka。

Prometheus配置

在Prometheus的prometheus.yml添加如下内容。注意端口号为KAFKA_OPTS配置的端口。

- job_name: "kafka_jmx"metrics_path: /metricsstatic_configs:- targets: ['192.168.249.1:9990','192.168.249.2:9990','192.168.249.3:9990']

配置完成后重新加载Prometheus配置文件就可以了。

grafana 配置

通过上面配置后,可以在grafan中找到对应的面板直接来用。

https://grafana.com/grafana/dashboards/18276-kafka-dashboard/

效果

效果

http://www.lryc.cn/news/118180.html

相关文章:

  • vue项目切换页面白屏不显示解决方案
  • Goland报错 : Try to open it externally to fix format problem
  • Python-OpenCV中的图像处理-几何变换
  • 前端JavaScript入门-day08-正则表达式
  • ML类CFAR检测器在不同环境中检测性能的分析
  • element-ui 路由动态加载功能
  • (学习笔记-进程管理)进程调度
  • 十分钟python入门 正则表达式
  • 关于数据拷贝赋值方法
  • Effective Java笔记(32)谨慎并用泛型和可变参数
  • 数据结构——双向链表
  • Declare 关键字在 TypeScript 中如何正确使用?
  • ChatGPT将会成为强者的外挂?—— 提高学习能力
  • AUTOSAR规范与ECU软件开发(基础篇)1.3 车用控制器软件标准(从OSEK到AUTOSAR)
  • R语言5_安装Giotto
  • centos按用户保存历史执行命令
  • 【力扣】61. 旋转链表 <快慢指针>
  • 编写一个指令(v-focus2end)使输入框文本在聚焦时焦点在文本最后一个位置
  • Virtualbox设置访问外网以及主机和虚拟机互通
  • 请简述React是什么?React的主要特点有哪些?React中有哪些主要组件?
  • DevOps最佳实践和工具在本地环境中的概述
  • kafka和rabbitmq之间的区别以及适用场景
  • python——案例15:判断奇数还是偶数
  • springboot汽车租赁后台java出租客户管理jsp源代码mysql
  • Linux学习之sed删除、追加、插入、更改、读写文件、下一行、打印、退出和seq命令
  • JuiceFS 在多云存储架构中的应用 | 深势科技分享
  • 什么是DNS的缓存?
  • smtplib.SMTPHeloError: (500, b‘Error: bad syntax‘)
  • /proc directory in linux
  • 装饰器模式(C++)