大家好,我是洋仔,JanusGraph图解系列文章,实时更新~

图数据库文章总目录:

源码分析相关可查看github码文不易,求个star~): https://github.com/YYDreamer/janusgraph

转载文章请保留以下声明:

作者:洋仔聊编程、微信公众号:匠心Java、原文地址:https://liyangyang.blog.csdn.net/

正文

JanusGraph框架提供了一些可监控的指标,用于我们在使用janus图数据库时可以对一些指标进行监控,下面我们看下如何配置使用Janusgraph监控!

本文主要讲解了3部分:

  1. 监控的指标类型和配置
  2. 监控指标数据展示存储的位置(Reporter)
  3. 实战应用案例,并对打印出的指标进行了分析
  4. 最后给出一个监控设计的架构图

一:监控的底层实现

JanusGraph通过支持Metrics来实现指标数据收集,什么是Metrics?

Metrics是框架Dropwizard提供的一个lib包,主要用于项目指标的收集作用,JanusGraph就是基于Metrics这个组件开发的指标收集模块;

Dropwizard是一个Java框架,用于开发对操作友好的高性能RESTful Web服务,将来自Java生态系统的稳定,成熟的库汇集到一个简单的程序包中,使我们可以专注于完成工作。

Dropwizard对复杂的配置,应用程序指标,日志记录,操作工具等提供了开箱即用的支持;

二:JanusGraph中的指标

JanusGraph可以收集以下指标:

  • begin,commit和 roll back的事务数
  • 每种存储后端操作类型的 请求次数 和 失败次数
  • 每种存储后端操作类型的响应时间分布

2.1 配置指标收集

要启用指标标准收集,需要在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>

2.2 配置指标报告

要访问这些收集好的指标值,必须配置一个或多个Metrics的Reporting; 也就是说配置一个或多个指标的输出存储的位置;

JanusGraph 支持下述的这7种 Metrics reporters:

  • Console
  • CSV
  • Ganglia
  • Graphite
  • JMX
  • Slf4j
  • User-provided/Custom

每种reporter类型独立于其他reporter,并且可以共存。

