記一次.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天時間,環境變數害死人