前言
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天時間,環境變量害死人