使用App.Metrics監控消息隊列


使用App.Metrics監控消息隊列

一、簡介

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 3000:3000 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(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里自定義統計圖了,比較簡單,大家可以自己研究一下,大致如下:

 

 

下一篇將會把這一套集成到實際項目中,用來監控消息隊列系統,這一篇只是了解,等我明天寫可以直接用於生產的!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM