原文地址:

CSDN:GeekXuShuo:Prometheus 监控之 kafka

简书:whaike:【监控】Kafka - 详细指标


在与Prometheus的合作中,网络上很多的exporter其数据都来源于zookeeper,自kafka升级到版本2以后,数据不往zookeeper中写入了。

版本2以后的kafka,我使用了kafka-offset-exporter来作为kafka的exporter与Prometheus配合。

kafka本身就已经自带了监控,通过Yammer Metrics进行指标暴露与注册,可通过JMX进行指标收集。

默认情况下, 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的机器上装上kafka_exporter,每个都要装,如157、158、159:

启动:

  1. # 解压kafka_exporter,进到目录,执行命令:
  2. nohup ./kafka_exporter --kafka.server=10.131.178.157:9092 &
  3. kafka_exporter --kafka.server=kafka:9092 [--kafka.server=another-server ...]

经测试,这种方式可以获取到kafka的指标数据,但是没有合适的Grafana的Dashboard支撑。

二、jmx_exporter方式

(这种方式,自己搭建起来后,9999端口和9991端口一直打不开,暂未查明原因,还在研究之中。)

第二种是读取 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.1 下载jmx_prometheus_javaagent和kafka.yml

  1. wget https://raw.githubusercontent.com/prometheus/jmx_exporter/master/example_configs/kafka-0-8-2.yml
  2. wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.6/jmx_prometheus_javaagent-0.6.jar

打开 kafka-server-start.sh 文件

添加几行代码:

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

然后重启kafka。

访问 http://localhost:9991/metrics 可以看到各种指标了。

在/opt/kafka目录编辑kafka-*.yaml

配置1(面向kafka2.0以前的版本):【部分指标匹配,且部分配置只在低版本kafka有效,例如kafka.consumer等】:

  1. hostPort: 127.0.0.1:9999
  2. lowercaseOutputName: true
  3. whitelistObjectNames:
  4. - "kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec"
  5. - "kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec"
  6. - "kafka.network:type=RequestMetrics,name=RequestsPerSec,request={Produce|FetchConsumer|FetchFollower}"
  7. - "kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec"
  8. - "kafka.network:type=RequestMetrics,name=TotalTimeMs,request={Produce|FetchConsumer|FetchFollower}"
  9. - "kafka.network:type=RequestMetrics,name=RequestQueueTimeMs,request={Produce|FetchConsumer|FetchFollower}"
  10. #- "kafka.consumer:type=consumer-fetch-manager-metrics,client-id={client-id}"
  11. - "kafka.server:type={Produce|Fetch},user=([-.\\w]+),client-id=([-.\\w]+)"
  12. - "kafka.server:type=Request,user=([-.\\w]+),client-id=([-.\\w]+)"
  13. - "kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\\w]+)"
  14. - "kafka.producer:type=[consumer|producer|connect]-node-metrics,client-id=([-.\\w]+),node-id=([0-9]+)"
  15. - "kafka.producer:type=producer-metrics,client-id=([-.\\w]+)"
  16. - "kafka.producer:type=producer-topic-metrics,client-id=([-.\\w]+),topic=([-.\\w]+)"
  17. - "kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\\w]+)"
  18. - "kafka.consumer:type=consumer-fetch-manager-metrics,client-id={client-id}"
  19. - "kafka.consumer:type=consumer-fetch-manager-metrics,client-id={client-id},topic={topic}"
  20. - "kafka.streams:type=stream-metrics,client-id=([-.\\w]+)"
  21. - "kafka.streams:type=stream-task-metrics,client-id=([-.\\w]+),task-id=([-.\\w]+)"
  22. - "kafka.streams:type=stream-processor-node-metrics,client-id=([-.\\w]+),task-id=([-.\\w]+),processor-node-id=([-.\\w]+)"
  23. - "kafka.streams:type=stream-[store-type]-state-metrics,client-id=([-.\\w]+),task-id=([-.\\w]+),[store-type]-state-id=([-.\\w]+)"
  24. - "kafka.streams:type=stream-record-cache-metrics,client-id=([-.\\w]+),task-id=([-.\\w]+),record-cache-id=([-.\\w]+)"

配置2(面向kafka2.0以后的版本):【kafka2.0以后,匹配所有jmx指标(虚拟机测试每次请求约2秒,生产环境大约10秒。Prometheus默认15秒请求一次)】:

  1. lowercaseOutputName: true
  2. jmxUrl: service:jmx:rmi:///jndi/rmi://192.168.112.129:9999/jmxrmi
  3. ssl: false
  4. rules:
  5. - pattern : JMImplementation<type=(.+)><>(.*)
  6. - pattern : com.sun.management<type=(.+)><>(.*)
  7. - pattern : java.lang<type=(.+)><>(.*)
  8. - pattern : java.nio<type=(.+)><>(.*)
  9. - pattern : java.util.logging<type=(.+)><>(.*)
  10. - pattern : kafka<type=(.+)><>(.*)
  11. - pattern : kafka.controller<type=(.+)><>(.*)
  12. - pattern : kafka.coordinator.group<type=(.+)><>(.*)
  13. - pattern : kafka.coordinator.transaction<type=(.+)><>(.*)
  14. - pattern : kafka.log<type=(.+)><>(.*)
  15. - pattern : kafka.network<type=(.+)><>(.*)
  16. - pattern : kafka.server<type=(.+)><>(.*)
  17. - pattern : kafka.utils<type=(.+)><>(.*)

