.NET Core使用App.Metrics监控消息队列(一):初探

1、简介docker

App Metrics是一个开放源代码和跨平台的.NET库,用于记录应用程序中的指标。App Metrics能够在.NET Core或也支持.NET 4.5.2的完整.NET框架上运行。数据库

App Metrics经过在内存中进行采样和聚合,并提供可扩展性点以指定间隔将指标刷新到存储库中,从而抽象化了Metrics的基础存储库,例如InfluxDB,Prometheus,Graphite,Elasticsearch等。后端

App Metrics提供了各类度量标准类型来度量事物,例如请求率,计算一段时间内的用户登陆数,度量执行数据库查询所花费的时间,度量可用内存的数量等等。支持的指标类型包括Apdex,仪表,计数器,仪表,直方图和计时器。服务器

App Metrics还提供了运行情况检查系统,使您能够经过用户定义的检查来监视应用程序的运行情况。数据结构

使用App Metrics,能够:app

  • 捕获任何类型的.NET应用程序中的应用程序指标,例如Windows Service,MVC Site,Web API等
  • 自动测量MVC或Web API项目中每一个端点的性能和错误
  • 使用OAuth2保护API时,自动衡量每一个客户端的请求率和错误率
  • 选择保存捕获的指标的位置以及但愿用来可视化这些指标的仪表板
  • 经过特定于TSDB的报告扩展支持基于推和拉的指标收集,并经过HTTP以要求的格式公开指标
  • 支持以所需格式将指标推送到自定义HTTP端点
  • 支持以所需格式将指标写入文件以供指标代理收集、

 

更多使用方式直接访问官网:https://www.app-metrics.io/框架

 

2、实际业务场景async

上面介绍了App.Metrics以及它支持的场景,可是读完你必定会以为很抽象,没错我也同样。若是不是带着实际的业务场景去看这些东西,其实仍是有点云里雾里的。在实际的业务中咱们一般会把它用于两个方面,一方面是包括CPU、内存在内的对系统级别的总体监控,园子里有不少文章都作了demo供你们参考,你们能够搜一下。另一方面是经过埋点的方式统计相关数据,后端一般使用InfluxDB做为数据库,并使用Grafana或者Prometheus来对数据进行展现。分布式

本篇将介绍的使用方式是第二钟,经过埋点的方式来对消息队列进行统计,统计的数据包括 队列数量、每一个队列当前消息数量(已消费、未消费),以及消息的生成和发布速率。函数

最后的样子大致就是下面这个样子:

 

3、InfluxDB 

在使用App.Metrics以前,咱们须要先准备好数据库,也就是InfluxDB,首先快速了解一下InfluxDB是什么:

InfluxDB 是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。

相似的数据库有Elasticsearch、Graphite等。

其主要特点功能

1)基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等)

2)可度量性:你能够实时对大量数据进行计算

3)基于事件:它支持任意的事件数据

InfluxDB的主要特色

1)无结构(无模式):能够是任意数量的列

2)可拓展的

3)支持min, max, sum, count, mean, median 等一系列函数,方便统计

4)原生的HTTP支持,内置HTTP API

5)强大的类SQL语法

6)自带管理界面,方便使用

 

Influx包含如下属性:

database: 数据库名,在 InfluxDB 中能够建立多个数据库,不一样数据库中的数据文件是隔离存放的,存放在磁盘上的不一样目录。

retention policy: 存储策略,用于设置数据保留的时间,每一个数据库刚开始会自动建立一个默认的存储策略 autogen,数据保留时间为永久,以后用户能够本身设置,例如保留最近2小时的数据。插入和查询数据时若是不指定存储策略,则使用默认存储策略,且默认存储策略能够修改。InfluxDB 会按期清除过时的数据。

measurement: 测量指标名,例如 cpu_usage 表示 cpu 的使用率。

tag sets: tags 在 InfluxDB 中会按照字典序排序,不论是 tagk 仍是 tagv,只要不一致就分别属于两个 key,例如 host=server01,region=us-west 和 host=server02,region=us-west 就是两个不一样的 tag set。

field name: 例如上面数据中的 value 就是 fieldName,InfluxDB 中支持一条数据中插入多个 fieldName,这实际上是一个语法上的优化,在实际的底层存储中,是看成多条数据来存储。

timestamp: 每一条数据都须要指定一个时间戳,在 TSM 存储引擎中会特殊对待,觉得了优化后续的查询操做。

2)Point

InfluxDB 中单条插入语句的数据结构,series + timestamp 能够用于区别一个 point,也就是说一个 point 能够有多个 field name 和 field value。

3)Series

series 至关因而 InfluxDB 中一些数据的集合,在同一个 database 中,retention policy、measurement、tag sets 彻底相同的数据同属于一个 series,同一个 series 的数据在物理上会按照时间顺序排列存储在一块儿。

series 的 key 为 measurement + 全部 tags 的序列化字符串,这个 key 在以后会常常用到。

 

4、搭建InfuxDB+Grafana 

OK,这篇是一个DEMO演示篇,因此咱们使用Dokcer快速的建立InfluxDB和Grafana:

docker run -d -p 8083:8083 -p 8086:8086 --expose 8090 --expose 8099 tutum/influxdb
docker run -d --name=grafana -p 3000:3000 grafana/grafana

 

