Skywalking APM監控系列(一丶.NET5.0+接入Skywalking監聽)

前言

新項目採用的abp vnext的微服務模塊化架構,所以把應用的服務拆成了很多獨立模塊

在初期,我們通過日誌還能跟蹤到問題,

後期服務越來越多(大約擴充到了十幾個),隨着調用鏈路越來越深

,問題也越來越難排查了.

往往入口報錯之後,要跟好幾個服務的日誌 才能找到最終節點.

所以考慮引入Skywalking鏈路跟蹤服務,來監聽整個應用

 

 

什麼是Skywalking

以下內容爲照葫蘆畫瓢,覺得寫的不錯,所以就CV了~

Skywalking是一款分佈式鏈路追蹤組件

那麼什麼是鏈路追蹤?

隨着微服務架構的流行,服務按照不同的維度進行拆分,一次請求往往需要涉及到多個服務。互聯網應用構建在不同的軟件模塊集上,這些軟件模塊,有可能是由不同的團隊開發、可能使用不同的編程語言來實現、有可能布在了幾千臺服務器,橫跨多個不同的數據中心。

所以微服務面臨了這些問題:

     某個核心服務掛了,導致大量報錯,如何快速確定哪裏出了問題?

     用戶請求響應延遲高,怎麼確定是哪些服務導致的?

     應用程序有性能瓶頸,怎樣確定瓶頸在哪裏?

     如何準實時的瞭解應用部署環境(CPU、內存、進程、線程、網絡、帶寬)情況,以便快速擴容/縮容、流量控制、業務遷移

     如何統計各個調用的性能指標,比如:吞吐量(TPS)、響應時間及錯誤記錄等

分佈式鏈路跟蹤系統就是爲了解決這些問題應運而生。

 

Skywalking有哪些功能?

  1. 多種監控手段。可以通過語言探針和 service mesh 獲得監控數據。

  2.多個語言自動探針。包括 Java,.NET Core 和 Node.JS。

  3.輕量高效。無需大數據平臺,和大量的服務器資源。

  4.模塊化。UI、存儲、集羣管理都有多種機制可選。

  5.支持告警。

  6.優秀的可視化解決方案。

Skywalking的整體架構圖

 

 

部署搭建Skywalking

Skywalking是支持容器化部署的,所以這裏我們只講如何通過Docker進行部署

1.部署ES數據庫

這裏說明一下.Skywalking容器裏本身是自帶H2數據庫的並支持持久化的,如果想簡化部署,可以直接使用

這裏ES推薦使用7.10版本,因爲7.11以上的版本 授權協議變更了 可能有法律風險

docker run -d -p 9200:9200 -p 9300:9300 --name es -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx256m" -v /home/elasticsearch/data:/usr/share/elasticsearch/data elasticsearch:7.10.1

上面的命令是運行一個基礎的ES數據庫,並將數據持久化到宿主機 /home/elasticsearch/data,各位可以根據自己情況 自行更改

3.部署skywalking-oap服務

docker run --name skywalking-oap 
--restart always 
-p 11800:11800 
-p 12800:12800 
-d -e TZ=Asia/Shanghai 
-e SW_ES_USER=
-e SW_ES_PASSWORD= 
-e SW_STORAGE=elasticsearch 
-e SW_STORAGE_ES_CLUSTER_NODES=ES數據庫地址:9200 
-v /etc/localtime:/etc/localtime:ro  
apache/skywalking-oap-server:9.6.0

 

3.部署skywalking-ui服務

docker run -d 
--name skywalking-ui 
--restart always 
-p 8080:8080 
-e TZ=Asia/Shanghai 
-e SW_OAP_ADDRESS=http://這裏填寫skywalking-oap的地址:12800 
-v /etc/localtime:/etc/localtime:ro 
apache/skywalking-ui:9.6.0

 

這樣,我們就完成了基本的skywalking服務的搭建

 

ASP.NET Core如何集成Skywalking

在.NET中接入Skywalking,主要使用  SkyAPM.Agent.AspNetCore  這個開源代理

SkyAPM.Agent.AspNetCore採用了IHostingStartup接口通過探針的形式進行接入

所以對應用的入侵性很小,幾乎爲0.所以接入數據很簡單

我們只需要三步即可

1.給服務的宿主層添加引用:

SkyAPM.Agent.AspNetCore

2.然後添加環境變量:

ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=SkyAPM.Agent.AspNetCore (PS:如果有其他的攔截,這裏的環境變量可以配置多個,通過逗號分隔)

3.添加Skywalking配置項,創建skyapm.json文件:

(PS:這裏不一定要創建skyapm.json文件,也可以把配置寫在appsettings.json裏,研究過代理工具的源碼,他也讀取了appsettings的配置)

類似如下:

{
  "SkyWalking": {
    "ServiceName": "asp-net-core-backend", //服務名
    "Namespace": "",
    "HeaderVersions": [
      "sw8"
    ],
    "Sampling": {
      "SamplePer3Secs": -1,
      "Percentage": -1.0,
      "LogSqlParameterValue": false  
    },
    "Logging": {
      "Level": "Information",
      "FilePath": "logs/skyapm-{Date}.log"
    },
    "Transport": {
      "Interval": 3000,
      "ProtocolVersion": "v8",
      "QueueSize": 30000,
      "BatchSize": 3000,
      "gRPC": {
        "Servers": "localhost:11800", //指向SkywalkingOAP的地址
        "Timeout": 100000,
        "ConnectTimeout": 100000,
        "ReportTimeout": 600000
      }
    }
  }
}

 

由於可能線上的數據量很大,所以除了代理類自行監聽的日誌以外

我們還可以通過代碼自行添加Tag和Log,方便跟蹤查詢

可以通過依賴注入的形式,拿到IEntrySegmentContextAccessor對象,進行標記和日誌記錄

代碼如下:

private readonly IEntrySegmentContextAccessor _segContext; 
public Test(IEntrySegmentContextAccessor segContext = null)
 {
     _segContext = segContext;
 }

public void Doing()
 {
    _segContext.Context.Span.AddLog(LogEvent.Message(""));//記錄日誌
    _segContext.Context.Span.AddTag("lowsql", "lowsql");//記錄標籤
 }

可以在此基礎上自行擴展,比如加到ActionFilterAttribute攔截裏面進行跟蹤攔截

 

 

 

最後

最後,我們來看看效果:

鏈路情況:

 

 

 

這樣,我們就能很方便的知道哪個服務調用了哪些服務,執行了哪些SQL操作了..

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章