详解Metrics应用监控指标的使用说明

目录
  • 引用Metric库
  • Registry
  • Gauge(仪表)
  • Counter(计数器)
  • Meter()
  • Histogram(直方图)
  • Timer(计时器)
  • HealthCheck(健康检查)
  • JMX报表
  • HTTP报表
  • 其它报表
  • MetricSet
  • 第三方库
  • MetricsforSpring
  • 基本用法
    • XML风格的配置
    • java注解的方式

题前:做过虚拟化级别、系统级别、容器级别监控;应用级别监控有哪些方法可以做?

Metrics是个很好的选择。java、python、go均可支持。

Metrics可以为你的代码的运行提供无与伦比的洞察力。作为一款监控指标的度量类库,它提供了很多模块可以为第三方库或者应用提供辅助统计信息, 比如Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, Jersey, 它还可以将度量数据发送给Ganglia和Graphite以提供图形化的监控。

Metrics提供了Gauge、Counter、Meter、Histogram、Timer等度量工具类以及Health Check功能。

引用Metric库

将metrics-core加入到maven pom.xml中:

<dependencies>
    <dependency>
        <groupId>com.codahale.metrics</groupId>
        <artifactId>metrics-core</artifactId>
        <version>${metrics.version}</version>
    </dependency>
</dependencies>

metrics.version 设置为metrics最新的版本。
现在你可以在你的程序代码中加入一些度量了。

Registry

Metric的中心部件是MetricRegistry。 它是程序中所有度量metric的容器。让我们接着在代码中加入一行:

final MetricRegistry metrics = new MetricRegistry();

Gauge (仪表)

Gauge代表一个度量的即时值。 当你开汽车的时候, 当前速度是Gauge值。 你测体温的时候, 体温计的刻度是一个Gauge值。 当你的程序运行的时候, 内存使用量和CPU占用率都可以通过Gauge值来度量。
比如我们可以查看一个队列当前的size。

public class QueueManager {
    private final Queue queue;
    public QueueManager(MetricRegistry metrics, String name) {
        this.queue = new Queue();
        metrics.register(MetricRegistry.name(QueueManager.class, name, "size"),
            new Gauge<Integer>() {
                @Override
                public Integer getValue() {
                    return queue.size();
                }
            }
        );
    }
}

registry 中每一个metric都有唯一的名字。 它可以是以.连接的字符串。 如"things.count" 和 "com.colobu.Thing.latency"。 MetricRegistry 提供了一个静态的辅助方法用来生成这个名字:

MetricRegistry.name(QueueManager.class, "jobs", "size")

生成的name为com.colobu.QueueManager.jobs.size

实际编程中对于队列或者类似队列的数据结构,你不会简单的度量queue.size(), 因为在java.util和java.util.concurrent包中大部分的queue的#size是O(n),这意味的调用此方法会有性能的问题, 更深一步,可能会有lock的问题。

RatioGauge可以计算两个Gauge的比值。 Meter和Timer可以参考下面的代码创建。下面的代码用来计算计算命中率 (hit/call)。

public class CacheHitRatio extends RatioGauge {
    private final Meter hits;
    private final Timer calls;
    public CacheHitRatio(Meter hits, Timer calls) {
        this.hits = hits; this.calls = calls;
    }
    @Override
    public Ratio getValue() {
        return Ratio.of(hits.oneMinuteRate(), calls.oneMinuteRate());
    }
}

CachedGauge可以缓存耗时的测量。DerivativeGauge可以引用另外一个Gauage。

Counter (计数器)

Counter是一个AtomicLong实例, 可以增加或者减少值。 例如,可以用它来计数队列中加入的Job的总数。

private final Counter pendingJobs
    = metrics.counter(name(QueueManager.class, "pending-jobs"));
public void addJob(Job job) {
    pendingJobs.inc();
    queue.offer(job);
}
public Job takeJob() {
    pendingJobs.dec();
    return queue.take();
}

和上面Gauage不同,这里我们使用的是metrics.counter方法而不是metrics.register方法。 使用metrics.counter更简单。

