asp.net core5 使用Skywalking APM


參考: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"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM