Skip to content

Commit

Permalink
[sdk.logs] Fix the version reported by LogRecord.Logger when using IL…
Browse files Browse the repository at this point in the history
…ogger integration (#4635)
  • Loading branch information
CodeBlanch authored Jul 10, 2023
1 parent ad08228 commit 66a6062
Show file tree
Hide file tree
Showing 8 changed files with 93 additions and 37 deletions.
1 change: 1 addition & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
<PackageVersion Include="Microsoft.AspNetCore.Http.Features" Version="[2.1.1,6.0)" />
<PackageVersion Include="Microsoft.CodeAnalysis.PublicApiAnalyzers" Version="[3.3.3]" />
<PackageVersion Include="Microsoft.CodeCoverage" Version="[17.4.1]" />
<PackageVersion Include="Microsoft.CSharp" Version="[4.7.0]" />
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="[3.1.0,)" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.0,)" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="[3.1.0,)" />
Expand Down
2 changes: 1 addition & 1 deletion src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ private LoggerInstrumentationScope(string name, string version)
}

public static LoggerInstrumentationScope Instance { get; }
= new("OpenTelemetry", typeof(OpenTelemetryLogger).Assembly.GetName().Version?.ToString() ?? "1.0.0");
= new("OpenTelemetry", Sdk.InformationalVersion);

public override void EmitLog(in LogRecordData data, in LogRecordAttributeList attributes)
=> throw new NotSupportedException();
Expand Down
1 change: 1 addition & 0 deletions src/OpenTelemetry/Logs/LogRecord.cs
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,7 @@ internal LogRecord Copy()
Data = this.Data,
ILoggerData = this.ILoggerData.Copy(),
Attributes = this.Attributes == null ? null : new List<KeyValuePair<string, object?>>(this.Attributes),
Logger = this.Logger,
};
}

Expand Down
28 changes: 1 addition & 27 deletions src/OpenTelemetry/Resources/ResourceBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

#nullable enable

using System.Reflection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Internal;
Expand All @@ -32,7 +31,7 @@ public static class ResourceBuilderExtensions
{
[ResourceSemanticConventions.AttributeTelemetrySdkName] = "opentelemetry",
[ResourceSemanticConventions.AttributeTelemetrySdkLanguage] = "dotnet",
[ResourceSemanticConventions.AttributeTelemetrySdkVersion] = GetAssemblyInformationalVersion(),
[ResourceSemanticConventions.AttributeTelemetrySdkVersion] = Sdk.InformationalVersion,
});

/// <summary>
Expand Down Expand Up @@ -125,30 +124,5 @@ public static ResourceBuilder AddEnvironmentVariableDetector(this ResourceBuilde
.AddDetectorInternal(sp => new OtelEnvResourceDetector(sp?.GetService<IConfiguration>() ?? configuration.Value))
.AddDetectorInternal(sp => new OtelServiceNameEnvVarDetector(sp?.GetService<IConfiguration>() ?? configuration.Value));
}

private static string GetAssemblyInformationalVersion()
{
try
{
var informationalVersion = typeof(Resource).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;

if (informationalVersion == null)
{
return string.Empty;
}

// informationalVersion could be in the following format:
// {majorVersion}.{minorVersion}.{patchVersion}.{pre-release label}.{pre-release version}.{gitHeight}.{Git SHA of current commit}
// The following parts are optional: pre-release label, pre-release version, git height, Git SHA of current commit
// for example: 1.5.0-alpha.1.40+807f703e1b4d9874a92bd86d9f2d4ebe5b5d52e4

var indexOfPlusSign = informationalVersion.IndexOf('+');
return indexOfPlusSign > 0 ? informationalVersion.Substring(0, indexOfPlusSign) : informationalVersion;
}
catch (Exception)
{
return string.Empty;
}
}
}
}
26 changes: 26 additions & 0 deletions src/OpenTelemetry/Sdk.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#nullable enable

using System.Diagnostics;
using System.Reflection;
using OpenTelemetry.Context.Propagation;
using OpenTelemetry.Internal;
using OpenTelemetry.Logs;
Expand All @@ -41,13 +42,18 @@ static Sdk()
Activity.DefaultIdFormat = ActivityIdFormat.W3C;
Activity.ForceDefaultIdFormat = true;
SelfDiagnostics.EnsureInitialized();

var assemblyInformationalVersion = typeof(Sdk).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;
InformationalVersion = ParseAssemblyInformationalVersion(assemblyInformationalVersion);
}

/// <summary>
/// Gets a value indicating whether instrumentation is suppressed (disabled).
/// </summary>
public static bool SuppressInstrumentation => SuppressInstrumentationScope.IsSuppressed;

internal static string InformationalVersion { get; }

/// <summary>
/// Sets the Default TextMapPropagator.
/// </summary>
Expand Down Expand Up @@ -98,5 +104,25 @@ public static TracerProviderBuilder CreateTracerProviderBuilder()
{
return new TracerProviderBuilderBase();
}

