open-telemetry / opentelemetry-dotnet

The OpenTelemetry .NET Client
https://opentelemetry.io
Apache License 2.0
3.18k stars 753 forks source link

[bug] Log processor' OnStart is never invoked. #5834

Closed konjac closed 1 week ago

konjac commented 2 weeks ago

Package

OpenTelemetry

Package Version

Package Name Version
OpenTelemetry.Api 1.9.0
OpenTelemetry 1.9.0
TBD TBD

Runtime Version

.net 8

Description

I want to use log processor to add enrich attributes. However, it looks like BaseProcessor.OnStart is never invoked.

After checking code, I believe it is a bug in OpenTelemetryLogger.cs. processor.OnEnd has no paired processor.Start.

I proposed this PR #5835 to make OnStart and OnEnd paired.

Steps to Reproduce

using Microsoft.Extensions.Logging;
using OpenTelemetry;
using OpenTelemetry.Logs;

internal class Program
{
    private static void Main(string[] args)
    {
        var loggerFactory = LoggerFactory.Create(
            builder =>
            {
                builder.AddOpenTelemetry(logging =>
                {
                    logging.AddProcessor(new MyProcessor());
                    logging.AddConsoleExporter();
                });
            });

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

        logger.LogInformation("hello!");
        logger.LogInformation("CountStart={}, CountEnd={}", MyProcessor.CountStart, MyProcessor.CountEnd);
    }
}

class MyProcessor : BaseProcessor<LogRecord>
{
    public static int CountEnd = 0;
    public static int CountStart = 0;
    public override void OnEnd(LogRecord data)
    {
        ++CountEnd;
        Console.WriteLine("On End");
        base.OnEnd(data);
    }

        public override void OnStart(LogRecord data)
    {
        ++CountStart;
        Console.WriteLine("On End");
        base.OnStart(data);
    }
}

Expected Result

CountStart=1, CountEnd=1

Actual Result

CountStart=0, CountEnd=1

Additional Context

No response

cijothomas commented 1 week ago

This is by-design. Logs only have OnEnd, that can be used for enrichemnt/filtering etc. https://github.com/open-telemetry/opentelemetry-dotnet/tree/main/docs/logs/extending-the-sdk#processor