用Jmxtrans自定义收集Java监控指标

使用Jmxtrans的理由:

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。利用JMX可以对外暴露jvm内部的一些指标,但是要获取那些jvm的内部信息,就还需要自己写java程序调用jmx接口去获取数据,并按照某种格式发送到其他地方(如监控程序Graphite,Zabbix,时序数据库Influxdb等)。这时jmxtrans就派上用场了,jmxtrans的作用是自动去jvm中获取所需要的jmx数据,并按照某种格式(json文件配置格式)输出到其他应用程序。

如果我们要监控Kafka、Kettle等一些开源的应用程序,市面上很难找到一款现成的监控平台,通过Jmxtrans + Influxdb + Grafana我们就可以轻松的打造属于自己的监控平台(包括Java的JMX监控)。

Jmxtrans的使用:

1、安装

Jmxtrans 安装特别简单(安装前需要先安装好JDK并配置JAVA_HOME环境变量),从官网下载安装包,根据平台不同,可以选择对应的版本,例如:rpm、Debian、tar.gz,下载地址:http://central.maven.org/maven2/org/jmxtrans/jmxtrans/

2、指定监控指标获取

Jmxtrans启动需要有监控配置文件,默认目录是/var/lib/jmxtrans/,格式是json格式,可以任意创建,在启动时指定调用。

我们以influxdb推送为例,json中配置的第一层是要监控的服务端:

{

  "servers" : [ {

  "port" : "2099",

  "host" : "172.16.1.30",

  "queries" : [........这是监控指标项........

  ]

}

而queries就是我们要写的具体监控指标,按json格式列出多个指标项,要监控的指标可以通过jconsole.exe工具(JDK自带的工具)获取,我们以Kafka为例,在Kafka的启动文件配置KAFKA_HEAP_OPTS,开启JMX端口,及jmx remote远程连接授权。

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then

    export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"

    export JMX_PORT="2099"

    export KAFKA_HEAP_OPTS="-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=172.16.1.30 "$KAFKA_HEAP_OPTS

fi

配置完后启动kafka,如:nohup bin/kafka-server-start.sh config/server.properties >>kafka.log & ,启动后就可以在本地用jconsole.exe远程获取要监控的MBean:

我们可以指向需要监控的指标项,以kafka为例,监控消息消费端FetchConsumer的RemoteTime:

 然后再指向我们想监控的具体指标(属性及值):

这些值都是在实时变化的,而我们通过jmxtrans就是要把这些值采集下来,发送给监控平台或是监控数据库。针对这项指标的监控按JSON格式,编辑如下:

{

  "obj" : "kafka.network:type=RequestMetrics,name=RemoteTimeMs,request=FetchConsumer",

  "attr" : [ "Count","Min","Mean","Max","95thPercentile","StdDev" ],

  "resultAlias":"RemoteTimeMs",

  "outputWriters" : [ {

    "@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",

    "url" : "http://172.17.2.130:8086/",

    "username" : "admin",

    "password" : "admin",

    "database" : "kafka",

    "tags" : {"application" : "FetchConsumer"}

  } ]

}

可以看出obj对应的就是上图的ObjectName,attr对应的是要监控收集的属性,resultAlias是监控指标名(相当于对应的是influxdb的measurement表),监控数据发送到influxdb端的效果如下(RemoteTimeMs):

 对于JSON格式文中的outputWriters对应的是要将监控指标输入到对应平台的信息,@class是对应平台的Writer类,influxdb对应“com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory”,而Graphite对应的是 “com.googlecode.jmxtrans.model.output.GraphiteWriterFactory”。

另外强调一下就是tags属性,对应的是influxdb measurement的tagKeys、tagValues,比如除了要监控FetchConsumer消息消费的RemoteTimeMs,还要监控消息生产Produce的RemoteTimeMs,这两个都可以放在一个measurement(表)中,就是用tag进行区分。如:

{

"obj" : "kafka.network:type=RequestMetrics,name=RemoteTimeMs,request=Produce",

"attr" : [ "Count","Min","Mean","Max","95thPercentile","StdDev" ],

"resultAlias":"RemoteTimeMs",

"outputWriters" : [ {

"@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",

"url" : "http://172.17.2.130:8086/",

"username" : "admin",

"password" : "admin",

"database" : "kafka",

"tags" : {"application" : "Produce"}

} ]

}

对应的influxdb中如下展示:

因此我们可得出 database、resultAlias、tags、attr分别组成了influxdb的database、measurement、points、tagKeys、tagValues的数据元素,我们可以根据自己的需要去灵活配置。

3、其他常用指标获取

以上是我们针对Kafka的指标举例,而JVM的通用指我们也是必须获取的,就是系统和线程的指标:

以下我把这部分常用指标写成了Json:

{

"servers" : [ {

"port" : "2099",

"host" : "172.16.1.30",

"queries" : [ {

"obj" : "java.lang:type=OperatingSystem",

"attr" : [ "CommittedVirtualMemorySize", "TotalPhysicalMemorySize", "FreePhysicalMemorySize", "TotalSwapSpaceSize", "FreeSwapSpaceSize", "ProcessCpuLoad", "ProcessCpuTime", "SystemCpuLoad", "AvailableProcessors", "Name", "SystemLoadAverage" ],

"resultAlias":"OperatingSystem",

"outputWriters" : [ {

"@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",

"url" : "http://172.17.2.130:8086/",

"username" : "admin",

"password" : "admin",

"database" : "kafka",

"tags" : {"application" : "OperatingSystem"}

} ]

},

{

"obj" : "java.lang:type=Runtime",

"attr" : [ "Uptime", "Name", "StartTime" ],

"resultAlias":"Runtime",

"outputWriters" : [ {

"@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",

"url" : "http://172.17.2.130:8086/",

"username" : "admin",

"password" : "admin",

"database" : "kafka",

"tags" : {"application" : "Runtime"}

} ]

},

{

"obj" : "java.lang:type=Memory",

"attr" : [ "HeapMemoryUsage", "NonHeapMemoryUsage" ],

"resultAlias":"MemoryUsage",

"outputWriters" : [ {

"@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",

"url" : "http://172.17.2.130:8086/",

"username" : "admin",

"password" : "admin",

"database" : "kafka",

"tags" : {"application" : "MemoryUsage"}

} ]

},

{

"obj" : "java.lang:type=GarbageCollector,name=*",

"attr" : [ "CollectionCount","CollectionTime" ],

"resultAlias":"GC",

"outputWriters" : [ {

"@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",

"url" : "http://172.17.2.130:8086/",

"username" : "admin",

"password" : "admin",

"database" : "kafka",

"tags" : {"application" : "GC"}

} ]

},

{

"obj" : "java.lang:type=Threading",

"attr" : [ "PeakThreadCount","ThreadCount" ],

"resultAlias":"Thread",

"outputWriters" : [ {

"@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",

"url" : "http://172.17.2.130:8086/",

"username" : "admin",

"password" : "admin",

"database" : "kafka",

"tags" : {"application" : "Thread"}

} ]

}

]

} ]

}

4、最后启用监控

我们在启动Jmxtrans时需要指定我们配好的json:

cd /usr/share/jmxtrans/bin

./jmxtrans start kafka.json

通过日志查看监控进程是否正常:tail -f -n100 /var/log/jmxtrans/jmxtrans.log 

然后我们在influxdb端就能看到监控产生的数据,配上Grafana,就形成了高大上的监控平台了:

版权声明:本文为博主原创文章,转摘请注明出处: https://blog.csdn.net/smooth00/article/details/90399528

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容