Dropwizard 之 application metrics

读过第一篇Springboot 之 actuator, 即对metrics有了一定认识和理解, 本文将以metrics-spring的annotation的方式来讲解,  如何使用dropwizard metrics。


1、什么是Dropwizard metrics?

能够帮助我们从各个角度度量已存在的java应用的成熟框架,简便地以jar包的方式集成进您的系统,可以以http、ganglia、graphite、log4j等方式提供全栈式的监控视野。

2、为什么要用该框架?

在springboot的领域内使用actuator是最优的选择, 然而web应用五花八门,如一些应用直接使用Jetty启动的web应用、一些已存在的非springboot的应用、其他一些如已服务很久的基于netty的java应用, springboot actuator就不那么适用了。

或者说你的应用直接是基于Dropwizard搭建起来的,使用dropwizard metrics会显得理所应当。总得来讲:只要是Java application 就可以使用dropwizard metrics来解决自己应用的应用级监控问题。

3、它能从哪些角度帮忙度量我们的java应用?

1. 注册jvm监控

通过集成好的AdminServlet访问之后的效果:

{

"version": "3.0.0",

"gauges": {

"dropwizard.metrics.controller.HelloWorldController.helloTime": {

"value": 1//变量helloTime的值

},

"dropwizard.metrics.controller.HelloWorldController.queueSize": {

"value": 2103581016//假的随机队列大小

},

"jvm.fd.usage": {

"value": 0.00888671875//文件句柄使用情况, 运维监控系统可根据该使用率报警

},

"jvm.gc.PS-MarkSweep.count": {

"value": 2// garbage collection MarkSweep算法清扫内存次数

},

"jvm.gc.PS-MarkSweep.time": {

"value": 172// garbage collection MarkSweep算法标记清扫内存时间

},

"jvm.gc.PS-Scavenge.count": {

"value": 5// 新生代收集次数

},

"jvm.gc.PS-Scavenge.time": {

"value": 309// 新生代收集时间

},

"jvm.memory.heap.committed": {

"value": 482869248// 堆内存的可用空间, 在jvm运行过程中随时都会变化

},

"jvm.memory.heap.init": {

"value": 536870912// 堆内存的初始化空间, jvm初始化时吃掉的内存,随着运行会变化

},

"jvm.memory.heap.max": {

"value": 482869248// 堆内存的最大值=。=

},

"jvm.memory.heap.usage": {

"value": 0.2461350531065503// 内存使用率, 运维监控系统可根据该使用率报警

},

"jvm.memory.heap.used": {

"value": 118851048// 已使用内存

},

"jvm.memory.non-heap.committed": {

"value": 55656448// 非堆内存的可用空间

},

"jvm.memory.non-heap.init": {

"value": 2555904//非堆内存初始化空间

},

"jvm.memory.non-heap.max": {

"value": -1

},

"jvm.memory.non-heap.usage": {

"value": -49202216

},

"jvm.memory.non-heap.used": {

"value": 49202216

},

"jvm.memory.pools.Code-Cache.committed": {

"value": 14942208// 尚可cache代码的内存空间大小

},

"jvm.memory.pools.Code-Cache.init": {

"value": 2555904// cache代码的内存初始化值

},

"jvm.memory.pools.Code-Cache.max": {

"value": 251658240// ...

},

"jvm.memory.pools.Code-Cache.usage": {

"value": 0.051141357421875// 使用率, 运维可根据该使用率报警

},

"jvm.memory.pools.Code-Cache.used": {

"value": 12870144

},

"jvm.memory.pools.Compressed-Class-Space.committed": {

"value": 4366336//压缩后可用的class空间

},

"jvm.memory.pools.Compressed-Class-Space.init": {

"value": 0

},

"jvm.memory.pools.Compressed-Class-Space.max": {

"value": 1073741824

},

"jvm.memory.pools.Compressed-Class-Space.usage": {

"value": 0.0034717321395874023

},

"jvm.memory.pools.Compressed-Class-Space.used": {

"value": 3727744

},

"jvm.memory.pools.Metaspace.committed": {

"value": 36347904// Metaspace为java8中代替PermGen的存在

},

"jvm.memory.pools.Metaspace.init": {

"value": 0

},

"jvm.memory.pools.Metaspace.max": {

"value": -1

},

"jvm.memory.pools.Metaspace.usage": {

"value": 0.8970071011522425

},

"jvm.memory.pools.Metaspace.used": {

"value": 32604328

},

"jvm.memory.pools.PS-Eden-Space.committed": {

"value": 197132288

},

"jvm.memory.pools.PS-Eden-Space.init": {

"value": 201326592

},

"jvm.memory.pools.PS-Eden-Space.max": {

"value": 203423744

},

"jvm.memory.pools.PS-Eden-Space.usage": {

"value": 0.4824112174437218

},

"jvm.memory.pools.PS-Eden-Space.used": {

"value": 98133896

},

"jvm.memory.pools.PS-Old-Gen.committed": {

"value": 268435456

},

"jvm.memory.pools.PS-Old-Gen.init": {

"value": 268435456

},

"jvm.memory.pools.PS-Old-Gen.max": {

"value": 268435456

},

"jvm.memory.pools.PS-Old-Gen.usage": {

"value": 0.07717740535736084

},

"jvm.memory.pools.PS-Old-Gen.used": {

"value": 20717152

},

"jvm.memory.pools.PS-Survivor-Space.committed": {

"value": 17301504

},

"jvm.memory.pools.PS-Survivor-Space.init": {

"value": 33554432

},

"jvm.memory.pools.PS-Survivor-Space.max": {

"value": 17301504

},

"jvm.memory.pools.PS-Survivor-Space.usage": {

"value": 0

},

"jvm.memory.pools.PS-Survivor-Space.used": {

"value": 0

},

"jvm.memory.total.committed": {

"value": 538525696

},

"jvm.memory.total.init": {

"value": 539426816

},

"jvm.memory.total.max": {

"value": 482869247

},

"jvm.memory.total.used": {

"value": 168056176

},

"jvm.thread-states.blocked.count": {

"value": 0

},

"jvm.thread-states.count": {

"value": 22

},

"jvm.thread-states.daemon.count": {

"value": 21

},

"jvm.thread-states.deadlock.count": {

"value": 0

},

"jvm.thread-states.deadlocks": {

"value": [ ]// 有该种类型线程问题也应该报警

},

"jvm.thread-states.new.count": {

"value": 0

},

"jvm.thread-states.runnable.count": {

"value": 5

},

"jvm.thread-states.terminated.count": {

"value": 0

},

"jvm.thread-states.timed_waiting.count": {

"value": 9//过多时可报警, 如 大于50000

},

"jvm.thread-states.waiting.count": {

"value": 8

}

}}

