前言
Skywalking是一款APM(Application Performance Management)的工具
.net core 使用 SkyAPM.Agent.AspNetCore 接入Skywalking,Agent(探针)使用SkyAPM.DotNet.CLI
开发环境:win10+vs2019+.net core3.1+(MVC项目+WebApi项目)
测试环境:Centos+.net core3.1
正文
第一版
1、先安装SkyAPM探针,dotnet tool install -g SkyAPM.DotNet.CLI
2、配置环境变量,在项目中的launchSettings.json的environmentVariables节点下面添加如下
"ASPNETCORE_ENVIRONMENT": "SkyAPM.Agent.AspNetCore", "SKYWALKING__SERVICENAME": "Your Service Name"
3、根据Skywalking的版本添加SkyAPM.Agent.AspNetCore对应版本的包
4、生成配置文件,dotnet skyapm config sample_app 192.168.0.1:11800,sample_app替换为你的项目名称,192.168.0.1:11800替换为你的skywalking地址
注意:生成的配置文件应该在解决方案目录下,应该将只移动到对应的项目目录下,并设置其属性为 内容
5、启动项目,查看skywalking ui,是否接收到,很遗憾我这边很顺利的接收到了
6、发布项目到测试环境,启动成功,但是skyapm并没有生效,因为没有生成对应的日志
到此第一版最终倒在了测试环境的怀里
-------------------------------------分割线----------------------------------------
问题:开发环境能正常运行,测试环境不能正常运行
分析:①可能是Agent不兼容linux
②可能是发布导致的问题
③可能是环境变量的问题
④可能是Skywalking的版本和SkyAPM.Agent.AspNetCore的版本不匹配
验证:①看了一下github项目简介,这个问题未能确定
②由于发布是通过svn+jinkens来实现的,所以直接上传发布的文件夹,然而还是不行,所以暂时排除该可能
③百度之后,发现环境变量的问题很大,因为launchSettings.json配置的环境变量ASPNETCORE_ENVIRONMENT的值为Development,只能开发环境生效,所以我通过两种 方案来进行验证,一是发布一个windows环境的,直接发布后再启动,发现也没有生成skyapm文件,说明环境变量可能有问题;二是给linux环境添加环境变量,经过一系列 尝试后,发现添加环境变量后,竟然能行了,到此就实锤了,是环境变量的问题,为了再次验证,又在发布的windows版本中添加环境变量,也能行,真实锤了
④把SkyAPM.Agent.AspNetCore所有的包都一个一个试了一遍,然并卵,都不行
-------------------------------------分割线----------------------------------------
第二版
确定为环境变量的问题了,现在是解决问题的时候了
尝试百度给项目设置环境变量,https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/environments?view=aspnetcore-5.0,感觉继续往这方面研究可能会有结果
本来测试环境可以直接使用export设置环境变量,简单粗暴,但是由于本项目是前后端分离的,有多个项目需要设置SKYWALKING__SERVICENAME,所以这个方案暂时搁置
但是,后来无意间发现可以不用设置SKYWALKING__SERVICENAME环境变量,skywalking上收到的服务名称是根据skyapm.json中的配置来的
哈哈,那问题基本就解决了,直接给环境变量配置 export ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=SkyAPM.Agent.AspNetCore就行了
你以为这就完了?然而踩坑并没有结束
在linux上直接通过dotnet命令执行是可以的,但是通过svn+jenkins的发布就不行,这是什么情况?
遇到linux环境的问题,所以就只能去找运维谈谈心
配置各个账户的环境变量,再各种尝试
最终在我们的长时间尝试下,发现是sudo命令的问题,因为jenkins触发的脚步用了sudo,为什么sudo会导致这个问题
结果一系列百度,发现sudo会默认重置安全的环境变量,那么就 Defaults !env_reset,配置为不重置,虽然这样可能会有安全隐患
到此sudo+dotnet命令能成功了
我们再次测试发现,直接使用sh中的命令能行,但是svn+jenkins仍然不行,what?
这次只能交给运维了,jenkins我不懂啊
测试几次后,发现了问题,jenkins是通过远程命令执行的,远程命令那里还有一套环境变量,和root还不一样,再给远程命令那边设置环境变量,到此svn+jenkins成功
总共花了3天时间,环境变量害死人