前言
記得 2019 年時,還在使用 OpenTracing ,過一陣子,就有 OpenTelemetry 的消息。
因為 OpenTracing 與 OpenCensus 都是用來做分佈式追蹤及記錄一些 Metrics 。
於是 Cloud Native Computing Foundation (CNCF) 整合 OpenTracing 與 OpenCensus ,
所以有了 OpenTelemetry ,它結合了 Traces, Metrics And Logs 。
所以我們可以改用 OpenTelemetry 來練習看看。
練習
我們可以取 Github 上的方案 RMStore 來練習。
加入套件
因為使用的專案為 Razor Page 及 Web Api ,所以要加入以下幾個套件
OpenTelemetry.Extensions.Hosting
OpenTelemetry.Instrumentation.AspNetCore
OpenTelemetry.Instrumentation.Http
OpenTelemetry.Exporter.Jaeger
修改專案
在 WebUI 及 API 專案的 Startup.cs ,只要加入 AddOpenTelemetryTracing 的設定就可以了,
所以在 ConfigureServices Method 中加入以下的程式,
1 | //OpenTelemetry |
註: 上面程式中的 AddService 請依專案名稱調整。
如果專案是 .NET 5 之前版本,要設定 Activity.DefaultIdFormat 為 W3C 。
在 WebUI 及 API 專案的 Program.cs 的 Main Method,
1 | //OpenTelemetry .NET 5 before versions |
- 修改 WebUI 專案中的 Product.cshtml.cs GetProducts Method,註: 目前發現,如果在 HttpClient 中使用 DelegatingHandler 無法讓 AddHttpClientInstrumentation 處理到
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17private async Task GetProducts(string productName)
{
_logger.LogInformation(message: "RazorPage ENTRY: search products");
var apiUrl = $"https://localhost:44330/product?productName={HttpUtility.UrlEncode(productName)}";
if (productName?.ToLower() == "patherror")
{
apiUrl = $"https://localhost:44330/productx?productName={HttpUtility.UrlEncode(productName)}";
}
var request = new HttpRequestMessage(HttpMethod.Get,apiUrl);
var token = await HttpContext.GetTokenAsync(OpenIdConnectParameterNames.AccessToken);
request.Headers.Add("Authorization", $"Bearer {token}");
var client = _clientFactory.CreateClient();
var response = await client.SendAsync(request);
var productsJson = await response.Content.ReadAsStringAsync();
Products = JsonConvert.DeserializeObject<List<Product>>(productsJson)
.OrderBy(p => p.ProductID).ToList();
}
測試
1.將 Jaeger 執行起來
2.執行方案,就可以從 Jaeger 查到相關的行為
3.開啟 Browser 連到 http://localhost:16686/search 即可以查到 WebUI -> API 的 Tracing 資料哦!
從 Jaeger 中可以發現,每次 Http 的操作,都會被記錄下來哦!
4.如果發生錯誤,可以從 SpanId 到 Log 中找到對應的錯誤,而從 Parent Span 又可以知道入口是那一個地方。
參考資料
OpenTelemetry
OpenTelemetry .NET API
OpenTracing
OpenCensus
Building End-to-End Diagnostics and Tracing: An Intro