基於jmxtrans+influxdb+grafana實現對canal監控


最近在調研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

下載如下三個包

2、啟動

rmp -ivh packagename

安裝jmxtran需要你的虛擬機提前安裝jdk1.7以上

默認安裝路徑 /usr/share

默認配置文件路徑/var/lib/

默認日志路徑 /var/log/

默認啟動腳本路徑 /etc/init.d

2.1 先啟動influxdb

./influxdb start

 

進入influxdb

創建用戶和數據庫

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

創建完成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端口是否開啟

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端口

MBean下為所有的監控項,queries可配置的內容從這里查找

 obj和attr分別對應MBean中內容如下:

resultAlias:自定義表名,收集到的數據會存入influxdb的定義的表中

outputWriters為連接influxdb的配置

@class不需要修改

url:influxdb的機器+端口,默認端口8086

username和password:influxdb的用戶和密碼

database:influxdb數據庫

tags:暫時不知道干什么用的

這樣就可以啟動jmxtrans了。

2.2.3 檢查jmxtrans是否啟動成功

進入influxdb,檢查是否創建了表jvmMemory,表中是否有數據

默認1分鍾收集一次數據

如果沒有創建表,可能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

2.3.2 創建數據源

添加數據庫配置

2.3.3 創建監控面板

創建dashboard,面板中可以添加圖、表、文本等內容,以Graph為例

編輯圖表,General處修改表頭

 

 Merics設置監控項,首先選擇數據源,其次選擇監控項,表達式類似如下的sql,【ALIAS BY】修改圖例,支持一個圖中多查詢

Axes修改坐標軸顯示

legend完善圖例

 右上角選擇時間序列

最后的圖表就是如下的樣式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM