在应用程序中,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析。在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如一个系统后台服务,我们可能需要了解一些实时监控的数据例如
1、每秒钟的请求数是多少(TPS)?
2、平均每个请求处理的时间?
3、请求处理的最长耗时?
4.请求处理的响应的直方图?
5、请求处理正确响应率?
6、等待处理的请求队列长度?
7、查看整个系统的的CPU使用率、内存占用、jvm运行情况;以及系统运行出错率等等一系列的实时数据采集时,最简单的方法就是在系统的入口、出口和关键位置设置埋点,然后将采集到的信息发送到实时监控平台或者存入到缓存和DB中做进一步的分析和展示。
Metrics提供5种基本的度量类型:
Meters
是一种只能自增的计数器,通常用来度量一系列事件发生的概率。它提供了平均速率,以及指数平滑平均速率,以及采样后的1分钟,5分钟,15分钟的样例。
Gauges
Gauge是一个最简单的计量,一般用来统计瞬时状态的数据信息
RatioGauge
作用:度量事件成功率的计算。 例:度量缓存命中率、接口调用率等等。
Counters
Counter是Gauge的一个特例,维护一个计数器,可以通过inc()和dec()方法对计数器做修改。使用步骤与Gauge基本类似,在MetricRegistry中提供了静态方法可以直接实例化一个Counter。可以用来度量生产者和消费者之间的关系
Histograms
主要使用来统计数据的分布情况, 最大值、最小值、平均值、中位数,百分比(75%、90%、95%、98%、99%和99.9%)。
例如,需要统计某个页面的请求、接口方法请求的响应时间
Timers
作用:统计请求的速率和处理时间
例如:某接口的总在一定时间内的请求总数,平均处理时间
HealthChecks
作用:健康检查,用于对系统应用、子模块、关联模块的运行是否正常做检测
实现过程:
类A:继承 HealthCheck ,并重写check()方法 ,在check()中调用类B中的被检测方法
类B:定义一个方法,返回结果是boolean类型。(类B也可以是其它系统中的一个类)
在日志中打印
public static void main(String[] args) throws InterruptedException {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Slf4jReporter report = Slf4jReporter.forRegistry(registry) //
.prefixedWith("region_") //
.withLoggingLevel(Slf4jReporter.LoggingLevel.INFO) //
.outputTo(LoggerFactory.getLogger(MetricsTest.class)) //
.scheduleOn(scheduler) //
.shutdownExecutorOnStop(scheduler != null) //
.build();
report.start(5, TimeUnit.SECONDS);
Random r = new Random();
while (true) {
processHandle(r.nextDouble());
Thread.sleep(100);
}
}