1. 程式人生 > 程式設計 >.NET 6 中的 dotnet monitor詳細解析

.NET 6 中的 dotnet monitor詳細解析

目錄
  • 一.什麼是 dotnet monitor
  • 二.入門
    • .NET CLI 工具
    • 容器映象
  • 三.HTTP API
    • 四.觸發器
      • 五.反饋

        原文:Announcing dotnet monitor in .NET 6

        我們在 2020 年 6 月首次推出了dotnet monitor 作為實驗工具,並在去年(2020年)努力將其轉變為生產級工具。今天,我很高興地的宣佈 dotnet monitor 的第一個正式版將和 .NET 6 一起釋出,作為 .NET 6 的一部分。

        dotnet monitor 已經為 Azure App Service()提供 .NET 應用程式的診斷工具提供支援,我們希望它在更多環境中使用。

        一.什麼是 dotnet monitor

        在不同的環境中執行 .NET 應用程式可能會使收集診斷資訊(例如日誌、跟蹤、dump)變得困難。dotnet monitor 是一種工具,它提供了一種統一的方法來收集這些診斷資訊,而不管您是在桌面計算機(desktop machine 可理解為我們日常使用的電腦)還是在 kubernetes 叢集中執行。

        收集這些診斷資訊有兩種不同的機制:

        • 按需收集診斷資訊的 HTTP API。當您的應用程式遇到問題並且想收集更多資訊時,可以呼叫這些 HTTP API。
        • 基於規則配置的觸發器。您可以配置規則,以便在滿足所需條件時收集診斷資訊,例如在 CPU 持續一段時間保持較高的指標時收集程序轉儲(process dump)。

        二.入門

        dotnet monitor 可以通過兩種不同的分發機制獲得:

        • .NET CLI 工具
        • 通過 Microsoft Container Registry (MCR) 獲得的容器映象

        .NET CLI 工具

        dotnet monitor CLI 工具首先需要安裝 .NET 6 SDK,如果你沒有足夠新的 SDK,可以通過 .NET 下載獲取安裝包進行安裝。

        你可以使用一下命令獲取最新版的 dotnet monitor:

        dotnet tool install -g dotnet-monitor --version 6.0.0

        如果你已經安裝但是想更新到最新,可以執行以下命令:

        dotnet tool update -g dhttp://www.cppcns.comotnet-monitor --version 6.0.0

        容器映象

        dotnet monitor 容器映象在 MCR 上可用,你可以通過以下命令獲取最www.cppcns.com新的映象:

        pull mcr.microsoft.com/dotnet/monitor:6.0.0

        三.HTTP API

        dotnet monitor 公開了一個 HTTP API 來查詢可用程序、收集診斷資訊並檢查請求資訊的狀態。

        暴露了以下 HTTP API:

        • /processes- 獲取可被發現的程序的詳細資訊
        • /dump- 在不使用偵錯程式的情況下捕獲程序的 dump
        • /gcdump- 捕獲程序的 GC dump
        • /trace- 不使用 profiler 來追蹤程序
        • /metrics- 以 Prometheus exposition 格式捕獲預設程序的指標快照
        • /livemetrics- 捕獲程序的實時指標流
        • /logs- 捕獲程序的日誌
        • /info- 獲取有關 dotnet monitor 的資訊
        • /operations- 獲取操作狀態和取消操作

        下面的示例演示如何使用 dotnet monitor 從目標程序開始,在60秒的時間內從Microsoft.AspNetCore.Server.Kestrel.Connections 日誌級別為 Debug 的日誌流資料。

        PS> curl.exe -X POST "https://localhost:52323/logs?name=myWebApp&durationSeconds=60" `

        -H "Accept: application/x-ndon" `

        -H "Content-Type: application/json" `

        --negotiate -u $(whoami)`

        -d '{"filterSpecs": {"Microsoft.AspNetCore.Server.Kestrel.Connections": "Debug"}}'

        {"Timestamp":"2021-11-05 08:12:54Z","LogLevel":"Debug","EventId":39,"EventName":"ConnectionAccepted","Category":"Microsoft.AspNetCore.Server.Kestrel.Connections","Message":"Connection id u00220HMD06BUKL2CUu0022 accepted.","State":{"Message":"Connection id u00220HMD06BUKL2CUu0022 accepted.","ConnectionId":"0HMD06BUKL2CU","{OriginalFormat}":"Connection id u0022{ConnectionId}u0022 accepted."}}

        {"Timestamp":"2021-11-05 08:12:54Z","EventId":1,"EventName":"ConnectionStart","Message":"Connection id u00220HMD06BUKL2CUu0022 started.","State":{"Message":"Connection id u00220HMD06BUKL2CUu0022 started.","{OriginalFormat}":"Connection id u0022{ConnectionId}u0022 started."}}

        {"Timestamp":"2021-11-05 08:12:54Z","EventId":9,"EventName":"ConnectionKeepAlive","Message":"Connection id u00220HMD06BUKL2CUu0022 completed keep alive response.","State":{"Message":"Connection id u00220HMD06BUKL2CUu0022 completed keep alive response.","{OriginalFormat}":"Connection id u0022{ConnectionId}u0022 completed keep alive response."},"Scopes":[{"ConnectionId":"0HMD06BUKL2CU"},{"RequestId":"0HMD06BUKL2CU:00000002","RequestPath":"/"}]}

        如上面的示例所示,您可以使用 dotnet monitor 按需從目標程序中捕獲診斷資訊。除了日誌,您還可以從目標程序收集跟蹤、記憶體轉儲、GC轉儲和 metrics。

        .NET6中的dotnetmonitor詳細解析

        四.觸發器

        dotnet monitor 可以配置為根據發現的程序中的條件自動收集診斷資訊。 發現新程序時,如果該程序資料與規則匹配,則 dotnet monitor 將嘗試應用配置的規則。 應用的規則將開始監視觸發器描述的條件的過程。 如果滿足該條件,則假定尚未達到指定的限制來執行操作列表。

        .NET6中的dotnetmonitor詳細解析

        示例:如果 dotnet monitor 檢測到持續超過一分鐘的CPU使用率在80%以上,則它將收集進www.cppcns.com程 dump,限制每小時不超過1個。

        {
          "CollectionRules": {
            "HighCpuRule": {
              "Filters": [
                {
                  "Key": "ProcessName","Value": "MyApp","MatchType": "Exact"
                }
              ],"Trigger": {
                "Type": "EventCounter","Settings": {
                  "ProviderName": "System.Runtime","CounterName": "cpu-usage","GreaterThan": 80,"SlidingWindowDuration": "00:01:00"
                }
              },"Limits": {
                "ActionCount": 1,"ActionCountSlidingWindowDuration": "1:00:00"
              },"Actions": [
                {
                  "Type": "CollectDump","Settings": {
                    "Type": "Triage","Egress": "myBlobStorageAccount"
                  }
                }
              ]
            }
          }
        }

        規則文件:https://.com/dotnet/dotnet-monitor/blob/main/documentation/collectKuCpDshVaionrules.md

        五.反饋

        github issue: https://github.com/dotnet/dotnet-monitor/issues/new/choose

        到此這篇關於.NET 6 中的 dotnet monitor的文章就介紹到這了,更多相關.NET6 dotnet monitor內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!