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"
原文地址:https://www.cnblogs.com/puzi0315/p/15597975.html