3

I am using 'OpenTelemetry.Contrib.Preview' package to attach ILogger standalone logs as Activity Events (aka Trace events) to co-relate the logs with trace & show at a single place like Jaeger. As part of the documentation if we want to attach the logs we need to call 'AttachLogsToActivityEvent' along with setting 'IncludeFormattedMessage' to true during the log setup at startup.cs. While I see the logs are successfully being attached to the activity but only the default 3 properties CategoryName, LogLevel & EventId are being added and the actual 'FormattedMessage' is not getting logged even though I have it enabled. Searched in their github repo where I found this below issue, but the same is not working here: https://github.com/open-telemetry/opentelemetry-dotnet-contrib/issues/134

Any idea what's missing?

csproj file

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0-*" />
    <PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="7.0.0" />

    <PackageReference Include="OpenTelemetry.Contrib.Preview" Version="1.0.0-beta2" />
    <PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.4.0-rc.1" />
    <PackageReference Include="OpenTelemetry.Exporter.Jaeger" Version="1.4.0-rc.1" />
    <PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.4.0-rc.1" />
    <PackageReference Include="OpenTelemetry.Exporter.Prometheus.HttpListener" Version="1.4.0-rc.1" />
    <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.4.0-rc.1" />
    <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs" Version="1.4.0-rc.1" />
    <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.4.0-rc.1" />
    <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.0.0-rc9.10" />
    <PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.0.0-rc9.10" />
    <PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.1.0-beta.2" />
  </ItemGroup>

</Project>

Program.cs file (there are bunch of lines for swagger/versioning testing)

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using OpenTelemetry;
using OpenTelemetry.Exporter;
using OpenTelemetry.Instrumentation.AspNetCore;
using OpenTelemetry.Logs;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using System;

var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;

services.AddProblemDetails();
services.AddEndpointsApiExplorer();
services.AddApiVersioning(options => options.ReportApiVersions = true)
        .AddApiExplorer(
            options =>
            {
                options.GroupNameFormat = "'v'VVV";
                options.SubstituteApiVersionInUrl = true;
            })
        .EnableApiVersionBinding();
services.AddSwaggerGen();

builder.Services.Configure<AspNetCoreInstrumentationOptions>(options => options.RecordException = true);
var resource = ResourceBuilder.CreateDefault().AddService("MyService");
builder.Services
        .AddOpenTelemetry()
        .ConfigureResource(ConfigureResource)
        .WithTracing(o =>
        {
            o.SetSampler(new TraceIdRatioBasedSampler(1.0))
             .AddSource("MyService")
             .AddAspNetCoreInstrumentation(option => option.RecordException = true)
             .AddHttpClientInstrumentation();
            o.AddConsoleExporter(o => o.Targets = ConsoleExporterOutputTargets.Console);
        }).StartWithHost();

builder.Logging.ClearProviders();
builder.Logging.Configure(o => o.ActivityTrackingOptions = ActivityTrackingOptions.SpanId | ActivityTrackingOptions.TraceId | ActivityTrackingOptions.ParentId);
builder.Logging.AddFilter<OpenTelemetryLoggerProvider>("*", LogLevel.Information);
builder.Logging
    .AddOpenTelemetry(loggerOptions =>
    {
        loggerOptions.SetResourceBuilder(resource);
        loggerOptions.IncludeFormattedMessage = true;
        loggerOptions.IncludeScopes = true;
        loggerOptions.ParseStateValues = true;
        loggerOptions.AddConsoleExporter();
        loggerOptions.AttachLogsToActivityEvent();
    });

var app = builder.Build();

var common = app.NewVersionedApi("Common");
var commonV1 = common.MapGroup("/api/v{version:apiVersion}/common").HasApiVersion(1.0);
commonV1.MapGet("/", (ILogger<Program> logger) =>
{
    logger.LogInformation("Calling hello world api!");
    return Results.Ok("Hello World common v1!");
});

app.UseSwagger();
app.UseSwaggerUI(
    options =>
    {
        var descriptions = app.DescribeApiVersions();
        foreach (var description in descriptions)
        {
            var url = $"/swagger/{description.GroupName}/swagger.json";
            var name = description.GroupName.ToUpperInvariant();
            options.SwaggerEndpoint(url, name);
        }
    });

app.Run();

static void ConfigureResource(ResourceBuilder r) => r.AddService(
            serviceName: "MyService",
            serviceVersion: "1.0.0",
            serviceInstanceId: Environment.MachineName);

Once I run the above program & execute the endpoint, I see the activity is getting logged with the additional 'log' even that I added as part of the endpoint execution, but it doesn't include the actual 'FromattedMessage' property though, like an example below...

enter image description here

I have opened the same issue in github too: https://github.com/open-telemetry/opentelemetry-dotnet/issues/4052

SanjayD
  • 156
  • 4
  • 12

1 Answers1

1

OpenTelemetry.Extensions replaces OpenTelemetry.Contrib.Preview, the latter hasn't been updated for almost two years. If you switch to OpenTelemetry.Extensions you'll see FormattedMessage attached to the event, alongside other additional information.

In your Program.cs you'll need to remove the call to StartWithHost, due to API changes in newer versions of OpenTelemetry packages.

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0-*" />
    <PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="7.0.0" />

    <PackageReference Include="OpenTelemetry.Extensions" Version="1.0.0-beta.4" />
    <PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.4.0" />
    <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.4.0" />
    <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.0.0-rc9.14" />
    <PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.0.0-rc9.14" />
  </ItemGroup>

</Project>
Johannes Tax
  • 106
  • 1