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

JMXtrans + InfluxDB + Grafana实现Kafka性能指标监控

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

架构

一般系统监控通常分为3部分:

  1. 数据采集

  2. 分析与转换

  3. 展现(可视化)

数据采集

对于前端应用,一般需要埋点,对用户的行为进行记录。 如果不埋点,则需要通过Pagespeed、PhantomJS这样的工具去模拟用户行为进行测试。后端的系统通常有自己的性能指标。我们可以通过命令/脚本的方式进行采集。

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等管理功能的框架,通常可以用来监控和管理Java应用系统。

Kafka做为一款Java应用,已经定义了丰富的性能指标,(可以参考 Kafka监控指标 ),通过JMX可以轻松对其进行监控。

测试

首先需要在Kafka上打开JMX

1.修改${kafka_home}/bin/kafka-server-start.sh , 增加一个JMX_PORT的配置,指定一个端口用于接受外部连接,注意如部署、运行在非root用户下,必须指定1024以上端口

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
    export JMX_PORT="9999"
fi

2.重启kafka

bin/kafka-server-stop.sh
bin/kafka-server-start.sh config/server.properties &

3.重启后观察可以发现JMX已经启动了

$ps -ef | grep kafka
www       51065      1  0 Nov03 ?        00:08:20 /opt/vdian/java/bin/java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true -Xloggc:/home/www/kafka_2.11-0.10.0.1/bin/../logs/kafkaServer-gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9999 -Dkafka.logs.dir=/home/www/kafka_2.11-0.10.0.1/bin/../logs -Dlog4j.configuration=file:bin/../config/log4j.properties -cp :/home/www/kafka_2.11-0.10.0.1/bin/../libs/aopalliance-repackaged-2.4.0-b34.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/argparse4j-0.5.0.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/connect-api-0.10.0.1.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/connect-file-0.10.0.1.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/connect-json-0.10.0.1.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/connect-runtime-0.10.0.1.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/guava-18.0.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/hk2-api-2.4.0-b34.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/hk2-locator-2.4.0-b34.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/hk2-utils-2.4.0-b34.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jackson-annotations-2.6.0.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jackson-core-2.6.3.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jackson-databind-2.6.3.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jackson-jaxrs-base-2.6.3.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jackson-jaxrs-json-provider-2.6.3.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jackson-module-jaxb-annotations-2.6.3.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/javassist-3.18.2-GA.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/javax.annotation-api-1.2.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/javax.inject-1.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/javax.inject-2.4.0-b34.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/javax.servlet-api-3.1.0.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/javax.ws.rs-api-2.0.1.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jersey-client-2.22.2.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jersey-common-2.22.2.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jersey-container-servlet-2.22.2.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jersey-container-servlet-core-2.22.2.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jersey-guava-2.22.2.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jersey-media-jaxb-2.22.2.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jersey-server-2.22.2.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jetty-continuation-9.2.15.v20160210.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jetty-http-9.2.15.v20160210.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jetty-io-9.2.15.v20160210.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jetty-security-9.2.15.v20160210.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jetty-server-9.2.15.v20160210.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jetty-servlet-9.2.15.v20160210.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jetty-servlets-9.2.15.v20160210.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jetty-util-9.2.15.v20160210.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/jopt-simple-4.9.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/kafka-clients-0.10.0.1.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/kafka-log4j-appender-0.10.0.1.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/kafka-streams-0.10.0.1.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/kafka-streams-examples-0.10.0.1.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/kafka-tools-0.10.0.1.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/kafka_2.11-0.10.0.1-sources.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/kafka_2.11-0.10.0.1-test-sources.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/kafka_2.11-0.10.0.1.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/log4j-1.2.17.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/lz4-1.3.0.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/metrics-core-2.2.0.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/osgi-resource-locator-1.0.1.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/reflections-0.9.10.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/rocksdbjni-4.8.0.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/scala-library-2.11.8.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/scala-parser-combinators_2.11-1.0.4.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/slf4j-api-1.7.21.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/slf4j-log4j12-1.7.21.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/snappy-java-1.1.2.6.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/validation-api-1.1.0.Final.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/zkclient-0.8.jar:/home/www/kafka_2.11-0.10.0.1/bin/../libs/zookeeper-3.4.6.jar kafka.Kafka config/server.properties
 
$ netstat -an | grep 9999
tcp        0      0 :::9999                     :::*                        LISTEN

4.在安装了java的主机上运行jconsole,就会弹出一个控制台,在可以看到MBean中的性能指标

636NRfb.png!webZn26Zzi.png!web

指标采集

传统的数据采集方案,一般是先开发数据采集的脚本,然后借助nagios、zabbix这样的监控软件来调度执行,并将采集到的数据进行上报。对于java应用,给大家介绍一个新朋友jmxtrans。

读取json或yaml格式的配置文件,通过jmx采集java性能指标。支持输出到Graphite、InfluxDB、RRDTool等。

