[Stardust]星尘分布式全链路监控
隨著業務的發展,微服務系統會變得越來越大,各個服務之間的調用關系也會日趨復雜。一個WebApi請求,后方可能經歷多個微服務以及數據庫和MQ操作,在這個調用過程中,可能因為某一個服務節點出現延遲或者失敗,而導致整個請求失敗,此時極為需要全鏈路的調用監控。星塵Stardust提供了分布式全鏈路監控的解決方案。
星塵監控功能
星塵分布式全鏈路監控,主要功能點如下:
功能強大。能夠埋點統計調用次數、錯誤數、耗時等,適用于Web接口、RPC接口、數據庫訪問、Redis訪問、消息隊列訪問等場景;
簡單易用。只有一個服務端和Web控制臺,支持多種數據庫(MySql/SQLite/Postgresql/SqlServer),免安裝,解壓后配置數據庫連接即可跑起來;
超低投入。計算能力下沉,無需ES等重型數據庫,避免了大量的IT基礎設施投入,1臺2C4G的服務器和1臺2C4G的MySql足夠支持80多個應用每天4億多的埋點數據;
多維度分析。豐富的實時計算經驗,按照應用、類別、埋點等多個維度進行實時分析,支持月度、每天、小時、5分鐘等多種時間刻度,永久保存分析統計數據,主要接口趨勢圖等同于業務趨勢;
監控告警。支持按照應用配置告警閾值和告警機器人(企業微信、釘釘);
業界標準。基于業界標準OpenTracing來設計,跨應用跟蹤基于W3C的TraceContext來設計,支持任意語言開發的應用接入,支持不同語言應用系統的鏈路集成;
(應用監控趨勢圖)
(跨應用全鏈路監控,Android客戶端、WebApi、數據庫、Redis、消息隊列、用戶自定義埋點)
部署星塵服務端
源碼:https://github.com/NewLifeX/Stardust
國內:https://gitee.com/NewLifeX/Stardust
可以下載源碼,編譯StarServer/StarWeb并得到兩個輸出,標準.NET5.0應用。
StarServer是星塵服務端,默認端口6600,可以通過aspnetcore的urls參數調整端口。服務端以webapi形式接收處理StarAgent星塵代理或者其它星塵客戶端的數據請求,其中一部分接口屬于監控子系統,接收埋點應用上報的鏈路監控數據。為提升系統可用性,建議服務端采用雙節點部署,業務應用集成星塵客戶端時,支持配置逗號分隔的多節點地址,來實現故障轉移,例如:“http://star.newlifex.com:6600,http://106.14.11.143:6600”
StarWeb是星塵Web管理平臺,默認端口5000,可以通過aspnetcore的urls參數調整端口。管理平臺是一個基于魔方開發的web后臺系統,用于管理查看節點和應用埋點數據。Web管理平臺僅用于查看數據和修改配置,無需多節點部署。
星塵支持多種數據庫(MySql、SQLite、SqlServer、Oracle、Postgresql),默認SQLite。主要連接名如下:
{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","ConnectionStrings": {"Stardust": {"connectionString": "Data Source=..\\Data\\Stardust.db","providerName": "SQLite"},"Node": {"connectionString": "Data Source=..\\Data\\Node.db","providerName": "SQLite"},"NodeLog": {"connectionString": "Data Source=..\\Data\\NodeLog.db","providerName": "SQLite"},"Monitor": {"connectionString": "Data Source=..\\Data\\Monitor.db","providerName": "SQLite"},"MonitorLog": {"connectionString": "Data Source=..\\Data\\MonitorLog.db","providerName": "SQLite"}} }實際生產環境中,星塵使用2C4G的MySql數據庫,2C4G的服務器,支撐了80多個應用系統的埋點數據,每天共4億多次調用跟蹤。
使用監控系統
星塵系統演示:http://star.newlifex.com
星塵服務端試用版:http://star.newlifex.com:6600/
應用跟蹤器
應用監控,應用跟蹤器,管理著所有連接到星塵的監控埋點應用,默認自動添加新應用。
啟用,如果禁用,星塵將不再接受該應用提交的埋點數據;
采樣周期,默認每60秒上傳一次采樣數據;
最大正常采樣數,每個采樣周期中,每個埋點選擇的采樣數據明細,用于建立調用鏈路;
最大異常采樣數,每個采樣周期中,每個埋點選擇的異常采樣數據明細,用于分析系統錯誤;
應用統計
每個應用每天的總調用數、錯誤數、平均耗時、最大最小耗時,分類調用數(如接口數、Http請求、數據庫、消息隊列、Redis緩存、用戶自定義埋點)
點擊應用名,進入應用每日視圖,可以看到該應用在這一天中,每一個操作名/埋點(接口)的調用情況,包括次數、錯誤數、耗時等。點擊這里的種類,可以過濾只查看該類埋點操作的數據,不同種類埋點操作,采用不同顏色顯示。
再次點擊應用名,可以看到該應用每天的整體調用情況
埋點跟蹤統計
點擊操作名(埋點/接口),可以查看該埋點操作近90天的每日統計數據,主要有調用次數、錯誤數、耗時等。上方的“7天”,可以查看該埋點僅7天的每小時統計數據。上方的“24小時”,可以查看該埋點近24小時的每5分鐘統計數據,5分鐘數據比較多,默認只會保留3天,可以在服務端配置文件中調整。
全鏈路追蹤
每個埋點數據行,都帶有“跟蹤”鏈接,可以查看該埋點的某一次調用鏈路。
如上圖,同一個調用鏈上的多次埋點,具有相同traceId,跟蹤視圖顯示該traceId的前后調用關系,甚至跨多個應用系統,穿越http接口和消息隊列。鼠標移到埋點操作名上面,可以看到該埋點的數據標簽,或者異常信息。例如,數據庫埋點的數據標簽就是sql語句,消息隊列埋點的數據標簽就是消息內容。
鏈路追蹤明細數據默認保存3天,可以在星塵服務端配置文件調整。
異常分析
對于有錯誤次數的埋點,可以從總次數點擊進去,找到錯誤采樣,然后進行跟蹤查看。如果有多次錯誤采樣,不方便查找,可以從埋點跟蹤統計進入五分鐘視圖后再找。
應用接入監控系統
微服務系統中的調用采樣數據及其龐大,星塵監控通過計算能力下沉來解決這個問題。在業務系統埋點模塊內部對埋點數據進行初步聚合,再挑選若干采樣數據,在每個采樣周期(默認60秒)結束后批量上傳到星塵服務端的收集器。收集器落庫保存數據后,再次進行聚合,并進行級聯統計分析。
任何項目想要接入星塵監控,都需要從nuget中引用 NewLife.Stardust 組件庫,實例化StarTracer跟蹤器。
星塵監控支持WebApi、HttpClient、Redis、XCode、AntJob等場合的自動埋點追蹤,也支持用戶自定義埋點。
WebApi應用接入監控
netcore項目在Startup的ConfigureServices中配置引入
public void ConfigureServices(IServiceCollection services) {var set = Stardust.Setting.Current;if (!set.Server.IsNullOrEmpty()){// APM跟蹤器var tracer = new StarTracer(set.Server) { Log = XTrace.Log };DefaultTracer.Instance = tracer;ApiHelper.Tracer = tracer;DAL.GlobalTracer = tracer;TracerMiddleware.Tracer = tracer;services.AddSingleton<ITracer>(tracer);}services.AddControllersWithViews();// 引入魔方services.AddCube(); }從配置文件Config/Star.config中讀取Server字段,初始化星塵跟蹤器。也可以代碼寫死或者從配置中心讀取地址,支持配置逗號分隔的多節點地址,來實現故障轉移,例如:“http://star.newlifex.com:6600,http://106.14.11.143:6600”。
services.AddSingleton<ITracer>(tracer) 直接注入跟蹤器實例,便于后面集成使用,推薦使用。
DefaultTracer.Instance 是靜態屬性,用于沒有DI的較老代碼的接入,不推薦使用。
ApiHelper.Tracer 開放所有HttpClient擴展的埋點追蹤。
DAL.GlobalTracer 開放XCode所有數據庫訪問的埋點追蹤。
TracerMiddleware.Tracer 對所有Web請求進行埋點追蹤。
Web應用跟蹤視圖如下
消息隊列應用接入監控
.NET最愛的Redis消息隊列,NewLife.Redis 集成了鏈路追蹤,僅需要在實例化FullRedis對象時,指定Tracer屬性。
var redis = new FullRedis { Tracer = tracer, Timeout = 15000, Retry = 5, Log = XTrace.Log };此外,NewLife.RocketMQ 和 NewLife.MQTT 都集成了鏈路追蹤支持。
消息隊列跟蹤視圖如下
數據調度應用接入監控
螞蟻調度 AntJob 集成了鏈路追蹤,僅需要在實例化調度器時指定Tracer屬性。
var set = AntSetting.Current; var server = _getConfig("antServer"); if (!server.IsNullOrEmpty()) {set.Server = server;set.Save(); } // 實例化調度器 var sc = new Scheduler {Tracer = DefaultTracer.Instance,// 使用分布式調度引擎替換默認的本地文件調度Provider = new NetworkJobProvider{Server = set.Server,AppID = set.AppID,Secret = set.Secret,Debug = false} };數據調度應用跟蹤視圖如下
用戶自定義埋點
在關鍵業務方法內部,我們需要做一些自定義埋點。通過DI注入或者DefaultTracer.Instance拿到ITracer對象,借助NewSpan方法,即可得到一個埋點實例ISpan,參數就是埋點操作名,span開始到釋放就是這一次埋點的耗時。
using var span = _tracer?.NewSpan("CreateOrder", orderModel); try {//todo CreateOrder } catch (Exception ex) {span?.SetError(ex, null);throw; }如上,使用using語法,讓span離開作用域時自動Dispose銷毀,計算耗時。NewSpan第二個參數是數據標簽Tag,如果這一次埋點span有幸成為采樣對象送給星塵服務端,那么Tag將會在鏈路追蹤視圖里面得以顯示(鼠標移到操作名上)。
如果業務代碼拋出異常,需要調用SetError方法指定這一次埋點為異常采樣,并設置ex異常信息,該信息會送給星塵服務端,用于查看異常詳情。
SetError 不是必須的,如果異常時不調用SetError,還是會記入監控統計,只是認為這次調用成功,并且拿不到異常信息。此時有最簡化的自定義埋點代碼:
using var span = _tracer?.NewSpan("CreateOrder", orderModel);NewSpan會在進程中建立埋點的父子關系,無需用戶處理。而跨應用集成調用鏈,則需要一些額外操作。
常見注入和提取擴展
調用另一個系統的WebApi時,按照W3C標準,需要在Http請求頭中加上 traceparent ,內容是 span.ToString(),格式:00-traceId-spanId-00 。
spanId是埋點唯一標識,一般是16字符hex編碼;
traceId是鏈路唯一標識,一般是32字符hex編碼,具有相同traceId的埋點采樣,構成一個完整調用鏈;
調用方通過span.Attach把span注入到http請求頭,接收方從http請求頭中解碼得到traceId,魔方的TracerMiddleware.cs中有實現該功能。該方案使得不同應用的埋點操作具有相同的鏈路標識traceId,從而構成一個完整調用鏈。
NewLife.Redis消息隊列的跨系統集成,本質上是在發布消息時,向json集合中注入一個traceparent的字段,消費時讀取,從而共用traceId,構成完成調用鏈。
從圖片庫選擇
總結
以上是生活随笔為你收集整理的[Stardust]星尘分布式全链路监控的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET SDK-Style 项目(Co
- 下一篇: 如何在 C# 中使用 const,rea