记一次.net core3.1 接入 Skywalking的踩坑过程

前言

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天时间,环境变量害死人

上一篇:Windows搭建SkyWalking8.3环境进行JAVA应用性能监控及入门示例(使用Mysql持久化)


下一篇:skywalking安装