例如,可以将Ganglia、JMX和Slf4j Metrics报告器配置为同时运行,只需在janusgraph.properties中设置它们各自的配置键即可(并启用metrics.enabled = true

Console Reporter

配置键 是否必须? 默认
metrics.console.interval 将指标转储到控制台之间需要等待的毫秒数 空值

示例janusgraph.properties片段,每分钟将指标输出到控制台一次:

metrics.enabled = true
# Required; specify logging interval in milliseconds
metrics.console.interval = 60000

CSV文件 Reporter

配置键 是否必须? 默认
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 Reporter

注意

由于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

Graphite Reporter

配置键 是否必须? 默认
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

JMX Reporter

配置键 是否必须? 默认
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

Slf4j Reporter

配置键 是否必须? 默认
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

用户自定义 Reporter

如果上面列出的Metrics报告程序配置选项不足以支持我们当前的业务,JanusGraph提供了一个实用方法来访问单个MetricRegistry实例,该实例保存了它的所有度量;

使用方法如下:

com.codahale.metrics.MetricRegistry janusgraphRegistry =
org.janusgraph.util.stats.MetricManager.INSTANCE.getRegistry();

以这种方式访问janusgraphRegistry的代码可以将非标准报告类型或具有外来配置的标准报告类型附加到janusgraphRegistry。

如果周围的应用程序已经有了度量报告器配置的框架,或者如果应用程序需要JanusGraph支持的报告器类型的多个不同配置的实例,这种方法也很有用。

例如,可以使用这种方法来设置多个Graphite Reporter,而JanusGraph的属性配置仅限于一个Graphite Reporter。

三:实际应用

配置如下:

  1. 开启指标收集
  2. 使用Console Reporter,配置指标打印在Console中,时间间隔为1分钟
  3. 关闭指标收集merge操作
  4. 配置指标收集前缀由默认的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大部分:

  1. 当前统计指标时间,年月日,时间精确到秒
  2. 统计所有不同操作的数量Counters
  3. 统计数据直方图的表示Histograms
  4. 统计所有操作的执行时间Timers

第一部分:当前统计指标时间,年月日,时间精确到秒

可以作为janusgraph指标监控的横向维度和时间维度

第二部分:统计所有不同操作的数量Counters

这一部分主要用于收集所有操作的总数量,包含事务相关统计、缓存命中相关统计、数据的CURD统计、后端存储不同操作调用统计等48个维度!

具体可以自行尝试;

第三部分:统计数据直方图的表示Histograms

首先,什么是直方图? 直方图,形状类似柱状图却有着与柱状图完全不同的含义。直方图牵涉统计学的概念,首先要对数据进行分组,然后统计每个分组内数据元的数量。 在平面直角坐标系中,横轴标出每个组的端点,纵轴表示频数,每个矩形的高代表对应的频数,称这样的统计图为频数分布直方图

此部分主要涉及对后端存储的统计;

第四部分:统计所有操作的执行时间Timers

这一部分主要收集统计数据CURD操作和数据插入等操作的时间统计包含23种维度!

时间维度包含平均值最大值最小值时间分布14个时间维度;

四:监控架构图

整体分为: 收集指标 --> 解析指标数据 --> 格式化存储 --> 监控组件|报警组件

有任何问题,欢迎交流沟通

参考:JanusGraph官网

图解JanusGraph系列 - JanusGraph指标监控报警(Monitoring JanusGraph)的更多相关文章

  1. 图解Janusgraph系列-分布式id生成策略分析

    JanusGraph - 分布式id的生成策略 大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 本次更新时间:2020-9-1 文章为作者跟踪源码和查看官方文档整理,如有任何问题,请联 ...

  2. 图解Janusgraph系列-并发安全:锁机制(本地锁+分布式锁)分析

    图解Janusgraph系列-并发安全:锁机制(本地锁+分布式锁)分析 大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 整理所有图相关文章,请移步(超链):图数据 ...

  3. 图解Janusgraph系列-图数据底层序列化源码分析(Data Serialize)

    图解Janusgraph系列-图数据底层序列化源码分析(Data Serialize) 大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 整理所有图相关文章,请移步 ...

  4. 图解JanusGraph系列 - 关于JanusGraph图数据批量快速导入的方案和想法(bulk load data)

    大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 整理所有图相关文章,请移步(超链):图数据库系列-文章总目录 源码分析相关可查看github(码文不易,求个sta ...

  5. Kubernetes集群的监控报警策略最佳实践

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/79652064 本文为Kub ...

  6. Traefik SRE 之使用 Prometheus 进行监控报警

    当我们使用 Traefik 作为 Kubernetes 的 Ingress 控制器的时候,我们自然也非常有必要对其进行监控.本文我们将探讨如何使用 Prometheus 和 Grafana 从 Tra ...

  7. 抛砖系列之redis监控命令

    前言 redis是一款非常流行的kv数据库,以高性能著称,其高吞吐.低延迟等特性让广大开发者趋之若鹜,每每看到别人发出的redis故障报告都让我产生一种居安思危,以史为鉴的危机感,恰逢今年十一西安烟雨 ...

  8. Windows Azure功能更新:弹性伸缩(autoscale)、监控报警、移动服务及网站服务商用、新的虚拟机镜像

    Windows Azure功能又更新了.此次更新包括1项重要更新和两个功能更新: 重要更新:云服务.网站支持按策略进行弹性伸缩 功能更新:两个预览版的服务(网站和移动)进入商用,虚拟机服务支持SQL ...

  9. zabbix实现企业微信监控报警

    一.zabbix基本说明 简介:zabbix基于Web界面的分布式系统监控的企业级开源软件.可以监控各种系统与设备,网络参数,保证服务器设备安全运营:提供灵活的通知机制.如果检测到的指标不达标,就实现 ...

随机推荐

  1. python办公入门4:xlrd操作excel行

    操作excel行 1 #通过索引获取操作行 2 sheet=data.sheet_by_index(0) 3 #获取当前sheet下的有效行数 4 print(sheet.nrows) 5 #获取某一 ...

  2. 【干货】linux使用nginx一个80端口部署多个项目(spring boot、vue、nuxt、微信小程序)

    本人只有一个阿里云的ip和一个已经解析过的域名,然后想用80端口部署多个项目,比如输入: www.a.com和www.b.com与www.c.com就能访问不同项目,而不用输入不同端口号区分. 1.这 ...

  3. [BUGCASE]层叠上下文和z-index属性使用不当引发的文本被遮挡的问题

    一.问题描述 在一个fixed-data-table(一个React组件)制作的表格中,需要给表头的字段一个提示的特效,所以做了一个提示层 这个提示层被固定(拖动表格的水平滚动条时固定)的表格列遮住 ...

  4. bulk_create 批量插入数据

    def booklist(request): # 动态插入100条数据 for i in range(100): models.Book2.objects.create(name='第%s本书'%i) ...

  5. JDK8HashMap的一些思考

    JDK8HashMap 文中提及HashMap7的参见博客https://www.cnblogs.com/danzZ/p/14075147.html 红黑树.TreeMap分析详见https://ww ...

  6. Docker中搭建FastDFS文件系统(多图)

    关于FastDFS FastDFS 是以 C 语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载)等,特别适合以文件为载体的在线服务,如 ...

  7. PyQt(Python+Qt)学习随笔:调用disconnect进行信号连接断开时的信号签名与断开参数的匹配要求

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在使用信号调用disconnect()方法断开信号和槽的连接时,信号可以带签名也可不带签名,参数可以 ...

  8. PyQt学习遇到的问题:重写notify发送的消息为什么首先给了一个QWindow对象?

    在PyQt开发图形界面应用时,从QApplication派生的子类重写notify方法后(具体请参考<PyQt学习随笔:通过自定义类重写QApplication的notify方法捕获应用的所有消 ...

  9. PyQt(Python+Qt)学习随笔:Action功能详解及Designer中的操作方法

    老猿Python博文目录 老猿Python博客地址 一.引言 Qt Designer中的部件栏并没Action相关的部件,Action可以在右侧的Action Editor中编辑,如图: 如果没有出现 ...

  10. PyQt(Python+Qt)学习随笔:Qt Designer组件属性编辑界面中对话窗QDialog的modal属性

    modal属性表示窗口执行show()操作时是以模态窗口还是非模态窗口形式展示,缺省为False,设置该值与QWidget.windowModality的值设置为 Qt.ApplicationModa ...