參考:https://zhuanlan.zhihu.com/p/114178089
組件的git地址:https://github.com/SkyAPM/SkyAPM-dotnet
1、nuget先安裝一下
SkyAPM.Agent.AspNetCore
2、配置一下環境變量
ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=SkyAPM.Agent.AspNetCore
SKYWALKING__SERVICENAME=sample_app
比如在launchSettings.json里添加代碼,或者是通過界面配置,在調試處添加2個環境變量。
SKYWALKING__SERVICENAME可以根據項目的名稱來定義,比如我們可以定義 sysinfo_api。

3、安裝CLI(SkyAPM.DotNet.CLI)
dotnet tool install -g SkyAPM.DotNet.CLI
4、自動生成skyapm.json文件
cmd命令,cd到站點的web目錄下,執行如下命令:
dotnet skyapm config [service name] [server]:11800
server name指的就是您剛才配置的SKYWALKING__SERVICENAME,server指的是您Skywalking的ip地址。
執行命令后,會自動生成一個skywalking.json 。
5、配置完成,F5運行項目,多點擊幾下,就會在skywalking的trace里看到信息。

5、獲取tracId的方法:
應用:
using SkyApm.Tracing;
構造函數依賴注入:
private readonly IEntrySegmentContextAccessor _segContext; public HealthController(ILogger<HealthController> logger, IEntrySegmentContextAccessor segContext) { _logger = logger; _segContext = segContext; }
方法里獲取:
[HttpGet] public async Task<IActionResult> SkywalkingTest() { var TraceId = _segContext.Context.TraceId; return Ok($"Ok,SkywalkingTest-TraceId={TraceId}"); }
6、在代碼里寫鏈路信息記錄:(一般不用)
構造函數依賴注入:
private readonly ILogger _logger; readonly IConfiguration _conf; private readonly ITracingContext _tracingContext; private readonly IEntrySegmentContextAccessor _segContext; public HealthController(ILogger<HealthController> logger, IConfiguration conf,ITracingContext tracingContext, IEntrySegmentContextAccessor segContext) { _logger = logger; _conf = conf; _tracingContext = tracingContext; _segContext = segContext; }
方法:
[HttpGet] public async Task<IActionResult> SkywalkingTest() { //獲取全局的skywalking的TracId var TraceId = _segContext.Context.TraceId; Console.WriteLine($"TraceId={TraceId}"); //手寫記錄鏈路信息 var context = _tracingContext.CreateEntrySegmentContext(nameof(SkywalkingTest), new TextCarrierHeaderCollection(new Dictionary<string, string>())); context.Span.AddLog(LogEvent.Message($"SkywalkingTest---Worker running at: {DateTime.Now}")); var TracId2 = context.TraceId; _tracingContext.Release(context); return Ok($"Ok,SkywalkingTest-TraceId={TraceId},TracId2={TracId2}"); }
7、鏈路信息追加日志:
[HttpGet] public async Task<IActionResult> SkywalkingTest() { //獲取全局的skywalking的TracId var TraceId = _segContext.Context.TraceId; Console.WriteLine($"TraceId={TraceId}"); _segContext.Context.Span.AddLog(LogEvent.Message($"SkywalkingTest---Worker running at: {DateTime.Now}")); System.Threading.Thread.Sleep(1000); _segContext.Context.Span.AddLog(LogEvent.Message($"SkywalkingTest---Worker running at--end: {DateTime.Now}")); return Ok($"Ok,SkywalkingTest-TraceId={TraceId} "); }

8、Skywalking鏈路的思路 :主要是基於DiagnosticSource機制來實現對特定組件的觀測。
以對httpclient的診斷流程示例,大概其畫了個草圖:

補充:
dockerfile的寫法。
設置環境變量。
ENV ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=SkyAPM.Agent.AspNetCore
ENV SKYWALKING__SERVICENAME=sysinfo_api
補充2:
開發過程中,有一個項目,完全按照上面的操作,但是死活無法將數據寫入到skywalking。原因是 沒有將skywalking的包加載到項目里。但是為找到上面情況所致。
最后只能手動添加代碼解決。
在StartUp的ConfigureServices里添加一句代碼:
//加skywalking監控鏈路 services.AddSkyAPM(ext => ext.AddAspNetCoreHosting());
參考:
https://www.jianshu.com/p/ae634ffb21ff
https://www.cnblogs.com/vickey-wu/p/11079813.html
若時使用windows環境安裝skywalking,
(1)則ui的訪問的端口是8080
http://127.0.0.1:8080/trace
(2)項目代碼里配置地址:
"Servers": "127.0.0.1:11800"
