Prometheus 监控之 kafka

2023-11-06

初探

默认情况下, Kafka metrics 所有的 metric 都可以通过 JMX 获取,暴露kafka metrics 支持两种方式
1.在 Kafka Broker 外部, 作为一个独立进程, 通过 JMX 的 RMI 接口读取数据. 这种方式的好处是有任何调整不需要重启 Kafka Broker 进程, 缺点是多维护了一个独立的进程。
2.在 Kafka Broker 进程内部读取 JMX 数据, 这样解析数据的逻辑就在 Kafka Broker 进程内部, 如果有任何调整, 需要重启 Broker。
在这里插入图片描述

选择暴露 kafka-metric 方式

第一种需要外部多维护一个程序,而且还要考虑之后各种版本升级,实现起来比较繁琐,还好的是github上有许多优秀的开源kafka_exporter 下载过来直接启动就好了。简单介绍下
git项目地址:https://github.com/danielqsj/kafka_exporter
下载地址: https://github.com/danielqsj/kafka_exporter/releases/download/v1.2.0/kafka_exporter-1.2.0.linux-amd64.tar.gz
启动

kafka_exporter --kafka.server=kafka:9092 [--kafka.server=another-server ...]

Grafana画图也有许多优秀的开源dashboard

第二种是读取 JMX 的数据. Prometheus 官方的组件 jmx_exporter 把两种实现都提供了:

  • jmx_prometheus_httpserver 通过独立进程读取 JMX 的数据
  • jmx_prometheus_javaagent 使用 Java Agent 方式, 尽量无侵入(仅需在 java 命令行中使用 -javaagent 参数)的启动 in-process library, 读取 JMX 数据.
    Prometheus 采用了 PULL 方式, Prometheus 主动抓取 metrics 数据, 而不是靠客户端主动 PUSH 数据, 因此 jmx_prometheus 都是通过暴露 HTTP 端口的方式暴露 metrics 数据, 方便 Prometheus 抓取数据.

选择方案2

我们这里选择第二种jmx_prometheus_javaagent 方式收集kafka指标

部署流程:
下载jmx_prometheus_javaagent和kafka.yml
wget https://raw.githubusercontent.com/prometheus/jmx_exporter/master/example_configs/kafka-0-8-2.yml
wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.6/jmx_prometheus_javaagent-0.6.jar
打开 kafka-server-start.sh 文件

添加几行代码:

export JMX_PORT="9999"
export KAFKA_OPTS="-javaagent:/path/jmx_prometheus_javaagent-0.6.jar=9991:/path/kafka-0-8-2.yml"

然后重启kafka。
访问 http://localhost:9991/metrics 可以看到各种指标了。

监控指标

部分监控指标解释,不一定准确,请参考。还有参考 monitoring kafafka 有详细的指标信息

指标 解释
kafka_server_replicafetchermanager_maxlag Max
kafka_server_replicamanager_isrexpands_total ISR expansion rate 扩大率(ISR是in-sync replicas的简写)
kafka_server_replicamanager_isrshrinks_total ISR shrink rate 收缩率
kafka_server_replicamanager_underreplicatedpartitions # of under replicated partitions (|ISR| < |all replicas|)
kafka_network_requestmetrics_responsesendtimems Time to send the response Produce
kafka_network_socketserver_networkprocessoravgidlepercent The average fraction of time the network processors are idle
kafka_network_requestmetrics_responsesendtimems
kafka_network_requestmetrics_requestqueuetimems Time the request waiting in the request queue Produce
kafka_network_requestmetrics_remotetimems Time the request waits for the follower Produce
kafka_network_requestmetrics_localtimems Time the request being processed at the leader Produce
kafka_log_logflushstats_logflushrateandtimems_count Log flush latency
kafka_server_replicafetchermanager_minfetchrate Max lag in messages btw follower and leader replicas > 4000
kafka_controller_controllerstats_uncleanleaderelectionspersec Unclean leader election has occurred last 15m
kafka_server_replicamanager_underreplicatedpartitions Under replicated partitions
kafka_controller_kafkacontroller_activecontrollercount 活跃的 Controller 的数量
kafka_controller_controllerstats_uncleanleaderelectionspersec 争议的 leader 选举次数
kafka_controller_controllerstats_controlledshutdownrateandtimems 将ISR中处于关闭状态的副本从集合中去除掉,返回一个新的ISR集合,然后选取第一个副本作为leader,然后令当前AR作为接收LeaderAndIsr请求的副本。
kafka_controller_kafkacontroller_offlinepartitionscount 从活着的ISR中选择一个broker作为leader,如果ISR中没有活着的副本,则从assignedReplicas中选择一个副本作为leader,leader选举成功后注册到Zookeeper中,并更新所有的缓存。
broker指标
kafka_server_brokertopicmetrics_messagesin_total 所有topic消息(进出)流量 消息写入总量
kafka_server_brokertopicmetrics_bytesrejected_total 扔掉的流量
kafka_server_brokertopicmetrics_failedfetchrequests_total 当前机器fetch请求失败的数量
kafka_server_brokertopicmetrics_bytesout_total 输出的流量
kafka_server_brokertopicmetrics_bytesin_total 输入的流量
kafka_server_brokertopicmetrics_failedproducerequests_total 当前机器produce请求失败的数量
kafka_server_replicamanager_partitioncount 该broker上的partition的数量
kafka_server_replicamanager_leadercount Leader的replica的数量
kafka_network_requestmetrics_totaltimems{FetchConsumer\FetchFollower\Produce} 一个请求FetchConsumer\FetchFollower\Produce耗费的所有时间

