APM是一種應用性能監控工具,能夠幫助理解系統行爲, 用於分析性能問題的工具,以便發生故障的時候,可以快速定位和解決問題, 經過匯聚業務系統各處理環節的實時數據,分析業務系統各事務處理的交易路徑和處理時間,實現對應用的全鏈路性能監測。git
本文會主要針對 探針 (Agent), 分享下在.NET 程序中收集程序數據的幾種方式,若是須要自研 APM 系統或者收集數據來進行系統分析,但願能能夠給你們一些幫助,如下幾種方式,你們能夠針對本身的場景去選擇,咱們的目的只是收集數據。github
手動埋點比較簡單,咱們須要在一些操做先後能夠手動包裹咱們的埋點代碼,好比 Http,RPC,DB, MQ 等調用,很是靈活,能夠在任意的地方添加咱們的埋點信息,而後彙總數據,按批發送,缺點是對程序的侵入性較高,不太優雅。編程
得益於 .NET Core 優秀的框架設計, 它具備一個極具擴展性的請求處理管道,咱們能夠經過這個管道的定製來知足各類場景下的HTTP處理需求。ASP. NET Core應用的不少特性,好比路由、認證、會話、緩存等,也同時定製消息處理管道來實現的,因此咱們須要編寫自定義的攔截中間件 InterceptMiddleware,獲取到請求上下文 HttpContext, 來攔截全部的Http請求收集數據,注意這裏中間件的位置要放到 UseEndpoints() 的上面,一樣能夠藉助 過濾器 AcitonFilter,來完成一樣的效果, 可是這種方式可獲取的信息有限,只能攔截到 Http 請求的一些信息windows
實現:
SkyApm-dotnet https://github.com/SkyAPM/SkyAPM-dotnet
HttpReports APM https://github.com/dotnetcore/HttpReportsapi
診斷 DiagnosticSource 咱們不常常用,可能都有點陌生,可是它的功能是很是強大的,它自己是一個基於發佈訂閱模式的工做模式,咱們能夠異步的去收集信息,好比 中間件的進入和退出,HttpClient 調用的開始和結束,而且有不少第三方的庫都支持了 DiagnosticSource,這也是微軟目前推薦的方式,在改動極少代碼的狀況下,採集到豐富的運行數據。緩存
額,面向切面編程,這個須要在咱們的 .NET 程序中引用 AOP 框架,若是是內部系統的話,我覺的仍是能夠接受的,常見的框架 AspectCore, Castle.Core, 經過 AOP 的特性,咱們能夠攔截須要獲取數據的方法,若是你在項目中,廣泛使用依賴注入的話,能夠達到方法級別的監控,獲取到的信息很是可觀,另外須要注意的是,獲取的信息越詳細,數據量也越大,是全量採集數據仍是抽樣採集也是要考慮的點框架
ETW是Event Tracing for Windows的簡稱,它是Windows提供的原生的事件跟蹤日誌系統。因爲採用內核(Kernel)層面的緩衝和日誌記錄機制,因此ETW提供了一種很是高效的事件跟蹤日誌解決方案。
這個庫我還沒怎麼用過,生而爲人,我很抱歉 〒▽〒異步
Mono.Cecil:一個可加載並瀏覽現有程序集並進行動態修改並保存的.NET框架, Mono Cecil十分強大,能夠靜態注入程序集(注入後生成新的dll程序集)和動態注入程序集(注入後不改變目標程序集,只在運行時改變程序集行爲,騰訊開源的Unity熱更解決方案xLua有一個很是吸引人的特性就是Hotfix,其原理是使用Mono.Cecil庫對進行C#層編譯出來的dll程序集進行IL代碼注入。函數
實現
聽雲APM(商業)OneAPM (商業)Datadog (商業)微服務
https://docs.microsoft.com/en-us/archive/blogs/yirutang/clr-profiling-api
這個真的是一個很棒的方案,你能夠看到,不少的 商業APM 系統,都採用了這種方式,由於它是一種無侵入的收集方式,CLR Profiling (分析) API 是CLR中最酷的東西之一, 分析 API 提供 CLR 中發生的各類事件和操做的相關信息, 你可使用此信息來監視進程的內部工做狀況,也可分析 .NET 應用程序的性能
支持的功能以下:
這可能要求你掌握 C++ 和 C#, 另外須要注意的是,Profiler 是一個非託管的 DLL 庫,會在應用運行時被加載到 CLR 中並與應用處於同一進程空間下,因此 Profiler DLL 實質上是不受託管代碼的訪問控制的,還有,Profiler DLL 做爲 CLR 的一個插件,其運行錯誤可能會引發 CLR 自己的崩潰,因此你必需要知道這些風險,而且足夠當心,最後祝你好運
HttpReports 是針對.Net Core 開發的APM系統, 基於MIT開源協議,針對於微服務場景,感興趣的同窗能夠點個 Star 支持下,謝謝, 咱們