From d59c258e3994241ddeab3fde84265b103a7810d6 Mon Sep 17 00:00:00 2001 From: Yun-Ting Lin Date: Wed, 7 Jun 2023 16:54:44 -0700 Subject: [PATCH 01/17] initial --- .../Internal/OpenTelemetrySdkEventSource.cs | 15 +++++ .../Logs/ILogger/OpenTelemetryLogger.cs | 60 ++++++++++++------- .../AotCompatibilityTests.cs | 2 +- .../OtlpLogExporterTests.cs | 2 - 4 files changed, 53 insertions(+), 26 deletions(-) diff --git a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs index a13bc1adba0..c95395d58b5 100644 --- a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs +++ b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs @@ -158,6 +158,15 @@ public void LoggerProviderException(string methodName, Exception ex) } } + [NonEvent] + public void LoggerProcessStateSkipped() + { + if (this.IsEnabled(EventLevel.Warning, EventKeywords.All)) + { + this.LoggerProcessStateSkipped(typeof(TState).FullName!); + } + } + [Event(4, Message = "Unknown error in SpanProcessor event '{0}': '{1}'.", Level = EventLevel.Error)] public void SpanProcessorException(string evnt, string ex) { @@ -325,6 +334,12 @@ public void LoggerProviderException(string methodName, string ex) this.WriteEvent(50, methodName, ex); } + [Event(51, Message = "Skip processing log state of type '{0}'.", Level = EventLevel.Warning)] + public void LoggerProcessStateSkipped(string type) + { + this.WriteEvent(51, type); + } + #if DEBUG public class OpenTelemetryEventListener : EventListener { diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs index e814b16eeec..210d9c4f881 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs @@ -194,38 +194,52 @@ internal static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, iLoggerData.State = state; return null; } +#if NET5_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER + else if (RuntimeFeature.IsDynamicCodeSupported) + { + return ParseCustomState(logRecord, state); + } +#endif else { - try - { - PropertyDescriptorCollection itemProperties = TypeDescriptor.GetProperties(state); + OpenTelemetrySdkEventSource.Log.LoggerProcessStateSkipped(); + return Array.Empty>(); + } + } + + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026", Justification = "ParseCustomState will only be called when RuntimeFeature.IsDynamicCodeSupported is true.")] + private static IReadOnlyList> ParseCustomState( + LogRecord logRecord, + in TState state) + { + try + { + PropertyDescriptorCollection itemProperties = TypeDescriptor.GetProperties(state!); - var attributeStorage = logRecord.AttributeStorage ??= new List>(itemProperties.Count); + var attributeStorage = logRecord.AttributeStorage ??= new List>(itemProperties.Count); - foreach (PropertyDescriptor? itemProperty in itemProperties) + foreach (PropertyDescriptor? itemProperty in itemProperties) + { + if (itemProperty == null) { - if (itemProperty == null) - { - continue; - } - - object? value = itemProperty.GetValue(state); - if (value == null) - { - continue; - } - - attributeStorage.Add(new KeyValuePair(itemProperty.Name, value)); + continue; } - return attributeStorage; - } - catch (Exception parseException) - { - OpenTelemetrySdkEventSource.Log.LoggerParseStateException(parseException); + object? value = itemProperty.GetValue(state); + if (value == null) + { + continue; + } - return Array.Empty>(); + attributeStorage.Add(new KeyValuePair(itemProperty.Name, value)); } + + return attributeStorage; + } + catch (Exception parseException) + { + OpenTelemetrySdkEventSource.Log.LoggerParseStateException(parseException); + return Array.Empty>(); } } diff --git a/test/OpenTelemetry.AotCompatibility.Tests/AotCompatibilityTests.cs b/test/OpenTelemetry.AotCompatibility.Tests/AotCompatibilityTests.cs index 4db5b903352..57aece1c42a 100644 --- a/test/OpenTelemetry.AotCompatibility.Tests/AotCompatibilityTests.cs +++ b/test/OpenTelemetry.AotCompatibility.Tests/AotCompatibilityTests.cs @@ -85,7 +85,7 @@ public void EnsureAotCompatibility() Assert.True(process.ExitCode == 0, "Publishing the AotCompatibility app failed. See test output for more details."); var warnings = expectedOutput.ToString().Split('\n', '\r').Where(line => line.Contains("warning IL")); - Assert.Equal(40, warnings.Count()); + Assert.Equal(39, warnings.Count()); } } } diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs index 404b41e3533..b63f0a4f6a8 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs @@ -100,7 +100,6 @@ public void AddOtlpLogExporterParseStateValueCanBeTurnedOff(bool parseState) { Assert.Null(logRecord.State); Assert.NotNull(logRecord.Attributes); - Assert.Contains(logRecord.Attributes, kvp => kvp.Key == "propertyA" && (string)kvp.Value == "valueA"); } else { @@ -140,7 +139,6 @@ public void AddOtlpLogExporterParseStateValueCanBeTurnedOffHosting(bool parseSta { Assert.Null(logRecord.State); Assert.NotNull(logRecord.Attributes); - Assert.Contains(logRecord.Attributes, kvp => kvp.Key == "propertyA" && (string)kvp.Value == "valueA"); } else { From 3413cfbea2c81b8a83de02a9dcbadc30b239051f Mon Sep 17 00:00:00 2001 From: Yun-Ting Lin Date: Thu, 8 Jun 2023 14:18:26 -0700 Subject: [PATCH 02/17] parse for older .net targets --- src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs index 210d9c4f881..e95c9febed3 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs @@ -199,12 +199,17 @@ internal static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, { return ParseCustomState(logRecord, state); } -#endif else { OpenTelemetrySdkEventSource.Log.LoggerProcessStateSkipped(); return Array.Empty>(); } +#else + else + { + return ParseCustomState(logRecord, state); + } +#endif } [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026", Justification = "ParseCustomState will only be called when RuntimeFeature.IsDynamicCodeSupported is true.")] From 715ad28c99fc022db7eb2205b0bd8301147d7fc3 Mon Sep 17 00:00:00 2001 From: Yun-Ting Lin Date: Thu, 8 Jun 2023 14:21:48 -0700 Subject: [PATCH 03/17] update test --- .../OtlpLogExporterTests.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs index b63f0a4f6a8..83520c7d016 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs @@ -100,6 +100,9 @@ public void AddOtlpLogExporterParseStateValueCanBeTurnedOff(bool parseState) { Assert.Null(logRecord.State); Assert.NotNull(logRecord.Attributes); +#if !NET5_0_OR_GREATER || !NETSTANDARD2_1_OR_GREATER + Assert.Contains(logRecord.Attributes, kvp => kvp.Key == "propertyA" && (string)kvp.Value == "valueA"); +#endif } else { @@ -139,6 +142,9 @@ public void AddOtlpLogExporterParseStateValueCanBeTurnedOffHosting(bool parseSta { Assert.Null(logRecord.State); Assert.NotNull(logRecord.Attributes); +#if !NET5_0_OR_GREATER || !NETSTANDARD2_1_OR_GREATER + Assert.Contains(logRecord.Attributes, kvp => kvp.Key == "propertyA" && (string)kvp.Value == "valueA"); +#endif } else { From a74ed866a69f3f0881c9bc9cf6bef46bb0c58e10 Mon Sep 17 00:00:00 2001 From: Yun-Ting Lin Date: Thu, 15 Jun 2023 16:35:05 -0700 Subject: [PATCH 04/17] removed ParseState --- .../Logs/ILogger/OpenTelemetryLogger.cs | 47 ------------------- .../OtlpLogExporterTests.cs | 3 -- 2 files changed, 50 deletions(-) diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs index e95c9febed3..cb55b3c7330 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs @@ -194,58 +194,11 @@ internal static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, iLoggerData.State = state; return null; } -#if NET5_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER - else if (RuntimeFeature.IsDynamicCodeSupported) - { - return ParseCustomState(logRecord, state); - } else { OpenTelemetrySdkEventSource.Log.LoggerProcessStateSkipped(); return Array.Empty>(); } -#else - else - { - return ParseCustomState(logRecord, state); - } -#endif - } - - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026", Justification = "ParseCustomState will only be called when RuntimeFeature.IsDynamicCodeSupported is true.")] - private static IReadOnlyList> ParseCustomState( - LogRecord logRecord, - in TState state) - { - try - { - PropertyDescriptorCollection itemProperties = TypeDescriptor.GetProperties(state!); - - var attributeStorage = logRecord.AttributeStorage ??= new List>(itemProperties.Count); - - foreach (PropertyDescriptor? itemProperty in itemProperties) - { - if (itemProperty == null) - { - continue; - } - - object? value = itemProperty.GetValue(state); - if (value == null) - { - continue; - } - - attributeStorage.Add(new KeyValuePair(itemProperty.Name, value)); - } - - return attributeStorage; - } - catch (Exception parseException) - { - OpenTelemetrySdkEventSource.Log.LoggerParseStateException(parseException); - return Array.Empty>(); - } } private static bool TryGetOriginalFormatFromAttributes( diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs index 83520c7d016..704c44568fe 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs @@ -100,9 +100,6 @@ public void AddOtlpLogExporterParseStateValueCanBeTurnedOff(bool parseState) { Assert.Null(logRecord.State); Assert.NotNull(logRecord.Attributes); -#if !NET5_0_OR_GREATER || !NETSTANDARD2_1_OR_GREATER - Assert.Contains(logRecord.Attributes, kvp => kvp.Key == "propertyA" && (string)kvp.Value == "valueA"); -#endif } else { From af5df9fb39a33a2031fd678255890241c740f46f Mon Sep 17 00:00:00 2001 From: Yun-Ting Lin Date: Thu, 15 Jun 2023 16:55:25 -0700 Subject: [PATCH 05/17] removed LoggerParseStateException --- .../Internal/OpenTelemetrySdkEventSource.cs | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs index f2443d68ad5..01776b399d7 100644 --- a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs +++ b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs @@ -140,15 +140,6 @@ public void DroppedExportProcessorItems(string exportProcessorName, string expor } } - [NonEvent] - public void LoggerParseStateException(Exception exception) - { - if (this.IsEnabled(EventLevel.Warning, EventKeywords.All)) - { - this.LoggerParseStateException(typeof(TState).FullName!, exception.ToInvariantString()); - } - } - [NonEvent] public void LoggerProviderException(string methodName, Exception ex) { @@ -310,12 +301,6 @@ public void InvalidEnvironmentVariable(string key, string? value) this.WriteEvent(47, key, value); } - [Event(48, Message = "Exception thrown parsing log state of type '{0}'. Exception: '{1}'", Level = EventLevel.Warning)] - public void LoggerParseStateException(string type, string error) - { - this.WriteEvent(48, type, error); - } - [Event(49, Message = "LoggerProviderSdk event: '{0}'", Level = EventLevel.Verbose)] public void LoggerProviderSdkEvent(string message) { From 1e174734a440655833642f20571329f87c83b997 Mon Sep 17 00:00:00 2001 From: Yun-Ting Lin Date: Thu, 15 Jun 2023 17:16:49 -0700 Subject: [PATCH 06/17] nit --- src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs index 55c208ea52a..69ce780b492 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs @@ -16,7 +16,6 @@ #nullable enable -using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; From f018b04f120aefaae6cf6d6ec5001399fdec1301 Mon Sep 17 00:00:00 2001 From: Yun-Ting Lin Date: Thu, 15 Jun 2023 17:36:15 -0700 Subject: [PATCH 07/17] test --- .../OtlpLogExporterTests.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs index f9ffcd359bd..199c48a4d46 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs @@ -139,9 +139,6 @@ public void AddOtlpLogExporterParseStateValueCanBeTurnedOffHosting(bool parseSta { Assert.Null(logRecord.State); Assert.NotNull(logRecord.Attributes); -#if !NET5_0_OR_GREATER || !NETSTANDARD2_1_OR_GREATER - Assert.Contains(logRecord.Attributes, kvp => kvp.Key == "propertyA" && (string)kvp.Value == "valueA"); -#endif } else { From 4b19d17b64bc959a406f924e3426e0aae24e0ce8 Mon Sep 17 00:00:00 2001 From: Yun-Ting Lin Date: Thu, 15 Jun 2023 18:51:13 -0700 Subject: [PATCH 08/17] removed test --- .../OpenTelemetry.Tests/Logs/LogRecordTest.cs | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/test/OpenTelemetry.Tests/Logs/LogRecordTest.cs b/test/OpenTelemetry.Tests/Logs/LogRecordTest.cs index f9f6e6cb038..81aff45f4ac 100644 --- a/test/OpenTelemetry.Tests/Logs/LogRecordTest.cs +++ b/test/OpenTelemetry.Tests/Logs/LogRecordTest.cs @@ -804,37 +804,6 @@ public void ParseStateValuesUsingIEnumerableTest() Assert.Equal(new KeyValuePair("Key1", "Value1"), logRecord.StateValues[0]); } - [Fact] - public void ParseStateValuesUsingCustomTest() - { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.ParseStateValues = true); - var logger = loggerFactory.CreateLogger(); - - // Tests unknown state parse path. - - CustomState state = new CustomState - { - Property = "Value", - }; - - logger.Log( - LogLevel.Information, - 0, - state, - null, - (s, e) => "OpenTelemetry!"); - var logRecord = exportedItems[0]; - - Assert.Null(logRecord.State); - Assert.NotNull(logRecord.StateValues); - Assert.Equal(1, logRecord.StateValues.Count); - - KeyValuePair actualState = logRecord.StateValues[0]; - - Assert.Equal("Property", actualState.Key); - Assert.Equal("Value", actualState.Value); - } - [Fact] public void DisposingStateTest() { From aa0f4701660bc14e1ed544fede1caf98250d93c5 Mon Sep 17 00:00:00 2001 From: Yun-Ting Date: Fri, 16 Jun 2023 14:52:19 -0700 Subject: [PATCH 09/17] changelog --- src/OpenTelemetry/CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index bdb8aeb04a8..33781af2397 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -2,6 +2,14 @@ ## Unreleased +* Addressed TypeDescriptor.GetProperties warning by removing it. + ([#4560](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4560)) + **Side effect:** Skip processing log state if the state neither implements + IReadOnlyList nor IEnumberable. This is a breaking change that removed the + support introduced in PR4334 that used `TypeDescriptor.GetProperties()` to add + custom properties to the state. + ([#4334](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4334)) + * Add back support for Exemplars. See [exemplars](../../docs/metrics/customizing-the-sdk/README.md#exemplars) for instructions to enable exemplars. ([#4553](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4553)) From 7ff4a77fa4b0b075afa60f08e0fbfdd18eed2b65 Mon Sep 17 00:00:00 2001 From: Yun-Ting Date: Fri, 16 Jun 2023 15:55:07 -0700 Subject: [PATCH 10/17] comments --- src/OpenTelemetry/CHANGELOG.md | 12 ++++++------ .../Internal/OpenTelemetrySdkEventSource.cs | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index 33781af2397..f808a1b3f92 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -2,13 +2,13 @@ ## Unreleased -* Addressed TypeDescriptor.GetProperties warning by removing it. +* Removed support for ParseStateValues if the state neither implements + IReadOnlyList nor IEnumberable when `ParseStateValues` is true. ([#4560](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4560)) - **Side effect:** Skip processing log state if the state neither implements - IReadOnlyList nor IEnumberable. This is a breaking change that removed the - support introduced in PR4334 that used `TypeDescriptor.GetProperties()` to add - custom properties to the state. - ([#4334](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4334)) + > **Note** + This is a breaking change which removed support regarding the aforementioned + use case, which was first introduced in release + [1.5.0-rc.1](https://github.com/open-telemetry/opentelemetry-dotnet/releases/tag/core-1.5.0-rc.1). * Add back support for Exemplars. See [exemplars](../../docs/metrics/customizing-the-sdk/README.md#exemplars) for instructions to enable exemplars. diff --git a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs index 01776b399d7..b0682d84949 100644 --- a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs +++ b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs @@ -301,6 +301,12 @@ public void InvalidEnvironmentVariable(string key, string? value) this.WriteEvent(47, key, value); } + [Event(48, Message = "Skip processing log state of type '{0}'.", Level = EventLevel.Warning)] + public void LoggerProcessStateSkipped(string type) + { + this.WriteEvent(51, type); + } + [Event(49, Message = "LoggerProviderSdk event: '{0}'", Level = EventLevel.Verbose)] public void LoggerProviderSdkEvent(string message) { @@ -313,12 +319,6 @@ public void LoggerProviderException(string methodName, string ex) this.WriteEvent(50, methodName, ex); } - [Event(51, Message = "Skip processing log state of type '{0}'.", Level = EventLevel.Warning)] - public void LoggerProcessStateSkipped(string type) - { - this.WriteEvent(51, type); - } - #if DEBUG public class OpenTelemetryEventListener : EventListener { From 5050f6f15f13ec9133c10ab0700cdeac83f22635 Mon Sep 17 00:00:00 2001 From: Yun-Ting Date: Fri, 16 Jun 2023 16:07:49 -0700 Subject: [PATCH 11/17] test --- .../Internal/OpenTelemetrySdkEventSource.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs index b0682d84949..01776b399d7 100644 --- a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs +++ b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs @@ -301,12 +301,6 @@ public void InvalidEnvironmentVariable(string key, string? value) this.WriteEvent(47, key, value); } - [Event(48, Message = "Skip processing log state of type '{0}'.", Level = EventLevel.Warning)] - public void LoggerProcessStateSkipped(string type) - { - this.WriteEvent(51, type); - } - [Event(49, Message = "LoggerProviderSdk event: '{0}'", Level = EventLevel.Verbose)] public void LoggerProviderSdkEvent(string message) { @@ -319,6 +313,12 @@ public void LoggerProviderException(string methodName, string ex) this.WriteEvent(50, methodName, ex); } + [Event(51, Message = "Skip processing log state of type '{0}'.", Level = EventLevel.Warning)] + public void LoggerProcessStateSkipped(string type) + { + this.WriteEvent(51, type); + } + #if DEBUG public class OpenTelemetryEventListener : EventListener { From 136cec11e6a0c4cbaf99d07d0598edf369d721d7 Mon Sep 17 00:00:00 2001 From: Yun-Ting Lin Date: Wed, 21 Jun 2023 09:57:31 -0700 Subject: [PATCH 12/17] changelog --- src/OpenTelemetry/CHANGELOG.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index f808a1b3f92..21920f534ee 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -2,13 +2,10 @@ ## Unreleased -* Removed support for ParseStateValues if the state neither implements - IReadOnlyList nor IEnumberable when `ParseStateValues` is true. +* **Breaking Change** Removed support for ParseStateValues if the state neither + implements IReadOnlyList nor IEnumberable when `ParseStateValues` is true to + make `ProcessState`AOT compatible. ([#4560](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4560)) - > **Note** - This is a breaking change which removed support regarding the aforementioned - use case, which was first introduced in release - [1.5.0-rc.1](https://github.com/open-telemetry/opentelemetry-dotnet/releases/tag/core-1.5.0-rc.1). * Add back support for Exemplars. See [exemplars](../../docs/metrics/customizing-the-sdk/README.md#exemplars) for instructions to enable exemplars. From 7e60a6c547267a83dfa223e86e9dc004d3d5a392 Mon Sep 17 00:00:00 2001 From: Yun-Ting Lin Date: Wed, 21 Jun 2023 10:43:14 -0700 Subject: [PATCH 13/17] ci From c005f462f897927f7175d9049372c381334917e9 Mon Sep 17 00:00:00 2001 From: Yun-Ting Date: Wed, 21 Jun 2023 17:39:36 -0700 Subject: [PATCH 14/17] addressed comments --- src/OpenTelemetry/CHANGELOG.md | 7 ++++--- .../Internal/OpenTelemetrySdkEventSource.cs | 10 +++++----- src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index 21920f534ee..65c97fea432 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -2,9 +2,10 @@ ## Unreleased -* **Breaking Change** Removed support for ParseStateValues if the state neither - implements IReadOnlyList nor IEnumberable when `ParseStateValues` is true to - make `ProcessState`AOT compatible. +* **Breaking Change** Removed support for ParseStateValues if the state + implements neither IReadOnlyList nor IEnumberable when `ParseStateValues` is + true to make `ProcessState` AOT compatible. This feature was first introduced + in `1.5.0` stable release. ([#4560](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4560)) * Add back support for Exemplars. See [exemplars](../../docs/metrics/customizing-the-sdk/README.md#exemplars) diff --git a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs index 01776b399d7..1ebfc6b9b5d 100644 --- a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs +++ b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs @@ -150,11 +150,11 @@ public void LoggerProviderException(string methodName, Exception ex) } [NonEvent] - public void LoggerProcessStateSkipped() + public void LoggerProcessStateSkipped(string typeOfTState, string fix) { if (this.IsEnabled(EventLevel.Warning, EventKeywords.All)) { - this.LoggerProcessStateSkipped(typeof(TState).FullName!); + this.LoggerProcessStateSkipped(typeOfTState, fix); } } @@ -313,10 +313,10 @@ public void LoggerProviderException(string methodName, string ex) this.WriteEvent(50, methodName, ex); } - [Event(51, Message = "Skip processing log state of type '{0}'.", Level = EventLevel.Warning)] - public void LoggerProcessStateSkipped(string type) + [Event(51, Message = "Skip processing log state of type '{0}' because it does not implement either IReadOnlyList or IEnumerable. Fix: '{1}'.", Level = EventLevel.Warning)] + public void LoggerProcessStateSkipped(string type, string fix) { - this.WriteEvent(51, type); + this.WriteEvent(51, type, fix); } #if DEBUG diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs index 69ce780b492..40e309735bb 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs @@ -193,7 +193,7 @@ internal static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, } else { - OpenTelemetrySdkEventSource.Log.LoggerProcessStateSkipped(); + OpenTelemetrySdkEventSource.Log.LoggerProcessStateSkipped(typeof(TState).FullName!, "This can be fixed by updating the state to be a type that implements either IReadOnlyList or IEnumerable."); return Array.Empty>(); } } From 5daab0185ab01357d8fe13507b80783656dc7d75 Mon Sep 17 00:00:00 2001 From: Yun-Ting Date: Wed, 21 Jun 2023 18:30:05 -0700 Subject: [PATCH 15/17] addressed comments --- src/OpenTelemetry/CHANGELOG.md | 6 ++++-- src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs | 2 +- src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index 65c97fea432..e1375a1f23c 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -3,9 +3,11 @@ ## Unreleased * **Breaking Change** Removed support for ParseStateValues if the state - implements neither IReadOnlyList nor IEnumberable when `ParseStateValues` is + implements neither `IReadOnlyList>` nor + `IEnumerable>` when `ParseStateValues` is true to make `ProcessState` AOT compatible. This feature was first introduced - in `1.5.0` stable release. + in `1.5.0` stable release with + [#4334](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4334). ([#4560](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4560)) * Add back support for Exemplars. See [exemplars](../../docs/metrics/customizing-the-sdk/README.md#exemplars) diff --git a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs index 1ebfc6b9b5d..dc03d69c605 100644 --- a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs +++ b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs @@ -313,7 +313,7 @@ public void LoggerProviderException(string methodName, string ex) this.WriteEvent(50, methodName, ex); } - [Event(51, Message = "Skip processing log state of type '{0}' because it does not implement either IReadOnlyList or IEnumerable. Fix: '{1}'.", Level = EventLevel.Warning)] + [Event(51, Message = "Skip processing log state of type '{0}' because it does not implement either IReadOnlyList> or IEnumerable>. Suggested action: '{1}'.", Level = EventLevel.Warning)] public void LoggerProcessStateSkipped(string type, string fix) { this.WriteEvent(51, type, fix); diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs index 40e309735bb..5d6f9936371 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs @@ -193,7 +193,7 @@ internal static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, } else { - OpenTelemetrySdkEventSource.Log.LoggerProcessStateSkipped(typeof(TState).FullName!, "This can be fixed by updating the state to be a type that implements either IReadOnlyList or IEnumerable."); + OpenTelemetrySdkEventSource.Log.LoggerProcessStateSkipped(typeof(TState).FullName!, "This can be fixed by updating the state to be a type that implements either IReadOnlyList> or IEnumerable>."); return Array.Empty>(); } } From aff152f63efacb4745711585bee2cf631af68225 Mon Sep 17 00:00:00 2001 From: Yun-Ting Date: Thu, 22 Jun 2023 16:52:03 -0700 Subject: [PATCH 16/17] comments --- src/OpenTelemetry/CHANGELOG.md | 10 +++++----- .../Internal/OpenTelemetrySdkEventSource.cs | 4 ++-- src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index e1375a1f23c..f20beb26dba 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -2,11 +2,11 @@ ## Unreleased -* **Breaking Change** Removed support for ParseStateValues if the state - implements neither `IReadOnlyList>` nor - `IEnumerable>` when `ParseStateValues` is - true to make `ProcessState` AOT compatible. This feature was first introduced - in `1.5.0` stable release with +* **Breaking Change** Removed support for parsing `TState` types passed to the + `ILogger.Log` API when `ParseStateValues` is true and `TState` does + not implement either `IReadOnlyList>` or + `IEnumerable>`. This was done to make logging AOT + compatible. This feature was first introduced in `1.5.0` stable release with [#4334](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4334). ([#4560](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4560)) diff --git a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs index dc03d69c605..a9f5d4a38e2 100644 --- a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs +++ b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs @@ -150,11 +150,11 @@ public void LoggerProviderException(string methodName, Exception ex) } [NonEvent] - public void LoggerProcessStateSkipped(string typeOfTState, string fix) + public void LoggerProcessStateSkipped() { if (this.IsEnabled(EventLevel.Warning, EventKeywords.All)) { - this.LoggerProcessStateSkipped(typeOfTState, fix); + this.LoggerProcessStateSkipped(typeof(TState).FullName!, "This can be fixed by updating the state to be a type that implements either IReadOnlyList> or IEnumerable>."); } } diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs index 5d6f9936371..69ce780b492 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs @@ -193,7 +193,7 @@ internal static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, } else { - OpenTelemetrySdkEventSource.Log.LoggerProcessStateSkipped(typeof(TState).FullName!, "This can be fixed by updating the state to be a type that implements either IReadOnlyList> or IEnumerable>."); + OpenTelemetrySdkEventSource.Log.LoggerProcessStateSkipped(); return Array.Empty>(); } } From 90771fe04b253d0717142393a20da33af33fa058 Mon Sep 17 00:00:00 2001 From: Yun-Ting Date: Thu, 22 Jun 2023 17:47:37 -0700 Subject: [PATCH 17/17] ci