|
5 | 5 | using OpenTelemetry.Metrics; |
6 | 6 | #endif |
7 | 7 | #if OTEL_1_9 |
| 8 | +using Microsoft.Extensions.DependencyInjection; |
8 | 9 | using OpenTelemetry.Logs; |
9 | 10 | #endif |
10 | 11 | using Microsoft.Extensions.Logging; |
@@ -61,33 +62,30 @@ public static MeterProviderBuilder AddOtlpExporterIfEnvironmentVariablePresent(t |
61 | 62 | #if OTEL_1_9 |
62 | 63 | public static class CustomLoggerFactoryBuilderExtensions |
63 | 64 | { |
64 | | - public static ILoggerFactory AddOtlpExporterIfEnvironmentVariablePresent() |
| 65 | + // Returns an IServiceProvider rather than an ILoggerFactory so callers can resolve |
| 66 | + // the underlying OpenTelemetry.Logs.LoggerProvider and call ForceFlush before disposal. |
| 67 | + // LoggerProviderSdk.Dispose() caps its shutdown flush at 5s; with gRPC, the first export |
| 68 | + // can exceed that due to TCP/HTTP/2/TLS handshake, causing batched logs to be dropped. |
| 69 | + public static ServiceProvider CreateLoggerServices() |
65 | 70 | { |
66 | | - // Check if OpenTelemetry Logs Exporter is enabled (similar to metrics) |
67 | | - if (Environment.GetEnvironmentVariable("OTEL_LOGS_EXPORTER_ENABLED") is string value |
68 | | - && value == "true") |
| 71 | + var services = new ServiceCollection(); |
| 72 | + services.AddLogging(builder => |
69 | 73 | { |
70 | | - return LoggerFactory.Create(builder => |
| 74 | + builder.SetMinimumLevel(LogLevel.Trace); |
| 75 | + |
| 76 | + if (Environment.GetEnvironmentVariable("OTEL_LOGS_EXPORTER_ENABLED") is string value |
| 77 | + && value == "true") |
71 | 78 | { |
72 | | - builder.SetMinimumLevel(LogLevel.Trace); |
73 | 79 | #if NET6_0_OR_GREATER |
74 | | - builder.AddOpenTelemetry( |
75 | | - options => |
76 | | - { |
77 | | - options.AddOtlpExporter(); |
78 | | - } |
79 | | - ); |
| 80 | + builder.AddOpenTelemetry(options => |
| 81 | + { |
| 82 | + options.AddOtlpExporter(); |
| 83 | + }); |
80 | 84 | #endif |
81 | | - }); |
82 | | - } |
83 | | - else |
84 | | - { |
85 | | - // Create logger factory without OTel - Datadog instrumentation will hook this |
86 | | - return LoggerFactory.Create(builder => |
87 | | - { |
88 | | - builder.SetMinimumLevel(LogLevel.Trace); |
89 | | - }); |
90 | | - } |
| 85 | + } |
| 86 | + }); |
| 87 | + |
| 88 | + return services.BuildServiceProvider(); |
91 | 89 | } |
92 | 90 | } |
93 | 91 | #endif |
0 commit comments