- Setting Up Maven
- Meters
- Console Reporter
- Complete getting started
- The Registry
- Gauges
- Counters
- Histograms
- Timers
- Health Checks
- Reporting Via JMX
- Reporting Via HTTP
- Other Reporting
Setting Up Maven
在MAVEN的dependency里添加metrics-core
库
1 | <dependencies> |
注意,使用上面依赖你需要在pom文件里声明了metrics.version
属性,并且该属性值是3.1.0
Meters
meter
表示的是单位时间内事件数的比例(例如每秒请求数). 除了平均速率之外, meter
仍然会追踪1-,5-,15-
分钟的移动平均数.
1 | private final Meter requests = metrics.meter("requests"); |
上面的meter
表示每秒请求数的比例。
Console Reporter
Console Reporter
正如其名,向控制台进行输出日志,下面的示例将每秒进行输出一次.
1 | ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics) |
Complete getting started
下面是一个完整的示例:
1 | package sample; |
1 |
|
注意:使用上面依赖你需要在pom文件里声明了metrics.version
属性,并且该属性值是3.1.0
1 | mvn package exec:java -Dexec.mainClass=sample.First |
The Registry
Metrics的核心部分是MetricRegistry
类,这个类是应用程序中所有的metrics的容器. 下面的示例创建一个新的MetricRegistry
:
1 | final MetricRegistry metrics = new MetricRegistry(); |
如果你在应用程序中嵌入一个自己创建的MetricRegistry
实例,你应该将这个属性置为静态的.
Gauges
gauge
表示的是一个瞬时值. 例如我们获取队列里待执行的任务数
1 | public class QueueManager { |
当完成计算之后,它将会返回队列里的任务数。
在registry
里的每个metric
都有一个唯一的名字,其命名规范为用.
分割的字符串,例如things.count
或者com.example.Thing.latency
. MetricRegistry
类提供了一个静态方法来构建这些名字.
1 | MetricRegistry.name(QueueManager.class, "jobs", "size") |
上面的调用会返回com.example.QueueManager.jobs.size
。
对于大多数队列或者类队列结构,你也许仅想要获得queue.size()
这个值. 大多数java.util
和java.util.concurrent
包都实现了size()
方法,它的复杂度是O(n)
,这意味着你的gauge
也许会很慢(也许还会持有锁)
Counters
counter
是一个内部采用AtomicLong
计数器的gauge
实现. 你可以增加或者减少这个值.例如,我们想要一种更加高效的计算队列大小的方式:
1 | private final Counter pendingJobs = metrics.counter(name(QueueManager.class, "pending-jobs")); |
每一次业务逻辑的调用,counter都会被计算一次,它会返回队列中的任务数.
正如你看到的,counter的API是非常不同的是,counter(String)
取代了register(String, Metric)
,然而你可以仍然可以使用register
方法创建你自己的Counter
实例,实际上counter(String)
在内部里已经将这些工作都为你做好了,还允许你使用相同的名字对metric进行复用
还需要说明一点,在上例中,我们静态引入了MetricRegistry
的name
方法.
Histograms
histogram
表示的是流中数据值的静态分布. 除了计算minimum, maximum, mean, etc
等值,它还计算中间值或者75th, 90th, 95th, 98th, 99th, 99.9th
等百分比.
1 | private final Histogram responseSizes = metrics.histogram(name(RequestHandler.class, "response-sizes")); |
上面的histogram
统计了响应中的字节数.
Timers
timer
可以计算某个代码段的调用比例,和调用期间的分布状况.
1 | private final Timer responses = metrics.timer(name(RequestHandler.class, "responses")); |
This timer will measure the amount of time it takes to process each request in nanoseconds and provide a rate of requests in requests per second.
Health Checks
Metrics还可以通过metrics-healthchecks
模块集中检查你的服务的健康.
首先创建一个新的HealthCheckRegistry
实例
1 | final HealthCheckRegistry healthChecks = new HealthCheckRegistry(); |
然后将Metrics注册到它身上:
1 | healthChecks.register("postgres", new DatabaseHealthCheck(database)); |
接下来运行所有的health checks:
1 | final Map<String, HealthCheck.Resultresults = healthChecks.runHealthChecks(); |
Metrics内置了一种health check:ThreadDeadlockHealthCheck
,它使用了java内置的线程死锁检测来查找死锁线程.
Reporting Via JMX
通过JMX
报告metrics:
1 | final JmxReporter reporter = JmxReporter.forRegistry(registry).build(); |
一旦reporter启动了,registry中的所有的metrics都可以通过JConsole
或者VisualVM
看到.
Metrics被包装成JMX MBeans
,可以在VisualVM's MBeans browser
查看Metrics
.
注意:在VisualVM中,你双击任一metric属性,VisualVM将会将这些属性数据通过图形化的方式演示给你.
Reporting Via HTTP
Metrics仍然可以通过servlet(AdminServlet)演示给你, 提供JSON形式的数据. 它可以报告health checks
,打印thread dump
,或者提供一个负载均衡的简单响应. (它还提供了其他的servlets–MetricsServlet
,例如HealthCheckServlet, ThreadDumpServlet
或者PingServlet
.)
如果想要使用servlet你必须在pom文件中依赖metrics-servlets
.
1 | <dependency> |
Other Reporting
除了JMX
和HTTP
以外,Metrics还提供了下面的报告方式
STDOUT
: 使用metrics-core
的ConsoleReporter
报告CSV files
, 使用metrics-core
的CsvReporter
报告SLF4J loggers
, 使用metrics-core
的Slf4jReporter
报告Ganglia
, 使用metrics-ganglia
的GangliaReporter
报告Graphite
, 使用metrics-graphite
的GraphiteReporter
报告