• 中文
    • English
  • 注册
  • 查看作者
  • 深入理解Metrics(一):Gauges

    1. 介绍

    Metrics是dropwizard.io开源的一款Java工具包,为开发者提供了多种计算指标的工具类,用于单个JVM进程指标监控。通过适配器方式支持Jetty、Logback、Log4j、Apache HttpClient和graphite等开源库的指标监控。

    Metrics提供监控的工具:

    • Gauges:指标当前值。

    • Counters:指标自增自减。

    • Histograms: 指标分布情况,最大、最小、TP99等。

    • Meters:指标频率,例如TPS。

    • Timers:Histograms和Meters结合使用。

    • Health Checks:服务健康状况监控。

    指标结果输出方式:

    深入理解Metrics(一):Gauges

    • ConsoleReporter:控制台

    • CsvReporter:CSV文件

    • Slf4jReporter:Logback、Log4j等日志输出

    • JmxReporter:基于JMX的输出

    • GangliaReporter:监控工具Ganglia

    • GraphiteReporter:监控工具Graphite

    2. 实际应用

    account是SDMK的核心模块,提供用户管理、角色管理、权限管理、用户授权和用户鉴权功能,在account内部使用Metrics作为服务度量的工具。

    Metrics应用的具体场景:

    • Meters:统计鉴权接口的吞吐量。

    • Gauges:定时输出缓存键的数量。

    • Counters:统计鉴权接口失败的次数。

    • Histograms: 统计鉴权接口的最大、最小、平均的响应时间。

    • Timers:统计鉴权接口响应时间的分布,同时输出吞吐量信息。

    • Health Checks:account模块是否存活。

    3. Gauges的使用

    添加maven依赖:

    为了使输出的结果更加直观,使用ConsoleReporter,代码如下:

    运行后输出:

    3.1 MetricRegistry 层级结构

    深入理解Metrics(一):Gauges

    Metrics监控的工具继承Metric接口,MetricRegistry通过ConcurrentMap来管理监控工具的注册,注册时需要提供唯一限定名称和具体工具,限定名称可以使用MetricRegistry的静态方法name来生成,下面是MetricRegistry类重要的注册方法:

    3.2 ConsoleReporter层级结构

    深入理解Metrics(一):Gauges

    Metrics需要指定监控的输出方式,本程序中使用了最简单的ConsoleReporter,初始化ConsoleReporter需要设置统计的周期,这里设置的是1s。

    Reporter最核心的是ScheduledReporter抽象基类,在这个抽象基类中定义了子类的构造方式,定义了通用的方法:开始统计、结束统计和根据不同工具产生的结果输出。

    Reporter之所以可以周期性的输出,实际上底层用到的就是ScheduledExecutorService类,通过Executors.newSingleThreadScheduledExecutor进行创建。

    开始统计时,使用了ScheduledExecutorService的scheduleAtFixedRate方法,scheduleAtFixedRate方法可以有效的保证方法执行的周期,上次运行不会影响后续的运行,即:scheduledExecutionTime(n)=firstExecuteTime+n*periodTime,计算方式永远不变。

    最后让我们来看看ConsoleReporter是如何来实现控制台的输出,这里我们只需要关注report和printGauge即可,里面的output输出流实际上就是System.out。

    3.3 Gauge 层级结构

    深入理解Metrics(一):Gauges

    Metrics没有提供任何关于Gauge接口的实现,使用时我们需要自己实现,这里面需要注意的是变量可见性的问题,防止变量值的脏读。

    4. 结束语

    至此已经完成了Gauge的讲解,如果你正在思考如何保证服务的健壮,Metrics是很好的选择。 下一章会介绍Counters的使用,文章中有任何纰漏的地方欢迎给予指出。

  • 0
  • 0
  • 0
  • 83
  • 请登录之后再进行评论

    登录
  • 任务
  • 实时动态
  • 发布
  • 单栏布局 侧栏位置: