需求
通常我们对线上的运行状态有监控的需求。比如我们需要知道队列的大小和使用情况,缓存的命中率,链接池的大小和使用情况,每个请求的QPS、响应时间,等等。
解决方案
一般的做法如下:
- 对需要监控的点进行埋点做统计。可以使用AOP尽量做到对应用透明。
- 统计结果通过某种方式导出。比如最常见的是通过log打印出来,再去查看log。
其实上面的步骤明显的将这个过程进行了抽象:
- Measurement
- Exportor/Reportor
进一步具体化,Measurement主要有如下几个维度:
- Gauges: A gauge is an instantaneous measurement of a value.
- Counters: A counter is just a gauge for an AtomicLong instance. You can increment or decrement its value.
- Timers: A timer measures both the rate that a particular piece of code is called and the distribution of its duration.
- Meters: A meter measures the rate of events over time (e.g., “requests per second”).
- Histograms: A histogram measures the statistical distribution of values in a stream of data.
谷歌的云监控预定义了一些metrics Supported metrics:
- Google Compute Engine - 13 metrics
- Google Cloud SQL - 12 metrics
- Google Cloud Pub/Sub - 14 metrics
并且提供了Read API让开发者查询当前到30天内的metric data。并且可以根据labels进行查询过滤。
支持的metricType有 metricDescriptors:
- cumulative
- delta
- gauge
metric的valueType有:
- bool
- distribution
- double
- int64
- string
而Exportor或者Reportor则主要有如下几个方式:
- Reporting Via JMX:实时报告
- Reporting Via HTTP:实时报告
- Reporing Via STDOUT:定期报告
- Reporting Via CSV files:定期报告
- Reporting Via SLF4J loggers:定期报告
- Reporting Via Ganglia:定期报告
- Reporting Via Graphite:定期报告 …
这个抽象基本体现在所有的开源监视框架中:
- Yammer Codehale Metrics Cassandra和Spring Boot等使用。
- Servo - Netflix Application Monitoring Library Netfilx内部使用,不是很成熟,功能也比较简单。
- StatsD Node.js的Metrics库。
差异仅仅在于怎样把这两个步骤做到方便、透明、稳定和高性能而已。
TIPS 使用BTrace监控线上运行情况
可以使用使用BTrace脚本监控线上运行情况,埋点逻辑完全脱离应用,应用完全无感知。缺点是BTrace有很多限制,而且写起来很痛苦。只适合于一些临时性的监视任务。不过他的完全透明性可以参考实现。
参考文档
- Metrics library
- Metrics
- metrics-spring 支持Spring XML里定义Reporter,以及用注解埋点,用AOP生成相应的Metric。
- metrics-reporter-config Cassandra的一个辅助项目,支持用Yaml定义Reporter。
- StatsD Node.js的Metrics库。
- Servo - Netflix Application Monitoring Library Netflix自己的一个metrics库。
- Jmx 对JMX的一个简单介绍
- Measure Anything, Measure Everything
- Counting & Timing
- The State of Open Source Monitoring: The Good, The Bad, The Fucking Terrible and a Glimpse Into Our Future 关于监控非常全面的介绍,强烈推荐!
- Google Cloud Monitoring API 谷歌的云监控API介绍。核心概念也是基于Metrics的Time series采样记录。
- The Twitter stack Twitter的技术栈介绍,其中有比较详细的监控系统介绍。
- ostrich Twitter的监控库