你们好,我是洋仔
,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官网