日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

「译」 .NET 5 新增的Http, Sockets, DNS 和 TLS 遥测

發(fā)布時(shí)間:2023/12/4 asp.net 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 「译」 .NET 5 新增的Http, Sockets, DNS 和 TLS 遥测 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

.NET 一直在穩(wěn)定的增加和改善對應(yīng)用程序進(jìn)行跨平臺(tái)的診斷分析,在.NET Core 3.0, 我們看到了?EventCounters[1]?的介紹,用于觀察和分析指標(biāo)測量。

我最近在幾個(gè) .NET Core 的應(yīng)用程序中使用 counters,來跟蹤服務(wù)一段時(shí)間內(nèi) http 的請求數(shù)量。

.NET 5 一直在進(jìn)步,我一直在關(guān)注?runtime repository?[2]?的動(dòng)態(tài)和工作,在 http 發(fā)生外部調(diào)用時(shí),添加了新的遙測計(jì)數(shù)器和一些核心組件的事件,包括 HttpClient, Sockets, DNS 和 Security。

在這篇文章中,我將展示如何在 runtime(運(yùn)行時(shí))消費(fèi)這些信息,需要注意的是,本文的代碼僅僅是簡單的實(shí)現(xiàn),如果在生產(chǎn)中使用話,你還需要考慮到性能開銷或者其他。

定義 EventListener

.NET 中已經(jīng)有了 EventListener 抽象類,我們可以在代碼中繼承這個(gè)類,來自定義一個(gè) listener

internal sealed class TelemetryListener : EventListener {... }

接下來,我們重寫?OnEventSourceCreated?方法,來處理下邊的幾種特定事件的消息

protected override void OnEventSourceCreated(EventSource eventSource) {if (eventSource.Name.Equals("System.Net.Sockets") || eventSource.Name.Equals("System.Net.Http")|| eventSource.Name.Equals("System.Net.NameResolution")|| eventSource.Name.Equals("System.Net.Security")){EnableEvents(eventSource, EventLevel.Verbose, EventKeywords.All, new Dictionary<string, string>{{"EventCounterIntervalSec", "2"}});} }

在上面的代碼中,我們獲取到 eventSource.Name, 然后過濾我們感興趣的類型的消息,例如,?HttpTelemetry?類定義了 EventSource(事件源)的名字叫 System.Net.Http。

[EventSource(Name = "System.Net.Http")] internal sealed class HttpTelemetry : EventSource {... }

在這個(gè)例子中,我們感興趣的 event (事件) 和 counters (計(jì)數(shù)器)來自四個(gè) event sources (事件源)

?NameResolution Telemetry – DNS lookups?Sockets Telemetry – Underlying network connections to a server?Security Telemetry – Establish TLS?Http Telemetry – HttpClient

當(dāng) EventSource 匹配一個(gè)我們想要監(jiān)聽的名字時(shí),我們調(diào)用?EnableEvents?方法,在這個(gè)代碼示例中,我們接收所有等級的 event(事件)和關(guān)鍵字,我們可以定義一個(gè)字典,可能會(huì)有其他額外的參數(shù),當(dāng) EventCounters 開始消費(fèi)時(shí),我們可以設(shè)置頻率來更新計(jì)數(shù)器,上面的代碼表示我們希望計(jì)數(shù)器每兩秒發(fā)送信息。

下邊的代碼我們重寫?OnEventWritten?方法

protected override void OnEventWritten(EventWrittenEventArgs eventData) {... }

在這種方法中,我們將添加一些代碼,來監(jiān)聽事件計(jì)數(shù)器,然后更新當(dāng)前值,并且輸出到控制臺(tái)。

