一、背景

当项目的各项服务越来越多的时候,监控服务就要开始承担起越来越多的职责,这时候我们需要收集起各个业务模块的指标或者是机器的参数,来实时地反馈情况以供我们发现问题或者是做一些调优,比如我们常用的Windows的任务管理器就是这样类似的道理。

那么说起监控这些指标的话肯定要用一些变量或者一些公共的类去收集起来,然后通过一些自定义的方式保留接口供别人查询,或者直接图形化,Metric的作用就是充当一个度量的作用,即:为数据的多少、速率、健康与否这些提供一种衡量的标准,说白了,其实不用Metric,你也可以有自己的方法实现比较简单的数据采集,然后拿出来当监控用。但是我们用Metric的话待会会提到它的一些比较好的设计,可以在同一个应用中随便一个地方调用同一个类的静态方法获取收集过了的数据,这是其一。其二就是当你在一家公司内功能模块比较多,需要多个开发人员或者小组协助的时候,用同一种度量方式去检测,好处自然不言而喻。

下面是对Metrics官网的一些笔记,喜欢原汁原味的可以直接拉到文章底部看英文原版嘿嘿。

二、依赖

<dependencies><dependency><groupId>io.dropwizard.metrics</groupId><artifactId>metrics-core</artifactId><version>${metrics.version}</version></dependency>
</dependencies>
${metrics.version}可以是3.2.2

三、Registry和其他你该知道的几个概念

1、Metrics的核心是MetricRegistry类,

创建的方法:

final MetricRegistry metrics = new MetricRegistry();

一般一个应用用一个实例就够了,可以使用依赖注入或者static的方式。

2、Metrics当中有很多的度量类,比如Gauages、Counter等等,你可以理解为:这些可以度量类为平时大部分的统计方法提供了一种普适性的模型,是上面MetricRegistry这个大工厂的产品。下面会简单介绍几种,后续可以自行去官网多多查阅不同的应用场景适合用什么度量类。

3、Reporter 简单理解为输出的方式,可以是console、log4j、cvs文件、或者是Ganglia、Graphite等等这样的视图工具。

看,其实Metrics监控性能和可用性也和我们平时自己写的方式差不多。

四、一些度量类

Gauges--最简单的度量类,返回一个数值。

以下是返回队列的数量:

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>() {@Overridepublic Integer getValue() {return queue.size();}});}
}

Meters--速率,衡量一段时间内的数量

 private final MetricRegistry metrics = new MetricRegistry();
private final Meter requests = metrics.meter("requests");public void handleRequest(Request request, Response response) {requests.mark();// etc
}

以上代码表示度量每一秒处理的请求数这一速率。

Counters--为AtomicLong类的实例而生的一个gauge,可以随意地加减

另外我们都知道AtomicLong是为了解决多线程并发的时候保障正确性用的。

以下代码展示了如何度量队列中的待处理任务数量。

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();
}

Histograms--度量流数据的静态属性值,除了最大值、最小值、平均值等等这些常见的数据,还度量中间值、百分比.

以下代码度量了reponse的bytes长度:

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

Timers--度量某一段代码被调用的速率(单位时间内调用次数)以及持续时间分布,多用在性能监控。

以下代码度量了每毫秒处理的请求数,以及请求/秒的速率

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();}
}

Health Checks 健康检查

Metrics可以用一个叫metrics-healthchec的东西来集中化检查你的服务是否正常

首先创建一个 metrics-healthchec 的实例方法是这样的:

final HealthCheckRegistry healthChecks = new HealthCheckRegistry();

然后实现一个 HealthCheck 的子类:

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

然后用这个实例向Metrics注册

healthChecks.register("postgres", 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();}}
}

五、Reporter

Console Reporter--将数据反馈到console

ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build();reporter.start(1, TimeUnit.SECONDS);

Reporting Via JMX--通过JMX的方式报告

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

start()之后,所有registry里面的metrics将在JConsole和VisualVM中可见(如果安装了MBeans插件)

另外这双击任何一个metric属性的话 VisualVM将会以图形化数据的形式展示。

其他的Reporting

  • STDOUT, 从metrics-core获取并使用ConsoleReporter
  • CSV 文件, 从metrics-core获取并使用CsvReporter
  • SLF4J loggers, 从metrics-core获取并使用Slf4jReporter
  • Ganglia,从metrics-core获取并 使用GangliaReporter
  • Graphite, 从metrics-core获取并使用GraphiteReporter

六、快速启动:

 package sample;import com.codahale.metrics.*;import java.util.concurrent.TimeUnit;public class GetStarted {static final MetricRegistry metrics = new MetricRegistry();public static void main(String args[]) {startReport();Meter requests = metrics.meter("requests");requests.mark();wait5Seconds();}static void startReport() {ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build();reporter.start(1, TimeUnit.SECONDS);}static void wait5Seconds() {try {Thread.sleep(5*1000);}catch(InterruptedException e) {}}
}

