你們好,我是洋仔
,JanusGraph圖解系列文章,實時更新
~前端
源碼分析相關可查看github(
碼文不易,求個star~
): https://github.com/YYDreamer/janusgraphjava
轉載文章請保留如下聲明:git
做者:洋仔聊編程、微信公衆號:匠心Java、原文地址:https://liyangyang.blog.csdn.net/github
JanusGraph框架提供了一些可監控的指標,用於咱們在使用janus圖數據庫時能夠對一些指標進行監控,下面咱們看下如何配置使用Janusgraph監控!shell
本文主要講解了3部分:數據庫
JanusGraph經過支持Metrics來實現指標數據收集,什麼是Metrics
?編程
Metrics是框架Dropwizard提供的一個lib包,主要用於項目指標的收集做用,JanusGraph就是基於Metrics這個組件開發的指標收集模塊;後端
Dropwizard是一個Java框架,用於開發對操做友好的高性能RESTful Web服務,未來自Java生態系統的穩定,成熟的庫聚集到一個簡單的程序包中,使咱們能夠專一於完成工做。緩存
Dropwizard對複雜的配置,應用程序指標,日誌記錄,操做工具等提供了開箱即用的支持;服務器
JanusGraph能夠收集如下指標:
要啓用指標標準收集,須要在JanusGraph的屬性文件中設置如下內容:
# Required to enable Metrics in JanusGraph metrics.enabled = true
此設置使JanusGraph在運行時使用計時器、計數器、直方圖等Metrics類記錄測量結果。
默認狀況下,JanusGraph爲全部度量標準名稱添加「 org.janusgraph」前綴。能夠經過metrics.prefix
配置屬性設置此前綴。例如,將默認的「 org.janusgraph」前綴縮短爲「 janusgraph」:
# Optional metrics.prefix = janusgraph
每一個JanusGraph事務均可以選擇指定其本身的指標名稱前綴,從而覆蓋默認的指標名稱前綴和 metrics.prefix
配置屬性。例如,能夠將前綴更改成打開JanusGraph事務的前端應用程序的名稱。
請注意,Metrics在內存中維護度量標準名稱及其相關對象的ConcurrentHashMap,所以,保持不一樣度量標準前綴的數量較小多是個好主意。
下面使用案例:
JanusGraph graph = ...; // 獲取圖實例鏈接 TransactionBuilder tbuilder = graph.buildTransaction(); // 開啓一個事務構建器 JanusGraphTransaction tx = tbuilder.groupName("foobar").start(); // 開啓一個事務,並開啓指標收集,Metrics前綴爲foobar
下面爲groupName
的方法定義:
* Sets the name prefix used for Metrics recorded by this transaction. If * metrics is enabled via {@link GraphDatabaseConfiguration#BASIC_METRICS}, * this string will be prepended to all JanusGraph metric names. * * @param name Metric name prefix for this transaction * @return Object containing transaction prefix name property */ TransactionBuilder groupName(String name);
JanusGraph在默認狀況下組合了其各類內部存儲後端句柄的指標,也就是說:會將全部的操做統一收集爲一種類型指標;
存儲後端交互的全部指標標準都遵循「 <prefix> .stores.<opname>」模式,不管它們是不是idStore,edgeStore的操做等;
若是想要分開每種操做類型收集的指標,配置如下參數:
metrics.merge-basic-metrics = false
metrics.merge-basic-metrics = false
在JanusGraph的屬性文件中進行設置時,指標標準名稱「stores」將被替換爲對應「 idStore」,「 edgeStore」,「 vertexIndexStore」或「 edgeIndexStore」,以下述:
<prefix>.idStore.<opname> <prefix>.edgeStore.<opname> <prefix>.vertexIndexStore.<opname> <prefix>.edgeIndexStore.<opname>
要訪問這些收集好的指標值,必須配置一個或多個Metrics的Reporting
; 也就是說配置一個或多個指標的輸出存儲的位置;
JanusGraph 支持下述的這7種 Metrics reporters:
每種reporter類型獨立於其餘reporter,而且能夠共存。
例如,能夠將Ganglia、JMX和Slf4j Metrics報告器配置爲同時運行,只需在janusgraph.properties中設置它們各自的配置鍵便可(並啓用metrics.enabled = true
)
配置鍵 | 是否必須? | 值 | 默認 |
---|---|---|---|
metrics.console.interval | 是 | 將指標轉儲到控制檯之間須要等待的毫秒數 | 空值 |
示例janusgraph.properties片斷,每分鐘將指標輸出到控制檯一次:
metrics.enabled = true # Required; specify logging interval in milliseconds metrics.console.interval = 60000
配置鍵 | 是否必須? | 值 | 默認 |
---|---|---|---|
metrics.csv.interval | 是 | 寫入CSV行之間須要等待的毫秒數 | 空值 |
metrics.csv.directory | 是 | 寫入CSV文件的目錄(若是不存在則將建立) | 空值 |
示例janusgraph.properties片斷,每分鐘將CSV文件寫入一次到目錄./foo/bar/
(相對於進程的工做目錄):
metrics.enabled = true # Required; specify logging interval in milliseconds metrics.csv.interval = 60000 metrics.csv.directory = foo/bar
注意
因爲Ganglia的LGPL許可與JanusGraph的Apache 2.0許可衝突,所以配置Ganglia須要一個附加的庫,該庫未與JanusGraph一塊兒打包。要使用Ganglia監視運行,請org.acplt:oncrpc
從此處下載 jar 並將其複製到JanusGraph/lib
目錄,而後再啓動服務器。
配置鍵 | 是否必須? | 值 | 默認 |
---|---|---|---|
metrics.ganglia.hostname | 是 | 將指標發送到的單播主機或多播組 | 空值 |
metrics.ganglia.interval | 是 | 發送數據報之間等待的毫秒數 | 空值 |
metrics.ganglia.port | 否 | 咱們向其發送指標數據報的UDP端口 | 8649 |
metrics.ganglia.addressing-mode | 否 | 必須爲「unicast」或「multicast」 | unicast |
metrics.ganglia.ttl | 否 | 組播數據報TTL; 忽略單播 | 1個 |
metrics.ganglia.protocol-31 | 否 | 布爾值 使用Ganglia協議3.1爲true,使用3.0爲false | true |
metrics.ganglia.uuid | 否 | 要報告而不是IP:主機名的主機UUID | 空值 |
metrics.ganglia.spoof | 否 | 覆蓋IP:向Ganglia報告的主機名 | 空值 |
示例janusgraph.properties片斷,每30秒發送一次單播UDP數據報到默認端口上的localhost:
metrics.enabled = true # Required; IP or hostname string metrics.ganglia.hostname = 127.0.0.1 # Required; specify logging interval in milliseconds metrics.ganglia.interval = 30000
示例janusgraph.properties片斷,將單播UDP數據報發送到非默認目標端口,而且還配置報告給Ganglia的IP和主機名:
metrics.enabled = true # Required; IP or hostname string metrics.ganglia.hostname = 1.2.3.4 # Required; specify logging interval in milliseconds metrics.ganglia.interval = 60000 # Optional metrics.ganglia.port = 6789 metrics.ganglia.spoof = 10.0.0.1:zombo.com
配置鍵 | 是否必須? | 值 | 默認 |
---|---|---|---|
metrics.graphite.hostname | 是 | 將Graphite純文本協議數據發送到的IP地址或主機名 | 空值 |
metrics.graphite.interval | 是 | 將數據推送到Graphite之間須要等待的毫秒數 | 空值 |
metrics.graphite.port | 否 | Graphite純文本協議報告發送到的端口 | 2003 |
metrics.graphite.prefix | 否 | 發送到Graphite的全部度量標準名稱前都帶有任意字符串 | 空值 |
每分鐘將指標發送到192.168.0.1上的Graphite服務器的示例janusgraph.properties片斷:
metrics.enabled = true # Required; IP or hostname string metrics.graphite.hostname = 192.168.0.1 # Required; specify logging interval in milliseconds metrics.graphite.interval = 60000
配置鍵 | 是否必須? | 值 | 默認 |
---|---|---|---|
metrics.jmx.enabled | 是 | 布爾型 | false |
metrics.jmx.domain | 否 | 指標將顯示在此JMX域中 | Metrics’s own default |
metrics.jmx.agentid | 否 | 指標將使用此JMX代理ID報告 | Metrics’s own default |
janusgraph.properties示例片斷:
metrics.enabled = true # Required metrics.jmx.enabled = true # Optional; if omitted, then Metrics uses its default values metrics.jmx.domain = foo metrics.jmx.agentid = baz
配置鍵 | 是否必須? | 值 | 默認 |
---|---|---|---|
metrics.slf4j.interval | 是 | 將指標轉儲到記錄器之間須要等待的毫秒數 | 空值 |
metrics.slf4j.logger | 否 | 要使用的Slf4j記錄器名稱 | "metrics" |
示例janusgraph.properties片斷每分鐘將一次指標記錄到名爲的記錄器中foo
:
metrics.enabled = true # Required; specify logging interval in milliseconds metrics.slf4j.interval = 60000 # Optional; uses Metrics default when unset metrics.slf4j.logger = foo
若是上面列出的Metrics報告程序配置選項不足以支持咱們當前的業務,JanusGraph提供了一個實用方法來訪問單個MetricRegistry實例,該實例保存了它的全部度量;
使用方法以下:
com.codahale.metrics.MetricRegistry janusgraphRegistry = org.janusgraph.util.stats.MetricManager.INSTANCE.getRegistry();
以這種方式訪問janusgraphRegistry的代碼能夠將非標準報告類型或具備外來配置的標準報告類型附加到janusgraphRegistry。
若是周圍的應用程序已經有了度量報告器配置的框架,或者若是應用程序須要JanusGraph支持的報告器類型的多個不一樣配置的實例,這種方法也頗有用。
例如,可使用這種方法來設置多個Graphite Reporter,而JanusGraph的屬性配置僅限於一個Graphite Reporter。
配置以下:
Console Reporter
,配置指標打印在Console中,時間間隔爲1分鐘merge
操做org.janusgraph
修改成myprefix
完整具體文件配置以下:
# 其餘配置 gremlin.graph=org.janusgraph.core.JanusGraphFactory storage.backend=hbase storage.hostname=127.0.0.1 storage.port=2184 storage.hbase.table=testGraph cache.db-cache=true cache.db-cache-clean-wait=20 cache.db-cache-time=180000 cache.db-cache-size=0.5 index.search.backend=elasticsearch index.search.hostname=127.0.0.1 index.search.index-name=search index.search.port=9200 index.search.elasticsearch.http.auth.type=basic index.search.elasticsearch.http.auth.basic.username=test index.search.elasticsearch.http.auth.basic.password=test query.batch=true query.batch-property-prefetch=true # janusgraph監控相關配置 metrics.enabled = true metrics.prefix = myprefix metrics.console.interval = 60000 metrics.merge-basic-metrics = false
咱們在服務器使用gremlin.sh
腳本啓動gremlin console,並建立圖實例:
./gremlin.sh graph=JanusGraphFactory.open('/opt/soft/janusgraph-0.5.1-test/conf/janusgraph-hbase-es.properties')
咱們就會發現,每隔一分鐘就會在控制檯打印出對應指標信息,由於指標信息不少,爲了便於文章閱讀,下述只展現出主要部分:
12/23/20 10:37:28 AM =========================================================== -- Counters -------------------------------------------------------------------- global.storeManager.openDatabase.calls count = 20 global.storeManager.startTransaction.calls count = 461 myprefix.caches.misses count = 5 // 此處省略部分統計 myprefix.tx.begin count = 12 myprefix.tx.commit count = 3 myprefix.tx.rollback count = 9 org.janusgraph.caches.misses count = 3 org.janusgraph.caches.retrievals count = 3 // 此處省略部分統計 org.janusgraph.sys.stores.getSlice.calls count = 286 org.janusgraph.sys.stores.getSlice.entries-returned count = 231 org.janusgraph.sys.stores.mutate.calls count = 7 org.janusgraph.tx.begin count = 1 -- Histograms ------------------------------------------------------------------ myprefix.stores.getSlice.entries-histogram count = 7 min = 0 max = 8 mean = 1.57 stddev = 2.88 median = 1.00 75% <= 1.00 95% <= 8.00 98% <= 8.00 99% <= 8.00 99.9% <= 8.00 org.janusgraph.stores.getSlice.entries-histogram // 具體指標統計省略 org.janusgraph.sys.schema.stores.getSlice.entries-histogram // 具體指標統計省略 org.janusgraph.sys.stores.getSlice.entries-histogram // 具體指標統計省略 -- Timers ---------------------------------------------------------------------- myprefix.query.graph.execute.time count = 2 mean rate = 0.01 calls/second 1-minute rate = 0.01 calls/second 5-minute rate = 0.07 calls/second 15-minute rate = 0.14 calls/second min = 1.19 milliseconds max = 2.25 milliseconds mean = 1.72 milliseconds stddev = 0.75 milliseconds median = 1.72 milliseconds 75% <= 2.25 milliseconds 95% <= 2.25 milliseconds 98% <= 2.25 milliseconds 99% <= 2.25 milliseconds 99.9% <= 2.25 milliseconds myprefix.query.graph.getNew.time // 具體指標統計省略 myprefix.query.graph.hasDeletions.time // 具體指標統計省略 myprefix.query.vertex.execute.time // 具體指標統計省略 myprefix.query.vertex.getNew.time // 具體指標統計省略 myprefix.query.vertex.hasDeletions.time // 具體指標統計省略 myprefix.storeManager.mutate.time // 具體指標統計省略 myprefix.stores.getSlice.time // 具體指標統計省略 myprefix.stores.mutate.time // 具體指標統計省略 org.janusgraph.query.graph.execute.time count = 2 mean rate = 0.00 calls/second 1-minute rate = 0.00 calls/second 5-minute rate = 0.02 calls/second 15-minute rate = 0.09 calls/second min = 2.52 milliseconds max = 221.12 milliseconds mean = 111.82 milliseconds stddev = 154.57 milliseconds median = 111.82 milliseconds 75% <= 221.12 milliseconds 95% <= 221.12 milliseconds 98% <= 221.12 milliseconds 99% <= 221.12 milliseconds 99.9% <= 221.12 milliseconds org.janusgraph.query.graph.getNew.time // 具體指標統計省略 org.janusgraph.query.graph.hasDeletions.time // 具體指標統計省略 org.janusgraph.stores.getKeys.iterator.hasNext.time // 具體指標統計省略 org.janusgraph.stores.getKeys.iterator.next.time // 具體指標統計省略 org.janusgraph.stores.getKeys.time // 具體指標統計省略 // 具體指標統計省略 org.janusgraph.stores.getSlice.time // 具體指標統計省略 org.janusgraph.sys.schema.query.graph.execute.time // 具體指標統計省略 org.janusgraph.sys.schema.query.graph.getNew.time // 具體指標統計省略 org.janusgraph.sys.schema.query.graph.hasDeletions.time // 具體指標統計省略 org.janusgraph.sys.schema.stores.getSlice.time // 具體指標統計省略 org.janusgraph.sys.storeManager.mutate.time // 具體指標統計省略 org.janusgraph.sys.stores.getSlice.time // 具體指標統計省略 org.janusgraph.sys.stores.mutate.time // 具體指標統計省略
觀察上述指標統計數據,咱們能夠發現,主要分爲4大部分:
Counters
Histograms
Timers
第一部分:當前統計指標時間,年月日,時間精確到秒
能夠做爲janusgraph指標監控的橫向維度和時間維度
第二部分:統計全部不一樣操做的數量Counters
這一部分主要用於收集全部操做的總數量,包含事務相關統計、緩存命中相關統計、數據的CURD統計、後端存儲不一樣操做調用統計等48
個維度!
具體能夠自行嘗試;
第三部分:統計數據直方圖的表示Histograms
首先,什麼是直方圖?
直方圖,形狀相似柱狀圖卻有着與柱狀圖徹底不一樣的含義。直方圖牽涉統計學的概念,首先要對數據進行分組,而後統計每一個分組內數據元的數量。 在平面直角座標系中,橫軸標出每一個組的端點,縱軸表示頻數,每一個矩形的高表明對應的頻數,稱這樣的統計圖爲頻數分佈直方圖
此部分主要涉及對後端存儲的統計;
第四部分:統計全部操做的執行時間Timers
這一部分主要收集統計數據CURD操做和數據插入等操做的時間統計包含23
種維度!
時間維度包含平均值
、最大值
、最小值
、時間分佈
等14
個時間維度;
總體分爲: 收集指標 --> 解析指標數據 --> 格式化存儲 --> 監控組件|報警組件
有任何問題,歡迎交流溝通
參考:JanusGraph官網