1. 程式人生 > 實用技巧 >記一次.net core3.1 接入 Skywalking的踩坑過程

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