opentelemetry-dotnet core-1.20.1: Concurrency, Logging, and OTLP Fixes
opentelemetry-dotnet shipped core-1.20.1 on October 20, 2026. It is a patch release, but a busy one. The headline fix is a possible race condition on ARM64 that could record measurements incorrectly when multiple threads record the first measurement with no tags.
The full notes and package downloads are on the GitHub release page.
The release page has the complete changelog for the OpenTelemetry package plus the matching API and exporter updates.
Metrics correctness and performance
Two measurement bugs go beyond cosmetic. Delta double counters were losing subsequent measurements after a non-finite or large value was recorded. Overflow points on ObservableCounter and ObservableUpDownCounter reported only the last observation instead of the sum for each collection.
There are also two performance fixes. Exponential histogram bucket assignment now uses a pre-computed lookup table for values near a bucket boundary. And metric recording was slow when distinct wide tag values, such as long or Guid, shared the same built-in hash code. Both are worth checking if you record high volume metrics on .NET.
Self-diagnostics changes
Self-diagnostics got the most attention this round.
- Preamble redaction now covers quoted or encoded PEM material and prefixed JWTs.
- Legacy self-diagnostics logging no longer terminates the process when the log file is truncated or the volume runs out of space.
- Log files configured through
OTEL_DIAGNOSTICS.jsonorSelfDiagnosticsOptionsare now always created as new files. - Sink messages are truncated to 16,384 characters, which bounds memory for entries waiting to be written.
- On Linux and macOS, the file sink creates its directory and files with owner only access (
0700/0600) instead of inheriting the process umask.
OTLP exporter: one breaking change
The OTLP exporter has a breaking change. HttpClient instances created by the exporter directly no longer follow HTTP redirects. A 3xx response is now treated as a failed export. If you rely on redirects, the release notes point to the Configure HttpClient section in the exporter README for handling IHttpClientFactory created clients.
Other exporter fixes: informational HTTP client logs are now suppressed by default when the OTLP log exporter is registered through OpenTelemetryLoggerOptions.AddOtlpExporter, and an invalid OTEL_EXPORTER_OTLP_ENDPOINT value is no longer written to the diagnostic log. The experimental disk retry feature was hardened too, with a retry directory and blob files now created accessible to the current user only on non-Windows platforms, and safer maintenance that only deletes files the exporter itself created.
Smaller but real bugs
A few fixes that read as edge cases until you hit them:
SuppressInstrumentationScope.Enter()leaked a reference count when theActivitywas not recorded, which suppressed all later telemetry in that execution context.LogRecords could return to the shared pool while still queued for export if a processor stopped enumerating aBatch<LogRecord>early.TracerProvider.GetTracercached a new tracer on every call when scope tags were array valued and equal.
Where to get it
- Release page: core-1.20.1 on GitHub
- Repository: https://github.com/open-telemetry/opentelemetry-dotnet
- Tag:
core-1.20.1