2.2 监控指标

2.3 预警指标分析

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.

2.4 Grafana Dashboard JSON

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

Prometheus+Grafana通过kafka_exporter监控kafka的更多相关文章

  1. Prometheus+Grafana+kafka_exporter监控kafka

    Prometheus+Grafana+kafka_exporter搭建监控系统监控kafka 一.Prometheus+Grafana+kafka_exporter搭建监控系统监控kafka 1.1K ...

  2. prometheus + grafana部署RabbitMQ监控

    prometheus + grafana部署RabbitMQ监控 1.grafana导入dashboards https://grafana.com/dashboards/2121   2.expor ...

  3. SpringBoot+Prometheus+Grafana实现应用监控和报警

    一.背景 SpringBoot的应用监控方案比较多,SpringBoot+Prometheus+Grafana是目前比较常用的方案之一.它们三者之间的关系大概如下图: 关系图 二.开发SpringBo ...

  4. 【Prometheus+Grafana系列】监控MySQL服务

    前言 前面的一篇文章已经介绍了 docker-compose 搭建 Prometheus + Grafana 服务.当时实现了监控服务器指标数据,是通过 node_exporter.Prometheu ...

  5. 使用prometheus+ grafana+nginx-module-vts 模块监控openresty

      nginx-module-vts 是一个很不错的nginx 模块,我们可以用来,方便的分析系统的请求状态 同时支持基于prometheus 的监控, 我参考openresty 的docker镜像已 ...

  6. Prometheus+Grafana打造Mysql监控平台

    prometheus/node_exporter/mysqld_exporter都是由go语言编写,需要先安装GoLang环境 下载node_exporter(监控服务器的CPU.内存.存储使用情况) ...

  7. Prometheus+Grafana+Altermanager搭建监控系统

    基本概念 Prometheus 时间序列化数据库,我的理解就是将数据打上标签,以时间维度存储.后面有机会在深入研究. Prometheus架构如下: Grafana Prometheus中存储的数据, ...

  8. 基于Prometheus+Grafana+AlertManager的监控系统

    一.Prometheus 1.1 简介 Prometheus是一套开源的监控&报警&时间序列数据库的组合,基于应用的metrics来进行监控的开源工具 . 1.2 下载&安装 ...

  9. prometheus+grafana实现服务监控

    一.安装prometheus: 下载相应的版本 :https://prometheus.io/download/ 解压: Linux:tar -zxvf XXX.tar.gz windows:直接下载 ...

随机推荐

  1. Java学习日报 9.29

    package random;import java.util.*;import java.math.*;public class Com { public static void main(Stri ...

  2. 基于snort、barnyard2和base的 网络入侵检测系统的部署与应用

    1.项目分析 1.1.项目背景 伴随着互联网产业的不迅猛发展,新兴技术层数不穷,互联网通讯技术逐渐成为了各行各业不可替代的基础设施,越来越多的业务都是依靠互联网来得以实现.随着我国科技产业的飞速发展, ...

  3. Hadoop之WordCount

    求平均数是MapReduce比较常见的算法,求平均数的算法也比较简单,一种思路是Map端读取数据,在数据输入到Reduce之前先经过shuffle,将map函数输出的key值相同的所有的value值形 ...

  4. 解决threadLocal父子变量传递问题

    一.问题的提出 在系统开发过程中常使用ThreadLocal进行传递日志的RequestId,由此来获取整条请求链路.然而当线程中开启了其他的线程,此时ThreadLocal里面的数据将会出现无法获取 ...

  5. LVS之1---工作原理

    LVS之1---工作原理 LVS 介绍 LVS:Linux Virtual Server,Linux虚拟服务器,负载调度器,是一个由章文嵩(花名 正明)博士从1998年开始发起的自由软件项目. 软件作 ...

  6. python实现域名注册查询

    author:摘繁华-蓝白社区 联合出品 域名生成与查询 文件说明: [x] .py源文件 [x] .exe可执行文件 [x] .config.json配置文件 ps: .exe和config.jso ...

  7. chatsRoom Design Report

    基于TCP实现聊天室 主要使用四个类 ChatClient类     使用BufferedReader 得到输入流,使用OutputStream得到输出流     实现读取服务器广播的消息和发送消息到 ...

  8. Server 2012 R2 Standard 安装运行PCS7时出现“无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll”解决方法

    网上看到了这篇文章https://www.jianshu.com/p/21f4bb8b5502,根据思路自己尝试,解决了丢失的问题.提示[计算机中丢失api-ms-win-crt-runtime-l1 ...

  9. ASP.NET Core错误处理中间件[1]: 呈现错误信息

    NuGet包"Microsoft.AspNetCore.Diagnostics"中提供了几个与异常处理相关的中间件.当ASP.NET Core应用在处理请求过程中出现错误时,我们可 ...

  10. 【Docker】在Linux系统中安装Docker虚拟机、启动停止重启查看Docker命令

    安装Docker 文章目录 安装Docker Docker虚拟机架构 在Linux系统中安装Docker虚拟机 管理Docker虚拟机 参考资料 Docker虚拟机架构 Docker创建的所有虚拟实例 ...