if (eventData.EventName == "EventCounters") {if (eventData.Payload?.Count <= 0|| eventData.Payload?[0] is not IDictionary<string, object> data|| !data.TryGetValue("CounterType", out var ct)|| !data.TryGetValue("Name", out var n)|| ct is not string counterType|| n is not string name) return;var metricValue = metricType switch{"Sum" when data.TryGetValue("Increment", out var increment) => Convert.ToInt64(increment),"Mean" when data.TryGetValue("Mean", out var mean) => Convert.ToInt64(mean),_ => 0};switch (name){case "dns-lookups-duration":Console.WriteLine($"Event Counter = Avg Duration of Lookup: {metricValue}ms");Console.WriteLine();break;case "dns-lookups-requested":Console.WriteLine($"Event Counter = Name Resolution Lookups: {metricValue}");Console.WriteLine();break;case "total-tls-handshakes":Console.WriteLine($"Event Counter = Total TLS Handshakes: {metricValue}");Console.WriteLine();break;case "requests-started":Console.WriteLine($"Event Counter = HTTP Requests Started: {metricValue}");Console.WriteLine();break;case "requests-failed":Console.WriteLine($"Event Counter = HTTP Requests Failed: {metricValue}");Console.WriteLine();break;case "outgoing-connections-established":Console.WriteLine($"Event Counter = Outgoing Connections Established: {metricValue}");Console.WriteLine();break;case "http11-connections-current-total":Console.WriteLine($"Event Counter = HTTP1.1 Connections Established: {metricValue}");Console.WriteLine();break;case "http20-connections-current-total":Console.WriteLine($"Event Counter = HTTP2.0 Connections Established: {metricValue}");Console.WriteLine();break;case "bytes-sent":Console.WriteLine($"Event Counter = Bytes Sent: {metricValue}");Console.WriteLine();break;case "bytes-received":Console.WriteLine($"Event Counter = Bytes Received: {metricValue}");Console.WriteLine();break;} }

上面的代碼,我通過 eventData 的屬性過濾了我感興趣的日志,你可以注意到,上面我用了一些 C# 9.0 的語法 not 在判斷條件中。

if (eventData.Payload?.Count <= 0|| eventData.Payload?[0] is not IDictionary<string, object> data|| !data.TryGetValue("CounterType", out var ct)|| !data.TryGetValue("Name", out var n)|| ct is not string counterType|| n is not string name) return;

下邊的代碼,我用了 C# 8.0的 switch 表達(dá)式來定義指標(biāo)值,根據(jù)指標(biāo)的類型,EventCounters 主體包含一個(gè)自增值或者平均值。

var metricValue = counterType switch{"Sum" when data.TryGetValue("Increment", out var increment) => Convert.ToInt64(increment),"Mean" when data.TryGetValue("Mean", out var mean) => Convert.ToInt64(mean),_ => 0};

下邊的例子中,我使用 switch 指定了我們感興趣的事件來源的名稱,然后記錄到控制臺(tái)

switch (name) {case "dns-lookups-duration":Console.WriteLine($"Event Counter = Avg Duration of Lookup: {metricValue}ms");Console.WriteLine();break;case ... }

我們需要每過2s把但當(dāng)前事件計(jì)數(shù)器的值輸出到控制臺(tái),你可以選擇把這些指標(biāo)數(shù)據(jù)放到其他的指標(biāo)服務(wù),在過去,我把一些事件計(jì)數(shù)器的值發(fā)送到了 Datadog。

下邊的這一塊代碼,我判斷了 EventName, 如果不是 EventCounters,為了演示,我把這些信息都輸出到了控制臺(tái)

if (eventData.EventName != "EventCounters") {Console.WriteLine($"Event = {eventData.EventSource.Name} - {eventData.EventId}:{eventData.EventName}");for (var i = 0; i < eventData.PayloadNames?.Count; i++){Console.WriteLine($" - {eventData.PayloadNames[i]}: {eventData.Payload?[i]?.ToString() ?? string.Empty}");} }

使用 EventListener

我們在一個(gè)簡單的控制臺(tái)應(yīng)用程序使用 TelemetryListener