internal static string ParseAssemblyInformationalVersion(string? informationalVersion)
{
if (string.IsNullOrWhiteSpace(informationalVersion))
{
informationalVersion = "1.0.0";
}

/*
* InformationalVersion will be in the following format:
* {majorVersion}.{minorVersion}.{patchVersion}.{pre-release label}.{pre-release version}.{gitHeight}+{Git SHA of current commit}
* Ex: 1.5.0-alpha.1.40+807f703e1b4d9874a92bd86d9f2d4ebe5b5d52e4
* The following parts are optional: pre-release label, pre-release version, git height, Git SHA of current commit
*/

var indexOfPlusSign = informationalVersion!.IndexOf('+');
return indexOfPlusSign > 0
? informationalVersion.Substring(0, indexOfPlusSign)
: informationalVersion;
}
}
}
28 changes: 20 additions & 8 deletions test/OpenTelemetry.Tests/Logs/LogRecordTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,9 @@
// limitations under the License.
// </copyright>

#if !NETFRAMEWORK
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using Microsoft.Extensions.Logging;
using OpenTelemetry.Exporter;
using OpenTelemetry.Logs;
Expand Down Expand Up @@ -104,14 +99,15 @@ public void CheckStateForUnstructuredLog(bool includeFormattedMessage)
[Theory]
[InlineData(true)]
[InlineData(false)]
[SuppressMessage("CA2254", "CA2254", Justification = "While you shouldn't use interpolation in a log message, this test verifies things work with it anyway.")]
public void CheckStateForUnstructuredLogWithStringInterpolation(bool includeFormattedMessage)
{
using var loggerFactory = InitializeLoggerFactory(out List<LogRecord> exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage);
var logger = loggerFactory.CreateLogger<LogRecordTest>();

#pragma warning disable CA2254 // Template should be a static expression
var message = $"Hello from potato {0.99}.";
logger.LogInformation(message);
#pragma warning restore CA2254 // Template should be a static expression

Assert.NotNull(exportedItems[0].State);

Expand Down Expand Up @@ -983,6 +979,23 @@ public void SeverityLogLevelTest(int logSeverity, LogLevel logLevel, int? transf
}
}

[Fact]
public void LogRecordInstrumentationScopeTest()
{
using var loggerFactory = InitializeLoggerFactory(out List<LogRecord> exportedItems);

var logger = loggerFactory.CreateLogger<LogRecordTest>();

logger.LogInformation("Hello world!");

var logRecord = exportedItems.FirstOrDefault();

Assert.NotNull(logRecord);
Assert.NotNull(logRecord.Logger);
Assert.Equal("OpenTelemetry", logRecord.Logger.Name);
Assert.Equal(Sdk.InformationalVersion, logRecord.Logger.Version);
}

private static ILoggerFactory InitializeLoggerFactory(out List<LogRecord> exportedItems, Action<OpenTelemetryLoggerOptions> configure = null)
{
var items = exportedItems = new List<LogRecord>();
Expand All @@ -1005,7 +1018,7 @@ internal struct Food
public double Price { get; set; }
}

private struct StructState : IReadOnlyList<KeyValuePair<string, object>>
private readonly struct StructState : IReadOnlyList<KeyValuePair<string, object>>
{
private readonly List<KeyValuePair<string, object>> list;

Expand Down Expand Up @@ -1161,4 +1174,3 @@ public override void OnEnd(LogRecord data)
}
}
}
#endif
3 changes: 2 additions & 1 deletion test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" />
<PackageReference Include="Microsoft.Extensions.Logging" />
<PackageReference Include="Microsoft.CSharp" Condition="'$(TargetFramework)' == 'net462'" />
</ItemGroup>

<ItemGroup>
Expand Down
41 changes: 41 additions & 0 deletions test/OpenTelemetry.Tests/SdkTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// <copyright file="SdkTests.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>

#nullable enable

using Xunit;

namespace OpenTelemetry.Tests;

public class SdkTests
{
[Theory]
[InlineData(null, "1.0.0")]
[InlineData("1.5.0", "1.5.0")]
[InlineData("1.0.0.0", "1.0.0.0")]
[InlineData("1.0-beta.1", "1.0-beta.1")]
[InlineData("1.5.0-alpha.1.40+807f703e1b4d9874a92bd86d9f2d4ebe5b5d52e4", "1.5.0-alpha.1.40")]
[InlineData("1.5.0-rc.1+807f703e1b4d9874a92bd86d9f2d4ebe5b5d52e4", "1.5.0-rc.1")]
[InlineData("8.0", "8.0")]
[InlineData("8", "8")]
[InlineData("8.0.1.18-alpha1", "8.0.1.18-alpha1")]
public void ParseAssemblyInformationalVersionTests(string? informationalVersion, string expectedVersion)
{
var actualVersion = Sdk.ParseAssemblyInformationalVersion(informationalVersion);

Assert.Equal(expectedVersion, actualVersion);
}
}

0 comments on commit 66a6062

Please sign in to comment.