Meter ()

Meter用来计算事件的速率。 例如 request per second。 还可以提供1分钟,5分钟,15分钟不断更新的平均速率。

private final Histogram responseSizes
    = metrics.histogram(name(RequestHandler.class, "response-sizes");
public void handleRequest(Request request, Response response) {
    // etc
    responseSizes.update(response.getContent().length);
}

Histogram (直方图)

Histogram可以为数据流提供统计数据。 除了最大值,最小值,平均值外,它还可以测量 中值(median),百分比比如XX%这样的Quantile数据 。

private final Histogram responseSizes     = metrics.histogram(name(RequestHandler.class, "response-sizes"); public void handleRequest(Request request, Response response) {     // etc     responseSizes.update(response.getContent().length); }

这个例子用来统计response的字节数。
Metrics提供了一批的Reservoir实现,非常有用。例如SlidingTimeWindowReservoir 用来统计最新N个秒(或其它时间单元)的数据。

Timer (计时器)

Timer用来测量一段代码被调用的速率和用时。

private final Timer responses = metrics.timer(name(RequestHandler.class, "responses"));
public String handleRequest(Request request, Response response) {
    final Timer.Context context = responses.time();
    try {
        // etc;
        return "OK";
    } finally {
        context.stop();
    }
}

这段代码用来计算中间的代码用时以及request的速率。

Health Check (健康检查)

Metric还提供了服务健康检查能力, 由metrics-healthchecks模块提供。
先创建一个HealthCheckRegistry实例。

final HealthCheckRegistry healthChecks = new HealthCheckRegistry();

再实现一个HealthCheck子类, 用来检查数据库的状态。

public class DatabaseHealthCheck extends HealthCheck {
    private final Database database;
    public DatabaseHealthCheck(Database database) {
        this.database = database;
    }
    @Override
    public HealthCheck.Result check() throws Exception {
        if (database.isConnected()) {
            return HealthCheck.Result.healthy();
        } else {
            return HealthCheck.Result.unhealthy("Cannot connect to " +
                database.getUrl());
        }
    }
}

注册一下。

healthChecks.register("mysql", new DatabaseHealthCheck(database));

最后运行健康检查并查看检查结果。

final Map<String, HealthCheck.Result> results = healthChecks.runHealthChecks();
for (Entry<String, HealthCheck.Result> entry : results.entrySet()) {
    if (entry.getValue().isHealthy()) {
        System.out.println(entry.getKey() + " is healthy");
    } else {
        System.err.println(entry.getKey() + " is UNHEALTHY: " +
            entry.getValue().getMessage());
        final Throwable e = entry.getValue().getError();
        if (e != null) {
            e.printStackTrace();
        }
    }
}

Metric内置一个ThreadDeadlockHealthCheck, 它使用java内置的线程死锁检查方法来检查程序中是否有死锁。

JMX报表

通过JMX报告Metric。

final JmxReporter reporter = JmxReporter.forRegistry(registry).build();
reporter.start();

一旦启动, 所有registry中注册的metric都可以通过JConsole或者VisualVM查看 (通过MBean插件)。

HTTP报表

Metric也提供了一个servlet (AdminServlet)提供JSON风格的报表。它还提供了单一功能的servlet (MetricsServlet, HealthCheckServlet, ThreadDumpServlet, PingServlet)。
你需要在pom.xml加入metrics-servlets。

<dependency>
    <groupId>com.codahale.metrics</groupId>
    <artifactId>metrics-servlets</artifactId>
    <version>${metrics.version}</version>
</dependency>

其它报表

除了JMX和HTTP, metric还提供其它报表。

STDOUT, using ConsoleReporter from metrics-core

final ConsoleReporter reporter = ConsoleReporter.forRegistry(registry)
                                    .convertRatesTo(TimeUnit.SECONDS)
                                    .convertDurationsTo(TimeUnit.MILLISECONDS)
                                    .build(); 

reporter.start(1, TimeUnit.MINUTES);

CSV files, using CsvReporter from metrics-core

final CsvReporter reporter = CsvReporter.forRegistry(registry)
                                .formatFor(Locale.US)
                                .convertRatesTo(TimeUnit.SECONDS)
                                .convertDurationsTo(TimeUnit.MILLISECONDS)
                                .build(new File("~/projects/data/"));
reporter.start(1, TimeUnit.SECONDS);

SLF4J loggers, using Slf4jReporter from metrics-core

final Slf4jReporter reporter = Slf4jReporter.forRegistry(registry)
                               .outputTo(LoggerFactory.getLogger("com.example.metrics"))
                                .convertRatesTo(TimeUnit.SECONDS)
                                .convertDurationsTo(TimeUnit.MILLISECONDS)
                                .build();
reporter.start(1, TimeUnit.MINUTES);

Ganglia, using GangliaReporter from metrics-ganglia

final GMetric ganglia = new GMetric("ganglia.example.com", 8649, UDPAddressingMode.MULTICAST, 1);
final GangliaReporter reporter = GangliaReporter.forRegistry(registry)
                                    .convertRatesTo(TimeUnit.SECONDS)
                                    .convertDurationsTo(TimeUnit.MILLISECONDS)
                                    .build(ganglia);
reporter.start(1, TimeUnit.MINUTES);

Graphite, using GraphiteReporter from metrics-graphite

MetricSet

可以将一组Metric组织成一组便于重用。

final Graphite graphite = new Graphite(new InetSocketAddress("graphite.example.com", 2003));
final GraphiteReporter reporter = GraphiteReporter.forRegistry(registry)
                                    .prefixedWith("web1.example.com")
                                    .convertRatesTo(TimeUnit.SECONDS)
                                    .convertDurationsTo(TimeUnit.MILLISECONDS)
                                    .filter(MetricFilter.ALL)
                                    .build(graphite);
reporter.start(1, TimeUnit.MINUTES);

一些模块 metrics-json提供了json格式的序列化。
以及为其它库提供度量的能力metrics-ehcachemetrics-httpclientmetrics-jdbimetrics-jerseymetrics-jettymetrics-log4jmetrics-logbackmetrics-jvmmetrics-servlet 注意不是metrics-servlets

第三方库

这里重点介绍一下Metrics for Spring

Metrics for Spring

这个库为Spring增加了Metric库, 提供基于XML或者注解方式。

  • 可以使用注解创建metric和代理类。 @Timed, @Metered, @ExceptionMetered, @Counted
  • 为注解了 @Gauge 和 @CachedGauge的bean注册Gauge
  • 为@Metric注解的字段自动装配
  • 注册HealthCheck
  • 通过XML配置产生报表
  • 通过XML注册metric和metric组

你需要在pom.xml加入

<dependency>
    <groupId>com.ryantenney.metrics</groupId>
    <artifactId>metrics-spring</artifactId>
    <version>3.0.1</version>
</dependency>

基本用法

XML风格的配置

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:metrics="http://www.ryantenney.com/schema/metrics"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.ryantenney.com/schema/metrics http://www.ryantenney.com/schema/metrics/metrics-3.0.xsd">
    <!-- Registry should be defined in only one context XML file -->
    <metrics:metric-registry id="metrics" />
    <!-- annotation-driven must be included in all context files -->
    <metrics:annotation-driven metric-registry="metrics" />
    <!-- (Optional) Registry should be defined in only one context XML file -->
    <metrics:reporter type="console" metric-registry="metrics" period="1m" />
    <!-- (Optional) The metrics in this example require the metrics-jvm jar-->
    <metrics:register metric-registry="metrics">
        <bean metrics:name="jvm.gc" class="com.codahale.metrics.jvm.GarbageCollectorMetricSet" />
        <bean metrics:name="jvm.memory" class="com.codahale.metrics.jvm.MemoryUsageGaugeSet" />
        <bean metrics:name="jvm.thread-states" class="com.codahale.metrics.jvm.ThreadStatesGaugeSet" />
        <bean metrics:name="jvm.fd.usage" class="com.codahale.metrics.jvm.FileDescriptorRatioGauge" />
    </metrics:register>
    <!-- Beans and other Spring config -->
</beans>

java注解的方式

import java.util.concurrent.TimeUnit;
import org.springframework.context.annotation.Configuration;
import com.codahale.metrics.ConsoleReporter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.SharedMetricRegistries;
import com.ryantenney.metrics.spring.config.annotation.EnableMetrics;
import com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerAdapter; 

@Configuration
@EnableMetrics
public class SpringConfiguringClass extends MetricsConfigurerAdapter {
    @Override
    public void configureReporters(MetricRegistry metricRegistry) {
    ConsoleReporter.forRegistry(metricRegistry).build().start(1, TimeUnit.MINUTES);
    }
}

注: go Metrics使用: Go语言metrics应用监控指标基本使用说明

以上就是详解Metrics应用监控指标的使用说明的详细内容,更多关于Metrics应用监控指标使用的资料请关注我们其它相关文章!

(0)

相关推荐

  • spring boot metrics监控指标使用教程

    目录 springbootmetrics是什么? 一.引入依赖 二.配置启用 三.独立的web服务 四.全局标签设置 五.自定义指标收集 六.推送or拉取指标 引入依赖 启用push模式 spring boot metrics是什么? 针对应用监控指标暴露,spring boot有一套完整的解决方案,并且内置了好很多的指标收集器,如tomcat.jvm.cpu.kafka.DataSource.spring mvc(缺少直方图的数据)等.基于micrometer技术,几乎支持所有主流的监控服务的

  • 关于Prometheus + Spring Boot 应用监控的问题

    1. Prometheus是什么 Prometheus是一个具有活跃生态系统的开源系统监控和告警工具包.一言以蔽之,它是一套开源监控解决方案. Prometheus主要特性: 多维数据模型,其中包含由指标名称和键/值对标识的时间序列数据 PromQL,一种灵活的查询语言 不依赖分布式存储: 单服务器节点是自治的 时间序列收集通过HTTP上的pull模型进行 通过中间网关支持推送(push)时间序列 通过服务发现或静态配置发现目标 支持多种模式的图形和仪表盘 为什么用pull(拉取)而不用push

  • Go语言metrics应用监控指标基本使用说明

    目录 metrics是什么? 五种Metrics类型 metrics 是什么? 当我们需要为某个系统某个服务做监控.做统计,就需要用到Metrics 五种 Metrics 类型 Gauges :最简单的度量指标,只有一个简单的返回值,或者叫瞬时状态 Counters:Counter 就是计数器,Counter 只是用 Gauge 封装了 AtomicLong Meters:Meter度量一系列事件发生的速率(rate),例如TPS.Meters会统计最近1分钟,5分钟,15分钟,还有全部时间的速

  • 详解Metrics应用监控指标的使用说明

    目录 引用Metric库 Registry Gauge(仪表) Counter(计数器) Meter() Histogram(直方图) Timer(计时器) HealthCheck(健康检查) JMX报表 HTTP报表 其它报表 MetricSet 第三方库 MetricsforSpring 基本用法 XML风格的配置 java注解的方式 题前:做过虚拟化级别.系统级别.容器级别监控:应用级别监控有哪些方法可以做? Metrics是个很好的选择.java.python.go均可支持. Metri

  • 详解关于springboot-actuator监控的401无权限访问

    今天心血来潮看一下spring监控 访问/beans 等敏感的信息时候报错 Tue Mar 07 21:18:57 GMT+08:00 2017 There was an unexpected error (type=Unauthorized, status=401). Full authentication is required to access this resource. application.properties添加配置参数 management.security.enabled=

  • Java 用Prometheus搭建实时监控系统过程详解

    上帝之火 本系列讲述的是开源实时监控告警解决方案Prometheus,这个单词很牛逼.每次我都能联想到带来上帝之火的希腊之神,普罗米修斯.而这个开源的logo也是火,个人挺喜欢这个logo的设计. 本系列着重介绍Prometheus以及如何用它和其周边的生态来搭建一套属于自己的实时监控告警平台. 本系列受众对象为初次接触Prometheus的用户,大神勿喷,偏重于操作和实战,但是重要的概念也会精炼出提及下.系列主要分为以下几块 Prometheus各个概念介绍和搭建,如何抓取数据(本次分享内容)

  • 详解prometheus监控golang服务实践记录

    一.prometheus基本原理介绍 prometheus是基于metric采样的监控,可以自定义监控指标,如:服务每秒请求数.请求失败数.请求执行时间等,每经过一个时间间隔,数据都会从运行的服务中流出,存储到一个时间序列数据库中,之后可通过PromQL语法查询. 主要特点: 多维数据模型,时间序列数据通过metric名以key.value的形式标识: 使用PromQL语法灵活地查询数据: 不需要依赖分布式存储,各服务器节点是独立自治的: 时间序列的收集,通过 HTTP 调用,基于pull 模型

  • SpringBoot详解整合Spring Boot Admin实现监控功能

    目录 监控 监控的意义 可视化监控平台 监控原理 自定义监控指标 监控 ​ 在说监控之前,需要回顾一下软件业的发展史.最早的软件完成一些非常简单的功能,代码不多,错误也少.随着软件功能的逐步完善,软件的功能变得越来越复杂,功能不能得到有效的保障,这个阶段出现了针对软件功能的检测,也就是软件测试.伴随着计算机操作系统的逐步升级,软件的运行状态也变得开始让人捉摸不透,出现了不稳定的状况.伴随着计算机网络的发展,程序也从单机状态切换成基于计算机网络的程序,应用于网络的程序开始出现,由于网络的不稳定性,

  • 使用jmx exporter采集kafka指标示例详解

    目录 预置条件 使用JMX exporter暴露指标 kafka集群启用监控 采集producer/consumer的指标 预置条件 安装kafka.prometheus 使用JMX exporter暴露指标 下载jmx exporter以及配置文件.Jmx exporter中包含了kafka各个组件的指标,如server metrics.producer metrics.consumer metrics等,但这些指标并不是prometheus格式的,因此需要通过重命名方式转变为promethe

  • 详解Spring boot Admin 使用eureka监控服务

    前言 最近刚好有空,来学习一下如何搭建spring boot admin环境.其中遇到很多的坑. 网上大多都是使用admin-url的方式直接来监控的,感觉一点也不灵活,这不是我想要的结果,所以本篇介绍借助eureka服务注册和发现功能来灵活监控程序. 本文主要记录spring boot admin的搭建过程,希望能有所帮助.其实非常的简单,不要被使用常规方式的误导! 环境介绍 IDE:intellij idea jdk: java8 maven:3.3.9 spring boot:1.5.6

  • 对Python Pexpect 模块的使用说明详解

    背景介绍 Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况.因为这种情况特别多而且繁琐,所以很多语言都有各种自己的实现.最初的第一个 Expect 是由 TCL 语言实现的,所以后来的 Expect 都大致参考了最初的用法和流程,整体来说大致的流程包括: 运行程序 程序要求人的判断和输入 Expect 通过关键字匹配 根据关键字向程序发送符合的字符串 TCL 语言实现的 Expect 功能非常强大,我曾经用它实现了防火墙

  • 分布式监控系统之Zabbix主动、被动及web监控的过程详解

    前文我们了解了zabbix的网络发现功能,以及结合action实现自动发现主机并将主机添加到zabbix hosts中,链接指定模板进行监控:回顾请参考https://www.jb51.net/article/200678.htm:今天我们来了解下zabbix的主动监控.被动监控以及web监控相关话题: 1.什么是主动监控?什么是被动监控? 我们知道获取数据的方式有两种,一种是get,一种是push:在zabbix中描述主动监控和被动监控都是站在agent的一方来描述的:我们把agent主动将数

随机推荐