我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

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-librato 提供Librato Metrics报表
  • Metrics Spring Integration 提供了Spring的集成
  • sematext-metrics-reporter 提供了SPM报表.
  • wicket-metrics提供Wicket应用.
  • metrics-guice 提供Guice集成.
  • metrics-scala 提供了为Scala优化的API.

这里重点介绍一下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应用监控指标使用的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot2的JUnit5与指标监控怎么使用

这篇文章主要介绍“SpringBoot2的JUnit5与指标监控怎么使用”,在日常操作中,相信很多人在SpringBoot2的JUnit5与指标监控怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spr
2023-06-29

Flyway详解(使用说明及避坑指南、一文搞懂flyway)

一、简介 1.1 Flyway是什么? Flyway是一款开源的数据库版本管理工具,可以实现管理并跟踪数据库变更,支持数据库版本自动升级,而且不需要复杂的配置,能够帮助团队更加方便、合理的管理数据库变更。 例:创建两个sql变更文件,项目启
2023-08-16

asp.net Repeater控件的说明及详细介绍及使用方法

Repeater 控件不具备内置的呈现功能,这表示用户必须通过创建模板为 Repeater 控件提供布局。当该页运行时,Repeater 控件依次通过数据源中的记录为每个记录呈现一个项。 他很简单,用起来也不够强大,但是应了那句老话,杀鸡焉
2022-06-07

script标签中的async和defer详细说明与使用场景

这篇文章主要介绍了script标签中的async和defer详细说明与使用场景,需要的朋友可以参考下
2023-02-18

JavaMetrics系统性能监控工具的使用详解

Metrics是一个Java库,可以对系统进行监控,统计一些系统的性能指标。本文就来和大家详细聊聊这个工具的具体使用,希望对大家有所帮助
2022-11-13

HTTP协议常用的请求头和响应头响应详解说明(学习)

HTTP请求头提供了关于请求,响应或者其他的发送实体的信息。HTTP的头信息包括通用头、请求头、响应头和实体头四个部分。通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。
2023-02-11

【MySQL】MySQL数据库,RDBMS 术语,使用说明和报错解决的详细讲解

作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 M
2023-08-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录