预警指标分析

kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions **
含义: 正在复制的 Partition 的数量.
建议报警阈值: > 0 就建议报警. 但如果 Kafka 集群正在 reassign partition 时, 这个值也会 >0

kafka.controller:type=KafkaController,name=OfflinePartitionsCount
含义: 没有 Leader 的 Partition 的数量. 处于这个状态的 Partition 是不可读也不可写
建议报警阈值: >0 一旦出现就报警.

kafka.controller:type=KafkaController,name=ActiveControllerCount
含义: 活跃的 Controller 的数量.
建议报警阈值: != 0 就赶紧报警

kafka.server:type=ReplicaManager,name=PartitionCount
含义: 集群中 Partition 的总数
建议报警阈值: 感觉这个报警不可控.

kafka_controller_controllerstats_leaderelectionrateandtimems
含义: Leader election rate 领导人选举率

UncleanLeaderElectionsPerSec
含义: Unclean leader election rate 争议的 leader 选举次数

描述:所有的topic的消息速率(消息数/秒)
Mbean名:“kafka.server”:name=“AllTopicsMessagesInPerSec”,type=“BrokerTopicMetrics”
正常的值:

描述:所有的topic的流入数据速率(字节/秒)
Mbean名:“kafka.server”:name=“AllTopicsBytesInPerSec”,type=“BrokerTopicMetrics”
正常的值:

描述:producer或Fetch-consumer或Fetch-follower的请求速率(请求次数/秒)
Mbean名:“kafka.network”:name="{Produce|Fetch-consumer|Fetch-follower}-RequestsPerSec",type=“RequestMetrics”
正常的值:

描述:所有的topic的流出数据速率(字节/秒)
Mbean名: “kafka.server”:name=“AllTopicsBytesOutPerSec”,type=“BrokerTopicMetrics”
正常的值:

描述:刷日志的速率和耗时
Mbean名: “kafka.log”:name=“LogFlushRateAndTimeMs”,type=“LogFlushStats”
正常的值:

描述:正在做复制的partition的数量(|ISR| < |all replicas|)
Mbean名:“kafka.server”:name=“UnderReplicatedPartitions”,type=“ReplicaManager”
正常的值:0

描述:当前的broker是否为controller
Mbean名:“kafka.controller”:name=“ActiveControllerCount”,type=“KafkaController”
正常的值:在集群中只有一个broker的这个值为1

描述:选举leader的速率
Mbean名:“kafka.controller”:name=“LeaderElectionRateAndTimeMs”,type=“ControllerStats”
正常的值:如果有broker挂了,此值非0

描述:Unclean的leader选举速率
Mbean名:“kafka.controller”:name=“UncleanLeaderElectionsPerSec”,type=“ControllerStats”
正常的值:0

描述:该broker上的partition的数量
Mbean名: “kafka.server”:name=“PartitionCount”,type=“ReplicaManager”
正常的值:应在各个broker中平均分布

描述:Leader的replica的数量
Mbean名: “kafka.server”:name=“LeaderCount”,type=“ReplicaManager”
正常的值:应在各个broker中平均分布

描述:ISR的收缩(shrink)速率
Mbean名:“kafka.server”:name=“ISRShrinksPerSec”,type=“ReplicaManager”
正常的值:如果一个broker挂掉了,一些partition的ISR会收缩。当那个broker重新起来时,一旦它的replica完全跟上,ISR会扩大(expand)。除此之外,正常情况下,此值和下面的扩大速率都是0。

描述:ISR的扩大(expansion)速率
Mbean名: “kafka.server”:name=“ISRExpandsPerSec”,type=“ReplicaManager”
正常的值:参见ISR的收缩(shrink)速率

