1. 程式人生 > >在.NET Core 中收集資料的幾種方式

在.NET Core 中收集資料的幾種方式

APM是一種應用效能監控工具,可以幫助理解系統行為, 用於分析效能問題的工具,以便發生故障的時候,能夠快速定位和解決問題, 通過匯聚業務系統各處理環節的實時資料,分析業務系統各事務處理的交易路徑和處理時間,實現對應用的全鏈路效能監測。 [![](https://i.loli.net/2020/12/25/WQHE4nAlZNUftaC.jpg)](https://i.loli.net/2020/12/25/WQHE4nAlZNUftaC.jpg) ## 組成結構 - 探針(Agent):負責在客戶端程式執行時搜尋服務呼叫鏈路資訊,傳送給收集器 - 收集器(Collector):負責將資料格式化,儲存到儲存器 - 儲存器(Storage):儲存程式資料 - UI介面(Dashboard):多維度展示資料 本文會主要針對 探針 (Agent), 分享下在.NET 程式中收集程式資料的幾種方式,如果需要自研 APM 系統或者收集資料來進行系統分析,希望能可以給大家一些幫助,以下幾種方式,大家可以針對自己的場景去選擇,我們的目的只是收集資料。 ### 手動埋點 手動埋點比較簡單,我們需要在一些操作前後可以手動包裹我們的埋點程式碼,比如 Http,RPC,DB, MQ 等呼叫,非常靈活,可以在任意的地方新增我們的埋點資訊,然後彙總資料,按批發送,缺點是對程式的侵入性較高,不太優雅。 ### Middleware 中介軟體 & 過濾器 Filter 得益於 .NET Core 優秀的框架設計, 它具有一個極具擴充套件性的請求處理管道,我們可以通過這個管道的定製來滿足各種場景下的HTTP處理需求。ASP. NET Core應用的很多特性,比如路由、認證、會話、快取等,也同時定製訊息處理管道來實現的,所以我們需要編寫自定義的攔截中介軟體 InterceptMiddleware,獲取到請求上下文 HttpContext, 來攔截所有的Http請求收集資料,注意這裡中介軟體的位置要放到 UseEndpoints() 的上面,同樣可以藉助 過濾器 AcitonFilter,來完成同樣的效果, 但是這種方式可獲取的資訊有限,只能攔截到 Http 請求的一些資訊 ### DiagnosticSource 實現: SkyApm-dotnet [https://github.com/SkyAPM/SkyAPM-dotnet](https://github.com/SkyAPM/SkyAPM-dotnet "https://github.com/SkyAPM/SkyAPM-dotnet") HttpReports APM [https://github.com/dotnetcore/HttpReports](https://github.com/dotnetcore/HttpReports "https://github.com/dotnetcore/HttpReports") 診斷 DiagnosticSource 我們不經常用,可能都有點陌生,但是它的功能是非常強大的,它本身是一個基於釋出訂閱模式的工作模式,我們可以非同步的去收集資訊,比如 中介軟體的進入和退出,HttpClient 呼叫的開始和結束,並且有很多第三方的庫都支援了 DiagnosticSource,這也是微軟目前推薦的方式,在改動極少程式碼的情況下,採集到豐富的執行資料。 ### 引用 AOP 額,面向切面程式設計,這個需要在我們的 .NET 程式中引用 AOP 框架,如果是內部系統的話,我覺的還是可以接受的,常見的框架 AspectCore, Castle.Core, 通過 AOP 的特性,我們可以攔截需要獲取資料的方法,如果你在專案中,普遍使用依賴注入的話,可以達到方法級別的監控,獲取到的資訊非常可觀,另外需要注意的是,獲取的資訊越詳細,資料量也越大,是全量採集資料還是抽樣採集也是要考慮的點 ### ETW(Event Tracing for Windows) ETW是Event Tracing for Windows的簡稱,它是Windows提供的原生的事件跟蹤日誌系統。由於採用核心(Kernel)層面的緩衝和日誌記錄機制,所以ETW提供了一種非常高效的事件跟蹤日誌解決方案。 這個庫我還沒怎麼用過,生而為人,我很抱歉 〒▽〒 ### Mono.Cecil Mono.Cecil:一個可載入並瀏覽現有程式集並進行動態修改並儲存的.NET框架, Mono Cecil十分強大,可以靜態注入程式集(注入後生成新的dll程式集)和動態注入程式集(注入後不改變目標程式集,只在執行時改變程式集行為,騰訊開源的Unity熱更解決方案xLua有一個非常吸引人的特性就是Hotfix,其原理是使用Mono.Cecil庫對進行C#層編譯出來的dll程式集進行IL程式碼注入。 ### CLR Profiling API 實現 聽雲APM(商業)OneAPM (商業)Datadog (商業) [https://docs.microsoft.com/en-us/archive/blogs/yirutang/clr-profiling-api](https://docs.microsoft.com/en-us/archive/blogs/yirutang/clr-profiling-api "https://docs.microsoft.com/en-us/archive/blogs/yirutang/clr-profiling-api") 這個真的是一個很棒的方案,你可以看到,很多的 商業APM 系統,都採用了這種方式,因為它是一種無侵入的收集方式,CLR Profiling (分析) API 是CLR中最酷的東西之一, 分析 API 提供 CLR 中發生的各種事件和操作的相關資訊, 你可以使用此資訊來監視程序的內部工作情況,也可分析 .NET 應用程式的效能 支援的功能如下: - CLR 啟動和關閉事件。 - 應用程式域建立和關閉事件。 - 程式集載入和解除安裝事件。 - 模組載入和解除安裝事件。 - COM vtable 建立和析構事件。 - 實時 (JIT) 編譯和程式碼間距調整事件。 - 類載入和解除安裝事件。 - 執行緒建立和析構事件。 - 函式入口和退出事件。 - 異常。 - 託管和非託管程式碼執行之間的轉換。 - 不同執行時上下文之間的轉換。 - 有關執行時掛起的資訊。 - 有關執行時記憶體堆和垃圾回收活動的資訊。 這可能要求你掌握 C++ 和 C#, 另外需要注意的是,Profiler 是一個非託管的 DLL 庫,會在應用執行時被載入到 CLR 中並與應用處於同一程序空間下,所以 Profiler DLL 實質上是不受託管程式碼的訪問控制的,還有,Profiler DLL 作為 CLR 的一個外掛,其執行錯誤可能會引起 CLR 本身的崩潰,所以你必須要知道這些風險,並且足夠小心,最後祝你好運 ### 另外 HttpReports 是針對.Net Core 開發的APM系統, 基於MIT開源協議,針對於微服務場景,感興趣的同學可以點個 Star 支援下,謝謝, 我們 Github:[https://github.com/dotnetcore/HttpReports](https://github.com/dotnetcore/HttpReports "https://github.com/dotnetcore/HttpReports")