安装部署

1.首先下载jmxtrans的RPM包, 地址

2.安装jdk1.8

yum install -y java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64

3.设置JAVA_HOME和PATH环境变量

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-0.b17.el6_7.x86_64
export PATH=$JAVA_HOME/bin:/usr/share/jmxtrans/bin:$PATH

4.编写配置文件

下文是一段测试用的配置,采集的数据会输出到日志中显示。

{
  "servers" : [ {
    "port": "jmx端口",
    "host": "IP地址",
    "queries" : [ {
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter"
      } ],
      "obj" : "java.lang:type=Memory",
      "attr" : [ "HeapMemoryUsage", "NonHeapMemoryUsage" ]
    }, {
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter"
      } ],
      "obj" : "java.lang:name=CMS Old Gen,type=MemoryPool",
      "attr" : [ "Usage" ]
    }, {
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter"
      } ],
      "obj" : "java.lang:name=ConcurrentMarkSweep,type=GarbageCollector",
      "attr" : [ "LastGcInfo" ]
    } ],
    "numQueryThreads" : 2
  } ]
}

5.配置文件编辑完成后,将其放在 /var/lib/jmxtrans/ 目录中

6.启动jmxtrans

jmxtrans start

jmxtrans会以后台deamon的形式运行,每隔1分钟采集一次数据

部署方式

由于jmx是通过网络连接的,因此JMXtrans的部署方案有2种

  1. 集中式,在一台服务器上部署一个JMXtrans,分别连接至所有的Kafka实例,并将数据吐到InfluxDB。为了减少网络传输,可以考虑部署到InfluxDB的服务器上

  2. 分布式,每个Kafka实例部署一个JMXtrans

这里我们采用了方案2

P.S 如果JMX能够支持UNIX socket方式连接方案就更完美了。socket连接较TCP连接开销更小,效率更高,非常适合同一台服务器上2个进程之间的通信

分析与转换

由于Kafka的性能数据非常全面,大部分指标已经做了分析了。

3UjAfyF.png!web

类似上述,指标的直方图,次数,最大最小、标准方差都已经计算好了,因此我们不再对数据再做加工。

这里只取了每项指标的Mean项(中位数) 做为指标值写入InfluxDB当中。

展现

Grafana是一款非常强大的纯前端的画图软件,可以说画什么图,动动鼠标就可以配出来。

设置变量模版

支持变量模版,例如下图,我们将展现的指标所属的实例定义为变量

ia6bUvi.png!web

之后在图表的左上角就可以通过下拉框的方式选择要查看的实例的图表,支持多选

支持前端对数据进行加工

例如CPU使用率数据,我们采集到的数据实际是一个计数器,记录了采集时的CPU时间。

使用率我是这样定义的, 采集2次

CPU使用率 = (结束数据-开始数据)/采集间隔时间 

这里通过配置的方式实现了数据加工与展现。

nMV3AnV.png!web

最后图表页面是这样一个效果,是不是非常炫酷呢

3QNvAva.png!web

尾声

Tomcat、JBoss这类的JAVA应用都支持JMX,下面的还用我说么?

转载于:https://my.oschina.net/sniperLi/blog/908864

相关文章:

  • Javascript 控制 Flash FLV视频播放器 --国外开源
  • PHP小知识
  • 海量计算机入门视频教程
  • Essential Studio for JavaScript发布2017 v2,扩展企业Web开发界限
  • 工具类:DateUtils类提供日期的处理方法
  • 爬!扒@切#存$构%查
  • 使用 CAS 在 Tomcat 中实现单点登录
  • Photoshop脚本 使用脚本创建一个新文档
  • SWT经验总结
  • spark一些入门资料
  • 寻找失落的SubString
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • BZOJ 1455 罗马游戏 左偏树
  • Linux FTP(三)
  • 推荐一个好的数据库工具Embarcadero DBArtisan
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 30秒的PHP代码片段(1)数组 - Array
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • SQL 难点解决:记录的引用
  • 高度不固定时垂直居中
  • 开发基于以太坊智能合约的DApp
  • 如何在GitHub上创建个人博客
  • 思维导图—你不知道的JavaScript中卷
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 在Mac OS X上安装 Ruby运行环境
  • AI算硅基生命吗,为什么?
  • const的用法,特别是用在函数前面与后面的区别
  • HanLP分词命名实体提取详解
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​用户画像从0到100的构建思路
  • (2)Java 简介
  • (js)循环条件满足时终止循环
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (七)c52学习之旅-中断
  • (转)Sublime Text3配置Lua运行环境
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ***检测工具之RKHunter AIDE
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .naturalWidth 和naturalHeight属性,
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [C进阶] 数据在内存中的存储——浮点型篇
  • [docker]docker网络-直接路由模式
  • [hive] 窗口函数 ROW_NUMBER()
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器