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"
作者:沐雪
文章均系作者原创或翻译,如有错误不妥之处,欢迎各位批评指正。本文版权归作者和博客园共有,如需转载恳请注明。
如果您觉得阅读这篇博客让你有所收获,请点击右下方【推荐】
为之网-热爱软件编程 http://www.weizhi.cc/