用與配置化)
可觀測性指標(biāo)監(jiān)控告警APM后端鏈路追蹤【免費下載鏈接】catCAT 作為服務(wù)端項目基礎(chǔ)組件提供了 Java, C/C, Node.js, Python, Go 等多語言客戶端已經(jīng)在美團(tuán)點評的基礎(chǔ)架構(gòu)中間件框架MVC框架RPC框架數(shù)據(jù)庫框架緩存框架等消息隊列配置系統(tǒng)等深度集成為美團(tuán)點評各業(yè)務(wù)線提供系統(tǒng)豐富的性能指標(biāo)、健康狀況、實時告警等。項目地址https://gitcode.com/gh_mirrors/ca/cat點擊查看免費下載CATCentral Application Tracking作為服務(wù)端項目基礎(chǔ)組件提供 Java、C/C、Node.js、Python、Go、.NET 等多語言客戶端已在美團(tuán)點評基礎(chǔ)架構(gòu)中間件框架中深度集成。本倉庫的 lib/csharp 目錄下是一套改進(jìn)自 ctripcorp/cat.net 的 C# 客戶端實現(xiàn)核心改進(jìn)點是使用 AsyncLocal 取代 ThreadLocal 以完整支持 async/await 異步調(diào)用、提供顯式的 NewForkedTransaction 支持異步并行調(diào)用、支持從 App.config 的 CatConfiguration section 讀取服務(wù)端配置、提供數(shù)據(jù)庫訪問 Wrap 類 DBUtil并原生支持 .NET Core。讀完本文你將掌握 CAT .NET 客戶端的工程結(jié)構(gòu)、配置方式、異步埋點與并行調(diào)用 API以及 SQL 場景的埋點封裝。一、客戶端定位與工程結(jié)構(gòu)本客戶端改進(jìn)自 ctripcorp/cat.net位于倉庫 lib/csharp 目錄。它承擔(dān)兩類職責(zé)一是把業(yè)務(wù)代碼中的 Transaction / Event / Heartbeat / Metric 消息組裝成消息樹二是通過 TCP 把消息樹發(fā)送到 CAT 服務(wù)端默認(rèn) 2280 端口供服務(wù)端聚合出性能指標(biāo)、健康狀況與實時告警報表。1.1 解決方案構(gòu)成用 Visual Studio 2017 或更高版本打開Cat.sln可以看到解決方案包含四個工程工程說明目標(biāo)框架CatCAT .NET 客戶端實現(xiàn)代碼.NET Framework 4.6.1CatCore.NET Standard 版本實現(xiàn).NET Standard 2.0CatClientTest示例程序和測試用例.NET FrameworkCatCoreClientTest.NET Standard 版本示例程序.NET Standard1.2 關(guān)鍵源碼文件客戶端實現(xiàn)集中在 lib/csharp/src/CatClientCat.cs門面類提供NewTransaction、NewForkedTransaction、LogEvent、LogMetricForCount等全部靜態(tài)埋點 APICatConstants.cs常量定義如SUCCESS 0、EVENT_SQL、EVENT_SQL_ROWS等CatConfigurationSection.cs基于 .NETConfigurationSection的配置模型LocalClientConfig.cs本地配置加載實現(xiàn)DBUtil.cs數(shù)據(jù)庫訪問 Wrap 類DefaultMessageManager.cs消息上下文管理核心DefaultForkedTransaction.cs并行調(diào)用 Transaction 實現(xiàn)。1.3 運行時要求.NET Framework 4.6.1 或 .NET Standard 2.0如需支持 .NET Framework 4.5可自行 clone 后用 CallContext 替換 AsyncLocalAsyncLocal 在 4.5 上不可用CatCore 依賴 Microsoft.Extensions.Configuration因此 .NET Core 場景下可用 JSON 配置見下文 3.3。二、核心改進(jìn)一用 AsyncLocal 支撐 async/await原版 cat.net 使用 ThreadLocal 保存線程上下文而 async/await 期間方法會在不同線程間切換執(zhí)行ThreadLocal 無法跨 await 延續(xù)上下文導(dǎo)致異步代碼中的埋點丟失或錯亂。本客戶端改用 AsyncLocal見 CatThreadLocal.cs上下文會隨異步執(zhí)行流自動傳播從而完整支持 async/await。在 DefaultMessageManager.cs 中上下文容器為CatThreadLocalContextSetup()創(chuàng)建新 Context 并寫入 AsyncLocalStart/End分別壓棧/彈棧管理 Transaction 棧消息樹在根 Transaction Complete 后由Flush發(fā)送。三、核心改進(jìn)二配置化擺脫本地 client.xml 依賴3.1 在 App.config 中添加 CatConfiguration section在 .NET Framework 工程Cat中請把以下配置片段放入App.configconfigSections section nameCatConfiguration typeOrg.Unidal.Cat.Configuration.CatConfigurationSection,Cat/ /configSections CatConfiguration domain idcat_test enabledtrue max_message_size1024 client_load_balancetrue/ logEnabled enabledtrue/ servers server ip172.22.60.139 port2280 http-port8080/ !--可配置多個server地址-- !--server ip127.0.0.1 port2280 http-port8080/-- /servers /CatConfiguration配置模型在 CatConfigurationSection.cs 中定義各屬性含義如下節(jié)點/屬性類型默認(rèn)值說明domain/idstringUnknown應(yīng)用標(biāo)識DomainCAT 服務(wù)端據(jù)此區(qū)分業(yè)務(wù)線domain/enabledboolfalse是否啟用 CAT 客戶端domain/max_message_sizeint1024單棵消息樹允許的最大消息數(shù)超過會觸發(fā)截斷見 DefaultMessageManager.cs 的AddTransactionChilddomain/client_load_balanceboolfalse是否啟用客戶端隨機負(fù)載均衡見 AbstractClientConfig.cslogEnabled/enabledboolfalse是否開啟客戶端本地日志server/ipstring必填CAT 服務(wù)端 IPserver/portint2280CAT 服務(wù)端 TCP 端口server/http-portint8080CAT 服務(wù)端 HTTP 端口用于拉取路由配置server/enabledbooltrue該 server 是否參與發(fā)送3.2 配置加載邏輯加載邏輯在 LocalClientConfig.cs 的Init方法中優(yōu)先讀取AppSettings[LocalClientConfig]指向的本地 XML即傳統(tǒng)d:\data\appdatas\cat\client.xml方式若未配置或文件不存在則回退讀取CatConfigurationsection僅添加enabledtrue的 server根據(jù) domain 的id與enabled決定Cat.Enabled。配置被讀取后AbstractClientConfig會向 CAT 路由服務(wù)發(fā)送http://{server}:{http-port}/cat/s/router?domain{Domain}請求2 秒超時獲取該 domain 對應(yīng)的服務(wù)端列表若開啟client_load_balance會對列表隨機打亂AbstractClientConfig.cs。3.3 .NET Core 場景CatConfigurationSection.Load appsettings.jsonCatCore.NET Standard 版本示例 CatStandardClientTest/Program.cs 展示了 .NET Core 的配置方式IConfiguration config new ConfigurationBuilder() .AddJsonFile(appsettings.json, optional: false, reloadOnChange: true) .Build(); CatConfigurationSection.Load(config);即在appsettings.json中提供CatConfiguration節(jié)點然后通過CatConfigurationSection.Load(config)顯式加載。四、客戶端埋點基礎(chǔ)用法4.1 Transaction 埋點private static async Task InvokePayment(int i) { ITransaction paymentTransaction null; try { paymentTransaction Cat.NewTransaction(NewPayment i, PaymentDetail); // Do Business Staff paymentTransaction.Status CatConstants.SUCCESS; } catch (Exception ex) { paymentTransaction.SetStatus(ex); throw; } finally { paymentTransaction.Complete(); } }要點Cat.NewTransaction(type, name)創(chuàng)建 Transaction 并自動開始計時成功時設(shè)置Status CatConstants.SUCCESS即 0異常時SetStatus(ex)會把異常類型與堆棧寫入狀態(tài)標(biāo)記失敗并繼續(xù)拋出必須通過Complete()結(jié)束否則會在服務(wù)端生成 BadInstrument 告警事件見 DefaultMessageManager.cs 的Validate/markAsNotCompleted。4.2 其他常用 APICat.csAPI用途Cat.LogEvent(type, name, status, data)記錄事件可附帶 keyvalue 形式數(shù)據(jù)Cat.LogError(Exception)記錄異常事件Cat.LogHeartbeat(type, name, status, kv)記錄心跳消息Cat.LogMetricForCount(name[, quantity])計數(shù)器指標(biāo)類型 CCat.LogMetricForDuration(name, ms)耗時指標(biāo)類型 TCat.LogMetricForSum(name, value)求和指標(biāo)類型 SCat.NewTaggedTransaction(type, name, tag)創(chuàng)建 TaggedTransaction配合Cat.Bind(tag, title)跨線程關(guān)聯(lián)Cat.CreateMessageId()/Cat.GetThreadLocalMessageTree()獲取消息 ID 與當(dāng)前消息樹心跳報表在服務(wù)端展示效果見下五、核心改進(jìn)三異步并行調(diào)用 NewForkedTransaction并行調(diào)用如Task.WhenAll并發(fā)發(fā)起多個遠(yuǎn)程調(diào)用場景下每個子任務(wù)都在獨立執(zhí)行流中運行。為此客戶端提供Cat.NewForkedTransaction(remote, Service Name)顯式開啟新的調(diào)用上下文。5.1 完整示例// 并行調(diào)用 var tasks Enumerable.Range(1, 5).Select(async (i) { await InvokePaymentWrap(i).ConfigureAwait(false); }); await Task.WhenAll(tasks); // InvokePaymentWrap方法需要調(diào)用NewForkedTransaction private static async Task InvokePaymentWrap(int i) { var forkedTran Cat.NewForkedTransaction(remote, InvokePaymentWrap); asyncLocal.Value new Context() { Value i }; try { await InvokePayment(i).ConfigureAwait(false); forkedTran.Status CatConstants.SUCCESS; } catch (Exception ex) { forkedTran?.SetStatus(ex); } finally { forkedTran?.Complete(); } }5.2 底層原理DefaultForkedTransaction.cs 的實現(xiàn)要點創(chuàng)建時在父線程中捕獲RootMessageId與ParentMessageId并生成獨立的ForkedMessageIdFork()在子線程執(zhí)行流中manager.Setup()建立新 Context并把新消息樹的MessageId覆蓋為ForkedMessageId、ParentMessageId指向父消息樹從而與服務(wù)端日志視圖中的父子關(guān)系銜接父子線程之間不做強引用、不加鎖——若子線程 Transaction 未及時 Complete父線程通過linkAsRunAway()以軟引用方式把 ForkedTransaction 標(biāo)記為 RunAway 事件保證兩端可獨立完成、互不阻塞見 DefaultMessageManager.cs 的LinkAsRunAway。CAT 服務(wù)端會把各并行分支按ParentMessageId組織成樹狀日志視圖效果圖見文章開頭。六、核心改進(jìn)四數(shù)據(jù)庫訪問 Wrap 類 DBUtilDBUtil.cs 提供 4 個重載在業(yè)務(wù)代碼前后自動開啟與結(jié)束 Transaction方法簽名適用場景WrapWithCatTransaction(Action, queryCatetroy, operationType)同步、無返回值WrapWithCatTransactionTResult(FuncTResult, queryCatetroy, operationType)同步、有返回值WrapWithCatTransactionAsync(FuncTask, queryCatetroy, operationType)異步、無返回值WrapWithCatTransactionAsyncTResult(FuncTaskTResult, queryCatetroy, operationType)異步、有返回值6.1 示例EF Core 更新操作public virtual async Task UpdateAsync(TEntity entity) { await Org.Unidal.Cat.DBUtil.WrapWithCatTransactionAsync(async () { ValidUpdateEntity(entity); await DoUpdateAsync(entity); await SaveChangesAsync(); OnUpdateEntity(entity); }, typeof(TEntity).Name, UPDATEASYNC); }6.2 行為細(xì)節(jié)通過AsyncLocalITransaction保存當(dāng)前 SQL Transaction嵌套調(diào)用時復(fù)用外層 TransactionownTransfalse避免重復(fù)開啟自動記錄SQL.Method事件附帶Caller{文件}Member{方法}Line{行號}調(diào)用點信息利用CallerFilePath/CallerMemberName/CallerLineNumber若返回值實現(xiàn)ICollection還會記錄SQL.Rows事件按行數(shù)分檔10 / 100 / 1000 / 5000 / 10000 / 10000異常時SetStatus(ex)標(biāo)記失敗并重新拋出成功或失敗都會在 finally 中正確Complete()關(guān)閉 CATCat.Enabled false時直接透傳業(yè)務(wù)委托零額外開銷。七、測試用例與驗證倉庫 lib/csharp/test/CatClientTest 提供了可運行的示例與測試TaggedTransactionTest.cs演示NewTaggedTransaction 子線程Cat.Bind(tag, title)的跨線程關(guān)聯(lián)是理解 TaggedTransaction 語義的最小示例PerformanceTest 下的ForkedTransactionPerformanceTest.cs、MultithreadTest.cs、BatchSendTest.cs等用于驗證并行與高吞吐場景EstimateByteSizeTest.cs、TruncateTransactionTest.cs 驗證消息大小估算與超長消息樹截斷邏輯。八、接入步驟小結(jié)用 Visual Studio 2017 打開 Cat.sln選擇 CatFramework或 CatCoreStandard工程引用到業(yè)務(wù)項目在App.config配置CatConfigurationsectionFramework或在appsettings.json配置后調(diào)用CatConfigurationSection.Load(config).NET Core在業(yè)務(wù)方法中用Cat.NewTransaction包裹核心邏輯并用CatConstants.SUCCESS標(biāo)記成功、SetStatus(ex)標(biāo)記異常并行調(diào)用場景使用Cat.NewForkedTransaction為每個子任務(wù)開啟獨立上下文數(shù)據(jù)庫訪問使用DBUtil.WrapWithCatTransaction(Async)自動埋點部署 CAT 服務(wù)端后訪問服務(wù)端報表頁面查看 Transaction、Event、Heartbeat、Metric 與并行調(diào)用日志視圖。CAT 服務(wù)端部署、報表字段說明等更多信息可參考倉庫根目錄 README.md 與 docker、helm 目錄下的部署配置。贊分享可觀測性指標(biāo)監(jiān)控告警APM后端鏈路追蹤【免費下載鏈接】catCAT 作為服務(wù)端項目基礎(chǔ)組件提供了 Java, C/C, Node.js, Python, Go 等多語言客戶端已經(jīng)在美團(tuán)點評的基礎(chǔ)架構(gòu)中間件框架MVC框架RPC框架數(shù)據(jù)庫框架緩存框架等消息隊列配置系統(tǒng)等深度集成為美團(tuán)點評各業(yè)務(wù)線提供系統(tǒng)豐富的性能指標(biāo)、健康狀況、實時告警等。項目地址https://gitcode.com/gh_mirrors/ca/cat點擊查看免費下載相關(guān)推薦Erlang 應(yīng)用接入 CAT 監(jiān)控erlcat 客戶端安裝、配置與埋點 API 實戰(zhàn)指南Erlang 應(yīng)用接入 CAT 監(jiān)控erlcat 客戶端安裝、配置與埋點 API 實戰(zhàn)指南 本文以 CAT 開源倉庫中的 lib/erlang/README.可觀測性指標(biāo)監(jiān)控告警APM后端鏈路追蹤CAT Java 客戶端接入實戰(zhàn)指南從安裝配置到 Transaction/Event/Metric 埋點CAT Java 客戶端接入實戰(zhàn)指南從安裝配置到 Transaction/Event/Metric 埋點 CATCentral Application Tr可觀測性指標(biāo)監(jiān)控告警APM后端鏈路追蹤CAT Python 客戶端pycat / cat-sdk接入指南安裝、初始化與 Transaction / Event / Metric 埋點實戰(zhàn)CAT Python 客戶端pycat / cat sdk接入指南安裝、初始化與 Transaction / Event / Metric 埋點實戰(zhàn) py可觀測性指標(biāo)監(jiān)控告警APM后端鏈路追蹤創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考