描述:follower落后leader replica的最大的消息数量
Mbean名:“kafka.server”:name="([-.\w]+)-MaxLag",type=“ReplicaFetcherManager”
正常的值:小于replica.lag.max.messages

描述:每个follower replica落后的消息速率
Mbean名:“kafka.server”:name="([-.\w]+)-ConsumerLag",type=“FetcherLagMetrics”
正常的值:小于replica.lag.max.messages

描述:等待producer purgatory的请求数
Mbean名:“kafka.server”:name=“PurgatorySize”,type=“ProducerRequestPurgatory”
正常的值:如果ack=-1,应为非0值

描述:等待fetch purgatory的请求数
Mbean名:“kafka.server”:name=“PurgatorySize”,type=“FetchRequestPurgatory”
正常的值:依赖于consumer的fetch.wait.max.ms的设置

描述:一个请求(producer,Fetch-Consumer,Fetch-Follower)耗费的所有时间
Mbean名:“kafka.network”:name="{Produce|Fetch-Consumer|Fetch-Follower}-TotalTimeMs",type=“RequestMetrics”
正常的值:包括了queue, local, remote和response send time

描述:请求(producer,Fetch-Consumer,Fetch-Follower)在请求队列中的等待时间
Mbean名:“kafka.network”:name="{Produce|Fetch-Consumer|Fetch-Follower}-QueueTimeMs",type=“RequestMetrics”
正常的值:

描述:请求(producer,Fetch-Consumer,Fetch-Follower)在leader处理请求花的时间
Mbean名:“kafka.network”:name="{Produce|Fetch-Consumer|Fetch-Follower}-LocalTimeMs",type=“RequestMetrics”
正常的值:

描述:请求(producer,Fetch-Consumer,Fetch-Follower)等待follower花费的时间
Mbean名:“kafka.network”:name="{Produce|Fetch-Consumer|Fetch-Follower}-RemoteTimeMs",type=“RequestMetrics”
正常的值:producer的ack=-1时,非0才正常

描述:发送响应花费的时间
Mbean名:“kafka.network”:name="{Produce|Fetch-Consumer|Fetch-Follower}-ResponseSendTimeMs",type=“RequestMetrics”
正常的值:

描述:consumer落后producer的消息数量
Mbean名:“kafka.consumer”:name="([-.\w]+)-MaxLag",type=“ConsumerFetcherManager”
正常的值:
建议对GC耗时和其他参数和诸如系统CPU,I/O时间等等进行监控。在client端,建议对"消息数量/字节数"的速率(全局的和对于每一个topic),请求的"速率/大小/耗时"进行监控。还有consumer端,所有partition的最大的落后情况和最小的fetch请求的速率。consumer为了能跟上,最大落后数量需要少于一个threshold并且最小fetch速率需要大于0.

Grafana画图

json文件链接:https://pan.baidu.com/s/1H6MesKpqi80R14OF5k7auQ 密码:kiox

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Prometheus 监控之 kafka 的相关文章

