一、简介

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,可以:

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

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

二、实际业务场景

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

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

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

三、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 在之后会经常用到。

四、搭建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 : grafana/grafana

运行成功之后我们分别可以访问8083端口的InfluxDB和3000端口的Grafana:

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

添加完成后配置一下Grafana:

四、.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();
options.HttpPolicy.FailuresBeforeBackoff = ;
options.HttpPolicy.Timeout = TimeSpan.FromSeconds();
options.MetricsOutputFormatter = new MetricsInfluxDbLineProtocolOutputFormatter();
options.Filter = filter;
options.FlushInterval = TimeSpan.FromSeconds();
})
.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里自定义统计图了,比较简单,大家可以自己研究一下,大致如下:

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

.NET Core使用App.Metrics监控消息队列(一):初探的更多相关文章

  1. 使用App.Metrics监控消息队列

    使用App.Metrics监控消息队列 一.简介 App Metrics是一个开放源代码和跨平台的.NET库,用于记录应用程序中的指标.App Metrics可以在.NET Core或也支持.NET ...

  2. .net core使用App.Metrics+InfluxDB+Grafana进行APM监控

    一.InfluxDB 1.下载InfluxDB wget https://dl.influxdata.com/influxdb/releases/influxdb-1.5.2.x86_64.rpm 2 ...

  3. 基于ASP.NET Core 5.0使用RabbitMQ消息队列实现事件总线(EventBus)

    文章阅读请前先参考看一下 https://www.cnblogs.com/hudean/p/13858285.html 安装RabbitMQ消息队列软件与了解C#中如何使用RabbitMQ 和 htt ...

  4. .NET Core微服务之基于App.Metrics+InfluxDB+Grafana实现统一性能监控

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.关于App.Metrics+InfluxDB+Grafana 1.1 App.Metrics App.Metrics是一款开源的支持. ...

  5. 基于.net core微服务(Consul、Ocelot、Docker、App.Metrics+InfluxDB+Grafana、Exceptionless、数据一致性、Jenkins)

    1.微服务简介 一种架构模式,提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(RESTfu ...

  6. .Net Core 商城微服务项目系列(十五): 构建定时任务调度和消息队列管理系统

    一.系统描述 嗨,好久不见各位老哥,最近有点懒,技术博客写的太少了,因为最近在写小说,写的顺利的话说不定就转行了,哈哈哈哈哈哈哈哈哈. 今天要介绍的是基于.Net Core的定时任务调度和消息队列管理 ...

  7. 使用App Metrics实现性能监控

    App Metrics监控需要安装InfluxDB时序数据库和Grafana可视化分析工具 1.安装InfluxDB 下载地址:https://portal.influxdata.com/downlo ...

  8. 消息队列&Celery&RabbitMQ&zeromq

    一.消息队列 什么是消息队列? “消息队列”是在消息的传输过程中保存消息的容器. “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象. 消息 ...

  9. PHP的轻量消息队列php-resque使用说明

    日志未经声明,均为AlloVince原创.版权采用『 知识共享署名-非商业性使用 2.5 许可协议』进行许可. 消息队列处理后台任务带来的问题 项目中经常会有后台运行任务的需求,比如发送邮件时,因为要 ...

随机推荐

  1. 如何在Centos服务器上搭建起Oracle10、VNC、以及FTP

    一.重装和分区 1.配置所需磁盘阵列(Raid): 2.正确分区: 3.Centos安装:过于简单,请自行bd. 二.连网 系统安装完成之后,我们需为其分配IP和DNS: "编辑连接&quo ...

  2. jinfo Java配置信息工具

    jinfo(Configuration info for Java) jinfo的作用是实时地查看和调整虚拟机各项参数. jinfo 命令格式: jinfo [ option ] pid pid是虚拟 ...

  3. Android系统修改之Email自动回复功能分析

    1. Email添加自动回复功能需要注意事项 Email可能存在多个账户, 因此自动回复功能应该添加在账户设置里面, 自动回复针对一个账户单独处理 在Email账户设置里面, 开启自动回复功能的时, ...

  4. php装上sqlserver驱动后仍然显示Call to undefined function sqlsrv_connect()问题

    今天老师要求本来的php+mysql改为php+sqlserver,在网上搜索了相应的教程,说是“需要下载安装Microsoft Drivers for PHP for SQL Server驱动”,下 ...

  5. 30 (OC)* 数据结构和算法

    在描述算法时通常用o(1), o(n), o(logn), o(nlogn) 来说明时间复杂度 o(1):是最低的时空复杂度,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间 ...

  6. [VB.NET Tips]VB.NET专有的字符串处理函数

    .NET Framework类库中含有专门为Visual Basic.NET程序员设计的函数和过程. 这些方法虽然是为VB.NET程序员设计的,但是也可以被.NET Framework上支持的任何语言 ...

  7. 网络编程之多线程——GIL全局解释器锁

    网络编程之多线程--GIL全局解释器锁 一.引子 定义: In CPython, the global interpreter lock, or GIL, is a mutex that preven ...

  8. 工厂模式(整理自李建忠<C++设计模式>视频)

    整理自李建忠<C++设计模式>视频 一.导入:"对象创建"模式和工厂模式 工厂模式只是该模式下的一种. 二.举例说明 有这样一个场景:需要在MainForm中设计一个按 ...

  9. Scrapy项目 - 实现腾讯网站社会招聘信息爬取的爬虫设计

    通过使Scrapy框架,进行数据挖掘和对web站点页面提取结构化数据,掌握如何使用Twisted异步网络框架来处理网络通讯的问题,可以加快我们的下载速度,也可深入接触各种中间件接口,灵活的完成各种需求 ...

  10. 【django】ajax,上传文件,图片预览

    1.ajax 概述: AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味 ...