最近在调研canal数据同步系统的监控方案,网上关于jmxtrans+influxdb+grafana监控kafka的文档很多,没有监控canal的。通过几天的摸索,大致明白了来龙去脉。监控流程基本是一样的,只在个别配置的地方稍有差异。记录一下,供别人参考,也顺便总结一下。

监控系统一般分为3部分,数据采集、数据存储、分析展示,分别对应于jmxtrans+influxdb+grafana的一部分

1、下载安装包

1.1 jmxtrans

jmxtrans是一个通过jmx采集java应用的数据采集器,只要java应用开启了JMX端口,就可以进行采集

jmxtrans的github地址

https://github.com/jmxtrans/jmxtrans

下载rpm包的地址我直接贴出来了

wget http://central.maven.org/maven2/org/jmxtrans/jmxtrans/268/

1.2 influxdb

wget https://dl.influxdata.com/influxdb/releases/influxdb-1.4.2.x86_64.rpm

1.3 grafana

wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.6.2-1.x86_64.rpm

下载如下三个包

grafana table如何对json数据解析 grafana json model_xml

2、启动

rmp -ivh packagename

安装jmxtran需要你的虚拟机提前安装jdk1.7以上

默认安装路径 /usr/share

默认配置文件路径/var/lib/

grafana table如何对json数据解析 grafana json model_运维_02

默认日志路径 /var/log/

grafana table如何对json数据解析 grafana json model_java_03

默认启动脚本路径 /etc/init.d

grafana table如何对json数据解析 grafana json model_数据库_04

2.1 先启动influxdb
./influxdb start

 

grafana table如何对json数据解析 grafana json model_java_05

进入influxdb

grafana table如何对json数据解析 grafana json model_xml_06

创建用户和数据库

CREATE USER "root" WITH PASSWORD '123456' WITH ALL PRIVILEGES

grafana table如何对json数据解析 grafana json model_json_07

创建完成influxdb的用户和数据库暂时就够用了,其它简单操作如下,后面会用到



#创建数据库
create database "db_name"
#显示所有的数据库
show databases
#删除数据库
drop database "db_name"
#使用数据库
use db_name
#显示该数据库中所有的表
show measurements
#创建表,直接在插入数据的时候指定表名
insert test,host=127.0.0.1,monitor_name=test count=1
#删除表
drop measurement "measurement_name"
#退出
quit



2.2 启动jmxtrans

./jmxtrans start 就可以启动了

具体监控哪些内容,它会去默认地址 /var/lib/jmxtrans/ 下找json,这些json就是配置监控内容的

如果没有json,就不会监控任何内容,那么启动jmxtrans是没有任何意义的

接下来学习如何书写json

首先明白一点,jmxtrans是一个通过jmx采集java应用的数据采集器

所以非java应用,jmxtrans监控不了;而且不开启JMX端口,jmxtrans也监控不了

2.2.1 开启JMX端口

这是要添加的配置

-Dcom.sun.management.jmxremote 
-Djava.rmi.server.hostname=10.0.209.216
-Dcom.sun.management.jmxremote.port=22222 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false”

注意:有的文章中没有第二条配置,不加的话是会报错的

找到canal启动脚本start.sh,在JAVA_OPTS后加上这些配置

重启canal

查看22222端口是否开启

grafana table如何对json数据解析 grafana json model_xml_08

2.2.2 配置json

jmxtrans的github上有一段示例配置



{
  "servers" : [ {
    "port" : "22222",
    "host" : "10.10.49.11",
    "queries" : [ {
      "obj" : "java.lang:type=Memory",
      "attr" : [ "HeapMemoryUsage", "NonHeapMemoryUsage" ],
      "resultAlias":"jvmMemory",
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",
        "url" : "http://10.0.209.216:8086/",
        "username" : "root",
        "password" : "123456",
        "database" : "test",
        "tags"     : {"application" : "canal_server"}
      } ]
    } ]
  } ]
}



host:欲监控的canal机器

port:jmx端口,22222

queries为监控的具体内容,这些内容我们需要一个工具去了解

jdk的bin目录下,有一个工具jconsole.exe,双击,canal不在本地,所以选择远程,连接jmx端口

grafana table如何对json数据解析 grafana json model_java_09

MBean下为所有的监控项,queries可配置的内容从这里查找

 obj和attr分别对应MBean中内容如下:

grafana table如何对json数据解析 grafana json model_json_10

resultAlias:自定义表名,收集到的数据会存入influxdb的定义的表中

outputWriters为连接influxdb的配置