随机推荐

  • python opencv键盘监听

    目录 读取图片监听 opencv pyinput 监听小键盘 读取图片监听 for file in files a cv2 imread path file cv2 imshow a a k cv2 waitKey 10 0xFF if k
  • 292. Nim Game

    class Solution public bool canWinNim int n return n 4 0 my first solution if n 4 0 return false else return true
  • 新浪博客插入代码(块)及代码高亮…

    新浪博客不能插入代码是一件非常尴尬的事情 这里将介绍如何在新浪博客中加入代码块及其高亮的方法 所需工具 1 XAMPP数据创建软件 2 wordpress 与 codecolorer 3 CSDN博客 步骤 1 安装wordpress 与
  • pycharm IDE报错 ,记事本打开后出现卡顿,之后出现ide错误

    打开IDE之后进行编辑 点击setting出现页面无反应 右下角出现的提示 ide error occurred see detail submit display 点击进去之后 在点击这个display 类似重启IDE的命令 然后就可以继
  • 微服务架构超详细解析,写得太好了!

    本文将介绍微服务架构和相关的组件 介绍他们是什么以及为什么要使用微服务架构和这些组件 本文侧重于简明地表达微服务架构的全局图景 因此不会涉及具体如何使用组件等细节 为了防止不提供原网址的转载 特在这里加上原文链接 https www cnb
  • 什么是IPU?

    在图像识别的SOC中 有一个很重要的单元 IPU Image Processing Unit 图像处理单元 图像处理单元的目标是提供从图像输入 摄像头传感器 电视信号输入等 到显示设备 LCD显示屏 TV输出 外部图像处理单元等 端到端的数
  • 探索OLED拼接屏的特点及在莱山的场景化应用

    涞山oled拼接屏是一种高清晰度的显示屏 由多个oled屏幕拼接而成 它可以用于各种场合 如商业展示 广告宣传 会议演示等 涞山oled拼接屏具有以下特点 1 高清晰度 oled屏幕具有高对比度 高亮度 高色彩饱和度等特点 可以呈现出非常清
  • go-kit grpc调用及中间件封装

    存在问题 grpc 调用问题 通常我们向业务返回会定义如下的结构 code 20000 msg Success data 但是如果我们定义如下的proro grpc的返回值可以在客户端不能直接使用 还需要使用json进行解析 message
  • 计算机网络1:Tcp三次握手和四次挥手

    一 TCP传输的过程 三次握手 1 建立连接并确认连接 三次握手 过程 1 客户端向服务端发出连接请求SYN 1 seq x 等待服务端响应 状态由CLOSED转为SYN SENT 2 服务端做出响应ACK和连接信号SYN 1 seq y
  • linux在dockers安装rides教程

    在Docker中安装Rider是一项非常有用的技能 因为它可以让您在Linux操作系统上进行开发和调试 本文将介绍如何在Docker上安装Rider 步骤1 安装Docker 首先 您需要在Linux操作系统上安装Docker 您可以使用以
  • 清空文件夹下的SVN文件BAT脚本

    清空文件夹下的SVN文件BAT脚本 1 脚本功能 清空文件夹及其子文件下下的所有 svn文件 避免svn提交时冲突 2 脚本内容 echo on color 2f mode con cols 80 lines 25 REM echo 正在清
  • 智能合约相关设计

    1 运行环境 以太坊采用以太坊虚拟机作为智能合约的运行环境 以太坊虚拟机是一个隔离的轻量级虚拟机环境 运行在其中的智能合约代码无法访问本地网络 文件系统或其他进程 对同一个智能合约 查看什么是智能合约 来说 往往需要在多个以太坊虚拟机中同时
  • 详细实现最短路径(迪杰斯特拉算法)

    最短路径 说白了 就是图里从一个顶点到另一个顶点的最小权值之和 今天 小编带大家一起用迪杰斯特拉 Dijkstra 算法实现它吧 目录 一 实现原理 二 代码实现 一 思路 二 代码 一 实现原理 其实 在小编看来 迪杰斯特拉算法与普里姆算
  • ws协议与http协议的异同

    http协议 识别数据内容 与webSocket协议 同 建立在TCP之上 同http一样通过TCP来传输数据 不同 HTTP协议为单向协议 即浏览器只能向服务器请求资源 服务器才能将数据传送给浏览器 而服务器不能主动向浏览器传递数据 分为
  • Selenium及chromedriver安装教程

    文章目录 安装Python环境及Selenium工具包 使用命令行安装 使用Pycharm安装 安装chromedriver驱动 验证 安装Python环境及Selenium工具包 首先 我们需要安装Python环境 安装好了之后需要安装S
  • keras IMDB数据集 LSTM分类

    在keras提供的IMDB数据集中 word被映射为一个大于0的整数 表示该单词出现频率的排名 这样处理的目的是为了方便按照词频过滤单词 其中0用于表示unknown word 载入数据 x train shape 25000 是一个250
  • 如果IBM再给我一次实习机会

    2014年 我拿到了IBM斯图加特R D的实习机会 在连续被索尼和博世拒掉之后 这个实习对我来说弥足珍贵 我学的是通信专业 在这之前与编程相关的活动只有一学期的安卓Lab 还是靠抱队友大腿才及格 在申请时 我的编程能力可以说几乎为0 连我自
  • java: 找不到符号 符号: 类 ResourceVO 位置: 类 com.

    一 java找不到符号 如果你的代码里没有任何问题 但是java报错找不到符号 如下 解决方法
  • 《Pytorch深度学习和图神经网络(卷 2)》学习笔记——第二章

    基于图片内容的处理任务 主要包括目标检测 图片分割两大任务 目标检测 精度相对较高 主要是以检测框的方式 找出图片中目标物体所在坐标 模型运算量相对较小 相对较快 图片分割 精度相对较低 主要是以像素点的集合方式 找出图片中目标物体边缘的具
  • Prometheus 监控之 kafka

    初探 默认情况下 Kafka metrics 所有的 metric 都可以通过 JMX 获取 暴露kafka metrics 支持两种方式 1 在 Kafka Broker 外部 作为一个独立进程 通过 JMX 的 RMI 接口读取数据 这