前言
在前一篇「使用 OpenTracing - Jaeger (BFv3 使用 Fody)」,我們使用 MethodBoundaryAspect.Fody 來處理 OpenTracing 的程式碼,但是在有些 async 及 Overloading methods 時,會有修改 il 出錯而無法建置的狀況。 所以我們可以改用 PostSharp 的 OnMethodBoundaryAspect 來處理就沒有問題了。
實作
到 DOWNLOAD POSTSHARP 下載安裝檔,在安裝過程中先選 PostSharp Essentials (限制一個專案只 Support 10 個 Class,詳細請參考:PostSharp Essentials)。
建立 OpenTracing 的 MethodBoundaryAspect 專案
當安裝好 PostSharp Essentials 後,新增一個 類別庫 專案,從 Nuget 套件中加入 PostSharp , 或在專案上按右鍵,選擇「Add PostSharp to project 」。
新增繼承自 OnMethodBoundaryAspect 的類別,然後在 OnEntry、OnException 及 OnExit 加入 OpetTracing 處理的程式碼,如下,
1 | namespace OpenTracing.PostSharp |
在 Bot 專案中加入
一樣在 Bot 專案中,一樣要加入 PostSharp 的套件,在 Global.asax.cs 中 Application_BeginRequest 中加入取得 Jaeger Http Header 然後指定給 OpenTracingLoggingAspect 的 TracerHttpHeaders 屬性,如下,
1 | protected void Application_BeginRequest(object sender, EventArgs e) |
呼叫外部 Service 加入 Jaeger Http Header
我們要在呼叫 外部 Service 地方,加入 Jaeger Http Header,所以建議在生成 httpClient 時,可以統一由 Factory 來生成,如下,
1 | //add opentracing |
設定 [OpenTracingLoggingAspect] 屬性
我們可以在需要記錄的 Class 中設定,或是在 Properties / AssemblyInfo.cs 中設定,例如以下我針對 namespace EasyLifeBot.Actions 及 EasyLifeBot.Controllers 開頭的類別去記錄,詳細用法,請參考 Adding Aspects to Multiple Declarations Using Attributes,如下,
1 | [ |
因為是使用 PostSharp Essentials ,如果類別超過 10 個,就會出現 license 的錯誤,而無法建置哦! 如下,
License error. The project uses non-licensed features. It is not allowed to enhance or analyze more than 10 classes in each project by features not covered by the installed licenses. Please visit https://www.postsharp.net/purchase to acquire a license of PostSharp. EasyLifeBot
測試
當順利建置,就可以把 Jaeger 開起來,並執行程式跑看看,我一樣使用 訂便當 BOT 來測試。
執行後,可以順利從 Jaeger Search UI 中看到從 Bot Connector => 訂便當 BOT => Bot Connector 都串起來了。
發生錯誤時,除了正常串接起來外,也可以收到 Error 的 Log ,如下,
參考資料
Injecting Behaviors Before and After Method Execution
Adding Aspects to Multiple Declarations Using Attributes