资料链接

http://metrics.dropwizard.io/3.2.2/getting-started.html

http://metrics.dropwizard.io/3.2.2/manual/core.html#man-core-reporters-slf4j

Metric的快速入门相关推荐

  1. zabbix 快速入门

    zabbix 快速入门 zabbix介绍 ​ Zabbix是由 Alexei Vladishev 开发的一种网络监视,管理系统,基于Server-Client架构.可以使用多种方式监视.可以只使用 S ...

  2. Kubernetes CKA认证运维工程师笔记-Docker快速入门

    Kubernetes CKA认证运维工程师笔记-Docker快速入门 1. Docker 概念与安装 1.1 Docker 是什么 1.2 Docker 基本组成 1.3 版本与支持平台 1.4 Do ...

  3. Docker快速入门,看这个就够了

    Docker快速入门 一.Docker介绍 1.1 Docker背景 1.2 Docker概念 1.3 Docker的优势 1.4 Docker的三个基本概念 二.Docker的安装和使用 2.1 安 ...

  4. 监控工具——Metrics 快速入门

    Metrics 快速入门 关于Metrics更多的内容可以查看 metrics-getting-started 代码地址 因为每个例子涉及代码较多,且包含测试用例,如果都贴到文章中内容过多,所以只贴出 ...

  5. Shiro第一个程序:官方快速入门程序Qucickstart详解教程

    目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...

  6. 计算机入门新人必学,异世修真人怎么玩?新手快速入门必备技巧

    异世修真人怎么快速入门?最近新出来的一款文字修仙游戏,很多萌新不知道怎么玩?进小编给大家带来了游戏新手快速入门技巧攻略,希望可以帮到大家. 新手快速入门攻略 1.开局出来往下找婆婆,交互给点钱,旁边有 ...

  7. Spring Boot 2 快速教程:WebFlux 快速入门(二)

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...

  8. Apache Hive 快速入门 (CentOS 7.3 + Hadoop-2.8 + Hive-2.1.1)

    2019独角兽企业重金招聘Python工程师标准>>> 本文节选自<Netkiller Database 手札> 第 63 章 Apache Hive 目录 63.1. ...

  9. 《iOS9开发快速入门》——导读

    本节书摘来自异步社区<iOS9开发快速入门>一书中的目录,作者 刘丽霞 , 邱晓华,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 前 言 第1章 iOS ...

最新文章

  1. 现在,Serverless 真的已经成熟了吗?
  2. 小程序沉浸式_古北水镇红叶祭嵌入戏精学院 全新文旅沉浸模式让游客嗨起来...
  3. 走台阶 OR 台阶走——《狂人C》习题解答14(第三章习题4)
  4. python使用pdfminer解析页面内容,得到内容的详细坐标
  5. map.addoverlay php,覆盖物 - 百度地图开发文档 - php中文网手册
  6. C程序设计--结构体+单向链表
  7. 为 Hexo 搭建的博客添加属于自己的个性域名
  8. 请将磁盘插入‘‘U盘(F:)‘‘的解决方法
  9. AARRR模型常见指标
  10. 在坦桑尼亚如何打国际长途,打给你中国的朋友?
  11. html 图片展示 3d,利用CSS3制作简单的3d半透明立方体图片展示
  12. 无人机开发-图传技术浅析
  13. Win8系统mscomctl.ocx缺失的解决方法 run-time error 339
  14. 【转载】裸眼识别二维码
  15. python画条形图并分类-python matplotlib库绘制条形图练习题
  16. 计算机网络的安全目标要求网络,国家制定并不断完善(),明确保障网络安全的基本要求和主要目标,提出重点领域的网络安全政策、工作任务和措施。 - 众答网问答...
  17. Android App无法抓包的解决方案总结
  18. python实现生成word文档并转为pdf
  19. Spring Security登录验证,验证码,动态管理uri访问权限,Thymeleaf,限制密码强度、过期、错误密码锁定超时自动解锁、禁用历史密码、新密码和现密码差异要求编辑距离
  20. Centos 7下Nagios的安装及配置(完整版)

热门文章

  1. 不一样的精巧:高级机械原理——全动画图解
  2. python中csv库的writer函数_指定格式csv.writer在Python中
  3. 高盐水中钙镁含量高的原因,及解决方法
  4. 初试树莓派在2.2寸QVGA SPI TFT LCD上显示图片
  5. xinxin - 加密算法
  6. 微信红包JAVA代码整理
  7. 友情链接作用与方法详解
  8. java程序设计教学改革_《Java程序设计》课程教学改革与实践
  9. 前端js打开pdf文件--文件通过浏览器打开,以pdf形式进行预览
  10. 吉林大学设计模式第四次作业(上)