运行成功以后咱们分别能够访问8083端口的InfluxDB和3000端口的Grafana:

 

 

 

 

 

 

咱们首先给InfluxDB添加一个用户:

 

 

 添加完成后配置一下Grafana:

 

 

 

4、.NET CORE使用App.Metrics

这里咱们使用.net core控制台项目来演示(API项目例子已经有不少了,可是控制台项目没看到),新建一个控制台项目 AppMetricsPractice:

经过NuGet引用App.Metrics和App.Metrics.Reporting.InfluxDB

 

 

 

 

 

 而后咱们就能够愉快的使用了,简单使用能够以下:

static void Main(string[] args)
        {
            var metrics = new MetricsBuilder().Report
                .ToInfluxDb("http://47.99.92.76:8086", "metricsdatabase")
                .Build();


            var counter = new CounterOptions { Name = "my_counter", MeasurementUnit = Unit.Calls };
            metrics.Measure.Counter.Increment(counter,"MqQueueNmae");

            var task = Task.Run(async () =>
            {
                await Task.WhenAll(metrics.ReportRunner.RunAllAsync());
            });

            task.Wait();


            Console.Read();
        }

使用方式在官网有简介,这里介绍一下,ToInfluxDb(influxDB url,InfluxDB databaseName),这里是InfluxDB的地址和数据库名称,若是没有改数据库,会自动建立。

以上写法是简写,固然咱们能够详细的控制InfluxDB的属性,经过如下写法:

            var metrics = new MetricsBuilder()
                .Report.ToInfluxDb(
                    options =>
                    {
                        options.InfluxDb.BaseUri = new Uri("http://47.99.92.76:8086");
                        options.InfluxDb.Database = "metricsdatabase";
                        options.InfluxDb.Consistenency = "consistency";
                        options.InfluxDb.UserName = "admin";
                        options.InfluxDb.Password = "password";
                        options.InfluxDb.RetentionPolicy = "rp";
                        options.InfluxDb.CreateDataBaseIfNotExists = true;
                        options.HttpPolicy.BackoffPeriod = TimeSpan.FromSeconds(30);
                        options.HttpPolicy.FailuresBeforeBackoff = 5;
                        options.HttpPolicy.Timeout = TimeSpan.FromSeconds(10);
                        options.MetricsOutputFormatter = new MetricsInfluxDbLineProtocolOutputFormatter();
                        options.Filter = filter;
                        options.FlushInterval = TimeSpan.FromSeconds(20);
                    })
                .Build();

 

Option Description
MetricsOutputFormatter 向InfluxDB报告指标时使用的格式化程序。
Filter 该过滤器仅用于为此报告者过滤指标。
FlushInterval 向InfluxDB报告指标之间的延迟。
InfluxDb.Database 报告指标的InfluxDB数据库。
InfluxDb.BaseUri InfluxDB服务器的URI。
InfluxDb.UserName 使用基自己份验证与InfluxDB进行身份验证时的用户名。
InfluxDb.Password 使用基自己份验证与InfluxDB进行身份验证时使用的密码。
InfluxDb.Consistenency 要使用的InfluxDB数据库一致性级别。
InfluxDb.RetentionPolicy InfluxDB数据库保留策略以向其写入指标。
InfluxDb.CreateDataBaseIfNotExists 若是指定的influxdb数据库不存在,将尝试建立该数据库。
HttpPolicy.BackoffPeriod TimeSpan当指标没法向指标入口端点报告时,从后退。
HttpPolicy.FailuresBeforeBackoff 指标未能向指标入口端点报告时,在回退以前的失败次数。
HttpPolicy.Timeout 尝试向度量标准入口端点报告度量标准时的HTTP超时持续时间。

 

而后咱们要存储一个Counter类型的数据,App.Metrics里有主要有6种数据类型:Counter、Gauge、Histograms 、Meter 、Timer 、Apdex。咱们本篇主要使用Counter和Gauge这两种数据类型,

CounterOptions种的Name是数据表名,MeasurementUnit是测量的内容的描述。

metrics.Measure.Counter.Increment(counter,"MqQueueNmae");  会往把“my_counter”表里的value + 1,实际就是对value加加减减,大体以下:

 

 同时还会建立一张名为my_counter__items的表,同时为一个字段为“MqQueueNmae”的value+1,以下:

 

 

多了几个字段,经过这个咱们能够用来对不一样的消息度列Queue进行统计,而第一张表则当作一张当前消费消息的统计表。

            var task = Task.Run(async () =>
            {
                await Task.WhenAll(metrics.ReportRunner.RunAllAsync());
            });

            task.Wait();

这句代码是指将当前的统计数据报告到InfluDB,这段代码必定要在最后,它会将数据发送到全部已注册的存储端,好比你同时注册了InfluxDB和Prometheus,那么数据会同时发送到这两个存储端。

执行完成后建立的两张表以下:

 

 

而后咱们就能够去Granfan里自定义统计图了,比较简单,你们能够本身研究一下,大体以下:

 

 

下一篇将会把这一套集成到实际项目中,用来监控消息队列系统,这一篇只是了解,等我明天写能够直接用于生产的!

相关文章
相关标签/搜索