Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警
前言
這次主要分享通過Metrics.net + influxdb + grafana 構(gòu)建WebAPI的自動化監(jiān)控和預(yù)警方案。通過執(zhí)行耗時,定位哪些接口拖累了服務(wù)的性能;通過請求頻次,設(shè)置適當(dāng)?shù)南蘖骱腿蹟鄼C(jī)制,攔截非法或不合理的請求,保障服務(wù)的可用性。
InfluxDB
官網(wǎng):https://www.influxdata.com/
按照官方的說法,InfluxDB是一個開源分布式時序、事件和指標(biāo)數(shù)據(jù)庫。使用 Go 語言編寫,無需外部依賴。其設(shè)計目標(biāo)是實現(xiàn)分布式和水平伸縮擴(kuò)展。
?
下載地址:https://portal.influxdata.com/downloads,解壓后的目錄如下
?
?打開配置文件,設(shè)置數(shù)據(jù)存儲路徑
開啟管理界面
[admin]# Determines whether the admin service is enabled.enabled = true# The default bind address used by the admin service.bind-address = ":8083"cmd到當(dāng)前目錄,使用配置文件influxdb.conf啟動服務(wù)后,可以查看管理頁面http://127.0.0.1:8083/
?
至此,服務(wù)啟動成功。
創(chuàng)建數(shù)據(jù)庫并改變默認(rèn)策略,并創(chuàng)建具有管理員權(quán)限的賬戶
CREATE DATABASE "db_metrics"CREATE RETENTION POLICY "rp_metrics" ON "db_metrics" DURATION 10w REPLICATION 1 DEFAULTCREATE USER "admin" WITH PASSWORD 'admin' WITH ALL PRIVILEGES
?
Metrics.Net
現(xiàn)有多個Metrics及其擴(kuò)展的版本:
https://github.com/etishor/Metrics.NET?該版本的作者據(jù)說去天堂了,期望天堂里沒有程序員這個職業(yè)。
https://github.com/davidB/metrics-influxdb?這個擴(kuò)展支持的Influxdb版本太低,高版本會報異常,無奈放棄。
https://github.com/Recognos/Metrics.NET這個版本每個時間周期都會向數(shù)據(jù)源推數(shù)據(jù),如果這段時間內(nèi)沒有數(shù)據(jù)則默認(rèn)用上個周期的數(shù)據(jù),并且數(shù)據(jù)會累計,導(dǎo)致重復(fù),不便于統(tǒng)計和展示。
https://github.com/Recognos/Metrics.NET.InfluxDB這個版本的擴(kuò)展不錯。
?
最終選擇后面兩個,并對源碼做了一點(diǎn)擴(kuò)展和二次開發(fā),基礎(chǔ)SDK主要封裝Metrics的基礎(chǔ)操作和修復(fù)上述重復(fù)、累計問題,并注冊全局的環(huán)境、主機(jī)的自定義Tags。
Metric.Config.WithReporting(report => report.WithInfluxDbMyHttp(host, port, database, userName, password, null, null,TimeSpan.FromSeconds(intervalSeconds), null, configFunc => configFunc.WithConverter(new DefaultConverter().
WithGlobalTags($"env={environment},host={Dns.GetHostName()}")).WithFormatter(new DefaultFormatter().
WithLowercase(true)).WithWriter(new InfluxdbHttpWriter(configFunc, batchSize))));
?
之后在基礎(chǔ)sdk上擴(kuò)展一個用于統(tǒng)計webapi接口耗時和頻次的sdk。
/// <summary>/// WebAPI接口過濾器 ? ?/// /// 記錄接口耗時、頻次,記錄到Metrics ? ?/// </summary>public class MetricsFilterAttribute : ActionFilterAttribute主要采用Histogram,并自定義Tags便于Grafana的篩選
if (stopWatch != null){stopWatch.Stop();var tags = new string[] { $"method={
actionExecutedContext.Request.Method.ToString()}" };
var metricsName = FormatMetricsName(
actionExecutedContext.ActionContext.ActionDescriptor);
//build and update histogramvar histogram = GetOrAddHistogram(metricsName, tags);histogram.Update(stopWatch.ElapsedMilliseconds);}
WebAPI引用后,要注冊全局的過濾器
config.Filters.Add(new MetricsFilterAttribute());Grafana
Grafana是一個非常好看的監(jiān)控界面,從這里下載:https://grafana.com/grafana/download
啟動服務(wù),打開登陸頁面http://localhost:3000,使用默認(rèn)賬號登陸。
這里主要關(guān)注數(shù)據(jù)源的配置和圖表的畫法,不再詳述用戶分組權(quán)限的管理和自動化預(yù)警,想了解更多可以參考官方文檔:http://docs.grafana.org/guides/getting_started/
?
首先添加數(shù)據(jù)源,設(shè)置數(shù)據(jù)源的類型、地址、數(shù)據(jù)庫、通信方式等。
?
之后,自定義模板,將自定義的Tags作為篩選項,并設(shè)置數(shù)據(jù)源、篩選條件。
?最終的效果為:
?
接下來,自定義圖表
設(shè)置標(biāo)題
?
選擇自己的數(shù)據(jù)庫和查詢字段,比如采用Histrogram直方圖記錄單位時間內(nèi)的執(zhí)行次數(shù)和耗時分布
因為耗時和訪問次數(shù)屬于不同的維度,這里要設(shè)置兩個Y坐標(biāo)
?顯示一些聚合數(shù)據(jù)
?
設(shè)置我們要展示圖形格式
?
最終效果為
?
熔斷
為了保證單個接口或服務(wù)的可用性,通常針對單個用戶賬戶、單個調(diào)用方ip在某個時間段內(nèi)的訪問頻次進(jìn)行限制,攔截惡意的請求,保障服務(wù)的可用性。
可以在Grafana中設(shè)置預(yù)警閾值,直接調(diào)用接口,對用戶或ip進(jìn)行訪問攔截等。
后語
這篇是線上服務(wù)的可用性保障方案的其中一篇,其它的內(nèi)容會后續(xù)補(bǔ)充:
1.對Web、H5、App相關(guān)頁面進(jìn)行埋點(diǎn),統(tǒng)計用戶訪問的PV、UV、停留時間、轉(zhuǎn)化率等。
?
2.VSAnalyseTool本地調(diào)試分析接口的耗時、內(nèi)存、CPU的使用情況,直接定位問題、優(yōu)化代碼。
接口性能分析與優(yōu)化
?
3.SoapUI對接口進(jìn)行并行壓力測試,針對性改善接口性能。
?
4.Metrics.net + influxdb + grafana對API進(jìn)行埋點(diǎn)。
?
5.完善日志系統(tǒng),記錄請求和響應(yīng)及耗時,標(biāo)識一次完整的請求,便于查找和定位問題。
?
6.對EntityFramework進(jìn)行輕度包裝,支持AsNoTracking、自動nolock、記錄SQL執(zhí)行耗時、讀寫分離等。
?
7.zabbix監(jiān)控服務(wù)器的內(nèi)存、線程、CPU Average、CPU Load、IO等,設(shè)置閾值、及時預(yù)警,保障線上的可用性。
?
8. WinDbg分析線上服務(wù)異常時的內(nèi)存轉(zhuǎn)儲文件,排查大對象、高頻回收、線程耗時、死鎖等問題。
高CPU、數(shù)據(jù)庫無法讀寫的真兇
? Windbg DUMP分析(原創(chuàng)匯總)
記一次內(nèi)存泄漏DUMP分析
相關(guān)文章:
ASP.NET Core之跨平臺的實時性能監(jiān)控
.Net Core 2.0+ InfluxDB+Grafana+App Metrics 實現(xiàn)跨平臺的實時性能監(jiān)控
應(yīng)用程序的8個關(guān)鍵性能指標(biāo)以及測量方法
使用Metrics監(jiān)控應(yīng)用程序的性能
下一個計劃 : .NET/.NET Core應(yīng)用性能管理
Ocelot監(jiān)控
Ocelot 集成Butterfly 實現(xiàn)分布式跟蹤
Ocelot中使用Butterfly實踐
原文:https://www.cnblogs.com/LoveOfPrince/p/8538621.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拥抱.NET Core系列:Memory
- 下一篇: EF Core 2.1路线图:视图、GR