internal class Program {private static async Task Main(){using var listener = new TelemetryListener();var client = new HttpClient();try{await client.GetAsync("https://www.stevejgordon.co.uk");}catch{// ignore}await Task.Delay(2000);} }

在這個(gè) main 方法中,我創(chuàng)建了一個(gè) TelemetryListener 實(shí)例,開始監(jiān)聽事件信息,我使用了 HttpClient 調(diào)用了我的博客主頁,然后程序等待2s,這樣我們的 listener 有足夠的時(shí)間觸發(fā)事件和接受消息。

運(yùn)行程序后,我們可以在控制臺(tái)看到這些信息

Event = System.Net.Http - 1:RequestStart- scheme: https- host: www.stevejgordon.co.uk- port: 443- pathAndQuery: /- versionMajor: 1- versionMinor: 1- versionPolicy: 0 Event = System.Net.NameResolution - 1:ResolutionStart- hostNameOrAddress: Event = System.Net.NameResolution - 2:ResolutionStop Event = System.Net.NameResolution - 1:ResolutionStart- hostNameOrAddress: www.stevejgordon.co.uk Event = System.Net.NameResolution - 2:ResolutionStop Event = System.Net.Sockets - 1:ConnectStart- address: InterNetworkV6:28:{1,187,0,0,0,0,32,1,8,216,16,15,240,0,0,0,0,0,0,0,2,127,0,0,0,0} Event = System.Net.Sockets - 2:ConnectStop Event = System.Net.Security - 1:HandshakeStart- isServer: False- targetHost: www.stevejgordon.co.uk Event = System.Net.Security - 2:HandshakeStop- protocol: 3072 Event = System.Net.Http - 4:ConnectionEstablished- versionMajor: 1- versionMinor: 1 Event = System.Net.Http - 7:RequestHeadersStart Event = System.Net.Http - 8:RequestHeadersStop Event = System.Net.Http - 11:ResponseHeadersStart Event = System.Net.Http - 12:ResponseHeadersStop Event = System.Net.Http - 13:ResponseContentStart Event = System.Net.Http - 14:ResponseContentStop Event = System.Net.Http - 2:RequestStopEvent Counter = HTTP Requests Started: 1 Event Counter = HTTP Requests Failed: 0 Event Counter = HTTP1.1 Connections Established: 1 Event Counter = HTTP2.0 Connections Established: 0 Event Counter = Name Resolution Lookups: 2 Event Counter = Avg Duration of Lookup: 36ms Event Counter = Outgoing Connections Established: 1 Event Counter = Bytes Received: 68222 Event Counter = Bytes Sent: 354 Event Counter = Total TLS Handshakes: 1

剛開始,我們看到的事件信息來自與我們訂閱的4個(gè)來源,HttpClient 開始請求我的博客主頁,這需要DNS來解析服務(wù)器的IP地址,Socket 連接創(chuàng)建,然后TLS握手開始,然后我有了一個(gè)TLS 連接,Http 請求發(fā)出信息并且接收到了響應(yīng),我們可以在控制臺(tái)看到這些輸出信息。

總結(jié)

這篇文章特別強(qiáng)調(diào)了.NET 的團(tuán)隊(duì)正在積極的添加新的遙測事件和事件計(jì)數(shù)器時(shí), 這些診斷工具對于我們分析應(yīng)用程序起到很關(guān)鍵的作用,這些事件和計(jì)數(shù)器可以在運(yùn)行時(shí)進(jìn)程內(nèi)收集, 然后把這些信息發(fā)送到外部的指標(biāo)服務(wù),他們也支持跨平臺(tái)進(jìn)程跟蹤和監(jiān)視的應(yīng)用程序行為,在未來的文章中,我希望將深入研究跟蹤、可觀測性,然后使用這些數(shù)據(jù)。

原文鏈接:https://www.stevejgordon.co.uk/additional-http-sockets-dns-and-tls-telemetry-in-dotnet-5

References

[1]?EventCounters:?https://devblogs.microsoft.com/dotnet/introducing-diagnostics-improvements-in-net-core-3-0/
[2]?runtime :?https://github.com/dotnet/runtime/

總結(jié)

以上是生活随笔為你收集整理的「译」 .NET 5 新增的Http, Sockets, DNS 和 TLS 遥测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。