Welcome to Galaxy Software Services Corporation !
徵才專區
Vital CRM 國際認證
GSS部落格
叡揚資訊
關於叡揚
新聞與活動
產品與服務
叡揚e論壇
投資人關係
ESG專區
EN
中
簡
日
搜尋
關於叡揚
叡揚簡介
創辦人的話
叡揚大事紀
得獎肯定
合作夥伴
營業據點
聯絡我們
新聞與活動
新聞中心
資安電子報
影音專區
成功案例
行銷活動
產品與服務
企業e化應用軟體
S.P.E.E.D. 公文線上簽核管理系統
Radar 睿達人力資源管理系統
iota C.ai 對話服務平台
Tracko 多源智慧追蹤平台
B.E.S.T. 銀行信用風險資訊解決方案
BoDms 董事會提案暨會務管理系統
Vitals ESP 企業知識協作平台
Vitals HCA 評鑑協同管理系統
Vitals HAS 醫療數據分析系統
Vitals KPIM 指標管理系統
Openfind 網擎訊息安全解決方案
資訊安全
資訊安全全系列產品
行動應用程式安全專區
Checkmarx 源碼安全檢測
Digital.ai APP & Web 防護
Digital.ai APP & Web 相容性功能驗測
Illumio 零信任網路微分段
Orca Security 雲端原生應用程式防護平台
Azul 安全高效 Java JDK
Mend.io Open Source 檢測
HCL 網頁應用程式弱點掃描軟體
Quokka APP 黑箱檢測
Secure Code Warrior 安全開發培訓平台
資安檢測服務
資安學程
資安白皮書
資安電子報
企業數位化智慧維運
企業數位化智慧維運
Axway API 管理平台
Axway ST 集中檔案傳輸管理
AVC 應用程式弱點整合平台
BMC Control-M 批次管理解決方案
BMC Helix Discovery & AISM 探索打造企業IT智慧管理平台
Dynatrace AI智慧維運與效能管理
DMP 數據治理平台
Rocket® Data Intelligence 數據血緣平台
Akamai API Security 安全平台
Servicenow ITSM一站式IT服務管理平台
TIBCO 智能化資料平台
RPA 機器人流程自動化
Automation Anywhere 業務流程自動化RPA平台
UiPath 機器人流程自動化平台
Woodpecker XVR 次世代資安可視性解決方案
資源中心
雲端與大數據服務
Vital NetZero 零碳雲
Vital CMP 驗證管理
Vital CRM 客戶關係管理
Vital BizForm 雲端智慧表單
Vital Knowledge 協同知識管理
Vital Finance 財務會計管理
Vital OD 雲端公文管理
Vital HCM 雲端人力資源管理
大數據分析解決方案
運帷服務
資訊系統維運與開發服務
QuEye CIA 軟體變更衝擊分析器
AI 解決方案
AI 解決方案介紹
AI 財務報表辨識系統
AI 智慧公文解決方案
AI 知識管理智能生成
政府共同供應契約
ESG解決方案
叡揚e論壇
叡揚e論壇
叡揚真心話
投資人關係
股東專區
重大訊息
主要股東
股東會
歷年股利
股利政策
法人說明會
聯繫窗口
公開資訊觀測站
公司治理
營運團隊
公司治理
董事會
功能性委員會
誠信經營
風險管理
智慧財產管理計畫
利害關係人與溝通
公司重要內規
ESG專區
財務資訊
每月營收資訊
財務報告
ESG專區
EN
中
簡
日
搜尋
徵才專區
Vital CRM 國際認證
GSS部落格
選單
首頁
分類
標籤
選擇分類
園丁來閒聊
工具平台
專案管理
資料庫
經驗分享
測試
設計
效能調校
程式語言
|_
.NET MVC
|_
.NET
|_
Java
|_
C#
|_
Python
|_
TypeScript
|_
VB.NET
園丁
資訊安全
開發工法
作業系統
前端
搜尋
訂閱文章
取消訂閱文章
設置
登入
帳號
密碼
記住我
登入
忘記帳號
重置密碼
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
6 分鐘閱讀時間
(1297 個字)
字體大小:
+
–
訂閱
取消訂閱
使用 OpenTracing - Jaeger
經驗分享
設計
程式語言
2019/01/23, 週三
4661 點擊
前言
隨著系統逾來逾大、逾複雜,為了維運方便,可能會將這些拆分成不同的 Service 。
但從使用者一個 Request 進來後,從前端、後端各 Service 再到 Database,如果有效能問題時,大家要如何查找問題呢? SQL Profiler, Fiddler, 寫 Log ? 或是使用一些工具來查看效能問題,例如
Dynatrace
?
現在大家有另外一個好選擇,就是使用
OpenTracing
, 在程式中加入一些 Tracing 的資料(使用 OpenTracing 訂的 api,再看您要使用那一個 Support
OpenTracing
的 Tracer 去註冊它。
到時候就可以透過時間軸的角度來看到底那裡有效能問題,那裡有錯誤。
以下筆者將使用
JAEGER
來 Demo。
Why OpenTracing?
因為
OpenTracing
提供一個與平台無關,與廠商無關的 API,所以開發人員只要使用標準的 API,可以很輕易地更換不同的 追踪系統 ,只要它們都有 Support
OpenTracing
API。
安裝
因為
JAEGER
是
Cloud Native Computing Foundation(CNCF)
,所以您可以透過 Docker 或是直接執行它的執行檔。
使用 DOCKER 執行 (MAC)
[code language="bash"]
docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 9411:9411 \
jaegertracing/all-in-one:1.8
[/code]
要停止,就在Command 視窗中下
[code language="bash"]
docker stop jaeger
[/code]
要再啟動,就在Command 視窗中下
[code language="bash"]
docker start jaeger
[/code]
直接執行 (WINDOWS)
將下載的 jaeger-1.8.0-windows-amd64.tar.gz 解壓縮到 jaeger-1.8.0-windows-amd64 目錄,然後在 Command 視窗中執行
[code language="bash"]
jaeger-all-in-one --collector.zipkin.http-port=9411
[/code]
然後開啟 Browser 輸入
http://localhost:16686
應該就可以看到 Jaeger UI ,如下,
註: 其他平台也可以直接這樣執行哦 :)
使用
.NET CORE (以 BFV4 為範例)
一開始加入 OpenTracing.Contrib.NetCore 及 Jaeger NuGet 套件,如下,
然後在 Startup.cs 中的 ConfigureServices 設定使用 OpenTracing ,如下,
[code language="csharp"]
//加入 OpenTracing
services.AddOpenTracing();
services.AddSingleton<ITracer>(serviceProvider =>
{
string serviceName = "亂馬客BOT";
var tracer = new Tracer.Builder(serviceName)
.WithSampler(new ConstSampler(true))
.Build();
//註冊 Jaeger tracer
GlobalTracer.Register(tracer);
return tracer;
});
[/code]
那要如何使用呢? 我們可以在 OnTurnAsync 時,從 GlobalTracer 取出 ITracer 來用。
請注意,這裡用的都是 OpenTracing 的 Interface ,所以將來如何要換別的 Tracer 就在 Startup.cs 中給別的 tracer 就可以了。
以下的 Code ,如果輸入 rainmaker 的話,就等個 10 秒再回,
如果輸入 rm 就會產生 Exception ,可以用 Tags.Error.Set(scope.Span, true) 來設定 error。
[code language="csharp"]
public class Bot : IBot
{
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
//從 GlobalTracer.Instance 取出 Tracer
var tracer = GlobalTracer.Instance;
using (IScope scope = tracer.BuildSpan($"OnTurnAsync:{ActivityTypes.Message}").StartActive(finishSpanOnDispose: true))
{
if (turnContext.Activity.Type == ActivityTypes.Message)
{
var userInput = turnContext.Activity.Text;
try
{
using (var scopeMessage = tracer.BuildSpan(ActivityTypes.Message).StartActive(finishSpanOnDispose: true))
{
ProcessUserInput(userInput);
await turnContext.SendActivityAsync($"You said '{turnContext.Activity.Text}'");
}
}
catch (Exception ex)
{
Tags.Error.Set(scope.Span, true);
tracer.ActiveSpan.Log(new Dictionary<string, object>
{
[LogFields.Event] = "error",
["value"] = userInput,
["error"] = ex.ToString()
});
}
}
}
}
private void ProcessUserInput(string userInput)
{
var tracer = GlobalTracer.Instance;
var eventName = "ProcessUserInput";
using (var scope = tracer.BuildSpan(eventName).StartActive(finishSpanOnDispose: true))
{
tracer.ActiveSpan.Log(new Dictionary<string, object>
{
[LogFields.Event] = eventName,
["value"] = userInput
});
if (userInput == "rainmaker") Thread.Sleep(10000);
if (userInput == "rm") throw new Exception("rm throw errrors!");
}
}
}
[/code]
這時我們開啟 Emulator 來測試,分別輸入 hello, rainmaker, rm ,如下,
執行過後,我們可以透過
Jaeger UI http://localhost:16686
,可以發現 Service 可以選到 亂馬客 BOT 了(在 Startup.cs 中設定的),
按下 Find Traces Button 後,可以發現我們寫入的 Trace 資料,
這時我們可以點進花費時間 10 秒的 Trace ,可以發現在 ProcessUserInput 這個 Span 花了 10 秒的時間,如下,
點進 Error 的內容,可以查到錯誤的相關資訊,如下,
.NET FRAMEWORK (以 BFV3 訂便當 BOT 為範例)
建置 .net framework 的 Jaeger Client請到
jaeger-client-csharp
下載,並使用 VS.NET 2017 (因為它是 .net standard 2.0 專案)開啟來建置,建置完成後,就會在 src\Jaeger\bin\Debug\netstandard2.0 目錄中產生 Jaeger Client 的 DLL。
專案中使用 (必需升到 .net 4.6.1 (含)以上版本)請先將專案升到 .net 4.6.1 (含)以上版本,並從 NuGet 套件中加入 OpenTracing, NETStandard.Library, Microsoft.Extensions.Logging.Abstractions(請跟 Jaeger Client 專案引用的版本相同,目前是 2.0.2),如下圖,
加入 Jaeger Client 專案 src\Jaeger\bin\Debug\netstandard2.0 目錄中的 Jaeger.dll。
專案中使用 OpenTracing在 Global.asax.cs 的 Application_Start 透過 Autofac 去設定使用的
[code language="csharp"]
protected void Application_Start()
{
// Update Coversation Container
Conversation.UpdateContainer(builder =>
{
// other ... BFv3 設定 Autofac ...
// using Opentracing
var tracer = new Tracer.Builder("亂馬客BOTBFv3")
.WithSampler(new ConstSampler(true))
.Build();
GlobalTracer.Register(tracer);
// using Opentracing
// other ... BFv3 設定 Autofac ...
});
GlobalConfiguration.Configure(WebApiConfig.Register);
}
[/code]
在 RootDialog 的 MessageReceivedAsync Method 中可以加入 Span ,如下,
[code language="csharp"]
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var message = await result;
var tracer = GlobalTracer.Instance;
using (var tscope = tracer.BuildSpan("RootDialog").StartActive(finishSpanOnDispose: true))
{
// bot 原本的 code ...
// Log 一些資訊
tracer.ActiveSpan.Log(new Dictionary<string, object>
{
[LogFields.Event] = "MessageReceivedAsync",
["actionValue"] = message.Value?.ToString(),
["messageText"] = message.Text
});
// bot 原本的 code ...
}
}
[/code]
其他 Method 使用上也是一樣,都是從 GlobalTracer.Instance 取出 tracer,如下,
[code language="csharp"]
public async static Task DoActionAsync(BotAction botAction, IDialogContext context)
{
var tracer = GlobalTracer.Instance;
var eventName = "DoActionAsync";
using (var childScope = tracer.BuildSpan(eventName).StartActive(finishSpanOnDispose: true))
{
// bot 原本的 code ...
// Log 一些資訊
tracer.ActiveSpan.Log(new Dictionary<string, object>
{
[LogFields.Event] = eventName,
["actionType"] = botAction.ActionType.ToString()
});
// bot 原本的 code ...
}
}
[/code]
在 Emulator 執行畫面為,
執行過後,我們可以透過
Jaeger UI http://localhost:16686
,可以發現 Service 可以選到 亂馬客 BOTBFv3 了(在 Application_Start 中設定的),
點進去可以發現各 Span 寫的 Log 及執行所花費的時間,如下,
結論
只要加入
OpenTracing
,再加入要使用的 Tracer Client 套件,就可以快速來記錄資訊,真的很簡單也很方便。當系統很多時,您就不需要苦苦地查找許多的 Log 檔。
參考資源
OpenTracing
JAEGER
opentracing-tutorial
jaeger-client-csharp/examples/(含.net core 和 .net framework)
OpenTracing C#
dotnet/standard
研究過程中,非常感謝同事 Marty 的討論與幫助。
你覺得這篇文章怎麽樣?
開心
(
0
)
喜愛
(
0
)
驚奇
(
0
)
悲傷
(
0
)
生氣
(
0
)
標籤:
.NET
APM
BFv3
BFv4
Distributed Tracing
Dynatrace
Jaeger
OpenTracing
使用 OpenTracing - Jaeger (AP整合)
[.NET] .NET Framework XSS 基本防護
相關文章
.Net Core偵測指定檔案或目錄變化時自動執行某些動作
經驗分享
[.Net Core] 使用 MailKit 發送郵件
經驗分享
[.Net Core] 服務存留期 (Service Lifetime)
程式語言
在.net上動態執行expression1微軟套件篇
程式語言
使用 OpenTracing - Jaeger (BFv3 使用 Fody)
.NET
使用 OpenTracing - Jaeger (BFv3 使用 Dynamic Proxy)
.NET