From 3a46aeb05936225682a01522d70dc02f364e5142 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Mon, 26 Jun 2023 09:52:58 -0700 Subject: [PATCH] Perf tweaks. --- src/OpenTelemetry/CHANGELOG.md | 4 ---- .../Logs/ILogger/OpenTelemetryLogger.cs | 21 +++++++++++++++---- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index 2bdaea0338a..5eee0c5b453 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -2,10 +2,6 @@ ## Unreleased -## 1.5.1 - -Released 2023-Jun-23 - * Fixed a breaking change causing `LogRecord.State` to be `null` where it was previously set to a valid value when `OpenTelemetryLoggerOptions.ParseStateValues` is `false` and states implement diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs index 2b5f9c0274e..e66c548d2bc 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs @@ -162,10 +162,6 @@ internal static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, return null; } - // Note: This is to preserve legacy behavior where State is - // exposed if we didn't parse state. - iLoggerData.State = !parseStateValues ? state : null; - /* TODO: Enable this if/when LogRecordAttributeList becomes public. if (typeof(TState) == typeof(LogRecordAttributeList)) { @@ -181,10 +177,20 @@ internal static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, else */ if (state is IReadOnlyList> stateList) { + // Note: This is to preserve legacy behavior where State is exposed + // if we didn't parse state. We use stateList here to prevent a + // second boxing of struct TStates. + iLoggerData.State = !parseStateValues ? stateList : null; + return stateList; } else if (state is IEnumerable> stateValues) { + // Note: This is to preserve legacy behavior where State is exposed + // if we didn't parse state. We use stateValues here to prevent a + // second boxing of struct TStates. + iLoggerData.State = !parseStateValues ? stateValues : null; + var attributeStorage = logRecord.AttributeStorage; if (attributeStorage == null) { @@ -198,10 +204,17 @@ internal static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, } else if (!parseStateValues) { + // Note: This is to preserve legacy behavior where State is + // exposed if we didn't parse state. + iLoggerData.State = state; return null; } else { + // Note: We clear State because the LogRecord we are processing may + // have come from the pool and may have State from a prior log. + iLoggerData.State = null; + try { PropertyDescriptorCollection itemProperties = TypeDescriptor.GetProperties(state!);