Metrics.net + influxdb + grafana 構建WebAPI的自動化監控和預警

前言

此次主要分享經過Metrics.net + influxdb + grafana 構建WebAPI的自動化監控和預警方案。經過執行耗時,定位哪些接口拖累了服務的性能;經過請求頻次,設置適當的限流和熔斷機制,攔截非法或不合理的請求,保障服務的可用性。html

InfluxDB

官網:https://www.influxdata.com/git

按照官方的說法,InfluxDB是一個開源分佈式時序、事件和指標數據庫。使用 Go 語言編寫,無需外部依賴。其設計目標是實現分佈式和水平伸縮擴展。程序員

 

下載地址:https://portal.influxdata.com/downloads,解壓後的目錄以下github

 

 打開配置文件,設置數據存儲路徑web

[data]
  # The directory where the TSM storage engine stores TSM files.
  #dir = "/var/lib/influxdb/data"
  dir = "C:/Users/001wa/Desktop/software/influxdb-1.2.2-1/data"

  # The directory where the TSM storage engine stores WAL files.
  #wal-dir = "/var/lib/influxdb/wal"
  wal-dir = "C:/Users/001wa/Desktop/software/influxdb-1.2.2-1/data"

開啓管理界面數據庫

[admin]
  # Determines whether the admin service is enabled.
  enabled = true

  # The default bind address used by the admin service.
  bind-address = ":8083"

cmd到當前目錄,使用配置文件influxdb.conf啓動服務後,能夠查看管理頁面http://127.0.0.1:8083/api

 

至此,服務啓動成功。服務器

建立數據庫並改變默認策略,並建立具備管理員權限的帳戶分佈式

CREATE DATABASE "db_metrics"
CREATE RETENTION POLICY "rp_metrics" ON "db_metrics" DURATION 10w REPLICATION 1 DEFAULT

CREATE USER "admin" WITH PASSWORD 'admin' WITH ALL PRIVILEGES

 

Metrics.Net

現有多個Metrics及其擴展的版本:ide

https://github.com/etishor/Metrics.NET 該版本的做者聽說去天堂了,指望天堂裏沒有程序員這個職業。

https://github.com/davidB/metrics-influxdb 這個擴展支持的Influxdb版本過低,高版本會報異常,無奈放棄。

https://github.com/Recognos/Metrics.NET這個版本每一個時間週期都會向數據源推數據,若是這段時間內沒有數據則默認用上個週期的數據,而且數據會累計,致使重複,不便於統計和展現。

https://github.com/Recognos/Metrics.NET.InfluxDB這個版本的擴展不錯。

 

最終選擇後面兩個,並對源碼作了一點擴展和二次開發,基礎SDK主要封裝Metrics的基礎操做和修復上述重複、累計問題,並註冊全局的環境、主機的自定義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))));

 

以後在基礎sdk上擴展一個用於統計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 histogram
                    var histogram = GetOrAddHistogram(metricsName, tags);
                    histogram.Update(stopWatch.ElapsedMilliseconds);
                }

WebAPI引用後,要註冊全局的過濾器

            config.Filters.Add(new MetricsFilterAttribute());

Grafana

Grafana是一個很是好看的監控界面,從這裏下載:https://grafana.com/grafana/download

啓動服務,打開登錄頁面http://localhost:3000,使用默認帳號登錄。

這裏主要關注數據源的配置和圖表的畫法,再也不詳述用戶分組權限的管理和自動化預警,想了解更多能夠參考官方文檔:http://docs.grafana.org/guides/getting_started/

 

首先添加數據源,設置數據源的類型、地址、數據庫、通訊方式等。

 

以後,自定義模板,將自定義的Tags做爲篩選項,並設置數據源、篩選條件。

 最終的效果爲:

 

接下來,自定義圖表

設置標題

 

選擇本身的數據庫和查詢字段,好比採用Histrogram直方圖記錄單位時間內的執行次數和耗時分佈

由於耗時和訪問次數屬於不一樣的維度,這裏要設置兩個Y座標

 顯示一些聚合數據

 

設置咱們要展現圖形格式

 

最終效果爲

 

熔斷

爲了保證單個接口或服務的可用性,一般針對單個用戶帳戶、單個調用方ip在某個時間段內的訪問頻次進行限制,攔截惡意的請求,保障服務的可用性。

能夠在Grafana中設置預警閾值,直接調用接口,對用戶或ip進行訪問攔截等。

後語

這篇是線上服務的可用性保障方案的其中一篇,其它的內容會後續補充:


1.對Web、H五、App相關頁面進行埋點,統計用戶訪問的PV、UV、停留時間、轉化率等。

 

2.VSAnalyseTool本地調試分析接口的耗時、內存、CPU的使用狀況,直接定位問題、優化代碼。
  接口性能分析與優化

 

3.SoapUI對接口進行並行壓力測試,針對性改善接口性能。

 

4.Metrics.net + influxdb + grafana對API進行埋點。

 

5.完善日誌系統,記錄請求和響應及耗時,標識一次完整的請求,便於查找和定位問題。

 

6.對EntityFramework進行輕度包裝,支持AsNoTracking、自動nolock、記錄SQL執行耗時、讀寫分離等。

 

7.zabbix監控服務器的內存、線程、CPU Average、CPU Load、IO等,設置閾值、及時預警,保障線上的可用性。

 

8. WinDbg分析線上服務異常時的內存轉儲文件,排查大對象、高頻回收、線程耗時、死鎖等問題。

  高CPU、數據庫沒法讀寫的真兇

   Windbg DUMP分析(原創匯總)

  記一次內存泄漏DUMP分析

相關文章
相關標籤/搜索