From 935f50587583fefd2962a81bcab24073ba6a1690 Mon Sep 17 00:00:00 2001 From: Pent Ploompuu Date: Fri, 19 Sep 2025 15:20:14 +0300 Subject: [PATCH] Fix KeyNotFoundException in HttpRequestLatencyListener.OnEventWritten --- .../Latency/Internal/HttpRequestLatencyListener.cs | 2 +- .../Latency/Internal/HttpMockProvider.cs | 2 +- .../Latency/Internal/HttpRequestLatencyListenerTest.cs | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Latency/Internal/HttpRequestLatencyListener.cs b/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Latency/Internal/HttpRequestLatencyListener.cs index 5d7238ed8a3..158121a4dff 100644 --- a/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Latency/Internal/HttpRequestLatencyListener.cs +++ b/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Latency/Internal/HttpRequestLatencyListener.cs @@ -49,7 +49,7 @@ public void Enable() internal void OnEventWritten(string eventSourceName, string? eventName) { // If event of interest, add a checkpoint for it. - if (eventName != null && _eventToTokenMap[eventSourceName].TryGetValue(eventName, out var token)) + if (eventName != null && _eventToTokenMap.TryGetValue(eventSourceName, out var map) && map.TryGetValue(eventName, out var token)) { LatencyContext.Get()?.AddCheckpoint(token); } diff --git a/test/Libraries/Microsoft.Extensions.Http.Diagnostics.Tests/Latency/Internal/HttpMockProvider.cs b/test/Libraries/Microsoft.Extensions.Http.Diagnostics.Tests/Latency/Internal/HttpMockProvider.cs index a9150df371b..68d758df26b 100644 --- a/test/Libraries/Microsoft.Extensions.Http.Diagnostics.Tests/Latency/Internal/HttpMockProvider.cs +++ b/test/Libraries/Microsoft.Extensions.Http.Diagnostics.Tests/Latency/Internal/HttpMockProvider.cs @@ -40,7 +40,7 @@ public static Mock GetLatencyContext() return lc; } - public class MockEventSource : EventSource + public class MockEventSource() : EventSource(throwOnEventWriteErrors: true) { public int OnEventInvoked; diff --git a/test/Libraries/Microsoft.Extensions.Http.Diagnostics.Tests/Latency/Internal/HttpRequestLatencyListenerTest.cs b/test/Libraries/Microsoft.Extensions.Http.Diagnostics.Tests/Latency/Internal/HttpRequestLatencyListenerTest.cs index fa91daa1c3e..1a37efc9e56 100644 --- a/test/Libraries/Microsoft.Extensions.Http.Diagnostics.Tests/Latency/Internal/HttpRequestLatencyListenerTest.cs +++ b/test/Libraries/Microsoft.Extensions.Http.Diagnostics.Tests/Latency/Internal/HttpRequestLatencyListenerTest.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.Tracing; using System.Linq; using Microsoft.Extensions.Diagnostics.Latency; using Microsoft.Extensions.Http.Latency.Internal; @@ -84,8 +85,16 @@ public void HttpRequestLatencyListener_OnEventSourceCreated_NonHttpSources() listener.OnEventSourceCreated("test", es); Assert.Equal(0, es.OnEventInvoked); Assert.False(es.IsEnabled()); + + using var dummyListener = new DummyListener(); + dummyListener.EnableEvents(es, EventLevel.LogAlways); + + // EventSource seems to send the event to all listeners, even those that didn't enable the EventSource at all! + es.Write("Dummy"); } + private sealed class DummyListener : EventListener; + [Fact] public void HttpRequestLatencyListener_OnEventSourceCreated_HttpSources() {