From 97091de5f383c96691e2f9f4778e201dda894309 Mon Sep 17 00:00:00 2001 From: Vishwesh Bankwar Date: Mon, 21 Aug 2023 10:53:56 -0700 Subject: [PATCH] [otlp] Remove ilogger and exception attributes (#4781) --- .../CHANGELOG.md | 5 ++ .../Implementation/LogRecordExtensions.cs | 7 +- .../OtlpLogExporterTests.cs | 69 ++++++++++--------- 3 files changed, 48 insertions(+), 33 deletions(-) diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md index fc9afc5e825..6c45771e0a0 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +* Excluded attributes corresponding to `LogRecord.EventId`, +`LogRecord.CategoryName` and `LogRecord.Exception` from the exported data. This +is done as the semantic conventions for these attributes are not yet stable. +([#4781](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4781)) + * Added extension method for configuring export processor options for otlp log exporter. ([#4733](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4733)) diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/LogRecordExtensions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/LogRecordExtensions.cs index 294ce6454f2..3fba6ff8cb8 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/LogRecordExtensions.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/LogRecordExtensions.cs @@ -16,9 +16,7 @@ using System.Runtime.CompilerServices; using Google.Protobuf; -using OpenTelemetry.Internal; using OpenTelemetry.Logs; -using OpenTelemetry.Trace; using OtlpCollector = OpenTelemetry.Proto.Collector.Logs.V1; using OtlpCommon = OpenTelemetry.Proto.Common.V1; using OtlpLogs = OpenTelemetry.Proto.Logs.V1; @@ -80,6 +78,10 @@ internal static OtlpLogs.LogRecord ToOtlpLog(this LogRecord logRecord, SdkLimitO var attributeValueLengthLimit = sdkLimitOptions.AttributeValueLengthLimit; var attributeCountLimit = sdkLimitOptions.AttributeCountLimit ?? int.MaxValue; + /* + // Removing this temporarily for stable release + // https://github.com/open-telemetry/opentelemetry-dotnet/issues/4776 + // https://github.com/open-telemetry/opentelemetry-dotnet/issues/3491 // First add the generic attributes like Category, EventId and Exception, // so they are less likely being dropped because of AttributeCountLimit. @@ -109,6 +111,7 @@ internal static OtlpLogs.LogRecord ToOtlpLog(this LogRecord logRecord, SdkLimitO otlpLogRecord.AddStringAttribute(SemanticConventions.AttributeExceptionMessage, logRecord.Exception.Message, attributeValueLengthLimit, attributeCountLimit); otlpLogRecord.AddStringAttribute(SemanticConventions.AttributeExceptionStacktrace, logRecord.Exception.ToInvariantString(), attributeValueLengthLimit, attributeCountLimit); } + */ bool bodyPopulatedFromFormattedMessage = false; if (logRecord.FormattedMessage != null) diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs index ed1aa8f5fc1..7a32a4a34eb 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs @@ -23,7 +23,6 @@ using Moq; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient; -using OpenTelemetry.Internal; using OpenTelemetry.Logs; using OpenTelemetry.Tests; using OpenTelemetry.Trace; @@ -184,25 +183,29 @@ public void OtlpLogRecordTestWhenStateValuesArePopulated() Assert.NotNull(otlpLogRecord); Assert.Equal("Hello from tomato 2.99.", otlpLogRecord.Body.StringValue); - Assert.Equal(4, otlpLogRecord.Attributes.Count); + Assert.Equal(3, otlpLogRecord.Attributes.Count); + var index = 0; + var attribute = otlpLogRecord.Attributes[index]; - var attribute = otlpLogRecord.Attributes[0]; + /* Assert.Equal("dotnet.ilogger.category", attribute.Key); Assert.Equal("OtlpLogExporterTests", attribute.Value.StringValue); + attribute = otlpLogRecord.Attributes[++index]; + */ - attribute = otlpLogRecord.Attributes[1]; Assert.Equal("name", attribute.Key); Assert.Equal("tomato", attribute.Value.StringValue); - attribute = otlpLogRecord.Attributes[2]; + attribute = otlpLogRecord.Attributes[++index]; Assert.Equal("price", attribute.Key); Assert.Equal(2.99, attribute.Value.DoubleValue); - attribute = otlpLogRecord.Attributes[3]; + attribute = otlpLogRecord.Attributes[++index]; Assert.Equal("{OriginalFormat}", attribute.Key); Assert.Equal("Hello from {name} {price}.", attribute.Value.StringValue); } + /* [Fact] public void CheckToOtlpLogRecordLoggerCategory() { @@ -287,6 +290,7 @@ public void CheckToOtlpLogRecordEventId() Assert.Contains("Name", otlpLogRecordAttributes); Assert.Contains("MyEvent10", otlpLogRecordAttributes); } + */ [Fact] public void CheckToOtlpLogRecordTimestamps() @@ -485,6 +489,7 @@ public void CheckToOtlpLogRecordBodyIsPopulated(bool includeFormattedMessage) Assert.Equal("state", otlpLogRecord.Body.StringValue); } + /* [Fact] public void CheckToOtlpLogRecordExceptionAttributes() { @@ -515,13 +520,14 @@ public void CheckToOtlpLogRecordExceptionAttributes() Assert.Contains(SemanticConventions.AttributeExceptionStacktrace, otlpLogRecordAttributes); Assert.Contains(logRecord.Exception.ToInvariantString(), otlpLogRecordAttributes); } + */ [Fact] public void CheckToOtlpLogRecordRespectsAttributeLimits() { var sdkLimitOptions = new SdkLimitOptions { - AttributeCountLimit = 3, // 3 => LogCategory, exception.type and exception.message + AttributeCountLimit = 2, AttributeValueLengthLimit = 8, }; @@ -530,12 +536,13 @@ public void CheckToOtlpLogRecordRespectsAttributeLimits() { builder.AddOpenTelemetry(options => { + options.ParseStateValues = true; options.AddInMemoryExporter(logRecords); }); }); - var logger = loggerFactory.CreateLogger("OtlpLogExporterTests"); - logger.LogInformation(new NotSupportedException("I'm the exception message."), "Exception Occurred"); + var logger = loggerFactory.CreateLogger(string.Empty); + logger.LogInformation("OpenTelemetry {AttributeOne} {AttributeTwo} {AttributeThree}!", "I'm an attribute", "I too am an attribute", "I get dropped :("); var logRecord = logRecords[0]; var otlpLogRecord = logRecord.ToOtlpLog(sdkLimitOptions); @@ -543,19 +550,19 @@ public void CheckToOtlpLogRecordRespectsAttributeLimits() Assert.NotNull(otlpLogRecord); Assert.Equal(1u, otlpLogRecord.DroppedAttributesCount); - var exceptionTypeAtt = TryGetAttribute(otlpLogRecord, SemanticConventions.AttributeExceptionType); - Assert.NotNull(exceptionTypeAtt); + var attribute = TryGetAttribute(otlpLogRecord, "AttributeOne"); + Assert.NotNull(attribute); - // "NotSuppo" == first 8 chars from the exception typename "NotSupportedException" - Assert.Equal("NotSuppo", exceptionTypeAtt.Value.StringValue); - var exceptionMessageAtt = TryGetAttribute(otlpLogRecord, SemanticConventions.AttributeExceptionMessage); - Assert.NotNull(exceptionMessageAtt); + // "I'm an a" == first 8 chars from the first attribute "I'm an attribute" + Assert.Equal("I'm an a", attribute.Value.StringValue); + attribute = TryGetAttribute(otlpLogRecord, "AttributeTwo"); + Assert.NotNull(attribute); - // "I'm the " == first 8 chars from the exception message - Assert.Equal("I'm the ", exceptionMessageAtt.Value.StringValue); + // "I too am" == first 8 chars from the second attribute "I too am an attribute" + Assert.Equal("I too am", attribute.Value.StringValue); - var exceptionStackTraceAtt = TryGetAttribute(otlpLogRecord, SemanticConventions.AttributeExceptionStacktrace); - Assert.Null(exceptionStackTraceAtt); + attribute = TryGetAttribute(otlpLogRecord, "AttributeThree"); + Assert.Null(attribute); } [Fact] @@ -686,7 +693,7 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_ContainsScopeAttributeStrin // Assert. var logRecord = logRecords.Single(); var otlpLogRecord = logRecord.ToOtlpLog(DefaultSdkLimitOptions); - Assert.Equal(2, otlpLogRecord.Attributes.Count); + Assert.Single(otlpLogRecord.Attributes); var actualScope = TryGetAttribute(otlpLogRecord, scopeKey); Assert.NotNull(actualScope); Assert.Equal(scopeKey, actualScope.Key); @@ -725,7 +732,7 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_ContainsScopeAttributeBoolV // Assert. var logRecord = logRecords.Single(); var otlpLogRecord = logRecord.ToOtlpLog(DefaultSdkLimitOptions); - Assert.Equal(2, otlpLogRecord.Attributes.Count); + Assert.Single(otlpLogRecord.Attributes); var actualScope = TryGetAttribute(otlpLogRecord, scopeKey); Assert.NotNull(actualScope); Assert.Equal(scopeKey, actualScope.Key); @@ -776,7 +783,7 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_ContainsScopeAttributeIntVa // Assert. var logRecord = logRecords.Single(); var otlpLogRecord = logRecord.ToOtlpLog(DefaultSdkLimitOptions); - Assert.Equal(2, otlpLogRecord.Attributes.Count); + Assert.Single(otlpLogRecord.Attributes); var actualScope = TryGetAttribute(otlpLogRecord, scopeKey); Assert.NotNull(actualScope); Assert.Equal(scopeKey, actualScope.Key); @@ -815,7 +822,7 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_ContainsScopeAttributeDoubl // Assert. var logRecord = logRecords.Single(); var otlpLogRecord = logRecord.ToOtlpLog(DefaultSdkLimitOptions); - Assert.Equal(2, otlpLogRecord.Attributes.Count); + Assert.Single(otlpLogRecord.Attributes); var actualScope = TryGetAttribute(otlpLogRecord, scopeKey); Assert.NotNull(actualScope); Assert.Equal(scopeKey, actualScope.Key); @@ -854,7 +861,7 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_ContainsScopeAttributeDoubl // Assert. var logRecord = logRecords.Single(); var otlpLogRecord = logRecord.ToOtlpLog(DefaultSdkLimitOptions); - Assert.Equal(2, otlpLogRecord.Attributes.Count); + Assert.Single(otlpLogRecord.Attributes); var actualScope = TryGetAttribute(otlpLogRecord, scopeKey); Assert.NotNull(actualScope); Assert.Equal(scopeKey, actualScope.Key); @@ -888,7 +895,7 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_AndScopeStateIsOfTypeString var logRecord = logRecords.Single(); var otlpLogRecord = logRecord.ToOtlpLog(DefaultSdkLimitOptions); Assert.NotNull(otlpLogRecord); - Assert.Single(otlpLogRecord.Attributes); + Assert.Empty(otlpLogRecord.Attributes); } [Theory] @@ -923,7 +930,7 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_AndScopeStateIsOfPrimitiveT var logRecord = logRecords.Single(); var otlpLogRecord = logRecord.ToOtlpLog(DefaultSdkLimitOptions); Assert.NotNull(otlpLogRecord); - Assert.Single(otlpLogRecord.Attributes); + Assert.Empty(otlpLogRecord.Attributes); } [Fact] @@ -954,7 +961,7 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_AndScopeStateIsOfDictionary // Assert. var logRecord = logRecords.Single(); var otlpLogRecord = logRecord.ToOtlpLog(DefaultSdkLimitOptions); - Assert.Equal(2, otlpLogRecord.Attributes.Count); + Assert.Single(otlpLogRecord.Attributes); var actualScope = TryGetAttribute(otlpLogRecord, scopeKey); Assert.NotNull(actualScope); Assert.Equal(scopeKey, actualScope.Key); @@ -993,7 +1000,7 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_AndScopeStateIsOfEnumerable // Assert. var logRecord = logRecords.Single(); var otlpLogRecord = logRecord.ToOtlpLog(DefaultSdkLimitOptions); - Assert.Equal(2, otlpLogRecord.Attributes.Count); + Assert.Single(otlpLogRecord.Attributes); var actualScope = TryGetAttribute(otlpLogRecord, scopeKey); Assert.NotNull(actualScope); Assert.Equal(scopeKey, actualScope.Key); @@ -1036,7 +1043,7 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_AndMultipleScopesAreAdded_C var allScopeValues = otlpLogRecord.Attributes .Where(_ => _.Key == scopeKey1 || _.Key == scopeKey2) .Select(_ => _.Value.StringValue); - Assert.Equal(3, otlpLogRecord.Attributes.Count); + Assert.Equal(2, otlpLogRecord.Attributes.Count); Assert.Equal(2, allScopeValues.Count()); Assert.Contains(scopeValue1, allScopeValues); Assert.Contains(scopeValue2, allScopeValues); @@ -1077,7 +1084,7 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_AndMultipleScopeLevelsAreAd var allScopeValues = otlpLogRecord.Attributes .Where(_ => _.Key == scopeKey1 || _.Key == scopeKey2) .Select(_ => _.Value.StringValue); - Assert.Equal(3, otlpLogRecord.Attributes.Count); + Assert.Equal(2, otlpLogRecord.Attributes.Count); Assert.Equal(2, allScopeValues.Count()); Assert.Contains(scopeValue1, allScopeValues); Assert.Contains(scopeValue2, allScopeValues); @@ -1123,7 +1130,7 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_AndScopeIsUsedInLogMethod_C var allScopeValues = otlpLogRecord.Attributes .Where(_ => _.Key == scopeKey1 || _.Key == scopeKey2) .Select(_ => _.Value.StringValue); - Assert.Equal(7, otlpLogRecord.Attributes.Count); + Assert.Equal(2, otlpLogRecord.Attributes.Count); Assert.Equal(2, allScopeValues.Count()); Assert.Contains(scopeValue1, allScopeValues); Assert.Contains(scopeValue2, allScopeValues);