.NET?6中的dotnet?monitor講解
一.什么是 dotnet monitor
在不同的環(huán)境中運(yùn)行 .NET 應(yīng)用程序可能會(huì)使收集診斷信息(例如日志、跟蹤、dump)變得困難。dotnet monitor 是一種工具,它提供了一種統(tǒng)一的方法來(lái)收集這些診斷信息,而不管您是在桌面計(jì)算機(jī)(desktop machine 可理解為我們?nèi)粘J褂玫碾娔X)還是在 kubernetes 集群中運(yùn)行。
收集這些診斷信息有兩種不同的機(jī)制:
- 按需收集診斷信息的
HTTP API。當(dāng)您的應(yīng)用程序遇到問(wèn)題并且想收集更多信息時(shí),可以調(diào)用這些 HTTP API。 - 基于規(guī)則配置的
觸發(fā)器。您可以配置規(guī)則,以便在滿(mǎn)足所需條件時(shí)收集診斷信息,例如在 CPU 持續(xù)一段時(shí)間保持較高的指標(biāo)時(shí)收集進(jìn)程轉(zhuǎn)儲(chǔ)(process dump)。
二.入門(mén)
dotnet monitor 可以通過(guò)兩種不同的分發(fā)機(jī)制獲得:
- .NET CLI 工具
- 通過(guò) Microsoft Container Registry (MCR) 獲得的容器鏡像
.NET CLI 工具
dotnet monitor CLI 工具首先需要安裝 .NET 6 SDK,如果你沒(méi)有足夠新的 SDK,可以通過(guò) .NET 下載網(wǎng)頁(yè)獲取安裝包進(jìn)行安裝。
你可以使用一下命令獲取最新版的 dotnet monitor:
dotnet tool install -g dotnet-monitor --version 6.0.0
如果你已經(jīng)安裝但是想更新到最新,可以運(yùn)行以下命令:
dotnet tool update -g dotnet-monitor --version 6.0.0
容器鏡像
dotnet monitor 容器鏡像在 MCR 上可用,你可以通過(guò)以下命令獲取最新的鏡像:
docker pull mcr.microsoft.com/dotnet/monitor:6.0.0
三.HTTP API
dotnet monitor 公開(kāi)了一個(gè) HTTP API 來(lái)查詢(xún)可用進(jìn)程、收集診斷信息并檢查請(qǐng)求信息的狀態(tài)。
暴露了以下 HTTP API:
/processes- 獲取可被發(fā)現(xiàn)的進(jìn)程的詳細(xì)信息/dump- 在不使用調(diào)試器的情況下捕獲進(jìn)程的 dump/gcdump- 捕獲進(jìn)程的 GC dump/trace- 不使用 profiler 來(lái)追蹤進(jìn)程/metrics- 以 Prometheus exposition 格式捕獲默認(rèn)進(jìn)程的指標(biāo)快照/livemetrics- 捕獲進(jìn)程的實(shí)時(shí)指標(biāo)流/logs- 捕獲進(jìn)程的日志/info- 獲取有關(guān) dotnet monitor 的信息/operations- 獲取操作狀態(tài)和取消操作
下面的示例演示如何使用 dotnet monitor 從目標(biāo)進(jìn)程開(kāi)始,在60秒的時(shí)間內(nèi)從Microsoft.AspNetCore.Server.Kestrel.Connections 日志級(jí)別為 Debug 的日志流數(shù)據(jù)。
PS> curl.exe -X POST "https://localhost:52323/logs?name=myWebApp&durationSeconds=60" `
-H "Accept: application/x-ndjson" `
-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","LogLevel":"Debug","EventId":1,"EventName":"ConnectionStart","Category":"Microsoft.AspNetCore.Server.Kestrel.Connections","Message":"Connection id u00220HMD06BUKL2CUu0022 started.","State":{"Message":"Connection id u00220HMD06BUKL2CUu0022 started.","ConnectionId":"0HMD06BUKL2CU","{OriginalFormat}":"Connection id u0022{ConnectionId}u0022 started."}}
{"Timestamp":"2021-11-05 08:12:54Z","LogLevel":"Debug","EventId":9,"EventName":"ConnectionKeepAlive","Category":"Microsoft.AspNetCore.Server.Kestrel.Connections","Message":"Connection id u00220HMD06BUKL2CUu0022 completed keep alive response.","State":{"Message":"Connection id u00220HMD06BUKL2CUu0022 completed keep alive response.","ConnectionId":"0HMD06BUKL2CU","{OriginalFormat}":"Connection id u0022{ConnectionId}u0022 completed keep alive response."},"Scopes":[{"ConnectionId":"0HMD06BUKL2CU"},{"RequestId":"0HMD06BUKL2CU:00000002","RequestPath":"/"}]}
如上面的示例所示,您可以使用 dotnet monitor 按需從目標(biāo)進(jìn)程中捕獲診斷信息。除了日志,您還可以從目標(biāo)進(jìn)程收集跟蹤、內(nèi)存轉(zhuǎn)儲(chǔ)、GC轉(zhuǎn)儲(chǔ)和 metrics。

