`

基于dropwizard/metrics ,kafka,zabbix构建应用统计数据收集展示系统

 
阅读更多

 

http://hengyunabc.github.io/about-metrics/

 

 

想要实现的功能

  • 应用可以用少量的代码,实现统计某类数据的功能
  • 统计的数据可以很方便地展示

metrics

metrics,按字面意思是度量,指标。

举具体的例子来说,一个web服务器:

  • 一分钟内请求多少次?
  • 平均请求耗时多长?
  • 最长请求时间?
  • 某个方法的被调用次数,时长?

以缓存为例:

  • 平均查询缓存时间?
  • 缓存获取不命中的次数/比例?

以jvm为例:

  • GC的次数?
  • Old Space的大小?

在一个应用里,需要收集的metrics数据是多种多样的,需求也是各不同的。需要一个统一的metrics收集,统计,展示平台。

流行的metrics的库

https://github.com/dropwizard/metrics
java实现,很多开源项目用到,比如hadoop,kafka。下面称为dropwizard/metrics。

https://github.com/tumblr/colossus
scala实现,把数据存到OpenTsdb上。

spring boot 项目里的metrics:

http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-metrics.html

spring boot里的metrics很多都是参考dropwizard/metrics的。

metrics的种类

dropwizard/metrics 里主要把metrics分为下面几大类:

https://dropwizard.github.io/metrics/3.1.0/getting-started/

Gauges

gauge用于测量一个数值。比如队列的长度:

1
2
3
4
5
6
7
8
9
10
11
12
13
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();
                             }
                         });
    }
}

 

Counters

counter是AtomicLong类型的gauge。比如可以统计阻塞在队列里的job的数量:

1
2
3
4
5
6
7
8
9
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

histogram统计数据的分布。比如最小值,最大值,中间值,还有中位数,75百分位, 90百分位, 95百分位, 98百分位, 99百分位, and 99.9百分位的值(percentiles)。

比如request的大小的分布:

1
2
3
4
5
6
private final Histogram responseSizes = metrics.histogram(name(RequestHandler.class, "response-sizes"));

public void handleRequest(Request request, Response response) {
    // etc
    responseSizes.update(response.getContent().length);
}

 

Timers

timer正如其名,统计的是某部分代码/调用的运行时间。比如统计response的耗时:

1
2
3
4
5
6
7
8
9
10
11
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

这个实际上不是统计数据。是接口让用户可以自己判断系统的健康状态。如判断数据库是否连接正常:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
final HealthCheckRegistry healthChecks = new HealthCheckRegistry();

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

 

Metrics Annotation

利用dropwizard/metrics 里的annotation,可以很简单的实现统计某个方法,某个值的数据。
如:

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * 统计调用的次数和时间
 */
@Timed
public void call() {
}

/**
 * 统计登陆的次数
 */
@Counted
public void userLogin(){
}

 

想要详细了解各种metrics的实际效果,简单的运行下测试代码,用ConsoleReporter输出就可以知道了。

metrics数据的传输和展示

dropwizard/metrics 里提供了reporter的接口,用户可以自己实现如何处理metrics数据。

dropwizard/metrics有不少现成的reporter:

1
ConsoleReporter  输出到stdout
JmxReporter  转化为MBean
metrics-servlets  提供http接口,可以查询到metrics信息
CsvReporter 输出为CSV文件
Slf4jReporter 以log方式输出
GangliaReporter  上报到Ganglia
GraphiteReporter 上报到Graphite

 

上面的各种reporter中,Ganglia开源多年,但缺少一些监控的功能,图形展示也很简陋。Graphite已经停止开发了。

而公司所用的监控系统是zabbix,而dropwizard/metrics没有现成的zabbix reporter。

zabbix的限制

zabbix上报数据通常用zabbix agent或者zabbix trapper。
用户自己上报的数据通常用zabbix trapper来上报。

zabbix上收集数据的叫item,每个item都有自己的key,而这些item不会自动创建。zabbix有Low-level discovery,可以自动创建item,但是也相当麻烦,而且key的命名非常奇怪。不如直接用template了。

https://www.zabbix.com/documentation/2.4/manual/discovery/low_level_discovery

假定zabbix上不同的应用的key都是相对固定的,那么就可以通过模板的方式,比较方便地统一创建item, graph了。

另外想要实现自动创建item,比较好的办法是通过zabbix api了。

但目前Java版没有实现,于是实现了一个简单的:

https://github.com/hengyunabc/zabbix-api

dropwizard/metrics zabbix reporter

基于上面的template的思路,实现了一个dropwizard/metrics 的zabbix reporter。

原理是,通过zabbix sender,把metrics数据直接发送到zabbix server上。

https://github.com/hengyunabc/zabbix-sender

https://github.com/hengyunabc/metrics-zabbix

dropwizard/metrics发送到kafka,再从kafka发到zabbix

上面的方案感觉还是不太理想:

  • 没有实现自动化,还要手动为每一个应用配置template,不够灵活
  • 所有的数据都发送到一个zabbix server上,担心性能有瓶颈
    于是,新的思路是,把metrics数据发送到kafka上,然后再从kafka上消费,再把数据传到zabbix server上。

这样的好处是:

  • kafka可以灵活扩容,不会有性能瓶颈
  • 从kafka上消费metrics数据,可以灵活地用zabbix api来创建item, graph

于是实现了两个新项目:

Java程序先把metrics数据上报到kafka,然后kafka consumer从metrics数据里,提取出host, key信息,再用zabbix-api在zabbix server上创建item,最后把metrics数据上报给zabbix server。

自动创建的zabbix item的效果图:
zabbix-api-create-zabbix-itemzabbix-api-create-zabbix-item

在zabbix上显示的用户自定义的统计数据的图:
zabbix-test-response-sizezabbix-test-response-size

数据的聚合

比如,统计接口的访问次数,而这个接口部署在多台服务器上,那么如何展示聚合的数据?

zabbix自带有聚合功能,参考:

http://opsnotes.net/2014/10/24/zabbix_juhe/ 实战:Zabbix 聚合功能配置与应用

metrics的实现的探讨

从dropwizard/metrics里,我们可以看到一种简单直观的实现:

  • app内收集统计数据,计算好具体的key/value
  • 定时上报

另外,用分布式调用追踪(dapper/zipkin)的办法,也可以实现部分metrics的功能。
比如某个方法的调用次数,缓存命中次数等。

当然,两者只是部分功能有重合。

dropwizard/metrics 是一种轻量级的手段,用户可以随意增加自己想要的统计数据,代码也很灵活。有些简单直观的统计数据如果用分布式调用追踪的方式来做,显然会比较吃力,得不偿失。

总结

本文提出并实现了,利用dropwizard/metrics做数据统计,kafka做数据传输,zabbix做数据展示的完整流程。

对于开发者来说,不需要关心具体的实现,只需要按dropwizard/metrics的文档做统计,再配置上metrics-kafka reporter即可。

 

 

 

 

分享到:
评论

相关推荐

    k8s-gcr-io-metrics-server-metrics-server-v0.4.1.rar

    k8s.gcr.io/metrics-server/metrics-server:v0.4.1 components.yaml 博客地址:https://blog.csdn.net/shenhonglei1234/category_7260434.html

    bitnami/metrics-server

    docker pull bitnami/metrics-server:0.6.1

    metrics-kafka, 为 Kafka 和用户提供的用于监视它们的度量.zip

    metrics-kafka, 为 Kafka 和用户提供的用于监视它们的度量 Kafka CodaHale度量报告器 黎曼度量用户这个 repo的目标是结束工作环境,以便系统( 应用程序和基础结构) 向 Kafka 发送度量/传感器数据,然后报告数据。...

    Coda Hale Metrics 库的 Go 移植.zip

    Coda Hale Metrics 库的 Go 移植度量指标Coda Hale Metrics 库的 Go 端口https://github.com/dropwizard/metrics。文档http://godoc.org/github.com/rcrowley/go-metrics。用法创建和更新指标c := metrics....

    CDI extension for Dropwizard Metrics.zip

    而Dropwizard Metrics是一个强大的度量收集库,用于监控和分析应用程序的性能。当我们将这两者结合使用时,可以实现更加精细化的监控,为系统运维提供有力的支持。 CDI扩展允许我们自定义CDI的行为,通过编写拦截器...

    Zabbix数据API导出Python脚本(export zabbix metric data by http api)

    在IT监控领域,Zabbix是一款广泛应用的开源网络监控系统,它可以收集各种服务器、网络设备以及应用的性能数据。Zabbix提供了丰富的API接口,允许用户通过编程方式与Zabbix服务器进行交互,实现自动化任务,比如数据...

    metrics-zabbix-omni

    Metrics-zabbix 该项目是 zabbix 附加组件,目的是向Zabbix报告措施。 使用Maven导入: &lt;groupId&gt;io.github.hengyunabc&lt;/groupId&gt; &lt;artifactId&gt;metrics-zabbix&lt;/artifactId&gt; &lt;version&gt;0.0.1-zabbix&lt;/version&gt;...

    metrics-statsd:Dropwizard指标和StatsD之间的简单报告桥梁

    WIP:指标统计信息D 和。 metrics-statsd是和之间的简单报告桥梁。 贡献 我们遵循Google的。 发牌 Apache License, Version 2.0 --------------------------- Copyright 2021 Gojek Tech Licensed under the ...

    metrics-kafka-reporter:CodahaleDropwizard Metrics的报告者,将测量结果作为JSON文档发布到Apache Kafka主题

    metrics-kafka-reporter ,将测量结果作为JSON文档发布到主题。 和报告程序都可用: 兼容性 该记者已经针对以下方面进行了测试: 版本3.1.0 版本0.8.2.2 版本2.5.1 它应与上述任何API兼容版本兼容。 讯息格式 ...

    metrics-core-3.1.5-API文档-中文版.zip

    赠送jar包:metrics-core-3.1.5.jar; 赠送原API文档:metrics-core-3.1.5-javadoc.jar; 赠送源代码:metrics-core-3.1.5-sources.jar; 赠送Maven依赖信息文件:metrics-core-3.1.5.pom; 包含翻译后的API文档:...

    metrics-scraper_1_0_6.tar.gz

    在Kubernetes(简称k8s)这个庞大的容器编排系统中,监控与度量数据的收集是至关重要的。"metrics-scraper"是一个专为Kubernetes设计的工具,用于抓取集群内部的各种指标,以便进行性能分析、故障排查和资源优化。...

    metrics-core-3.1.5-API文档-中英对照版.zip

    赠送jar包:metrics-core-3.1.5.jar; 赠送原API文档:metrics-core-3.1.5-javadoc.jar; 赠送源代码:metrics-core-3.1.5-sources.jar; 赠送Maven依赖信息文件:metrics-core-3.1.5.pom; 包含翻译后的API文档:...

    k8s.gcr.io/metrics-server/metrics-server:v0.4.3

    kubectl get hpa targets 显示unknown 需要的镜像

    kubernetes-metrics-scraper_v1.0.1.tar

    k8s.gcr.io/kubernetes-metrics-scraper:v1.0.1镜像tar包,使用 docker load --input kubernetes-metrics-scraper_v1.0.1.tar进行导入

    转至Coda Hale指标库的端口-Golang开发

    go-metrics转到Coda Hale的Metrics库的端口:https://github.com/dropwizard/metrics。 文档:http://godoc.org/github.com/rcrowley/go-metrics。 用法创建和更新指标:c:= metrics.NewCounter(go-metrics转到...

    kafka的基本应用及场景分析.rar

    《Kafka基本应用及场景分析》 Apache Kafka是一款开源的分布式流处理平台,由LinkedIn开发并贡献给Apache软件基金会。...理解并掌握Kafka的基本应用和场景分析,对于构建高效、可靠的实时数据处理系统至关重要。

    metrics-webapp:简单的Dropwizard Webapp可以将指标写入kafka,以便在webapp中使用,汇总和显示

    指标网络应用 简单的Dropwizard Webapp可以将指标写入kafka,以便在webapp中使用,汇总和显示 构建:mvn包 运行:java -jar target / dropzard-1.0-SNAPSHOT.jar服务器hello-world.yml

    ops-asg-metrics-zabbix-omni

    metrics-zabbix Dropwizard zabbix的Metrics报告程序。 某物 这只是使用zabbix发送方将数据发送到zabbix。 您必须自己在zabbix服务器中配置项目和图形。 它不会自动创建项目。 例子 导入io.github.hengyunabc....

    folsom, 公开Erlang事件和度量.zip

    folsom, 公开Erlang事件和度量 FolsomFolsom是基于 Hale ( https://github.com/dropwizard/metrics )的Coda度量的基于Erlang的度量系统。 api的指标是从你的Erlang应用程序收集实时度量,并通过Er

    基于 Prometheus 和 Zabbix 实现容器云平台整体监控方案-最佳实践.docx

    ### 基于Prometheus和Zabbix实现容器云平台整体监控方案—最佳实践 #### 一、背景介绍 随着云计算的普及以及企业数字化转型的深入,容器化技术因其高效的资源利用、灵活的服务编排能力而成为了当前IT领域的热门...

Global site tag (gtag.js) - Google Analytics