diff --git a/.github/workflows/Component.BuildTest.yml b/.github/workflows/Component.BuildTest.yml
index 557817de73a..99f95049997 100644
--- a/.github/workflows/Component.BuildTest.yml
+++ b/.github/workflows/Component.BuildTest.yml
@@ -24,7 +24,7 @@ on:
required: false
type: string
tfm-list:
- default: '[ "net462", "net8.0", "net9.0", "net10.0" ]'
+ default: '[ "net462", "net10.0", "net11.0" ]'
required: false
type: string
trigger:
@@ -75,8 +75,7 @@ jobs:
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5.4.0
with:
dotnet-version: |
- 8.0.x
- 9.0.x
+ 10.0.x
- name: Setup .NET
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5.4.0
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 82ba7376da8..00217c208c8 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -170,7 +170,7 @@ jobs:
strategy:
fail-fast: ${{ github.event_name == 'merge_group' }}
matrix:
- version: [ net8.0, net9.0, net10.0 ]
+ version: [ net10.0, net11.0 ]
env:
FRAMEWORK_VERSION: ${{ matrix.version }}
steps:
@@ -198,7 +198,7 @@ jobs:
strategy:
fail-fast: ${{ github.event_name == 'merge_group' }}
matrix:
- version: [ net8.0, net9.0, net10.0 ]
+ version: [ net10.0, net11.0 ]
steps:
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
@@ -240,7 +240,7 @@ jobs:
- name: Run benchmarks
shell: pwsh
run: |
- $runtimes = @("net10.0")
+ $runtimes = @("net11.0")
if ($IsWindows) {
$runtimes += "net462"
}
diff --git a/.github/workflows/concurrency-tests.yml b/.github/workflows/concurrency-tests.yml
index b16fd91468d..34c9b220dff 100644
--- a/.github/workflows/concurrency-tests.yml
+++ b/.github/workflows/concurrency-tests.yml
@@ -24,7 +24,7 @@ jobs:
- ubuntu-24.04
# renovate: datasource=github-runners depType=github-runner
- windows-2025
- version: [ net8.0, net10.0 ]
+ version: [ net10.0, net11.0 ]
project: [ OpenTelemetry.Tests, OpenTelemetry.Api.Tests ]
runs-on: ${{ matrix.os }}
diff --git a/.github/workflows/verifyaotcompat.yml b/.github/workflows/verifyaotcompat.yml
index c6b5d274511..de48729c997 100644
--- a/.github/workflows/verifyaotcompat.yml
+++ b/.github/workflows/verifyaotcompat.yml
@@ -22,7 +22,7 @@ jobs:
- ubuntu-24.04
# renovate: datasource=github-runners depType=github-runner
- windows-2025
- version: [ net8.0, net9.0, net10.0 ]
+ version: [ net10.0, net11.0 ]
runs-on: ${{ matrix.os }}
steps:
diff --git a/AGENTS.md b/AGENTS.md
index 2827d725ffb..b28f339e403 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -29,7 +29,7 @@ dotnet test test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj --filter "FullyQ
**Test for a specific TFM** (Windows also supports `net462`):
```sh
-dotnet test --framework net10.0
+dotnet test --framework net11.0
```
**Check code formatting:**
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 93c36b9acd1..be2c1804663 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -12,27 +12,13 @@
-->
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -40,6 +26,13 @@
+
+
+
+
+
+
+
-
+
-
-
-
+ preview
true
$([System.IO.Directory]::GetParent($(MSBuildThisFileDirectory)).Parent.FullName)
$(MSBuildThisFileDirectory)OpenTelemetry.snk.base64
@@ -97,19 +98,19 @@ finally
net481;net48;net472;net471;net47;net462
- net10.0;net9.0;net8.0;netstandard2.0;$(NetFrameworkMinimumSupportedVersion)
- net10.0;net9.0;net8.0;netstandard2.1;netstandard2.0;$(NetFrameworkMinimumSupportedVersion)
- net10.0;net9.0;net8.0
+ net11.0;net10.0;netstandard2.0;$(NetFrameworkMinimumSupportedVersion)
+ net11.0;net10.0;netstandard2.1;netstandard2.0;$(NetFrameworkMinimumSupportedVersion)
+ net11.0;net10.0
netstandard2.1;netstandard2.0;$(NetFrameworkMinimumSupportedVersion)
- net10.0;net9.0;net8.0
- net10.0;net9.0;net8.0
- net10.0;net9.0;net8.0
+ net11.0;net10.0
+ net11.0;net10.0
+ net11.0;net10.0
$(TargetFrameworksForDocs);$(NetFrameworkSupportedVersions)
- net10.0;net9.0;net8.0
+ net11.0;net10.0
$(TargetFrameworksForTests);$(NetFrameworkMinimumSupportedVersion)
diff --git a/build/docker-compose.net10.0.yml b/build/docker-compose.net10.0.yml
index 70429a07f5d..48daaa7b834 100644
--- a/build/docker-compose.net10.0.yml
+++ b/build/docker-compose.net10.0.yml
@@ -4,4 +4,4 @@ services:
args:
PUBLISH_FRAMEWORK: net10.0
TEST_SDK_VERSION: "10.0"
- BUILD_SDK_VERSION: "10.0"
+ BUILD_SDK_VERSION: "11.0"
diff --git a/build/docker-compose.net11.0.yml b/build/docker-compose.net11.0.yml
new file mode 100644
index 00000000000..b05e860ccee
--- /dev/null
+++ b/build/docker-compose.net11.0.yml
@@ -0,0 +1,7 @@
+services:
+ tests:
+ build:
+ args:
+ PUBLISH_FRAMEWORK: net11.0
+ TEST_SDK_VERSION: "11.0"
+ BUILD_SDK_VERSION: "11.0"
diff --git a/build/docker-compose.net8.0.yml b/build/docker-compose.net8.0.yml
deleted file mode 100644
index 930c9f138fb..00000000000
--- a/build/docker-compose.net8.0.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-services:
- tests:
- build:
- args:
- PUBLISH_FRAMEWORK: net8.0
- TEST_SDK_VERSION: "8.0"
- BUILD_SDK_VERSION: "10.0"
diff --git a/build/docker-compose.net9.0.yml b/build/docker-compose.net9.0.yml
deleted file mode 100644
index 10a6dc5cf2c..00000000000
--- a/build/docker-compose.net9.0.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-services:
- tests:
- build:
- args:
- PUBLISH_FRAMEWORK: net9.0
- TEST_SDK_VERSION: "9.0"
- BUILD_SDK_VERSION: "10.0"
diff --git a/examples/MicroserviceExample/Utils/Utils.csproj b/examples/MicroserviceExample/Utils/Utils.csproj
index 1c95380e4c9..8681d956453 100644
--- a/examples/MicroserviceExample/Utils/Utils.csproj
+++ b/examples/MicroserviceExample/Utils/Utils.csproj
@@ -4,7 +4,6 @@
-
diff --git a/examples/MicroserviceExample/WebApi/Dockerfile b/examples/MicroserviceExample/WebApi/Dockerfile
index 12e3943eb62..7af0dade2cb 100644
--- a/examples/MicroserviceExample/WebApi/Dockerfile
+++ b/examples/MicroserviceExample/WebApi/Dockerfile
@@ -1,18 +1,16 @@
-ARG SDK_VERSION=10.0
-FROM mcr.microsoft.com/dotnet/sdk:8.0.423@sha256:89ce6291bde9acdf59594e79fb8277c6d84c46e4b1f5bf126a4f18766e4bd597 AS dotnet-sdk-8.0
-FROM mcr.microsoft.com/dotnet/sdk:9.0.316@sha256:ee0d20fbc3dfc60ae2d9d9115a9b750c18576a47f24073119dd09d93e072cb89 AS dotnet-sdk-9.0
+ARG SDK_VERSION=11.0
FROM mcr.microsoft.com/dotnet/sdk:10.0.302@sha256:ed034a8bf0b24ded0cbbac07e17825d8e9ebfe21e308191d0f7421eaf5ad4664 AS dotnet-sdk-10.0
+FROM mcr.microsoft.com/dotnet/sdk:11.0.100-preview.6@sha256:030c48b4cf79d68d5cae35afb9e529ce66bc7d40397ac11a8a52fc8e14ced226 AS dotnet-sdk-11.0
FROM dotnet-sdk-${SDK_VERSION} AS build
ARG PUBLISH_CONFIGURATION=Release
-ARG PUBLISH_FRAMEWORK=net10.0
+ARG PUBLISH_FRAMEWORK=net11.0
WORKDIR /app
COPY . ./
RUN dotnet publish ./examples/MicroserviceExample/WebApi -c "${PUBLISH_CONFIGURATION}" -f "${PUBLISH_FRAMEWORK}" -o /out -p:IntegrationBuild=true
-FROM mcr.microsoft.com/dotnet/aspnet:8.0.29@sha256:9822a6201c64c9f38b8a190832a7ae21cd30150d509b3ea170fd83b4f4e6166a AS dotnet-aspnet-8.0
-FROM mcr.microsoft.com/dotnet/aspnet:9.0.18@sha256:8b9f90e53d41154d42e537517aef22e8fe497baabd43e423d5f2edafd06f04f6 AS dotnet-aspnet-9.0
FROM mcr.microsoft.com/dotnet/aspnet:10.0.10@sha256:1fa23fc4872d95fd71c2833ebe65d7e84a43b2d51a31d119516852f13d9505a7 AS dotnet-aspnet-10.0
+FROM mcr.microsoft.com/dotnet/aspnet:11.0.0-preview.6@sha256:b2ebd23166ecc80db02c1086ccfdf266ce738d315036f44303bd2e03bd9d7907 AS dotnet-aspnet-11.0
FROM dotnet-aspnet-${SDK_VERSION} AS runtime
WORKDIR /app
diff --git a/examples/MicroserviceExample/WorkerService/Dockerfile b/examples/MicroserviceExample/WorkerService/Dockerfile
index 62b19187081..7ff9a78d148 100644
--- a/examples/MicroserviceExample/WorkerService/Dockerfile
+++ b/examples/MicroserviceExample/WorkerService/Dockerfile
@@ -1,19 +1,17 @@
-ARG SDK_VERSION=10.0
+ARG SDK_VERSION=11.0
-FROM mcr.microsoft.com/dotnet/sdk:8.0.423@sha256:89ce6291bde9acdf59594e79fb8277c6d84c46e4b1f5bf126a4f18766e4bd597 AS dotnet-sdk-8.0
-FROM mcr.microsoft.com/dotnet/sdk:9.0.316@sha256:ee0d20fbc3dfc60ae2d9d9115a9b750c18576a47f24073119dd09d93e072cb89 AS dotnet-sdk-9.0
FROM mcr.microsoft.com/dotnet/sdk:10.0.302@sha256:ed034a8bf0b24ded0cbbac07e17825d8e9ebfe21e308191d0f7421eaf5ad4664 AS dotnet-sdk-10.0
+FROM mcr.microsoft.com/dotnet/sdk:11.0.100-preview.6@sha256:030c48b4cf79d68d5cae35afb9e529ce66bc7d40397ac11a8a52fc8e14ced226 AS dotnet-sdk-11.0
FROM dotnet-sdk-${SDK_VERSION} AS build
ARG PUBLISH_CONFIGURATION=Release
-ARG PUBLISH_FRAMEWORK=net10.0
+ARG PUBLISH_FRAMEWORK=net11.0
WORKDIR /app
COPY . ./
RUN dotnet publish ./examples/MicroserviceExample/WorkerService -c "${PUBLISH_CONFIGURATION}" -f "${PUBLISH_FRAMEWORK}" -o /out -p:IntegrationBuild=true
-FROM mcr.microsoft.com/dotnet/aspnet:8.0.29@sha256:9822a6201c64c9f38b8a190832a7ae21cd30150d509b3ea170fd83b4f4e6166a AS dotnet-aspnet-8.0
-FROM mcr.microsoft.com/dotnet/aspnet:9.0.18@sha256:8b9f90e53d41154d42e537517aef22e8fe497baabd43e423d5f2edafd06f04f6 AS dotnet-aspnet-9.0
FROM mcr.microsoft.com/dotnet/aspnet:10.0.10@sha256:1fa23fc4872d95fd71c2833ebe65d7e84a43b2d51a31d119516852f13d9505a7 AS dotnet-aspnet-10.0
+FROM mcr.microsoft.com/dotnet/aspnet:11.0.0-preview.6@sha256:b2ebd23166ecc80db02c1086ccfdf266ce738d315036f44303bd2e03bd9d7907 AS dotnet-aspnet-11.0
FROM dotnet-aspnet-${SDK_VERSION} AS runtime
WORKDIR /app
diff --git a/global.json b/global.json
index 5dfc94c8e99..f27c3c0cb0c 100644
--- a/global.json
+++ b/global.json
@@ -1,6 +1,6 @@
{
"sdk": {
"allowPrerelease": false,
- "version": "10.0.302"
+ "version": "11.0.100-preview.6.26359.118"
}
}
diff --git a/src/OpenTelemetry.Api/CompatibilitySuppressions.xml b/src/OpenTelemetry.Api/CompatibilitySuppressions.xml
new file mode 100644
index 00000000000..c720e262130
--- /dev/null
+++ b/src/OpenTelemetry.Api/CompatibilitySuppressions.xml
@@ -0,0 +1,31 @@
+
+
+
+ CP0008
+ T:OpenTelemetry.Trace.SpanKind
+ lib/net8.0/OpenTelemetry.Api.dll
+ lib/netstandard2.0/OpenTelemetry.Api.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Trace.StatusCode
+ lib/net8.0/OpenTelemetry.Api.dll
+ lib/netstandard2.0/OpenTelemetry.Api.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Trace.SpanKind
+ lib/net9.0/OpenTelemetry.Api.dll
+ lib/netstandard2.0/OpenTelemetry.Api.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Trace.StatusCode
+ lib/net9.0/OpenTelemetry.Api.dll
+ lib/netstandard2.0/OpenTelemetry.Api.dll
+ true
+
+
diff --git a/src/OpenTelemetry.Api/Context/Propagation/B3Propagator.cs b/src/OpenTelemetry.Api/Context/Propagation/B3Propagator.cs
index e14931943e2..db4feeae7cd 100644
--- a/src/OpenTelemetry.Api/Context/Propagation/B3Propagator.cs
+++ b/src/OpenTelemetry.Api/Context/Propagation/B3Propagator.cs
@@ -38,7 +38,7 @@ public sealed class B3Propagator : TextMapPropagator
private static readonly HashSet AllFields = [XB3TraceId, XB3SpanId, XB3ParentSpanId, XB3Sampled, XB3Flags];
- private static readonly HashSet SampledValues = new(StringComparer.Ordinal) { SampledValue, LegacySampledValue };
+ private static readonly HashSet SampledValues = [with(StringComparer.Ordinal), SampledValue, LegacySampledValue];
private readonly bool singleHeader;
diff --git a/src/OpenTelemetry.Api/Context/Propagation/BaggagePropagator.cs b/src/OpenTelemetry.Api/Context/Propagation/BaggagePropagator.cs
index 145213af1fb..adac5d7c8f7 100644
--- a/src/OpenTelemetry.Api/Context/Propagation/BaggagePropagator.cs
+++ b/src/OpenTelemetry.Api/Context/Propagation/BaggagePropagator.cs
@@ -243,7 +243,7 @@ internal static bool TryExtractBaggage(
continue;
}
- baggageDictionary ??= new(StringComparer.Ordinal);
+ baggageDictionary ??= [with(StringComparer.Ordinal)];
baggageDictionary[key] = value;
}
}
diff --git a/src/OpenTelemetry.Api/Context/Propagation/TraceContextPropagator.cs b/src/OpenTelemetry.Api/Context/Propagation/TraceContextPropagator.cs
index 7e79c61d80d..0e08ab6ac12 100644
--- a/src/OpenTelemetry.Api/Context/Propagation/TraceContextPropagator.cs
+++ b/src/OpenTelemetry.Api/Context/Propagation/TraceContextPropagator.cs
@@ -142,8 +142,6 @@ static void WriteTraceParentIntoSpan(Span destination, ActivityContext con
context.SpanId.ToHexString().CopyTo(destination.Slice(36));
- // https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3867
- // will change this code to use ActivityTraceFlags.RandomTraceId instead of 2.
// If new enum values are added in the future the Fallback path will ensure
// that the handling is functionally correct, but the condition should be updated
// to include the new value(s) for better readability and performance where possible.
@@ -151,11 +149,11 @@ static void WriteTraceParentIntoSpan(Span destination, ActivityContext con
{
"-01".CopyTo(destination[52..]);
}
- else if (context.TraceFlags == (ActivityTraceFlags)2)
+ else if (context.TraceFlags == ActivityTraceFlags.RandomTraceId)
{
"-02".CopyTo(destination[52..]);
}
- else if (context.TraceFlags == (ActivityTraceFlags.Recorded | (ActivityTraceFlags)2))
+ else if (context.TraceFlags == (ActivityTraceFlags.Recorded | ActivityTraceFlags.RandomTraceId))
{
"-03".CopyTo(destination[52..]);
}
@@ -170,8 +168,6 @@ static void WriteTraceParentIntoSpan(Span destination, ActivityContext con
#else
static string FormatActivityTraceFlags(ActivityTraceFlags flags)
{
- // https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3867
- // will change this code to use ActivityTraceFlags.RandomTraceId instead of 2.
// If new enum values are added in the future the Fallback path will ensure
// that the handling is functionally correct, but the switch should be updated
// to include the new value(s) for better readability and performance where possible.
@@ -179,8 +175,8 @@ static string FormatActivityTraceFlags(ActivityTraceFlags flags)
{
ActivityTraceFlags.None => "-00",
ActivityTraceFlags.Recorded => "-01",
- (ActivityTraceFlags)2 => "-02",
- ActivityTraceFlags.Recorded | (ActivityTraceFlags)2 => "-03",
+ ActivityTraceFlags.RandomTraceId => "-02",
+ ActivityTraceFlags.Recorded | ActivityTraceFlags.RandomTraceId => "-03",
_ => Fallback((byte)flags),
};
@@ -281,9 +277,7 @@ internal static bool TryExtractTraceparent(string traceparent, out ActivityTrace
if ((optionsLowByte & 2) == 2)
{
- // https://github.com/open-telemetry/opentelemetry-dotnet/pull/6899
- // will change this to use ActivityTraceFlags.RandomTraceId instead.
- traceOptions |= (ActivityTraceFlags)2;
+ traceOptions |= ActivityTraceFlags.RandomTraceId;
}
if ((!bestAttempt) && (traceparent.Length != VersionAndTraceIdAndSpanIdLength + OptionsLength))
diff --git a/src/OpenTelemetry.Api/Logs/LogRecordAttributeList.cs b/src/OpenTelemetry.Api/Logs/LogRecordAttributeList.cs
index 07ede6141e6..9614b123c7e 100644
--- a/src/OpenTelemetry.Api/Logs/LogRecordAttributeList.cs
+++ b/src/OpenTelemetry.Api/Logs/LogRecordAttributeList.cs
@@ -251,7 +251,7 @@ public readonly Enumerator GetEnumerator()
Debug.Assert(readonlyCount <= 8, "Invalid size detected.");
- attributeStorage ??= new List>(OverflowAdditionalCapacity);
+ attributeStorage ??= [with(OverflowAdditionalCapacity)];
// TODO: Perf test this, adjust as needed.
attributeStorage.Add(this.attribute1);
@@ -305,7 +305,7 @@ private void MoveAttributesToTheOverflowList()
{
Debug.Assert(this.Count - 1 == OverflowMaxCount, "count did not match OverflowMaxCount");
- var attributes = this.OverflowAttributes ??= new(OverflowAdditionalCapacity);
+ var attributes = this.OverflowAttributes ??= [with(OverflowAdditionalCapacity)];
Debug.Assert(attributes.Count == 0, "Overflow attributes should be empty before transfer.");
attributes.Add(this.attribute1);
diff --git a/src/OpenTelemetry.Api/OpenTelemetry.Api.csproj b/src/OpenTelemetry.Api/OpenTelemetry.Api.csproj
index e5179ba4c08..4ba22fb05e7 100644
--- a/src/OpenTelemetry.Api/OpenTelemetry.Api.csproj
+++ b/src/OpenTelemetry.Api/OpenTelemetry.Api.csproj
@@ -7,7 +7,7 @@
-
+
diff --git a/src/OpenTelemetry.Exporter.Console/CompatibilitySuppressions.xml b/src/OpenTelemetry.Exporter.Console/CompatibilitySuppressions.xml
new file mode 100644
index 00000000000..4c221b3c7c8
--- /dev/null
+++ b/src/OpenTelemetry.Exporter.Console/CompatibilitySuppressions.xml
@@ -0,0 +1,17 @@
+
+
+
+ CP0008
+ T:OpenTelemetry.Exporter.ConsoleExporterOutputTargets
+ lib/net8.0/OpenTelemetry.Exporter.Console.dll
+ lib/netstandard2.0/OpenTelemetry.Exporter.Console.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Exporter.ConsoleExporterOutputTargets
+ lib/net9.0/OpenTelemetry.Exporter.Console.dll
+ lib/netstandard2.0/OpenTelemetry.Exporter.Console.dll
+ true
+
+
diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CompatibilitySuppressions.xml b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CompatibilitySuppressions.xml
new file mode 100644
index 00000000000..91e3830eb6f
--- /dev/null
+++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CompatibilitySuppressions.xml
@@ -0,0 +1,31 @@
+
+
+
+ CP0008
+ T:OpenTelemetry.Exporter.OtlpExportCompression
+ lib/net8.0/OpenTelemetry.Exporter.OpenTelemetryProtocol.dll
+ lib/netstandard2.1/OpenTelemetry.Exporter.OpenTelemetryProtocol.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Exporter.OtlpExportProtocol
+ lib/net8.0/OpenTelemetry.Exporter.OpenTelemetryProtocol.dll
+ lib/netstandard2.1/OpenTelemetry.Exporter.OpenTelemetryProtocol.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Exporter.OtlpExportCompression
+ lib/net9.0/OpenTelemetry.Exporter.OpenTelemetryProtocol.dll
+ lib/netstandard2.1/OpenTelemetry.Exporter.OpenTelemetryProtocol.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Exporter.OtlpExportProtocol
+ lib/net9.0/OpenTelemetry.Exporter.OpenTelemetryProtocol.dll
+ lib/netstandard2.1/OpenTelemetry.Exporter.OpenTelemetryProtocol.dll
+ true
+
+
diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCertificateManager.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCertificateManager.cs
index 1568ab90336..e4741608d5a 100644
--- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCertificateManager.cs
+++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCertificateManager.cs
@@ -80,11 +80,7 @@ public static X509Certificate2 LoadClientCertificate(
// Try to load as PKCS#12 first, then as PEM
try
{
-#if NET9_0_OR_GREATER
clientCertificate = X509CertificateLoader.LoadPkcs12FromFile(clientCertificatePath, null);
-#else
- clientCertificate = new X509Certificate2(clientCertificatePath);
-#endif
}
catch (Exception ex) when (ex is CryptographicException or InvalidDataException or FormatException)
{
diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OpenTelemetry.Exporter.OpenTelemetryProtocol.csproj b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OpenTelemetry.Exporter.OpenTelemetryProtocol.csproj
index 47186a8c5c4..1a8ca8cce20 100644
--- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OpenTelemetry.Exporter.OpenTelemetryProtocol.csproj
+++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OpenTelemetry.Exporter.OpenTelemetryProtocol.csproj
@@ -20,11 +20,6 @@
$(NoWarn);SYSLIB1100;SYSLIB1101
-
-
-
-
-
diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptionsExtensions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptionsExtensions.cs
index 2a5fb55611b..ad55cfceb1f 100644
--- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptionsExtensions.cs
+++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptionsExtensions.cs
@@ -198,7 +198,9 @@ internal static Uri AppendPathIfNotPresent(this Uri uri, string path)
var absoluteUri = uri.AbsoluteUri;
var separator = string.Empty;
-#if NET || NETSTANDARD2_1_OR_GREATER
+#if NET11_0_OR_GREATER
+ if (absoluteUri.EndsWith('/', StringComparison.Ordinal))
+#elif NET || NETSTANDARD2_1_OR_GREATER
if (absoluteUri.EndsWith('/'))
#else
if (absoluteUri.EndsWith("/", StringComparison.Ordinal))
diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/PersistentStorage/FileBlob.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/PersistentStorage/FileBlob.cs
index 47336e8ae24..1f3bfafe223 100644
--- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/PersistentStorage/FileBlob.cs
+++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/PersistentStorage/FileBlob.cs
@@ -93,7 +93,12 @@ protected override bool OnTryLease(int leasePeriodMilliseconds)
var leaseTimestamp = DateTime.UtcNow + TimeSpan.FromMilliseconds(leasePeriodMilliseconds);
if (path.EndsWith(".lock", StringComparison.OrdinalIgnoreCase))
{
- path = path.Substring(0, path.LastIndexOf('@'));
+ path =
+#if NET11_0_OR_GREATER
+ path.Substring(0, path.LastIndexOf('@', StringComparison.Ordinal));
+#else
+ path.Substring(0, path.LastIndexOf('@'));
+#endif
}
path += $"@{leaseTimestamp:yyyy-MM-ddTHHmmss.fffffffZ}.lock";
diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/PersistentStorage/PersistentStorageHelper.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/PersistentStorage/PersistentStorageHelper.cs
index 148f1e6e5cc..10a3425218e 100644
--- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/PersistentStorage/PersistentStorageHelper.cs
+++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/PersistentStorage/PersistentStorageHelper.cs
@@ -40,7 +40,12 @@ internal static bool RemoveExpiredLease(DateTime leaseDeadline, string filePath)
var fileDateTime = GetDateTimeFromLeaseName(filePath);
if (fileDateTime < leaseDeadline)
{
+#if NET11_0_OR_GREATER
+ var atSignIndex = filePath.LastIndexOf('@', StringComparison.Ordinal);
+#else
var atSignIndex = filePath.LastIndexOf('@');
+#endif
+
if (atSignIndex == -1)
{
return false;
@@ -148,7 +153,13 @@ internal static string CreateSubdirectory(string path)
internal static DateTime GetDateTimeFromBlobName(string filePath)
{
var fileName = GetFileNameWithoutExtension(filePath);
+
+#if NET11_0_OR_GREATER
+ var dashIndex = fileName.LastIndexOf('-', StringComparison.Ordinal);
+#else
var dashIndex = fileName.LastIndexOf('-');
+#endif
+
if (dashIndex == -1)
{
return DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc);
@@ -162,7 +173,15 @@ internal static DateTime GetDateTimeFromBlobName(string filePath)
internal static DateTime GetDateTimeFromLeaseName(string filePath)
{
var fileName = GetFileNameWithoutExtension(filePath);
- var startIndex = fileName.LastIndexOf('@') + 1;
+
+ var startIndex =
+#if NET11_0_OR_GREATER
+ fileName.LastIndexOf('@', StringComparison.Ordinal)
+#else
+ fileName.LastIndexOf('@')
+#endif
+ + 1;
+
var timestamp = fileName.Substring(startIndex);
return Parse(timestamp);
@@ -177,7 +196,11 @@ private static string GetFileNameWithoutExtension(string filePath)
{
// Non-Windows platforms will treat the entire path as the file name if it contains Windows
// path separators, so we need to extract the file name manually from after the last \ character.
+#if NET11_0_OR_GREATER
+ var startIndex = fileName.LastIndexOf('\\', StringComparison.Ordinal);
+#else
var startIndex = fileName.LastIndexOf('\\');
+#endif
if (startIndex > -1)
{
fileName = fileName.Substring(startIndex + 1);
diff --git a/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/PrometheusExporterApplicationBuilderExtensions.cs b/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/PrometheusExporterApplicationBuilderExtensions.cs
index 92bef6f1b59..8ce1e09838e 100644
--- a/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/PrometheusExporterApplicationBuilderExtensions.cs
+++ b/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/PrometheusExporterApplicationBuilderExtensions.cs
@@ -116,7 +116,11 @@ public static IApplicationBuilder UseOpenTelemetryPrometheusScrapingEndpoint(
path = options.ScrapeEndpointPath ?? PrometheusAspNetCoreOptions.DefaultScrapeEndpointPath;
}
+#if NET11_0_OR_GREATER
+ if (!path.StartsWith('/', StringComparison.Ordinal))
+#else
if (!path.StartsWith('/'))
+#endif
{
path = $"/{path}";
}
diff --git a/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/PrometheusExporterEndpointRouteBuilderExtensions.cs b/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/PrometheusExporterEndpointRouteBuilderExtensions.cs
index 6604935ebf0..5e33ec056dc 100644
--- a/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/PrometheusExporterEndpointRouteBuilderExtensions.cs
+++ b/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/PrometheusExporterEndpointRouteBuilderExtensions.cs
@@ -86,7 +86,11 @@ public static IEndpointConventionBuilder MapPrometheusScrapingEndpoint(
path = options.ScrapeEndpointPath ?? PrometheusAspNetCoreOptions.DefaultScrapeEndpointPath;
}
+#if NET11_0_OR_GREATER
+ if (!path.StartsWith('/', StringComparison.Ordinal))
+#else
if (!path.StartsWith('/'))
+#endif
{
path = $"/{path}";
}
diff --git a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/Shared/PrometheusCollectionManager.cs b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/Shared/PrometheusCollectionManager.cs
index 4a01270518b..3da023a5afe 100644
--- a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/Shared/PrometheusCollectionManager.cs
+++ b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/Shared/PrometheusCollectionManager.cs
@@ -660,7 +660,7 @@ private List GetMetricStates(TextFormatSerializer serializer, in Ba
if (metadataState.Type != prometheusMetric.Type)
{
- droppedMetricNames ??= new(StringComparer.Ordinal);
+ droppedMetricNames ??= [with(StringComparer.Ordinal)];
droppedMetricNames.Add(metadataName);
PrometheusExporterEventSource.Log.ConflictingType(metadataName, metadataState.Type, prometheusMetric.Type);
}
diff --git a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/PrometheusHttpListener.cs b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/PrometheusHttpListener.cs
index 0e5512322de..e995ed51e8c 100644
--- a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/PrometheusHttpListener.cs
+++ b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/PrometheusHttpListener.cs
@@ -34,7 +34,9 @@ public PrometheusHttpListener(PrometheusExporter exporter, PrometheusHttpListene
var path = options.ScrapeEndpointPath ?? PrometheusHttpListenerOptions.DefaultScrapeEndpointPath;
-#if NET
+#if NET11_0_OR_GREATER
+ if (!path.StartsWith('/', StringComparison.Ordinal))
+#elif NET
if (!path.StartsWith('/'))
#else
if (!path.StartsWith("/", StringComparison.Ordinal))
@@ -43,7 +45,9 @@ public PrometheusHttpListener(PrometheusExporter exporter, PrometheusHttpListene
path = $"/{path}";
}
-#if NET
+#if NET11_0_OR_GREATER
+ if (!path.EndsWith('/', StringComparison.Ordinal))
+#elif NET
if (!path.EndsWith('/'))
#else
if (!path.EndsWith("/", StringComparison.Ordinal))
diff --git a/src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinEndpointLruCache.cs b/src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinEndpointLruCache.cs
index 90de02552f4..49ab8e9c92e 100644
--- a/src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinEndpointLruCache.cs
+++ b/src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinEndpointLruCache.cs
@@ -17,7 +17,7 @@ public ZipkinEndpointLruCache(int capacity)
Guard.ThrowIfOutOfRange(capacity, min: 1);
this.capacity = capacity;
- this.cache = new Dictionary>(StringComparer.Ordinal);
+ this.cache = [with(StringComparer.Ordinal)];
}
public int Count
diff --git a/src/OpenTelemetry.Extensions.Propagators/B3Propagator.cs b/src/OpenTelemetry.Extensions.Propagators/B3Propagator.cs
index 6e480439808..f3d6f0b555d 100644
--- a/src/OpenTelemetry.Extensions.Propagators/B3Propagator.cs
+++ b/src/OpenTelemetry.Extensions.Propagators/B3Propagator.cs
@@ -38,7 +38,7 @@ public sealed class B3Propagator : TextMapPropagator
private static readonly HashSet AllFields = [XB3TraceId, XB3SpanId, XB3ParentSpanId, XB3Sampled, XB3Flags];
- private static readonly HashSet SampledValues = new(StringComparer.Ordinal) { SampledValue, LegacySampledValue };
+ private static readonly HashSet SampledValues = [with(StringComparer.Ordinal), SampledValue, LegacySampledValue];
private readonly bool singleHeader;
diff --git a/src/OpenTelemetry/CompatibilitySuppressions.xml b/src/OpenTelemetry/CompatibilitySuppressions.xml
new file mode 100644
index 00000000000..5d12c209898
--- /dev/null
+++ b/src/OpenTelemetry/CompatibilitySuppressions.xml
@@ -0,0 +1,115 @@
+
+
+
+ CP0008
+ T:OpenTelemetry.ExportProcessorType
+ lib/net8.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.ExportResult
+ lib/net8.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Metrics.AggregationTemporality
+ lib/net8.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Metrics.ExemplarFilterType
+ lib/net8.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Metrics.ExportModes
+ lib/net8.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Metrics.MetricReaderTemporalityPreference
+ lib/net8.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Metrics.MetricType
+ lib/net8.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Trace.SamplingDecision
+ lib/net8.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.ExportProcessorType
+ lib/net9.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.ExportResult
+ lib/net9.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Metrics.AggregationTemporality
+ lib/net9.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Metrics.ExemplarFilterType
+ lib/net9.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Metrics.ExportModes
+ lib/net9.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Metrics.MetricReaderTemporalityPreference
+ lib/net9.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Metrics.MetricType
+ lib/net9.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
+ CP0008
+ T:OpenTelemetry.Trace.SamplingDecision
+ lib/net9.0/OpenTelemetry.dll
+ lib/netstandard2.1/OpenTelemetry.dll
+ true
+
+
diff --git a/src/OpenTelemetry/Logs/LogRecord.cs b/src/OpenTelemetry/Logs/LogRecord.cs
index 45fb4ba85c2..4461b9f7bba 100644
--- a/src/OpenTelemetry/Logs/LogRecord.cs
+++ b/src/OpenTelemetry/Logs/LogRecord.cs
@@ -514,7 +514,7 @@ private void BufferLogAttributes()
return;
}
- var attributeStorage = this.AttributeStorage ??= new List>(attributes.Count);
+ var attributeStorage = this.AttributeStorage ??= [with(attributes.Count)];
// Note: AddRange here will copy all of the KeyValuePairs from
// attributes to AttributeStorage. This "captures" the state and
@@ -538,7 +538,7 @@ private void BufferLogScopes()
return;
}
- var scopeStorage = this.ScopeStorage ??= new List