The LogRecord scopes are corrupted when using the BatchLogRecordExportProcessor
See original GitHub issueBug Report
OpenTelemetry 1.1.0-beta1
Microsoft.Extensions.Logging 5.0.0
Runtime version netcoreapp3.1
Symptom
The BaseExporter<LogRecord>
will process incorrect scopes if BatchLogRecordExportProcessor
is used. If SimpleLogRecordExportProcessor
is used everything is processed correctly. This is a symptom of BatchLogRecordExportProcessor
processing the records after the original scopes are disposed.
What is the expected behavior?
The exporter should have access to correct scopes.
What is the actual behavior?
The scopes that the exported are not consistent.
Reproduce
The unit test bellow reproduces the issue:
[TestCase(true)]
[TestCase(false)]
public void VerifyScopes(bool useBatching)
{
BaseProcessor<LogRecord> processor = useBatching ? new BatchLogRecordExportProcessor(new AssertScopesExporter()): new SimpleLogRecordExportProcessor(new AssertScopesExporter());
var logger = LoggerFactory.Create(builder =>
{
builder.AddOpenTelemetry(options =>
{
options.AddProcessor(processor);
options.IncludeFormattedMessage = true;
options.IncludeScopes = true;
});
}).CreateLogger(GetType());
for (int i = 0; i < 1000; i++)
{
using (logger.BeginScope(i.ToString()))
{
using (logger.BeginScope(i.ToString()))
{
using (logger.BeginScope(i.ToString()))
{
logger.LogInformation(i.ToString());
}
}
}
}
processor.ForceFlush();
}
private class AssertScopesExporter : BaseExporter<LogRecord>
{
public override ExportResult Export(in Batch<LogRecord> batch)
{
foreach (var log in batch)
{
int scopes = 0;
log.ForEachScope<object>(
(scope, _) =>
{
Assert.AreEqual(log.FormattedMessage, scope.ToString());
scopes++;
},
null);
Assert.AreEqual(3, scopes);
}
return ExportResult.Success;
}
}
We will close this issue if:
- The unit test above will pass for both test cases.
Additional Context
I think the LogRecord
needs to be extended with Scopes
property and these must be filled directly by the OpenTelemetryLogger
. Current API LogRecord.ForEachScope
will simply not work if BatchLogRecordExportProcessor
is involved.
Issue Analytics
- State:
- Created 2 years ago
- Reactions:3
- Comments:5 (3 by maintainers)
Thanks for reporting this. This issue is about scopes being corrupted, but your scenario is exposing a different bug, likely related to https://github.com/open-telemetry/opentelemetry-dotnet/issues/2905. Could you open a new issue, and use 2905 to report this, for better tracking and fix.
The original issue about scopes being accessed outside its lifecycle is fixed by https://github.com/open-telemetry/opentelemetry-dotnet/pull/2026 We can close this issue.