四.觸發(fā)器
dotnet monitor 可以配置為根據(jù)發(fā)現(xiàn)的進(jìn)程中的條件自動(dòng)收集診斷信息。 發(fā)現(xiàn)新進(jìn)程時(shí),如果該進(jìn)程數(shù)據(jù)與規(guī)則匹配,則 dotnet monitor 將嘗試應(yīng)用配置的規(guī)則。 應(yīng)用的規(guī)則將開(kāi)始監(jiān)視觸發(fā)器描述的條件的過(guò)程。 如果滿(mǎn)足該條件,則假定尚未達(dá)到指定的限制來(lái)執(zhí)行操作列表。

示例:如果 dotnet monitor 檢測(cè)到持續(xù)超過(guò)一分鐘的CPU使用率在80%以上,則它將收集進(jìn)程 dump,限制每小時(shí)不超過(guò)1個(gè)。
{
"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"
}
}
]
}
}
}
規(guī)則文檔:https://github.com/dotnet/dotnet-monitor/blob/main/documentation/collectionrules.md
五.反饋
github issue: https://github.com/dotnet/dotnet-monitor/issues/new/choose
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net 簡(jiǎn)易生成注冊(cè)碼(數(shù)字+大小寫(xiě)字母)
注釋寫(xiě)的很詳細(xì),不做過(guò)多的描述了,希望能給初學(xué)者帶來(lái)一些幫助,同時(shí)也是自己知識(shí)的一個(gè)積累過(guò)程。2008-11-11
解決iis7.5服務(wù)器上.net 獲取不到https頁(yè)面的信息
讓我糾結(jié)了一天多的問(wèn)題,給大家看下,有相同情況的可以不用浪費(fèi)時(shí)間了,本人當(dāng)時(shí)找了好半天都沒(méi)找到什么有用的信息,項(xiàng)目在本地沒(méi)有問(wèn)題,但部署在服務(wù)器后,獲取不到https頁(yè)面的信息,加入下面的代碼就可以了,因?yàn)閕is7.5的安全協(xié)議比較高的原因。2014-06-06
Asp.net中通過(guò)Button打開(kāi)另一個(gè)的frm
本文通過(guò)實(shí)例代碼給大家介紹了asp.net中通過(guò)button打開(kāi)另一個(gè)frm的方法,非常不錯(cuò),需要的朋友參考下吧2016-12-12
asp.net使用Repeater控件中的全選進(jìn)行批量操作實(shí)例
這篇文章主要介紹了asp.net使用Repeater控件中的全選進(jìn)行批量操作方法,實(shí)例分析了Repeater控件的使用技巧,需要的朋友可以參考下2015-01-01
c#將Excel數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了c#將Excel數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2013-12-12
ASP.NET實(shí)現(xiàn)從服務(wù)器下載文件問(wèn)題處理
本文主要介紹了ASP.NET實(shí)現(xiàn)從服務(wù)器下載文件問(wèn)題處理,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
asp.net中調(diào)用存儲(chǔ)過(guò)程的方法
這篇文章主要介紹了asp.net中調(diào)用存儲(chǔ)過(guò)程的方法,結(jié)合實(shí)例形式分析了存儲(chǔ)過(guò)程的建立與asp.net調(diào)用存儲(chǔ)過(guò)程的相關(guān)技巧,需要的朋友可以參考下2016-05-05