@class不需要修改

url:influxdb的机器+端口,默认端口8086

username和password:influxdb的用户和密码

database:influxdb数据库

tags:暂时不知道干什么用的

这样就可以启动jmxtrans了。

2.2.3 检查jmxtrans是否启动成功

进入influxdb,检查是否创建了表jvmMemory,表中是否有数据

默认1分钟收集一次数据

grafana table如何对json数据解析 grafana json model_xml_11

如果没有创建表,可能jmxtrans启动有问题,去 /var/log/jmxtrans下查看日志

以下为本人遇到过的一个错误,是因为json格式问题。所以最好使用github给出的格式,不要自己书写



INFO   | jvm 1    | 2017/12/07 16:46:16 | WrapperSimpleApp: Encountered an error running main: com.googlecode.jmxtrans.exceptions.LifecycleException: com.googlecode.jmxtrans.exceptions.LifecycleException: Error parsing json: /var/lib/jmxtrans/canal_server.json
INFO   | jvm 1    | 2017/12/07 16:46:16 | com.googlecode.jmxtrans.exceptions.LifecycleException: com.googlecode.jmxtrans.exceptions.LifecycleException: Error parsing json: /var/lib/jmxtrans/canal_server.json
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.googlecode.jmxtrans.JmxTransformer.start(JmxTransformer.java:191)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.googlecode.jmxtrans.JmxTransformer.doMain(JmxTransformer.java:157)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.googlecode.jmxtrans.JmxTransformer.main(JmxTransformer.java:138)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at java.lang.reflect.Method.invoke(Method.java:498)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at org.tanukisoftware.wrapper.WrapperSimpleApp.run(WrapperSimpleApp.java:240)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at java.lang.Thread.run(Thread.java:748)
INFO   | jvm 1    | 2017/12/07 16:46:16 | Caused by: com.googlecode.jmxtrans.exceptions.LifecycleException: Error parsing json: /var/lib/jmxtrans/canal_server.json
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.googlecode.jmxtrans.ConfigurationParser.parseServers(ConfigurationParser.java:62)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.googlecode.jmxtrans.JmxTransformer.processFilesIntoServers(JmxTransformer.java:354)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.googlecode.jmxtrans.JmxTransformer.startupSystem(JmxTransformer.java:322)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.googlecode.jmxtrans.JmxTransformer.start(JmxTransformer.java:187)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     ... 8 more
INFO   | jvm 1    | 2017/12/07 16:46:16 | Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('"' (code 34)): was expecting comma to separate Object entries
INFO   | jvm 1    | 2017/12/07 16:46:16 |  at [Source: /var/lib/jmxtrans/canal_server.json; line: 4, column: 10]
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1702)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:558)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:456)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextFieldName(UTF8StreamJsonParser.java:1042)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:221)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeArray(JsonNodeDeserializer.java:272)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:232)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:69)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:15)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3814)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:2447)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.googlecode.jmxtrans.util.ProcessConfigUtils.parseProcess(ProcessConfigUtils.java:61)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     at com.googlecode.jmxtrans.ConfigurationParser.parseServers(ConfigurationParser.java:55)
INFO   | jvm 1    | 2017/12/07 16:46:16 |     ... 11 more
STATUS | wrapper  | 2017/12/07 16:46:18 | <-- Wrapper Stopped



2.3 grafana
2.3.1 启动&登录

/etc/init.d/grafana-server start

启动后可以通过3000端口访问web控制台,登录用户名和密码都是admin

grafana table如何对json数据解析 grafana json model_数据库_12

2.3.2 创建数据源

grafana table如何对json数据解析 grafana json model_运维_13

添加数据库配置

grafana table如何对json数据解析 grafana json model_xml_14

2.3.3 创建监控面板

创建dashboard,面板中可以添加图、表、文本等内容,以Graph为例

grafana table如何对json数据解析 grafana json model_数据库_15

编辑图表,General处修改表头

 

grafana table如何对json数据解析 grafana json model_数据库_16

 Merics设置监控项,首先选择数据源,其次选择监控项,表达式类似如下的sql,【ALIAS BY】修改图例,支持一个图中多查询

grafana table如何对json数据解析 grafana json model_json_17

Axes修改坐标轴显示

grafana table如何对json数据解析 grafana json model_java_18

legend完善图例

grafana table如何对json数据解析 grafana json model_数据库_19

 右上角选择时间序列

grafana table如何对json数据解析 grafana json model_java_20

最后的图表就是如下的样式

grafana table如何对json数据解析 grafana json model_json_21