2. 使用Gauge.

代码:

效果:

{

"version": "3.0.0",

"gauges": {

"dropwizard.metrics.controller.HelloWorldController.helloTime": {

"value": 1//监控 helloTime的瞬时值

}

}}

3. 使用Timer.

代码:

访问效果:

{

"version": "3.0.0",

"timers": {

"dropwizard.metrics.controller.HelloWorldController.getPerson": {

"count": 0,// 访问该方法的总次数

"max": 0,// 最长时间

"mean": 0,// 平均时间

"min": 0,// 最短时间

"p50": 0,// 中位数

"p75": 0,// 75th 分位数

"p95": 0,// 95th 分位数

"p98": 0,// 98th 分位数

"p99": 0,// 99th 分位数

"p999": 0,// 999th 分位数

"stddev": 0,

"m15_rate": 0,// 15分钟 请求数/每秒的比率

"m1_rate": 0,// 1分钟 请求数/每秒的比率

"m5_rate": 0,// 5分钟 请求数/每秒的比率

"mean_rate": 0,// 平均每秒请求数

"duration_units": "seconds",//该Timer的单位

"rate_units": "calls/second"//比率单位

}

}}

4.使用CachedGauge, 不想要每次拿统计数据都真的去拿一次mq的queue size的时候使用

代码:

访问效果:

{

"version": "3.0.0",

"gauges": {

"dropwizard.metrics.controller.HelloWorldController.queueSize": {

"value": 422130431 // 统计的queue的size.

}

}}

5. 使用ExceptionMetered

代码:

{

"version": "3.0.0",

"meters": {

"dropwizard.metrics.controller.HelloWorldController.exception.exceptions": {

"count": 0, // 该方法报了多少次异常

"m15_rate": 0,

"m1_rate": 0,

"m5_rate": 0,

"mean_rate": 0,

"units": "events/second"

}

}}

6. 使用Counted

代码:

访问效果:

{

"version": "3.0.0",

"counters": {

"dropwizard.metrics.controller.HelloWorldController.count": {

"count": 0//访问了该方法多少次

}

}}

7. 使用Metric + Histograms

代码:

{

"version": "3.0.0",

"histograms": {

"dropwizard.metrics.controller.HelloWorldController.histogram": {

"count": 0,// 访问次数, 该效果与Time类似,请参阅Time的comments.

"max": 0,

"mean": 0,

"min": 0,

"p50": 0,

"p75": 0,

"p95": 0,

"p98": 0,

"p99": 0,

"p999": 0,

"stddev": 0

}

}}

5、自定义healthCheck.

自定义healthCheck需要继承类 HealthCheck 代码如图:

运行起来之后的效果:

至此,Java的两个(springboot actuator, dropwizard metrics) 比较强大好用的应用级监控都介绍完了,落地让运维监控的同学一起提升应用质量的availability吧!


附录:

本文源码: https://github.com/Agileaq/Dropwizard-metrics-example

Dropwizard metrics 首页: http://metrics.dropwizard.io/3.1.0/getting-started/

Metrics for spring which integrate dropwizard metrics jars with spring :https://github.com/ryantenney/metrics-spring

jvm,init,used,commited,max的含义,

http://blog.csdn.net/fanwu72/article/details/8936746


本文作者:钱晟龙 Arc_Qian(点融黑帮),现任点融网架构组产品研发工程师,主要任务是思考并尝试解决各类点融网迈出第一公里之后遇到的现实问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容

  • =========================================================...
    lavor阅读 3,481评论 0 5
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,719评论 0 33
  • 我曾经一定说过,我爱你。 我曾经一定发过誓,养你。 只是我不记得了,对不起。 过去的艰辛难过,我扛下。 现在的欢声...
    蝉爷阅读 255评论 0 0
  • 今天我开学了,我在开学典礼上看到了少先队员们为我们升国旗,还看到了六年三班的同学她为我们讲话,杨校长给我...
    杨尚峰阅读 292评论 0 1