From 9cd222bb998674606b5158883e8f5697544f528a Mon Sep 17 00:00:00 2001 From: martincostello Date: Sun, 15 Feb 2026 16:03:51 +0000 Subject: [PATCH 01/55] Support .NET 11 - Add support for building and testing with .NET 11, initially using .NET 11 preview 1. - Add `net11.0` TFMs. - Drop `net8.0` and `net9.0` TFMs. - Add workarounds for some issues pending their fixes. --- .github/workflows/Component.BuildTest.yml | 9 +--- .github/workflows/ci.yml | 4 +- .github/workflows/concurrency-tests.yml | 2 +- .github/workflows/verifyaotcompat.yml | 2 +- Directory.Packages.props | 42 +++++++------------ OpenTelemetry.slnx | 3 +- build/Common.nonprod.props | 2 +- build/Common.props | 14 +++---- build/docker-compose.net10.0.yml | 2 +- build/docker-compose.net11.0.yml | 7 ++++ build/docker-compose.net8.0.yml | 7 ---- build/docker-compose.net9.0.yml | 7 ---- .../MicroserviceExample/WebApi/Dockerfile | 10 ++--- .../WorkerService/Dockerfile | 10 ++--- global.json | 2 +- .../Implementation/OtlpCertificateManager.cs | 4 -- .../OtlpSecureHttpClientFactory.cs | 5 +-- ...etry.Exporter.OpenTelemetryProtocol.csproj | 5 --- .../OtlpExporterOptionsExtensions.cs | 4 +- .../PersistentStorage/FileBlob.cs | 7 +++- .../PersistentStorageHelper.cs | 26 ++++++++++-- src/Shared/Shims/Lock.cs | 6 +-- .../GrpcRetryTestCase.cs | 2 + .../HttpRetryTestCase.cs | 2 + .../IntegrationTest/Dockerfile | 9 ++-- .../OtlpSecureHttpClientFactoryTests.cs | 25 +---------- .../OtlpTlsOptionsTests.cs | 19 +-------- .../RemoteEndpointPriorityTestCase.cs | 2 + ...nTelemetry.Extensions.Hosting.Tests.csproj | 2 + .../Dockerfile | 9 ++-- ...strumentation.W3cTraceContext.Tests.csproj | 1 - ...e2ExponentialBucketHistogramHelperTests.cs | 4 ++ .../Metrics/MetricTestData.cs | 2 + 33 files changed, 106 insertions(+), 151 deletions(-) create mode 100644 build/docker-compose.net11.0.yml delete mode 100644 build/docker-compose.net8.0.yml delete mode 100644 build/docker-compose.net9.0.yml diff --git a/.github/workflows/Component.BuildTest.yml b/.github/workflows/Component.BuildTest.yml index b8bf4f89395..05324aab460 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 @@ -44,10 +44,6 @@ jobs: version: net462 - os: ubuntu-22.04-arm version: net462 - - os: ubuntu-22.04-arm - version: net10.0 - - os: windows-11-arm - version: net10.0 runs-on: ${{ matrix.os }} timeout-minutes: 30 @@ -69,8 +65,7 @@ jobs: uses: actions/setup-dotnet@baa11fbfe1d6520db94683bd5c7a3818018e4309 # v5.1.0 with: dotnet-version: | - 8.0.x - 9.0.x + 10.0.x - name: Setup .NET uses: actions/setup-dotnet@baa11fbfe1d6520db94683bd5c7a3818018e4309 # v5.1.0 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 31a8c46fe37..a4a01e7dc74 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -123,7 +123,7 @@ jobs: strategy: fail-fast: false matrix: - version: [ net8.0, net9.0, net10.0 ] + version: [ net10.0, net11.0 ] env: FRAMEWORK_VERSION: ${{ matrix.version }} steps: @@ -145,7 +145,7 @@ jobs: strategy: fail-fast: false matrix: - version: [ net8.0, net9.0, net10.0 ] + version: [ net10.0, net11.0 ] steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Run W3C Trace Context docker compose diff --git a/.github/workflows/concurrency-tests.yml b/.github/workflows/concurrency-tests.yml index 584b371bcd5..84b3c428e26 100644 --- a/.github/workflows/concurrency-tests.yml +++ b/.github/workflows/concurrency-tests.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false # ensures the entire test matrix is run, even if one permutation fails matrix: os: [ windows-latest, ubuntu-22.04 ] - 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 d66b74418fc..80f928c81a9 100644 --- a/.github/workflows/verifyaotcompat.yml +++ b/.github/workflows/verifyaotcompat.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false # ensures the entire test matrix is run, even if one permutation fails matrix: os: [ ubuntu-22.04, windows-latest ] - version: [ net8.0, net9.0, net10.0 ] + version: [ net10.0, net11.0 ] runs-on: ${{ matrix.os }} steps: diff --git a/Directory.Packages.props b/Directory.Packages.props index 59fff39c909..9105a49c8c4 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -12,30 +12,24 @@ --> - - - - + + + + - - - - - - - - - - - - + + + + + + - - - - 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/WebApi/Dockerfile b/examples/MicroserviceExample/WebApi/Dockerfile index bb6d6fdc962..7be71462cbb 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.418@sha256:58359d0b8fe8237be1d63ac335ca378e2857f976c7f92791f7c84b3c117037f5 AS dotnet-sdk-8.0 -FROM mcr.microsoft.com/dotnet/sdk:9.0.311@sha256:03a7d87512a743b3d53416adae79eb89d2a7163de78bb58e7bc7b7e262e25750 AS dotnet-sdk-9.0 +ARG SDK_VERSION=11.0 FROM mcr.microsoft.com/dotnet/sdk:10.0.103@sha256:0a506ab0c8aa077361af42f82569d364ab1b8741e967955d883e3f23683d473a AS dotnet-sdk-10.0 +FROM mcr.microsoft.com/dotnet/sdk:11.0-preview@sha256:c5aa0a301759a1b07654450e10e3ec78c3d476d0537263ca1ab5850d9f302fca 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.24@sha256:0d6e2e245f180ef785f51aab639c8d5d29afc3b43b95c0ee6dfaf5b84895cd6a AS dotnet-aspnet-8.0 -FROM mcr.microsoft.com/dotnet/aspnet:9.0.13@sha256:302f77633b8d9a944bd98ff249079c8a353506b83084579216b46a264992025f AS dotnet-aspnet-9.0 FROM mcr.microsoft.com/dotnet/aspnet:10.0.3@sha256:52dcfb4225fda614c38ba5997a4ec72cbd5260a624125174416e547ff9eb9b8c AS dotnet-aspnet-10.0 +FROM mcr.microsoft.com/dotnet/aspnet:11.0-preview@sha256:65a932bd7101f50eb99f8b45e2c970851092e0090304a48faf1c9f6c456d60ff 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 463ec8abf86..b26ea08bb86 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.418@sha256:58359d0b8fe8237be1d63ac335ca378e2857f976c7f92791f7c84b3c117037f5 AS dotnet-sdk-8.0 -FROM mcr.microsoft.com/dotnet/sdk:9.0.311@sha256:03a7d87512a743b3d53416adae79eb89d2a7163de78bb58e7bc7b7e262e25750 AS dotnet-sdk-9.0 FROM mcr.microsoft.com/dotnet/sdk:10.0.103@sha256:0a506ab0c8aa077361af42f82569d364ab1b8741e967955d883e3f23683d473a AS dotnet-sdk-10.0 +FROM mcr.microsoft.com/dotnet/sdk:11.0-preview@sha256:c5aa0a301759a1b07654450e10e3ec78c3d476d0537263ca1ab5850d9f302fca 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.24@sha256:0d6e2e245f180ef785f51aab639c8d5d29afc3b43b95c0ee6dfaf5b84895cd6a AS dotnet-aspnet-8.0 -FROM mcr.microsoft.com/dotnet/aspnet:9.0.13@sha256:302f77633b8d9a944bd98ff249079c8a353506b83084579216b46a264992025f AS dotnet-aspnet-9.0 FROM mcr.microsoft.com/dotnet/aspnet:10.0.3@sha256:52dcfb4225fda614c38ba5997a4ec72cbd5260a624125174416e547ff9eb9b8c AS dotnet-aspnet-10.0 +FROM mcr.microsoft.com/dotnet/aspnet:11.0-preview@sha256:65a932bd7101f50eb99f8b45e2c970851092e0090304a48faf1c9f6c456d60ff AS dotnet-aspnet-11.0 FROM dotnet-aspnet-${SDK_VERSION} AS runtime WORKDIR /app diff --git a/global.json b/global.json index 853a24b6bec..21fb2e9f2a5 100644 --- a/global.json +++ b/global.json @@ -2,6 +2,6 @@ "sdk": { "rollForward": "latestMajor", "allowPrerelease": false, - "version": "10.0.102" + "version": "11.0.100-preview.1.26104.118" } } diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCertificateManager.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCertificateManager.cs index 24c29fe85c6..25066a25259 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, (string?)null); -#else - clientCertificate = new X509Certificate2(clientCertificatePath); -#endif } catch (Exception ex) when (ex is CryptographicException || ex is InvalidDataException || ex is FormatException) { diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpSecureHttpClientFactory.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpSecureHttpClientFactory.cs index ff9bde7812a..d29f8e72568 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpSecureHttpClientFactory.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpSecureHttpClientFactory.cs @@ -197,11 +197,8 @@ private void ConfigureCaCertificateValidation() return false; } -#if NET9_0_OR_GREATER using var caCert = X509CertificateLoader.LoadCertificate(caCertData); -#else - using var caCert = new X509Certificate2(caCertData); -#endif + return OtlpCertificateManager.ValidateServerCertificate( cert, chain, diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OpenTelemetry.Exporter.OpenTelemetryProtocol.csproj b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OpenTelemetry.Exporter.OpenTelemetryProtocol.csproj index 668c164c84c..9430b205a36 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OpenTelemetry.Exporter.OpenTelemetryProtocol.csproj +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OpenTelemetry.Exporter.OpenTelemetryProtocol.csproj @@ -21,11 +21,6 @@ true - - - - - diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptionsExtensions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptionsExtensions.cs index c00c7e14efb..33526aff45e 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptionsExtensions.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptionsExtensions.cs @@ -171,7 +171,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 72f121b9508..400314198e2 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/PersistentStorage/FileBlob.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/PersistentStorage/FileBlob.cs @@ -88,7 +88,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 6d2fd821cbb..142afa4b59e 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/PersistentStorage/PersistentStorageHelper.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/PersistentStorage/PersistentStorageHelper.cs @@ -37,7 +37,13 @@ internal static bool RemoveExpiredLease(DateTime leaseDeadline, string filePath) var fileDateTime = GetDateTimeFromLeaseName(filePath); if (fileDateTime < leaseDeadline) { - var newFilePath = filePath.Substring(0, filePath.LastIndexOf('@')); + var newFilePath = +#if NET11_0_OR_GREATER + filePath.Substring(0, filePath.LastIndexOf('@', StringComparison.Ordinal)); +#else + filePath.Substring(0, filePath.LastIndexOf('@')); +#endif + try { File.Move(filePath, newFilePath); @@ -133,7 +139,13 @@ internal static string CreateSubdirectory(string path) internal static DateTime GetDateTimeFromBlobName(string filePath) { var fileName = Path.GetFileNameWithoutExtension(filePath); - var time = fileName.Substring(0, fileName.LastIndexOf('-')); + + var time = +#if NET11_0_OR_GREATER + fileName.Substring(0, fileName.LastIndexOf('-', StringComparison.Ordinal)); +#else + fileName.Substring(0, fileName.LastIndexOf('-')); +#endif // TODO:Handle possible parsing failure. DateTime.TryParseExact(time, "yyyy-MM-ddTHHmmss.fffffffZ", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dateTime); @@ -143,7 +155,15 @@ internal static DateTime GetDateTimeFromBlobName(string filePath) internal static DateTime GetDateTimeFromLeaseName(string filePath) { var fileName = Path.GetFileNameWithoutExtension(filePath); - var startIndex = fileName.LastIndexOf('@') + 1; + + var startIndex = +#if NET11_0_OR_GREATER + fileName.LastIndexOf('@', StringComparison.Ordinal) +#else + fileName.LastIndexOf('@') +#endif + + 1; + var time = fileName.Substring(startIndex); DateTime.TryParseExact(time, "yyyy-MM-ddTHHmmss.fffffffZ", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dateTime); return dateTime.ToUniversalTime(); diff --git a/src/Shared/Shims/Lock.cs b/src/Shared/Shims/Lock.cs index 8b82deb4d5c..f4f8ddc88bf 100644 --- a/src/Shared/Shims/Lock.cs +++ b/src/Shared/Shims/Lock.cs @@ -1,11 +1,11 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -#if !NET9_0_OR_GREATER +#if !NET namespace OpenTelemetry; -// Note: .NET9 added the System.Threading.Lock class. The goal here is when -// compiling against .NET9+ code should use System.Threading.Lock class for +// Note: .NET 9 added the System.Threading.Lock class. The goal here is when +// compiling against .NET 9+ code should use System.Threading.Lock class for // better perf. Legacy code can use this class which will perform a classic // monitor-based lock against a reference of this class. This type is not in the // System.Threading namespace so that the compiler doesn't get confused when it diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs index 2ae15e66447..95be54951c6 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs @@ -26,6 +26,7 @@ private GrpcRetryTestCase(string testRunnerName, GrpcRetryAttempt[] retryAttempt public static TheoryData GetGrpcTestCases() { +#pragma warning disable CA1825 // Workaround false positive in .NET 11 return [ new("Cancelled", [new(StatusCode.Cancelled)]), @@ -84,6 +85,7 @@ public static TheoryData GetGrpcTestCases() ], expectedRetryAttempts: 9), ]; +#pragma warning restore CA1825 } public override string ToString() diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/HttpRetryTestCase.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/HttpRetryTestCase.cs index 99388a84391..fc543871457 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/HttpRetryTestCase.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/HttpRetryTestCase.cs @@ -28,6 +28,7 @@ private HttpRetryTestCase(string testRunnerName, HttpRetryAttempt[] retryAttempt public static TheoryData GetHttpTestCases() { +#pragma warning disable CA1825 // Workaround false positive in .NET 11 return [ new("NetworkError", [new(statusCode: null)]), @@ -62,6 +63,7 @@ public static TheoryData GetHttpTestCases() new(statusCode: HttpStatusCode.ServiceUnavailable, isDeadlineExceeded: true, expectedSuccess: false) ]), ]; +#pragma warning restore CA1825 // TODO: Add more cases. } diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/IntegrationTest/Dockerfile b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/IntegrationTest/Dockerfile index db0cc41ca9c..fc14da4aadf 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/IntegrationTest/Dockerfile +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/IntegrationTest/Dockerfile @@ -2,15 +2,14 @@ # This should be run from the root of the repo: # docker build --file test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/IntegrationTest/Dockerfile -ARG BUILD_SDK_VERSION=10.0 -ARG TEST_SDK_VERSION=10.0 -FROM mcr.microsoft.com/dotnet/sdk:8.0.418@sha256:58359d0b8fe8237be1d63ac335ca378e2857f976c7f92791f7c84b3c117037f5 AS dotnet-sdk-8.0 -FROM mcr.microsoft.com/dotnet/sdk:9.0.311@sha256:03a7d87512a743b3d53416adae79eb89d2a7163de78bb58e7bc7b7e262e25750 AS dotnet-sdk-9.0 +ARG BUILD_SDK_VERSION=11.0 +ARG TEST_SDK_VERSION=11.0 FROM mcr.microsoft.com/dotnet/sdk:10.0.103@sha256:0a506ab0c8aa077361af42f82569d364ab1b8741e967955d883e3f23683d473a AS dotnet-sdk-10.0 +FROM mcr.microsoft.com/dotnet/sdk:11.0-preview@sha256:c5aa0a301759a1b07654450e10e3ec78c3d476d0537263ca1ab5850d9f302fca AS dotnet-sdk-11.0 FROM dotnet-sdk-${BUILD_SDK_VERSION} AS build ARG PUBLISH_CONFIGURATION=Release -ARG PUBLISH_FRAMEWORK=net10.0 +ARG PUBLISH_FRAMEWORK=net11.0 WORKDIR /repo COPY . ./ WORKDIR "/repo/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests" diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSecureHttpClientFactoryTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSecureHttpClientFactoryTests.cs index 8c41c706800..c68db2f4428 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSecureHttpClientFactoryTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSecureHttpClientFactoryTests.cs @@ -325,13 +325,8 @@ private static X509Certificate2 CreateSelfSignedCertificate() var cert = req.CreateSelfSigned( DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow.AddDays(30)); -#if NET9_0_OR_GREATER + return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#else -#pragma warning disable SYSLIB0057 - return new X509Certificate2(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#pragma warning restore SYSLIB0057 -#endif } private static X509Certificate2 CreateCertificateAuthority() @@ -353,13 +348,7 @@ private static X509Certificate2 CreateCertificateAuthority() DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow.AddYears(1)); -#if NET9_0_OR_GREATER return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#else -#pragma warning disable SYSLIB0057 - return new X509Certificate2(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#pragma warning restore SYSLIB0057 -#endif } private static X509Certificate2 CreateServerCertificate(X509Certificate2 issuer) @@ -390,13 +379,7 @@ private static X509Certificate2 CreateServerCertificate(X509Certificate2 issuer) DateTimeOffset.UtcNow.AddDays(30), serialNumber); -#if NET9_0_OR_GREATER return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#else -#pragma warning disable SYSLIB0057 - return new X509Certificate2(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#pragma warning restore SYSLIB0057 -#endif } private static X509Certificate2 CreateExpiredCertificate() @@ -414,13 +397,7 @@ private static X509Certificate2 CreateExpiredCertificate() DateTimeOffset.UtcNow.AddDays(-30), DateTimeOffset.UtcNow.AddDays(-1)); -#if NET9_0_OR_GREATER return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#else -#pragma warning disable SYSLIB0057 - return new X509Certificate2(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#pragma warning restore SYSLIB0057 -#endif } private static string ExportCertificateWithPrivateKey(X509Certificate2 certificate) diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTlsOptionsTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTlsOptionsTests.cs index 60d811d74f9..2986993eb1f 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTlsOptionsTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTlsOptionsTests.cs @@ -184,13 +184,8 @@ private static X509Certificate2 CreateSelfSignedCertificate() var cert = req.CreateSelfSigned( DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow.AddDays(30)); -#if NET9_0_OR_GREATER + return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#else -#pragma warning disable SYSLIB0057 - return new X509Certificate2(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#pragma warning restore SYSLIB0057 -#endif } private static X509Certificate2 CreateCertificateAuthority() @@ -212,13 +207,7 @@ private static X509Certificate2 CreateCertificateAuthority() DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow.AddYears(1)); -#if NET9_0_OR_GREATER return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#else -#pragma warning disable SYSLIB0057 - return new X509Certificate2(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#pragma warning restore SYSLIB0057 -#endif } private static X509Certificate2 CreateServerCertificate(X509Certificate2 issuer) @@ -249,13 +238,7 @@ private static X509Certificate2 CreateServerCertificate(X509Certificate2 issuer) DateTimeOffset.UtcNow.AddDays(30), serialNumber); -#if NET9_0_OR_GREATER return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#else -#pragma warning disable SYSLIB0057 - return new X509Certificate2(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); -#pragma warning restore SYSLIB0057 -#endif } private static string ExportCertificateWithPrivateKey(X509Certificate2 certificate) diff --git a/test/OpenTelemetry.Exporter.Zipkin.Tests/Implementation/RemoteEndpointPriorityTestCase.cs b/test/OpenTelemetry.Exporter.Zipkin.Tests/Implementation/RemoteEndpointPriorityTestCase.cs index 527961bc816..b31c95bdd76 100644 --- a/test/OpenTelemetry.Exporter.Zipkin.Tests/Implementation/RemoteEndpointPriorityTestCase.cs +++ b/test/OpenTelemetry.Exporter.Zipkin.Tests/Implementation/RemoteEndpointPriorityTestCase.cs @@ -10,6 +10,7 @@ namespace OpenTelemetry.Exporter.Zipkin.Implementation.Tests; public class RemoteEndpointPriorityTestCase #pragma warning restore CA1515 // Consider making public types internal { +#pragma warning disable CA1825 // Workaround false positive in .NET 11 public static TheoryData TestCases => [ new() @@ -146,6 +147,7 @@ public class RemoteEndpointPriorityTestCase }, }, ]; +#pragma warning restore CA1825 public string? Name { get; private set; } diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj index e6488243a49..127cfca822f 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj @@ -35,6 +35,8 @@ + + diff --git a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile index 7aa6c6187ff..3598e744f9f 100644 --- a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile +++ b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile @@ -2,8 +2,8 @@ # This should be run from the root of the repo: # docker build --file test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile . -ARG BUILD_SDK_VERSION=10.0 -ARG TEST_SDK_VERSION=10.0 +ARG BUILD_SDK_VERSION=11.0 +ARG TEST_SDK_VERSION=11.0 FROM ubuntu:24.04@sha256:cd1dba651b3080c3686ecf4e3c4220f026b521fb76978881737d24f200828b2b AS w3c #Install git @@ -11,13 +11,12 @@ WORKDIR /w3c RUN apt-get update && apt-get install -y git RUN git clone --branch level-1 https://github.com/w3c/trace-context.git -FROM mcr.microsoft.com/dotnet/sdk:8.0.418@sha256:58359d0b8fe8237be1d63ac335ca378e2857f976c7f92791f7c84b3c117037f5 AS dotnet-sdk-8.0 -FROM mcr.microsoft.com/dotnet/sdk:9.0.311@sha256:03a7d87512a743b3d53416adae79eb89d2a7163de78bb58e7bc7b7e262e25750 AS dotnet-sdk-9.0 FROM mcr.microsoft.com/dotnet/sdk:10.0.103@sha256:0a506ab0c8aa077361af42f82569d364ab1b8741e967955d883e3f23683d473a AS dotnet-sdk-10.0 +FROM mcr.microsoft.com/dotnet/sdk:11.0-preview@sha256:c5aa0a301759a1b07654450e10e3ec78c3d476d0537263ca1ab5850d9f302fca AS dotnet-sdk-11.0 FROM dotnet-sdk-${BUILD_SDK_VERSION} AS build ARG PUBLISH_CONFIGURATION=Release -ARG PUBLISH_FRAMEWORK=net10.0 +ARG PUBLISH_FRAMEWORK=net11.0 WORKDIR /repo COPY . ./ WORKDIR "/repo/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests" diff --git a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/OpenTelemetry.Instrumentation.W3cTraceContext.Tests.csproj b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/OpenTelemetry.Instrumentation.W3cTraceContext.Tests.csproj index f1305869116..300d53feacb 100644 --- a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/OpenTelemetry.Instrumentation.W3cTraceContext.Tests.csproj +++ b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/OpenTelemetry.Instrumentation.W3cTraceContext.Tests.csproj @@ -6,7 +6,6 @@ - diff --git a/test/OpenTelemetry.Tests/Metrics/Base2ExponentialBucketHistogramHelperTests.cs b/test/OpenTelemetry.Tests/Metrics/Base2ExponentialBucketHistogramHelperTests.cs index fae1f502e08..16e656787dc 100644 --- a/test/OpenTelemetry.Tests/Metrics/Base2ExponentialBucketHistogramHelperTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/Base2ExponentialBucketHistogramHelperTests.cs @@ -18,7 +18,9 @@ public Base2ExponentialBucketHistogramHelperTests(ITestOutputHelper output) public static TheoryData GetNonPositiveScales() { +#pragma warning disable CA1825 // Workaround false positive in .NET 11 TheoryData theoryData = []; +#pragma warning restore CA1825 for (var i = -11; i <= 0; ++i) { theoryData.Add(i); @@ -29,7 +31,9 @@ public static TheoryData GetNonPositiveScales() public static TheoryData GetPositiveScales() { +#pragma warning disable CA1825 // Workaround false positive in .NET 11 TheoryData theoryData = []; +#pragma warning restore CA1825 for (var i = 1; i <= 20; ++i) { theoryData.Add(i); diff --git a/test/OpenTelemetry.Tests/Metrics/MetricTestData.cs b/test/OpenTelemetry.Tests/Metrics/MetricTestData.cs index 0a8e45630c5..3b43ca3c55b 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricTestData.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricTestData.cs @@ -7,6 +7,7 @@ namespace OpenTelemetry.Metrics.Tests; internal static class MetricTestData { +#pragma warning disable CA1825 // Workaround false positive in .NET 11 public static TheoryData InvalidInstrumentNames => [ @@ -39,6 +40,7 @@ public static TheoryData InvalidHistogramBoundaries [0.0, 1.0, 1.0, 2.0], [0.0, 1.0, 2.0, -1.0], ]; +#pragma warning restore CA1825 public static TheoryData ValidHistogramMinMax => new() From 44b57c4e711d2b84ba3003261b01ac067dca9cac Mon Sep 17 00:00:00 2001 From: martincostello Date: Sun, 15 Feb 2026 16:16:16 +0000 Subject: [PATCH 02/55] Bump System.Diagnostics.DiagnosticSource Update System.Diagnostics.DiagnosticSource to 11.0.* that was missed in the previous commit and fix some missed analyzer warnings. --- Directory.Packages.props | 2 +- .../PrometheusExporterApplicationBuilderExtensions.cs | 4 ++++ .../PrometheusExporterEndpointRouteBuilderExtensions.cs | 4 ++++ .../PrometheusHttpListener.cs | 8 ++++++-- .../W3CTraceContextTests.cs | 8 +++++++- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 9105a49c8c4..7cfbaf22981 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -37,7 +37,7 @@ See https://github.com/open-telemetry/opentelemetry-dotnet/issues/5973 for more details. --> - + - + diff --git a/test/OpenTelemetry.Tests/Metrics/Base2ExponentialBucketHistogramHelperTests.cs b/test/OpenTelemetry.Tests/Metrics/Base2ExponentialBucketHistogramHelperTests.cs index 16e656787dc..163625f676f 100644 --- a/test/OpenTelemetry.Tests/Metrics/Base2ExponentialBucketHistogramHelperTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/Base2ExponentialBucketHistogramHelperTests.cs @@ -18,7 +18,7 @@ public Base2ExponentialBucketHistogramHelperTests(ITestOutputHelper output) public static TheoryData GetNonPositiveScales() { -#pragma warning disable CA1825 // Workaround false positive in .NET 11 +#pragma warning disable CA1825 // HACK Workaround for https://github.com/dotnet/sdk/issues/53047 TheoryData theoryData = []; #pragma warning restore CA1825 for (var i = -11; i <= 0; ++i) @@ -31,7 +31,7 @@ public static TheoryData GetNonPositiveScales() public static TheoryData GetPositiveScales() { -#pragma warning disable CA1825 // Workaround false positive in .NET 11 +#pragma warning disable CA1825 // HACK Workaround for https://github.com/dotnet/sdk/issues/53047 TheoryData theoryData = []; #pragma warning restore CA1825 for (var i = 1; i <= 20; ++i) diff --git a/test/OpenTelemetry.Tests/Metrics/MetricTestData.cs b/test/OpenTelemetry.Tests/Metrics/MetricTestData.cs index 3b43ca3c55b..bb015aa5c6a 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricTestData.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricTestData.cs @@ -7,7 +7,7 @@ namespace OpenTelemetry.Metrics.Tests; internal static class MetricTestData { -#pragma warning disable CA1825 // Workaround false positive in .NET 11 +#pragma warning disable CA1825 // HACK Workaround for https://github.com/dotnet/sdk/issues/53047 public static TheoryData InvalidInstrumentNames => [ From 7ed07efdbc6448480ce030e9c996f47f8c3a405c Mon Sep 17 00:00:00 2001 From: martincostello Date: Sun, 15 Feb 2026 16:53:15 +0000 Subject: [PATCH 05/55] Update CompatibilitySuppressions Update CompatibilitySuppressions for .NET 11. --- .../CompatibilitySuppressions.xml | 31 +++++ .../CompatibilitySuppressions.xml | 17 +++ .../CompatibilitySuppressions.xml | 17 +++ .../CompatibilitySuppressions.xml | 115 ++++++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 src/OpenTelemetry.Api/CompatibilitySuppressions.xml create mode 100644 src/OpenTelemetry.Exporter.Console/CompatibilitySuppressions.xml create mode 100644 src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CompatibilitySuppressions.xml create mode 100644 src/OpenTelemetry/CompatibilitySuppressions.xml diff --git a/src/OpenTelemetry.Api/CompatibilitySuppressions.xml b/src/OpenTelemetry.Api/CompatibilitySuppressions.xml new file mode 100644 index 00000000000..9e2229812c9 --- /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 + + \ No newline at end of file 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..0570db9c038 --- /dev/null +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CompatibilitySuppressions.xml @@ -0,0 +1,17 @@ + + + + CP0008 + T:OpenTelemetry.Exporter.OtlpExportProtocol + lib/net8.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/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 + + From f361c14ef271b61b8ab97ad1139aacd4983025f3 Mon Sep 17 00:00:00 2001 From: martincostello Date: Sun, 15 Feb 2026 16:55:06 +0000 Subject: [PATCH 06/55] Add EOL Add missing final new line. --- src/OpenTelemetry.Api/CompatibilitySuppressions.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenTelemetry.Api/CompatibilitySuppressions.xml b/src/OpenTelemetry.Api/CompatibilitySuppressions.xml index 9e2229812c9..c720e262130 100644 --- a/src/OpenTelemetry.Api/CompatibilitySuppressions.xml +++ b/src/OpenTelemetry.Api/CompatibilitySuppressions.xml @@ -28,4 +28,4 @@ lib/netstandard2.0/OpenTelemetry.Api.dll true - \ No newline at end of file + From 3e5d0a1cc087d827b05067b25350af9b12ec432c Mon Sep 17 00:00:00 2001 From: martincostello Date: Wed, 11 Mar 2026 15:07:42 +0000 Subject: [PATCH 07/55] Update to .NET 11 preview 2 Update to preview 2 of .NET 11. --- Directory.Packages.props | 20 +++++++++---------- .../MicroserviceExample/WebApi/Dockerfile | 4 ++-- .../WorkerService/Dockerfile | 4 ++-- global.json | 2 +- .../IntegrationTest/Dockerfile | 2 +- .../Dockerfile | 2 +- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 97439894fbf..2f5e062eeda 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -12,10 +12,10 @@ --> - - - - + + + + @@ -25,10 +25,10 @@ - - - - + + + + - + + preview true $([System.IO.Directory]::GetParent($(MSBuildThisFileDirectory)).Parent.FullName) $(MSBuildThisFileDirectory)debug.snk diff --git a/docs/logs/extending-the-sdk/MyExporter.cs b/docs/logs/extending-the-sdk/MyExporter.cs index 25b2d9809e1..3e6f146a8cb 100644 --- a/docs/logs/extending-the-sdk/MyExporter.cs +++ b/docs/logs/extending-the-sdk/MyExporter.cs @@ -30,7 +30,7 @@ public override ExportResult Export(in Batch batch) sb.Append($"{record}("); - int scopeDepth = -1; + var scopeDepth = -1; record.ForEachScope(ProcessScope, sb); diff --git a/docs/metrics/customizing-the-sdk/Program.cs b/docs/metrics/customizing-the-sdk/Program.cs index cdcb6dcbbaf..6259028cf5f 100644 --- a/docs/metrics/customizing-the-sdk/Program.cs +++ b/docs/metrics/customizing-the-sdk/Program.cs @@ -59,43 +59,43 @@ public static void Main() var random = new Random(); var counter = Meter1.CreateCounter("MyCounter"); - for (int i = 0; i < 20000; i++) + for (var i = 0; i < 20000; i++) { counter.Add(1, new("tag1", "value1"), new("tag2", "value2")); } var histogram = Meter1.CreateHistogram("MyHistogram"); - for (int i = 0; i < 20000; i++) + for (var i = 0; i < 20000; i++) { histogram.Record(random.Next(1, 1000), new("tag1", "value1"), new("tag2", "value2")); } var exponentialBucketHistogram = Meter1.CreateHistogram("MyExponentialBucketHistogram"); - for (int i = 0; i < 20000; i++) + for (var i = 0; i < 20000; i++) { exponentialBucketHistogram.Record(random.Next(1, 1000), new("tag1", "value1"), new("tag2", "value2")); } var histogramWithMultipleAggregations = Meter1.CreateHistogram("histogramWithMultipleAggregations"); - for (int i = 0; i < 20000; i++) + for (var i = 0; i < 20000; i++) { histogramWithMultipleAggregations.Record(random.Next(1, 1000), new("tag1", "value1"), new("tag2", "value2")); } var counterCustomTags = Meter1.CreateCounter("MyCounterCustomTags"); - for (int i = 0; i < 20000; i++) + for (var i = 0; i < 20000; i++) { counterCustomTags.Add(1, new("tag1", "value1"), new("tag2", "value2"), new("tag3", "value4")); } var counterDrop = Meter1.CreateCounter("MyCounterDrop"); - for (int i = 0; i < 20000; i++) + for (var i = 0; i < 20000; i++) { counterDrop.Add(1, new("tag1", "value1"), new("tag2", "value2")); } var histogram2 = Meter2.CreateHistogram("MyHistogram2"); - for (int i = 0; i < 20000; i++) + for (var i = 0; i < 20000; i++) { histogram2.Record(random.Next(1, 1000), new("tag1", "value1"), new("tag2", "value2")); } diff --git a/docs/metrics/learning-more-instruments/Program.cs b/docs/metrics/learning-more-instruments/Program.cs index 9acbcac5639..5f340eef4dc 100644 --- a/docs/metrics/learning-more-instruments/Program.cs +++ b/docs/metrics/learning-more-instruments/Program.cs @@ -30,7 +30,7 @@ public static void Main() .Build(); var random = new Random(); - for (int i = 0; i < 1000; i++) + for (var i = 0; i < 1000; i++) { MyHistogram.Record(random.Next(1, 1000)); } diff --git a/docs/trace/customizing-the-sdk/Program.cs b/docs/trace/customizing-the-sdk/Program.cs index 1cc63b0fcc5..a8723a41a95 100644 --- a/docs/trace/customizing-the-sdk/Program.cs +++ b/docs/trace/customizing-the-sdk/Program.cs @@ -33,11 +33,11 @@ public static void Main() // The following adds subscription to activities from all Activity Sources // whose name starts with "AbcCompany.XyzProduct.". .AddSource("AbcCompany.XyzProduct.*") - .ConfigureResource(resource => resource.AddAttributes(new List> - { + .ConfigureResource(resource => resource.AddAttributes( + [ new KeyValuePair("static-attribute1", "v1"), new KeyValuePair("static-attribute2", "v2"), - })) + ])) .ConfigureResource(resource => resource.AddService("MyServiceName")) .AddConsoleExporter() .Build(); diff --git a/docs/trace/links-based-sampler/Program.cs b/docs/trace/links-based-sampler/Program.cs index 03827633820..c9fd986d7e0 100644 --- a/docs/trace/links-based-sampler/Program.cs +++ b/docs/trace/links-based-sampler/Program.cs @@ -11,7 +11,7 @@ internal static class Program { private static readonly ActivitySource MyActivitySource = new("LinksAndParentBasedSampler.Example"); - public static void Main(string[] args) + public static void Main() { using var tracerProvider = Sdk.CreateTracerProviderBuilder() .SetSampler(new LinksAndParentBasedSampler(new ParentBasedSampler(new TraceIdRatioBasedSampler(0.2)))) @@ -44,7 +44,7 @@ private static List GetActivityLinks(int seed) for (var i = 0; i < 5; i++) { - int randomValue = random.Next(10); + var randomValue = random.Next(10); var traceFlags = (randomValue == 0) ? ActivityTraceFlags.Recorded : ActivityTraceFlags.None; var context = new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), traceFlags); linkedActivitiesList.Add(new ActivityLink(context)); diff --git a/docs/trace/links-creation-with-new-activities/Program.cs b/docs/trace/links-creation-with-new-activities/Program.cs index 1568930d998..dda79dcc7e4 100644 --- a/docs/trace/links-creation-with-new-activities/Program.cs +++ b/docs/trace/links-creation-with-new-activities/Program.cs @@ -11,23 +11,19 @@ internal static class Program { private static readonly ActivitySource MyActivitySource = new("LinksCreationWithNewRootActivities"); - public static async Task Main(string[] args) + public static async Task Main() { using var tracerProvider = Sdk.CreateTracerProviderBuilder() .AddSource("LinksCreationWithNewRootActivities") .AddConsoleExporter() .Build(); - using (var activity = MyActivitySource.StartActivity("OrchestratingActivity")) - { - activity?.SetTag("foo", 1); - await DoFanoutAsync().ConfigureAwait(false); + using var activity = MyActivitySource.StartActivity("OrchestratingActivity"); + activity?.SetTag("foo", 1); + await DoFanoutAsync().ConfigureAwait(false); - using (var nestedActivity = MyActivitySource.StartActivity("WrapUp")) - { - nestedActivity?.SetTag("foo", 1); - } - } + using var nestedActivity = MyActivitySource.StartActivity("WrapUp"); + nestedActivity?.SetTag("foo", 1); } public static async Task DoFanoutAsync() @@ -38,7 +34,7 @@ public static async Task DoFanoutAsync() var activityContext = Activity.Current!.Context; var links = new List { - new ActivityLink(activityContext), + new(activityContext), }; var tasks = new List(); @@ -47,9 +43,9 @@ public static async Task DoFanoutAsync() // We create a new root activity for each operation and // link it to an outer activity that happens to be the current // activity. - for (int i = 0; i < NumConcurrentOperations; i++) + for (var i = 0; i < NumConcurrentOperations; i++) { - int operationIndex = i; + var operationIndex = i; var task = Task.Run(() => { diff --git a/docs/trace/stratified-sampling-example/Program.cs b/docs/trace/stratified-sampling-example/Program.cs index 8063dd4f046..c98a6e30b5b 100644 --- a/docs/trace/stratified-sampling-example/Program.cs +++ b/docs/trace/stratified-sampling-example/Program.cs @@ -11,7 +11,7 @@ internal sealed class Program { private static readonly ActivitySource MyActivitySource = new("StratifiedSampling.POC"); - public static void Main(string[] args) + public static void Main() { // We wrap the stratified sampler within a parentbased sampler. // This is to enable downstream participants (i.e., the non-root spans) to have @@ -47,10 +47,9 @@ public static void Main(string[] args) using (var activity = MyActivitySource.StartActivity(ActivityKind.Internal, parentContext: default, tags: tagsList)) { activity?.SetTag("foo", "bar"); - using (var activity2 = MyActivitySource.StartActivity(ActivityKind.Internal, parentContext: default, tags: tagsList)) - { - activity2?.SetTag("foo", "child"); - } + + using var activity2 = MyActivitySource.StartActivity(ActivityKind.Internal, parentContext: default, tags: tagsList); + activity2?.SetTag("foo", "child"); } tagsList.Clear(); diff --git a/docs/trace/stratified-sampling-example/StratifiedSampler.cs b/docs/trace/stratified-sampling-example/StratifiedSampler.cs index 64cbe8a4c84..dbb7b7978d0 100644 --- a/docs/trace/stratified-sampling-example/StratifiedSampler.cs +++ b/docs/trace/stratified-sampling-example/StratifiedSampler.cs @@ -15,8 +15,8 @@ internal sealed class StratifiedSampler : Sampler private const string QueryTypeUserInitiated = "userInitiated"; private const string QueryTypeProgrammatic = "programmatic"; - private readonly Dictionary samplingRatios = new(); - private readonly List samplers = new(); + private readonly Dictionary samplingRatios = []; + private readonly List samplers = []; public StratifiedSampler() { diff --git a/docs/trace/tail-based-sampling-span-level/Program.cs b/docs/trace/tail-based-sampling-span-level/Program.cs index d2114248442..ecb9c96d193 100644 --- a/docs/trace/tail-based-sampling-span-level/Program.cs +++ b/docs/trace/tail-based-sampling-span-level/Program.cs @@ -11,7 +11,7 @@ internal static class Program { private static readonly ActivitySource MyActivitySource = new("SDK.TailSampling.POC"); - public static void Main(string[] args) + public static void Main() { using var tracerProvider = Sdk.CreateTracerProviderBuilder() .SetSampler(new ParentBasedElseAlwaysRecordSampler()) @@ -25,21 +25,19 @@ public static void Main(string[] args) // Generate some spans for (var i = 0; i < 50; i++) { - using (var activity = MyActivitySource.StartActivity("SayHello")) - { - activity?.SetTag("foo", "bar"); + using var activity = MyActivitySource.StartActivity("SayHello"); + activity?.SetTag("foo", "bar"); - // Simulate a mix of failed and successful spans - var randomValue = random.Next(5); - switch (randomValue) - { - case 0: - activity?.SetStatus(ActivityStatusCode.Error); - break; - default: - activity?.SetStatus(ActivityStatusCode.Ok); - break; - } + // Simulate a mix of failed and successful spans + var randomValue = random.Next(5); + switch (randomValue) + { + case 0: + activity?.SetStatus(ActivityStatusCode.Error); + break; + default: + activity?.SetStatus(ActivityStatusCode.Ok); + break; } } } diff --git a/examples/AspNetCore/Controllers/WeatherForecastController.cs b/examples/AspNetCore/Controllers/WeatherForecastController.cs index 0850496b7e7..70095ec7109 100644 --- a/examples/AspNetCore/Controllers/WeatherForecastController.cs +++ b/examples/AspNetCore/Controllers/WeatherForecastController.cs @@ -1,14 +1,13 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -namespace Examples.AspNetCore.Controllers; - using System.Diagnostics; using System.Diagnostics.Metrics; using System.Security.Cryptography; -using Examples.AspNetCore; using Microsoft.AspNetCore.Mvc; +namespace Examples.AspNetCore.Controllers; + [ApiController] [Route("[controller]")] public partial class WeatherForecastController : ControllerBase diff --git a/examples/AspNetCore/InstrumentationSource.cs b/examples/AspNetCore/InstrumentationSource.cs index be6d5764033..e76c5a71ccc 100644 --- a/examples/AspNetCore/InstrumentationSource.cs +++ b/examples/AspNetCore/InstrumentationSource.cs @@ -1,11 +1,11 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -namespace Examples.AspNetCore; - using System.Diagnostics; using System.Diagnostics.Metrics; +namespace Examples.AspNetCore; + /// /// It is recommended to use a custom type to hold references for /// ActivitySource and Instruments. This avoids possible type collisions @@ -19,7 +19,7 @@ public sealed class InstrumentationSource : IDisposable public InstrumentationSource() { - string? version = typeof(InstrumentationSource).Assembly.GetName().Version?.ToString(); + var version = typeof(InstrumentationSource).Assembly.GetName().Version?.ToString(); this.ActivitySource = new ActivitySource(ActivitySourceName, version); this.meter = new Meter(MeterName, version); this.FreezingDaysCounter = this.meter.CreateCounter("weather.days.freezing", description: "The number of days where the temperature is below freezing"); diff --git a/examples/AspNetCore/Program.cs b/examples/AspNetCore/Program.cs index a102993397d..ee3eaabe34a 100644 --- a/examples/AspNetCore/Program.cs +++ b/examples/AspNetCore/Program.cs @@ -38,7 +38,7 @@ appBuilder.Services.AddOpenTelemetry() .ConfigureResource(r => r .AddService( - serviceName: appBuilder.Configuration.GetValue("ServiceName", defaultValue: "otel-test")!, + serviceName: appBuilder.Configuration.GetValue("ServiceName", defaultValue: "otel-test"), serviceVersion: typeof(Program).Assembly.GetName().Version?.ToString() ?? "unknown", serviceInstanceId: Environment.MachineName)) .WithTracing(builder => @@ -107,7 +107,7 @@ builder.AddOtlpExporter(otlpOptions => { // Use IConfiguration directly for Otlp exporter endpoint option. - otlpOptions.Endpoint = new Uri(appBuilder.Configuration.GetValue("Otlp:Endpoint", defaultValue: "http://localhost:4317")!); + otlpOptions.Endpoint = new Uri(appBuilder.Configuration.GetValue("Otlp:Endpoint", defaultValue: "http://localhost:4317")); }); break; default: diff --git a/examples/Console/InstrumentationWithActivitySource.cs b/examples/Console/InstrumentationWithActivitySource.cs index e591ea12505..9190931cd39 100644 --- a/examples/Console/InstrumentationWithActivitySource.cs +++ b/examples/Console/InstrumentationWithActivitySource.cs @@ -53,7 +53,7 @@ public void Start(string url) var headerKeys = context.Request.Headers.AllKeys; foreach (var headerKey in headerKeys) { - string? headerValue = context.Request.Headers[headerKey]; + var headerValue = context.Request.Headers[headerKey]; activity?.SetTag($"http.header.{headerKey}", headerValue); } diff --git a/examples/Console/Program.cs b/examples/Console/Program.cs index 29137e2df8e..b96afe351b6 100644 --- a/examples/Console/Program.cs +++ b/examples/Console/Program.cs @@ -28,8 +28,7 @@ internal static class Program /// (eg: C:\repos\opentelemetry-dotnet\examples\Console\). /// /// Arguments from command line. - public static void Main(string[] args) - { + public static void Main(string[] args) => Parser.Default.ParseArguments(args) .MapResult( (PrometheusOptions options) => TestPrometheusExporter.Run(options), @@ -37,13 +36,12 @@ public static void Main(string[] args) (LogsOptions options) => TestLogs.Run(options), (GrpcNetClientOptions options) => TestGrpcNetClient.Run(options), (HttpClientOptions options) => TestHttpClient.Run(options), - (ConsoleOptions options) => TestConsoleExporter.Run(options), - (OpenTelemetryShimOptions options) => TestOTelShimWithConsoleExporter.Run(options), - (OpenTracingShimOptions options) => TestOpenTracingShim.Run(options), + (ConsoleOptions options) => TestConsoleExporter.Run(), + (OpenTelemetryShimOptions options) => TestOTelShimWithConsoleExporter.Run(), + (OpenTracingShimOptions options) => TestOpenTracingShim.Run(), (OtlpOptions options) => TestOtlpExporter.Run(options), - (InMemoryOptions options) => TestInMemoryExporter.Run(options), - errs => 1); - } + (InMemoryOptions options) => TestInMemoryExporter.Run(), + _ => 1); } #pragma warning disable SA1402 // File may only contain a single type @@ -84,29 +82,19 @@ internal sealed class MetricsOptions } [Verb("grpc", HelpText = "Specify the options required to test Grpc.Net.Client")] -internal sealed class GrpcNetClientOptions -{ -} +internal sealed class GrpcNetClientOptions; [Verb("httpclient", HelpText = "Specify the options required to test HttpClient")] -internal sealed class HttpClientOptions -{ -} +internal sealed class HttpClientOptions; [Verb("console", HelpText = "Specify the options required to test console exporter")] -internal sealed class ConsoleOptions -{ -} +internal sealed class ConsoleOptions; [Verb("otelshim", HelpText = "Specify the options required to test OpenTelemetry Shim with console exporter")] -internal sealed class OpenTelemetryShimOptions -{ -} +internal sealed class OpenTelemetryShimOptions; [Verb("opentracing", HelpText = "Specify the options required to test OpenTracing Shim with console exporter")] -internal sealed class OpenTracingShimOptions -{ -} +internal sealed class OpenTracingShimOptions; [Verb("otlp", HelpText = "Specify the options required to test OpenTelemetry Protocol (OTLP)")] internal sealed class OtlpOptions @@ -138,8 +126,6 @@ internal sealed class LogsOptions } [Verb("inmemory", HelpText = "Specify the options required to test InMemory Exporter")] -internal sealed class InMemoryOptions -{ -} +internal sealed class InMemoryOptions; #pragma warning restore SA1402 // File may only contain a single type diff --git a/examples/Console/TestConsoleExporter.cs b/examples/Console/TestConsoleExporter.cs index fa59c3a9954..c57f613f3e3 100644 --- a/examples/Console/TestConsoleExporter.cs +++ b/examples/Console/TestConsoleExporter.cs @@ -15,12 +15,7 @@ internal sealed class TestConsoleExporter // (eg: C:\repos\opentelemetry-dotnet\examples\Console\) // // dotnet run console - internal static int Run(ConsoleOptions options) - { - return RunWithActivitySource(); - } - - private static int RunWithActivitySource() + public static int Run() { // Enable OpenTelemetry for the sources "Samples.SampleServer" and "Samples.SampleClient" // and use Console exporter. diff --git a/examples/Console/TestInMemoryExporter.cs b/examples/Console/TestInMemoryExporter.cs index d3b30db60ff..8c9efdb1ece 100644 --- a/examples/Console/TestInMemoryExporter.cs +++ b/examples/Console/TestInMemoryExporter.cs @@ -15,7 +15,7 @@ internal sealed class TestInMemoryExporter // (eg: C:\repos\opentelemetry-dotnet\examples\Console\) // // dotnet run inmemory - internal static int Run(InMemoryOptions options) + internal static int Run() { // List that will be populated with the traces by InMemoryExporter var exportedItems = new List(); diff --git a/examples/Console/TestOTelShimWithConsoleExporter.cs b/examples/Console/TestOTelShimWithConsoleExporter.cs index 4dbb22ff9db..34f280edccb 100644 --- a/examples/Console/TestOTelShimWithConsoleExporter.cs +++ b/examples/Console/TestOTelShimWithConsoleExporter.cs @@ -9,7 +9,7 @@ namespace Examples.Console; internal sealed class TestOTelShimWithConsoleExporter { - internal static int Run(OpenTelemetryShimOptions options) + internal static int Run() { // Enable OpenTelemetry for the source "MyCompany.MyProduct.MyWebServer" // and use a single pipeline with a custom MyProcessor, and Console exporter. diff --git a/examples/Console/TestOpenTracingShim.cs b/examples/Console/TestOpenTracingShim.cs index 77ab8d6c7d0..b54fcf8651c 100644 --- a/examples/Console/TestOpenTracingShim.cs +++ b/examples/Console/TestOpenTracingShim.cs @@ -6,13 +6,12 @@ using OpenTelemetry.Resources; using OpenTelemetry.Shims.OpenTracing; using OpenTelemetry.Trace; -using OpenTracing; namespace Examples.Console; internal sealed class TestOpenTracingShim { - internal static int Run(OpenTracingShimOptions options) + internal static int Run() { // Enable OpenTelemetry for the source "opentracing-shim" // and use Console exporter. @@ -40,13 +39,13 @@ internal static int Run(OpenTracingShimOptions options) // The code below is meant to resemble application code that has been instrumented // with the OpenTracing API. - using (IScope parentScope = openTracingTracer.BuildSpan("Parent").StartActive(finishSpanOnDispose: true)) + using (var parentScope = openTracingTracer.BuildSpan("Parent").StartActive(finishSpanOnDispose: true)) { parentScope.Span.SetTag("my", "value"); parentScope.Span.SetOperationName("parent span new name"); // The child scope will automatically use parentScope as its parent. - using IScope childScope = openTracingTracer.BuildSpan("Child").StartActive(finishSpanOnDispose: true); + using var childScope = openTracingTracer.BuildSpan("Child").StartActive(finishSpanOnDispose: true); childScope.Span.SetTag("Child Tag", "Child Tag Value").SetTag("ch", "value").SetTag("more", "attributes"); } diff --git a/src/OpenTelemetry.Api/Baggage.cs b/src/OpenTelemetry.Api/Baggage.cs index ca8661e06bd..317131227b8 100644 --- a/src/OpenTelemetry.Api/Baggage.cs +++ b/src/OpenTelemetry.Api/Baggage.cs @@ -94,8 +94,8 @@ public static Baggage Create(Dictionary? baggageItems = null) return default; } - Dictionary baggageCopy = new Dictionary(baggageItems.Count, StringComparer.Ordinal); - foreach (KeyValuePair baggageItem in baggageItems) + var baggageCopy = new Dictionary(baggageItems.Count, StringComparer.Ordinal); + foreach (var baggageItem in baggageItems) { if (string.IsNullOrEmpty(baggageItem.Value)) { @@ -226,7 +226,7 @@ public IReadOnlyDictionary GetBaggage() { Guard.ThrowIfNullOrEmpty(name); - return this.baggage != null && this.baggage.TryGetValue(name, out string? value) + return this.baggage != null && this.baggage.TryGetValue(name, out var value) ? value : null; } @@ -252,7 +252,11 @@ public Baggage SetBaggage(string name, string? value) return new Baggage( new Dictionary(this.baggage ?? EmptyBaggage, StringComparer.Ordinal) { +#if NET + [name] = value, +#else [name] = value!, +#endif }); } @@ -290,7 +294,11 @@ public Baggage SetBaggage(IEnumerable> baggageItem } else { +#if NET + newBaggage[item.Key] = item.Value; +#else newBaggage[item.Key] = item.Value!; +#endif } } @@ -329,14 +337,15 @@ public Dictionary.Enumerator GetEnumerator() /// public bool Equals(Baggage other) { - bool baggageIsNullOrEmpty = this.baggage == null || this.baggage.Count <= 0; + var baggageIsNullOrEmpty = this.baggage == null || this.baggage.Count <= 0; - if (baggageIsNullOrEmpty != (other.baggage == null || other.baggage.Count <= 0)) - { - return false; - } - - return baggageIsNullOrEmpty || this.baggage!.SequenceEqual(other.baggage!); + return + baggageIsNullOrEmpty == (other.baggage == null || other.baggage.Count <= 0) && +#if NET + (baggageIsNullOrEmpty || this.baggage!.SequenceEqual(other.baggage!)); +#else + (baggageIsNullOrEmpty || this.baggage.SequenceEqual(other.baggage)); +#endif } /// diff --git a/src/OpenTelemetry.Api/Context/Propagation/B3Propagator.cs b/src/OpenTelemetry.Api/Context/Propagation/B3Propagator.cs index 56c353f4a28..c4a69cfd756 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; @@ -88,14 +88,7 @@ public override PropagationContext Extract(PropagationContext context, T carr return context; } - if (this.singleHeader) - { - return ExtractFromSingleHeader(context, carrier, getter); - } - else - { - return ExtractFromMultipleHeaders(context, carrier, getter); - } + return this.singleHeader ? ExtractFromSingleHeader(context, carrier, getter) : ExtractFromMultipleHeaders(context, carrier, getter); } /// @@ -208,8 +201,14 @@ private static PropagationContext ExtractFromSingleHeader(PropagationContext return context; } - var parts = header!.Split(XB3CombinedDelimiter); - if (parts.Length < 2 || parts.Length > 4) + var parts = +#if NET + header.Split(XB3CombinedDelimiter); +#else + header!.Split(XB3CombinedDelimiter); +#endif + + if (parts.Length is < 2 or > 4) { return context; } diff --git a/src/OpenTelemetry.Api/Context/Propagation/BaggagePropagator.cs b/src/OpenTelemetry.Api/Context/Propagation/BaggagePropagator.cs index 3a0dca61219..be150770fe6 100644 --- a/src/OpenTelemetry.Api/Context/Propagation/BaggagePropagator.cs +++ b/src/OpenTelemetry.Api/Context/Propagation/BaggagePropagator.cs @@ -52,9 +52,16 @@ public override PropagationContext Extract(PropagationContext context, T carr var baggageCollection = getter(carrier, BaggageHeaderName); if (baggageCollection?.Any() ?? false) { - if (TryExtractBaggage([.. baggageCollection], out var baggage)) + if (TryExtractBaggage([.. baggageCollection], out var baggageItems)) { - return new PropagationContext(context.ActivityContext, new Baggage(baggage!)); + Baggage baggage = +#if NET + new(baggageItems); +#else + new(baggageItems!); +#endif + + return new PropagationContext(context.ActivityContext, baggage); } } @@ -85,13 +92,13 @@ public override void Inject(PropagationContext context, T carrier, Action item = e.Current; + var item = e.Current; if (string.IsNullOrEmpty(item.Value)) { continue; @@ -112,8 +119,8 @@ internal static bool TryExtractBaggage( #endif out Dictionary? baggage) { - int baggageLength = -1; - bool done = false; + var baggageLength = -1; + var done = false; Dictionary? baggageDictionary = null; foreach (var item in baggageCollection) diff --git a/src/OpenTelemetry.Api/Context/Propagation/CompositeTextMapPropagator.cs b/src/OpenTelemetry.Api/Context/Propagation/CompositeTextMapPropagator.cs index d0375aadc71..b1032eaa017 100644 --- a/src/OpenTelemetry.Api/Context/Propagation/CompositeTextMapPropagator.cs +++ b/src/OpenTelemetry.Api/Context/Propagation/CompositeTextMapPropagator.cs @@ -43,13 +43,13 @@ public CompositeTextMapPropagator(IEnumerable propagators) } else { - ISet? fields = this.propagators[0].Fields; + var fields = this.propagators[0].Fields; var output = fields is not null ? new HashSet(fields) : []; - for (int i = 1; i < this.propagators.Count; i++) + for (var i = 1; i < this.propagators.Count; i++) { fields = this.propagators[i].Fields; if (fields is not null) @@ -68,7 +68,7 @@ public CompositeTextMapPropagator(IEnumerable propagators) /// public override PropagationContext Extract(PropagationContext context, T carrier, Func?> getter) { - for (int i = 0; i < this.propagators.Count; i++) + for (var i = 0; i < this.propagators.Count; i++) { context = this.propagators[i].Extract(context, carrier, getter); } @@ -79,7 +79,7 @@ public override PropagationContext Extract(PropagationContext context, T carr /// public override void Inject(PropagationContext context, T carrier, Action setter) { - for (int i = 0; i < this.propagators.Count; i++) + for (var i = 0; i < this.propagators.Count; i++) { this.propagators[i].Inject(context, carrier, setter); } diff --git a/src/OpenTelemetry.Api/Context/Propagation/TraceContextPropagator.cs b/src/OpenTelemetry.Api/Context/Propagation/TraceContextPropagator.cs index a00f8e8beb1..66ddc493807 100644 --- a/src/OpenTelemetry.Api/Context/Propagation/TraceContextPropagator.cs +++ b/src/OpenTelemetry.Api/Context/Propagation/TraceContextPropagator.cs @@ -122,7 +122,7 @@ public override void Inject(PropagationContext context, T carrier, Action 0) { setter(carrier, TraceState, tracestateStr); @@ -228,13 +228,13 @@ internal static bool TryExtractTracestate(string[] tracestateCollection, out str { var keySet = new HashSet(); var result = new StringBuilder(); - for (int i = 0; i < tracestateCollection.Length; ++i) + for (var i = 0; i < tracestateCollection.Length; ++i) { var tracestate = tracestateCollection[i].AsSpan(); - int begin = 0; + var begin = 0; while (begin < tracestate.Length) { - int length = tracestate.Slice(begin).IndexOf(','); + var length = tracestate.Slice(begin).IndexOf(','); ReadOnlySpan listMember; if (length != -1) { @@ -262,7 +262,7 @@ internal static bool TryExtractTracestate(string[] tracestateCollection, out str return false; } - int keyLength = listMember.IndexOf('='); + var keyLength = listMember.IndexOf('='); if (keyLength == listMember.Length || keyLength == -1) { // Missing key or value in tracestate @@ -312,19 +312,11 @@ internal static bool TryExtractTracestate(string[] tracestateCollection, out str } private static byte HexCharToByte(char c) - { - if ((c >= '0') && (c <= '9')) - { - return (byte)(c - '0'); - } - - if ((c >= 'a') && (c <= 'f')) - { - return (byte)(c - 'a' + 10); - } - - throw new ArgumentOutOfRangeException(nameof(c), c, "Must be within: [0-9] or [a-f]"); - } + => c is >= '0' and <= '9' + ? (byte)(c - '0') + : c is >= 'a' and <= 'f' + ? (byte)(c - 'a' + 10) + : throw new ArgumentOutOfRangeException(nameof(c), c, "Must be within: [0-9] or [a-f]"); private static bool ValidateKey(ReadOnlySpan key) { @@ -333,7 +325,7 @@ private static bool ValidateKey(ReadOnlySpan key) // It will be slightly differently from the next version of specification in GitHub repository. // There are two format for the key. The length rule applies to both. - if (key.Length <= 0 || key.Length > TraceStateKeyMaxLength) + if (key.Length is <= 0 or > TraceStateKeyMaxLength) { return false; } @@ -349,10 +341,10 @@ private static bool ValidateKey(ReadOnlySpan key) return false; } - int tenantLength = -1; - for (int i = 1; i < key.Length; ++i) + var tenantLength = -1; + for (var i = 1; i < key.Length; ++i) { - char ch = key[i]; + var ch = key[i]; if (ch == '@') { tenantLength = i; @@ -377,20 +369,20 @@ private static bool ValidateKey(ReadOnlySpan key) // The second format: // key = (lcalpha / DIGIT) 0 * 240(lcalpha / DIGIT / "_" / "-" / "*" / "/") "@" lcalpha 0 * 13(lcalpha / DIGIT / "_" / "-" / "*" / "/") - if (tenantLength == 0 || tenantLength > TraceStateKeyTenantMaxLength) + if (tenantLength is 0 or > TraceStateKeyTenantMaxLength) { return false; } - int vendorLength = key.Length - tenantLength - 1; - if (vendorLength == 0 || vendorLength > TraceStateKeyVendorMaxLength) + var vendorLength = key.Length - tenantLength - 1; + if (vendorLength is 0 or > TraceStateKeyVendorMaxLength) { return false; } - for (int i = tenantLength + 1; i < key.Length; ++i) + for (var i = tenantLength + 1; i < key.Length; ++i) { - char ch = key[i]; + var ch = key[i]; if (!(IsLowerAlphaDigit(ch) || ch == '_' || ch == '-' @@ -410,29 +402,27 @@ private static bool ValidateValue(ReadOnlySpan value) // value = 0*255(chr) nblk-chr // nblk - chr = % x21 - 2B / % x2D - 3C / % x3E - 7E // chr = % x20 / nblk - chr - if (value.Length <= 0 || value.Length > TraceStateValueMaxLength) + if (value.Length is <= 0 or > TraceStateValueMaxLength) { return false; } - for (int i = 0; i < value.Length - 1; ++i) + for (var i = 0; i < value.Length - 1; ++i) { - char c = value[i]; - if (!(c >= 0x20 && c <= 0x7E && c != 0x2C && c != 0x3D)) + var c = value[i]; + if (c is not (>= (char)0x20 and <= (char)0x7E and not (char)0x2C and not (char)0x3D)) { return false; } } - char last = value[value.Length - 1]; - return last >= 0x21 && last <= 0x7E && last != 0x2C && last != 0x3D; + var last = value[value.Length - 1]; + return last is >= (char)0x21 and <= (char)0x7E and not (char)0x2C and not (char)0x3D; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static bool IsLowerAlphaDigit(char c) - { - return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z'); - } + => c is (>= '0' and <= '9') or (>= 'a' and <= 'z'); #if NET private static void WriteTraceParentIntoSpan(Span destination, ActivityContext context) diff --git a/src/OpenTelemetry.Api/Context/Propagation/TraceStateUtils.cs b/src/OpenTelemetry.Api/Context/Propagation/TraceStateUtils.cs index d81291b5052..255c072bc8d 100644 --- a/src/OpenTelemetry.Api/Context/Propagation/TraceStateUtils.cs +++ b/src/OpenTelemetry.Api/Context/Propagation/TraceStateUtils.cs @@ -31,7 +31,7 @@ internal static bool AppendTraceState(string traceStateString, List(); @@ -41,7 +41,7 @@ internal static bool AppendTraceState(string traceStateString, List(keyStr, value.ToString())); +#else tracestate!.Add(new KeyValuePair(keyStr, value.ToString())); +#endif } else { @@ -82,7 +86,11 @@ internal static bool AppendTraceState(string traceStateString, List>? trac var sb = new StringBuilder(); - int ind = 0; + var ind = 0; foreach (var entry in traceState) { if (ind++ < MaxKeyValuePairsCount) @@ -191,12 +199,10 @@ private static bool ValidateKey(ReadOnlySpan key) break; } - if (!(c >= 'a' && c <= 'z') - && !(c >= '0' && c <= '9') - && c != '_' - && c != '-' - && c != '*' - && c != '/') + if (c is not (>= 'a' and <= 'z') and not (>= '0' and <= '9') and not '_' + and not '-' + and not '*' + and not '/') { return false; } @@ -205,34 +211,32 @@ private static bool ValidateKey(ReadOnlySpan key) i++; // skip @ or increment further than key.Length var vendorLength = key.Length - i; - if (vendorLength == 0 || vendorLength > 14) + if (vendorLength is not 0 and <= 14) { - // vendor name should be at least 1 to 14 character long - return false; - } - - if (vendorLength > 0 && i > 242) - { - // tenant section should be less than 241 characters long - return false; - } - - for (; i < key.Length; i++) - { - var c = key[i]; - - if (!(c >= 'a' && c <= 'z') - && !(c >= '0' && c <= '9') - && c != '_' - && c != '-' - && c != '*' - && c != '/') + if (vendorLength > 0 && i > 242) { + // tenant section should be less than 241 characters long return false; } + + for (; i < key.Length; i++) + { + var c = key[i]; + + if (c is not (>= 'a' and <= 'z') and not (>= '0' and <= '9') and not '_' + and not '-' + and not '*' + and not '/') + { + return false; + } + } + + return true; } - return true; + // vendor name should be at least 1 to 14 character long + return false; } private static bool ValidateValue(ReadOnlySpan value) @@ -247,7 +251,7 @@ private static bool ValidateValue(ReadOnlySpan value) foreach (var c in value) { - if (c == ',' || c == '=' || c < ' ' /* '\u0020' */ || c > '~' /* '\u007E' */) + if (c is ',' or '=' or < ' ' /* '\u0020' */ or > '~' /* '\u007E' */) { return false; } diff --git a/src/OpenTelemetry.Api/Logs/LogRecordAttributeList.cs b/src/OpenTelemetry.Api/Logs/LogRecordAttributeList.cs index 96621ee27ed..cbe7c58bd5d 100644 --- a/src/OpenTelemetry.Api/Logs/LogRecordAttributeList.cs +++ b/src/OpenTelemetry.Api/Logs/LogRecordAttributeList.cs @@ -41,10 +41,9 @@ struct LogRecordAttributeList : IReadOnlyList> private KeyValuePair attribute6; private KeyValuePair attribute7; private KeyValuePair attribute8; - private int count; /// - public readonly int Count => this.count; + public int Count { get; private set; } /// public KeyValuePair this[int index] @@ -57,23 +56,20 @@ readonly get return this.OverflowAttributes[index]; } - if ((uint)index >= (uint)this.count) - { - throw new ArgumentOutOfRangeException(nameof(index)); - } - - return index switch - { - 0 => this.attribute1, - 1 => this.attribute2, - 2 => this.attribute3, - 3 => this.attribute4, - 4 => this.attribute5, - 5 => this.attribute6, - 6 => this.attribute7, - 7 => this.attribute8, - _ => default, // we shouldn't come here anyway. - }; + return (uint)index >= (uint)this.Count + ? throw new ArgumentOutOfRangeException(nameof(index)) + : index switch + { + 0 => this.attribute1, + 1 => this.attribute2, + 2 => this.attribute3, + 3 => this.attribute4, + 4 => this.attribute5, + 5 => this.attribute6, + 6 => this.attribute7, + 7 => this.attribute8, + _ => default, // we shouldn't come here anyway. + }; } set @@ -85,7 +81,7 @@ readonly get return; } - if ((uint)index >= (uint)this.count) + if ((uint)index >= (uint)this.Count) { throw new ArgumentOutOfRangeException(nameof(index)); } @@ -133,7 +129,7 @@ public static LogRecordAttributeList CreateFromEnumerable(IEnumerableAttribute. public void Add(KeyValuePair attribute) { - var count = this.count++; + var count = this.Count++; if (count <= OverflowMaxCount) { @@ -168,11 +164,18 @@ public void Add(KeyValuePair attribute) case 8: this.MoveAttributesToTheOverflowList(); break; + default: + break; } } Debug.Assert(this.OverflowAttributes is not null, "Overflow attributes creation failure."); + +#if NET + this.OverflowAttributes.Add(attribute); +#else this.OverflowAttributes!.Add(attribute); +#endif } /// @@ -180,7 +183,7 @@ public void Add(KeyValuePair attribute) /// public void Clear() { - this.count = 0; + this.Count = 0; this.OverflowAttributes?.Clear(); } @@ -212,7 +215,7 @@ public readonly Enumerator GetEnumerator() internal readonly IReadOnlyList> Export(ref List>? attributeStorage) { - int readonlyCount = this.count; + var readonlyCount = this.Count; if (readonlyCount <= 0) { return Empty; @@ -227,7 +230,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); @@ -279,9 +282,9 @@ public readonly Enumerator GetEnumerator() private void MoveAttributesToTheOverflowList() { - Debug.Assert(this.count - 1 == OverflowMaxCount, "count did not match OverflowMaxCount"); + Debug.Assert(this.Count - 1 == OverflowMaxCount, "count did not match OverflowMaxCount"); - var attributes = this.OverflowAttributes ??= new(OverflowAdditionalCapacity); + var attributes = this.OverflowAttributes ??= [with(OverflowAdditionalCapacity)]; attributes.Add(this.attribute1); attributes.Add(this.attribute2); diff --git a/src/OpenTelemetry.Api/Logs/LogRecordData.cs b/src/OpenTelemetry.Api/Logs/LogRecordData.cs index 374b95d736a..0889ce0b6fb 100644 --- a/src/OpenTelemetry.Api/Logs/LogRecordData.cs +++ b/src/OpenTelemetry.Api/Logs/LogRecordData.cs @@ -89,7 +89,7 @@ public LogRecordData(in ActivityContext activityContext) public DateTime Timestamp { readonly get => this.TimestampBacking; - set { this.TimestampBacking = value.Kind == DateTimeKind.Local ? value.ToUniversalTime() : value; } + set => this.TimestampBacking = value.Kind == DateTimeKind.Local ? value.ToUniversalTime() : value; } /// diff --git a/src/OpenTelemetry.Api/Logs/LogRecordSeverityExtensions.cs b/src/OpenTelemetry.Api/Logs/LogRecordSeverityExtensions.cs index 14e6e846cdd..57d52e6165b 100644 --- a/src/OpenTelemetry.Api/Logs/LogRecordSeverityExtensions.cs +++ b/src/OpenTelemetry.Api/Logs/LogRecordSeverityExtensions.cs @@ -103,9 +103,9 @@ static class LogRecordSeverityExtensions /// cref="LogRecordSeverity"/>. public static string ToShortName(this LogRecordSeverity logRecordSeverity) { - int severityLevel = (int)logRecordSeverity; + var severityLevel = (int)logRecordSeverity; - if (severityLevel < 0 || severityLevel > 24) + if (severityLevel is < 0 or > 24) { severityLevel = 0; } diff --git a/src/OpenTelemetry.Api/Logs/Logger.cs b/src/OpenTelemetry.Api/Logs/Logger.cs index 019860d08d1..6214cee9f13 100644 --- a/src/OpenTelemetry.Api/Logs/Logger.cs +++ b/src/OpenTelemetry.Api/Logs/Logger.cs @@ -31,7 +31,11 @@ protected Logger(string? name) { this.Name = string.IsNullOrWhiteSpace(name) ? string.Empty +#if NET10_0_OR_GREATER + : name; +#else : name!; +#endif } /// @@ -60,9 +64,5 @@ public abstract void EmitLog( in LogRecordData data, in LogRecordAttributeList attributes); - internal void SetInstrumentationScope( - string? version) - { - this.Version = version; - } + internal void SetInstrumentationScope(string? version) => this.Version = version; } diff --git a/src/OpenTelemetry.Api/Logs/LoggerProvider.cs b/src/OpenTelemetry.Api/Logs/LoggerProvider.cs index c01a9ffd923..f7f6fccf947 100644 --- a/src/OpenTelemetry.Api/Logs/LoggerProvider.cs +++ b/src/OpenTelemetry.Api/Logs/LoggerProvider.cs @@ -73,7 +73,11 @@ Logger GetLogger(string? name, string? version) return NoopLogger; } +#if NET + logger.SetInstrumentationScope(version); +#else logger!.SetInstrumentationScope(version); +#endif return logger; } diff --git a/src/OpenTelemetry.Api/Trace/ActivityExtensions.cs b/src/OpenTelemetry.Api/Trace/ActivityExtensions.cs index b22339267ba..4bb0f1a9662 100644 --- a/src/OpenTelemetry.Api/Trace/ActivityExtensions.cs +++ b/src/OpenTelemetry.Api/Trace/ActivityExtensions.cs @@ -45,6 +45,8 @@ public static void SetStatus(this Activity? activity, Status status) case StatusCode.Error: activity.SetStatus(ActivityStatusCode.Error, status.Description); break; + default: + break; } activity.SetTag(SpanAttributeConstants.StatusCodeKey, StatusHelper.GetTagValueForStatusCode(status.StatusCode)); @@ -70,12 +72,13 @@ public static Status GetStatus(this Activity? activity) { if (activity != null) { - switch (activity.Status) + if (activity.Status is ActivityStatusCode.Ok) + { + return Status.Ok; + } + else if (activity.Status is ActivityStatusCode.Error) { - case ActivityStatusCode.Ok: - return Status.Ok; - case ActivityStatusCode.Error: - return new Status(StatusCode.Error, activity.StatusDescription); + return new Status(StatusCode.Error, activity.StatusDescription); } if (activity.TryGetStatus(out var statusCode, out var statusDescription)) diff --git a/src/OpenTelemetry.Api/Trace/SpanAttributes.cs b/src/OpenTelemetry.Api/Trace/SpanAttributes.cs index 5975830c98c..65bd8cbdaa4 100644 --- a/src/OpenTelemetry.Api/Trace/SpanAttributes.cs +++ b/src/OpenTelemetry.Api/Trace/SpanAttributes.cs @@ -17,7 +17,7 @@ public class SpanAttributes /// public SpanAttributes() { - this.Attributes = new ActivityTagsCollection(); + this.Attributes = []; } /// @@ -29,7 +29,7 @@ public SpanAttributes(IEnumerable> attributes) { Guard.ThrowIfNull(attributes); - foreach (KeyValuePair kvp in attributes) + foreach (var kvp in attributes) { this.AddInternal(kvp.Key, kvp.Value); } @@ -43,9 +43,7 @@ public SpanAttributes(IEnumerable> attributes) /// Entry key. /// Entry value. public void Add(string key, long value) - { - this.AddInternal(key, value); - } + => this.AddInternal(key, value); /// /// Add entry to the attributes. @@ -53,9 +51,7 @@ public void Add(string key, long value) /// Entry key. /// Entry value. public void Add(string key, string? value) - { - this.AddInternal(key, value); - } + => this.AddInternal(key, value); /// /// Add entry to the attributes. @@ -63,9 +59,7 @@ public void Add(string key, string? value) /// Entry key. /// Entry value. public void Add(string key, bool value) - { - this.AddInternal(key, value); - } + => this.AddInternal(key, value); /// /// Add entry to the attributes. @@ -73,9 +67,7 @@ public void Add(string key, bool value) /// Entry key. /// Entry value. public void Add(string key, double value) - { - this.AddInternal(key, value); - } + => this.AddInternal(key, value); /// /// Add entry to the attributes. @@ -83,9 +75,7 @@ public void Add(string key, double value) /// Entry key. /// Entry value. public void Add(string key, long[]? values) - { - this.AddInternal(key, values); - } + => this.AddInternal(key, values); /// /// Add entry to the attributes. @@ -93,9 +83,7 @@ public void Add(string key, long[]? values) /// Entry key. /// Entry value. public void Add(string key, string?[]? values) - { - this.AddInternal(key, values); - } + => this.AddInternal(key, values); /// /// Add entry to the attributes. @@ -103,9 +91,7 @@ public void Add(string key, string?[]? values) /// Entry key. /// Entry value. public void Add(string key, bool[]? values) - { - this.AddInternal(key, values); - } + => this.AddInternal(key, values); /// /// Add entry to the attributes. @@ -113,9 +99,7 @@ public void Add(string key, bool[]? values) /// Entry key. /// Entry value. public void Add(string key, double[]? values) - { - this.AddInternal(key, values); - } + => this.AddInternal(key, values); private void AddInternal(string key, object? value) { diff --git a/src/OpenTelemetry.Api/Trace/SpanContext.cs b/src/OpenTelemetry.Api/Trace/SpanContext.cs index 9ebab851122..3baf72907f7 100644 --- a/src/OpenTelemetry.Api/Trace/SpanContext.cs +++ b/src/OpenTelemetry.Api/Trace/SpanContext.cs @@ -90,7 +90,13 @@ public IEnumerable> TraceState } var traceStateResult = new List>(); + +#if NET + TraceStateUtils.AppendTraceState(traceState, traceStateResult); +#else TraceStateUtils.AppendTraceState(traceState!, traceStateResult); +#endif + return traceStateResult; } } diff --git a/src/OpenTelemetry.Api/Trace/TelemetrySpan.cs b/src/OpenTelemetry.Api/Trace/TelemetrySpan.cs index 0b5ce40141f..7ef4f989b83 100644 --- a/src/OpenTelemetry.Api/Trace/TelemetrySpan.cs +++ b/src/OpenTelemetry.Api/Trace/TelemetrySpan.cs @@ -300,7 +300,7 @@ public TelemetrySpan RecordException(Exception? ex) /// The instance for chaining. public TelemetrySpan RecordException(string? type, string? message, string? stacktrace) { - SpanAttributes attributes = new SpanAttributes(); + var attributes = new SpanAttributes(); if (!string.IsNullOrWhiteSpace(type)) { diff --git a/src/OpenTelemetry.Api/Trace/TracerProvider.cs b/src/OpenTelemetry.Api/Trace/TracerProvider.cs index c566e3f05e9..98abff3b015 100644 --- a/src/OpenTelemetry.Api/Trace/TracerProvider.cs +++ b/src/OpenTelemetry.Api/Trace/TracerProvider.cs @@ -57,9 +57,7 @@ public Tracer GetTracer( string name, string? version, IEnumerable>? tags) - { - return this.GetTracer(name, version, null, tags); - } + => this.GetTracer(name, version, null, tags); /// /// Gets a tracer with given name, version and tags. @@ -108,7 +106,7 @@ public Tracer GetTracer( }; tracer = new(new(activitySourceOptions)); - bool result = tracers.TryAdd(key, tracer); + var result = tracers.TryAdd(key, tracer); #if DEBUG System.Diagnostics.Debug.Assert(result, "Write into tracers cache failed"); #endif @@ -160,16 +158,9 @@ public TracerKey(string? name, string? version, string? schemaUrl, IEnumerable string.Equals(this.Name, other.Name, StringComparison.Ordinal) && + string.Equals(this.Version, other.Version, StringComparison.Ordinal) && + string.Equals(this.SchemaUrl, other.SchemaUrl, StringComparison.Ordinal) && AreTagsEqual(this.Tags, other.Tags); public override int GetHashCode() { @@ -205,7 +196,7 @@ private static bool AreTagsEqual( return false; } - for (int i = 0; i < tags1.Length; i++) + for (var i = 0; i < tags1.Length; i++) { var kvp1 = tags1[i]; var kvp2 = tags2[i]; @@ -255,7 +246,7 @@ private static int GetTagsHashCode( #endif if (kvp.Value != null) { - hash = (hash * 31) + kvp.Value.GetHashCode()!; + hash = (hash * 31) + kvp.Value.GetHashCode(); } } } @@ -275,7 +266,7 @@ private static int GetTagsHashCode( orderedTagList.Sort((left, right) => { // First compare by key - int keyComparison = string.Compare(left.Key, right.Key, StringComparison.Ordinal); + var keyComparison = string.Compare(left.Key, right.Key, StringComparison.Ordinal); if (keyComparison != 0) { return keyComparison; diff --git a/src/OpenTelemetry.Exporter.Console/ConsoleLogRecordExporter.cs b/src/OpenTelemetry.Exporter.Console/ConsoleLogRecordExporter.cs index 84fd449532b..f141c1268a6 100644 --- a/src/OpenTelemetry.Exporter.Console/ConsoleLogRecordExporter.cs +++ b/src/OpenTelemetry.Exporter.Console/ConsoleLogRecordExporter.cs @@ -84,7 +84,7 @@ public override ExportResult Export(in Batch batch) if (logRecord.Attributes != null) { this.WriteLine("LogRecord.Attributes (Key:Value):"); - for (int i = 0; i < logRecord.Attributes.Count; i++) + for (var i = 0; i < logRecord.Attributes.Count; i++) { // Special casing {OriginalFormat} // See https://github.com/open-telemetry/opentelemetry-dotnet/pull/3182 @@ -114,7 +114,7 @@ public override ExportResult Export(in Batch batch) this.WriteLine($"{"LogRecord.Exception:",-RightPaddingLength}{logRecord.Exception.ToInvariantString()}"); } - int scopeDepth = -1; + var scopeDepth = -1; logRecord.ForEachScope(ProcessScope, this); @@ -125,7 +125,7 @@ void ProcessScope(LogRecordScope scope, ConsoleLogRecordExporter exporter) exporter.WriteLine("LogRecord.ScopeValues (Key:Value):"); } - foreach (KeyValuePair scopeItem in scope) + foreach (var scopeItem in scope) { if (this.TagWriter.TryTransformTag(scopeItem, out var result)) { diff --git a/src/OpenTelemetry.Exporter.Console/ConsoleMetricExporter.cs b/src/OpenTelemetry.Exporter.Console/ConsoleMetricExporter.cs index 660560c21ba..923d1b570d3 100644 --- a/src/OpenTelemetry.Exporter.Console/ConsoleMetricExporter.cs +++ b/src/OpenTelemetry.Exporter.Console/ConsoleMetricExporter.cs @@ -92,8 +92,8 @@ public override ExportResult Export(in Batch batch) foreach (ref readonly var metricPoint in metric.GetMetricPoints()) { - string valueDisplay = string.Empty; - StringBuilder tagsBuilder = new StringBuilder(); + var valueDisplay = string.Empty; + var tagsBuilder = new StringBuilder(); foreach (var tag in metricPoint.Tags) { if (this.TagWriter.TryTransformTag(tag, out var result)) @@ -111,7 +111,7 @@ public override ExportResult Export(in Batch batch) var metricType = metric.MetricType; - if (metricType == MetricType.Histogram || metricType == MetricType.ExponentialHistogram) + if (metricType is MetricType.Histogram or MetricType.ExponentialHistogram) { var bucketsBuilder = new StringBuilder(); var sum = metricPoint.GetHistogramSum(); @@ -121,7 +121,7 @@ public override ExportResult Export(in Batch batch) #else bucketsBuilder.Append($"Sum: {sum} Count: {count} "); #endif - if (metricPoint.TryGetHistogramMinMaxValues(out double min, out double max)) + if (metricPoint.TryGetHistogramMinMaxValues(out var min, out var max)) { #if NET bucketsBuilder.Append(CultureInfo.InvariantCulture, $"Min: {min} Max: {max} "); @@ -134,7 +134,7 @@ public override ExportResult Export(in Batch batch) if (metricType == MetricType.Histogram) { - bool isFirstIteration = true; + var isFirstIteration = true; double previousExplicitBound = default; foreach (var histogramMeasurement in metricPoint.GetHistogramBuckets()) { @@ -235,7 +235,7 @@ public override ExportResult Export(in Batch batch) exemplarString.Append(exemplar.SpanId.ToHexString()); } - bool appendedTagString = false; + var appendedTagString = false; foreach (var tag in exemplar.FilteredTags) { if (this.TagWriter.TryTransformTag(tag, out var result)) diff --git a/src/OpenTelemetry.Exporter.Console/Implementation/ConsoleTagWriter.cs b/src/OpenTelemetry.Exporter.Console/Implementation/ConsoleTagWriter.cs index 4950bd100e5..9277c5e1942 100644 --- a/src/OpenTelemetry.Exporter.Console/Implementation/ConsoleTagWriter.cs +++ b/src/OpenTelemetry.Exporter.Console/Implementation/ConsoleTagWriter.cs @@ -16,13 +16,15 @@ public ConsoleTagWriter(Action onUnsupportedTagDropped) { Debug.Assert(onUnsupportedTagDropped != null, "onUnsupportedTagDropped was null"); +#if NET + this.onUnsupportedTagDropped = onUnsupportedTagDropped; +#else this.onUnsupportedTagDropped = onUnsupportedTagDropped!; +#endif } public bool TryTransformTag(KeyValuePair tag, out KeyValuePair result) - { - return this.TryTransformTag(tag.Key, tag.Value, out result); - } + => this.TryTransformTag(tag.Key, tag.Value, out result); public bool TryTransformTag(string key, object? value, out KeyValuePair result) { @@ -64,15 +66,17 @@ protected override void WriteStringTag(ref ConsoleTag consoleTag, string key, Re protected override void WriteArrayTag(ref ConsoleTag consoleTag, string key, ArraySegment arrayUtf8JsonBytes) { consoleTag.Key = key; +#if NET consoleTag.Value = Encoding.UTF8.GetString(arrayUtf8JsonBytes.Array!, 0, arrayUtf8JsonBytes.Count); +#else + consoleTag.Value = Encoding.UTF8.GetString(arrayUtf8JsonBytes.Array, 0, arrayUtf8JsonBytes.Count); +#endif } protected override void OnUnsupportedTagDropped( string tagKey, string tagValueTypeFullName) - { - this.onUnsupportedTagDropped(tagKey, tagValueTypeFullName); - } + => this.onUnsupportedTagDropped(tagKey, tagValueTypeFullName); protected override bool TryWriteEmptyTag(ref ConsoleTag consoleTag, string key, object? value) { diff --git a/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterLoggingExtensions.cs b/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterLoggingExtensions.cs index 2b665f7a293..ff76afc5d7f 100644 --- a/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterLoggingExtensions.cs +++ b/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterLoggingExtensions.cs @@ -56,7 +56,7 @@ public static LoggerProviderBuilder AddInMemoryExporter( private static InMemoryExporter BuildExporter(ICollection exportedItems) { return new InMemoryExporter( - exportFunc: (in Batch batch) => ExportLogRecord(in batch, exportedItems)); + exportFunc: (in batch) => ExportLogRecord(in batch, exportedItems)); } private static ExportResult ExportLogRecord(in Batch batch, ICollection exportedItems) diff --git a/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterMetricsExtensions.cs b/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterMetricsExtensions.cs index a9cc18eb029..acd19298132 100644 --- a/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterMetricsExtensions.cs +++ b/src/OpenTelemetry.Exporter.InMemory/InMemoryExporterMetricsExtensions.cs @@ -168,7 +168,7 @@ private static PeriodicExportingMetricReader BuildInMemoryExporterMetricReader( { #pragma warning disable CA2000 // Dispose objects before losing scope var metricExporter = new InMemoryExporter( - exportFunc: (in Batch metricBatch) => ExportMetricSnapshot(in metricBatch, exportedItems)); + exportFunc: (in metricBatch) => ExportMetricSnapshot(in metricBatch, exportedItems)); #pragma warning restore CA2000 // Dispose objects before losing scope return PeriodicExportingMetricReaderHelper.CreatePeriodicExportingMetricReader( diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Builder/OtlpExporterBuilder.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Builder/OtlpExporterBuilder.cs index d5a04aa60f2..2efc283986f 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Builder/OtlpExporterBuilder.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Builder/OtlpExporterBuilder.cs @@ -24,8 +24,6 @@ internal OtlpExporterBuilder( string? name, IConfiguration? configuration) { - Debug.Assert(services != null, "services was null"); - if (configuration != null) { if (string.IsNullOrEmpty(name)) @@ -33,15 +31,17 @@ internal OtlpExporterBuilder( name = "otlp"; } - BindConfigurationToOptions(services!, name!, configuration); +#pragma warning disable IDE0370 // Suppression is unnecessary + BindConfigurationToOptions(services, name!, configuration); +#pragma warning restore IDE0370 // Suppression is unnecessary } name ??= Options.DefaultName; - RegisterOtlpExporterServices(services!, name); + RegisterOtlpExporterServices(services, name); this.name = name; - this.Services = services!; + this.Services = services; } public IServiceCollection Services { get; } @@ -119,9 +119,7 @@ public OtlpExporterBuilder ConfigureTracingProcessorOptions( private static void BindConfigurationToOptions(IServiceCollection services, string name, IConfiguration configuration) { - Debug.Assert(services != null, "services was null"); Debug.Assert(!string.IsNullOrEmpty(name), "name was null or empty"); - Debug.Assert(configuration != null, "configuration was null"); /* Config JSON structure is expected to be something like this: { @@ -152,33 +150,30 @@ private static void BindConfigurationToOptions(IServiceCollection services, stri } */ - services!.Configure(name, configuration!); + services.Configure(name, configuration); - services!.Configure( - name, configuration!.GetSection(nameof(OtlpExporterBuilderOptions.LoggingOptions))); + services.Configure( + name, configuration.GetSection(nameof(OtlpExporterBuilderOptions.LoggingOptions))); - services!.Configure( + services.Configure( name, configuration.GetSection(nameof(OtlpExporterBuilderOptions.MetricsOptions))); - services!.Configure( + services.Configure( name, configuration.GetSection(nameof(OtlpExporterBuilderOptions.TracingOptions))); } private static void RegisterOtlpExporterServices(IServiceCollection services, string name) { - Debug.Assert(services != null, "services was null"); - Debug.Assert(name != null, "name was null"); - - services!.AddOtlpExporterLoggingServices(); - services!.AddOtlpExporterMetricsServices(name!); - services!.AddOtlpExporterTracingServices(); + services.AddOtlpExporterLoggingServices(); + services.AddOtlpExporterMetricsServices(name); + services.AddOtlpExporterTracingServices(); // Note: UseOtlpExporterRegistration is added to the service collection // for each invocation to detect repeated calls to "UseOtlpExporter" and // to throw if "AddOtlpExporter" extensions are called - services!.AddSingleton(UseOtlpExporterRegistration.Instance); + services.AddSingleton(UseOtlpExporterRegistration.Instance); - services!.RegisterOptionsFactory((sp, configuration, name) => new OtlpExporterBuilderOptions( + services.RegisterOptionsFactory((sp, configuration, name) => new OtlpExporterBuilderOptions( configuration, /* Note: We don't use name for SdkLimitOptions. There should only be one provider for a given service collection so SdkLimitOptions is @@ -195,10 +190,10 @@ there but that may change in the future so it is handled sp.GetService>()?.Get(name), sp.GetService>()?.Get(name))); - services!.ConfigureOpenTelemetryLoggerProvider( + services.ConfigureOpenTelemetryLoggerProvider( (sp, logging) => { - var builderOptions = GetBuilderOptionsAndValidateRegistrations(sp, name!); + var builderOptions = GetBuilderOptionsAndValidateRegistrations(sp, name); var processor = OtlpLogExporterHelperExtensions.BuildOtlpLogExporter( sp, @@ -213,10 +208,10 @@ there but that may change in the future so it is handled logging.AddProcessor(processor); }); - services!.ConfigureOpenTelemetryMeterProvider( + services.ConfigureOpenTelemetryMeterProvider( (sp, metrics) => { - var builderOptions = GetBuilderOptionsAndValidateRegistrations(sp, name!); + var builderOptions = GetBuilderOptionsAndValidateRegistrations(sp, name); metrics.AddReader( OtlpMetricExporterExtensions.BuildOtlpExporterMetricReader( @@ -227,10 +222,10 @@ there but that may change in the future so it is handled skipUseOtlpExporterRegistrationCheck: true)); }); - services!.ConfigureOpenTelemetryTracerProvider( + services.ConfigureOpenTelemetryTracerProvider( (sp, tracing) => { - var builderOptions = GetBuilderOptionsAndValidateRegistrations(sp, name!); + var builderOptions = GetBuilderOptionsAndValidateRegistrations(sp, name); var processorOptions = builderOptions.ActivityExportProcessorOptions ?? throw new InvalidOperationException("ActivityExportProcessorOptions were missing with tracing enabled"); diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/ExportClient/OtlpGrpcExportClient.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/ExportClient/OtlpGrpcExportClient.cs index 1735d64b98e..521575cb7c8 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/ExportClient/OtlpGrpcExportClient.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/ExportClient/OtlpGrpcExportClient.cs @@ -51,7 +51,7 @@ public override ExportClientResponse SendExportRequest(byte[] buffer, int conten httpResponse.EnsureSuccessStatusCode(); var trailingHeaders = httpResponse.TrailingHeaders(); - Status status = GrpcProtocolHelpers.GetResponseStatus(httpResponse, trailingHeaders); + var status = GrpcProtocolHelpers.GetResponseStatus(httpResponse, trailingHeaders); if (status.Detail.Equals(Status.NoReplyDetailMessage, StringComparison.Ordinal)) { @@ -60,7 +60,7 @@ public override ExportClientResponse SendExportRequest(byte[] buffer, int conten #else using var responseStream = httpResponse.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); #endif - int firstByte = responseStream.ReadByte(); + var firstByte = responseStream.ReadByte(); if (firstByte == -1) { @@ -95,7 +95,7 @@ public override ExportClientResponse SendExportRequest(byte[] buffer, int conten } string? grpcStatusDetailsHeader = null; - if (status.StatusCode == StatusCode.ResourceExhausted || status.StatusCode == StatusCode.Unavailable) + if (status.StatusCode is StatusCode.ResourceExhausted or StatusCode.Unavailable) { grpcStatusDetailsHeader = GrpcProtocolHelpers.GetHeaderValue(trailingHeaders, GrpcStatusDetailsHeader); } diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/ExportClient/OtlpRetry.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/ExportClient/OtlpRetry.cs index b4617a1fd42..54cc5c978a2 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/ExportClient/OtlpRetry.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/ExportClient/OtlpRetry.cs @@ -74,11 +74,9 @@ public static bool TryGetHttpRetryResult(ExportClientHttpResponse response, int } } - public static bool ShouldHandleHttpRequestException(Exception? exception) - { - // TODO: Handle specific exceptions. - return true; - } +#pragma warning disable IDE0060 // Remove unused parameter + public static bool ShouldHandleHttpRequestException(Exception? exception) => true; // TODO: Handle specific exceptions. +#pragma warning restore IDE0060 // Remove unused parameter public static bool TryGetGrpcRetryResult(ExportClientGrpcResponse response, int retryDelayMilliseconds, out RetryResult retryResult) { @@ -183,11 +181,9 @@ private static bool TryGetRetryResult(TStatusCode statusC return true; } + // This implementation is internal, and it is guaranteed that deadline is UTC. private static bool IsDeadlineExceeded(DateTime? deadline) - { - // This implementation is internal, and it is guaranteed that deadline is UTC. - return deadline.HasValue && deadline <= DateTime.UtcNow; - } + => deadline.HasValue && deadline <= DateTime.UtcNow; private static int CalculateNextRetryDelay(int nextRetryDelayMilliseconds) { @@ -199,49 +195,37 @@ private static int CalculateNextRetryDelay(int nextRetryDelayMilliseconds) private static TimeSpan? TryGetHttpRetryDelay(HttpStatusCode statusCode, HttpResponseHeaders? responseHeaders) { #if NETSTANDARD2_1_OR_GREATER || NET - return statusCode == HttpStatusCode.TooManyRequests || statusCode == HttpStatusCode.ServiceUnavailable + return statusCode is HttpStatusCode.TooManyRequests or HttpStatusCode.ServiceUnavailable #else - return statusCode == (HttpStatusCode)429 || statusCode == HttpStatusCode.ServiceUnavailable + return statusCode is (HttpStatusCode)429 or HttpStatusCode.ServiceUnavailable #endif ? responseHeaders?.RetryAfter?.Delta : null; } - private static bool IsGrpcStatusCodeRetryable(StatusCode statusCode, bool hasRetryDelay) +#pragma warning disable IDE0072 // Add missing cases + private static bool IsGrpcStatusCodeRetryable(StatusCode statusCode, bool hasRetryDelay) => statusCode switch +#pragma warning restore IDE0072 // Add missing cases { - switch (statusCode) - { - case StatusCode.Cancelled: - case StatusCode.DeadlineExceeded: - case StatusCode.Aborted: - case StatusCode.OutOfRange: - case StatusCode.Unavailable: - case StatusCode.DataLoss: - return true; - case StatusCode.ResourceExhausted: - return hasRetryDelay; - default: - return false; - } - } - - private static bool IsHttpStatusCodeRetryable(HttpStatusCode statusCode, bool hasRetryDelay) + StatusCode.Cancelled or StatusCode.DeadlineExceeded or StatusCode.Aborted or StatusCode.OutOfRange or StatusCode.Unavailable or StatusCode.DataLoss => true, + StatusCode.ResourceExhausted => hasRetryDelay, + _ => false, + }; + +#pragma warning disable IDE0072 // Add missing cases + private static bool IsHttpStatusCodeRetryable(HttpStatusCode statusCode, bool hasRetryDelay) => statusCode switch +#pragma warning restore IDE0072 // Add missing cases { - switch (statusCode) - { #if NETSTANDARD2_1_OR_GREATER || NET - case HttpStatusCode.TooManyRequests: + HttpStatusCode.TooManyRequests => true, #else - case (HttpStatusCode)429: + (HttpStatusCode)429 => true, #endif - case HttpStatusCode.BadGateway: - case HttpStatusCode.ServiceUnavailable: - case HttpStatusCode.GatewayTimeout: - return true; - default: - return false; - } - } + HttpStatusCode.BadGateway => true, + HttpStatusCode.ServiceUnavailable => true, + HttpStatusCode.GatewayTimeout => true, + _ => false, + }; private static int GetRandomNumber(int min, int max) { diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCertificateManager.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCertificateManager.cs index 25066a25259..c28e3075d4e 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCertificateManager.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpCertificateManager.cs @@ -80,9 +80,9 @@ public static X509Certificate2 LoadClientCertificate( // Try to load as PKCS#12 first, then as PEM try { - clientCertificate = X509CertificateLoader.LoadPkcs12FromFile(clientCertificatePath, (string?)null); + clientCertificate = X509CertificateLoader.LoadPkcs12FromFile(clientCertificatePath, null); } - catch (Exception ex) when (ex is CryptographicException || ex is InvalidDataException || ex is FormatException) + catch (Exception ex) when (ex is CryptographicException or InvalidDataException or FormatException) { // If PKCS#12 fails, try PEM format clientCertificate = X509Certificate2.CreateFromPemFile(clientCertificatePath); @@ -118,7 +118,7 @@ public static X509Certificate2 LoadClientCertificate( try { - X509Certificate2 clientCertificate = X509Certificate2.CreateFromPemFile( + var clientCertificate = X509Certificate2.CreateFromPemFile( clientCertificatePath, clientKeyPath); @@ -165,7 +165,7 @@ public static bool ValidateCertificateChain( chain.ChainPolicy.RevocationMode = X509RevocationMode.Online; chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot; - bool isValid = chain.Build(certificate); + var isValid = chain.Build(certificate); if (!isValid) { @@ -180,18 +180,15 @@ public static bool ValidateCertificateChain( string.Join("; ", errors)); // Check if certificate is expired - this should throw an exception - bool isExpired = chain.ChainStatus.Any(status => - status.Status == X509ChainStatusFlags.NotTimeValid || - status.Status == X509ChainStatusFlags.NotTimeNested); + var isExpired = chain.ChainStatus.Any(status => + status.Status is X509ChainStatusFlags.NotTimeValid or + X509ChainStatusFlags.NotTimeNested); - if (isExpired) - { - throw new InvalidOperationException( + return isExpired + ? throw new InvalidOperationException( $"Certificate chain validation failed for {certificateType}: Certificate is expired. " + - $"Errors: {string.Join("; ", errors)}"); - } - - return false; + $"Errors: {string.Join("; ", errors)}") + : false; } OpenTelemetryProtocolExporterEventSource.Log.MtlsCertificateChainValidated( @@ -253,7 +250,7 @@ internal static bool ValidateServerCertificate( chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot; - bool isValid = chain.Build(serverCert); + var isValid = chain.Build(serverCert); if (isValid) { diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpServiceCollectionExtensions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpServiceCollectionExtensions.cs index 2e8b09f91cc..374d32e27b9 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpServiceCollectionExtensions.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpServiceCollectionExtensions.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation; @@ -12,20 +11,13 @@ namespace OpenTelemetry.Exporter; internal static class OtlpServiceCollectionExtensions { public static void AddOtlpExporterLoggingServices(this IServiceCollection services) - { - Debug.Assert(services != null, "services was null"); - - AddOtlpExporterSharedServices(services!, registerSdkLimitOptions: true); - } + => AddOtlpExporterSharedServices(services, registerSdkLimitOptions: true); public static void AddOtlpExporterMetricsServices(this IServiceCollection services, string name) { - Debug.Assert(services != null, "services was null"); - Debug.Assert(name != null, "name was null"); - - AddOtlpExporterSharedServices(services!, registerSdkLimitOptions: false); + AddOtlpExporterSharedServices(services, registerSdkLimitOptions: false); - services!.AddOptions(name).Configure( + services.AddOptions(name).Configure( (readerOptions, config) => { var otlpTemporalityPreference = config[OtlpSpecConfigDefinitions.MetricsTemporalityPreferenceEnvVarName]; @@ -53,11 +45,7 @@ public static void AddOtlpExporterMetricsServices(this IServiceCollection servic } public static void AddOtlpExporterTracingServices(this IServiceCollection services) - { - Debug.Assert(services != null, "services was null"); - - AddOtlpExporterSharedServices(services!, registerSdkLimitOptions: true); - } + => AddOtlpExporterSharedServices(services, registerSdkLimitOptions: true); private static void AddOtlpExporterSharedServices( IServiceCollection services, diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpLogSerializer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpLogSerializer.cs index c6304b2324e..20f8c83cd54 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpLogSerializer.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpLogSerializer.cs @@ -58,12 +58,12 @@ internal static int TryWriteResourceLogs(ref byte[] buffer, int writePosition, S { while (true) { - int entryWritePosition = writePosition; + var entryWritePosition = writePosition; try { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpLogFieldNumberConstants.LogsData_Resource_Logs, ProtobufWireType.LEN); - int logsDataLengthPosition = writePosition; + var logsDataLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = WriteResourceLogs(buffer, writePosition, sdkLimitOptions, experimentalOptions, resource, scopeLogs); @@ -73,7 +73,7 @@ internal static int TryWriteResourceLogs(ref byte[] buffer, int writePosition, S // Serialization succeeded, return the final write position return writePosition; } - catch (Exception ex) when (ex is IndexOutOfRangeException || ex is ArgumentException) + catch (Exception ex) when (ex is IndexOutOfRangeException or ArgumentException) { // Reset write position and attempt to increase the buffer size writePosition = entryWritePosition; @@ -127,10 +127,10 @@ internal static int WriteScopeLogs(byte[] buffer, int writePosition, SdkLimitOpt { if (scopeLogs != null) { - foreach (KeyValuePair> entry in scopeLogs) + foreach (var entry in scopeLogs) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpLogFieldNumberConstants.ResourceLogs_Scope_Logs, ProtobufWireType.LEN); - int resourceLogsScopeLogsLengthPosition = writePosition; + var resourceLogsScopeLogsLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = WriteScopeLog(buffer, writePosition, sdkLimitOptions, experimentalOptions, entry.Value[0].Logger.Name, entry.Value); @@ -151,7 +151,7 @@ internal static int WriteScopeLog(byte[] buffer, int writePosition, SdkLimitOpti writePosition = ProtobufSerializer.WriteTagAndLength(buffer, writePosition, numberOfUtf8CharsInString + 1 + serializedLengthSize, ProtobufOtlpLogFieldNumberConstants.ScopeLogs_Scope, ProtobufWireType.LEN); writePosition = ProtobufSerializer.WriteStringWithTag(buffer, writePosition, ProtobufOtlpCommonFieldNumberConstants.InstrumentationScope_Name, numberOfUtf8CharsInString, value); - for (int i = 0; i < logRecords.Count; i++) + for (var i = 0; i < logRecords.Count; i++) { writePosition = WriteLogRecord(buffer, writePosition, sdkLimitOptions, experimentalOptions, logRecords[i]); } @@ -176,7 +176,7 @@ internal static int WriteLogRecord(byte[] buffer, int writePosition, SdkLimitOpt ref var otlpTagWriterState = ref state.TagWriterState; otlpTagWriterState.WritePosition = ProtobufSerializer.WriteTag(otlpTagWriterState.Buffer, otlpTagWriterState.WritePosition, ProtobufOtlpLogFieldNumberConstants.ScopeLogs_Log_Records, ProtobufWireType.LEN); - int logRecordLengthPosition = otlpTagWriterState.WritePosition; + var logRecordLengthPosition = otlpTagWriterState.WritePosition; otlpTagWriterState.WritePosition += ReserveSizeForLength; var timestamp = (ulong)logRecord.Timestamp.ToUnixTimeNanoseconds(); @@ -187,7 +187,9 @@ internal static int WriteLogRecord(byte[] buffer, int writePosition, SdkLimitOpt if (!string.IsNullOrWhiteSpace(logRecord.SeverityText)) { +#pragma warning disable IDE0370 // Suppression is unnecessary otlpTagWriterState.WritePosition = ProtobufSerializer.WriteStringWithTag(otlpTagWriterState.Buffer, otlpTagWriterState.WritePosition, ProtobufOtlpLogFieldNumberConstants.LogRecord_Severity_Text, logRecord.SeverityText!); +#pragma warning restore IDE0370 // Suppression is unnecessary } else if (logRecord.Severity.HasValue) { @@ -209,8 +211,8 @@ internal static int WriteLogRecord(byte[] buffer, int writePosition, SdkLimitOpt AddLogAttribute(state, SemanticConventions.AttributeExceptionStacktrace, logRecord.Exception.ToInvariantString()); } - bool bodyPopulatedFromFormattedMessage = false; - bool isLogRecordBodySet = false; + var bodyPopulatedFromFormattedMessage = false; + var isLogRecordBodySet = false; if (logRecord.FormattedMessage != null) { @@ -259,7 +261,7 @@ internal static int WriteLogRecord(byte[] buffer, int writePosition, SdkLimitOpt if (logRecord.EventId.Name != null) { - otlpTagWriterState.WritePosition = ProtobufSerializer.WriteStringWithTag(otlpTagWriterState.Buffer, otlpTagWriterState.WritePosition, ProtobufOtlpLogFieldNumberConstants.LogRecord_Event_Name, logRecord.EventId.Name!); + otlpTagWriterState.WritePosition = ProtobufSerializer.WriteStringWithTag(otlpTagWriterState.Buffer, otlpTagWriterState.WritePosition, ProtobufOtlpLogFieldNumberConstants.LogRecord_Event_Name, logRecord.EventId.Name); } logRecord.ForEachScope(ProcessScope, state); @@ -320,9 +322,7 @@ private static int WriteLogRecordBody(byte[] buffer, int writePosition, ReadOnly } private static void AddLogAttribute(SerializationState state, KeyValuePair attribute) - { - AddLogAttribute(state, attribute.Key, attribute.Value); - } + => AddLogAttribute(state, attribute.Key, attribute.Value); private static void AddLogAttribute(SerializationState state, string key, object? value) { @@ -333,7 +333,7 @@ private static void AddLogAttribute(SerializationState state, string key, object else { state.TagWriterState.WritePosition = ProtobufSerializer.WriteTag(state.TagWriterState.Buffer, state.TagWriterState.WritePosition, ProtobufOtlpLogFieldNumberConstants.LogRecord_Attributes, ProtobufWireType.LEN); - int logAttributesLengthPosition = state.TagWriterState.WritePosition; + var logAttributesLengthPosition = state.TagWriterState.WritePosition; state.TagWriterState.WritePosition += ReserveSizeForLength; ProtobufOtlpTagWriter.Instance.TryWriteTag(ref state.TagWriterState, key, value, state.AttributeValueLengthLimit); diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpMetricSerializer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpMetricSerializer.cs index aa5d1ddcf22..c6364ac6a85 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpMetricSerializer.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpMetricSerializer.cs @@ -46,12 +46,12 @@ internal static int TryWriteResourceMetrics(ref byte[] buffer, int writePosition { while (true) { - int entryWritePosition = writePosition; + var entryWritePosition = writePosition; try { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.MetricsData_Resource_Metrics, ProtobufWireType.LEN); - int mericsDataLengthPosition = writePosition; + var mericsDataLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = WriteResourceMetrics(buffer, writePosition, resource, scopeMetrics); @@ -61,7 +61,7 @@ internal static int TryWriteResourceMetrics(ref byte[] buffer, int writePosition // Serialization succeeded, return the final write position return writePosition; } - catch (Exception ex) when (ex is IndexOutOfRangeException || ex is ArgumentException) + catch (Exception ex) when (ex is IndexOutOfRangeException or ArgumentException) { // Reset write position and attempt to increase the buffer size writePosition = entryWritePosition; @@ -100,10 +100,10 @@ private static int WriteScopeMetrics(byte[] buffer, int writePosition, Dictionar { if (scopeMetrics != null) { - foreach (KeyValuePair> entry in scopeMetrics) + foreach (var entry in scopeMetrics) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.ResourceMetrics_Scope_Metrics, ProtobufWireType.LEN); - int resourceMetricsScopeMetricsLengthPosition = writePosition; + var resourceMetricsScopeMetricsLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = WriteScopeMetric(buffer, writePosition, entry.Key, entry.Value); @@ -118,7 +118,7 @@ private static int WriteScopeMetrics(byte[] buffer, int writePosition, Dictionar private static int WriteScopeMetric(byte[] buffer, int writePosition, string meterName, List metrics) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.ScopeMetrics_Scope, ProtobufWireType.LEN); - int instrumentationScopeLengthPosition = writePosition; + var instrumentationScopeLengthPosition = writePosition; writePosition += ReserveSizeForLength; Debug.Assert(metrics.Count > 0, "Metrics collection is not expected to be empty."); @@ -137,7 +137,7 @@ private static int WriteScopeMetric(byte[] buffer, int writePosition, string met { if (meterTags is IReadOnlyList> readonlyMeterTags) { - for (int i = 0; i < readonlyMeterTags.Count; i++) + for (var i = 0; i < readonlyMeterTags.Count; i++) { writePosition = WriteTag(buffer, writePosition, readonlyMeterTags[i], ProtobufOtlpCommonFieldNumberConstants.InstrumentationScope_Attributes); } @@ -153,7 +153,7 @@ private static int WriteScopeMetric(byte[] buffer, int writePosition, string met ProtobufSerializer.WriteReservedLength(buffer, instrumentationScopeLengthPosition, writePosition - (instrumentationScopeLengthPosition + ReserveSizeForLength)); - for (int i = 0; i < metrics.Count; i++) + for (var i = 0; i < metrics.Count; i++) { writePosition = WriteMetric(buffer, writePosition, metrics[i]); } @@ -169,7 +169,7 @@ private static int WriteScopeMetric(byte[] buffer, int writePosition, string met private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.ScopeMetrics_Metrics, ProtobufWireType.LEN); - int metricLengthPosition = writePosition; + var metricLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = ProtobufSerializer.WriteStringWithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.Metric_Name, metric.Name); @@ -194,7 +194,7 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) case MetricType.LongSumNonMonotonic: { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.Metric_Data_Sum, ProtobufWireType.LEN); - int metricTypeLengthPosition = writePosition; + var metricTypeLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = ProtobufSerializer.WriteBoolWithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.Sum_Is_Monotonic, metric.MetricType == MetricType.LongSum); @@ -214,7 +214,7 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) case MetricType.DoubleSumNonMonotonic: { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.Metric_Data_Sum, ProtobufWireType.LEN); - int metricTypeLengthPosition = writePosition; + var metricTypeLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = ProtobufSerializer.WriteBoolWithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.Sum_Is_Monotonic, metric.MetricType == MetricType.DoubleSum); @@ -233,7 +233,7 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) case MetricType.LongGauge: { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.Metric_Data_Gauge, ProtobufWireType.LEN); - int metricTypeLengthPosition = writePosition; + var metricTypeLengthPosition = writePosition; writePosition += ReserveSizeForLength; foreach (ref readonly var metricPoint in metric.GetMetricPoints()) @@ -249,7 +249,7 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) case MetricType.DoubleGauge: { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.Metric_Data_Gauge, ProtobufWireType.LEN); - int metricTypeLengthPosition = writePosition; + var metricTypeLengthPosition = writePosition; writePosition += ReserveSizeForLength; foreach (ref readonly var metricPoint in metric.GetMetricPoints()) @@ -265,7 +265,7 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) case MetricType.Histogram: { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.Metric_Data_Histogram, ProtobufWireType.LEN); - int metricTypeLengthPosition = writePosition; + var metricTypeLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = ProtobufSerializer.WriteEnumWithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.Histogram_Aggregation_Temporality, aggregationValue); @@ -273,7 +273,7 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) foreach (ref readonly var metricPoint in metric.GetMetricPoints()) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.Histogram_Data_Points, ProtobufWireType.LEN); - int dataPointLengthPosition = writePosition; + var dataPointLengthPosition = writePosition; writePosition += ReserveSizeForLength; var startTime = (ulong)metricPoint.StartTime.ToUnixTimeNanoseconds(); @@ -293,7 +293,7 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) var sum = metricPoint.GetHistogramSum(); writePosition = ProtobufSerializer.WriteDoubleWithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.HistogramDataPoint_Sum, sum); - if (metricPoint.TryGetHistogramMinMaxValues(out double min, out double max)) + if (metricPoint.TryGetHistogramMinMaxValues(out var min, out var max)) { writePosition = ProtobufSerializer.WriteDoubleWithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.HistogramDataPoint_Min, min); writePosition = ProtobufSerializer.WriteDoubleWithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.HistogramDataPoint_Max, max); @@ -313,7 +313,7 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) case MetricType.ExponentialHistogram: { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.Metric_Data_Exponential_Histogram, ProtobufWireType.LEN); - int metricTypeLengthPosition = writePosition; + var metricTypeLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = ProtobufSerializer.WriteEnumWithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.ExponentialHistogram_Aggregation_Temporality, aggregationValue); @@ -321,7 +321,7 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) foreach (ref readonly var metricPoint in metric.GetMetricPoints()) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.ExponentialHistogram_Data_Points, ProtobufWireType.LEN); - int dataPointLengthPosition = writePosition; + var dataPointLengthPosition = writePosition; writePosition += ReserveSizeForLength; var startTime = (ulong)metricPoint.StartTime.ToUnixTimeNanoseconds(); @@ -341,7 +341,7 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) var count = (ulong)metricPoint.GetHistogramCount(); writePosition = ProtobufSerializer.WriteFixed64WithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.ExponentialHistogramDataPoint_Count, count); - if (metricPoint.TryGetHistogramMinMaxValues(out double min, out double max)) + if (metricPoint.TryGetHistogramMinMaxValues(out var min, out var max)) { writePosition = ProtobufSerializer.WriteDoubleWithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.ExponentialHistogramDataPoint_Min, min); writePosition = ProtobufSerializer.WriteDoubleWithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.ExponentialHistogramDataPoint_Max, max); @@ -353,7 +353,7 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) writePosition = ProtobufSerializer.WriteFixed64WithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.ExponentialHistogramDataPoint_Zero_Count, (ulong)exponentialHistogramData.ZeroCount); writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.ExponentialHistogramDataPoint_Positive, ProtobufWireType.LEN); - int positiveBucketsLengthPosition = writePosition; + var positiveBucketsLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = ProtobufSerializer.WriteSInt32WithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.ExponentialHistogramDataPoint_Buckets_Offset, exponentialHistogramData.PositiveBuckets.Offset); @@ -373,6 +373,9 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) ProtobufSerializer.WriteReservedLength(buffer, metricTypeLengthPosition, writePosition - (metricTypeLengthPosition + ReserveSizeForLength)); break; } + + default: + break; } ProtobufSerializer.WriteReservedLength(buffer, metricLengthPosition, writePosition - (metricLengthPosition + ReserveSizeForLength)); @@ -382,7 +385,7 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric) private static int WriteNumberDataPoint(byte[] buffer, int writePosition, int fieldNumber, in MetricPoint metricPoint, long value) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, fieldNumber, ProtobufWireType.LEN); - int dataPointLengthPosition = writePosition; + var dataPointLengthPosition = writePosition; writePosition += ReserveSizeForLength; // Casting to ulong is ok here as the bit representation for long versus ulong will be the same @@ -420,7 +423,7 @@ private static int WriteNumberDataPoint(byte[] buffer, int writePosition, int fi private static int WriteNumberDataPoint(byte[] buffer, int writePosition, int fieldNumber, in MetricPoint metricPoint, double value) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, fieldNumber, ProtobufWireType.LEN); - int dataPointLengthPosition = writePosition; + var dataPointLengthPosition = writePosition; writePosition += ReserveSizeForLength; // Using a func here to avoid boxing/unboxing. @@ -445,14 +448,14 @@ private static int WriteNumberDataPoint(byte[] buffer, int writePosition, int fi private static int WriteTag(byte[] buffer, int writePosition, KeyValuePair tag, int fieldNumber) { - ProtobufOtlpTagWriter.OtlpTagWriterState otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState + var otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState { Buffer = buffer, WritePosition = writePosition, }; otlpTagWriterState.WritePosition = ProtobufSerializer.WriteTag(buffer, otlpTagWriterState.WritePosition, fieldNumber, ProtobufWireType.LEN); - int fieldLengthPosition = otlpTagWriterState.WritePosition; + var fieldLengthPosition = otlpTagWriterState.WritePosition; otlpTagWriterState.WritePosition += ReserveSizeForLength; ProtobufOtlpTagWriter.Instance.TryWriteTag(ref otlpTagWriterState, tag.Key, tag.Value); @@ -482,7 +485,7 @@ private static int WriteDoubleExemplars(byte[] buffer, int writePosition, int fi private static int WriteExemplar(byte[] buffer, int writePosition, in Exemplar exemplar, int fieldNumber, WriteExemplarFunc writeValueFunc) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, fieldNumber, ProtobufWireType.LEN); - int exemplarLengthPosition = writePosition; + var exemplarLengthPosition = writePosition; writePosition += ReserveSizeForLength; foreach (var tag in exemplar.FilteredTags) @@ -525,7 +528,7 @@ private static int WriteHistogramBuckets(byte[] buffer, int writePosition, Histo static int WriteBucketCounts(byte[] buffer, int writePosition, HistogramBuckets.HistogramBucketValues[] values) { - int length = values.Length; + var length = values.Length; writePosition = WritePackedLength( buffer, @@ -533,7 +536,7 @@ static int WriteBucketCounts(byte[] buffer, int writePosition, HistogramBuckets. length, ProtobufOtlpMetricFieldNumberConstants.HistogramDataPoint_Bucket_Counts); - for (int i = 0; i < length; i++) + for (var i = 0; i < length; i++) { writePosition = ProtobufSerializer.WriteFixed64LittleEndianFormat( buffer, @@ -546,9 +549,9 @@ static int WriteBucketCounts(byte[] buffer, int writePosition, HistogramBuckets. static int WriteExplicitBounds(byte[] buffer, int writePosition, double[] values) { - int length = 0; + var length = 0; - for (int i = 0; i < values.Length; i++) + for (var i = 0; i < values.Length; i++) { if (values[i] != double.PositiveInfinity) { @@ -564,7 +567,7 @@ static int WriteExplicitBounds(byte[] buffer, int writePosition, double[] values length, ProtobufOtlpMetricFieldNumberConstants.HistogramDataPoint_Explicit_Bounds); - for (int i = 0; i < values.Length; i++) + for (var i = 0; i < values.Length; i++) { var value = values[i]; if (value != double.PositiveInfinity) diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpResourceSerializer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpResourceSerializer.cs index d12099bec02..ad1f3becdd4 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpResourceSerializer.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpResourceSerializer.cs @@ -11,21 +11,21 @@ internal static class ProtobufOtlpResourceSerializer internal static int WriteResource(byte[] buffer, int writePosition, Resource? resource) { - ProtobufOtlpTagWriter.OtlpTagWriterState otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState + var otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState { Buffer = buffer, WritePosition = writePosition, }; otlpTagWriterState.WritePosition = ProtobufSerializer.WriteTag(otlpTagWriterState.Buffer, otlpTagWriterState.WritePosition, ProtobufOtlpTraceFieldNumberConstants.ResourceSpans_Resource, ProtobufWireType.LEN); - int resourceLengthPosition = otlpTagWriterState.WritePosition; + var resourceLengthPosition = otlpTagWriterState.WritePosition; otlpTagWriterState.WritePosition += ReserveSizeForLength; if (resource != null && resource != Resource.Empty) { if (resource.Attributes is IReadOnlyList> resourceAttributesList) { - for (int i = 0; i < resourceAttributesList.Count; i++) + for (var i = 0; i < resourceAttributesList.Count; i++) { ProcessResourceAttribute(ref otlpTagWriterState, resourceAttributesList[i]); } @@ -48,7 +48,7 @@ internal static int WriteResource(byte[] buffer, int writePosition, Resource? re private static void ProcessResourceAttribute(ref ProtobufOtlpTagWriter.OtlpTagWriterState otlpTagWriterState, KeyValuePair attribute) { otlpTagWriterState.WritePosition = ProtobufSerializer.WriteTag(otlpTagWriterState.Buffer, otlpTagWriterState.WritePosition, ProtobufOtlpTraceFieldNumberConstants.Resource_Attributes, ProtobufWireType.LEN); - int resourceAttributesLengthPosition = otlpTagWriterState.WritePosition; + var resourceAttributesLengthPosition = otlpTagWriterState.WritePosition; otlpTagWriterState.WritePosition += ReserveSizeForLength; ProtobufOtlpTagWriter.Instance.TryWriteTag(ref otlpTagWriterState, attribute.Key, attribute.Value); diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpTagWriter.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpTagWriter.cs index 04e60fa0db7..b8b935cca6b 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpTagWriter.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpTagWriter.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using OpenTelemetry.Internal; namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.Serializer; @@ -134,9 +133,7 @@ public override OtlpTagWriterArrayState BeginWriteArray() } public override void WriteNullValue(ref OtlpTagWriterArrayState state) - { - state.WritePosition = ProtobufSerializer.WriteTagAndLength(state.Buffer, state.WritePosition, 0, ProtobufOtlpCommonFieldNumberConstants.ArrayValue_Value, ProtobufWireType.LEN); - } + => state.WritePosition = ProtobufSerializer.WriteTagAndLength(state.Buffer, state.WritePosition, 0, ProtobufOtlpCommonFieldNumberConstants.ArrayValue_Value, ProtobufWireType.LEN); public override void WriteIntegralValue(ref OtlpTagWriterArrayState state, long value) { @@ -176,8 +173,6 @@ public override bool TryResize() { var buffer = ThreadBuffer; - Debug.Assert(buffer != null, "buffer was null"); - if (buffer!.Length >= MaxBufferSize) { OpenTelemetryProtocolExporterEventSource.Log.ArrayBufferExceededMaxSize(); diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpTraceSerializer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpTraceSerializer.cs index d4993e85f7c..47f2379f218 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpTraceSerializer.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpTraceSerializer.cs @@ -47,12 +47,12 @@ internal static int TryWriteResourceSpans(ref byte[] buffer, int writePosition, { while (true) { - int entryWritePosition = writePosition; + var entryWritePosition = writePosition; try { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpTraceFieldNumberConstants.TracesData_Resource_Spans, ProtobufWireType.LEN); - int resourceSpansScopeSpansLengthPosition = writePosition; + var resourceSpansScopeSpansLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = WriteResourceSpans(buffer, writePosition, sdkLimitOptions, resource); @@ -62,7 +62,7 @@ internal static int TryWriteResourceSpans(ref byte[] buffer, int writePosition, // Serialization succeeded, return the final write position return writePosition; } - catch (Exception ex) when (ex is IndexOutOfRangeException || ex is ArgumentException) + catch (Exception ex) when (ex is IndexOutOfRangeException or ArgumentException) { // Reset write position and attempt to increase the buffer size writePosition = entryWritePosition; @@ -105,10 +105,10 @@ internal static int WriteScopeSpans(byte[] buffer, int writePosition, SdkLimitOp { if (scopeTracesList != null) { - foreach (KeyValuePair> entry in scopeTracesList) + foreach (var entry in scopeTracesList) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpTraceFieldNumberConstants.ResourceSpans_Scope_Spans, ProtobufWireType.LEN); - int resourceSpansScopeSpansLengthPosition = writePosition; + var resourceSpansScopeSpansLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = WriteScopeSpan(buffer, writePosition, sdkLimitOptions, entry.Value[0].Source, entry.Value); @@ -122,7 +122,7 @@ internal static int WriteScopeSpans(byte[] buffer, int writePosition, SdkLimitOp internal static int WriteScopeSpan(byte[] buffer, int writePosition, SdkLimitOptions sdkLimitOptions, ActivitySource activitySource, List activities) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpTraceFieldNumberConstants.ScopeSpans_Scope, ProtobufWireType.LEN); - int instrumentationScopeLengthPosition = writePosition; + var instrumentationScopeLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = ProtobufSerializer.WriteStringWithTag(buffer, writePosition, ProtobufOtlpCommonFieldNumberConstants.InstrumentationScope_Name, activitySource.Name); @@ -135,7 +135,7 @@ internal static int WriteScopeSpan(byte[] buffer, int writePosition, SdkLimitOpt { var maxAttributeCount = sdkLimitOptions.SpanAttributeCountLimit ?? int.MaxValue; var maxAttributeValueLength = sdkLimitOptions.AttributeValueLengthLimit ?? int.MaxValue; - ProtobufOtlpTagWriter.OtlpTagWriterState otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState + var otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState { Buffer = buffer, WritePosition = writePosition, @@ -145,12 +145,12 @@ internal static int WriteScopeSpan(byte[] buffer, int writePosition, SdkLimitOpt if (activitySource.Tags is IReadOnlyList> activitySourceTagsList) { - for (int i = 0; i < activitySourceTagsList.Count; i++) + for (var i = 0; i < activitySourceTagsList.Count; i++) { if (otlpTagWriterState.TagCount < maxAttributeCount) { otlpTagWriterState.WritePosition = ProtobufSerializer.WriteTag(otlpTagWriterState.Buffer, otlpTagWriterState.WritePosition, ProtobufOtlpCommonFieldNumberConstants.InstrumentationScope_Attributes, ProtobufWireType.LEN); - int instrumentationScopeAttributesLengthPosition = otlpTagWriterState.WritePosition; + var instrumentationScopeAttributesLengthPosition = otlpTagWriterState.WritePosition; otlpTagWriterState.WritePosition += ReserveSizeForLength; ProtobufOtlpTagWriter.Instance.TryWriteTag(ref otlpTagWriterState, activitySourceTagsList[i].Key, activitySourceTagsList[i].Value, maxAttributeValueLength); @@ -172,7 +172,7 @@ internal static int WriteScopeSpan(byte[] buffer, int writePosition, SdkLimitOpt if (otlpTagWriterState.TagCount < maxAttributeCount) { otlpTagWriterState.WritePosition = ProtobufSerializer.WriteTag(otlpTagWriterState.Buffer, otlpTagWriterState.WritePosition, ProtobufOtlpCommonFieldNumberConstants.InstrumentationScope_Attributes, ProtobufWireType.LEN); - int instrumentationScopeAttributesLengthPosition = otlpTagWriterState.WritePosition; + var instrumentationScopeAttributesLengthPosition = otlpTagWriterState.WritePosition; otlpTagWriterState.WritePosition += ReserveSizeForLength; ProtobufOtlpTagWriter.Instance.TryWriteTag(ref otlpTagWriterState, tag.Key, tag.Value, maxAttributeValueLength); @@ -199,14 +199,16 @@ internal static int WriteScopeSpan(byte[] buffer, int writePosition, SdkLimitOpt ProtobufSerializer.WriteReservedLength(buffer, instrumentationScopeLengthPosition, writePosition - (instrumentationScopeLengthPosition + ReserveSizeForLength)); - for (int i = 0; i < activities.Count; i++) + for (var i = 0; i < activities.Count; i++) { writePosition = WriteSpan(buffer, writePosition, sdkLimitOptions, activities[i]); } if (!string.IsNullOrEmpty(activitySource.TelemetrySchemaUrl)) { +#pragma warning disable IDE0370 // Suppression is unnecessary writePosition = ProtobufSerializer.WriteStringWithTag(buffer, writePosition, ProtobufOtlpTraceFieldNumberConstants.ScopeSpans_Schema_Url, activitySource.TelemetrySchemaUrl!); +#pragma warning restore IDE0370 // Suppression is unnecessary } return writePosition; @@ -215,7 +217,7 @@ internal static int WriteScopeSpan(byte[] buffer, int writePosition, SdkLimitOpt internal static int WriteSpan(byte[] buffer, int writePosition, SdkLimitOptions sdkLimitOptions, Activity activity) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpTraceFieldNumberConstants.ScopeSpans_Span, ProtobufWireType.LEN); - int spanLengthPosition = writePosition; + var spanLengthPosition = writePosition; writePosition += ReserveSizeForLength; writePosition = ProtobufSerializer.WriteTagAndLength(buffer, writePosition, TraceIdSize, ProtobufOtlpTraceFieldNumberConstants.Span_Trace_Id, ProtobufWireType.LEN); @@ -241,7 +243,7 @@ internal static int WriteSpan(byte[] buffer, int writePosition, SdkLimitOptions writePosition = ProtobufSerializer.WriteFixed64WithTag(buffer, writePosition, ProtobufOtlpTraceFieldNumberConstants.Span_Start_Time_Unix_Nano, (ulong)activity.StartTimeUtc.ToUnixTimeNanoseconds()); writePosition = ProtobufSerializer.WriteFixed64WithTag(buffer, writePosition, ProtobufOtlpTraceFieldNumberConstants.Span_End_Time_Unix_Nano, (ulong)(activity.StartTimeUtc.ToUnixTimeNanoseconds() + activity.Duration.ToNanoseconds())); - (writePosition, StatusCode? statusCode, string? statusMessage) = WriteActivityTags(buffer, writePosition, sdkLimitOptions, activity); + (writePosition, var statusCode, var statusMessage) = WriteActivityTags(buffer, writePosition, sdkLimitOptions, activity); writePosition = WriteSpanEvents(buffer, writePosition, sdkLimitOptions, activity); writePosition = WriteSpanLinks(buffer, writePosition, sdkLimitOptions, activity); writePosition = WriteSpanStatus(buffer, writePosition, activity, statusCode, statusMessage); @@ -266,7 +268,7 @@ internal static int WriteSpanId(byte[] buffer, int position, ActivitySpanId acti internal static int WriteTraceFlags(byte[] buffer, int position, ActivityTraceFlags activityTraceFlags, bool hasRemoteParent, int fieldNumber) { - uint spanFlags = (uint)activityTraceFlags & (byte)0x000000FF; + var spanFlags = (uint)activityTraceFlags & 0x000000FF; spanFlags |= 0x00000100; if (hasRemoteParent) @@ -283,9 +285,9 @@ internal static (int Position, StatusCode? StatusCode, string? StatusMessage) Wr { StatusCode? statusCode = null; string? statusMessage = null; - int maxAttributeCount = sdkLimitOptions.SpanAttributeCountLimit ?? int.MaxValue; - int maxAttributeValueLength = sdkLimitOptions.AttributeValueLengthLimit ?? int.MaxValue; - ProtobufOtlpTagWriter.OtlpTagWriterState otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState + var maxAttributeCount = sdkLimitOptions.SpanAttributeCountLimit ?? int.MaxValue; + var maxAttributeValueLength = sdkLimitOptions.AttributeValueLengthLimit ?? int.MaxValue; + var otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState { Buffer = buffer, WritePosition = writePosition, @@ -315,12 +317,14 @@ not null when OkStatusCodeTagValue.Equals(tag.Value as string, StringComparison. case "otel.status_description": statusMessage = tag.Value as string; continue; + default: + break; } if (otlpTagWriterState.TagCount < maxAttributeCount) { otlpTagWriterState.WritePosition = ProtobufSerializer.WriteTag(otlpTagWriterState.Buffer, otlpTagWriterState.WritePosition, ProtobufOtlpTraceFieldNumberConstants.Span_Attributes, ProtobufWireType.LEN); - int spanAttributesLengthPosition = otlpTagWriterState.WritePosition; + var spanAttributesLengthPosition = otlpTagWriterState.WritePosition; otlpTagWriterState.WritePosition += ReserveSizeForLength; ProtobufOtlpTagWriter.Instance.TryWriteTag(ref otlpTagWriterState, tag.Key, tag.Value, maxAttributeValueLength); @@ -345,15 +349,15 @@ not null when OkStatusCodeTagValue.Equals(tag.Value as string, StringComparison. internal static int WriteSpanEvents(byte[] buffer, int writePosition, SdkLimitOptions sdkLimitOptions, Activity activity) { - int maxEventCountLimit = sdkLimitOptions.SpanEventCountLimit ?? int.MaxValue; - int eventCount = 0; - int droppedEventCount = 0; + var maxEventCountLimit = sdkLimitOptions.SpanEventCountLimit ?? int.MaxValue; + var eventCount = 0; + var droppedEventCount = 0; foreach (ref readonly var evnt in activity.EnumerateEvents()) { if (eventCount < maxEventCountLimit) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpTraceFieldNumberConstants.Span_Events, ProtobufWireType.LEN); - int spanEventsLengthPosition = writePosition; + var spanEventsLengthPosition = writePosition; writePosition += ReserveSizeForLength; // Reserve 4 bytes for length writePosition = ProtobufSerializer.WriteStringWithTag(buffer, writePosition, ProtobufOtlpTraceFieldNumberConstants.Event_Name, evnt.Name); @@ -380,10 +384,10 @@ internal static int WriteSpanEvents(byte[] buffer, int writePosition, SdkLimitOp internal static int WriteEventAttributes(ref byte[] buffer, int writePosition, SdkLimitOptions sdkLimitOptions, ActivityEvent evnt) { - int maxAttributeCount = sdkLimitOptions.SpanEventAttributeCountLimit ?? int.MaxValue; - int maxAttributeValueLength = sdkLimitOptions.AttributeValueLengthLimit ?? int.MaxValue; + var maxAttributeCount = sdkLimitOptions.SpanEventAttributeCountLimit ?? int.MaxValue; + var maxAttributeValueLength = sdkLimitOptions.AttributeValueLengthLimit ?? int.MaxValue; - ProtobufOtlpTagWriter.OtlpTagWriterState otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState + var otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState { Buffer = buffer, WritePosition = writePosition, @@ -396,7 +400,7 @@ internal static int WriteEventAttributes(ref byte[] buffer, int writePosition, S if (otlpTagWriterState.TagCount < maxAttributeCount) { otlpTagWriterState.WritePosition = ProtobufSerializer.WriteTag(otlpTagWriterState.Buffer, otlpTagWriterState.WritePosition, ProtobufOtlpTraceFieldNumberConstants.Event_Attributes, ProtobufWireType.LEN); - int eventAttributesLengthPosition = otlpTagWriterState.WritePosition; + var eventAttributesLengthPosition = otlpTagWriterState.WritePosition; otlpTagWriterState.WritePosition += ReserveSizeForLength; ProtobufOtlpTagWriter.Instance.TryWriteTag(ref otlpTagWriterState, tag.Key, tag.Value, maxAttributeValueLength); ProtobufSerializer.WriteReservedLength(buffer, eventAttributesLengthPosition, otlpTagWriterState.WritePosition - (eventAttributesLengthPosition + ReserveSizeForLength)); @@ -419,16 +423,16 @@ internal static int WriteEventAttributes(ref byte[] buffer, int writePosition, S internal static int WriteSpanLinks(byte[] buffer, int writePosition, SdkLimitOptions sdkLimitOptions, Activity activity) { - int maxLinksCount = sdkLimitOptions.SpanLinkCountLimit ?? int.MaxValue; - int linkCount = 0; - int droppedLinkCount = 0; + var maxLinksCount = sdkLimitOptions.SpanLinkCountLimit ?? int.MaxValue; + var linkCount = 0; + var droppedLinkCount = 0; foreach (ref readonly var link in activity.EnumerateLinks()) { if (linkCount < maxLinksCount) { writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpTraceFieldNumberConstants.Span_Links, ProtobufWireType.LEN); - int spanLinksLengthPosition = writePosition; + var spanLinksLengthPosition = writePosition; writePosition += ReserveSizeForLength; // Reserve 4 bytes for length writePosition = ProtobufSerializer.WriteTagAndLength(buffer, writePosition, TraceIdSize, ProtobufOtlpTraceFieldNumberConstants.Link_Trace_Id, ProtobufWireType.LEN); @@ -463,9 +467,9 @@ internal static int WriteSpanLinks(byte[] buffer, int writePosition, SdkLimitOpt internal static int WriteLinkAttributes(byte[] buffer, int writePosition, SdkLimitOptions sdkLimitOptions, ActivityLink link) { - int maxAttributeCount = sdkLimitOptions.SpanLinkAttributeCountLimit ?? int.MaxValue; - int maxAttributeValueLength = sdkLimitOptions.AttributeValueLengthLimit ?? int.MaxValue; - ProtobufOtlpTagWriter.OtlpTagWriterState otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState + var maxAttributeCount = sdkLimitOptions.SpanLinkAttributeCountLimit ?? int.MaxValue; + var maxAttributeValueLength = sdkLimitOptions.AttributeValueLengthLimit ?? int.MaxValue; + var otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState { Buffer = buffer, WritePosition = writePosition, @@ -478,7 +482,7 @@ internal static int WriteLinkAttributes(byte[] buffer, int writePosition, SdkLim if (otlpTagWriterState.TagCount < maxAttributeCount) { otlpTagWriterState.WritePosition = ProtobufSerializer.WriteTag(otlpTagWriterState.Buffer, otlpTagWriterState.WritePosition, ProtobufOtlpTraceFieldNumberConstants.Link_Attributes, ProtobufWireType.LEN); - int linkAttributesLengthPosition = otlpTagWriterState.WritePosition; + var linkAttributesLengthPosition = otlpTagWriterState.WritePosition; otlpTagWriterState.WritePosition += ReserveSizeForLength; ProtobufOtlpTagWriter.Instance.TryWriteTag(ref otlpTagWriterState, tag.Key, tag.Value, maxAttributeValueLength); ProtobufSerializer.WriteReservedLength(buffer, linkAttributesLengthPosition, otlpTagWriterState.WritePosition - (linkAttributesLengthPosition + ReserveSizeForLength)); @@ -525,7 +529,7 @@ internal static int WriteSpanStatus(byte[] buffer, int position, Activity activi position = ProtobufSerializer.WriteTagAndLength(buffer, position, 2, ProtobufOtlpTraceFieldNumberConstants.Span_Status, ProtobufWireType.LEN); } - var finalStatusCode = useActivity ? (int)activity.Status : (statusCode != null && statusCode != StatusCode.Unset) ? (int)statusCode! : (int)StatusCode.Unset; + var finalStatusCode = useActivity ? (int)activity.Status : (statusCode is not null and not StatusCode.Unset) ? (int)statusCode : (int)StatusCode.Unset; position = ProtobufSerializer.WriteEnumWithTag(buffer, position, ProtobufOtlpTraceFieldNumberConstants.Status_Code, finalStatusCode); return position; diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufSerializer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufSerializer.cs index cb70fa781aa..2df8e0edfb2 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufSerializer.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufSerializer.cs @@ -267,7 +267,7 @@ internal static int GetNumberOfUtf8CharsInString(ReadOnlySpan value) } } #else - int numberOfUtf8CharsInString = Utf8Encoding.GetByteCount(value); + var numberOfUtf8CharsInString = Utf8Encoding.GetByteCount(value); #endif return numberOfUtf8CharsInString; } diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Transmission/OtlpExporterPersistentStorageTransmissionHandler.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Transmission/OtlpExporterPersistentStorageTransmissionHandler.cs index 066ecb02d02..1c288c36963 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Transmission/OtlpExporterPersistentStorageTransmissionHandler.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Transmission/OtlpExporterPersistentStorageTransmissionHandler.cs @@ -28,8 +28,7 @@ public OtlpExporterPersistentStorageTransmissionHandler(IExportClient exportClie internal OtlpExporterPersistentStorageTransmissionHandler(PersistentBlobProvider persistentBlobProvider, IExportClient exportClient, double timeoutMilliseconds) : base(exportClient, timeoutMilliseconds) { - Debug.Assert(persistentBlobProvider != null, "persistentBlobProvider was null"); - this.persistentBlobProvider = persistentBlobProvider!; + this.persistentBlobProvider = persistentBlobProvider; this.thread = new Thread(this.RetryStoredRequests) { @@ -49,10 +48,7 @@ internal bool InitiateAndWaitForRetryProcess(int timeOutMilliseconds) } protected override bool OnSubmitRequestFailure(byte[] request, int contentLength, ExportClientResponse response) - { - Debug.Assert(request != null, "request was null"); - return RetryHelper.ShouldRetryRequest(response, OtlpRetry.InitialBackoffMilliseconds, out _) && this.persistentBlobProvider.TryCreateBlob(request!, out _); - } + => RetryHelper.ShouldRetryRequest(response, OtlpRetry.InitialBackoffMilliseconds, out _) && this.persistentBlobProvider.TryCreateBlob(request, out _); protected override void OnShutdown(int timeoutMilliseconds) { @@ -113,7 +109,7 @@ private void RetryStoredRequests() break; } - int fileCount = 0; + var fileCount = 0; // TODO: Run maintenance job. // Transmit 10 files at a time. diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptions.cs index cf59c5d3360..430929f40d3 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptions.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptions.cs @@ -66,8 +66,6 @@ internal OtlpExporterOptions( OtlpExporterOptionsConfigurationType configurationType, BatchExportActivityProcessorOptions defaultBatchOptions) { - Debug.Assert(defaultBatchOptions != null, "defaultBatchOptions was null"); - this.ApplyConfiguration(configuration, configurationType); this.DefaultHttpClientFactory = () => @@ -90,7 +88,7 @@ internal OtlpExporterOptions( }; }; - this.BatchExportProcessorOptions = defaultBatchOptions!; + this.BatchExportProcessorOptions = defaultBatchOptions; } /// @@ -256,8 +254,6 @@ private void ApplyConfiguration( IConfiguration configuration, OtlpExporterOptionsConfigurationType configurationType) { - Debug.Assert(configuration != null, "configuration was null"); - // Note: When using the "AddOtlpExporter" extensions configurationType // never has a value other than "Default" because OtlpExporterOptions is // shared by all signals and there is no way to differentiate which @@ -265,7 +261,7 @@ private void ApplyConfiguration( if (configurationType == OtlpExporterOptionsConfigurationType.Default) { this.ApplyConfigurationUsingSpecificationEnvVars( - configuration!, + configuration, OtlpSpecConfigDefinitions.DefaultEndpointEnvVarName, appendSignalPathToEndpoint: true, OtlpSpecConfigDefinitions.DefaultProtocolEnvVarName, @@ -275,7 +271,7 @@ private void ApplyConfiguration( else if (configurationType == OtlpExporterOptionsConfigurationType.Logs) { this.ApplyConfigurationUsingSpecificationEnvVars( - configuration!, + configuration, OtlpSpecConfigDefinitions.LogsEndpointEnvVarName, appendSignalPathToEndpoint: false, OtlpSpecConfigDefinitions.LogsProtocolEnvVarName, @@ -285,7 +281,7 @@ private void ApplyConfiguration( else if (configurationType == OtlpExporterOptionsConfigurationType.Metrics) { this.ApplyConfigurationUsingSpecificationEnvVars( - configuration!, + configuration, OtlpSpecConfigDefinitions.MetricsEndpointEnvVarName, appendSignalPathToEndpoint: false, OtlpSpecConfigDefinitions.MetricsProtocolEnvVarName, @@ -295,7 +291,7 @@ private void ApplyConfiguration( else if (configurationType == OtlpExporterOptionsConfigurationType.Traces) { this.ApplyConfigurationUsingSpecificationEnvVars( - configuration!, + configuration, OtlpSpecConfigDefinitions.TracesEndpointEnvVarName, appendSignalPathToEndpoint: false, OtlpSpecConfigDefinitions.TracesProtocolEnvVarName, diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptionsExtensions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptionsExtensions.cs index 33526aff45e..39282b6aaf9 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptionsExtensions.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptionsExtensions.cs @@ -31,11 +31,11 @@ public static THeaders GetHeaders(this OtlpExporterOptions options, Ac { // According to the specification, URL-encoded headers must be supported. optionHeaders = Uri.UnescapeDataString(optionHeaders); - ReadOnlySpan headersSpan = optionHeaders.AsSpan(); + var headersSpan = optionHeaders.AsSpan(); while (!headersSpan.IsEmpty) { - int commaIndex = headersSpan.IndexOf(','); + var commaIndex = headersSpan.IndexOf(','); ReadOnlySpan pair; if (commaIndex == -1) { @@ -48,7 +48,7 @@ public static THeaders GetHeaders(this OtlpExporterOptions options, Ac headersSpan = headersSpan.Slice(commaIndex + 1); } - int equalIndex = pair.IndexOf('='); + var equalIndex = pair.IndexOf('='); if (equalIndex == -1) { throw new ArgumentException("Headers provided in an invalid format."); @@ -75,7 +75,7 @@ public static OtlpExporterTransmissionHandler GetExportTransmissionHandler(this // `HttpClient.Timeout.TotalMilliseconds` would be populated with the correct timeout value for both the exporter configuration cases: // 1. User provides their own HttpClient. This case is straightforward as the user wants to use their `HttpClient` and thereby the same client's timeout value. // 2. If the user configures timeout via the exporter options, then the timeout set for the `HttpClient` initialized by the exporter will be set to user provided value. - double timeoutMilliseconds = exportClient is OtlpHttpExportClient httpTraceExportClient + var timeoutMilliseconds = exportClient is OtlpHttpExportClient httpTraceExportClient ? httpTraceExportClient.HttpClient.Timeout.TotalMilliseconds : options.TimeoutMilliseconds; @@ -103,7 +103,7 @@ public static IExportClient GetExportClient(this OtlpExporterOptions options, Ot var httpClient = options.HttpClientFactory?.Invoke() ?? throw new InvalidOperationException("OtlpExporterOptions was missing HttpClientFactory or it returned null."); #pragma warning disable CS0618 // Suppressing gRPC obsolete warning - if (options.Protocol != OtlpExportProtocol.Grpc && options.Protocol != OtlpExportProtocol.HttpProtobuf) + if (options.Protocol is not OtlpExportProtocol.Grpc and not OtlpExportProtocol.HttpProtobuf) { throw new NotSupportedException($"Protocol {options.Protocol} is not supported."); } @@ -135,13 +135,13 @@ public static void TryEnableIHttpClientFactoryIntegration(this OtlpExporterOptio { options.HttpClientFactory = () => { - Type? httpClientFactoryType = Type.GetType("System.Net.Http.IHttpClientFactory, Microsoft.Extensions.Http", throwOnError: false); + var httpClientFactoryType = Type.GetType("System.Net.Http.IHttpClientFactory, Microsoft.Extensions.Http", throwOnError: false); if (httpClientFactoryType != null) { - object? httpClientFactory = serviceProvider.GetService(httpClientFactoryType); + var httpClientFactory = serviceProvider.GetService(httpClientFactoryType); if (httpClientFactory != null) { - MethodInfo? createClientMethod = httpClientFactoryType.GetMethod( + var createClientMethod = httpClientFactoryType.GetMethod( "CreateClient", BindingFlags.Public | BindingFlags.Instance, binder: null, @@ -149,7 +149,7 @@ public static void TryEnableIHttpClientFactoryIntegration(this OtlpExporterOptio modifiers: null); if (createClientMethod != null) { - HttpClient? client = (HttpClient?)createClientMethod.Invoke(httpClientFactory, [httpClientName]); + var client = (HttpClient?)createClientMethod.Invoke(httpClientFactory, [httpClientName]); if (client != null) { diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporter.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporter.cs index dbec08c771b..079f43b31b1 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporter.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporter.cs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 using System.Buffers.Binary; -using System.Diagnostics; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.Serializer; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.Transmission; @@ -23,8 +22,6 @@ public sealed class OtlpLogExporter : BaseExporter private readonly OtlpExporterTransmissionHandler transmissionHandler; private readonly int startWritePosition; - private Resource? resource; - // Initial buffer size set to ~732KB. // This choice allows us to gradually grow the buffer while targeting a final capacity of around 100 MB, // by the 7th doubling to maintain efficient allocation without frequent resizing. @@ -35,7 +32,7 @@ public sealed class OtlpLogExporter : BaseExporter /// /// Configuration options for the exporter. public OtlpLogExporter(OtlpExporterOptions options) - : this(options, sdkLimitOptions: new(), experimentalOptions: new(), transmissionHandler: null) + : this(options ?? throw new ArgumentNullException(nameof(options)), sdkLimitOptions: new(), experimentalOptions: new(), transmissionHandler: null) { } @@ -52,19 +49,15 @@ internal OtlpLogExporter( ExperimentalOptions experimentalOptions, OtlpExporterTransmissionHandler? transmissionHandler = null) { - Debug.Assert(exporterOptions != null, "exporterOptions was null"); - Debug.Assert(sdkLimitOptions != null, "sdkLimitOptions was null"); - Debug.Assert(experimentalOptions != null, "experimentalOptions was null"); - - this.experimentalOptions = experimentalOptions!; - this.sdkLimitOptions = sdkLimitOptions!; + this.experimentalOptions = experimentalOptions; + this.sdkLimitOptions = sdkLimitOptions; #pragma warning disable CS0618 // Suppressing gRPC obsolete warning - this.startWritePosition = exporterOptions!.Protocol == OtlpExportProtocol.Grpc ? GrpcStartWritePosition : 0; + this.startWritePosition = exporterOptions.Protocol == OtlpExportProtocol.Grpc ? GrpcStartWritePosition : 0; #pragma warning restore CS0618 // Suppressing gRPC obsolete warning - this.transmissionHandler = transmissionHandler ?? exporterOptions!.GetExportTransmissionHandler(experimentalOptions!, OtlpSignalType.Logs); + this.transmissionHandler = transmissionHandler ?? exporterOptions.GetExportTransmissionHandler(experimentalOptions, OtlpSignalType.Logs); } - internal Resource Resource => this.resource ??= this.ParentProvider.GetResource(); + internal Resource Resource { get => field ??= this.ParentProvider.GetResource(); private set; } /// #pragma warning disable CA1725 // Parameter names should match base declaration @@ -76,7 +69,7 @@ public override ExportResult Export(in Batch logRecordBatch) try { - int writePosition = ProtobufOtlpLogSerializer.WriteLogsData(ref this.buffer, this.startWritePosition, this.sdkLimitOptions, this.experimentalOptions, this.Resource, logRecordBatch); + var writePosition = ProtobufOtlpLogSerializer.WriteLogsData(ref this.buffer, this.startWritePosition, this.sdkLimitOptions, this.experimentalOptions, this.Resource, logRecordBatch); if (this.startWritePosition == GrpcStartWritePosition) { @@ -84,7 +77,7 @@ public override ExportResult Export(in Batch logRecordBatch) // byte 0 - Specifying if the payload is compressed. // 1-4 byte - Specifies the length of payload in big endian format. // 5 and above - Protobuf serialized data. - Span data = new Span(this.buffer, 1, 4); + var data = new Span(this.buffer, 1, 4); var dataLength = writePosition - GrpcStartWritePosition; BinaryPrimitives.WriteUInt32BigEndian(data, (uint)dataLength); } diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporterHelperExtensions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporterHelperExtensions.cs index e6eb13e3dc2..45c2a15de21 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporterHelperExtensions.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporterHelperExtensions.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -282,15 +281,9 @@ internal static BaseProcessor BuildOtlpLogExporter( bool skipUseOtlpExporterRegistrationCheck = false, Func, BaseExporter>? configureExporterInstance = null) { - Debug.Assert(serviceProvider != null, "serviceProvider was null"); - Debug.Assert(exporterOptions != null, "exporterOptions was null"); - Debug.Assert(processorOptions != null, "processorOptions was null"); - Debug.Assert(sdkLimitOptions != null, "sdkLimitOptions was null"); - Debug.Assert(experimentalOptions != null, "experimentalOptions was null"); - #if NETFRAMEWORK || NETSTANDARD2_0 #pragma warning disable CS0618 // Suppressing gRPC obsolete warning - if (exporterOptions!.Protocol == OtlpExportProtocol.Grpc && + if (exporterOptions.Protocol == OtlpExportProtocol.Grpc && ReferenceEquals(exporterOptions.HttpClientFactory, exporterOptions.DefaultHttpClientFactory)) #pragma warning restore CS0618 // Suppressing gRPC obsolete warning { @@ -301,7 +294,7 @@ internal static BaseProcessor BuildOtlpLogExporter( if (!skipUseOtlpExporterRegistrationCheck) { - serviceProvider!.EnsureNoUseOtlpExporterRegistrations(); + serviceProvider.EnsureNoUseOtlpExporterRegistrations(); } /* @@ -322,9 +315,9 @@ internal static BaseProcessor BuildOtlpLogExporter( #pragma warning disable CA2000 // Dispose objects before losing scope BaseExporter otlpExporter = new OtlpLogExporter( - exporterOptions!, - sdkLimitOptions!, - experimentalOptions!); + exporterOptions, + sdkLimitOptions, + experimentalOptions); #pragma warning restore CA2000 // Dispose objects before losing scope try @@ -334,7 +327,7 @@ internal static BaseProcessor BuildOtlpLogExporter( otlpExporter = configureExporterInstance(otlpExporter); } - if (processorOptions!.ExportProcessorType == ExportProcessorType.Simple) + if (processorOptions.ExportProcessorType == ExportProcessorType.Simple) { return new SimpleLogRecordExportProcessor(otlpExporter); } diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpMetricExporter.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpMetricExporter.cs index 1ff7dcc5ae5..9bcec629b79 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpMetricExporter.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpMetricExporter.cs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 using System.Buffers.Binary; -using System.Diagnostics; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.Serializer; using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.Transmission; @@ -21,8 +20,6 @@ public class OtlpMetricExporter : BaseExporter private readonly OtlpExporterTransmissionHandler transmissionHandler; private readonly int startWritePosition; - private Resource? resource; - // Initial buffer size set to ~732KB. // This choice allows us to gradually grow the buffer while targeting a final capacity of around 100 MB, // by the 7th doubling to maintain efficient allocation without frequent resizing. @@ -33,7 +30,7 @@ public class OtlpMetricExporter : BaseExporter /// /// Configuration options for the exporter. public OtlpMetricExporter(OtlpExporterOptions options) - : this(options, experimentalOptions: new(), transmissionHandler: null) + : this(options ?? throw new ArgumentNullException(nameof(options)), experimentalOptions: new(), transmissionHandler: null) { } @@ -48,16 +45,13 @@ internal OtlpMetricExporter( ExperimentalOptions experimentalOptions, OtlpExporterTransmissionHandler? transmissionHandler = null) { - Debug.Assert(exporterOptions != null, "exporterOptions was null"); - Debug.Assert(experimentalOptions != null, "experimentalOptions was null"); - #pragma warning disable CS0618 // Suppressing gRPC obsolete warning - this.startWritePosition = exporterOptions!.Protocol == OtlpExportProtocol.Grpc ? GrpcStartWritePosition : 0; + this.startWritePosition = exporterOptions.Protocol == OtlpExportProtocol.Grpc ? GrpcStartWritePosition : 0; #pragma warning restore CS0618 // Suppressing gRPC obsolete warning - this.transmissionHandler = transmissionHandler ?? exporterOptions!.GetExportTransmissionHandler(experimentalOptions!, OtlpSignalType.Metrics); + this.transmissionHandler = transmissionHandler ?? exporterOptions.GetExportTransmissionHandler(experimentalOptions, OtlpSignalType.Metrics); } - internal Resource Resource => this.resource ??= this.ParentProvider.GetResource(); + internal Resource Resource { get => field ??= this.ParentProvider.GetResource(); private set; } /// #pragma warning disable CA1725 // Parameter names should match base declaration @@ -69,7 +63,7 @@ public override ExportResult Export(in Batch metrics) try { - int writePosition = ProtobufOtlpMetricSerializer.WriteMetricsData(ref this.buffer, this.startWritePosition, this.Resource, metrics); + var writePosition = ProtobufOtlpMetricSerializer.WriteMetricsData(ref this.buffer, this.startWritePosition, this.Resource, metrics); if (this.startWritePosition == GrpcStartWritePosition) { @@ -77,7 +71,7 @@ public override ExportResult Export(in Batch metrics) // byte 0 - Specifying if the payload is compressed. // 1-4 byte - Specifies the length of payload in big endian format. // 5 and above - Protobuf serialized data. - Span data = new Span(this.buffer, 1, 4); + var data = new Span(this.buffer, 1, 4); var dataLength = writePosition - GrpcStartWritePosition; BinaryPrimitives.WriteUInt32BigEndian(data, (uint)dataLength); } diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpMetricExporterExtensions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpMetricExporterExtensions.cs index 19801f64158..543f8153f0b 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpMetricExporterExtensions.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpMetricExporterExtensions.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using OpenTelemetry.Exporter; @@ -163,14 +162,9 @@ internal static MetricReader BuildOtlpExporterMetricReader( bool skipUseOtlpExporterRegistrationCheck = false, Func, BaseExporter>? configureExporterInstance = null) { - Debug.Assert(serviceProvider != null, "serviceProvider was null"); - Debug.Assert(exporterOptions != null, "exporterOptions was null"); - Debug.Assert(metricReaderOptions != null, "metricReaderOptions was null"); - Debug.Assert(experimentalOptions != null, "experimentalOptions was null"); - #if NETFRAMEWORK || NETSTANDARD2_0 #pragma warning disable CS0618 // Suppressing gRPC obsolete warning - if (exporterOptions!.Protocol == OtlpExportProtocol.Grpc && + if (exporterOptions.Protocol == OtlpExportProtocol.Grpc && ReferenceEquals(exporterOptions.HttpClientFactory, exporterOptions.DefaultHttpClientFactory)) #pragma warning restore CS0618 // Suppressing gRPC obsolete warning { @@ -181,13 +175,13 @@ internal static MetricReader BuildOtlpExporterMetricReader( if (!skipUseOtlpExporterRegistrationCheck) { - serviceProvider!.EnsureNoUseOtlpExporterRegistrations(); + serviceProvider.EnsureNoUseOtlpExporterRegistrations(); } - exporterOptions!.TryEnableIHttpClientFactoryIntegration(serviceProvider!, "OtlpMetricExporter"); + exporterOptions.TryEnableIHttpClientFactoryIntegration(serviceProvider, "OtlpMetricExporter"); #pragma warning disable CA2000 // Dispose objects before losing scope - BaseExporter metricExporter = new OtlpMetricExporter(exporterOptions!, experimentalOptions!); + BaseExporter metricExporter = new OtlpMetricExporter(exporterOptions, experimentalOptions); #pragma warning restore CA2000 // Dispose objects before losing scope if (configureExporterInstance != null) @@ -197,6 +191,6 @@ internal static MetricReader BuildOtlpExporterMetricReader( return PeriodicExportingMetricReaderHelper.CreatePeriodicExportingMetricReader( metricExporter, - metricReaderOptions!); + metricReaderOptions); } } diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpTraceExporter.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpTraceExporter.cs index 6f10f51e7b2..316f24b2d14 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpTraceExporter.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpTraceExporter.cs @@ -21,8 +21,6 @@ public class OtlpTraceExporter : BaseExporter private readonly OtlpExporterTransmissionHandler transmissionHandler; private readonly int startWritePosition; - private Resource? resource; - // Initial buffer size set to ~732KB. // This choice allows us to gradually grow the buffer while targeting a final capacity of around 100 MB, // by the 7th doubling to maintain efficient allocation without frequent resizing. @@ -33,7 +31,7 @@ public class OtlpTraceExporter : BaseExporter /// /// Configuration options for the export. public OtlpTraceExporter(OtlpExporterOptions options) - : this(options, sdkLimitOptions: new(), experimentalOptions: new(), transmissionHandler: null) + : this(options ?? throw new ArgumentNullException(nameof(options)), sdkLimitOptions: new(), experimentalOptions: new(), transmissionHandler: null) { } @@ -50,17 +48,14 @@ internal OtlpTraceExporter( ExperimentalOptions experimentalOptions, OtlpExporterTransmissionHandler? transmissionHandler = null) { - Debug.Assert(exporterOptions != null, "exporterOptions was null"); - Debug.Assert(sdkLimitOptions != null, "sdkLimitOptions was null"); - - this.sdkLimitOptions = sdkLimitOptions!; + this.sdkLimitOptions = sdkLimitOptions; #pragma warning disable CS0618 // Suppressing gRPC obsolete warning - this.startWritePosition = exporterOptions!.Protocol == OtlpExportProtocol.Grpc ? GrpcStartWritePosition : 0; + this.startWritePosition = exporterOptions.Protocol == OtlpExportProtocol.Grpc ? GrpcStartWritePosition : 0; #pragma warning restore CS0618 // Suppressing gRPC obsolete warning - this.transmissionHandler = transmissionHandler ?? exporterOptions!.GetExportTransmissionHandler(experimentalOptions, OtlpSignalType.Traces); + this.transmissionHandler = transmissionHandler ?? exporterOptions.GetExportTransmissionHandler(experimentalOptions, OtlpSignalType.Traces); } - internal Resource Resource => this.resource ??= this.ParentProvider.GetResource(); + internal Resource Resource { get => field ??= this.ParentProvider.GetResource(); private set; } /// #pragma warning disable CA1725 // Parameter names should match base declaration @@ -72,7 +67,7 @@ public override ExportResult Export(in Batch activityBatch) try { - int writePosition = ProtobufOtlpTraceSerializer.WriteTraceData(ref this.buffer, this.startWritePosition, this.sdkLimitOptions, this.Resource, activityBatch); + var writePosition = ProtobufOtlpTraceSerializer.WriteTraceData(ref this.buffer, this.startWritePosition, this.sdkLimitOptions, this.Resource, activityBatch); if (this.startWritePosition == GrpcStartWritePosition) { @@ -80,7 +75,7 @@ public override ExportResult Export(in Batch activityBatch) // byte 0 - Specifying if the payload is compressed. // 1-4 byte - Specifies the length of payload in big endian format. // 5 and above - Protobuf serialized data. - Span data = new Span(this.buffer, 1, 4); + var data = new Span(this.buffer, 1, 4); var dataLength = writePosition - GrpcStartWritePosition; BinaryPrimitives.WriteUInt32BigEndian(data, (uint)dataLength); } diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpTraceExporterHelperExtensions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpTraceExporterHelperExtensions.cs index 021e347f838..c9d448f57ac 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpTraceExporterHelperExtensions.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpTraceExporterHelperExtensions.cs @@ -123,15 +123,9 @@ internal static BaseProcessor BuildOtlpExporterProcessor( bool skipUseOtlpExporterRegistrationCheck = false, Func, BaseExporter>? configureExporterInstance = null) { - Debug.Assert(serviceProvider != null, "serviceProvider was null"); - Debug.Assert(exporterOptions != null, "exporterOptions was null"); - Debug.Assert(sdkLimitOptions != null, "sdkLimitOptions was null"); - Debug.Assert(experimentalOptions != null, "experimentalOptions was null"); - Debug.Assert(batchExportProcessorOptions != null, "batchExportProcessorOptions was null"); - #if NETFRAMEWORK || NETSTANDARD2_0 #pragma warning disable CS0618 // Suppressing gRPC obsolete warning - if (exporterOptions!.Protocol == OtlpExportProtocol.Grpc && + if (exporterOptions.Protocol == OtlpExportProtocol.Grpc && ReferenceEquals(exporterOptions.HttpClientFactory, exporterOptions.DefaultHttpClientFactory)) #pragma warning restore CS0618 // Suppressing gRPC obsolete warning { @@ -142,13 +136,13 @@ internal static BaseProcessor BuildOtlpExporterProcessor( if (!skipUseOtlpExporterRegistrationCheck) { - serviceProvider!.EnsureNoUseOtlpExporterRegistrations(); + serviceProvider.EnsureNoUseOtlpExporterRegistrations(); } - exporterOptions!.TryEnableIHttpClientFactoryIntegration(serviceProvider!, "OtlpTraceExporter"); + exporterOptions.TryEnableIHttpClientFactoryIntegration(serviceProvider, "OtlpTraceExporter"); #pragma warning disable CA2000 // Dispose objects before losing scope - BaseExporter otlpExporter = new OtlpTraceExporter(exporterOptions!, sdkLimitOptions!, experimentalOptions!); + BaseExporter otlpExporter = new OtlpTraceExporter(exporterOptions, sdkLimitOptions, experimentalOptions); #pragma warning restore CA2000 // Dispose objects before losing scope try @@ -158,19 +152,14 @@ internal static BaseProcessor BuildOtlpExporterProcessor( otlpExporter = configureExporterInstance(otlpExporter); } - if (exportProcessorType == ExportProcessorType.Simple) - { - return new SimpleActivityExportProcessor(otlpExporter); - } - else - { - return new BatchActivityExportProcessor( + return exportProcessorType == ExportProcessorType.Simple + ? new SimpleActivityExportProcessor(otlpExporter) + : new BatchActivityExportProcessor( otlpExporter, - batchExportProcessorOptions!.MaxQueueSize, + batchExportProcessorOptions.MaxQueueSize, batchExportProcessorOptions.ScheduledDelayMilliseconds, batchExportProcessorOptions.ExporterTimeoutMilliseconds, batchExportProcessorOptions.MaxExportBatchSize); - } } catch { diff --git a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusCollectionManager.cs b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusCollectionManager.cs index 7664b35b817..b5720f43aec 100644 --- a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusCollectionManager.cs +++ b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusCollectionManager.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using System.Runtime.CompilerServices; using OpenTelemetry.Metrics; @@ -132,12 +131,8 @@ public Task EnterCollect(bool openMetricsRequested) try { this.collectionRunning = false; - - if (this.collectionTcs != null) - { - this.collectionTcs.SetResult(response); - this.collectionTcs = null; - } + this.collectionTcs?.SetResult(response); + this.collectionTcs = null; } finally { @@ -153,9 +148,7 @@ public Task EnterCollect(bool openMetricsRequested) [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ExitCollect() - { - Interlocked.Decrement(ref this.readerCount); - } + => Interlocked.Decrement(ref this.readerCount); private static bool IncreaseBufferSize(ref byte[] buffer) { @@ -191,9 +184,7 @@ private void EnterGlobalLock() [MethodImpl(MethodImplOptions.AggressiveInlining)] private void ExitGlobalLock() - { - Interlocked.Exchange(ref this.globalLockState, 0); - } + => Interlocked.Exchange(ref this.globalLockState, 0); [MethodImpl(MethodImplOptions.AggressiveInlining)] private void WaitForReadersToComplete() @@ -214,8 +205,6 @@ private void WaitForReadersToComplete() [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool ExecuteCollect(bool openMetricsRequested) { - Debug.Assert(this.exporter.Collect != null, "this.exporter.Collect was null"); - this.exporter.OnExport = this.onCollectRef; this.exporter.OpenMetricsRequested = openMetricsRequested; var result = this.exporter.Collect!(Timeout.Infinite); @@ -226,7 +215,7 @@ private bool ExecuteCollect(bool openMetricsRequested) private ExportResult OnCollect(in Batch metrics) { var cursor = 0; - ref byte[] buffer = ref (this.exporter.OpenMetricsRequested ? ref this.openMetricsBuffer : ref this.plainTextBuffer); + ref var buffer = ref (this.exporter.OpenMetricsRequested ? ref this.openMetricsBuffer : ref this.plainTextBuffer); try { diff --git a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusExporter.cs b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusExporter.cs index f1cca1d3c19..7cc833036f0 100644 --- a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusExporter.cs +++ b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusExporter.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using OpenTelemetry.Internal; using OpenTelemetry.Metrics; using OpenTelemetry.Resources; @@ -14,7 +13,6 @@ namespace OpenTelemetry.Exporter.Prometheus; [ExportModes(ExportModes.Pull)] internal sealed class PrometheusExporter : BaseExporter, IPullMetricExporter { - private Resource? resource; private bool disposed; /// @@ -53,15 +51,11 @@ public PrometheusExporter(PrometheusExporterOptions options) internal bool DisableTimestamp { get; set; } - internal Resource Resource => this.resource ??= this.ParentProvider.GetResource(); + internal Resource Resource { get => field ??= this.ParentProvider.GetResource(); private set; } /// public override ExportResult Export(in Batch metrics) - { - Debug.Assert(this.OnExport != null, "this.OnExport was null"); - - return this.OnExport!(in metrics); - } + => this.OnExport!(in metrics); /// protected override void Dispose(bool disposing) diff --git a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusMetric.cs b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusMetric.cs index 036123a75a9..df1632ca467 100644 --- a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusMetric.cs +++ b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusMetric.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Text; using OpenTelemetry.Metrics; @@ -114,7 +113,10 @@ internal static string SanitizeMetricName(string metricName) return sb?.ToString() ?? metricName; - static StringBuilder CreateStringBuilder(string name) => new(name.Length); + static StringBuilder CreateStringBuilder(string name) + { + return new(name.Length); + } } internal static string RemoveAnnotations(string unit) @@ -157,8 +159,6 @@ internal static string RemoveAnnotations(string unit) return unit; } - Debug.Assert(sb != null, "sb was null"); - sb!.Append(unit, lastWriteIndex, unit.Length - lastWriteIndex); return sb.ToString(); @@ -166,7 +166,7 @@ internal static string RemoveAnnotations(string unit) internal static PrometheusType GetPrometheusType(MetricType openTelemetryMetricType) { - int metricType = (int)openTelemetryMetricType >> 4; + var metricType = (int)openTelemetryMetricType >> 4; /* Counter becomes counter Gauge becomes gauge @@ -215,7 +215,7 @@ private static bool TryProcessRateUnits(string updatedUnit, [NotNullWhen(true)] { updatedPerUnit = null; - for (int i = 0; i < updatedUnit.Length; i++) + for (var i = 0; i < updatedUnit.Length; i++) { if (updatedUnit[i] == '/') { diff --git a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusSerializer.cs b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusSerializer.cs index c199a6695c5..1d2d91c17da 100644 --- a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusSerializer.cs +++ b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/Internal/PrometheusSerializer.cs @@ -32,7 +32,7 @@ public static int WriteDouble(byte[] buffer, int cursor, double value) var result = value.TryFormat(span, out var cchWritten, "G", CultureInfo.InvariantCulture); Debug.Assert(result, $"{nameof(result)} should be true."); - for (int i = 0; i < cchWritten; i++) + for (var i = 0; i < cchWritten; i++) { buffer[cursor++] = unchecked((byte)span[i]); } @@ -66,7 +66,7 @@ public static int WriteLong(byte[] buffer, int cursor, long value) var result = value.TryFormat(span, out var cchWritten, "G", CultureInfo.InvariantCulture); Debug.Assert(result, $"{nameof(result)} should be true."); - for (int i = 0; i < cchWritten; i++) + for (var i = 0; i < cchWritten; i++) { buffer[cursor++] = unchecked((byte)span[i]); } @@ -80,7 +80,7 @@ public static int WriteLong(byte[] buffer, int cursor, long value) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int WriteAsciiStringNoEscape(byte[] buffer, int cursor, string value) { - for (int i = 0; i < value.Length; i++) + for (var i = 0; i < value.Length; i++) { buffer[cursor++] = unchecked((byte)value[i]); } @@ -114,7 +114,7 @@ public static int WriteUnicodeNoEscape(byte[] buffer, int cursor, ushort ordinal [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int WriteUnicodeString(byte[] buffer, int cursor, string value) { - for (int i = 0; i < value.Length; i++) + for (var i = 0; i < value.Length; i++) { var ordinal = (ushort)value[i]; switch (ordinal) @@ -143,25 +143,21 @@ public static int WriteLabelKey(byte[] buffer, int cursor, string value) var ordinal = (ushort)value[0]; - if (ordinal >= (ushort)'0' && ordinal <= (ushort)'9') + if (ordinal is >= '0' and <= '9') { buffer[cursor++] = unchecked((byte)'_'); } - for (int i = 0; i < value.Length; i++) + for (var i = 0; i < value.Length; i++) { - ordinal = (ushort)value[i]; - - if ((ordinal >= (ushort)'A' && ordinal <= (ushort)'Z') || - (ordinal >= (ushort)'a' && ordinal <= (ushort)'z') || - (ordinal >= (ushort)'0' && ordinal <= (ushort)'9')) - { - buffer[cursor++] = unchecked((byte)ordinal); - } - else - { - buffer[cursor++] = unchecked((byte)'_'); - } + ordinal = value[i]; + + buffer[cursor++] = + ordinal is (>= 'A' and <= 'Z') or + (>= 'a' and <= 'z') or + (>= '0' and <= '9') + ? (byte)ordinal + : (byte)'_'; } return cursor; @@ -170,9 +166,7 @@ public static int WriteLabelKey(byte[] buffer, int cursor, string value) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int WriteLabelValue(byte[] buffer, int cursor, string value) { - Debug.Assert(value != null, $"{nameof(value)} should not be null."); - - for (int i = 0; i < value!.Length; i++) + for (var i = 0; i < value.Length; i++) { var ordinal = (ushort)value[i]; switch (ordinal) @@ -215,12 +209,7 @@ static string GetLabelValueString(object? labelValue) { // TODO: Attribute values should be written as their JSON representation. Extra logic may need to be added here to correctly convert other .NET types. // More detail: https://github.com/open-telemetry/opentelemetry-dotnet/issues/4822#issuecomment-1707328495 - if (labelValue is bool b) - { - return b ? "true" : "false"; - } - - return labelValue?.ToString() ?? string.Empty; + return labelValue is bool b ? b ? "true" : "false" : labelValue?.ToString() ?? string.Empty; } } @@ -232,7 +221,7 @@ public static int WriteMetricName(byte[] buffer, int cursor, PrometheusMetric me Debug.Assert(!string.IsNullOrWhiteSpace(name), "name was null or whitespace"); - for (int i = 0; i < name.Length; i++) + for (var i = 0; i < name.Length; i++) { var ordinal = (ushort)name[i]; buffer[cursor++] = unchecked((byte)ordinal); @@ -249,7 +238,7 @@ public static int WriteMetricMetadataName(byte[] buffer, int cursor, PrometheusM Debug.Assert(!string.IsNullOrWhiteSpace(name), "name was null or whitespace"); - for (int i = 0; i < name.Length; i++) + for (var i = 0; i < name.Length; i++) { var ordinal = (ushort)name[i]; buffer[cursor++] = unchecked((byte)ordinal); @@ -320,7 +309,9 @@ public static int WriteUnitMetadata(byte[] buffer, int cursor, PrometheusMetric buffer[cursor++] = unchecked((byte)' '); // Unit name has already been escaped. - for (int i = 0; i < metric.Unit!.Length; i++) +#pragma warning disable IDE0370 // Remove unnecessary suppression + for (var i = 0; i < metric.Unit!.Length; i++) +#pragma warning restore IDE0370 // Remove unnecessary suppression { var ordinal = (ushort)metric.Unit[i]; buffer[cursor++] = unchecked((byte)ordinal); @@ -364,7 +355,7 @@ public static int WriteTimestamp(byte[] buffer, int cursor, long value, bool use cursor = WriteLong(buffer, cursor, value / 1000); buffer[cursor++] = unchecked((byte)'.'); - long millis = value % 1000; + var millis = value % 1000; if (millis < 100) { @@ -456,15 +447,12 @@ public static int WriteTargetInfo(byte[] buffer, int cursor, Resource resource) return cursor; } - private static string MapPrometheusType(PrometheusType type) + private static string MapPrometheusType(PrometheusType type) => type switch { - return type switch - { - PrometheusType.Gauge => "gauge", - PrometheusType.Counter => "counter", - PrometheusType.Summary => "summary", - PrometheusType.Histogram => "histogram", - _ => "untyped", - }; - } + PrometheusType.Gauge => "gauge", + PrometheusType.Counter => "counter", + PrometheusType.Summary => "summary", + PrometheusType.Histogram => "histogram", + PrometheusType.Untyped or _ => "untyped", + }; } diff --git a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/PrometheusHttpListener.cs b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/PrometheusHttpListener.cs index 66059555c02..dbc1e7e75f0 100644 --- a/src/OpenTelemetry.Exporter.Prometheus.HttpListener/PrometheusHttpListener.cs +++ b/src/OpenTelemetry.Exporter.Prometheus.HttpListener/PrometheusHttpListener.cs @@ -28,7 +28,7 @@ public PrometheusHttpListener(PrometheusExporter exporter, PrometheusHttpListene this.exporter = exporter; - string path = options.ScrapeEndpointPath ?? PrometheusHttpListenerOptions.DefaultScrapeEndpointPath; + var path = options.ScrapeEndpointPath ?? PrometheusHttpListenerOptions.DefaultScrapeEndpointPath; #if NET11_0_OR_GREATER if (!path.StartsWith('/', StringComparison.Ordinal)) @@ -52,7 +52,7 @@ public PrometheusHttpListener(PrometheusExporter exporter, PrometheusHttpListene path = $"{path}/"; } - foreach (string uriPrefix in options.UriPrefixes) + foreach (var uriPrefix in options.UriPrefixes) { this.httpListener.Prefixes.Add($"{uriPrefix.TrimEnd('/')}{path}"); } diff --git a/src/OpenTelemetry.Exporter.Zipkin/Implementation/PooledList.cs b/src/OpenTelemetry.Exporter.Zipkin/Implementation/PooledList.cs index 7027dc4e4b1..bd006224ca7 100644 --- a/src/OpenTelemetry.Exporter.Zipkin/Implementation/PooledList.cs +++ b/src/OpenTelemetry.Exporter.Zipkin/Implementation/PooledList.cs @@ -27,15 +27,10 @@ private PooledList(T[] buffer, int count) object ICollection.SyncRoot => this; - public ref T this[int index] - { - get => ref this.buffer[index]; - } + public ref T this[int index] => ref this.buffer[index]; public static PooledList Create() - { - return new PooledList(ArrayPool.Shared.Rent(LastAllocatedSize), 0); - } + => new(ArrayPool.Shared.Rent(LastAllocatedSize), 0); public static void Add(ref PooledList list, T item) { @@ -60,9 +55,7 @@ public static void Add(ref PooledList list, T item) } public static void Clear(ref PooledList list) - { - list = new PooledList(list.buffer, 0); - } + => list = new PooledList(list.buffer, 0); public void Return() { @@ -74,24 +67,16 @@ public void Return() } void ICollection.CopyTo(Array array, int index) - { - Array.Copy(this.buffer, 0, array, index, this.Count); - } + => Array.Copy(this.buffer, 0, array, index, this.Count); public Enumerator GetEnumerator() - { - return new Enumerator(in this); - } + => new(in this); IEnumerator IEnumerable.GetEnumerator() - { - return new Enumerator(in this); - } + => new Enumerator(in this); IEnumerator IEnumerable.GetEnumerator() - { - return new Enumerator(in this); - } + => new Enumerator(in this); public struct Enumerator : IEnumerator, IEnumerator { @@ -109,11 +94,11 @@ public Enumerator(in PooledList list) this.current = default; } - public T Current => this.current; + public readonly T Current => this.current; - object? IEnumerator.Current => this.Current; + readonly object? IEnumerator.Current => this.Current; - public void Dispose() + public readonly void Dispose() { } diff --git a/src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinActivityConversionExtensions.cs b/src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinActivityConversionExtensions.cs index 247cd87463b..830291862aa 100644 --- a/src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinActivityConversionExtensions.cs +++ b/src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinActivityConversionExtensions.cs @@ -20,14 +20,14 @@ internal static class ZipkinActivityConversionExtensions internal static ZipkinSpan ToZipkinSpan(this Activity activity, ZipkinEndpoint localEndpoint, bool useShortTraceIds = false) { var context = activity.Context; - string? parentId = activity.ParentSpanId == default ? null : EncodeSpanId(activity.ParentSpanId); + var parentId = activity.ParentSpanId == default ? null : EncodeSpanId(activity.ParentSpanId); var tags = PooledList>.Create(); ExtractActivityTags(activity, ref tags); ExtractActivityStatus(activity, ref tags); ExtractActivitySource(activity, ref tags); - ZipkinEndpoint? remoteEndpoint = ExtractRemoteEndpoint(activity); + var remoteEndpoint = ExtractRemoteEndpoint(activity); var annotations = ExtractActivityEvents(activity); return new ZipkinSpan( @@ -47,28 +47,24 @@ internal static ZipkinSpan ToZipkinSpan(this Activity activity, ZipkinEndpoint l } internal static string EncodeSpanId(ActivitySpanId spanId) - { - return spanId.ToHexString(); - } + => spanId.ToHexString(); internal static long ToEpochMicroseconds(this DateTimeOffset dateTimeOffset) { // Truncate sub-microsecond precision before offsetting by the Unix Epoch to avoid // the last digit being off by one for dates that result in negative Unix times - long microseconds = dateTimeOffset.Ticks / TicksPerMicrosecond; + var microseconds = dateTimeOffset.Ticks / TicksPerMicrosecond; return microseconds - UnixEpochMicroseconds; } internal static long ToEpochMicroseconds(this TimeSpan timeSpan) - { - return timeSpan.Ticks / TicksPerMicrosecond; - } + => timeSpan.Ticks / TicksPerMicrosecond; internal static long ToEpochMicroseconds(this DateTime utcDateTime) { // Truncate sub-microsecond precision before offsetting by the Unix Epoch to avoid // the last digit being off by one for dates that result in negative Unix times - long microseconds = utcDateTime.Ticks / TicksPerMicrosecond; + var microseconds = utcDateTime.Ticks / TicksPerMicrosecond; return microseconds - UnixEpochMicroseconds; } @@ -84,31 +80,26 @@ private static string EncodeTraceId(ActivityTraceId traceId, bool useShortTraceI return id; } - private static string? ToActivityKind(Activity activity) + private static string? ToActivityKind(Activity activity) => activity.Kind switch { - return activity.Kind switch - { - ActivityKind.Server => "SERVER", - ActivityKind.Producer => "PRODUCER", - ActivityKind.Consumer => "CONSUMER", - ActivityKind.Client => "CLIENT", - _ => null, - }; - } + ActivityKind.Server => "SERVER", + ActivityKind.Producer => "PRODUCER", + ActivityKind.Consumer => "CONSUMER", + ActivityKind.Client => "CLIENT", + ActivityKind.Internal or _ => null, + }; private static string ExtractStatusDescription(Activity activity) - { - return activity.StatusDescription - ?? activity.GetTagItem(SpanAttributeConstants.StatusDescriptionKey) as string - ?? activity.GetTagItem(ZipkinErrorFlagTagName) as string - ?? string.Empty; - } + => activity.StatusDescription + ?? activity.GetTagItem(SpanAttributeConstants.StatusDescriptionKey) as string + ?? activity.GetTagItem(ZipkinErrorFlagTagName) as string + ?? string.Empty; private static void ExtractActivityTags(Activity activity, ref PooledList> tags) { foreach (ref readonly var tag in activity.EnumerateTagObjects()) { - if (tag.Key != ZipkinErrorFlagTagName && tag.Key != SpanAttributeConstants.StatusCodeKey) + if (tag.Key is not ZipkinErrorFlagTagName and not SpanAttributeConstants.StatusCodeKey) { PooledList>.Add(ref tags, tag); } @@ -133,7 +124,7 @@ private static void ExtractActivityStatus(Activity activity, ref PooledList>.Add( ref tags, new KeyValuePair( @@ -164,7 +155,7 @@ private static void ExtractActivityStatus(Activity activity, ref PooledList ExtractActivityEvents(Activity activity) diff --git a/src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinTagWriter.cs b/src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinTagWriter.cs index 3e1c42c69ec..ebaa8245e52 100644 --- a/src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinTagWriter.cs +++ b/src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinTagWriter.cs @@ -21,7 +21,7 @@ private ZipkinTagWriter() protected override void WriteIntegralTag(ref Utf8JsonWriter writer, string key, long value) { Span destination = stackalloc byte[StackallocByteThreshold]; - if (Utf8Formatter.TryFormat(value, destination, out int bytesWritten)) + if (Utf8Formatter.TryFormat(value, destination, out var bytesWritten)) { writer.WriteString(key, destination.Slice(0, bytesWritten)); } @@ -34,7 +34,7 @@ protected override void WriteIntegralTag(ref Utf8JsonWriter writer, string key, protected override void WriteFloatingPointTag(ref Utf8JsonWriter writer, string key, double value) { Span destination = stackalloc byte[StackallocByteThreshold]; - if (Utf8Formatter.TryFormat(value, destination, out int bytesWritten)) + if (Utf8Formatter.TryFormat(value, destination, out var bytesWritten)) { writer.WriteString(key, destination.Slice(0, bytesWritten)); } diff --git a/src/OpenTelemetry.Exporter.Zipkin/ZipkinExporter.cs b/src/OpenTelemetry.Exporter.Zipkin/ZipkinExporter.cs index ae1be65009c..52a07a924e8 100644 --- a/src/OpenTelemetry.Exporter.Zipkin/ZipkinExporter.cs +++ b/src/OpenTelemetry.Exporter.Zipkin/ZipkinExporter.cs @@ -108,8 +108,10 @@ internal void SetLocalEndpointFromResource(Resource resource) string? ipv6 = null; if (!string.IsNullOrEmpty(hostName)) { +#pragma warning disable IDE0370 // Remove unnecessary suppression ipv4 = ResolveHostAddress(hostName!, AddressFamily.InterNetwork); ipv6 = ResolveHostAddress(hostName!, AddressFamily.InterNetworkV6); +#pragma warning restore IDE0370 // Remove unnecessary suppression } string? serviceName = null; @@ -124,8 +126,8 @@ internal void SetLocalEndpointFromResource(Resource resource) if (string.IsNullOrEmpty(serviceName)) { - serviceName = (string)this.ParentProvider.GetDefaultResource().Attributes.Where( - pair => pair.Key == ResourceSemanticConventions.AttributeServiceName).FirstOrDefault().Value; + serviceName = (string)this.ParentProvider.GetDefaultResource().Attributes.FirstOrDefault( + pair => pair.Key == ResourceSemanticConventions.AttributeServiceName).Value; } this.LocalEndpoint = new ZipkinEndpoint( diff --git a/src/OpenTelemetry.Exporter.Zipkin/ZipkinExporterHelperExtensions.cs b/src/OpenTelemetry.Exporter.Zipkin/ZipkinExporterHelperExtensions.cs index 67ec2ae80c6..72b2446310a 100644 --- a/src/OpenTelemetry.Exporter.Zipkin/ZipkinExporterHelperExtensions.cs +++ b/src/OpenTelemetry.Exporter.Zipkin/ZipkinExporterHelperExtensions.cs @@ -83,13 +83,13 @@ private static BaseProcessor BuildZipkinExporterProcessor( { options.HttpClientFactory = () => { - Type? httpClientFactoryType = Type.GetType("System.Net.Http.IHttpClientFactory, Microsoft.Extensions.Http", throwOnError: false); + var httpClientFactoryType = Type.GetType("System.Net.Http.IHttpClientFactory, Microsoft.Extensions.Http", throwOnError: false); if (httpClientFactoryType != null) { - object? httpClientFactory = serviceProvider.GetService(httpClientFactoryType); + var httpClientFactory = serviceProvider.GetService(httpClientFactoryType); if (httpClientFactory != null) { - MethodInfo? createClientMethod = httpClientFactoryType.GetMethod( + var createClientMethod = httpClientFactoryType.GetMethod( "CreateClient", BindingFlags.Public | BindingFlags.Instance, binder: null, diff --git a/src/OpenTelemetry.Exporter.Zipkin/ZipkinExporterOptions.cs b/src/OpenTelemetry.Exporter.Zipkin/ZipkinExporterOptions.cs index 2090d24b28a..94bb5ba4964 100644 --- a/src/OpenTelemetry.Exporter.Zipkin/ZipkinExporterOptions.cs +++ b/src/OpenTelemetry.Exporter.Zipkin/ZipkinExporterOptions.cs @@ -38,22 +38,19 @@ internal ZipkinExporterOptions( IConfiguration configuration, BatchExportActivityProcessorOptions defaultBatchOptions) { - Debug.Assert(configuration != null, "configuration was null"); - Debug.Assert(defaultBatchOptions != null, "defaultBatchOptions was null"); - - if (configuration!.TryGetUriValue(ZipkinExporterEventSource.Log, ZipkinEndpointEnvVar, out var endpoint)) + if (configuration.TryGetUriValue(ZipkinExporterEventSource.Log, ZipkinEndpointEnvVar, out var endpoint)) { this.Endpoint = endpoint; } - this.BatchExportProcessorOptions = defaultBatchOptions!; + this.BatchExportProcessorOptions = defaultBatchOptions; } /// /// Gets or sets Zipkin endpoint address. See https://zipkin.io/zipkin-api/#/default/post_spans. /// Typically https://zipkin-server-name:9411/api/v2/spans. /// - public Uri Endpoint { get; set; } = new Uri(DefaultZipkinEndpoint); + public Uri Endpoint { get; set; } = new(DefaultZipkinEndpoint); /// /// Gets or sets a value indicating whether short trace id should be used. diff --git a/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs b/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs index ba2ac37ef01..2e6b43e8bae 100644 --- a/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs +++ b/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using OpenTelemetry.Logs; @@ -33,27 +32,23 @@ public Task StartAsync(CancellationToken cancellationToken) } public Task StopAsync(CancellationToken cancellationToken) - { - return Task.CompletedTask; - } + => Task.CompletedTask; internal static void Initialize(IServiceProvider serviceProvider) { - Debug.Assert(serviceProvider != null, "serviceProvider was null"); - - var meterProvider = serviceProvider!.GetService(); + var meterProvider = serviceProvider.GetService(); if (meterProvider == null) { HostingExtensionsEventSource.Log.MeterProviderNotRegistered(); } - var tracerProvider = serviceProvider!.GetService(); + var tracerProvider = serviceProvider.GetService(); if (tracerProvider == null) { HostingExtensionsEventSource.Log.TracerProviderNotRegistered(); } - var loggerProvider = serviceProvider!.GetService(); + var loggerProvider = serviceProvider.GetService(); if (loggerProvider == null) { HostingExtensionsEventSource.Log.LoggerProviderNotRegistered(); diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index a91d186ccbd..3954510d30d 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -40,7 +40,7 @@ public static OpenTelemetryBuilder AddOpenTelemetry(this IServiceCollection serv { Guard.ThrowIfNull(services); - if (!services.Any((ServiceDescriptor d) => d.ServiceType == typeof(IHostedService) && d.ImplementationType == typeof(TelemetryHostedService))) + if (!services.Any(d => d.ServiceType == typeof(IHostedService) && d.ImplementationType == typeof(TelemetryHostedService))) { services.Insert(0, ServiceDescriptor.Singleton()); } diff --git a/src/OpenTelemetry.Extensions.Propagators/B3Propagator.cs b/src/OpenTelemetry.Extensions.Propagators/B3Propagator.cs index a7ede4f0a6a..27d28bfa434 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; @@ -201,7 +201,7 @@ private static PropagationContext ExtractFromSingleHeader(PropagationContext } var parts = header.Split(XB3CombinedDelimiter); - if (parts.Length < 2 || parts.Length > 4) + if (parts.Length is < 2 or > 4) { return context; } diff --git a/src/OpenTelemetry.Shims.OpenTracing/ScopeManagerShim.cs b/src/OpenTelemetry.Shims.OpenTracing/ScopeManagerShim.cs index 6b2fb783355..4f4e604593c 100644 --- a/src/OpenTelemetry.Shims.OpenTracing/ScopeManagerShim.cs +++ b/src/OpenTelemetry.Shims.OpenTracing/ScopeManagerShim.cs @@ -10,7 +10,9 @@ namespace OpenTelemetry.Shims.OpenTracing; internal sealed class ScopeManagerShim : IScopeManager { +#pragma warning disable IDE0028 // Simplify collection initialization private static readonly ConditionalWeakTable SpanScopeTable = new(); +#pragma warning restore IDE0028 // Simplify collection initialization #if DEBUG private int spanScopeTableCount; @@ -24,17 +26,12 @@ public IScope? Active get { var currentSpan = Tracer.CurrentSpan; - if (currentSpan == null || !currentSpan.Context.IsValid) - { - return null; - } - - if (SpanScopeTable.TryGetValue(currentSpan, out var openTracingScope)) - { - return openTracingScope; - } - - return new ScopeInstrumentation(currentSpan); + return + currentSpan == null || !currentSpan.Context.IsValid ? + null : + SpanScopeTable.TryGetValue(currentSpan, out var openTracingScope) ? + openTracingScope : + new ScopeInstrumentation(currentSpan); } } @@ -56,7 +53,7 @@ public IScope Activate(ISpan span, bool finishSpanOnDispose) Interlocked.Decrement(ref this.spanScopeTableCount); } #endif - scope!.Dispose(); + scope?.Dispose(); }); SpanScopeTable.Add(shim.Span, instrumentation); @@ -82,8 +79,6 @@ public ScopeInstrumentation(TelemetrySpan span, Action? disposeAction = null) /// public void Dispose() - { - this.disposeAction?.Invoke(); - } + => this.disposeAction?.Invoke(); } } diff --git a/src/OpenTelemetry.Shims.OpenTracing/SpanShim.cs b/src/OpenTelemetry.Shims.OpenTracing/SpanShim.cs index f8a5d981207..a4e61a76eb5 100644 --- a/src/OpenTelemetry.Shims.OpenTracing/SpanShim.cs +++ b/src/OpenTelemetry.Shims.OpenTracing/SpanShim.cs @@ -43,15 +43,11 @@ public SpanShim(TelemetrySpan span) /// public void Finish() - { - this.Span.End(); - } + => this.Span.End(); /// public void Finish(DateTimeOffset finishTimestamp) - { - this.Span.End(finishTimestamp); - } + => this.Span.End(finishTimestamp); /// public string? GetBaggageItem(string key) @@ -114,9 +110,7 @@ public ISpan Log(DateTimeOffset timestamp, IEnumerable public ISpan Log(IEnumerable> fields) - { - return this.Log(DateTimeOffset.MinValue, fields); - } + => this.Log(DateTimeOffset.MinValue, fields); /// public ISpan Log(string @event) @@ -211,12 +205,9 @@ public ISpan SetTag(global::OpenTracing.Tag.IntOrStringTag tag, string? value) { Guard.ThrowIfNull(tag); - if (value != null && int.TryParse(value, out var result)) - { - return this.SetTag(tag.Key, result); - } - - return this.SetTag(tag.Key, value); + return value != null && int.TryParse(value, out var result) ? + this.SetTag(tag.Key, result) : + this.SetTag(tag.Key, value); } /// @@ -276,7 +267,11 @@ private static Tuple> ConvertToEventPayload( else { // TODO should we completely ignore unsupported types? +#if NET attributes.Add(field.Key, field.Value.ToString()!); +#else + attributes.Add(field.Key, field.Value.ToString()); +#endif } } diff --git a/src/OpenTelemetry/BaseProcessor.cs b/src/OpenTelemetry/BaseProcessor.cs index b75cc24d86e..d3b3fe7cdb4 100644 --- a/src/OpenTelemetry/BaseProcessor.cs +++ b/src/OpenTelemetry/BaseProcessor.cs @@ -94,7 +94,7 @@ public bool ForceFlush(int timeoutMilliseconds = Timeout.Infinite) try { - bool result = this.OnForceFlush(timeoutMilliseconds); + var result = this.OnForceFlush(timeoutMilliseconds); OpenTelemetrySdkEventSource.Log.ProcessorForceFlushInvoked(this.typeName, result); diff --git a/src/OpenTelemetry/Batch.cs b/src/OpenTelemetry/Batch.cs index 4f0e0608dcf..48d9d42eb55 100644 --- a/src/OpenTelemetry/Batch.cs +++ b/src/OpenTelemetry/Batch.cs @@ -52,10 +52,9 @@ public Batch(T item) internal Batch(CircularBuffer circularBuffer, int maxSize) { Debug.Assert(maxSize > 0, $"{nameof(maxSize)} should be a positive number."); - Debug.Assert(circularBuffer != null, $"{nameof(circularBuffer)} was null."); this.circularBuffer = circularBuffer; - this.Count = Math.Min(maxSize, circularBuffer!.Count); + this.Count = Math.Min(maxSize, circularBuffer.Count); this.targetCount = circularBuffer.RemovedCount + this.Count; } @@ -74,7 +73,7 @@ public void Dispose() // Drain anything left in the batch. while (this.circularBuffer.RemovedCount < this.targetCount) { - T item = this.circularBuffer.Read(); + var item = this.circularBuffer.Read(); if (typeof(T) == typeof(LogRecord)) { var logRecord = (LogRecord)(object)item; @@ -92,21 +91,19 @@ public void Dispose() /// /// . public Enumerator GetEnumerator() - { - return this.circularBuffer != null - ? new Enumerator(this.circularBuffer, this.targetCount) - : this.item != null - ? new Enumerator(this.item) - /* In the event someone uses default/new Batch() to create Batch we fallback to empty items mode. */ - : new Enumerator(this.items ?? Array.Empty(), this.targetCount); - } + => this.circularBuffer != null + ? new Enumerator(this.circularBuffer, this.targetCount) + : this.item != null + ? new Enumerator(this.item) + /* In the event someone uses default/new Batch() to create Batch we fallback to empty items mode. */ + : new Enumerator(this.items ?? [], this.targetCount); /// /// Enumerates the elements of a . /// public struct Enumerator : IEnumerator { - private static readonly BatchEnumeratorMoveNextFunc MoveNextSingleItem = (ref Enumerator enumerator) => + private static readonly BatchEnumeratorMoveNextFunc MoveNextSingleItem = (ref enumerator) => { if (enumerator.targetCount >= 0) { @@ -118,7 +115,7 @@ public struct Enumerator : IEnumerator return true; }; - private static readonly BatchEnumeratorMoveNextFunc MoveNextCircularBuffer = (ref Enumerator enumerator) => + private static readonly BatchEnumeratorMoveNextFunc MoveNextCircularBuffer = (ref enumerator) => { var circularBuffer = enumerator.circularBuffer; @@ -132,7 +129,7 @@ public struct Enumerator : IEnumerator return false; }; - private static readonly BatchEnumeratorMoveNextFunc MoveNextCircularBufferLogRecord = (ref Enumerator enumerator) => + private static readonly BatchEnumeratorMoveNextFunc MoveNextCircularBufferLogRecord = (ref enumerator) => { // Note: This type check here is to give the JIT a hint it can // remove all of this code when T != LogRecord @@ -163,7 +160,7 @@ public struct Enumerator : IEnumerator return false; }; - private static readonly BatchEnumeratorMoveNextFunc MoveNextArray = (ref Enumerator enumerator) => + private static readonly BatchEnumeratorMoveNextFunc MoveNextArray = (ref enumerator) => { var items = enumerator.items; @@ -242,9 +239,7 @@ public void Dispose() /// public bool MoveNext() - { - return this.moveNextFunc(ref this); - } + => this.moveNextFunc(ref this); /// public readonly void Reset() diff --git a/src/OpenTelemetry/BatchExportProcessor.cs b/src/OpenTelemetry/BatchExportProcessor.cs index 46a64b8e042..7530ea12701 100644 --- a/src/OpenTelemetry/BatchExportProcessor.cs +++ b/src/OpenTelemetry/BatchExportProcessor.cs @@ -61,7 +61,7 @@ protected BatchExportProcessor( { IsBackground = true, #pragma warning disable CA1062 // Validate arguments of public methods - needed for netstandard2.1 - Name = $"OpenTelemetry-{nameof(BatchExportProcessor)}-{exporter.GetType().Name}", + Name = $"OpenTelemetry-{nameof(BatchExportProcessor<>)}-{exporter.GetType().Name}", #pragma warning restore CA1062 // Validate arguments of public methods - needed for netstandard2.1 }; this.exporterThread.Start(); @@ -109,9 +109,7 @@ internal bool TryExport(T data) /// protected override void OnExport(T data) - { - this.TryExport(data); - } + => this.TryExport(data); /// protected override bool OnForceFlush(int timeoutMilliseconds) diff --git a/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs b/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs index a234f0c8482..e493b3120d1 100644 --- a/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs +++ b/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs @@ -18,39 +18,45 @@ public static IServiceCollection AddOpenTelemetryLoggerProviderBuilderServices(t { Debug.Assert(services != null, "services was null"); - services!.TryAddSingleton(); - services!.RegisterOptionsFactory(configuration => new BatchExportLogRecordProcessorOptions(configuration)); - services!.RegisterOptionsFactory( +#pragma warning disable CS8604 // Possible null reference argument. + services.TryAddSingleton(); + services.RegisterOptionsFactory(configuration => new BatchExportLogRecordProcessorOptions(configuration)); + services.RegisterOptionsFactory( (sp, configuration, name) => new LogRecordExportProcessorOptions( sp.GetRequiredService>().Get(name))); +#pragma warning restore CS8604 // Possible null reference argument. - return services!; + return services; } public static IServiceCollection AddOpenTelemetryMeterProviderBuilderServices(this IServiceCollection services) { Debug.Assert(services != null, "services was null"); - services!.TryAddSingleton(); - services!.RegisterOptionsFactory(configuration => new PeriodicExportingMetricReaderOptions(configuration)); - services!.RegisterOptionsFactory( +#pragma warning disable CS8604 // Possible null reference argument. + services.TryAddSingleton(); + services.RegisterOptionsFactory(configuration => new PeriodicExportingMetricReaderOptions(configuration)); + services.RegisterOptionsFactory( (sp, configuration, name) => new MetricReaderOptions( sp.GetRequiredService>().Get(name))); +#pragma warning restore CS8604 // Possible null reference argument. - return services!; + return services; } public static IServiceCollection AddOpenTelemetryTracerProviderBuilderServices(this IServiceCollection services) { Debug.Assert(services != null, "services was null"); - services!.TryAddSingleton(); - services!.RegisterOptionsFactory(configuration => new BatchExportActivityProcessorOptions(configuration)); - services!.RegisterOptionsFactory( +#pragma warning disable CS8604 // Possible null reference argument. + services.TryAddSingleton(); + services.RegisterOptionsFactory(configuration => new BatchExportActivityProcessorOptions(configuration)); + services.RegisterOptionsFactory( (sp, configuration, name) => new ActivityExportProcessorOptions( sp.GetRequiredService>().Get(name))); +#pragma warning restore CS8604 // Possible null reference argument. - return services!; + return services; } public static IServiceCollection AddOpenTelemetrySharedProviderBuilderServices(this IServiceCollection services) @@ -61,16 +67,18 @@ public static IServiceCollection AddOpenTelemetrySharedProviderBuilderServices(t // which sets default Propagators and default Activity Id format _ = Sdk.SuppressInstrumentation; - services!.AddOptions(); +#pragma warning disable CS8604 // Possible null reference argument. + services.AddOptions(); +#pragma warning restore CS8604 // Possible null reference argument. // Note: When using a host builder IConfiguration is automatically // registered and this registration will no-op. This only runs for // Sdk.Create* style or when manually creating a ServiceCollection. The // point of this registration is to make IConfiguration available in // those cases. - services!.TryAddSingleton( + services.TryAddSingleton( sp => new ConfigurationBuilder().AddEnvironmentVariables().Build()); - return services!; + return services; } } diff --git a/src/OpenTelemetry/Internal/InstrumentationScopeLogger.cs b/src/OpenTelemetry/Internal/InstrumentationScopeLogger.cs index 2e38f7ff041..49432199e5e 100644 --- a/src/OpenTelemetry/Internal/InstrumentationScopeLogger.cs +++ b/src/OpenTelemetry/Internal/InstrumentationScopeLogger.cs @@ -18,11 +18,11 @@ private InstrumentationScopeLogger(string name) public static InstrumentationScopeLogger Default { get; } = new(string.Empty); public static InstrumentationScopeLogger GetInstrumentationScopeLoggerForName(string? name) - { - return string.IsNullOrWhiteSpace(name) + => string.IsNullOrWhiteSpace(name) ? Default +#pragma warning disable IDE0370 // Suppression is unnecessary : Cache.GetOrAdd(name!, static n => new(n)); - } +#pragma warning restore IDE0370 // Suppression is unnecessary public override void EmitLog(in LogRecordData data, in LogRecordAttributeList attributes) => throw new NotSupportedException(); diff --git a/src/OpenTelemetry/Internal/InterlockedHelper.cs b/src/OpenTelemetry/Internal/InterlockedHelper.cs index 98639d234a4..e8c6dcc02c3 100644 --- a/src/OpenTelemetry/Internal/InterlockedHelper.cs +++ b/src/OpenTelemetry/Internal/InterlockedHelper.cs @@ -13,7 +13,7 @@ public static void Add(ref double location, double value) // Note: Not calling InterlockedHelper.Read here on purpose because it // is too expensive for fast/happy-path. If the first attempt fails // we'll end up in an Interlocked.CompareExchange loop anyway. - double currentValue = Volatile.Read(ref location); + var currentValue = Volatile.Read(ref location); var returnedValue = Interlocked.CompareExchange(ref location, currentValue + value, currentValue); if (returnedValue != currentValue) diff --git a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs index 164b1450e5f..9cd69870706 100644 --- a/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs +++ b/src/OpenTelemetry/Internal/OpenTelemetrySdkEventSource.cs @@ -134,7 +134,7 @@ public void LoggerParseStateException(Exception exception) { if (this.IsEnabled(EventLevel.Warning, EventKeywords.All)) { - this.LoggerParseStateException(typeof(TState).FullName!, exception.ToInvariantString()); + this.LoggerParseStateException(GetTypeName(), exception.ToInvariantString()); } } @@ -153,7 +153,7 @@ public void LoggerProcessStateSkipped() if (this.IsEnabled(EventLevel.Warning, EventKeywords.All)) { this.LoggerProcessStateSkipped( - typeof(TState).FullName!, + GetTypeName(), "because it does not implement a supported interface (either IReadOnlyList> or IEnumerable>)"); } } @@ -169,220 +169,161 @@ public void MetricViewException(string source, Exception ex) [Event(4, Message = "Unknown error in SpanProcessor event '{0}': '{1}'.", Level = EventLevel.Error)] public void SpanProcessorException(string evnt, string ex) - { - this.WriteEvent(4, evnt, ex); - } + => this.WriteEvent(4, evnt, ex); [Event(8, Message = "Calling method '{0}' with invalid argument '{1}', issue '{2}'.", Level = EventLevel.Warning)] public void InvalidArgument(string methodName, string argumentName, string issue) - { - this.WriteEvent(8, methodName, argumentName, issue); - } + => this.WriteEvent(8, methodName, argumentName, issue); [Event(16, Message = "Exception occurred while invoking Observable instrument callback. Exception: '{0}'", Level = EventLevel.Warning)] public void ObservableInstrumentCallbackException(string exception) - { - this.WriteEvent(16, exception); - } + => this.WriteEvent(16, exception); [Event(24, Message = "Activity started. Name = '{0}', Id = '{1}'.", Level = EventLevel.Verbose)] public void ActivityStarted(string name, string id) - { - this.WriteEvent(24, name, id); - } + => this.WriteEvent(24, name, id); [Event(25, Message = "Activity stopped. Name = '{0}', Id = '{1}'.", Level = EventLevel.Verbose)] public void ActivityStopped(string name, string? id) - { - this.WriteEvent(25, name, id); - } + => this.WriteEvent(25, name, id); [Event(26, Message = "Failed to create file. LogDirectory ='{0}', Id = '{1}'.", Level = EventLevel.Warning)] public void SelfDiagnosticsFileCreateException(string logDirectory, string exception) - { - this.WriteEvent(26, logDirectory, exception); - } + => this.WriteEvent(26, logDirectory, exception); [Event(28, Message = "Unknown error in TracerProvider '{0}': '{1}'.", Level = EventLevel.Error)] public void TracerProviderException(string evnt, string ex) - { - this.WriteEvent(28, evnt, ex); - } + => this.WriteEvent(28, evnt, ex); [Event(31, Message = "'{0}' exporting to '{1}' dropped '0' items.", Level = EventLevel.Informational)] public void NoDroppedExportProcessorItems(string exportProcessorName, string exporterName) - { - this.WriteEvent(31, exportProcessorName, exporterName); - } + => this.WriteEvent(31, exportProcessorName, exporterName); #if NET [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Parameters to this method are primitive and are trimmer safe.")] #endif [Event(32, Message = "'{0}' exporting to '{1}' dropped '{2}' item(s) due to buffer full.", Level = EventLevel.Warning)] public void ExistsDroppedExportProcessorItems(string exportProcessorName, string exporterName, long droppedCount) - { - this.WriteEvent(32, exportProcessorName, exporterName, droppedCount); - } + => this.WriteEvent(32, exportProcessorName, exporterName, droppedCount); #if NET [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Parameters to this method are primitive and are trimmer safe.")] #endif [Event(33, Message = "Measurements from Instrument '{0}', Meter '{1}' will be ignored. Reason: '{2}'. Suggested action: '{3}'", Level = EventLevel.Warning)] public void MetricInstrumentIgnored(string instrumentName, string meterName, string reason, string fix) - { - this.WriteEvent(33, instrumentName, meterName, reason, fix); - } + => this.WriteEvent(33, instrumentName, meterName, reason, fix); [Event(34, Message = "Unknown error in MetricReader event '{0}': '{1}'.", Level = EventLevel.Error)] public void MetricReaderException(string methodName, string ex) - { - this.WriteEvent(34, methodName, ex); - } + => this.WriteEvent(34, methodName, ex); [Event(35, Message = "Unknown error in MeterProvider '{0}': '{1}'.", Level = EventLevel.Error)] public void MeterProviderException(string methodName, string ex) - { - this.WriteEvent(35, methodName, ex); - } + => this.WriteEvent(35, methodName, ex); [Event(36, Message = "Measurement dropped from Instrument Name/Metric Stream Name '{0}'. Reason: '{1}'. Suggested action: '{2}'", Level = EventLevel.Warning)] public void MeasurementDropped(string instrumentName, string reason, string fix) - { - this.WriteEvent(36, instrumentName, reason, fix); - } + => this.WriteEvent(36, instrumentName, reason, fix); [Event(37, Message = "'{0}' Disposed.", Level = EventLevel.Informational)] public void ProviderDisposed(string providerName) - { - this.WriteEvent(37, providerName); - } + => this.WriteEvent(37, providerName); #if NET [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Parameters to this method are primitive and are trimmer safe.")] #endif [Event(38, Message = "Duplicate Instrument '{0}', Meter '{1}' encountered. Reason: '{2}'. Suggested action: '{3}'", Level = EventLevel.Warning)] public void DuplicateMetricInstrument(string instrumentName, string meterName, string reason, string fix) - { - this.WriteEvent(38, instrumentName, meterName, reason, fix); - } + => this.WriteEvent(38, instrumentName, meterName, reason, fix); [Event(39, Message = "MeterProviderSdk event: '{0}'", Level = EventLevel.Verbose)] public void MeterProviderSdkEvent(string message) - { - this.WriteEvent(39, message); - } + => this.WriteEvent(39, message); [Event(40, Message = "MetricReader event: '{0}'", Level = EventLevel.Verbose)] public void MetricReaderEvent(string message) - { - this.WriteEvent(40, message); - } + => this.WriteEvent(40, message); #if NET [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Parameters to this method are primitive and are trimmer safe.")] #endif [Event(41, Message = "View Configuration ignored for Instrument '{0}', Meter '{1}'. Reason: '{2}'. Measurements from the instrument will use default configuration for Aggregation. Suggested action: '{3}'", Level = EventLevel.Warning)] public void MetricViewIgnored(string instrumentName, string meterName, string reason, string fix) - { - this.WriteEvent(41, instrumentName, meterName, reason, fix); - } + => this.WriteEvent(41, instrumentName, meterName, reason, fix); #if NET [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Parameters to this method are primitive and are trimmer safe.")] #endif [Event(43, Message = "ForceFlush invoked for processor type '{0}' returned result '{1}'.", Level = EventLevel.Verbose)] public void ProcessorForceFlushInvoked(string processorType, bool result) - { - this.WriteEvent(43, processorType, result); - } + => this.WriteEvent(43, processorType, result); [Event(44, Message = "OpenTelemetryLoggerProvider event: '{0}'", Level = EventLevel.Verbose)] public void OpenTelemetryLoggerProviderEvent(string message) - { - this.WriteEvent(44, message); - } + => this.WriteEvent(44, message); [Event(45, Message = "ForceFlush invoked for OpenTelemetryLoggerProvider with timeoutMilliseconds = '{0}'.", Level = EventLevel.Verbose)] public void OpenTelemetryLoggerProviderForceFlushInvoked(int timeoutMilliseconds) - { - this.WriteEvent(45, timeoutMilliseconds); - } + => this.WriteEvent(45, timeoutMilliseconds); [Event(46, Message = "TracerProviderSdk event: '{0}'", Level = EventLevel.Verbose)] public void TracerProviderSdkEvent(string message) - { - this.WriteEvent(46, message); - } + => this.WriteEvent(46, message); [Event(47, Message = "Configuration key '{0}' has an invalid value: '{1}'", Level = EventLevel.Warning)] public void InvalidConfigurationValue(string key, string? value) - { - this.WriteEvent(47, key, value); - } + => this.WriteEvent(47, key, value); [Event(48, Message = "Exception thrown parsing log state of type '{0}'. Exception: '{1}'", Level = EventLevel.Warning)] public void LoggerParseStateException(string type, string error) - { - this.WriteEvent(48, type, error); - } + => this.WriteEvent(48, type, error); [Event(49, Message = "LoggerProviderSdk event: '{0}'", Level = EventLevel.Verbose)] public void LoggerProviderSdkEvent(string message) - { - this.WriteEvent(49, message); - } + => this.WriteEvent(49, message); [Event(50, Message = "Unknown error in LoggerProvider '{0}': '{1}'.", Level = EventLevel.Error)] public void LoggerProviderException(string methodName, string ex) - { - this.WriteEvent(50, methodName, ex); - } + => this.WriteEvent(50, methodName, ex); [Event(51, Message = "Skipped processing log state of type '{0}' {1}.", Level = EventLevel.Warning)] public void LoggerProcessStateSkipped(string type, string reason) - { - this.WriteEvent(51, type, reason); - } + => this.WriteEvent(51, type, reason); [Event(52, Message = "Instrument '{0}', Meter '{1}' has been deactivated.", Level = EventLevel.Informational)] public void MetricInstrumentDeactivated(string instrumentName, string meterName) - { - this.WriteEvent(52, instrumentName, meterName); - } + => this.WriteEvent(52, instrumentName, meterName); [Event(53, Message = "Instrument '{0}', Meter '{1}' has been removed.", Level = EventLevel.Informational)] public void MetricInstrumentRemoved(string instrumentName, string meterName) - { - this.WriteEvent(53, instrumentName, meterName); - } + => this.WriteEvent(53, instrumentName, meterName); [Event(54, Message = "OTEL_TRACES_SAMPLER configuration was found but the value '{0}' is invalid and will be ignored.", Level = EventLevel.Warning)] public void TracesSamplerConfigInvalid(string configValue) - { - this.WriteEvent(54, configValue); - } + => this.WriteEvent(54, configValue); [Event(55, Message = "OTEL_TRACES_SAMPLER_ARG configuration was found but the value '{0}' is invalid and will be ignored, default of value of '1.0' will be used.", Level = EventLevel.Warning)] public void TracesSamplerArgConfigInvalid(string configValue) - { - this.WriteEvent(55, configValue); - } + => this.WriteEvent(55, configValue); [Event(56, Message = "Exception thrown by user code supplied on metric view ('{0}'): '{1}'.", Level = EventLevel.Error)] public void MetricViewException(string source, string ex) - { - this.WriteEvent(56, source, ex); - } + => this.WriteEvent(56, source, ex); void IConfigurationExtensionsLogger.LogInvalidConfigurationValue(string key, string value) - { - this.InvalidConfigurationValue(key, value); - } + => this.InvalidConfigurationValue(key, value); + + private static string GetTypeName() => +#if NET + typeof(T).FullName!; +#else + typeof(T).FullName; +#endif #if DEBUG public class OpenTelemetryEventListener : EventListener { - private readonly Dictionary eventSources = new(); + private readonly Dictionary eventSources = []; public override void Dispose() { @@ -413,15 +354,9 @@ protected override void OnEventWritten(EventWrittenEventArgs e) return; } - string? message; - if (e.Message != null && e.Payload != null && e.Payload.Count > 0) - { - message = string.Format(System.Globalization.CultureInfo.CurrentCulture, e.Message, e.Payload.ToArray()); - } - else - { - message = e.Message; - } + var message = e.Message != null && e.Payload != null && e.Payload.Count > 0 + ? string.Format(System.Globalization.CultureInfo.CurrentCulture, e.Message, [.. e.Payload]) + : e.Message; Debug.WriteLine($"{e.EventSource.Name} - Level: [{e.Level}], EventId: [{e.EventId}], EventName: [{e.EventName}], Message: [{message}]"); } diff --git a/src/OpenTelemetry/Internal/SelfDiagnosticsConfigParser.cs b/src/OpenTelemetry/Internal/SelfDiagnosticsConfigParser.cs index abdcef84e0d..0ae3855262b 100644 --- a/src/OpenTelemetry/Internal/SelfDiagnosticsConfigParser.cs +++ b/src/OpenTelemetry/Internal/SelfDiagnosticsConfigParser.cs @@ -68,7 +68,7 @@ public bool TryGetConfiguration( } } - using FileStream file = File.Open(configFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete); + using var file = File.Open(configFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete); var buffer = this.configBuffer; if (buffer == null) @@ -77,8 +77,8 @@ public bool TryGetConfiguration( this.configBuffer = buffer; } - int bytesRead = 0; - int totalBytesRead = 0; + var bytesRead = 0; + var totalBytesRead = 0; while (totalBytesRead < buffer.Length) { @@ -91,7 +91,7 @@ public bool TryGetConfiguration( totalBytesRead += bytesRead; } - string configJson = Encoding.UTF8.GetString(buffer, 0, totalBytesRead); + var configJson = Encoding.UTF8.GetString(buffer, 0, totalBytesRead); if (!TryParseLogDirectory(configJson, out logDirectory)) { diff --git a/src/OpenTelemetry/Internal/SelfDiagnosticsConfigRefresher.cs b/src/OpenTelemetry/Internal/SelfDiagnosticsConfigRefresher.cs index 5f515e70ca1..ee692a2010b 100644 --- a/src/OpenTelemetry/Internal/SelfDiagnosticsConfigRefresher.cs +++ b/src/OpenTelemetry/Internal/SelfDiagnosticsConfigRefresher.cs @@ -139,9 +139,9 @@ private async Task Worker(CancellationToken cancellationToken) private void UpdateMemoryMappedFileFromConfiguration() { - if (this.configParser.TryGetConfiguration(out string? newLogDirectory, out int fileSizeInKB, out EventLevel newEventLevel, out bool formatMessage)) + if (this.configParser.TryGetConfiguration(out var newLogDirectory, out var fileSizeInKB, out var newEventLevel, out var formatMessage)) { - int newFileSize = fileSizeInKB * 1024; + var newFileSize = fileSizeInKB * 1024; if (!newLogDirectory.Equals(this.logDirectory, StringComparison.Ordinal) || this.logFileSize != newFileSize) { this.CloseLogFile(); @@ -169,13 +169,13 @@ private void UpdateMemoryMappedFileFromConfiguration() private void CloseLogFile() { - MemoryMappedFile? mmf = Interlocked.CompareExchange(ref this.memoryMappedFile, null, this.memoryMappedFile); + var mmf = Interlocked.CompareExchange(ref this.memoryMappedFile, null, this.memoryMappedFile); if (mmf != null) { // Each thread has its own MemoryMappedViewStream created from the only one MemoryMappedFile. // Once worker thread closes the MemoryMappedFile, all the ViewStream objects should be disposed // properly. - foreach (MemoryMappedViewStream stream in this.viewStream.Values) + foreach (var stream in this.viewStream.Values) { if (stream != null) { @@ -186,7 +186,7 @@ private void CloseLogFile() mmf.Dispose(); } - FileStream? fs = Interlocked.CompareExchange( + var fs = Interlocked.CompareExchange( ref this.underlyingFileStreamForMemoryMappedFile, null, this.underlyingFileStreamForMemoryMappedFile); diff --git a/src/OpenTelemetry/Internal/SelfDiagnosticsEventListener.cs b/src/OpenTelemetry/Internal/SelfDiagnosticsEventListener.cs index 6a8c5932d5f..951d4fa9597 100644 --- a/src/OpenTelemetry/Internal/SelfDiagnosticsEventListener.cs +++ b/src/OpenTelemetry/Internal/SelfDiagnosticsEventListener.cs @@ -74,8 +74,11 @@ internal static int EncodeInBuffer(string? str, bool isParameter, byte[] buffer, return position; } - int charCount = str!.Length; - int ellipses = isParameter ? "{...}\n".Length : "...\n".Length; +#pragma warning disable IDE0370 // Suppression is unnecessary + var charCount = str!.Length; +#pragma warning restore IDE0370 // Suppression is unnecessary + + var ellipses = isParameter ? "{...}\n".Length : "...\n".Length; // Ensure there is space for "{...}\n" or "...\n". if (buffer.Length - position - ellipses < 0) @@ -83,7 +86,7 @@ internal static int EncodeInBuffer(string? str, bool isParameter, byte[] buffer, return position; } - int estimateOfCharacters = (buffer.Length - position - ellipses) / 2; + var estimateOfCharacters = (buffer.Length - position - ellipses) / 2; // Ensure the UTF-16 encoded string can fit in buffer UTF-8 encoding. // And leave space for "{...}\n" or "...\n". @@ -138,8 +141,9 @@ internal static int EncodeInBuffer(string? str, bool isParameter, byte[] buffer, internal static int DateTimeGetBytes(DateTime datetime, byte[] bytes, int byteIndex) { int num; - int pos = byteIndex; + var pos = byteIndex; +#pragma warning disable IDE0047 // Remove unnecessary parentheses num = datetime.Year; bytes[pos++] = (byte)('0' + ((num / 1000) % 10)); bytes[pos++] = (byte)('0' + ((num / 100) % 10)); @@ -194,7 +198,7 @@ internal static int DateTimeGetBytes(DateTime datetime, byte[] bytes, int byteIn break; case DateTimeKind.Local: - TimeSpan ts = TimeZoneInfo.Local.GetUtcOffset(datetime); + var ts = TimeZoneInfo.Local.GetUtcOffset(datetime); bytes[pos++] = (byte)(ts.Hours >= 0 ? '+' : '-'); @@ -214,6 +218,7 @@ internal static int DateTimeGetBytes(DateTime datetime, byte[] bytes, int byteIn // Skip break; } +#pragma warning restore IDE0047 // Remove unnecessary parentheses return pos - byteIndex; } @@ -235,7 +240,7 @@ internal void WriteEvent(string? eventMessage, ReadOnlyCollection? payl if (this.formatMessage && eventMessage != null && payload != null && payload.Count > 0) { // Use string.Format to format the message with parameters - string messageToWrite = string.Format(System.Globalization.CultureInfo.InvariantCulture, eventMessage, payload.ToArray()); + var messageToWrite = string.Format(System.Globalization.CultureInfo.InvariantCulture, eventMessage, [.. payload]); pos = EncodeInBuffer(messageToWrite, false, buffer, pos); } else @@ -244,25 +249,18 @@ internal void WriteEvent(string? eventMessage, ReadOnlyCollection? payl if (payload != null) { // Not using foreach because it can cause allocations - for (int i = 0; i < payload.Count; ++i) + for (var i = 0; i < payload.Count; ++i) { - object? obj = payload[i]; - if (obj != null) - { - pos = EncodeInBuffer(obj.ToString() ?? "null", true, buffer, pos); - } - else - { - pos = EncodeInBuffer("null", true, buffer, pos); - } + var obj = payload[i]; + pos = obj != null ? EncodeInBuffer(obj.ToString() ?? "null", true, buffer, pos) : EncodeInBuffer("null", true, buffer, pos); } } } buffer[pos++] = (byte)'\n'; - int byteCount = pos - 0; + var byteCount = pos - 0; #pragma warning disable CA2000 // Dispose objects before losing scope - if (this.configRefresher.TryGetLogStream(byteCount, out Stream? stream, out int availableByteCount)) + if (this.configRefresher.TryGetLogStream(byteCount, out var stream, out var availableByteCount)) #pragma warning restore CA2000 // Dispose objects before losing scope { if (availableByteCount >= byteCount) diff --git a/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderBase.cs b/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderBase.cs index 69a2f8b6c20..3384768162d 100644 --- a/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderBase.cs @@ -98,7 +98,7 @@ internal LoggerProvider Build() this.innerBuilder.Services = null; #if DEBUG - bool validateScopes = true; + var validateScopes = true; #else bool validateScopes = false; #endif @@ -116,7 +116,7 @@ internal LoggerProvider Build() private static bool IsOtelSdkDisabled(IConfiguration configuration) { - bool isDisabled = configuration.TryGetBoolValue(OpenTelemetrySdkEventSource.Log, SdkConfigDefinitions.SdkDisableEnvVarName, out bool result) && result; + var isDisabled = configuration.TryGetBoolValue(OpenTelemetrySdkEventSource.Log, SdkConfigDefinitions.SdkDisableEnvVarName, out var result) && result; if (isDisabled) { OpenTelemetrySdkEventSource.Log.LoggerProviderSdkEvent($"Disabled because {SdkConfigDefinitions.SdkDisableEnvVarName} is true."); diff --git a/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderSdk.cs b/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderSdk.cs index 10ac03cd22b..e235c5e2f7a 100644 --- a/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderSdk.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Resources; @@ -22,18 +21,16 @@ public LoggerProviderBuilderSdk(IServiceProvider serviceProvider) this.serviceProvider = serviceProvider; } - public List Instrumentation { get; } = new(); + public List Instrumentation { get; } = []; public ResourceBuilder? ResourceBuilder { get; private set; } public LoggerProvider? Provider => this.loggerProvider; - public List> Processors { get; } = new(); + public List> Processors { get; } = []; public void RegisterProvider(LoggerProviderSdk loggerProvider) { - Debug.Assert(loggerProvider != null, "loggerProvider was null"); - if (this.loggerProvider != null) { throw new NotSupportedException("LoggerProvider cannot be accessed while build is executing."); @@ -44,59 +41,46 @@ public void RegisterProvider(LoggerProviderSdk loggerProvider) public override LoggerProviderBuilder AddInstrumentation(Func instrumentationFactory) { - Debug.Assert(instrumentationFactory != null, "instrumentationFactory was null"); + var instance = instrumentationFactory(); this.Instrumentation.Add( new InstrumentationRegistration( typeof(TInstrumentation).Name, typeof(TInstrumentation).Assembly.GetName().Version?.ToString() ?? DefaultInstrumentationVersion, - instrumentationFactory!())); + instance)); return this; } public LoggerProviderBuilder ConfigureResource(Action configure) { - Debug.Assert(configure != null, "configure was null"); - var resourceBuilder = this.ResourceBuilder ??= ResourceBuilder.CreateDefault(); - configure!(resourceBuilder); + configure(resourceBuilder); return this; } public LoggerProviderBuilder SetResourceBuilder(ResourceBuilder resourceBuilder) { - Debug.Assert(resourceBuilder != null, "resourceBuilder was null"); - this.ResourceBuilder = resourceBuilder; - return this; } public LoggerProviderBuilder AddProcessor(BaseProcessor processor) { - Debug.Assert(processor != null, "processor was null"); - - this.Processors.Add(processor!); - + this.Processors.Add(processor); return this; } public LoggerProviderBuilder ConfigureBuilder(Action configure) { - Debug.Assert(configure != null, "configure was null"); - - configure!(this.serviceProvider, this); - + configure(this.serviceProvider, this); return this; } public LoggerProviderBuilder ConfigureServices(Action configure) - { - throw new NotSupportedException("Services cannot be configured after ServiceProvider has been created."); - } + => throw new NotSupportedException("Services cannot be configured after ServiceProvider has been created."); LoggerProviderBuilder IDeferredLoggerProviderBuilder.Configure(Action configure) => this.ConfigureBuilder(configure); diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs index aad2aa0b7b2..69f07bba3e3 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs @@ -11,8 +11,8 @@ namespace OpenTelemetry.Logs; internal sealed class OpenTelemetryLogger : ILogger { - private static readonly string[] LogLevels = new string[] - { + private static readonly string[] LogLevels = + [ nameof(LogLevel.Trace), nameof(LogLevel.Debug), nameof(LogLevel.Information), @@ -20,7 +20,7 @@ internal sealed class OpenTelemetryLogger : ILogger nameof(LogLevel.Error), nameof(LogLevel.Critical), nameof(LogLevel.None), - }; + ]; private readonly LoggerProviderSdk provider; private readonly OpenTelemetryLoggerOptions options; @@ -31,12 +31,11 @@ internal OpenTelemetryLogger( OpenTelemetryLoggerOptions options, string categoryName) { - Debug.Assert(provider != null, "provider was null"); Debug.Assert(categoryName != null, "categoryName was null"); - Debug.Assert(options != null, "options was null"); - this.provider = provider!; - this.options = options!; + this.provider = provider; + this.options = options; + this.instrumentationScope = InstrumentationScopeLogger.GetInstrumentationScopeLoggerForName(categoryName); } @@ -59,7 +58,7 @@ public void Log(LogLevel logLevel, EventId eventId, TState state, Except var record = pool.Rent(); - ref LogRecord.LogRecordILoggerData iloggerData = ref record.ILoggerData; + ref var iloggerData = ref record.ILoggerData; iloggerData.TraceState = this.options.IncludeTraceState && activity != null ? activity.TraceStateString @@ -69,7 +68,7 @@ public void Log(LogLevel logLevel, EventId eventId, TState state, Except iloggerData.ScopeProvider = this.options.IncludeScopes ? this.ScopeProvider : null; iloggerData.BufferedScopes = null; - ref LogRecordData data = ref record.Data; + ref var data = ref record.Data; data.TimestampBacking = DateTime.UtcNow; @@ -109,16 +108,14 @@ public void Log(LogLevel logLevel, EventId eventId, TState state, Except [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool IsEnabled(LogLevel logLevel) - { - return logLevel != LogLevel.None && !Sdk.SuppressInstrumentation; - } + => logLevel != LogLevel.None && !Sdk.SuppressInstrumentation; public IDisposable BeginScope(TState state) where TState : notnull => this.ScopeProvider?.Push(state) ?? NullScope.Instance; internal static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, LogLevel logLevel) { - uint intLogLevel = (uint)logLevel; + var intLogLevel = (uint)logLevel; if (intLogLevel < 6) { logRecordData.Severity = (LogRecordSeverity)((intLogLevel * 4) + 1); @@ -182,7 +179,7 @@ internal static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, var attributeStorage = logRecord.AttributeStorage; if (attributeStorage == null) { - return logRecord.AttributeStorage = new List>(stateValues); + return logRecord.AttributeStorage = [.. stateValues]; } else { @@ -206,7 +203,7 @@ internal static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, OpenTelemetrySdkEventSource.Log.LoggerProcessStateSkipped(); - return Array.Empty>(); + return []; } } @@ -216,7 +213,7 @@ private static bool TryGetOriginalFormatFromAttributes( { if (attributes != null && attributes.Count > 0) { - for (int i = attributes.Count - 1; i >= 0; i--) + for (var i = attributes.Count - 1; i >= 0; i--) { var attribute = attributes[i]; if (attribute.Key == "{OriginalFormat}" diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerOptions.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerOptions.cs index 921fd948ce0..845586c7f6e 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerOptions.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerOptions.cs @@ -12,7 +12,7 @@ namespace OpenTelemetry.Logs; /// public class OpenTelemetryLoggerOptions { - internal readonly List>> ProcessorFactories = new(); + internal readonly List>> ProcessorFactories = []; internal ResourceBuilder? ResourceBuilder; /// @@ -124,15 +124,12 @@ public OpenTelemetryLoggerOptions SetResourceBuilder(ResourceBuilder resourceBui return this; } - internal OpenTelemetryLoggerOptions Copy() + internal OpenTelemetryLoggerOptions Copy() => new() { - return new() - { - IncludeFormattedMessage = this.IncludeFormattedMessage, - IncludeScopes = this.IncludeScopes, - ParseStateValues = this.ParseStateValues, - IncludeAttributes = this.IncludeAttributes, - IncludeTraceState = this.IncludeTraceState, - }; - } + IncludeFormattedMessage = this.IncludeFormattedMessage, + IncludeScopes = this.IncludeScopes, + ParseStateValues = this.ParseStateValues, + IncludeAttributes = this.IncludeAttributes, + IncludeTraceState = this.IncludeTraceState, + }; } diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerProvider.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerProvider.cs index c0888f1db77..b4f3044f0fe 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerProvider.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerProvider.cs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 using System.Collections; -using System.Diagnostics; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; @@ -66,11 +65,8 @@ internal OpenTelemetryLoggerProvider( OpenTelemetryLoggerOptions options, bool disposeProvider) { - Debug.Assert(loggerProvider != null, "loggerProvider was null"); - Debug.Assert(options != null, "options was null"); - - this.Provider = loggerProvider!; - this.Options = options!.Copy(); + this.Provider = loggerProvider; + this.Options = options.Copy(); this.ownsProvider = disposeProvider; } @@ -110,18 +106,12 @@ public ILogger CreateLogger(string categoryName) logger = (this.loggers[categoryName] as ILogger)!; if (logger == null) { - var loggerProviderSdk = this.Provider as LoggerProviderSdk; - if (loggerProviderSdk == null) - { - logger = NullLogger.Instance; - } - else - { - logger = new OpenTelemetryLogger(loggerProviderSdk, this.Options, categoryName) + logger = this.Provider is not LoggerProviderSdk loggerProviderSdk + ? NullLogger.Instance + : new OpenTelemetryLogger(loggerProviderSdk, this.Options, categoryName) { ScopeProvider = this.ScopeProvider, }; - } this.loggers[categoryName] = logger; } diff --git a/src/OpenTelemetry/Logs/LogRecord.cs b/src/OpenTelemetry/Logs/LogRecord.cs index 097cdb2d3be..822aa84175f 100644 --- a/src/OpenTelemetry/Logs/LogRecord.cs +++ b/src/OpenTelemetry/Logs/LogRecord.cs @@ -24,7 +24,7 @@ public sealed class LogRecord internal LogRecordSource Source = LogRecordSource.CreatedManually; internal int PoolReferenceCount = int.MaxValue; - private static readonly Action> AddScopeToBufferedList = (object? scope, List state) => + private static readonly Action> AddScopeToBufferedList = static (scope, state) => { state.Add(scope); }; @@ -193,8 +193,8 @@ public LogLevel LogLevel { if (this.Data.Severity.HasValue) { - uint severity = (uint)this.Data.Severity.Value; - if (severity >= 1 && severity <= 24) + var severity = (uint)this.Data.Severity.Value; + if (severity is >= 1 and <= 24) { return (LogLevel)((severity - 1) / 4); } @@ -203,10 +203,7 @@ public LogLevel LogLevel return LogLevel.Trace; } - set - { - OpenTelemetryLogger.SetLogRecordSeverityFields(ref this.Data, value); - } + set => OpenTelemetryLogger.SetLogRecordSeverityFields(ref this.Data, value); } /// @@ -426,7 +423,7 @@ public void ForEachScope(Action callback, TState var bufferedScopes = this.ILoggerData.BufferedScopes; if (bufferedScopes != null) { - foreach (object? scope in bufferedScopes) + foreach (var scope in bufferedScopes) { #pragma warning disable CA1062 // Validate arguments of public methods - needed for netstandard2.1 callback(new(scope), state); @@ -444,27 +441,19 @@ public void ForEachScope(Action callback, TState /// /// . internal ref LogRecordData GetDataRef() - { - return ref this.Data; - } + => ref this.Data; [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void ResetReferenceCount() - { - this.PoolReferenceCount = 1; - } + => this.PoolReferenceCount = 1; [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void AddReference() - { - Interlocked.Increment(ref this.PoolReferenceCount); - } + => Interlocked.Increment(ref this.PoolReferenceCount); [MethodImpl(MethodImplOptions.AggressiveInlining)] internal int RemoveReference() - { - return Interlocked.Decrement(ref this.PoolReferenceCount); - } + => Interlocked.Decrement(ref this.PoolReferenceCount); // Note: Typically called when LogRecords are added into a batch so they // can be safely processed outside of the log call chain. @@ -505,7 +494,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 @@ -529,7 +518,7 @@ private void BufferLogScopes() return; } - var scopeStorage = this.ScopeStorage ??= new List(LogRecordPoolHelper.DefaultMaxNumberOfScopes); + var scopeStorage = this.ScopeStorage ??= [with(LogRecordPoolHelper.DefaultMaxNumberOfScopes)]; scopeProvider.ForEachScope(AddScopeToBufferedList, scopeStorage); @@ -562,7 +551,7 @@ public LogRecordILoggerData Copy() var bufferedScopes = this.BufferedScopes; if (bufferedScopes != null) { - copy.BufferedScopes = new List(bufferedScopes); + copy.BufferedScopes = [.. bufferedScopes]; } return copy; @@ -571,9 +560,9 @@ public LogRecordILoggerData Copy() private readonly struct ScopeForEachState { - public static readonly Action> ForEachScope = (object? scope, ScopeForEachState state) => + public static readonly Action> ForEachScope = static (scope, state) => { - LogRecordScope logRecordScope = new LogRecordScope(scope); + var logRecordScope = new LogRecordScope(scope); state.Callback(logRecordScope, state.UserState); }; diff --git a/src/OpenTelemetry/Logs/LogRecordScope.cs b/src/OpenTelemetry/Logs/LogRecordScope.cs index b86230eaf32..bb5fae4e731 100644 --- a/src/OpenTelemetry/Logs/LogRecordScope.cs +++ b/src/OpenTelemetry/Logs/LogRecordScope.cs @@ -47,14 +47,14 @@ public Enumerator(object? scope) } else if (scope is IEnumerable> scopeEnumerable) { - this.scope = new List>(scopeEnumerable); + this.scope = [.. scopeEnumerable]; } else { - this.scope = new List> - { + this.scope = + [ new KeyValuePair(string.Empty, scope), - }; + ]; } this.position = 0; @@ -64,7 +64,7 @@ public Enumerator(object? scope) /// public KeyValuePair Current { get; private set; } - object IEnumerator.Current => this.Current; + readonly object IEnumerator.Current => this.Current; /// public bool MoveNext() @@ -79,7 +79,7 @@ public bool MoveNext() } /// - public void Dispose() + public readonly void Dispose() { } diff --git a/src/OpenTelemetry/Logs/LoggerProviderSdk.cs b/src/OpenTelemetry/Logs/LoggerProviderSdk.cs index 151f48685cd..ff7857c70d4 100644 --- a/src/OpenTelemetry/Logs/LoggerProviderSdk.cs +++ b/src/OpenTelemetry/Logs/LoggerProviderSdk.cs @@ -19,20 +19,16 @@ internal sealed class LoggerProviderSdk : LoggerProvider internal IDisposable? OwnedServiceProvider; internal bool Disposed; internal int ShutdownCount; - - private readonly List instrumentations = []; private ILogRecordPool? threadStaticPool = LogRecordThreadStaticPool.Instance; public LoggerProviderSdk( IServiceProvider serviceProvider, bool ownsServiceProvider) { - Debug.Assert(serviceProvider != null, "serviceProvider was null"); - - var state = serviceProvider!.GetRequiredService(); + var state = serviceProvider.GetRequiredService(); state.RegisterProvider(this); - this.ServiceProvider = serviceProvider!; + this.ServiceProvider = serviceProvider; if (ownsServiceProvider) { @@ -42,10 +38,10 @@ public LoggerProviderSdk( OpenTelemetrySdkEventSource.Log.LoggerProviderSdkEvent("Building LoggerProvider."); - var configureProviderBuilders = serviceProvider!.GetServices(); + var configureProviderBuilders = serviceProvider.GetServices(); foreach (var configureProviderBuilder in configureProviderBuilders) { - configureProviderBuilder.ConfigureBuilder(serviceProvider!, state); + configureProviderBuilder.ConfigureBuilder(serviceProvider, state); } var resourceBuilder = state.ResourceBuilder ?? ResourceBuilder.CreateDefault(); @@ -58,13 +54,13 @@ public LoggerProviderSdk( this.AddProcessor(processor); } - StringBuilder instrumentationFactoriesAdded = new StringBuilder(); + var instrumentationFactoriesAdded = new StringBuilder(); foreach (var instrumentation in state.Instrumentation) { if (instrumentation.Instance is not null) { - this.instrumentations.Add(instrumentation.Instance); + this.Instrumentations.Add(instrumentation.Instance); } instrumentationFactoriesAdded.Append(instrumentation.Name); @@ -82,7 +78,7 @@ public LoggerProviderSdk( public Resource Resource { get; } - public List Instrumentations => this.instrumentations; + public List Instrumentations { get; } = []; public BaseProcessor? Processor { get; private set; } @@ -124,7 +120,7 @@ public void AddProcessor(BaseProcessor processor) this.threadStaticPool = null; } - StringBuilder processorAdded = new StringBuilder(); + var processorAdded = new StringBuilder(); if (this.Processor == null) { @@ -213,12 +209,12 @@ protected override void Dispose(bool disposing) { if (disposing) { - foreach (var item in this.instrumentations) + foreach (var item in this.Instrumentations) { (item as IDisposable)?.Dispose(); } - this.instrumentations.Clear(); + this.Instrumentations.Clear(); // Wait for up to 5 seconds grace period this.Processor?.Shutdown(5000); diff --git a/src/OpenTelemetry/Logs/Processor/BatchLogRecordExportProcessor.cs b/src/OpenTelemetry/Logs/Processor/BatchLogRecordExportProcessor.cs index c1e341585a8..d40f180482e 100644 --- a/src/OpenTelemetry/Logs/Processor/BatchLogRecordExportProcessor.cs +++ b/src/OpenTelemetry/Logs/Processor/BatchLogRecordExportProcessor.cs @@ -37,12 +37,10 @@ public BatchLogRecordExportProcessor( /// public override void OnEnd(LogRecord data) { - // Note: Intentionally doing a Debug.Assert here and not a - // Guard.ThrowIfNull to save prod cycles. Null should really never - // happen here. - Debug.Assert(data != null, "LogRecord was null."); - - switch (data!.Source) + // Note: Intentionally not using Guard.ThrowIfNull +#pragma warning disable CA1062 // Validate arguments of public methods + switch (data.Source) +#pragma warning restore CA1062 // Validate arguments of public methods { case LogRecord.LogRecordSource.FromSharedPool: data.Buffer(); @@ -53,10 +51,13 @@ public override void OnEnd(LogRecord data) } break; + case LogRecord.LogRecordSource.CreatedManually: data.Buffer(); this.TryExport(data); break; + + case LogRecord.LogRecordSource.FromThreadStaticPool: default: Debug.Assert(data.Source == LogRecord.LogRecordSource.FromThreadStaticPool, "LogRecord source was something unexpected"); diff --git a/src/OpenTelemetry/Metrics/AggregatorStore.cs b/src/OpenTelemetry/Metrics/AggregatorStore.cs index b2f29e18c4b..3bf3c0b7e88 100644 --- a/src/OpenTelemetry/Metrics/AggregatorStore.cs +++ b/src/OpenTelemetry/Metrics/AggregatorStore.cs @@ -101,9 +101,9 @@ internal AggregatorStore( this.exemplarFilter = exemplarFilter ?? DefaultExemplarFilter; Debug.Assert( - this.exemplarFilter == ExemplarFilterType.AlwaysOff - || this.exemplarFilter == ExemplarFilterType.AlwaysOn - || this.exemplarFilter == ExemplarFilterType.TraceBased, + this.exemplarFilter is ExemplarFilterType.AlwaysOff + or ExemplarFilterType.AlwaysOn + or ExemplarFilterType.TraceBased, "this.exemplarFilter had an unexpected value"); // Setting metricPointIndex to 1 as we would reserve the metricPoints[1] for overflow attribute. @@ -124,7 +124,7 @@ internal AggregatorStore( // Add all the indices except for the reserved ones to the queue so that threads have // readily available access to these MetricPoints for their use. // Index 0 and 1 are reserved for no tags and overflow - for (int i = 2; i < this.NumberOfMetricPoints; i++) + for (var i = 2; i < this.NumberOfMetricPoints; i++) { this.availableMetricPoints.Enqueue(i); } @@ -147,12 +147,9 @@ internal AggregatorStore( internal double[] HistogramBounds => this.histogramExplicitBounds.Bounds; - internal bool IsExemplarEnabled() - { - // Using this filter to indicate On/Off - // instead of another separate flag. - return this.exemplarFilter != ExemplarFilterType.AlwaysOff; - } + // Using this filter to indicate On/Off + // instead of another separate flag. + internal bool IsExemplarEnabled() => this.exemplarFilter != ExemplarFilterType.AlwaysOff; internal void Update(long value, ReadOnlySpan> tags) { @@ -220,14 +217,14 @@ internal void SnapshotDeltaWithMetricPointReclaim() } // Index 0 and 1 are reserved for no tags and overflow - for (int i = 2; i < this.NumberOfMetricPoints; i++) + for (var i = 2; i < this.NumberOfMetricPoints; i++) { ref var metricPoint = ref this.metricPoints[i]; if (metricPoint.MetricPointStatus == MetricPointStatus.NoCollectPending) { // Reclaim the MetricPoint if it was marked for it in the previous collect cycle - if (metricPoint.LookupData != null && metricPoint.LookupData.DeferredReclaim == true) + if (metricPoint.LookupData != null && metricPoint.LookupData.DeferredReclaim) { this.ReclaimMetricPoint(ref metricPoint, i); continue; @@ -282,7 +279,7 @@ internal void SnapshotDeltaWithMetricPointReclaim() internal void SnapshotCumulative(int indexSnapshot) { - for (int i = 0; i <= indexSnapshot; i++) + for (var i = 0; i <= indexSnapshot; i++) { ref var metricPoint = ref this.metricPoints[i]; if (!metricPoint.IsInitialized) @@ -353,19 +350,14 @@ We only care about the entry getting removed from the lookup dictionary and not to use this MetricPoint to track newer dimension combinations. */ - var lookupData = metricPoint.LookupData; - - // This method is only called after checking that `metricPoint.LookupData` is not `null`. - Debug.Assert(lookupData != null, "LookupData for the provided MetricPoint was null"); + var lookupData = metricPoint.LookupData!; metricPoint.NullifyMetricPointState(); - Debug.Assert(this.TagsToMetricPointIndexDictionaryDelta != null, "this.tagsToMetricPointIndexDictionaryDelta was null"); - lock (this.TagsToMetricPointIndexDictionaryDelta!) { LookupData? dictionaryValue; - if (lookupData!.SortedTags != Tags.EmptyTags) + if (lookupData.SortedTags != Tags.EmptyTags) { // Check if no other thread added a new entry for the same Tags. // If no, then remove the existing entries. @@ -575,9 +567,7 @@ private int LookupAggregatorStoreForDeltaWithReclaim(KeyValuePair> tags) { - int tagLength = tags.Length; + var tagLength = tags.Length; if (tagLength == 0) { this.InitializeZeroTagPointIfNotInitialized(); @@ -1057,7 +1041,7 @@ private int FindMetricAggregatorsDefault(ReadOnlySpan> tags) { - int tagLength = tags.Length; + var tagLength = tags.Length; if (tagLength == 0 || this.tagsKeysInterestingCount == 0) { this.InitializeZeroTagPointIfNotInitialized(); @@ -1066,8 +1050,6 @@ private int FindMetricAggregatorsCustomTag(ReadOnlySpan(Func instrumentationFactory) - { - Debug.Assert(instrumentationFactory != null, "instrumentationFactory was null"); - - return this.AddInstrumentation( - typeof(TInstrumentation).Name, - typeof(TInstrumentation).Assembly.GetName().Version?.ToString() ?? DefaultInstrumentationVersion, - instrumentationFactory!()); - } + => this.AddInstrumentation( + typeof(TInstrumentation).Name, + typeof(TInstrumentation).Assembly.GetName().Version?.ToString() ?? DefaultInstrumentationVersion, + instrumentationFactory()); public MeterProviderBuilder AddInstrumentation( string instrumentationName, @@ -113,21 +109,16 @@ public MeterProviderBuilder AddInstrumentation( public MeterProviderBuilder ConfigureResource(Action configure) { - Debug.Assert(configure != null, "configure was null"); - var resourceBuilder = this.ResourceBuilder ??= ResourceBuilder.CreateDefault(); - configure!(resourceBuilder); + configure(resourceBuilder); return this; } public MeterProviderBuilder SetResourceBuilder(ResourceBuilder resourceBuilder) { - Debug.Assert(resourceBuilder != null, "resourceBuilder was null"); - this.ResourceBuilder = resourceBuilder; - return this; } @@ -140,9 +131,7 @@ public MeterProviderBuilder SetExemplarFilter(ExemplarFilterType exemplarFilter) public override MeterProviderBuilder AddMeter(params string[] names) { - Debug.Assert(names != null, "names was null"); - - foreach (var name in names!) + foreach (var name in names) { Guard.ThrowIfNullOrWhitespace(name); @@ -154,19 +143,13 @@ public override MeterProviderBuilder AddMeter(params string[] names) public MeterProviderBuilder AddReader(MetricReader reader) { - Debug.Assert(reader != null, "reader was null"); - - this.Readers.Add(reader!); - + this.Readers.Add(reader); return this; } public MeterProviderBuilder AddView(Func viewConfig) { - Debug.Assert(viewConfig != null, "viewConfig was null"); - - this.ViewConfigs.Add(viewConfig!); - + this.ViewConfigs.Add(viewConfig); return this; } @@ -186,10 +169,7 @@ public MeterProviderBuilder SetDefaultCardinalityLimit(int cardinalityLimit) public MeterProviderBuilder ConfigureBuilder(Action configure) { - Debug.Assert(configure != null, "configure was null"); - - configure!(this.serviceProvider, this); - + configure(this.serviceProvider, this); return this; } diff --git a/src/OpenTelemetry/Metrics/CircularBufferBuckets.cs b/src/OpenTelemetry/Metrics/CircularBufferBuckets.cs index 63196c9a0af..698417e180c 100644 --- a/src/OpenTelemetry/Metrics/CircularBufferBuckets.cs +++ b/src/OpenTelemetry/Metrics/CircularBufferBuckets.cs @@ -13,7 +13,6 @@ namespace OpenTelemetry.Metrics; internal sealed class CircularBufferBuckets { private long[]? trait; - private int begin; private int end = -1; public CircularBufferBuckets(int capacity) @@ -31,12 +30,12 @@ public CircularBufferBuckets(int capacity) /// /// Gets the offset of the start index for the . /// - public int Offset => this.begin; + public int Offset { get; private set; } /// /// Gets the size of the . /// - public int Size => this.end - this.begin + 1; + public int Size => this.end - this.Offset + 1; /// /// Returns the value of Bucket[index]. @@ -47,15 +46,7 @@ public CircularBufferBuckets(int capacity) /// This method does not validate if "index" falls into [begin, end], /// the caller is responsible for the validation. /// - public long this[int index] - { - get - { - Debug.Assert(this.trait != null, "trait was null"); - - return this.trait![this.ModuloIndex(index)]; - } - } + public long this[int index] => this.trait![this.ModuloIndex(index)]; /// /// Attempts to increment the value of Bucket[index] by value. @@ -79,14 +70,14 @@ public int TryIncrement(int index, long value = 1) { this.trait = new long[capacity]; - this.begin = index; + this.Offset = index; this.end = index; this.trait[this.ModuloIndex(index)] += value; return 0; } - var begin = this.begin; + var begin = this.Offset; var end = this.end; if (index > end) @@ -111,7 +102,7 @@ public int TryIncrement(int index, long value = 1) return CalculateScaleReduction(begin, end, capacity); } - this.begin = begin; + this.Offset = begin; this.end = end; this.trait[this.ModuloIndex(index)] += value; @@ -147,13 +138,13 @@ public void ScaleDown(int level = 1) } // 0 <= offset < capacity <= 2147483647 - uint capacity = (uint)this.Capacity; - var offset = (uint)this.ModuloIndex(this.begin); + var capacity = (uint)this.Capacity; + var offset = (uint)this.ModuloIndex(this.Offset); - var currentBegin = this.begin; + var currentBegin = this.Offset; var currentEnd = this.end; - for (int i = 0; i < level; i++) + for (var i = 0; i < level; i++) { var newBegin = currentBegin >> 1; var newEnd = currentEnd >> 1; @@ -179,7 +170,7 @@ public void ScaleDown(int level = 1) currentEnd = newEnd; } - this.begin = currentBegin; + this.Offset = currentBegin; this.end = currentEnd; if (capacity > 1) @@ -284,7 +275,5 @@ internal void Copy(long[] dst) [MethodImpl(MethodImplOptions.AggressiveInlining)] private int ModuloIndex(int value) - { - return MathHelper.PositiveModulo32(value, this.Capacity); - } + => MathHelper.PositiveModulo32(value, this.Capacity); } diff --git a/src/OpenTelemetry/Metrics/Exemplar/Exemplar.cs b/src/OpenTelemetry/Metrics/Exemplar/Exemplar.cs index 3fb410d390c..3db1bcd4887 100644 --- a/src/OpenTelemetry/Metrics/Exemplar/Exemplar.cs +++ b/src/OpenTelemetry/Metrics/Exemplar/Exemplar.cs @@ -72,22 +72,7 @@ public double DoubleValue /// view (). If view tag /// filtering is not configured will be empty. /// - public readonly ReadOnlyFilteredTagCollection FilteredTags - { - get - { - if (this.tagCount == 0) - { - return Empty; - } - else - { - Debug.Assert(this.tagStorage != null, "tagStorage was null"); - - return new(this.ViewDefinedTagKeys, this.tagStorage!, this.tagCount); - } - } - } + public readonly ReadOnlyFilteredTagCollection FilteredTags => this.tagCount == 0 ? Empty : new(this.ViewDefinedTagKeys, this.tagStorage!, this.tagCount); internal void Update(in ExemplarMeasurement measurement) where T : struct @@ -140,14 +125,10 @@ internal void Update(in ExemplarMeasurement measurement) } internal void Reset() - { - this.Timestamp = default; - } + => this.Timestamp = default; internal readonly bool IsUpdated() - { - return this.Timestamp != default; - } + => this.Timestamp != default; internal void Collect(ref Exemplar destination, bool reset) { @@ -185,7 +166,7 @@ internal readonly void Copy(ref Exemplar destination) Debug.Assert(this.tagStorage != null, "tagStorage was null"); destination.tagStorage = new KeyValuePair[destination.tagCount]; - Array.Copy(this.tagStorage!, 0, destination.tagStorage, 0, destination.tagCount); + Array.Copy(this.tagStorage, 0, destination.tagStorage, 0, destination.tagCount); } } diff --git a/src/OpenTelemetry/Metrics/Exemplar/FixedSizeExemplarReservoir.cs b/src/OpenTelemetry/Metrics/Exemplar/FixedSizeExemplarReservoir.cs index 68417fa09b7..fc0dfb6ca62 100644 --- a/src/OpenTelemetry/Metrics/Exemplar/FixedSizeExemplarReservoir.cs +++ b/src/OpenTelemetry/Metrics/Exemplar/FixedSizeExemplarReservoir.cs @@ -58,7 +58,7 @@ public sealed override ReadOnlyExemplarCollection Collect() { var runningExemplars = this.runningExemplars; - for (int i = 0; i < runningExemplars.Length; i++) + for (var i = 0; i < runningExemplars.Length; i++) { ref var running = ref runningExemplars[i]; @@ -76,7 +76,7 @@ internal sealed override void Initialize(AggregatorStore aggregatorStore) { var viewDefinedTagKeys = aggregatorStore.TagKeysInteresting; - for (int i = 0; i < this.runningExemplars.Length; i++) + for (var i = 0; i < this.runningExemplars.Length; i++) { this.runningExemplars[i].ViewDefinedTagKeys = viewDefinedTagKeys; this.snapshotExemplars[i].ViewDefinedTagKeys = viewDefinedTagKeys; diff --git a/src/OpenTelemetry/Metrics/Exemplar/ReadOnlyExemplarCollection.cs b/src/OpenTelemetry/Metrics/Exemplar/ReadOnlyExemplarCollection.cs index 02c085c428b..20cbf404d9c 100644 --- a/src/OpenTelemetry/Metrics/Exemplar/ReadOnlyExemplarCollection.cs +++ b/src/OpenTelemetry/Metrics/Exemplar/ReadOnlyExemplarCollection.cs @@ -1,8 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; - namespace OpenTelemetry.Metrics; /// @@ -17,9 +15,7 @@ public readonly struct ReadOnlyExemplarCollection internal ReadOnlyExemplarCollection(Exemplar[] exemplars) { - Debug.Assert(exemplars != null, "exemplars was null"); - - this.exemplars = exemplars!; + this.exemplars = exemplars; } /// @@ -46,7 +42,7 @@ internal ReadOnlyExemplarCollection Copy() { var exemplarCopies = new Exemplar[maximumCount]; - int i = 0; + var i = 0; foreach (ref readonly var exemplar in this) { if (exemplar.IsUpdated()) diff --git a/src/OpenTelemetry/Metrics/Exemplar/SimpleFixedSizeExemplarReservoir.cs b/src/OpenTelemetry/Metrics/Exemplar/SimpleFixedSizeExemplarReservoir.cs index d7f53e934c4..ea4462d2591 100644 --- a/src/OpenTelemetry/Metrics/Exemplar/SimpleFixedSizeExemplarReservoir.cs +++ b/src/OpenTelemetry/Metrics/Exemplar/SimpleFixedSizeExemplarReservoir.cs @@ -51,7 +51,7 @@ private void Offer(in ExemplarMeasurement measurement) } else { - int index = ThreadSafeRandom.Next(0, measurementState); + var index = ThreadSafeRandom.Next(0, measurementState); if (index < this.Capacity) { this.UpdateExemplar(index, in measurement); diff --git a/src/OpenTelemetry/Metrics/HistogramExplicitBounds.cs b/src/OpenTelemetry/Metrics/HistogramExplicitBounds.cs index 11408ca5b64..b04400873c3 100644 --- a/src/OpenTelemetry/Metrics/HistogramExplicitBounds.cs +++ b/src/OpenTelemetry/Metrics/HistogramExplicitBounds.cs @@ -30,7 +30,7 @@ public HistogramExplicitBounds(double[] bounds) return null; } - int median = min + ((max - min) / 2); + var median = min + ((max - min) / 2); return new BucketLookupNode { Index = median, @@ -47,9 +47,7 @@ public HistogramExplicitBounds(double[] bounds) [MethodImpl(MethodImplOptions.AggressiveInlining)] public int FindBucketIndex(double value) - { - return this.findHistogramBucketIndex(value); - } + => this.findHistogramBucketIndex(value); private static double[] CleanUpInfinitiesFromExplicitBounds(double[] bounds) { @@ -57,9 +55,7 @@ private static double[] CleanUpInfinitiesFromExplicitBounds(double[] bounds) { if (double.IsNegativeInfinity(bounds[i]) || double.IsPositiveInfinity(bounds[i])) { - return bounds - .Where(b => !double.IsNegativeInfinity(b) && !double.IsPositiveInfinity(b)) - .ToArray(); + return [.. bounds.Where(b => !double.IsNegativeInfinity(b) && !double.IsPositiveInfinity(b))]; } } @@ -69,9 +65,7 @@ private static double[] CleanUpInfinitiesFromExplicitBounds(double[] bounds) [MethodImpl(MethodImplOptions.AggressiveInlining)] private int FindBucketIndexBinary(double value) { - BucketLookupNode? current = this.bucketLookupTreeRoot; - - Debug.Assert(current != null, "Bucket root was null."); + var current = this.bucketLookupTreeRoot; do { @@ -98,10 +92,8 @@ private int FindBucketIndexBinary(double value) [MethodImpl(MethodImplOptions.AggressiveInlining)] private int FindBucketIndexLinear(double value) { - Debug.Assert(this.Bounds != null, "ExplicitBounds was null."); - int i; - for (i = 0; i < this.Bounds!.Length; i++) + for (i = 0; i < this.Bounds.Length; i++) { // Upper bound is inclusive if (value <= this.Bounds[i]) diff --git a/src/OpenTelemetry/Metrics/IMetricsListener/OpenTelemetryMetricsBuilderExtensions.cs b/src/OpenTelemetry/Metrics/IMetricsListener/OpenTelemetryMetricsBuilderExtensions.cs index 5d00bcf192a..1fde772213f 100644 --- a/src/OpenTelemetry/Metrics/IMetricsListener/OpenTelemetryMetricsBuilderExtensions.cs +++ b/src/OpenTelemetry/Metrics/IMetricsListener/OpenTelemetryMetricsBuilderExtensions.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using OpenTelemetry.Internal; @@ -54,13 +53,11 @@ internal static void RegisterMetricsListener( IServiceCollection services, Action configure) { - Debug.Assert(services != null, "services was null"); - Guard.ThrowIfNull(configure); - var builder = new MeterProviderBuilderBase(services!); + var builder = new MeterProviderBuilderBase(services); - services!.TryAddEnumerable( + services.TryAddEnumerable( ServiceDescriptor.Singleton()); configure(builder); diff --git a/src/OpenTelemetry/Metrics/IMetricsListener/OpenTelemetryMetricsListener.cs b/src/OpenTelemetry/Metrics/IMetricsListener/OpenTelemetryMetricsListener.cs index 6f45ef77e22..5e2959b463f 100644 --- a/src/OpenTelemetry/Metrics/IMetricsListener/OpenTelemetryMetricsListener.cs +++ b/src/OpenTelemetry/Metrics/IMetricsListener/OpenTelemetryMetricsListener.cs @@ -47,7 +47,7 @@ public void Dispose() public bool InstrumentPublished(Instrument instrument, out object? userState) { userState = null; - bool result = false; + var result = false; if (this.meterProviderSdk is { }) { diff --git a/src/OpenTelemetry/Metrics/MeterProviderExtensions.cs b/src/OpenTelemetry/Metrics/MeterProviderExtensions.cs index 472e170d5f3..b4644300739 100644 --- a/src/OpenTelemetry/Metrics/MeterProviderExtensions.cs +++ b/src/OpenTelemetry/Metrics/MeterProviderExtensions.cs @@ -126,7 +126,7 @@ static bool TryFindExporter(MetricReader? reader, out T? exporter) if (reader is CompositeMetricReader compositeMetricReader) { - foreach (MetricReader childReader in compositeMetricReader) + foreach (var childReader in compositeMetricReader) { if (TryFindExporter(childReader, out exporter)) { diff --git a/src/OpenTelemetry/Metrics/MeterProviderSdk.cs b/src/OpenTelemetry/Metrics/MeterProviderSdk.cs index 74ece3ef668..c972ffad85e 100644 --- a/src/OpenTelemetry/Metrics/MeterProviderSdk.cs +++ b/src/OpenTelemetry/Metrics/MeterProviderSdk.cs @@ -24,24 +24,20 @@ internal sealed class MeterProviderSdk : MeterProvider internal ExemplarFilterType? ExemplarFilterForHistograms; internal Action? OnCollectObservableInstruments; - private readonly List instrumentations = []; private readonly List> viewConfigs; private readonly Lock collectLock = new(); private readonly MeterListener listener; private readonly Func shouldListenTo = instrument => false; private CompositeMetricReader? compositeMetricReader; - private MetricReader? reader; internal MeterProviderSdk( IServiceProvider serviceProvider, bool ownsServiceProvider) { - Debug.Assert(serviceProvider != null, "serviceProvider was null"); - - var state = serviceProvider!.GetRequiredService(); + var state = serviceProvider.GetRequiredService(); state.RegisterProvider(this); - this.ServiceProvider = serviceProvider!; + this.ServiceProvider = serviceProvider; if (ownsServiceProvider) { @@ -51,18 +47,18 @@ internal MeterProviderSdk( OpenTelemetrySdkEventSource.Log.MeterProviderSdkEvent("Building MeterProvider."); - var configureProviderBuilders = serviceProvider!.GetServices(); + var configureProviderBuilders = serviceProvider.GetServices(); foreach (var configureProviderBuilder in configureProviderBuilders) { - configureProviderBuilder.ConfigureBuilder(serviceProvider!, state); + configureProviderBuilder.ConfigureBuilder(serviceProvider, state); } this.ExemplarFilter = state.ExemplarFilter; - this.ApplySpecificationConfigurationKeys(serviceProvider!.GetRequiredService()); + this.ApplySpecificationConfigurationKeys(serviceProvider.GetRequiredService()); - StringBuilder exportersAdded = new StringBuilder(); - StringBuilder instrumentationFactoriesAdded = new StringBuilder(); + var exportersAdded = new StringBuilder(); + var instrumentationFactoriesAdded = new StringBuilder(); var resourceBuilder = state.ResourceBuilder ?? ResourceBuilder.CreateDefault(); resourceBuilder.ServiceProvider = serviceProvider; @@ -85,17 +81,17 @@ internal MeterProviderSdk( this.ExemplarFilter, this.ExemplarFilterForHistograms); - if (this.reader == null) + if (this.Reader == null) { - this.reader = reader; + this.Reader = reader; } - else if (this.reader is CompositeMetricReader compositeReader) + else if (this.Reader is CompositeMetricReader compositeReader) { compositeReader.AddReader(reader); } else { - this.reader = new CompositeMetricReader([this.reader, reader]); + this.Reader = new CompositeMetricReader([this.Reader, reader]); } if (reader is PeriodicExportingMetricReader periodicExportingMetricReader) @@ -120,7 +116,7 @@ internal MeterProviderSdk( OpenTelemetrySdkEventSource.Log.MeterProviderSdkEvent($"Exporters added = \"{exportersAdded}\"."); } - this.compositeMetricReader = this.reader as CompositeMetricReader; + this.compositeMetricReader = this.Reader as CompositeMetricReader; if (state.Instrumentation.Count > 0) { @@ -128,7 +124,7 @@ internal MeterProviderSdk( { if (instrumentation.Instance is not null) { - this.instrumentations.Add(instrumentation.Instance); + this.Instrumentations.Add(instrumentation.Instance); } instrumentationFactoriesAdded.Append(instrumentation.Name); @@ -163,7 +159,7 @@ internal MeterProviderSdk( this.listener.InstrumentPublished = (instrument, listener) => { - object? state = this.InstrumentPublished(instrument, listeningIsManagedExternally: false); + var state = this.InstrumentPublished(instrument, listeningIsManagedExternally: false); if (state != null) { listener.EnableMeasurementEvents(instrument, state); @@ -189,9 +185,9 @@ internal MeterProviderSdk( internal Resource Resource { get; } - internal List Instrumentations => this.instrumentations; + internal List Instrumentations { get; } = []; - internal MetricReader? Reader => this.reader; + internal MetricReader? Reader { get; private set; } internal static void MeasurementsCompleted(Instrument instrument, object? state) { @@ -268,9 +264,9 @@ internal static void MeasurementRecordedDouble(Instrument instrument, double val return null; } - if (this.reader != null) + if (this.Reader != null) { - var metrics = this.reader.AddMetricWithNoViews(instrument); + var metrics = this.Reader.AddMetricWithNoViews(instrument); if (metrics.Count == 1) { state = MetricState.BuildForSingleMetric(metrics[0]); @@ -338,9 +334,9 @@ internal static void MeasurementRecordedDouble(Instrument instrument, double val metricStreamConfigs.Add(null); } - if (this.reader != null) + if (this.Reader != null) { - var metrics = this.reader.AddMetricWithViews(instrument, metricStreamConfigs); + var metrics = this.Reader.AddMetricWithViews(instrument, metricStreamConfigs); if (metrics.Count == 1) { state = MetricState.BuildForSingleMetric(metrics[0]); @@ -417,7 +413,7 @@ internal void CollectObservableInstruments() internal bool OnForceFlush(int timeoutMilliseconds) { OpenTelemetrySdkEventSource.Log.MeterProviderSdkEvent($"{nameof(MeterProviderSdk)}.{nameof(this.OnForceFlush)} called with {nameof(timeoutMilliseconds)} = {timeoutMilliseconds}."); - return this.reader?.Collect(timeoutMilliseconds) ?? true; + return this.Reader?.Collect(timeoutMilliseconds) ?? true; } /// @@ -439,7 +435,7 @@ internal bool OnForceFlush(int timeoutMilliseconds) internal bool OnShutdown(int timeoutMilliseconds) { OpenTelemetrySdkEventSource.Log.MeterProviderSdkEvent($"{nameof(MeterProviderSdk)}.{nameof(this.OnShutdown)} called with {nameof(timeoutMilliseconds)} = {timeoutMilliseconds}."); - return this.reader?.Shutdown(timeoutMilliseconds) ?? true; + return this.Reader?.Shutdown(timeoutMilliseconds) ?? true; } protected override void Dispose(bool disposing) @@ -449,17 +445,17 @@ protected override void Dispose(bool disposing) { if (disposing) { - foreach (var item in this.instrumentations) + foreach (var item in this.Instrumentations) { (item as IDisposable)?.Dispose(); } - this.instrumentations.Clear(); + this.Instrumentations.Clear(); // Wait for up to 5 seconds grace period - this.reader?.Shutdown(5000); - this.reader?.Dispose(); - this.reader = null; + this.Reader?.Shutdown(5000); + this.Reader?.Dispose(); + this.Reader = null; this.compositeMetricReader?.Dispose(); this.compositeMetricReader = null; diff --git a/src/OpenTelemetry/Metrics/Metric.cs b/src/OpenTelemetry/Metrics/Metric.cs index 1416f56151e..2623ae4f2e4 100644 --- a/src/OpenTelemetry/Metrics/Metric.cs +++ b/src/OpenTelemetry/Metrics/Metric.cs @@ -17,17 +17,21 @@ public sealed class Metric internal const int DefaultExponentialHistogramMaxScale = 20; - internal static readonly double[] DefaultHistogramBounds = new double[] { 0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000 }; + internal static readonly double[] DefaultHistogramBounds = [0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000]; // Short default histogram bounds. Based on the recommended semantic convention values for http.server.request.duration. - internal static readonly double[] DefaultHistogramBoundsShortSeconds = new double[] { 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 }; + internal static readonly double[] DefaultHistogramBoundsShortSeconds = [0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10]; internal static readonly #if NET FrozenSet<(string, string)> #else HashSet<(string, string)> #endif +#pragma warning disable IDE0028 // Simplify collection initialization +#pragma warning disable IDE0090 // Use 'new(...)' DefaultHistogramBoundShortMappings = new HashSet<(string, string)> +#pragma warning restore IDE0090 // Use 'new(...)' +#pragma warning restore IDE0028 // Simplify collection initialization { ("Microsoft.AspNetCore.Hosting", "http.server.request.duration"), ("Microsoft.AspNetCore.RateLimiting", "aspnetcore.rate_limiting.request.time_in_queue"), @@ -46,14 +50,18 @@ internal static readonly ; // Long default histogram bounds. Not based on a standard. May change in the future. - internal static readonly double[] DefaultHistogramBoundsLongSeconds = new double[] { 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60, 120, 300 }; + internal static readonly double[] DefaultHistogramBoundsLongSeconds = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60, 120, 300]; internal static readonly #if NET FrozenSet<(string, string)> #else HashSet<(string, string)> #endif +#pragma warning disable IDE0028 // Simplify collection initialization +#pragma warning disable IDE0090 // Use 'new(...)' DefaultHistogramBoundLongMappings = new HashSet<(string, string)> +#pragma warning restore IDE0090 // Use 'new(...)' +#pragma warning restore IDE0028 // Simplify collection initialization { ("Microsoft.AspNetCore.Http.Connections", "signalr.server.connection.duration"), ("Microsoft.AspNetCore.Server.Kestrel", "kestrel.connection.duration"), @@ -170,16 +178,11 @@ internal Metric( ? MetricType.Histogram : MetricType.ExponentialHistogram; - if (this.MetricType == MetricType.Histogram) - { - aggType = explicitBucketBounds != null && explicitBucketBounds.Length == 0 + aggType = this.MetricType == MetricType.Histogram + ? explicitBucketBounds != null && explicitBucketBounds.Length == 0 ? (histogramRecordMinMax ? AggregationType.HistogramWithMinMax : AggregationType.Histogram) - : (histogramRecordMinMax ? AggregationType.HistogramWithMinMaxBuckets : AggregationType.HistogramWithBuckets); - } - else - { - aggType = histogramRecordMinMax ? AggregationType.Base2ExponentialHistogramWithMinMax : AggregationType.Base2ExponentialHistogram; - } + : (histogramRecordMinMax ? AggregationType.HistogramWithMinMaxBuckets : AggregationType.HistogramWithBuckets) + : histogramRecordMinMax ? AggregationType.Base2ExponentialHistogramWithMinMax : AggregationType.Base2ExponentialHistogram; } else { diff --git a/src/OpenTelemetry/Metrics/MetricPoint/ExponentialHistogramBuckets.cs b/src/OpenTelemetry/Metrics/MetricPoint/ExponentialHistogramBuckets.cs index 8fc9dda8cc8..6fd03e1e1f3 100644 --- a/src/OpenTelemetry/Metrics/MetricPoint/ExponentialHistogramBuckets.cs +++ b/src/OpenTelemetry/Metrics/MetricPoint/ExponentialHistogramBuckets.cs @@ -9,7 +9,7 @@ namespace OpenTelemetry.Metrics; // Note: Does not implement IEnumerable<> to prevent accidental boxing. public sealed class ExponentialHistogramBuckets { - private long[] buckets = Array.Empty(); + private long[] buckets = []; private int size; internal ExponentialHistogramBuckets() diff --git a/src/OpenTelemetry/Metrics/MetricPoint/HistogramBuckets.cs b/src/OpenTelemetry/Metrics/MetricPoint/HistogramBuckets.cs index 0d5a8ed8ee7..ae33698f444 100644 --- a/src/OpenTelemetry/Metrics/MetricPoint/HistogramBuckets.cs +++ b/src/OpenTelemetry/Metrics/MetricPoint/HistogramBuckets.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using System.Runtime.CompilerServices; namespace OpenTelemetry.Metrics; @@ -42,7 +41,7 @@ internal HistogramBuckets(HistogramExplicitBounds? histogramExplicitBounds) internal HistogramBuckets Copy() { - HistogramBuckets copy = new HistogramBuckets(this.histogramExplicitBounds); + var copy = new HistogramBuckets(this.histogramExplicitBounds); Array.Copy(this.BucketCounts, copy.BucketCounts, this.BucketCounts.Length); copy.SnapshotSum = this.SnapshotSum; @@ -54,10 +53,7 @@ internal HistogramBuckets Copy() [MethodImpl(MethodImplOptions.AggressiveInlining)] internal int FindBucketIndex(double value) - { - Debug.Assert(this.histogramExplicitBounds != null, "histogramExplicitBounds was null."); - return this.histogramExplicitBounds!.FindBucketIndex(value); - } + => this.histogramExplicitBounds!.FindBucketIndex(value); [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void Snapshot(bool outputDelta) @@ -66,7 +62,7 @@ internal void Snapshot(bool outputDelta) if (outputDelta) { - for (int i = 0; i < bucketCounts.Length; i++) + for (var i = 0; i < bucketCounts.Length; i++) { ref var values = ref bucketCounts[i]; ref var running = ref values.RunningValue; @@ -76,7 +72,7 @@ internal void Snapshot(bool outputDelta) } else { - for (int i = 0; i < bucketCounts.Length; i++) + for (var i = 0; i < bucketCounts.Length; i++) { ref var values = ref bucketCounts[i]; values.SnapshotValue = values.RunningValue; @@ -121,10 +117,10 @@ public bool MoveNext() { if (this.index < this.numberOfBuckets) { - double explicitBound = this.index < this.numberOfBuckets - 1 + var explicitBound = this.index < this.numberOfBuckets - 1 ? this.histogramMeasurements.ExplicitBounds![this.index] : double.PositiveInfinity; - long bucketCount = this.histogramMeasurements.BucketCounts[this.index].SnapshotValue; + var bucketCount = this.histogramMeasurements.BucketCounts[this.index].SnapshotValue; this.Current = new HistogramBucket(explicitBound, bucketCount); this.index++; return true; diff --git a/src/OpenTelemetry/Metrics/MetricPoint/MetricPoint.cs b/src/OpenTelemetry/Metrics/MetricPoint/MetricPoint.cs index e8b26bec4f8..6bc11a7baf2 100644 --- a/src/OpenTelemetry/Metrics/MetricPoint/MetricPoint.cs +++ b/src/OpenTelemetry/Metrics/MetricPoint/MetricPoint.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using System.Runtime.CompilerServices; using OpenTelemetry.Internal; @@ -44,10 +43,6 @@ internal MetricPoint( int exponentialHistogramMaxScale, LookupData? lookupData = null) { - Debug.Assert(aggregatorStore != null, "AggregatorStore was null."); - Debug.Assert(histogramExplicitBounds != null, "HistogramExplicitBounds was null."); - Debug.Assert(!aggregatorStore!.OutputDelta || lookupData != null, "LookupData was null."); - this.aggType = aggType; this.Tags = new ReadOnlyTagCollection(tagKeysAndValues); this.runningValue = default; @@ -57,7 +52,7 @@ internal MetricPoint( this.ReferenceCount = 1; this.LookupData = lookupData; - var isExemplarEnabled = aggregatorStore!.IsExemplarEnabled(); + var isExemplarEnabled = aggregatorStore.IsExemplarEnabled(); ExemplarReservoir? reservoir; try @@ -72,27 +67,33 @@ internal MetricPoint( reservoir = null; } - if (this.aggType == AggregationType.HistogramWithBuckets || - this.aggType == AggregationType.HistogramWithMinMaxBuckets) + if (this.aggType is AggregationType.HistogramWithBuckets or + AggregationType.HistogramWithMinMaxBuckets) { - this.mpComponents = new MetricPointOptionalComponents(); - this.mpComponents.HistogramBuckets = new HistogramBuckets(histogramExplicitBounds); + this.mpComponents = new MetricPointOptionalComponents + { + HistogramBuckets = new HistogramBuckets(histogramExplicitBounds), + }; if (isExemplarEnabled && reservoir == null) { - reservoir = new AlignedHistogramBucketExemplarReservoir(histogramExplicitBounds!.Bounds.Length); + reservoir = new AlignedHistogramBucketExemplarReservoir(histogramExplicitBounds.Bounds.Length); } } - else if (this.aggType == AggregationType.Histogram || - this.aggType == AggregationType.HistogramWithMinMax) + else if (this.aggType is AggregationType.Histogram or + AggregationType.HistogramWithMinMax) { - this.mpComponents = new MetricPointOptionalComponents(); - this.mpComponents.HistogramBuckets = new HistogramBuckets(null); + this.mpComponents = new MetricPointOptionalComponents + { + HistogramBuckets = new HistogramBuckets(null), + }; } - else if (this.aggType == AggregationType.Base2ExponentialHistogram || - this.aggType == AggregationType.Base2ExponentialHistogramWithMinMax) + else if (this.aggType is AggregationType.Base2ExponentialHistogram or + AggregationType.Base2ExponentialHistogramWithMinMax) { - this.mpComponents = new MetricPointOptionalComponents(); - this.mpComponents.Base2ExponentialBucketHistogram = new Base2ExponentialBucketHistogram(exponentialHistogramMaxSize, exponentialHistogramMaxScale); + this.mpComponents = new MetricPointOptionalComponents + { + Base2ExponentialBucketHistogram = new Base2ExponentialBucketHistogram(exponentialHistogramMaxSize, exponentialHistogramMaxScale), + }; if (isExemplarEnabled && reservoir == null) { reservoir = new SimpleFixedSizeExemplarReservoir(Math.Min(20, exponentialHistogramMaxSize)); @@ -110,10 +111,7 @@ internal MetricPoint( if (reservoir != null) { - if (this.mpComponents == null) - { - this.mpComponents = new MetricPointOptionalComponents(); - } + this.mpComponents ??= new MetricPointOptionalComponents(); reservoir.Initialize(aggregatorStore); @@ -148,8 +146,10 @@ internal MetricPointStatus MetricPointStatus [MethodImpl(MethodImplOptions.AggressiveInlining)] readonly get; +#pragma warning disable IDE0251 // Make member 'readonly' [MethodImpl(MethodImplOptions.AggressiveInlining)] private set; +#pragma warning restore IDE0251 // Make member 'readonly' } // When the AggregatorStore is reclaiming MetricPoints, this serves the purpose of validating the a given thread is using the right @@ -170,7 +170,7 @@ internal MetricPointStatus MetricPointStatus [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly long GetSumLong() { - if (this.aggType != AggregationType.LongSumIncomingDelta && this.aggType != AggregationType.LongSumIncomingCumulative) + if (this.aggType is not AggregationType.LongSumIncomingDelta and not AggregationType.LongSumIncomingCumulative) { this.ThrowNotSupportedMetricTypeException(nameof(this.GetSumLong)); } @@ -188,7 +188,7 @@ public readonly long GetSumLong() [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly double GetSumDouble() { - if (this.aggType != AggregationType.DoubleSumIncomingDelta && this.aggType != AggregationType.DoubleSumIncomingCumulative) + if (this.aggType is not AggregationType.DoubleSumIncomingDelta and not AggregationType.DoubleSumIncomingCumulative) { this.ThrowNotSupportedMetricTypeException(nameof(this.GetSumDouble)); } @@ -242,12 +242,12 @@ public readonly double GetGaugeLastValueDouble() [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly long GetHistogramCount() { - if (this.aggType != AggregationType.HistogramWithBuckets && - this.aggType != AggregationType.Histogram && - this.aggType != AggregationType.HistogramWithMinMaxBuckets && - this.aggType != AggregationType.HistogramWithMinMax && - this.aggType != AggregationType.Base2ExponentialHistogram && - this.aggType != AggregationType.Base2ExponentialHistogramWithMinMax) + if (this.aggType is not AggregationType.HistogramWithBuckets and + not AggregationType.Histogram and + not AggregationType.HistogramWithMinMaxBuckets and + not AggregationType.HistogramWithMinMax and + not AggregationType.Base2ExponentialHistogram and + not AggregationType.Base2ExponentialHistogramWithMinMax) { this.ThrowNotSupportedMetricTypeException(nameof(this.GetHistogramCount)); } @@ -265,21 +265,16 @@ public readonly long GetHistogramCount() [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly double GetHistogramSum() { - if (this.aggType != AggregationType.HistogramWithBuckets && - this.aggType != AggregationType.Histogram && - this.aggType != AggregationType.HistogramWithMinMaxBuckets && - this.aggType != AggregationType.HistogramWithMinMax && - this.aggType != AggregationType.Base2ExponentialHistogram && - this.aggType != AggregationType.Base2ExponentialHistogramWithMinMax) + if (this.aggType is not AggregationType.HistogramWithBuckets and + not AggregationType.Histogram and + not AggregationType.HistogramWithMinMaxBuckets and + not AggregationType.HistogramWithMinMax and + not AggregationType.Base2ExponentialHistogram and + not AggregationType.Base2ExponentialHistogramWithMinMax) { this.ThrowNotSupportedMetricTypeException(nameof(this.GetHistogramSum)); } - Debug.Assert( - this.mpComponents?.HistogramBuckets != null - || this.mpComponents?.Base2ExponentialBucketHistogram != null, - "HistogramBuckets and Base2ExponentialBucketHistogram were both null"); - return this.mpComponents!.HistogramBuckets != null ? this.mpComponents.HistogramBuckets.SnapshotSum : this.mpComponents.Base2ExponentialBucketHistogram!.SnapshotSum; @@ -295,16 +290,14 @@ public readonly double GetHistogramSum() [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly HistogramBuckets GetHistogramBuckets() { - if (this.aggType != AggregationType.HistogramWithBuckets && - this.aggType != AggregationType.Histogram && - this.aggType != AggregationType.HistogramWithMinMaxBuckets && - this.aggType != AggregationType.HistogramWithMinMax) + if (this.aggType is not AggregationType.HistogramWithBuckets and + not AggregationType.Histogram and + not AggregationType.HistogramWithMinMaxBuckets and + not AggregationType.HistogramWithMinMax) { this.ThrowNotSupportedMetricTypeException(nameof(this.GetHistogramBuckets)); } - Debug.Assert(this.mpComponents?.HistogramBuckets != null, "HistogramBuckets was null"); - return this.mpComponents!.HistogramBuckets!; } @@ -318,14 +311,12 @@ public readonly HistogramBuckets GetHistogramBuckets() [MethodImpl(MethodImplOptions.AggressiveInlining)] public ExponentialHistogramData GetExponentialHistogramData() { - if (this.aggType != AggregationType.Base2ExponentialHistogram && - this.aggType != AggregationType.Base2ExponentialHistogramWithMinMax) + if (this.aggType is not AggregationType.Base2ExponentialHistogram and + not AggregationType.Base2ExponentialHistogramWithMinMax) { this.ThrowNotSupportedMetricTypeException(nameof(this.GetExponentialHistogramData)); } - Debug.Assert(this.mpComponents?.Base2ExponentialBucketHistogram != null, "Base2ExponentialBucketHistogram was null"); - return this.mpComponents!.Base2ExponentialBucketHistogram!.GetExponentialHistogramData(); } @@ -338,11 +329,9 @@ public ExponentialHistogramData GetExponentialHistogramData() [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly bool TryGetHistogramMinMaxValues(out double min, out double max) { - if (this.aggType == AggregationType.HistogramWithMinMax - || this.aggType == AggregationType.HistogramWithMinMaxBuckets) + if (this.aggType is AggregationType.HistogramWithMinMax + or AggregationType.HistogramWithMinMaxBuckets) { - Debug.Assert(this.mpComponents?.HistogramBuckets != null, "HistogramBuckets was null"); - min = this.mpComponents!.HistogramBuckets!.SnapshotMin; max = this.mpComponents.HistogramBuckets.SnapshotMax; return true; @@ -350,8 +339,6 @@ public readonly bool TryGetHistogramMinMaxValues(out double min, out double max) if (this.aggType == AggregationType.Base2ExponentialHistogramWithMinMax) { - Debug.Assert(this.mpComponents?.Base2ExponentialBucketHistogram != null, "Base2ExponentialBucketHistogram was null"); - min = this.mpComponents!.Base2ExponentialBucketHistogram!.SnapshotMin; max = this.mpComponents.Base2ExponentialBucketHistogram.SnapshotMax; return true; @@ -376,7 +363,7 @@ public readonly bool TryGetExemplars(out ReadOnlyExemplarCollection exemplars) internal readonly MetricPoint Copy() { - MetricPoint copy = this; + var copy = this; copy.mpComponents = this.mpComponents?.Copy(); return copy; } @@ -433,6 +420,13 @@ internal void Update(long number) this.UpdateBase2ExponentialHistogramWithMinMax(number); return; } + + case AggregationType.DoubleGauge: + case AggregationType.DoubleSumIncomingCumulative: + case AggregationType.DoubleSumIncomingDelta: + case AggregationType.Invalid: + default: + break; } this.CompleteUpdate(); @@ -490,6 +484,13 @@ internal void UpdateWithExemplar(long number, ReadOnlySpan @@ -895,8 +899,6 @@ internal void NullifyMetricPointState() private void UpdateHistogram(double number, ReadOnlySpan> tags = default, bool offerExemplar = false) { - Debug.Assert(this.mpComponents?.HistogramBuckets != null, "HistogramBuckets was null"); - var histogramBuckets = this.mpComponents!.HistogramBuckets!; this.mpComponents.AcquireLock(); @@ -916,8 +918,6 @@ private void UpdateHistogram(double number, ReadOnlySpan> tags = default, bool offerExemplar = false) { - Debug.Assert(this.mpComponents?.HistogramBuckets != null, "HistogramBuckets was null"); - var histogramBuckets = this.mpComponents!.HistogramBuckets!; this.mpComponents.AcquireLock(); @@ -940,11 +940,9 @@ private void UpdateHistogramWithMinMax(double number, ReadOnlySpan> tags = default, bool offerExemplar = false) { - Debug.Assert(this.mpComponents?.HistogramBuckets != null, "HistogramBuckets was null"); - - var histogramBuckets = this.mpComponents!.HistogramBuckets; + var histogramBuckets = this.mpComponents!.HistogramBuckets!; - int bucketIndex = histogramBuckets!.FindBucketIndex(number); + var bucketIndex = histogramBuckets.FindBucketIndex(number); this.mpComponents.AcquireLock(); @@ -964,11 +962,9 @@ private void UpdateHistogramWithBuckets(double number, ReadOnlySpan> tags = default, bool offerExemplar = false) { - Debug.Assert(this.mpComponents?.HistogramBuckets != null, "histogramBuckets was null"); - - var histogramBuckets = this.mpComponents!.HistogramBuckets; + var histogramBuckets = this.mpComponents!.HistogramBuckets!; - int bucketIndex = histogramBuckets!.FindBucketIndex(number); + var bucketIndex = histogramBuckets.FindBucketIndex(number); this.mpComponents.AcquireLock(); @@ -997,8 +993,6 @@ private void UpdateBase2ExponentialHistogram(double number, ReadOnlySpan(number, tags)); @@ -1066,8 +1056,6 @@ private readonly void UpdateExemplar(double number, ReadOnlySpan(number, tags, explicitBucketHistogramBucketIndex)); @@ -1104,7 +1092,5 @@ private void CompleteUpdateWithoutMeasurement() [MethodImpl(MethodImplOptions.NoInlining)] private readonly void ThrowNotSupportedMetricTypeException(string methodName) - { - throw new NotSupportedException($"{methodName} is not supported for this metric type."); - } + => throw new NotSupportedException($"{methodName} is not supported for this metric type."); } diff --git a/src/OpenTelemetry/Metrics/MetricPoint/MetricPointOptionalComponents.cs b/src/OpenTelemetry/Metrics/MetricPoint/MetricPointOptionalComponents.cs index e22cbe54cc7..1a8920a788b 100644 --- a/src/OpenTelemetry/Metrics/MetricPoint/MetricPointOptionalComponents.cs +++ b/src/OpenTelemetry/Metrics/MetricPoint/MetricPointOptionalComponents.cs @@ -26,7 +26,7 @@ internal sealed class MetricPointOptionalComponents public MetricPointOptionalComponents Copy() { - MetricPointOptionalComponents copy = new MetricPointOptionalComponents + var copy = new MetricPointOptionalComponents { HistogramBuckets = this.HistogramBuckets?.Copy(), Base2ExponentialBucketHistogram = this.Base2ExponentialBucketHistogram?.Copy(), diff --git a/src/OpenTelemetry/Metrics/MetricPoint/MetricPointsAccessor.cs b/src/OpenTelemetry/Metrics/MetricPoint/MetricPointsAccessor.cs index 3a6ab4a1fd6..e006eb5b9ab 100644 --- a/src/OpenTelemetry/Metrics/MetricPoint/MetricPointsAccessor.cs +++ b/src/OpenTelemetry/Metrics/MetricPoint/MetricPointsAccessor.cs @@ -1,8 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; - namespace OpenTelemetry.Metrics; /// @@ -17,11 +15,8 @@ public readonly struct MetricPointsAccessor internal MetricPointsAccessor(MetricPoint[] metricsPoints, int[] metricPointsToProcess, int targetCount) { - Debug.Assert(metricsPoints != null, "metricPoints was null"); - Debug.Assert(metricPointsToProcess != null, "metricPointsToProcess was null"); - - this.metricsPoints = metricsPoints!; - this.metricPointsToProcess = metricPointsToProcess!; + this.metricsPoints = metricsPoints; + this.metricPointsToProcess = metricPointsToProcess; this.targetCount = targetCount; } diff --git a/src/OpenTelemetry/Metrics/MetricState.cs b/src/OpenTelemetry/Metrics/MetricState.cs index ae552861b6e..da01fb7d65e 100644 --- a/src/OpenTelemetry/Metrics/MetricState.cs +++ b/src/OpenTelemetry/Metrics/MetricState.cs @@ -24,44 +24,38 @@ private MetricState( internal delegate void RecordMeasurementAction(T value, ReadOnlySpan> tags); - public static MetricState BuildForSingleMetric( - Metric metric) - { - Debug.Assert(metric != null, "metric was null"); - - return new( - completeMeasurement: () => MetricReader.DeactivateMetric(metric!), - recordMeasurementLong: metric!.UpdateLong, - recordMeasurementDouble: metric!.UpdateDouble); - } + public static MetricState BuildForSingleMetric(Metric metric) => + new( + completeMeasurement: () => MetricReader.DeactivateMetric(metric), + recordMeasurementLong: metric.UpdateLong, + recordMeasurementDouble: metric.UpdateDouble); public static MetricState BuildForMetricList( List metrics) { - Debug.Assert(metrics != null, "metrics was null"); Debug.Assert(!metrics.Any(m => m == null), "metrics contained null elements"); // Note: Use an array here to elide bounds checks. - var metricsArray = metrics!.ToArray(); + var metricsArray = metrics.ToArray(); return new( completeMeasurement: () => { - for (int i = 0; i < metricsArray.Length; i++) + for (var i = 0; i < metricsArray.Length; i++) { MetricReader.DeactivateMetric(metricsArray[i]); } }, recordMeasurementLong: (v, t) => { - for (int i = 0; i < metricsArray.Length; i++) + for (var i = 0; i < metricsArray.Length; i++) { metricsArray[i].UpdateLong(v, t); } }, recordMeasurementDouble: (v, t) => { - for (int i = 0; i < metricsArray.Length; i++) + for (var i = 0; i < metricsArray.Length; i++) { metricsArray[i].UpdateDouble(v, t); } diff --git a/src/OpenTelemetry/Metrics/MetricStreamIdentity.cs b/src/OpenTelemetry/Metrics/MetricStreamIdentity.cs index 4bb3e6bd127..16a42c70892 100644 --- a/src/OpenTelemetry/Metrics/MetricStreamIdentity.cs +++ b/src/OpenTelemetry/Metrics/MetricStreamIdentity.cs @@ -68,7 +68,7 @@ public MetricStreamIdentity(Instrument instrument, MetricStreamConfiguration? me hash = (hash * 31) + this.MeterName.GetHashCode(); hash = (hash * 31) + this.MeterVersion.GetHashCode(); hash = (hash * 31) + this.MeterSchemaUrl.GetHashCode(); - hash = (hash * 31) + this.MeterTags?.GetHashCode() ?? 0; + hash = (hash * 31) + (this.MeterTags?.GetHashCode() ?? 0); hash = (hash * 31) + this.InstrumentName.GetHashCode(); hash = (hash * 31) + this.HistogramRecordMinMax.GetHashCode(); hash = (hash * 31) + this.ExponentialHistogramMaxSize.GetHashCode(); @@ -154,39 +154,30 @@ public MetricStreamIdentity(Instrument instrument, MetricStreamConfiguration? me public static bool operator !=(MetricStreamIdentity metricIdentity1, MetricStreamIdentity metricIdentity2) => !metricIdentity1.Equals(metricIdentity2); public override readonly bool Equals(object? obj) - { - return obj is MetricStreamIdentity other && this.Equals(other); - } + => obj is MetricStreamIdentity other && this.Equals(other); public bool Equals(MetricStreamIdentity other) - { - return this.InstrumentType == other.InstrumentType - && this.MeterName == other.MeterName - && this.MeterVersion == other.MeterVersion - && this.MeterSchemaUrl == other.MeterSchemaUrl - && this.InstrumentName == other.InstrumentName - && this.Unit == other.Unit - && this.Description == other.Description - && this.ViewId == other.ViewId - && this.MeterTags == other.MeterTags - && this.HistogramRecordMinMax == other.HistogramRecordMinMax - && this.ExponentialHistogramMaxSize == other.ExponentialHistogramMaxSize - && this.ExponentialHistogramMaxScale == other.ExponentialHistogramMaxScale - && StringArrayComparer.Equals(this.TagKeys, other.TagKeys) - && HistogramBoundsEqual(this.HistogramBucketBounds, other.HistogramBucketBounds); - } + => this.InstrumentType == other.InstrumentType + && this.MeterName == other.MeterName + && this.MeterVersion == other.MeterVersion + && this.MeterSchemaUrl == other.MeterSchemaUrl + && this.InstrumentName == other.InstrumentName + && this.Unit == other.Unit + && this.Description == other.Description + && this.ViewId == other.ViewId + && this.MeterTags == other.MeterTags + && this.HistogramRecordMinMax == other.HistogramRecordMinMax + && this.ExponentialHistogramMaxSize == other.ExponentialHistogramMaxSize + && this.ExponentialHistogramMaxScale == other.ExponentialHistogramMaxScale + && StringArrayComparer.Equals(this.TagKeys, other.TagKeys) + && HistogramBoundsEqual(this.HistogramBucketBounds, other.HistogramBucketBounds); public override readonly int GetHashCode() => this.hashCode; - private static double[]? GetExplicitBucketHistogramBounds(Instrument instrument, MetricStreamConfiguration? metricStreamConfiguration) + private static double[]? GetExplicitBucketHistogramBounds(Instrument instrument, MetricStreamConfiguration? metricStreamConfiguration) => metricStreamConfiguration switch { - if (metricStreamConfiguration is ExplicitBucketHistogramConfiguration explicitBucketHistogramConfiguration - && explicitBucketHistogramConfiguration.CopiedBoundaries != null) - { - return explicitBucketHistogramConfiguration.CopiedBoundaries; - } - - return instrument switch + ExplicitBucketHistogramConfiguration explicitConfiguration when explicitConfiguration.CopiedBoundaries != null => explicitConfiguration.CopiedBoundaries, + _ => instrument switch { Histogram longHistogram => GetExplicitBucketHistogramBoundsFromAdvice(longHistogram), Histogram intHistogram => GetExplicitBucketHistogramBoundsFromAdvice(intHistogram), @@ -195,8 +186,8 @@ public bool Equals(MetricStreamIdentity other) Histogram floatHistogram => GetExplicitBucketHistogramBoundsFromAdvice(floatHistogram), Histogram doubleHistogram => GetExplicitBucketHistogramBoundsFromAdvice(doubleHistogram), _ => null, - }; - } + }, + }; private static double[]? GetExplicitBucketHistogramBoundsFromAdvice(Histogram histogram) where T : struct @@ -209,13 +200,14 @@ public bool Equals(MetricStreamIdentity other) if (typeof(T) == typeof(double)) { - return ((IReadOnlyList)adviceExplicitBucketBoundaries).ToArray(); + var boundaries = (IReadOnlyList)adviceExplicitBucketBoundaries; + return [.. boundaries]; } else { - double[] explicitBucketBoundaries = new double[adviceExplicitBucketBoundaries.Count]; + var explicitBucketBoundaries = new double[adviceExplicitBucketBoundaries.Count]; - for (int i = 0; i < adviceExplicitBucketBoundaries.Count; i++) + for (var i = 0; i < adviceExplicitBucketBoundaries.Count; i++) { explicitBucketBoundaries[i] = Convert.ToDouble(adviceExplicitBucketBoundaries[i], CultureInfo.InvariantCulture); } @@ -231,7 +223,7 @@ private static bool HistogramBoundsEqual(double[]? bounds1, double[]? bounds2) return true; } - if (ReferenceEquals(bounds1, null) || ReferenceEquals(bounds2, null)) + if (bounds1 is null || bounds2 is null) { return false; } @@ -243,7 +235,7 @@ private static bool HistogramBoundsEqual(double[]? bounds1, double[]? bounds2) return false; } - for (int i = 0; i < len1; i++) + for (var i = 0; i < len1; i++) { if (!bounds1[i].Equals(bounds2[i])) { diff --git a/src/OpenTelemetry/Metrics/MetricTypeExtensions.cs b/src/OpenTelemetry/Metrics/MetricTypeExtensions.cs index c21b1be3dd2..359f775cee9 100644 --- a/src/OpenTelemetry/Metrics/MetricTypeExtensions.cs +++ b/src/OpenTelemetry/Metrics/MetricTypeExtensions.cs @@ -45,7 +45,7 @@ public static class MetricTypeExtensions public static bool IsSum(this MetricType self) { var type = self & METRIC_TYPE_MASK; - return type == METRIC_TYPE_MONOTONIC_SUM || type == METRIC_TYPE_NON_MONOTONIC_SUM; + return type is METRIC_TYPE_MONOTONIC_SUM or METRIC_TYPE_NON_MONOTONIC_SUM; } /// diff --git a/src/OpenTelemetry/Metrics/Reader/CompositeMetricReaderExt.cs b/src/OpenTelemetry/Metrics/Reader/CompositeMetricReaderExt.cs index a68b3e71070..407cc1d4761 100644 --- a/src/OpenTelemetry/Metrics/Reader/CompositeMetricReaderExt.cs +++ b/src/OpenTelemetry/Metrics/Reader/CompositeMetricReaderExt.cs @@ -31,9 +31,7 @@ internal override List AddMetricWithNoViews(Instrument instrument) internal override List AddMetricWithViews(Instrument instrument, List metricStreamConfigs) { - Debug.Assert(metricStreamConfigs != null, "metricStreamConfigs was null"); - - var metrics = new List(this.count * metricStreamConfigs!.Count); + var metrics = new List(this.count * metricStreamConfigs.Count); for (var cur = this.Head; cur != null; cur = cur.Next) { diff --git a/src/OpenTelemetry/Metrics/Reader/MetricReader.cs b/src/OpenTelemetry/Metrics/Reader/MetricReader.cs index ef5091d3e1f..5d33932a78f 100644 --- a/src/OpenTelemetry/Metrics/Reader/MetricReader.cs +++ b/src/OpenTelemetry/Metrics/Reader/MetricReader.cs @@ -12,10 +12,9 @@ namespace OpenTelemetry.Metrics; /// public abstract partial class MetricReader : IDisposable { - private const MetricReaderTemporalityPreference MetricReaderTemporalityPreferenceUnspecified = (MetricReaderTemporalityPreference)0; + private const MetricReaderTemporalityPreference MetricReaderTemporalityPreferenceUnspecified = 0; - private static readonly Func CumulativeTemporalityPreferenceFunc = - (instrumentType) => AggregationTemporality.Cumulative; + private static readonly Func CumulativeTemporalityPreferenceFunc = static (_) => AggregationTemporality.Cumulative; private static readonly Func MonotonicDeltaTemporalityPreferenceFunc = (instrumentType) => { @@ -55,7 +54,6 @@ public abstract partial class MetricReader : IDisposable private readonly Lock newTaskLock = new(); private readonly Lock onCollectLock = new(); private readonly TaskCompletionSource shutdownTcs = new(); - private MetricReaderTemporalityPreference temporalityPreference = MetricReaderTemporalityPreferenceUnspecified; private Func temporalityFunc = CumulativeTemporalityPreferenceFunc; private int shutdownCount; private TaskCompletionSource? collectionTcs; @@ -68,27 +66,27 @@ public MetricReaderTemporalityPreference TemporalityPreference { get { - if (this.temporalityPreference == MetricReaderTemporalityPreferenceUnspecified) + if (field == MetricReaderTemporalityPreferenceUnspecified) { - this.temporalityPreference = MetricReaderTemporalityPreference.Cumulative; + field = MetricReaderTemporalityPreference.Cumulative; } - return this.temporalityPreference; + return field; } set { - if (this.temporalityPreference != MetricReaderTemporalityPreferenceUnspecified) + if (field != MetricReaderTemporalityPreferenceUnspecified) { - throw new NotSupportedException($"The temporality preference cannot be modified (the current value is {this.temporalityPreference})."); + throw new NotSupportedException($"The temporality preference cannot be modified (the current value is {field})."); } - this.temporalityPreference = value; + field = value; this.temporalityFunc = value switch { MetricReaderTemporalityPreference.Delta => MonotonicDeltaTemporalityPreferenceFunc, MetricReaderTemporalityPreference.LowMemory => LowMemoryTemporalityPreferenceFunc, - _ => CumulativeTemporalityPreferenceFunc, + MetricReaderTemporalityPreference.Cumulative or _ => CumulativeTemporalityPreferenceFunc, }; } } @@ -260,9 +258,7 @@ internal virtual void SetParentProvider(BaseProvider parentProvider) /// false. /// internal virtual bool ProcessMetrics(in Batch metrics, int timeoutMilliseconds) - { - return true; - } + => true; /// /// Called by Collect. This function should block the current @@ -354,9 +350,7 @@ protected virtual bool OnCollect(int timeoutMilliseconds) /// exceptions. /// protected virtual bool OnShutdown(int timeoutMilliseconds) - { - return this.Collect(timeoutMilliseconds); - } + => this.Collect(timeoutMilliseconds); /// /// Releases the unmanaged resources used by this class and optionally diff --git a/src/OpenTelemetry/Metrics/Reader/MetricReaderExt.cs b/src/OpenTelemetry/Metrics/Reader/MetricReaderExt.cs index eb7dfe5deb7..2850660baf2 100644 --- a/src/OpenTelemetry/Metrics/Reader/MetricReaderExt.cs +++ b/src/OpenTelemetry/Metrics/Reader/MetricReaderExt.cs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 using System.Collections.Concurrent; -using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Metrics; using OpenTelemetry.Internal; @@ -14,7 +13,7 @@ namespace OpenTelemetry.Metrics; /// public abstract partial class MetricReader { - private readonly HashSet metricStreamNames = new(StringComparer.OrdinalIgnoreCase); + private readonly HashSet metricStreamNames = [with(StringComparer.OrdinalIgnoreCase)]; private readonly ConcurrentDictionary instrumentIdentityToMetric = new(); private readonly Lock instrumentCreationLock = new(); private int metricLimit; @@ -43,24 +42,19 @@ internal static void DeactivateMetric(Metric metric) } internal AggregationTemporality GetAggregationTemporality(Type instrumentType) - { - return this.temporalityFunc(instrumentType); - } + => this.temporalityFunc(instrumentType); internal virtual List AddMetricWithNoViews(Instrument instrument) { - Debug.Assert(instrument != null, "instrument was null"); - Debug.Assert(this.metrics != null, "this.metrics was null"); - MetricStreamConfiguration? metricStreamConfiguration = null; // Apply default histogram aggregation if configured if (this.DefaultHistogramAggregation is { } aggregation) { - metricStreamConfiguration = CreateDefaultHistogramConfiguration(instrument!, aggregation); + metricStreamConfiguration = CreateDefaultHistogramConfiguration(instrument, aggregation); } - var metricStreamIdentity = new MetricStreamIdentity(instrument!, metricStreamConfiguration); + var metricStreamIdentity = new MetricStreamIdentity(instrument, metricStreamConfiguration); var exemplarFilter = metricStreamIdentity.IsHistogram ? this.exemplarFilterForHistograms ?? this.exemplarFilter @@ -70,14 +64,14 @@ internal virtual List AddMetricWithNoViews(Instrument instrument) { if (this.TryGetExistingMetric(in metricStreamIdentity, out var existingMetric)) { - return new() { existingMetric }; + return [existingMetric]; } var index = ++this.metricIndex; if (index >= this.metricLimit) { OpenTelemetrySdkEventSource.Log.MetricInstrumentIgnored(metricStreamIdentity.InstrumentName, metricStreamIdentity.MeterName, "Maximum allowed Metric streams for the provider exceeded.", "Use MeterProviderBuilder.AddView to drop unused instruments. Or use MeterProviderBuilder.SetMaxMetricStreams to configure MeterProvider to allow higher limit."); - return new(); + return []; } else { @@ -97,26 +91,22 @@ internal virtual List AddMetricWithNoViews(Instrument instrument) // Also the message could call out what Instruments // and types (eg: int, long etc) are supported. OpenTelemetrySdkEventSource.Log.MetricInstrumentIgnored(metricStreamIdentity.InstrumentName, metricStreamIdentity.MeterName, "Unsupported instrument. Details: " + nse.Message, "Switch to a supported instrument type."); - return new(); + return []; } this.instrumentIdentityToMetric[metricStreamIdentity] = metric; - this.metrics![index] = metric; + this.metrics[index] = metric; this.CreateOrUpdateMetricStreamRegistration(in metricStreamIdentity); - return new() { metric }; + return [metric]; } } } internal virtual List AddMetricWithViews(Instrument instrument, List metricStreamConfigs) { - Debug.Assert(instrument != null, "instrument was null"); - Debug.Assert(metricStreamConfigs != null, "metricStreamConfigs was null"); - Debug.Assert(this.metrics != null, "this.metrics was null"); - - var maxCountMetricsToBeCreated = metricStreamConfigs!.Count; + var maxCountMetricsToBeCreated = metricStreamConfigs.Count; // Create list with initial capacity as the max metric count. // Due to duplicate/max limit, we may not end up using them @@ -125,17 +115,17 @@ internal virtual List AddMetricWithViews(Instrument instrument, List(maxCountMetricsToBeCreated); lock (this.instrumentCreationLock) { - for (int i = 0; i < maxCountMetricsToBeCreated; i++) + for (var i = 0; i < maxCountMetricsToBeCreated; i++) { var metricStreamConfig = metricStreamConfigs[i]; // Apply default histogram aggregation if no explicit view is provided if (metricStreamConfig == null && this.DefaultHistogramAggregation is { } aggregation) { - metricStreamConfig = CreateDefaultHistogramConfiguration(instrument!, aggregation); + metricStreamConfig = CreateDefaultHistogramConfiguration(instrument, aggregation); } - var metricStreamIdentity = new MetricStreamIdentity(instrument!, metricStreamConfig); + var metricStreamIdentity = new MetricStreamIdentity(instrument, metricStreamConfig); var exemplarFilter = metricStreamIdentity.IsHistogram ? this.exemplarFilterForHistograms ?? this.exemplarFilter @@ -179,7 +169,7 @@ internal virtual List AddMetricWithViews(Instrument instrument, List GetMetricsBatch() { - Debug.Assert(this.metrics != null, "this.metrics was null"); - Debug.Assert(this.metricsCurrentBatch != null, "this.metricsCurrentBatch was null"); - try { var indexSnapshot = Math.Min(this.metricIndex, this.metricLimit - 1); var target = indexSnapshot + 1; - int metricCountCurrentBatch = 0; - for (int i = 0; i < target; i++) + var metricCountCurrentBatch = 0; + for (var i = 0; i < target; i++) { - ref var metric = ref this.metrics![i]; + ref var metric = ref this.metrics[i]; if (metric != null) { - int metricPointSize = metric.Snapshot(); + var metricPointSize = metric.Snapshot(); if (metricPointSize > 0) { - this.metricsCurrentBatch![metricCountCurrentBatch++] = metric; + this.metricsCurrentBatch[metricCountCurrentBatch++] = metric; } if (!metric.Active) @@ -270,7 +255,7 @@ private Batch GetMetricsBatch() } } - return (metricCountCurrentBatch > 0) ? new Batch(this.metricsCurrentBatch!, metricCountCurrentBatch) : default; + return (metricCountCurrentBatch > 0) ? new Batch(this.metricsCurrentBatch, metricCountCurrentBatch) : default; } catch (Exception ex) { @@ -281,8 +266,6 @@ private Batch GetMetricsBatch() private void RemoveMetric(ref Metric? metric) { - Debug.Assert(metric != null, "metric was null"); - // TODO: This logic removes the metric. If the same // metric is published again we will create a new metric // for it. If this happens often we will run out of diff --git a/src/OpenTelemetry/Metrics/Reader/PeriodicExportingMetricReader.cs b/src/OpenTelemetry/Metrics/Reader/PeriodicExportingMetricReader.cs index 0596e18af18..5951d63b204 100644 --- a/src/OpenTelemetry/Metrics/Reader/PeriodicExportingMetricReader.cs +++ b/src/OpenTelemetry/Metrics/Reader/PeriodicExportingMetricReader.cs @@ -138,6 +138,9 @@ private void ExporterProc() OpenTelemetrySdkEventSource.Log.MetricReaderEvent("PeriodicExportingMetricReader calling MetricReader.Collect because the export interval has elapsed."); this.Collect(this.ExportTimeoutMilliseconds); break; + + default: + break; } } } diff --git a/src/OpenTelemetry/Metrics/StringArrayEqualityComparer.cs b/src/OpenTelemetry/Metrics/StringArrayEqualityComparer.cs index 2a2e394e784..b3d87f459ce 100644 --- a/src/OpenTelemetry/Metrics/StringArrayEqualityComparer.cs +++ b/src/OpenTelemetry/Metrics/StringArrayEqualityComparer.cs @@ -26,7 +26,7 @@ public bool Equals(string[]? strings1, string[]? strings2) return false; } - for (int i = 0; i < len1; i++) + for (var i = 0; i < len1; i++) { if (!strings1[i].Equals(strings2[i], StringComparison.Ordinal)) { @@ -44,7 +44,7 @@ public int GetHashCode(string[] strings) #if NET || NETSTANDARD2_1_OR_GREATER HashCode hashCode = default; - for (int i = 0; i < strings.Length; i++) + for (var i = 0; i < strings.Length; i++) { hashCode.Add(strings[i]); } @@ -53,7 +53,7 @@ public int GetHashCode(string[] strings) #else var hash = 17; - for (int i = 0; i < strings!.Length; i++) + for (var i = 0; i < strings!.Length; i++) { unchecked { diff --git a/src/OpenTelemetry/Metrics/Tags.cs b/src/OpenTelemetry/Metrics/Tags.cs index 7460231b7b0..c27ceb577c5 100644 --- a/src/OpenTelemetry/Metrics/Tags.cs +++ b/src/OpenTelemetry/Metrics/Tags.cs @@ -73,7 +73,7 @@ public readonly bool Equals(Tags other) } } #else - for (int i = 0; i < length; i++) + for (var i = 0; i < length; i++) { ref var ours = ref ourKvps[i]; @@ -105,7 +105,7 @@ private static int ComputeHashCode(KeyValuePair[] keyValuePairs #if NET || NETSTANDARD2_1_OR_GREATER HashCode hashCode = default; - for (int i = 0; i < keyValuePairs.Length; i++) + for (var i = 0; i < keyValuePairs.Length; i++) { ref var item = ref keyValuePairs[i]; hashCode.Add(item.Key.GetHashCode(StringComparison.Ordinal)); @@ -116,7 +116,7 @@ private static int ComputeHashCode(KeyValuePair[] keyValuePairs #else var hash = 17; - for (int i = 0; i < keyValuePairs!.Length; i++) + for (var i = 0; i < keyValuePairs!.Length; i++) { ref var item = ref keyValuePairs[i]; unchecked diff --git a/src/OpenTelemetry/Metrics/ThreadStaticStorage.cs b/src/OpenTelemetry/Metrics/ThreadStaticStorage.cs index a66460bfb79..f5e0a0b7ec9 100644 --- a/src/OpenTelemetry/Metrics/ThreadStaticStorage.cs +++ b/src/OpenTelemetry/Metrics/ThreadStaticStorage.cs @@ -22,7 +22,7 @@ internal sealed class ThreadStaticStorage private ThreadStaticStorage() { - for (int i = 0; i < MaxTagCacheSize; i++) + for (var i = 0; i < MaxTagCacheSize; i++) { this.primaryTagStorage[i] = new TagStorage(i + 1); this.secondaryTagStorage[i] = new TagStorage(i + 1); @@ -41,14 +41,9 @@ internal void SplitToKeysAndValues( { Guard.ThrowIfZero(tagLength, $"There must be at least one tag to use {nameof(ThreadStaticStorage)}"); - if (tagLength <= MaxTagCacheSize) - { - tagKeysAndValues = this.primaryTagStorage[tagLength - 1].TagKeysAndValues; - } - else - { - tagKeysAndValues = new KeyValuePair[tagLength]; - } + tagKeysAndValues = tagLength <= MaxTagCacheSize + ? this.primaryTagStorage[tagLength - 1].TagKeysAndValues + : (new KeyValuePair[tagLength]); tags.CopyTo(tagKeysAndValues); } @@ -67,18 +62,11 @@ internal void SplitToKeysAndValues( { // We do not know ahead the actual length, so start with max possible length. var maxLength = Math.Min(tagKeysInteresting.Count, tagLength); - if (maxLength == 0) - { - tagKeysAndValues = null; - } - else if (maxLength <= MaxTagCacheSize) - { - tagKeysAndValues = this.primaryTagStorage[maxLength - 1].TagKeysAndValues; - } - else - { - tagKeysAndValues = new KeyValuePair[maxLength]; - } + tagKeysAndValues = maxLength == 0 + ? null + : maxLength <= MaxTagCacheSize + ? this.primaryTagStorage[maxLength - 1].TagKeysAndValues + : (new KeyValuePair[maxLength]); actualLength = 0; for (var n = 0; n < tagLength; n++) @@ -86,8 +74,6 @@ internal void SplitToKeysAndValues( // Copy only interesting tags, and keep count. if (tagKeysInteresting.Contains(tags[n].Key)) { - Debug.Assert(tagKeysAndValues != null, "tagKeysAndValues was null"); - tagKeysAndValues![actualLength] = tags[n]; actualLength++; } @@ -138,14 +124,9 @@ internal void CloneKeysAndValues( { Guard.ThrowIfZero(tagLength, $"There must be at least one tag to use {nameof(ThreadStaticStorage)}", $"{nameof(tagLength)}"); - if (tagLength <= MaxTagCacheSize) - { - clonedTagKeysAndValues = this.secondaryTagStorage[tagLength - 1].TagKeysAndValues; - } - else - { - clonedTagKeysAndValues = new KeyValuePair[tagLength]; - } + clonedTagKeysAndValues = tagLength <= MaxTagCacheSize + ? this.secondaryTagStorage[tagLength - 1].TagKeysAndValues + : (new KeyValuePair[tagLength]); Array.Copy(inputTagKeysAndValues, 0, clonedTagKeysAndValues, 0, tagLength); } diff --git a/src/OpenTelemetry/Metrics/View/Base2ExponentialBucketHistogramConfiguration.cs b/src/OpenTelemetry/Metrics/View/Base2ExponentialBucketHistogramConfiguration.cs index d029e64fe4a..5dfafae0011 100644 --- a/src/OpenTelemetry/Metrics/View/Base2ExponentialBucketHistogramConfiguration.cs +++ b/src/OpenTelemetry/Metrics/View/Base2ExponentialBucketHistogramConfiguration.cs @@ -8,8 +8,14 @@ namespace OpenTelemetry.Metrics; /// public sealed class Base2ExponentialBucketHistogramConfiguration : HistogramConfiguration { - private int maxSize = Metric.DefaultExponentialHistogramMaxBuckets; - private int maxScale = Metric.DefaultExponentialHistogramMaxScale; + /// + /// Initializes a new instance of the class. + /// + public Base2ExponentialBucketHistogramConfiguration() + { + this.MaxSize = Metric.DefaultExponentialHistogramMaxBuckets; + this.MaxScale = Metric.DefaultExponentialHistogramMaxScale; + } /// /// Gets or sets the maximum number of buckets in each of the positive and negative ranges, not counting the special zero bucket. @@ -19,10 +25,7 @@ public sealed class Base2ExponentialBucketHistogramConfiguration : HistogramConf /// public int MaxSize { - get - { - return this.maxSize; - } + get; set { @@ -31,7 +34,7 @@ public int MaxSize throw new ArgumentException($"Histogram max size is invalid. Minimum size is 2.", nameof(value)); } - this.maxSize = value; + field = value; } } @@ -44,19 +47,16 @@ public int MaxSize /// public int MaxScale { - get - { - return this.maxScale; - } + get; set { - if (value < -11 || value > 20) + if (value is < -11 or > 20) { throw new ArgumentException($"Histogram max scale is invalid. Max scale must be in the range [-11, 20].", nameof(value)); } - this.maxScale = value; + field = value; } } } diff --git a/src/OpenTelemetry/Metrics/View/ExplicitBucketHistogramConfiguration.cs b/src/OpenTelemetry/Metrics/View/ExplicitBucketHistogramConfiguration.cs index f79d662994a..ba4fb73f4cb 100644 --- a/src/OpenTelemetry/Metrics/View/ExplicitBucketHistogramConfiguration.cs +++ b/src/OpenTelemetry/Metrics/View/ExplicitBucketHistogramConfiguration.cs @@ -51,7 +51,7 @@ public double[]? Boundaries private static bool IsSortedAndDistinct(double[] values) { - for (int i = 1; i < values.Length; i++) + for (var i = 1; i < values.Length; i++) { if (values[i] <= values[i - 1]) { diff --git a/src/OpenTelemetry/OpenTelemetrySdk.cs b/src/OpenTelemetry/OpenTelemetrySdk.cs index 7020d05ce1c..b39fca3e26a 100644 --- a/src/OpenTelemetry/OpenTelemetrySdk.cs +++ b/src/OpenTelemetry/OpenTelemetrySdk.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; using OpenTelemetry.Logs; @@ -21,13 +20,11 @@ public sealed class OpenTelemetrySdk : IDisposable private OpenTelemetrySdk( Action configure) { - Debug.Assert(configure != null, "configure was null"); - var services = new ServiceCollection(); var builder = new OpenTelemetrySdkBuilder(services); - configure!(builder); + configure(builder); this.serviceProvider = services.BuildServiceProvider(); @@ -87,14 +84,14 @@ public static OpenTelemetrySdk Create( { Guard.ThrowIfNull(configure); +#pragma warning disable CA1062 // Guarded by Guard.ThrowIfNull above. return new(configure); +#pragma warning restore CA1062 } /// public void Dispose() - { - this.serviceProvider.Dispose(); - } + => this.serviceProvider.Dispose(); internal sealed class NoopLoggerProvider : LoggerProvider { @@ -112,11 +109,8 @@ private sealed class OpenTelemetrySdkBuilder : IOpenTelemetryBuilder { public OpenTelemetrySdkBuilder(IServiceCollection services) { - Debug.Assert(services != null, "services was null"); - - services!.AddOpenTelemetrySharedProviderBuilderServices(); - - this.Services = services!; + services.AddOpenTelemetrySharedProviderBuilderServices(); + this.Services = services; } public IServiceCollection Services { get; } diff --git a/src/OpenTelemetry/ReadOnlyFilteredTagCollection.cs b/src/OpenTelemetry/ReadOnlyFilteredTagCollection.cs index 4eb4320d56f..c0c7176b3d7 100644 --- a/src/OpenTelemetry/ReadOnlyFilteredTagCollection.cs +++ b/src/OpenTelemetry/ReadOnlyFilteredTagCollection.cs @@ -4,7 +4,6 @@ #if NET using System.Collections.Frozen; #endif -using System.Diagnostics; namespace OpenTelemetry; @@ -34,9 +33,6 @@ internal ReadOnlyFilteredTagCollection( KeyValuePair[] tags, int count) { - Debug.Assert(tags != null, "tags was null"); - Debug.Assert(count <= tags!.Length, "count was invalid"); - this.excludedKeys = excludedKeys; this.tags = tags; this.MaximumCount = count; @@ -104,7 +100,7 @@ public bool MoveNext() { while (true) { - int index = ++this.index; + var index = ++this.index; if (index < this.source.MaximumCount) { if (this.source.excludedKeys?.Contains(this.source.tags[index].Key) ?? false) diff --git a/src/OpenTelemetry/Resources/OtelEnvResourceDetector.cs b/src/OpenTelemetry/Resources/OtelEnvResourceDetector.cs index 15440aa4831..65749f62a80 100644 --- a/src/OpenTelemetry/Resources/OtelEnvResourceDetector.cs +++ b/src/OpenTelemetry/Resources/OtelEnvResourceDetector.cs @@ -23,7 +23,7 @@ public Resource Detect() { var resource = Resource.Empty; - if (this.configuration.TryGetStringValue(EnvVarKey, out string? envResourceAttributeValue)) + if (this.configuration.TryGetStringValue(EnvVarKey, out var envResourceAttributeValue)) { var attributes = ParseResourceAttributes(envResourceAttributeValue); resource = new Resource(attributes); @@ -36,10 +36,10 @@ private static List> ParseResourceAttributes(string { var attributes = new List>(); - string[] rawAttributes = resourceAttributes.Split(AttributeListSplitter); - foreach (string rawKeyValuePair in rawAttributes) + var rawAttributes = resourceAttributes.Split(AttributeListSplitter); + foreach (var rawKeyValuePair in rawAttributes) { - string[] keyValuePair = rawKeyValuePair.Split(AttributeKeyValueSplitter, 2); + var keyValuePair = rawKeyValuePair.Split(AttributeKeyValueSplitter, 2); if (keyValuePair.Length != 2) { continue; diff --git a/src/OpenTelemetry/Resources/OtelServiceNameEnvVarDetector.cs b/src/OpenTelemetry/Resources/OtelServiceNameEnvVarDetector.cs index 4bee4eadbbb..7ef29e48c1e 100644 --- a/src/OpenTelemetry/Resources/OtelServiceNameEnvVarDetector.cs +++ b/src/OpenTelemetry/Resources/OtelServiceNameEnvVarDetector.cs @@ -20,7 +20,7 @@ public Resource Detect() { var resource = Resource.Empty; - if (this.configuration.TryGetStringValue(EnvVarKey, out string? envResourceAttributeValue)) + if (this.configuration.TryGetStringValue(EnvVarKey, out var envResourceAttributeValue)) { resource = new Resource(new Dictionary { diff --git a/src/OpenTelemetry/Resources/Resource.cs b/src/OpenTelemetry/Resources/Resource.cs index afb21552675..514eef0df14 100644 --- a/src/OpenTelemetry/Resources/Resource.cs +++ b/src/OpenTelemetry/Resources/Resource.cs @@ -29,7 +29,7 @@ public Resource(IEnumerable> attributes) } // resource creation is expected to be done a few times during app startup i.e. not on the hot path, we can copy attributes. - this.Attributes = attributes.Select(SanitizeAttribute).ToList(); + this.Attributes = [.. attributes.Select(SanitizeAttribute)]; } /// diff --git a/src/OpenTelemetry/Resources/ResourceBuilder.cs b/src/OpenTelemetry/Resources/ResourceBuilder.cs index 0ab88d4d3f9..74bdd4fbb72 100644 --- a/src/OpenTelemetry/Resources/ResourceBuilder.cs +++ b/src/OpenTelemetry/Resources/ResourceBuilder.cs @@ -61,9 +61,9 @@ public ResourceBuilder Clear() /// . public Resource Build() { - Resource finalResource = Resource.Empty; + var finalResource = Resource.Empty; - foreach (IResourceDetector resourceDetector in this.ResourceDetectors) + foreach (var resourceDetector in this.ResourceDetectors) { if (resourceDetector is ResolvingResourceDetector resolvingResourceDetector) { diff --git a/src/OpenTelemetry/Resources/ResourceBuilderExtensions.cs b/src/OpenTelemetry/Resources/ResourceBuilderExtensions.cs index 07b0040490a..a7507be031e 100644 --- a/src/OpenTelemetry/Resources/ResourceBuilderExtensions.cs +++ b/src/OpenTelemetry/Resources/ResourceBuilderExtensions.cs @@ -45,18 +45,27 @@ public static ResourceBuilder AddService( Guard.ThrowIfNull(resourceBuilder); Guard.ThrowIfNullOrEmpty(serviceName); - Dictionary resourceAttributes = new Dictionary(); - - resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceName, serviceName); + var resourceAttributes = new Dictionary + { + { ResourceSemanticConventions.AttributeServiceName, serviceName }, + }; if (!string.IsNullOrEmpty(serviceNamespace)) { +#if NET || NETSTANDARD2_1_OR_GREATER + resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceNamespace, serviceNamespace); +#else resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceNamespace, serviceNamespace!); +#endif } if (!string.IsNullOrEmpty(serviceVersion)) { +#if NET || NETSTANDARD2_1_OR_GREATER + resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceVersion, serviceVersion); +#else resourceAttributes.Add(ResourceSemanticConventions.AttributeServiceVersion, serviceVersion!); +#endif } if (serviceInstanceId == null && autoGenerateServiceInstanceId) @@ -115,7 +124,7 @@ public static ResourceBuilder AddAttributes(this ResourceBuilder resourceBuilder public static ResourceBuilder AddEnvironmentVariableDetector(this ResourceBuilder resourceBuilder) { Guard.ThrowIfNull(resourceBuilder); - Lazy configuration = new Lazy(() => new ConfigurationBuilder().AddEnvironmentVariables().Build()); + var configuration = new Lazy(() => new ConfigurationBuilder().AddEnvironmentVariables().Build()); #pragma warning disable CA1062 // Validate arguments of public methods - needed for netstandard2.1 return resourceBuilder diff --git a/src/OpenTelemetry/Sdk.cs b/src/OpenTelemetry/Sdk.cs index 0711a414828..3d97bed5f99 100644 --- a/src/OpenTelemetry/Sdk.cs +++ b/src/OpenTelemetry/Sdk.cs @@ -20,11 +20,11 @@ public static class Sdk { static Sdk() { - Propagators.DefaultTextMapPropagator = new CompositeTextMapPropagator(new TextMapPropagator[] - { + Propagators.DefaultTextMapPropagator = new CompositeTextMapPropagator( + [ new TraceContextPropagator(), new BaggagePropagator(), - }); + ]); Activity.DefaultIdFormat = ActivityIdFormat.W3C; Activity.ForceDefaultIdFormat = true; @@ -61,9 +61,7 @@ public static void SetDefaultTextMapPropagator(TextMapPropagator textMapPropagat /// /// instance, which is used to build a . public static MeterProviderBuilder CreateMeterProviderBuilder() - { - return new MeterProviderBuilderBase(); - } + => new MeterProviderBuilderBase(); /// /// Creates a which is used to build @@ -74,9 +72,7 @@ public static MeterProviderBuilder CreateMeterProviderBuilder() /// /// instance, which is used to build a . public static TracerProviderBuilder CreateTracerProviderBuilder() - { - return new TracerProviderBuilderBase(); - } + => new TracerProviderBuilderBase(); #if EXPOSE_EXPERIMENTAL_FEATURES /// @@ -104,7 +100,5 @@ public static TracerProviderBuilder CreateTracerProviderBuilder() internal #endif static LoggerProviderBuilder CreateLoggerProviderBuilder() - { - return new LoggerProviderBuilderBase(); - } + => new LoggerProviderBuilderBase(); } diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index c49327f26a8..600cbdaa0e8 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -153,7 +153,7 @@ protected TracerProvider Build() this.innerBuilder.Services = null; #if DEBUG - bool validateScopes = true; + var validateScopes = true; #else bool validateScopes = false; #endif @@ -171,7 +171,7 @@ protected TracerProvider Build() private static bool IsOtelSdkDisabled(IConfiguration configuration) { - bool isDisabled = configuration.TryGetBoolValue(OpenTelemetrySdkEventSource.Log, SdkConfigDefinitions.SdkDisableEnvVarName, out bool result) && result; + var isDisabled = configuration.TryGetBoolValue(OpenTelemetrySdkEventSource.Log, SdkConfigDefinitions.SdkDisableEnvVarName, out var result) && result; if (isDisabled) { OpenTelemetrySdkEventSource.Log.TracerProviderSdkEvent($"Disabled because {SdkConfigDefinitions.SdkDisableEnvVarName} is true."); diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs index 7b0af22d720..e92393bffc3 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs @@ -23,17 +23,17 @@ public TracerProviderBuilderSdk(IServiceProvider serviceProvider) this.serviceProvider = serviceProvider; } - public List Instrumentation { get; } = new(); + public List Instrumentation { get; } = []; public ResourceBuilder? ResourceBuilder { get; private set; } public TracerProvider? Provider => this.tracerProvider; - public List> Processors { get; } = new(); + public List> Processors { get; } = []; - public List Sources { get; } = new(); + public List Sources { get; } = []; - public HashSet LegacyActivityOperationNames { get; } = new(StringComparer.OrdinalIgnoreCase); + public HashSet LegacyActivityOperationNames { get; } = [with(StringComparer.OrdinalIgnoreCase)]; public Sampler? Sampler { get; private set; } @@ -52,14 +52,10 @@ public void RegisterProvider(TracerProviderSdk tracerProvider) } public override TracerProviderBuilder AddInstrumentation(Func instrumentationFactory) - { - Debug.Assert(instrumentationFactory != null, "instrumentationFactory was null"); - - return this.AddInstrumentation( + => this.AddInstrumentation( typeof(TInstrumentation).Name, typeof(TInstrumentation).Assembly.GetName().Version?.ToString() ?? DefaultInstrumentationVersion, - instrumentationFactory!()); - } + instrumentationFactory()); public TracerProviderBuilder AddInstrumentation( string instrumentationName, @@ -80,21 +76,16 @@ public TracerProviderBuilder AddInstrumentation( public TracerProviderBuilder ConfigureResource(Action configure) { - Debug.Assert(configure != null, "configure was null"); - var resourceBuilder = this.ResourceBuilder ??= ResourceBuilder.CreateDefault(); - configure!(resourceBuilder); + configure(resourceBuilder); return this; } public TracerProviderBuilder SetResourceBuilder(ResourceBuilder resourceBuilder) { - Debug.Assert(resourceBuilder != null, "resourceBuilder was null"); - this.ResourceBuilder = resourceBuilder; - return this; } @@ -109,9 +100,7 @@ public override TracerProviderBuilder AddLegacySource(string operationName) public override TracerProviderBuilder AddSource(params string[] names) { - Debug.Assert(names != null, "names was null"); - - foreach (var name in names!) + foreach (var name in names) { Guard.ThrowIfNullOrWhitespace(name); @@ -125,10 +114,7 @@ public override TracerProviderBuilder AddSource(params string[] names) public TracerProviderBuilder AddProcessor(BaseProcessor processor) { - Debug.Assert(processor != null, "processor was null"); - - this.Processors.Add(processor!); - + this.Processors.Add(processor); return this; } @@ -150,17 +136,13 @@ public TracerProviderBuilder SetErrorStatusOnException(bool enabled) public TracerProviderBuilder ConfigureBuilder(Action configure) { - Debug.Assert(configure != null, "configure was null"); - - configure!(this.serviceProvider, this); + configure(this.serviceProvider, this); return this; } public TracerProviderBuilder ConfigureServices(Action configure) - { - throw new NotSupportedException("Services cannot be configured after ServiceProvider has been created."); - } + => throw new NotSupportedException("Services cannot be configured after ServiceProvider has been created."); public void AddExceptionProcessorIfEnabled(ref IEnumerable> processors) { @@ -168,7 +150,9 @@ public void AddExceptionProcessorIfEnabled(ref IEnumerable[] { new ExceptionProcessor() }.Concat(processors); +#pragma warning disable CA2000 // Dispose objects before losing scope + processors = [new ExceptionProcessor(), .. processors]; +#pragma warning restore CA2000 // Dispose objects before losing scope } catch (Exception ex) { diff --git a/src/OpenTelemetry/Trace/Processor/BatchExportActivityProcessorOptions.cs b/src/OpenTelemetry/Trace/Processor/BatchExportActivityProcessorOptions.cs index 82cfe44060b..0375cc1fe51 100644 --- a/src/OpenTelemetry/Trace/Processor/BatchExportActivityProcessorOptions.cs +++ b/src/OpenTelemetry/Trace/Processor/BatchExportActivityProcessorOptions.cs @@ -32,7 +32,7 @@ public BatchExportActivityProcessorOptions() internal BatchExportActivityProcessorOptions(IConfiguration configuration) { - if (configuration.TryGetIntValue(OpenTelemetrySdkEventSource.Log, ExporterTimeoutEnvVarKey, out int value)) + if (configuration.TryGetIntValue(OpenTelemetrySdkEventSource.Log, ExporterTimeoutEnvVarKey, out var value)) { this.ExporterTimeoutMilliseconds = value; } diff --git a/src/OpenTelemetry/Trace/Sampler/SamplingResult.cs b/src/OpenTelemetry/Trace/Sampler/SamplingResult.cs index bedebd0abaa..21e5f92bee5 100644 --- a/src/OpenTelemetry/Trace/Sampler/SamplingResult.cs +++ b/src/OpenTelemetry/Trace/Sampler/SamplingResult.cs @@ -61,7 +61,7 @@ public SamplingResult(SamplingDecision decision, IEnumerable>(); + this.Attributes = attributes ?? []; this.TraceStateString = traceStateString; } diff --git a/src/OpenTelemetry/Trace/TracerProviderSdk.cs b/src/OpenTelemetry/Trace/TracerProviderSdk.cs index 3eb6efd2169..caa429e6d53 100644 --- a/src/OpenTelemetry/Trace/TracerProviderSdk.cs +++ b/src/OpenTelemetry/Trace/TracerProviderSdk.cs @@ -23,12 +23,9 @@ internal sealed class TracerProviderSdk : TracerProvider internal int ShutdownCount; internal bool Disposed; - private readonly List instrumentations = []; private readonly ActivityListener listener; - private readonly Sampler sampler; private readonly Action getRequestedDataAction; private readonly bool supportLegacyActivity; - private BaseProcessor? processor; internal TracerProviderSdk( IServiceProvider serviceProvider, @@ -55,15 +52,15 @@ internal TracerProviderSdk( configureProviderBuilder.ConfigureBuilder(serviceProvider!, state); } - StringBuilder processorsAdded = new StringBuilder(); - StringBuilder instrumentationFactoriesAdded = new StringBuilder(); + var processorsAdded = new StringBuilder(); + var instrumentationFactoriesAdded = new StringBuilder(); var resourceBuilder = state.ResourceBuilder ?? ResourceBuilder.CreateDefault(); resourceBuilder.ServiceProvider = serviceProvider; this.Resource = resourceBuilder.Build(); - this.sampler = GetSampler(serviceProvider!.GetRequiredService(), state.Sampler); - OpenTelemetrySdkEventSource.Log.TracerProviderSdkEvent($"Sampler added = \"{this.sampler.GetType()}\"."); + this.Sampler = GetSampler(serviceProvider!.GetRequiredService(), state.Sampler); + OpenTelemetrySdkEventSource.Log.TracerProviderSdkEvent($"Sampler added = \"{this.Sampler.GetType()}\"."); this.supportLegacyActivity = state.LegacyActivityOperationNames.Count > 0; @@ -93,7 +90,7 @@ internal TracerProviderSdk( { if (instrumentation.Instance is not null) { - this.instrumentations.Add(instrumentation.Instance); + this.Instrumentations.Add(instrumentation.Instance); } instrumentationFactoriesAdded.Append(instrumentation.Name); @@ -116,15 +113,9 @@ internal TracerProviderSdk( if (this.supportLegacyActivity) { - Func? legacyActivityPredicate = null; - if (legacyActivityWildcardModeRegex != null) - { - legacyActivityPredicate = activity => legacyActivityWildcardModeRegex.IsMatch(activity.OperationName); - } - else - { - legacyActivityPredicate = activity => state.LegacyActivityOperationNames.Contains(activity.OperationName); - } + Func? legacyActivityPredicate = legacyActivityWildcardModeRegex != null + ? (activity => legacyActivityWildcardModeRegex.IsMatch(activity.OperationName)) + : (activity => state.LegacyActivityOperationNames.Contains(activity.OperationName)); activityListener.ActivityStarted = activity => { @@ -160,7 +151,7 @@ internal TracerProviderSdk( if (SuppressInstrumentationScope.IncrementIfTriggered() == 0) { - this.processor?.OnStart(activity); + this.Processor?.OnStart(activity); } }; @@ -189,7 +180,7 @@ internal TracerProviderSdk( if (SuppressInstrumentationScope.DecrementIfTriggered() == 0) { - this.processor?.OnEnd(activity); + this.Processor?.OnEnd(activity); } }; } @@ -201,7 +192,7 @@ internal TracerProviderSdk( if (activity.IsAllDataRequested && SuppressInstrumentationScope.IncrementIfTriggered() == 0) { - this.processor?.OnStart(activity); + this.Processor?.OnStart(activity); } }; @@ -224,28 +215,28 @@ internal TracerProviderSdk( if (SuppressInstrumentationScope.DecrementIfTriggered() == 0) { - this.processor?.OnEnd(activity); + this.Processor?.OnEnd(activity); } }; } - if (this.sampler is AlwaysOnSampler) + if (this.Sampler is AlwaysOnSampler) { - activityListener.Sample = (ref ActivityCreationOptions options) => + activityListener.Sample = (ref options) => !Sdk.SuppressInstrumentation ? ActivitySamplingResult.AllDataAndRecorded : ActivitySamplingResult.None; this.getRequestedDataAction = this.RunGetRequestedDataAlwaysOnSampler; } - else if (this.sampler is AlwaysOffSampler) + else if (this.Sampler is AlwaysOffSampler) { - activityListener.Sample = (ref ActivityCreationOptions options) => + activityListener.Sample = (ref options) => !Sdk.SuppressInstrumentation ? PropagateOrIgnoreData(ref options) : ActivitySamplingResult.None; this.getRequestedDataAction = this.RunGetRequestedDataAlwaysOffSampler; } else { // This delegate informs ActivitySource about sampling decision when the parent context is an ActivityContext. - activityListener.Sample = (ref ActivityCreationOptions options) => - !Sdk.SuppressInstrumentation ? ComputeActivitySamplingResult(ref options, this.sampler) : ActivitySamplingResult.None; + activityListener.Sample = (ref options) => + !Sdk.SuppressInstrumentation ? ComputeActivitySamplingResult(ref options, this.Sampler) : ActivitySamplingResult.None; this.getRequestedDataAction = this.RunGetRequestedDataOtherSampler; } @@ -294,11 +285,11 @@ internal TracerProviderSdk( internal Resource Resource { get; } - internal List Instrumentations => this.instrumentations; + internal List Instrumentations { get; } = []; - internal BaseProcessor? Processor => this.processor; + internal BaseProcessor? Processor { get; private set; } - internal Sampler Sampler => this.sampler; + internal Sampler Sampler { get; } internal TracerProviderSdk AddProcessor(BaseProcessor processor) { @@ -306,32 +297,27 @@ internal TracerProviderSdk AddProcessor(BaseProcessor processor) processor.SetParentProvider(this); - if (this.processor == null) + if (this.Processor == null) { - this.processor = processor; + this.Processor = processor; } - else if (this.processor is CompositeProcessor compositeProcessor) + else if (this.Processor is CompositeProcessor compositeProcessor) { compositeProcessor.AddProcessor(processor); } else { - var newCompositeProcessor = new CompositeProcessor(new[] - { - this.processor, - }); + var newCompositeProcessor = new CompositeProcessor([this.Processor]); newCompositeProcessor.SetParentProvider(this); newCompositeProcessor.AddProcessor(processor); - this.processor = newCompositeProcessor; + this.Processor = newCompositeProcessor; } return this; } internal bool OnForceFlush(int timeoutMilliseconds) - { - return this.processor?.ForceFlush(timeoutMilliseconds) ?? true; - } + => this.Processor?.ForceFlush(timeoutMilliseconds) ?? true; /// /// Called by Shutdown. This function should block the current @@ -352,14 +338,14 @@ internal bool OnForceFlush(int timeoutMilliseconds) internal bool OnShutdown(int timeoutMilliseconds) { // TO DO Put OnShutdown logic in a task to run within the user provider timeOutMilliseconds - foreach (var item in this.instrumentations) + foreach (var item in this.Instrumentations) { (item as IDisposable)?.Dispose(); } - this.instrumentations.Clear(); + this.Instrumentations.Clear(); - bool? result = this.processor?.Shutdown(timeoutMilliseconds); + var result = this.Processor?.Shutdown(timeoutMilliseconds); this.listener?.Dispose(); return result ?? true; } @@ -370,19 +356,19 @@ protected override void Dispose(bool disposing) { if (disposing) { - foreach (var item in this.instrumentations) + foreach (var item in this.Instrumentations) { (item as IDisposable)?.Dispose(); } - this.instrumentations.Clear(); + this.Instrumentations.Clear(); - (this.sampler as IDisposable)?.Dispose(); + (this.Sampler as IDisposable)?.Dispose(); // Wait for up to 5 seconds grace period - this.processor?.Shutdown(5000); - this.processor?.Dispose(); - this.processor = null; + this.Processor?.Shutdown(5000); + this.Processor?.Dispose(); + this.Processor = null; // Shutdown the listener last so that anything created while instrumentation cleans up will still be processed. // Redis instrumentation, for example, flushes during dispose which creates Activity objects for any profiling @@ -488,7 +474,7 @@ private static ActivitySamplingResult ComputeActivitySamplingResult( { SamplingDecision.RecordAndSample => ActivitySamplingResult.AllDataAndRecorded, SamplingDecision.RecordOnly => ActivitySamplingResult.AllData, - _ => PropagateOrIgnoreData(ref options), + SamplingDecision.Drop or _ => PropagateOrIgnoreData(ref options), }; if (activitySamplingResult > ActivitySamplingResult.PropagationData) @@ -546,27 +532,18 @@ private void RunGetRequestedDataAlwaysOffSampler(Activity activity) private void RunGetRequestedDataOtherSampler(Activity activity) { - ActivityContext parentContext; - // Check activity.ParentId alone is sufficient to normally determine if a activity is root or not. But if one uses activity.SetParentId to override the TraceId (without intending to set an actual parent), then additional check of parentspanid being empty is required to confirm if an activity is root or not. // This checker can be removed, once Activity exposes an API to customize ID Generation (https://github.com/dotnet/runtime/issues/46704) or issue https://github.com/dotnet/runtime/issues/46706 is addressed. - if (string.IsNullOrEmpty(activity.ParentId) || activity.ParentSpanId.ToHexString() == "0000000000000000") - { - parentContext = default; - } - else if (activity.Parent != null) - { - parentContext = activity.Parent.Context; - } - else - { - parentContext = new ActivityContext( - activity.TraceId, - activity.ParentSpanId, - activity.ActivityTraceFlags, - activity.TraceStateString, - isRemote: true); - } + var parentContext = string.IsNullOrEmpty(activity.ParentId) || activity.ParentSpanId.ToHexString() == "0000000000000000" + ? default + : activity.Parent != null ? + activity.Parent.Context : + new ActivityContext( + activity.TraceId, + activity.ParentSpanId, + activity.ActivityTraceFlags, + activity.TraceStateString, + isRemote: true); var samplingParameters = new SamplingParameters( parentContext, @@ -576,7 +553,7 @@ private void RunGetRequestedDataOtherSampler(Activity activity) activity.TagObjects, activity.Links); - var samplingResult = this.sampler.ShouldSample(samplingParameters); + var samplingResult = this.Sampler.ShouldSample(samplingParameters); switch (samplingResult.Decision) { @@ -592,6 +569,8 @@ private void RunGetRequestedDataOtherSampler(Activity activity) activity.IsAllDataRequested = true; activity.ActivityTraceFlags |= ActivityTraceFlags.Recorded; break; + default: + break; } if (samplingResult.Decision != SamplingDecision.Drop) diff --git a/src/Shared/ActivityHelperExtensions.cs b/src/Shared/ActivityHelperExtensions.cs index 4fd1f517dab..7b50aadb3d6 100644 --- a/src/Shared/ActivityHelperExtensions.cs +++ b/src/Shared/ActivityHelperExtensions.cs @@ -25,13 +25,11 @@ internal static class ActivityHelperExtensions [Obsolete] public static bool TryGetStatus(this Activity activity, out StatusCode statusCode, out string? statusDescription) { - Debug.Assert(activity != null, "Activity should not be null"); - - bool foundStatusCode = false; + var foundStatusCode = false; statusCode = default; statusDescription = null; - foreach (ref readonly var tag in activity!.EnumerateTagObjects()) + foreach (ref readonly var tag in activity.EnumerateTagObjects()) { switch (tag.Key) { @@ -70,9 +68,7 @@ public static bool TryGetStatus(this Activity activity, out StatusCode statusCod [MethodImpl(MethodImplOptions.AggressiveInlining)] public static object? GetTagValue(this Activity activity, string? tagName) { - Debug.Assert(activity != null, "Activity should not be null"); - - foreach (ref readonly var tag in activity!.EnumerateTagObjects()) + foreach (ref readonly var tag in activity.EnumerateTagObjects()) { if (tag.Key == tagName) { @@ -93,9 +89,7 @@ public static bool TryGetStatus(this Activity activity, out StatusCode statusCod [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool TryCheckFirstTag(this Activity activity, string tagName, out object? tagValue) { - Debug.Assert(activity != null, "Activity should not be null"); - - var enumerator = activity!.EnumerateTagObjects(); + var enumerator = activity.EnumerateTagObjects(); if (enumerator.MoveNext()) { diff --git a/src/Shared/AssemblyVersionExtensions.cs b/src/Shared/AssemblyVersionExtensions.cs index 9d4b351a3ab..cc9507d6870 100644 --- a/src/Shared/AssemblyVersionExtensions.cs +++ b/src/Shared/AssemblyVersionExtensions.cs @@ -15,8 +15,6 @@ public static string GetPackageVersion(this Assembly assembly) var informationalVersion = assembly.GetCustomAttribute()?.InformationalVersion; - Debug.Assert(!string.IsNullOrEmpty(informationalVersion), "AssemblyInformationalVersionAttribute was not found in assembly"); - return ParsePackageVersion(informationalVersion!); } @@ -32,7 +30,9 @@ public static bool TryGetPackageVersion(this Assembly assembly, [NotNullWhen(tru return false; } +#pragma warning disable IDE0370 // Suppression is unnecessary packageVersion = ParsePackageVersion(informationalVersion!); +#pragma warning restore IDE0370 // Suppression is unnecessary return true; } diff --git a/src/Shared/Configuration/OpenTelemetryConfigurationExtensions.cs b/src/Shared/Configuration/OpenTelemetryConfigurationExtensions.cs index 589f960d512..2c88dc00d38 100644 --- a/src/Shared/Configuration/OpenTelemetryConfigurationExtensions.cs +++ b/src/Shared/Configuration/OpenTelemetryConfigurationExtensions.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; @@ -20,10 +19,7 @@ public static bool TryGetStringValue( [NotNullWhen(true)] out string? value) { - Debug.Assert(configuration != null, "configuration was null"); - - value = configuration![key]; - + value = configuration[key]; return !string.IsNullOrWhiteSpace(value); } @@ -34,8 +30,6 @@ public static bool TryGetUriValue( [NotNullWhen(true)] out Uri? value) { - Debug.Assert(logger != null, "logger was null"); - if (!configuration.TryGetStringValue(key, out var stringValue)) { value = null; @@ -44,7 +38,7 @@ public static bool TryGetUriValue( if (!Uri.TryCreate(stringValue, UriKind.Absolute, out value)) { - logger!.LogInvalidConfigurationValue(key, stringValue); + logger.LogInvalidConfigurationValue(key, stringValue); return false; } @@ -57,8 +51,6 @@ public static bool TryGetIntValue( string key, out int value) { - Debug.Assert(logger != null, "logger was null"); - if (!configuration.TryGetStringValue(key, out var stringValue)) { value = default; @@ -67,7 +59,7 @@ public static bool TryGetIntValue( if (!int.TryParse(stringValue, NumberStyles.None, CultureInfo.InvariantCulture, out value)) { - logger!.LogInvalidConfigurationValue(key, stringValue); + logger.LogInvalidConfigurationValue(key, stringValue); return false; } @@ -80,8 +72,6 @@ public static bool TryGetBoolValue( string key, out bool value) { - Debug.Assert(logger != null, "logger was null"); - if (!configuration.TryGetStringValue(key, out var stringValue)) { value = default; @@ -90,7 +80,7 @@ public static bool TryGetBoolValue( if (!bool.TryParse(stringValue, out value)) { - logger!.LogInvalidConfigurationValue(key, stringValue); + logger.LogInvalidConfigurationValue(key, stringValue); return false; } @@ -105,8 +95,6 @@ public static bool TryGetValue( [NotNullWhen(true)] out T? value) { - Debug.Assert(logger != null, "logger was null"); - if (!configuration.TryGetStringValue(key, out var stringValue)) { value = default; @@ -115,11 +103,10 @@ public static bool TryGetValue( if (!tryParseFunc(stringValue, out value)) { - logger!.LogInvalidConfigurationValue(key, stringValue); + logger.LogInvalidConfigurationValue(key, stringValue); return false; } return true; } } - diff --git a/src/Shared/Guard.cs b/src/Shared/Guard.cs index dbbe87e0e8f..f327b047d66 100644 --- a/src/Shared/Guard.cs +++ b/src/Shared/Guard.cs @@ -121,9 +121,7 @@ public static void ThrowIfZero(int value, string message = "Must not be zero", [ [DebuggerHidden] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void ThrowIfInvalidTimeout(int value, [CallerArgumentExpression(nameof(value))] string? paramName = null) - { - ThrowIfOutOfRange(value, paramName, min: Timeout.Infinite, message: $"Must be non-negative or '{nameof(Timeout)}.{nameof(Timeout.Infinite)}'"); - } + => ThrowIfOutOfRange(value, paramName, min: Timeout.Infinite, message: $"Must be non-negative or '{nameof(Timeout)}.{nameof(Timeout.Infinite)}'"); /// /// Throw an exception if the value is not within the given range. @@ -138,9 +136,7 @@ public static void ThrowIfInvalidTimeout(int value, [CallerArgumentExpression(na [DebuggerHidden] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void ThrowIfOutOfRange(int value, [CallerArgumentExpression(nameof(value))] string? paramName = null, int min = int.MinValue, int max = int.MaxValue, string? minName = null, string? maxName = null, string? message = null) - { - Range(value, paramName, min, max, minName, maxName, message); - } + => Range(value, paramName, min, max, minName, maxName, message); /// /// Throw an exception if the value is not within the given range. @@ -155,9 +151,7 @@ public static void ThrowIfOutOfRange(int value, [CallerArgumentExpression(nameof [DebuggerHidden] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void ThrowIfOutOfRange(double value, [CallerArgumentExpression(nameof(value))] string? paramName = null, double min = double.MinValue, double max = double.MaxValue, string? minName = null, string? maxName = null, string? message = null) - { - Range(value, paramName, min, max, minName, maxName, message); - } + => Range(value, paramName, min, max, minName, maxName, message); /// /// Throw an exception if the value is not of the expected type. @@ -169,14 +163,9 @@ public static void ThrowIfOutOfRange(double value, [CallerArgumentExpression(nam [DebuggerHidden] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T ThrowIfNotOfType([NotNull] object? value, [CallerArgumentExpression(nameof(value))] string? paramName = null) - { - if (value is not T result) - { - throw new InvalidCastException($"Cannot cast '{paramName}' from '{value?.GetType().ToString() ?? "null"}' to '{typeof(T)}'"); - } - - return result; - } + => value is not T result + ? throw new InvalidCastException($"Cannot cast '{paramName}' from '{value?.GetType().ToString() ?? "null"}' to '{typeof(T)}'") + : result; [DebuggerHidden] [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/Shared/Metrics/Base2ExponentialBucketHistogramHelper.cs b/src/Shared/Metrics/Base2ExponentialBucketHistogramHelper.cs index f9a1ece4c6f..57088ddeb7f 100644 --- a/src/Shared/Metrics/Base2ExponentialBucketHistogramHelper.cs +++ b/src/Shared/Metrics/Base2ExponentialBucketHistogramHelper.cs @@ -75,7 +75,7 @@ private static double ScaleB(double x, int n) // the correct biased exponent. If n is greater than the maximum exponent (1023) or less than // the minimum exponent (-1022), adjust x and n to compute correct result. - double y = x; + var y = x; if (n > 1023) { y *= SCALEB_C1; @@ -105,7 +105,7 @@ private static double ScaleB(double x, int n) } } - double u = BitConverter.Int64BitsToDouble((long)(0x3ff + n) << 52); + var u = BitConverter.Int64BitsToDouble((long)(0x3ff + n) << 52); return y * u; } #pragma warning restore SA1119 // Statement should not use unnecessary parenthesis diff --git a/src/Shared/Options/DelegatingOptionsFactoryServiceCollectionExtensions.cs b/src/Shared/Options/DelegatingOptionsFactoryServiceCollectionExtensions.cs index 81e9ac0a664..053a5488e96 100644 --- a/src/Shared/Options/DelegatingOptionsFactoryServiceCollectionExtensions.cs +++ b/src/Shared/Options/DelegatingOptionsFactoryServiceCollectionExtensions.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; #if NET using System.Diagnostics.CodeAnalysis; #endif @@ -22,20 +21,17 @@ public static IServiceCollection RegisterOptionsFactory( Func optionsFactoryFunc) where T : class { - Debug.Assert(services != null, "services was null"); - Debug.Assert(optionsFactoryFunc != null, "optionsFactoryFunc was null"); - - services!.TryAddSingleton>(sp => + services.TryAddSingleton>(sp => { return new DelegatingOptionsFactory( - (c, n) => optionsFactoryFunc!(c), + (c, n) => optionsFactoryFunc(c), sp.GetRequiredService(), sp.GetServices>(), sp.GetServices>(), sp.GetServices>()); }); - return services!; + return services; } #if NET @@ -47,20 +43,17 @@ public static IServiceCollection RegisterOptionsFactory( Func optionsFactoryFunc) where T : class { - Debug.Assert(services != null, "services was null"); - Debug.Assert(optionsFactoryFunc != null, "optionsFactoryFunc was null"); - - services!.TryAddSingleton>(sp => + services.TryAddSingleton>(sp => { return new DelegatingOptionsFactory( - (c, n) => optionsFactoryFunc!(sp, c, n), + (c, n) => optionsFactoryFunc(sp, c, n), sp.GetRequiredService(), sp.GetServices>(), sp.GetServices>(), sp.GetServices>()); }); - return services!; + return services; } #if NET @@ -71,11 +64,9 @@ public static IServiceCollection DisableOptionsReloading( this IServiceCollection services) where T : class { - Debug.Assert(services != null, "services was null"); - - services!.TryAddSingleton, SingletonOptionsManager>(); - services!.TryAddScoped, SingletonOptionsManager>(); + services.TryAddSingleton, SingletonOptionsManager>(); + services.TryAddScoped, SingletonOptionsManager>(); - return services!; + return services; } } diff --git a/src/Shared/StatusHelper.cs b/src/Shared/StatusHelper.cs index 00e5a587f9e..b654f640dd8 100644 --- a/src/Shared/StatusHelper.cs +++ b/src/Shared/StatusHelper.cs @@ -49,7 +49,7 @@ not null when OkStatusCodeTagValue.Equals(statusCodeTagValue, StringComparison.O [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool TryGetStatusCodeForTagValue(string? statusCodeTagValue, out StatusCode statusCode) { - StatusCode? tempStatusCode = GetStatusCodeForTagValue(statusCodeTagValue); + var tempStatusCode = GetStatusCodeForTagValue(statusCodeTagValue); statusCode = tempStatusCode ?? default; diff --git a/src/Shared/TagWriter/TagWriter.cs b/src/Shared/TagWriter/TagWriter.cs index 3794a9d76eb..b95d1b8da49 100644 --- a/src/Shared/TagWriter/TagWriter.cs +++ b/src/Shared/TagWriter/TagWriter.cs @@ -24,9 +24,7 @@ public bool TryWriteTag( ref TTagState state, KeyValuePair tag, int? tagValueMaxLength = null) - { - return this.TryWriteTag(ref state, tag.Key, tag.Value, tagValueMaxLength); - } + => this.TryWriteTag(ref state, tag.Key, tag.Value, tagValueMaxLength); public bool TryWriteTag( ref TTagState state, @@ -76,7 +74,7 @@ public bool TryWriteTag( { this.WriteArrayTagInternal(ref state, key, array, tagValueMaxLength); } - catch (Exception ex) when (ex is IndexOutOfRangeException || ex is ArgumentException) + catch (Exception ex) when (ex is IndexOutOfRangeException or ArgumentException) { throw; } @@ -141,11 +139,9 @@ protected abstract void OnUnsupportedTagDropped( string tagValueTypeFullName); private static ReadOnlySpan TruncateString(ReadOnlySpan value, int? maxLength) - { - return maxLength.HasValue && value.Length > maxLength - ? value.Slice(0, maxLength.Value) - : value; - } + => maxLength.HasValue && value.Length > maxLength + ? value.Slice(0, maxLength.Value) + : value; private void WriteCharTag(ref TTagState state, string key, char value) { @@ -187,7 +183,7 @@ private void WriteArrayTagInternal(ref TTagState state, string key, Array array, this.arrayWriter.EndWriteArray(ref arrayState); } - catch (Exception ex) when (ex is IndexOutOfRangeException || ex is ArgumentException) + catch (Exception ex) when (ex is IndexOutOfRangeException or ArgumentException) { // If the array writer cannot be resized, TryResize should log a message to the event source, return false. if (this.arrayWriter.TryResize()) @@ -366,7 +362,7 @@ private void WriteToArrayCovariant(ref TArrayState arrayState, TItem[] ar private void WriteStructToArray(ref TArrayState arrayState, TItem[] array) where TItem : struct { - foreach (TItem item in array) + foreach (var item in array) { if (typeof(TItem) == typeof(char)) { @@ -440,9 +436,7 @@ private void WriteStringsToArray(ref TArrayState arrayState, string?[] array, in private bool LogUnsupportedTagTypeAndReturnFalse(string key, object value) { - Debug.Assert(value != null, "value was null"); - - this.OnUnsupportedTagDropped(key, value!.GetType().ToString()); + this.OnUnsupportedTagDropped(key, value.GetType().ToString()); return false; } } diff --git a/test/Benchmarks/Context/Propagation/TraceContextPropagatorBenchmarks.cs b/test/Benchmarks/Context/Propagation/TraceContextPropagatorBenchmarks.cs index e73d65c9f3f..aea350fd668 100644 --- a/test/Benchmarks/Context/Propagation/TraceContextPropagatorBenchmarks.cs +++ b/test/Benchmarks/Context/Propagation/TraceContextPropagatorBenchmarks.cs @@ -43,7 +43,7 @@ public void Setup() Span keyBuffer = stackalloc char[length - 2]; - string traceState = string.Empty; + var traceState = string.Empty; for (var i = 0; i < this.MembersCount; i++) { // We want a unique key for each member diff --git a/test/Benchmarks/Exporter/OtlpGrpcExporterBenchmarks.cs b/test/Benchmarks/Exporter/OtlpGrpcExporterBenchmarks.cs index c2c2a478b49..5ebccccd5e1 100644 --- a/test/Benchmarks/Exporter/OtlpGrpcExporterBenchmarks.cs +++ b/test/Benchmarks/Exporter/OtlpGrpcExporterBenchmarks.cs @@ -56,9 +56,9 @@ public void GlobalCleanup() [Benchmark] public void OtlpExporter_Batching() { - for (int i = 0; i < this.NumberOfBatches; i++) + for (var i = 0; i < this.NumberOfBatches; i++) { - for (int c = 0; c < this.NumberOfSpans; c++) + for (var c = 0; c < this.NumberOfSpans; c++) { this.activityBatch!.Add(this.activity!); } diff --git a/test/Benchmarks/Exporter/OtlpHttpExporterBenchmarks.cs b/test/Benchmarks/Exporter/OtlpHttpExporterBenchmarks.cs index 04c9fa6a7dc..5409c861865 100644 --- a/test/Benchmarks/Exporter/OtlpHttpExporterBenchmarks.cs +++ b/test/Benchmarks/Exporter/OtlpHttpExporterBenchmarks.cs @@ -40,7 +40,7 @@ public void GlobalSetup() this.server = TestHttpServer.RunServer( (ctx) => { - using (Stream receiveStream = ctx.Request.InputStream) + using (var receiveStream = ctx.Request.InputStream) { while (true) { @@ -85,9 +85,9 @@ public void GlobalCleanup() [Benchmark] public void OtlpExporter_Batching() { - for (int i = 0; i < this.NumberOfBatches; i++) + for (var i = 0; i < this.NumberOfBatches; i++) { - for (int c = 0; c < this.NumberOfSpans; c++) + for (var c = 0; c < this.NumberOfSpans; c++) { this.activityBatch!.Add(this.activity!); } diff --git a/test/Benchmarks/Exporter/PrometheusSerializerBenchmarks.cs b/test/Benchmarks/Exporter/PrometheusSerializerBenchmarks.cs index 30b029625ab..f6e6295020a 100644 --- a/test/Benchmarks/Exporter/PrometheusSerializerBenchmarks.cs +++ b/test/Benchmarks/Exporter/PrometheusSerializerBenchmarks.cs @@ -54,9 +54,9 @@ public void GlobalCleanup() [Benchmark] public void WriteMetric() { - for (int i = 0; i < this.NumberOfSerializeCalls; i++) + for (var i = 0; i < this.NumberOfSerializeCalls; i++) { - int cursor = 0; + var cursor = 0; foreach (var metric in this.metrics) { cursor = PrometheusSerializer.WriteMetric(this.buffer, cursor, metric, this.GetPrometheusMetric(metric), openMetricsRequested: false, disableTimestamp: false); diff --git a/test/Benchmarks/Exporter/ZipkinExporterBenchmarks.cs b/test/Benchmarks/Exporter/ZipkinExporterBenchmarks.cs index 109382ac2d1..dad866cad7c 100644 --- a/test/Benchmarks/Exporter/ZipkinExporterBenchmarks.cs +++ b/test/Benchmarks/Exporter/ZipkinExporterBenchmarks.cs @@ -39,7 +39,7 @@ public void GlobalSetup() this.server = TestHttpServer.RunServer( (ctx) => { - using (Stream receiveStream = ctx.Request.InputStream) + using (var receiveStream = ctx.Request.InputStream) { while (true) { @@ -74,9 +74,9 @@ public void ZipkinExporter_Batching() Endpoint = new Uri($"http://{this.serverHost}:{this.serverPort}"), }); - for (int i = 0; i < this.NumberOfBatches; i++) + for (var i = 0; i < this.NumberOfBatches; i++) { - for (int c = 0; c < this.NumberOfSpans; c++) + for (var c = 0; c < this.NumberOfSpans; c++) { this.activityBatch!.Add(this.activity!); } diff --git a/test/Benchmarks/Helper/ActivityHelper.cs b/test/Benchmarks/Helper/ActivityHelper.cs index 1c5e5e2ea7e..bf21a9c2aaa 100644 --- a/test/Benchmarks/Helper/ActivityHelper.cs +++ b/test/Benchmarks/Helper/ActivityHelper.cs @@ -14,7 +14,7 @@ public static Activity CreateTestActivity() var eventTimestamp = DateTime.UtcNow; var traceId = ActivityTraceId.CreateFromString("e8ea7e9ac72de94e91fabc613f9686b2".AsSpan()); - var parentSpanId = ActivitySpanId.CreateFromBytes(new byte[] { 12, 23, 34, 45, 56, 67, 78, 89 }); + var parentSpanId = ActivitySpanId.CreateFromBytes([12, 23, 34, 45, 56, 67, 78, 89]); var attributes = new Dictionary { @@ -28,20 +28,20 @@ public static Activity CreateTestActivity() var events = new List { - new ActivityEvent( + new( "Event1", eventTimestamp, - new ActivityTagsCollection(new Dictionary + [with(new Dictionary { { "key", "value" }, - })), - new ActivityEvent( + })]), + new( "Event2", eventTimestamp, - new ActivityTagsCollection(new Dictionary + [with(new Dictionary { { "key", "value" }, - })), + })]), }; var linkedSpanId = ActivitySpanId.CreateFromString("888915b6286b9c41".AsSpan()); @@ -60,7 +60,7 @@ public static Activity CreateTestActivity() using var listener = new ActivityListener() { ShouldListenTo = a => a.Name == nameof(CreateTestActivity), - Sample = (ref ActivityCreationOptions a) => ActivitySamplingResult.AllDataAndRecorded, + Sample = (ref a) => ActivitySamplingResult.AllDataAndRecorded, }; ActivitySource.AddActivityListener(listener); diff --git a/test/Benchmarks/Logs/LogScopeBenchmarks.cs b/test/Benchmarks/Logs/LogScopeBenchmarks.cs index ffea0671d9e..22654ba9a2d 100644 --- a/test/Benchmarks/Logs/LogScopeBenchmarks.cs +++ b/test/Benchmarks/Logs/LogScopeBenchmarks.cs @@ -25,7 +25,7 @@ public class LogScopeBenchmarks { private readonly LoggerExternalScopeProvider scopeProvider = new(); - private readonly Action callback = (LogRecordScope scope, object state) => + private readonly Action callback = (scope, state) => { foreach (var scopeItem in scope) { diff --git a/test/Benchmarks/Metrics/HistogramBenchmarks.cs b/test/Benchmarks/Metrics/HistogramBenchmarks.cs index d5f92fdae64..38c8c77d2c3 100644 --- a/test/Benchmarks/Metrics/HistogramBenchmarks.cs +++ b/test/Benchmarks/Metrics/HistogramBenchmarks.cs @@ -66,7 +66,7 @@ public void Setup() // Evenly distribute the bound values over the range [0, MaxValue) this.bounds = new double[this.BoundCount]; - for (int i = 0; i < this.bounds.Length; i++) + for (var i = 0; i < this.bounds.Length; i++) { this.bounds[i] = i * MaxValue / this.bounds.Length; } diff --git a/test/Benchmarks/Trace/TraceBenchmarks.cs b/test/Benchmarks/Trace/TraceBenchmarks.cs index d9e10bda977..2600bd2a165 100644 --- a/test/Benchmarks/Trace/TraceBenchmarks.cs +++ b/test/Benchmarks/Trace/TraceBenchmarks.cs @@ -77,7 +77,7 @@ public void Setup() ActivityStarted = null, ActivityStopped = null, ShouldListenTo = (activitySource) => activitySource.Name == this.sourceWithPropagationDataListner.Name, - Sample = (ref ActivityCreationOptions options) => ActivitySamplingResult.PropagationData, + Sample = (ref options) => ActivitySamplingResult.PropagationData, }; ActivitySource.AddActivityListener(this.activityListenerPropagationData); @@ -87,7 +87,7 @@ public void Setup() ActivityStarted = null, ActivityStopped = null, ShouldListenTo = (activitySource) => activitySource.Name == this.sourceWithAllDataListner.Name, - Sample = (ref ActivityCreationOptions options) => ActivitySamplingResult.AllData, + Sample = (ref options) => ActivitySamplingResult.AllData, }; ActivitySource.AddActivityListener(this.activityListenerAllData); @@ -97,7 +97,7 @@ public void Setup() ActivityStarted = null, ActivityStopped = null, ShouldListenTo = (activitySource) => activitySource.Name == this.sourceWithAllDataAndRecordedListner.Name, - Sample = (ref ActivityCreationOptions options) => ActivitySamplingResult.AllDataAndRecorded, + Sample = (ref options) => ActivitySamplingResult.AllDataAndRecorded, }; ActivitySource.AddActivityListener(this.activityListenerAllDataAndRecordedData); diff --git a/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/Logs/TestLoggerProviderBuilder.cs b/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/Logs/TestLoggerProviderBuilder.cs index f79d26bf1ea..37876e2d5b1 100644 --- a/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/Logs/TestLoggerProviderBuilder.cs +++ b/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/Logs/TestLoggerProviderBuilder.cs @@ -17,7 +17,7 @@ public TestLoggerProviderBuilder() public ServiceProvider? ServiceProvider { get; private set; } - public List Instrumentation { get; } = new(); + public List Instrumentation { get; } = []; public LoggerProvider? Provider { get; private set; } diff --git a/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/Metrics/TestMeterProviderBuilder.cs b/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/Metrics/TestMeterProviderBuilder.cs index 922b8f61a20..e300b5161f3 100644 --- a/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/Metrics/TestMeterProviderBuilder.cs +++ b/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/Metrics/TestMeterProviderBuilder.cs @@ -49,7 +49,7 @@ public override MeterProviderBuilder AddMeter(params string[] names) } else { - foreach (string name in names) + foreach (var name in names) { this.Meters.Add(name); } diff --git a/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/ServiceCollectionExtensionsTests.cs b/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/ServiceCollectionExtensionsTests.cs index ccbc88938d8..6f72d56680d 100644 --- a/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/ServiceCollectionExtensionsTests.cs +++ b/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/ServiceCollectionExtensionsTests.cs @@ -22,7 +22,7 @@ public void ConfigureOpenTelemetryTracerProvider(int numberOfCalls) var services = new ServiceCollection(); - for (int i = 0; i < numberOfCalls; i++) + for (var i = 0; i < numberOfCalls; i++) { services.ConfigureOpenTelemetryTracerProvider(builder => beforeServiceProviderInvocations++); services.ConfigureOpenTelemetryTracerProvider((sp, builder) => afterServiceProviderInvocations++); @@ -57,7 +57,7 @@ public void ConfigureOpenTelemetryMeterProvider(int numberOfCalls) var services = new ServiceCollection(); - for (int i = 0; i < numberOfCalls; i++) + for (var i = 0; i < numberOfCalls; i++) { services.ConfigureOpenTelemetryMeterProvider(builder => beforeServiceProviderInvocations++); services.ConfigureOpenTelemetryMeterProvider((sp, builder) => afterServiceProviderInvocations++); @@ -92,7 +92,7 @@ public void ConfigureOpenTelemetryLoggerProvider(int numberOfCalls) var services = new ServiceCollection(); - for (int i = 0; i < numberOfCalls; i++) + for (var i = 0; i < numberOfCalls; i++) { services.ConfigureOpenTelemetryLoggerProvider(builder => beforeServiceProviderInvocations++); services.ConfigureOpenTelemetryLoggerProvider((sp, builder) => afterServiceProviderInvocations++); diff --git a/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/Trace/TestTracerProviderBuilder.cs b/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/Trace/TestTracerProviderBuilder.cs index 89a8bc10ec7..4b1f5028414 100644 --- a/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/Trace/TestTracerProviderBuilder.cs +++ b/test/OpenTelemetry.Api.ProviderBuilderExtensions.Tests/Trace/TestTracerProviderBuilder.cs @@ -65,7 +65,7 @@ public override TracerProviderBuilder AddSource(params string[] names) } else { - foreach (string name in names) + foreach (var name in names) { this.Sources.Add(name); } diff --git a/test/OpenTelemetry.Api.Tests/Context/Propagation/BaggagePropagatorTests.cs b/test/OpenTelemetry.Api.Tests/Context/Propagation/BaggagePropagatorTests.cs index e367f9829e2..b6633bdb53b 100644 --- a/test/OpenTelemetry.Api.Tests/Context/Propagation/BaggagePropagatorTests.cs +++ b/test/OpenTelemetry.Api.Tests/Context/Propagation/BaggagePropagatorTests.cs @@ -336,7 +336,7 @@ public void ValidatePercentEncodedComplexCharactersDecodesCorrectly() public void ValidateInjectionOfSixtyFourEntries() { var baggageDict = new Dictionary(); - for (int i = 0; i < 64; i++) + for (var i = 0; i < 64; i++) { baggageDict[$"key{i}"] = "value"; } @@ -383,7 +383,7 @@ public void ValidateMaxByteManyEntriesInjection() { var baggageDict = new Dictionary(); - for (int i = 0; i < 512; i++) + for (var i = 0; i < 512; i++) { baggageDict[$"{i:D3}"] = "0123456789a"; } diff --git a/test/OpenTelemetry.Api.Tests/Context/Propagation/TestPropagator.cs b/test/OpenTelemetry.Api.Tests/Context/Propagation/TestPropagator.cs index ab652152473..c3f3f502612 100644 --- a/test/OpenTelemetry.Api.Tests/Context/Propagation/TestPropagator.cs +++ b/test/OpenTelemetry.Api.Tests/Context/Propagation/TestPropagator.cs @@ -52,7 +52,7 @@ public override PropagationContext Extract(PropagationContext context, T carr var tracestateCollection = getter(carrier, this.stateHeaderName); if (tracestateCollection?.Any() ?? false) { - TraceContextPropagator.TryExtractTracestate(tracestateCollection.ToArray(), out tracestate); + TraceContextPropagator.TryExtractTracestate([.. tracestateCollection], out tracestate); } return new PropagationContext( diff --git a/test/OpenTelemetry.Api.Tests/Internal/GuardTests.cs b/test/OpenTelemetry.Api.Tests/Internal/GuardTests.cs index ab20d85f169..c222c7184fd 100644 --- a/test/OpenTelemetry.Api.Tests/Internal/GuardTests.cs +++ b/test/OpenTelemetry.Api.Tests/Internal/GuardTests.cs @@ -186,6 +186,8 @@ public void BasicTest() Assert.Equal("new object()", GetValue(new object())); } +#pragma warning disable IDE0060 // Remove unused parameter private static string? GetValue(object? argument, [CallerArgumentExpression(nameof(argument))] string? expr = null) => expr; +#pragma warning restore IDE0060 // Remove unused parameter } #endif diff --git a/test/OpenTelemetry.Api.Tests/Logs/LogRecordAttributeListTests.cs b/test/OpenTelemetry.Api.Tests/Logs/LogRecordAttributeListTests.cs index 4e0aaacb89f..d88017fdebb 100644 --- a/test/OpenTelemetry.Api.Tests/Logs/LogRecordAttributeListTests.cs +++ b/test/OpenTelemetry.Api.Tests/Logs/LogRecordAttributeListTests.cs @@ -17,14 +17,14 @@ public void ReadWriteTest(int numberOfItems) { LogRecordAttributeList attributes = default; - for (int i = 0; i < numberOfItems; i++) + for (var i = 0; i < numberOfItems; i++) { attributes.Add($"key{i}", i); } Assert.Equal(numberOfItems, attributes.Count); - for (int i = 0; i < numberOfItems; i++) + for (var i = 0; i < numberOfItems; i++) { var item = attributes[i]; @@ -33,8 +33,8 @@ public void ReadWriteTest(int numberOfItems) Assert.Equal(i, (int)item.Value); } - int index = 0; - foreach (KeyValuePair item in attributes) + var index = 0; + foreach (var item in attributes) { Assert.Equal($"key{index}", item.Key); Assert.NotNull(item.Value); @@ -62,16 +62,16 @@ public void ClearTest(int numberOfItems) { LogRecordAttributeList attributes = default; - for (int c = 0; c <= 1; c++) + for (var c = 0; c <= 1; c++) { - for (int i = 0; i < numberOfItems; i++) + for (var i = 0; i < numberOfItems; i++) { attributes.Add($"key{i}", i); } Assert.Equal(numberOfItems, attributes.Count); - for (int i = 0; i < numberOfItems; i++) + for (var i = 0; i < numberOfItems; i++) { var item = attributes[i]; @@ -96,7 +96,7 @@ public void ExportTest(int numberOfItems) { LogRecordAttributeList attributes = default; - for (int i = 0; i < numberOfItems; i++) + for (var i = 0; i < numberOfItems; i++) { attributes.Add($"key{i}", i); } @@ -124,8 +124,8 @@ public void ExportTest(int numberOfItems) Assert.Null(storage); } - int index = 0; - foreach (KeyValuePair item in exportedAttributes) + var index = 0; + foreach (var item in exportedAttributes) { Assert.Equal($"key{index}", item.Key); Assert.NotNull(item.Value); @@ -137,7 +137,7 @@ public void ExportTest(int numberOfItems) [Fact] public void InitializerAddSyntaxTest() { - LogRecordAttributeList list = new LogRecordAttributeList + var list = new LogRecordAttributeList { { "key1", new object() }, { "key2", 2 }, @@ -149,7 +149,7 @@ public void InitializerAddSyntaxTest() [Fact] public void InitializerIndexesSyntaxTest() { - LogRecordAttributeList list = new LogRecordAttributeList + var list = new LogRecordAttributeList { ["key1"] = new object(), ["key2"] = 2, diff --git a/test/OpenTelemetry.Api.Tests/Trace/SpanAttributesTests.cs b/test/OpenTelemetry.Api.Tests/Trace/SpanAttributesTests.cs index 30a05938e1d..db82129d571 100644 --- a/test/OpenTelemetry.Api.Tests/Trace/SpanAttributesTests.cs +++ b/test/OpenTelemetry.Api.Tests/Trace/SpanAttributesTests.cs @@ -53,11 +53,10 @@ public void ValidateSameKey() public void ValidateConstructorWithList() { var spanAttributes = new SpanAttributes( - new List> - { + [ new("Span attribute int", 1), new("Span attribute string", "str"), - }); + ]); Assert.Equal(2, spanAttributes.Attributes.Count); } diff --git a/test/OpenTelemetry.Api.Tests/Trace/TelemetrySpanTests.cs b/test/OpenTelemetry.Api.Tests/Trace/TelemetrySpanTests.cs index 53a6a4fd82b..5973fe229e4 100644 --- a/test/OpenTelemetry.Api.Tests/Trace/TelemetrySpanTests.cs +++ b/test/OpenTelemetry.Api.Tests/Trace/TelemetrySpanTests.cs @@ -11,28 +11,28 @@ public class TelemetrySpanTests [Fact] public void CheckRecordExceptionData() { - string message = "message"; + var message = "message"; - using Activity activity = new Activity("exception-test"); - using TelemetrySpan telemetrySpan = new TelemetrySpan(activity); + using var activity = new Activity("exception-test"); + using var telemetrySpan = new TelemetrySpan(activity); telemetrySpan.RecordException(new ArgumentNullException(message, new InvalidOperationException("new-exception"))); Assert.Single(activity.Events); Assert.NotNull(telemetrySpan.Activity); var @event = telemetrySpan.Activity.Events.FirstOrDefault(q => q.Name == SemanticConventions.AttributeExceptionEventName); Assert.Equal(message, @event.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeExceptionMessage).Value); - Assert.Equal(typeof(ArgumentNullException).Name, @event.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeExceptionType).Value); + Assert.Equal(nameof(ArgumentNullException), @event.Tags.FirstOrDefault(t => t.Key == SemanticConventions.AttributeExceptionType).Value); } [Fact] public void CheckRecordExceptionData2() { - string type = "ArgumentNullException"; - string message = "message"; - string stack = "stack"; + var type = "ArgumentNullException"; + var message = "message"; + var stack = "stack"; - using Activity activity = new Activity("exception-test"); - using TelemetrySpan telemetrySpan = new TelemetrySpan(activity); + using var activity = new Activity("exception-test"); + using var telemetrySpan = new TelemetrySpan(activity); telemetrySpan.RecordException(type, message, stack); Assert.Single(activity.Events); @@ -46,8 +46,8 @@ public void CheckRecordExceptionData2() [Fact] public void CheckRecordExceptionEmpty() { - using Activity activity = new Activity("exception-test"); - using TelemetrySpan telemetrySpan = new TelemetrySpan(activity); + using var activity = new Activity("exception-test"); + using var telemetrySpan = new TelemetrySpan(activity); telemetrySpan.RecordException(string.Empty, string.Empty, string.Empty); Assert.Empty(activity.Events); diff --git a/test/OpenTelemetry.Api.Tests/Trace/TracerTests.cs b/test/OpenTelemetry.Api.Tests/Trace/TracerTests.cs index 95c86cd5398..db27808a8f0 100644 --- a/test/OpenTelemetry.Api.Tests/Trace/TracerTests.cs +++ b/test/OpenTelemetry.Api.Tests/Trace/TracerTests.cs @@ -338,7 +338,7 @@ public void TracerConcurrencyTest() this.output.WriteLine($"Bugs, if any: {string.Join("\n", test.TestReport.BugReports)}"); var dir = Directory.GetCurrentDirectory(); - if (test.TryEmitReports(dir, $"{nameof(this.TracerConcurrencyTest)}_CoyoteOutput", out IEnumerable reportPaths)) + if (test.TryEmitReports(dir, $"{nameof(this.TracerConcurrencyTest)}_CoyoteOutput", out var reportPaths)) { foreach (var reportPath in reportPaths) { @@ -367,8 +367,8 @@ static void InnerTest() Assert.NotNull(tracers); - Thread[] getTracerThreads = new Thread[testTracerProvider.ExpectedNumberOfThreads]; - for (int i = 0; i < testTracerProvider.ExpectedNumberOfThreads; i++) + var getTracerThreads = new Thread[testTracerProvider.ExpectedNumberOfThreads]; + for (var i = 0; i < testTracerProvider.ExpectedNumberOfThreads; i++) { getTracerThreads[i] = new Thread(state => { diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.FuzzTests/Generators.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.FuzzTests/Generators.cs index c1e3be17329..77ab83df6c0 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.FuzzTests/Generators.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.FuzzTests/Generators.cs @@ -69,14 +69,14 @@ public static Arbitrary ActivityArbitrary(ActivityStatusCode? status = // Generate tags var tagCount = Math.Min(size, 50); - for (int i = 0; i < tagCount; i++) + for (var i = 0; i < tagCount; i++) { activity.SetTag($"tag.{i}", $"value_{i}_{Guid.NewGuid():N}"); } // Generate events var eventCount = Math.Min(size / 10, 10); - for (int i = 0; i < eventCount; i++) + for (var i = 0; i < eventCount; i++) { var eventTags = new ActivityTagsCollection { @@ -87,7 +87,7 @@ public static Arbitrary ActivityArbitrary(ActivityStatusCode? status = // Generate links var linkCount = Math.Min(size / 10, 10); - for (int i = 0; i < linkCount; i++) + for (var i = 0; i < linkCount; i++) { var linkTags = new ActivityTagsCollection { @@ -117,7 +117,7 @@ public static Arbitrary ResourceArbitrary() var count = Math.Min(size, 20); var attributes = new Dictionary(count); - for (int i = 0; i < count; i++) + for (var i = 0; i < count; i++) { attributes[$"resource.attr.{i}"] = $"value_{i}"; } @@ -144,7 +144,7 @@ public static Arbitrary> BatchMetricArbitrary() if (size % 7 == 0) { var boundaries = new double[Math.Min(size % 10, 10)]; - for (int i = 0; i < boundaries.Length; i++) + for (var i = 0; i < boundaries.Length; i++) { boundaries[i] = (i * 50.0) + (size % 50); } @@ -163,7 +163,7 @@ public static Arbitrary> BatchMetricArbitrary() var counterSingle = meter.CreateCounter("test.counter.single"); var counterDouble = meter.CreateCounter("test.counter.double"); - for (int i = 0; i < size; i++) + for (var i = 0; i < size; i++) { counterByte.Add((byte)(100 * i)); counterInt16.Add((short)(100 * i)); @@ -175,14 +175,14 @@ public static Arbitrary> BatchMetricArbitrary() var gauge = meter.CreateGauge("test.gauge"); - for (int i = 0; i < size; i++) + for (var i = 0; i < size; i++) { gauge.Record(0.1 * i); } var histogram = meter.CreateHistogram("test.histogram"); - for (int i = 0; i < size; i++) + for (var i = 0; i < size; i++) { histogram.Record(300 * i); } @@ -213,7 +213,7 @@ public static Arbitrary LogRecordArbitrary(LogRecordSeverity? severit // Add attributes var count = Math.Min(size, 50); var attributes = new List>(count); - for (int i = 0; i < count; i++) + for (var i = 0; i < count; i++) { attributes.Add(new KeyValuePair($"log.attribute.{i}", $"value_{i}")); } diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.FuzzTests/ProtobufOtlpTraceSerializerTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.FuzzTests/ProtobufOtlpTraceSerializerTests.cs index 0bbd25f0cc8..a47b40f699b 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.FuzzTests/ProtobufOtlpTraceSerializerTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.FuzzTests/ProtobufOtlpTraceSerializerTests.cs @@ -228,7 +228,7 @@ public Property MultipleSerializationCallsAreConsistent() => Prop.ForAll( } // Content should match - for (int i = 0; i < writePos1; i++) + for (var i = 0; i < writePos1; i++) { if (buffer1[i] != buffer2[i]) { diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs index 44767efe5a6..03a78e147f0 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs @@ -24,10 +24,8 @@ private GrpcRetryTestCase(string testRunnerName, GrpcRetryAttempt[] retryAttempt internal GrpcRetryAttempt[] RetryAttempts { get; } - public static TheoryData GetGrpcTestCases() - { + public static TheoryData GetGrpcTestCases() => #pragma warning disable CA1825 // HACK Workaround for https://github.com/dotnet/sdk/issues/53047 - return [ new("Cancelled", [new(StatusCode.Cancelled)]), new("DeadlineExceeded", [new(StatusCode.DeadlineExceeded)]), @@ -86,12 +84,9 @@ public static TheoryData GetGrpcTestCases() expectedRetryAttempts: 9), ]; #pragma warning restore CA1825 - } public override string ToString() - { - return this.testRunnerName; - } + => this.testRunnerName; private static string GetThrottleDelayString(Duration throttleDelay) { @@ -111,7 +106,7 @@ private static string GetThrottleDelayString(Duration throttleDelay) return Convert.ToBase64String(status.ToByteArray()); } - internal struct GrpcRetryAttempt + internal readonly struct GrpcRetryAttempt { internal GrpcRetryAttempt( StatusCode statusCode, diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/GrpcStatusDeserializerTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/GrpcStatusDeserializerTests.cs index f160d568b43..18cf9f74909 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/GrpcStatusDeserializerTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/GrpcStatusDeserializerTests.cs @@ -23,7 +23,7 @@ public void DeserializeStatus_ValidBase64Input_ReturnsExpectedStatus() }; // Serialize the Status message and encode to base64 - string grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); + var grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); // Use the GrpcStatusDeserializer to deserialize from the base64 input var deserializedStatus = GrpcStatusDeserializer.DeserializeStatus(grpcStatusDetailsBin); @@ -55,7 +55,7 @@ public void DeserializeStatus_WithRetryInfo_ReturnsExpectedStatus() }, }; - string grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); + var grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); // Act var retryInfo = GrpcStatusDeserializer.ExtractRetryInfo(grpcStatusDetailsBin); @@ -70,7 +70,7 @@ public void DeserializeStatus_EmptyStatus_ReturnsEmptyStatus() { // Arrange var status = new Google.Rpc.Status(); - string grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); + var grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); // Act var deserializedStatus = GrpcStatusDeserializer.DeserializeStatus(grpcStatusDetailsBin); @@ -97,7 +97,7 @@ public void DeserializeStatus_MultipleDetails_ReturnsAllDetails() }, }; - string grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); + var grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); // Act var deserializedStatus = GrpcStatusDeserializer.DeserializeStatus(grpcStatusDetailsBin); @@ -141,10 +141,9 @@ public void DeserializeStatus_ComplexRetryInfo_ReturnsExpectedValues() }, }; - string grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); + var grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); // Act - byte[] data = Convert.FromBase64String(grpcStatusDetailsBin); var retryInfo = GrpcStatusDeserializer.ExtractRetryInfo(grpcStatusDetailsBin); // Assert @@ -164,7 +163,7 @@ public void ExtractRetryInfo_WithNoRetryInfoTypeUrl_ReturnsNull() Details = { Any.Pack(new Google.Rpc.Status { Code = 5 }) }, // A different type packed }; - string grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); + var grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); // Act var retryInfo = GrpcStatusDeserializer.ExtractRetryInfo(grpcStatusDetailsBin); @@ -183,7 +182,7 @@ public void DeserializeStatus_WithBoundaryCode_ReturnsExpectedStatus() Message = "Boundary code test", }; - string grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); + var grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); // Act var deserializedStatus = GrpcStatusDeserializer.DeserializeStatus(grpcStatusDetailsBin); @@ -204,9 +203,7 @@ public void TryGetGrpcRetryDelay_NullOrEmptyInput_ReturnsNull() [Fact] public void TryGetGrpcRetryDelay_InvalidBase64Input_ReturnsNull() - { - Assert.Null(GrpcStatusDeserializer.TryGetGrpcRetryDelay("invalid-base64")); - } + => Assert.Null(GrpcStatusDeserializer.TryGetGrpcRetryDelay("invalid-base64")); [Fact] public void TryGetGrpcRetryDelay_NoRetryInfo_ReturnsNull() @@ -219,7 +216,7 @@ public void TryGetGrpcRetryDelay_NoRetryInfo_ReturnsNull() Details = { Any.Pack(new Google.Rpc.Status { Code = 5 }) }, // Non-RetryInfo type }; - string grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); + var grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); // Act var result = GrpcStatusDeserializer.TryGetGrpcRetryDelay(grpcStatusDetailsBin); @@ -249,7 +246,7 @@ public void TryGetGrpcRetryDelay_BoundaryValuesForDuration_ReturnsNull() }, }; - string grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); + var grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); // Act var result = GrpcStatusDeserializer.TryGetGrpcRetryDelay(grpcStatusDetailsBin); @@ -279,7 +276,7 @@ public void TryGetGrpcRetryDelay_MultipleRetryInfos_UsesFirstRetryInfo() }, }; - string grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); + var grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); // Act var result = GrpcStatusDeserializer.TryGetGrpcRetryDelay(grpcStatusDetailsBin); @@ -306,7 +303,7 @@ public void TryGetGrpcRetryDelay_OnlyNanos_ReturnsExpected() }, }; - string grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); + var grpcStatusDetailsBin = Convert.ToBase64String(status.ToByteArray()); // Act var result = GrpcStatusDeserializer.TryGetGrpcRetryDelay(grpcStatusDetailsBin); @@ -326,10 +323,10 @@ public void DeserializeStatus_TruncatedStream_ThrowsEndOfStreamException() Message = "Truncated stream test", }; - byte[] fullData = status.ToByteArray(); - byte[] truncatedData = fullData.Take(fullData.Length / 2).ToArray(); // Truncate the data + var fullData = status.ToByteArray(); + var truncatedData = fullData.Take(fullData.Length / 2).ToArray(); // Truncate the data - string grpcStatusDetailsBin = Convert.ToBase64String(truncatedData); + var grpcStatusDetailsBin = Convert.ToBase64String(truncatedData); // Act & Assert: Attempt to deserialize and expect an EndOfStreamException Assert.Throws(() => diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/OtlpHttpTraceExportClientTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/OtlpHttpTraceExportClientTests.cs index bc3cdcca101..f842852f5f9 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/OtlpHttpTraceExportClientTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/OtlpHttpTraceExportClientTests.cs @@ -31,7 +31,7 @@ public OtlpHttpTraceExportClientTests() this.activityListener = new ActivityListener { ShouldListenTo = _ => true, - Sample = (ref ActivityCreationOptions options) => ActivitySamplingResult.AllDataAndRecorded, + Sample = (ref options) => ActivitySamplingResult.AllDataAndRecorded, }; ActivitySource.AddActivityListener(this.activityListener); @@ -61,7 +61,7 @@ public void NewOtlpHttpTraceExportClient_OtlpExporterOptions_ExporterHasCorrectP Assert.Contains(client.Headers, kvp => kvp.Key == header1.Name && kvp.Value == header1.Value); Assert.Contains(client.Headers, kvp => kvp.Key == header2.Name && kvp.Value == header2.Value); - for (int i = 0; i < options.StandardHeaders.Length; i++) + for (var i = 0; i < options.StandardHeaders.Length; i++) { Assert.Contains(client.Headers, entry => entry.Key == options.StandardHeaders[i].Key && entry.Value == options.StandardHeaders[i].Value); } @@ -101,11 +101,10 @@ public void SendExportRequest_ExportTraceServiceRequest_SendsCorrectHttpRequest( if (includeServiceNameInResource) { resourceBuilder.AddAttributes( - new List> - { + [ new(ResourceSemanticConventions.AttributeServiceName, "service_name"), new(ResourceSemanticConventions.AttributeServiceNamespace, "ns_1"), - }); + ]); } var builder = Sdk.CreateTracerProviderBuilder() @@ -128,7 +127,7 @@ public void SendExportRequest_ExportTraceServiceRequest_SendsCorrectHttpRequest( var activityKind = isEven ? ActivityKind.Client : ActivityKind.Server; var activityTags = isEven ? evenTags : oddTags; - using Activity? activity = source.StartActivity($"span-{i}", activityKind, parentContext: default, activityTags); + using var activity = source.StartActivity($"span-{i}", activityKind, parentContext: default, activityTags); Assert.NotNull(activity); processor.OnEnd(activity); } @@ -160,7 +159,7 @@ void RunTest(Batch batch) Assert.Contains(httpRequest.Headers, h => h.Key == header1.Name && h.Value.First() == header1.Value); Assert.Contains(httpRequest.Headers, h => h.Key == header2.Name && h.Value.First() == header2.Value); - for (int i = 0; i < options.StandardHeaders.Length; i++) + for (var i = 0; i < options.StandardHeaders.Length; i++) { Assert.Contains(httpRequest.Headers, entry => entry.Key == options.StandardHeaders[i].Key && entry.Value.First() == options.StandardHeaders[i].Value); } diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/OtlpArrayTagWriterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/OtlpArrayTagWriterTests.cs index 49ca3885bbd..b66bf32effe 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/OtlpArrayTagWriterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/OtlpArrayTagWriterTests.cs @@ -27,7 +27,7 @@ public OtlpArrayTagWriterTests() this.activityListener = new ActivityListener { ShouldListenTo = _ => true, - Sample = (ref ActivityCreationOptions options) => ActivitySamplingResult.AllDataAndRecorded, + Sample = (ref options) => ActivitySamplingResult.AllDataAndRecorded, }; ActivitySource.AddActivityListener(this.activityListener); @@ -126,7 +126,7 @@ public void TryResize_SucceedsInitially() { // Act this.arrayTagWriter.BeginWriteArray(); - bool result = this.arrayTagWriter.TryResize(); + var result = this.arrayTagWriter.TryResize(); // Assert Assert.True(result); @@ -136,8 +136,8 @@ public void TryResize_SucceedsInitially() public void TryResize_RepeatedResizingStopsAtMaxBufferSize() { // Arrange - var arrayState = this.arrayTagWriter.BeginWriteArray(); - bool resizeResult = true; + _ = this.arrayTagWriter.BeginWriteArray(); + var resizeResult = true; // Act: Repeatedly attempt to resize until reaching maximum buffer size while (resizeResult) @@ -154,13 +154,13 @@ public void SerializeLargeArrayExceeding2MB_TruncatesInOtlpSpan() { // Create a large array exceeding 2 MB var largeArray = new string[512 * 1024]; - for (int i = 0; i < largeArray.Length; i++) + for (var i = 0; i < largeArray.Length; i++) { largeArray[i] = "1234"; } var lessthat1MBArray = new string[256 * 4]; - for (int i = 0; i < lessthat1MBArray.Length; i++) + for (var i = 0; i < lessthat1MBArray.Length; i++) { lessthat1MBArray[i] = "1234"; } @@ -199,7 +199,7 @@ public void SerializeLargeArrayExceeding2MB_TruncatesInOtlpSpan() public void LargeArray_WithSmallBaseBuffer_ThrowsExceptionOnWriteSpan() { var lessthat1MBArray = new string[256 * 256]; - for (int i = 0; i < lessthat1MBArray.Length; i++) + for (var i = 0; i < lessthat1MBArray.Length; i++) { lessthat1MBArray[i] = "1234"; } @@ -220,7 +220,7 @@ public void LargeArray_WithSmallBaseBuffer_ThrowsExceptionOnWriteSpan() public void LargeArray_WithSmallBaseBuffer_ExpandsOnTraceData() { var lessthat1MBArray = new string[256 * 256]; - for (int i = 0; i < lessthat1MBArray.Length; i++) + for (var i = 0; i < lessthat1MBArray.Length; i++) { lessthat1MBArray[i] = "1234"; } @@ -237,7 +237,7 @@ public void LargeArray_WithSmallBaseBuffer_ExpandsOnTraceData() var batch = new Batch([activity], 1); RunTest(new(), batch); - void RunTest(SdkLimitOptions sdkOptions, Batch batch) + static void RunTest(SdkLimitOptions sdkOptions, Batch batch) { var buffer = new byte[4096]; var writePosition = ProtobufOtlpTraceSerializer.WriteTraceData(ref buffer, 0, sdkOptions, ResourceBuilder.CreateEmpty().Build(), batch); diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/ProtobufOtlpMetricSerializerTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/ProtobufOtlpMetricSerializerTests.cs index efd10562668..a98fca4f4c4 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/ProtobufOtlpMetricSerializerTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/ProtobufOtlpMetricSerializerTests.cs @@ -159,13 +159,15 @@ private static Batch GenerateMetrics(Action? confi var type = typeof(AggregatorStore); var bindingAttributes = BindingFlags.NonPublic | BindingFlags.Instance; - var startTimeProperty = type.GetProperty(nameof(AggregatorStore.StartTimeExclusive), bindingAttributes)!; - var endTimeProperty = type.GetProperty(nameof(AggregatorStore.EndTimeInclusive), bindingAttributes)!; + var startTimeProperty = type.GetProperty(nameof(AggregatorStore.StartTimeExclusive), bindingAttributes); + var endTimeProperty = type.GetProperty(nameof(AggregatorStore.EndTimeInclusive), bindingAttributes); foreach (var metric in metrics) { +#pragma warning disable CS8602 // Dereference of a possibly null reference. startTimeProperty.SetValue(metric.AggregatorStore, startTime); endTimeProperty.SetValue(metric.AggregatorStore, endTime); +#pragma warning restore CS8602 // Dereference of a possibly null reference. } return metrics; diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/ProtobufSerializerTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/ProtobufSerializerTests.cs index 22d5582ad6c..99e409b9c3e 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/ProtobufSerializerTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/ProtobufSerializerTests.cs @@ -19,8 +19,8 @@ public void GetTagValue_ReturnsCorrectValue() [Fact] public void WriteTag_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteTag(buffer, 0, 1, ProtobufWireType.VARINT); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteTag(buffer, 0, 1, ProtobufWireType.VARINT); Assert.Equal(1, position); Assert.Equal(8, buffer[0]); } @@ -28,8 +28,8 @@ public void WriteTag_WritesCorrectly() [Fact] public void WriteLength_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteLength(buffer, 0, 300); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteLength(buffer, 0, 300); Assert.Equal(2, position); Assert.Equal(0xAC, buffer[0]); Assert.Equal(0x02, buffer[1]); @@ -38,8 +38,8 @@ public void WriteLength_WritesCorrectly() [Fact] public void WriteBoolWithTag_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteBoolWithTag(buffer, 0, 1, true); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteBoolWithTag(buffer, 0, 1, true); Assert.Equal(2, position); Assert.Equal(8, buffer[0]); Assert.Equal(1, buffer[1]); @@ -48,8 +48,8 @@ public void WriteBoolWithTag_WritesCorrectly() [Fact] public void WriteFixed32WithTag_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteFixed32WithTag(buffer, 0, 1, 0x12345678); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteFixed32WithTag(buffer, 0, 1, 0x12345678); Assert.Equal(5, position); Assert.Equal(13, buffer[0]); Assert.Equal(0x78, buffer[1]); @@ -61,8 +61,8 @@ public void WriteFixed32WithTag_WritesCorrectly() [Fact] public void WriteFixed64WithTag_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteFixed64WithTag(buffer, 0, 1, 0x123456789ABCDEF0); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteFixed64WithTag(buffer, 0, 1, 0x123456789ABCDEF0); Assert.Equal(9, position); Assert.Equal(9, buffer[0]); // Tag Assert.Equal(0xF0, buffer[1]); @@ -78,8 +78,8 @@ public void WriteFixed64WithTag_WritesCorrectly() [Fact] public void WriteStringWithTag_WritesCorrectly() { - byte[] buffer = new byte[20]; - int position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, "Hello"); + var buffer = new byte[20]; + var position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, "Hello"); Assert.Equal(7, position); Assert.Equal(10, buffer[0]); Assert.Equal(5, buffer[1]); @@ -109,10 +109,10 @@ public void WriteReservedLength_WritesCorrectly(int length, byte[] expectedBytes throw new ArgumentNullException(nameof(expectedBytes)); } #endif - byte[] buffer = new byte[10]; + var buffer = new byte[10]; ProtobufSerializer.WriteReservedLength(buffer, 0, length); - for (int i = 0; i < expectedBytes.Length; i++) + for (var i = 0; i < expectedBytes.Length; i++) { Assert.Equal(expectedBytes[i], buffer[i]); } @@ -121,8 +121,8 @@ public void WriteReservedLength_WritesCorrectly(int length, byte[] expectedBytes [Fact] public void WriteTagAndLength_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteTagAndLength(buffer, 0, 300, 1, ProtobufWireType.LEN); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteTagAndLength(buffer, 0, 300, 1, ProtobufWireType.LEN); Assert.Equal(3, position); Assert.Equal(10, buffer[0]); // Tag Assert.Equal(0xAC, buffer[1]); // Length (300 in varint encoding) @@ -132,8 +132,8 @@ public void WriteTagAndLength_WritesCorrectly() [Fact] public void WriteEnumWithTag_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteEnumWithTag(buffer, 0, 1, 5); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteEnumWithTag(buffer, 0, 1, 5); Assert.Equal(2, position); Assert.Equal(8, buffer[0]); // Tag Assert.Equal(5, buffer[1]); // Enum value @@ -142,8 +142,8 @@ public void WriteEnumWithTag_WritesCorrectly() [Fact] public void WriteVarInt64_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteVarInt64(buffer, 0, 300); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteVarInt64(buffer, 0, 300); Assert.Equal(2, position); Assert.Equal(0xAC, buffer[0]); Assert.Equal(0x02, buffer[1]); @@ -152,8 +152,8 @@ public void WriteVarInt64_WritesCorrectly() [Fact] public void WriteInt64WithTag_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteInt64WithTag(buffer, 0, 1, 300); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteInt64WithTag(buffer, 0, 1, 300); Assert.Equal(3, position); Assert.Equal(8, buffer[0]); // Tag Assert.Equal(0xAC, buffer[1]); @@ -163,8 +163,8 @@ public void WriteInt64WithTag_WritesCorrectly() [Fact] public void WriteDoubleWithTag_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteDoubleWithTag(buffer, 0, 1, 123.456); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteDoubleWithTag(buffer, 0, 1, 123.456); Assert.Equal(9, position); Assert.Equal(9, buffer[0]); // Tag @@ -182,8 +182,8 @@ public void WriteDoubleWithTag_WritesCorrectly() [Fact] public void WriteSignedInt32_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteSInt32WithTag(buffer, 0, 1, 300); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteSInt32WithTag(buffer, 0, 1, 300); Assert.Equal(3, position); Assert.Equal(8, buffer[0]); // Tag Assert.Equal(0xD8, buffer[1]); @@ -200,8 +200,8 @@ public void WriteSignedInt32_WritesCorrectly() [Fact] public void WriteVarInt32_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteVarInt32(buffer, 0, 300); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteVarInt32(buffer, 0, 300); Assert.Equal(2, position); Assert.Equal(0xAC, buffer[0]); Assert.Equal(0x02, buffer[1]); @@ -210,8 +210,8 @@ public void WriteVarInt32_WritesCorrectly() [Fact] public void WriteVarInt32_MaxValue_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteVarInt32(buffer, 0, uint.MaxValue); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteVarInt32(buffer, 0, uint.MaxValue); Assert.Equal(5, position); Assert.Equal(0xFF, buffer[0]); Assert.Equal(0xFF, buffer[1]); @@ -223,10 +223,10 @@ public void WriteVarInt32_MaxValue_WritesCorrectly() [Fact] public void WriteVarInt64_MaxValue_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteVarInt64(buffer, 0, ulong.MaxValue); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteVarInt64(buffer, 0, ulong.MaxValue); Assert.Equal(10, position); - for (int i = 0; i < 9; i++) + for (var i = 0; i < 9; i++) { Assert.Equal(0xFF, buffer[i]); } @@ -237,8 +237,8 @@ public void WriteVarInt64_MaxValue_WritesCorrectly() [Fact] public void WriteStringWithTag_EmptyString_WritesCorrectly() { - byte[] buffer = new byte[10]; - int position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, string.Empty); + var buffer = new byte[10]; + var position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, string.Empty); Assert.Equal(2, position); Assert.Equal(10, buffer[0]); // Tag Assert.Equal(0, buffer[1]); // Length @@ -247,14 +247,14 @@ public void WriteStringWithTag_EmptyString_WritesCorrectly() [Fact] public void WriteStringWithTag_ASCIIString_WritesCorrectly() { - byte[] buffer = new byte[20]; - int position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, "Hello"); + var buffer = new byte[20]; + var position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, "Hello"); Assert.Equal(7, position); Assert.Equal(10, buffer[0]); // Tag Assert.Equal(5, buffer[1]); // Length - byte[] expectedContent = "Hello"u8.ToArray(); - byte[] actualContent = new byte[5]; + var expectedContent = "Hello"u8.ToArray(); + var actualContent = new byte[5]; Array.Copy(buffer, 2, actualContent, 0, 5); Assert.True(expectedContent.SequenceEqual(actualContent)); } @@ -262,15 +262,15 @@ public void WriteStringWithTag_ASCIIString_WritesCorrectly() [Fact] public void WriteStringWithTag_UnicodeString_WritesCorrectly() { - byte[] buffer = new byte[20]; - string unicodeString = "\u3053\u3093\u306b\u3061\u306f"; // "Hello" in Japanese - int position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, unicodeString); + var buffer = new byte[20]; + var unicodeString = "\u3053\u3093\u306b\u3061\u306f"; // "Hello" in Japanese + var position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, unicodeString); Assert.Equal(17, position); Assert.Equal(10, buffer[0]); // Tag Assert.Equal(15, buffer[1]); // Length (3 bytes per character in UTF-8) - byte[] expectedContent = Encoding.UTF8.GetBytes(unicodeString); - byte[] actualContent = new byte[15]; + var expectedContent = Encoding.UTF8.GetBytes(unicodeString); + var actualContent = new byte[15]; Array.Copy(buffer, 2, actualContent, 0, 15); Assert.True(expectedContent.SequenceEqual(actualContent)); } @@ -278,16 +278,16 @@ public void WriteStringWithTag_UnicodeString_WritesCorrectly() [Fact] public void WriteStringWithTag_LongString_WritesCorrectly() { - string longString = new string('a', 1000); - byte[] buffer = new byte[1100]; - int position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, longString); + var longString = new string('a', 1000); + var buffer = new byte[1100]; + var position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, longString); Assert.Equal(1003, position); Assert.Equal(10, buffer[0]); // Tag Assert.Equal(0xE8, buffer[1]); // Length (1000 in varint encoding) Assert.Equal(0x07, buffer[2]); - byte[] expectedContent = Encoding.UTF8.GetBytes(longString); - byte[] actualContent = new byte[1000]; + var expectedContent = Encoding.UTF8.GetBytes(longString); + var actualContent = new byte[1000]; Array.Copy(buffer, 3, actualContent, 0, 1000); Assert.True(expectedContent.SequenceEqual(actualContent)); } @@ -295,15 +295,15 @@ public void WriteStringWithTag_LongString_WritesCorrectly() [Fact] public void WriteStringWithTag_MixedEncodingString_WritesCorrectly() { - byte[] buffer = new byte[30]; - string mixedString = "Hello\u4e16\u754c"; // "Hello World" with "World" in Chinese - int position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, mixedString); + var buffer = new byte[30]; + var mixedString = "Hello\u4e16\u754c"; // "Hello World" with "World" in Chinese + var position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, mixedString); Assert.Equal(13, position); Assert.Equal(10, buffer[0]); // Tag Assert.Equal(11, buffer[1]); // Length (5 for "Hello" + 6 for Chinese "World" in UTF-8) - byte[] expectedContent = Encoding.UTF8.GetBytes(mixedString); - byte[] actualContent = new byte[11]; + var expectedContent = Encoding.UTF8.GetBytes(mixedString); + var actualContent = new byte[11]; Array.Copy(buffer, 2, actualContent, 0, 11); Assert.True(expectedContent.SequenceEqual(actualContent)); } @@ -311,15 +311,15 @@ public void WriteStringWithTag_MixedEncodingString_WritesCorrectly() [Fact] public void WriteStringWithTag_StringWithSpecialCharacters_WritesCorrectly() { - byte[] buffer = new byte[30]; - string specialString = "Hello\n\t\"World\""; - int position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, specialString); + var buffer = new byte[30]; + var specialString = "Hello\n\t\"World\""; + var position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, specialString); Assert.Equal(16, position); Assert.Equal(10, buffer[0]); // Tag Assert.Equal(14, buffer[1]); // Length - byte[] expectedContent = Encoding.UTF8.GetBytes(specialString); - byte[] actualContent = new byte[14]; + var expectedContent = Encoding.UTF8.GetBytes(specialString); + var actualContent = new byte[14]; Array.Copy(buffer, 2, actualContent, 0, 14); Assert.True(expectedContent.SequenceEqual(actualContent)); } @@ -327,15 +327,15 @@ public void WriteStringWithTag_StringWithSpecialCharacters_WritesCorrectly() [Fact] public void WriteStringWithTag_StringWithNullCharacters_WritesCorrectly() { - byte[] buffer = new byte[20]; - string stringWithNull = "Hello\0World"; - int position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, stringWithNull); + var buffer = new byte[20]; + var stringWithNull = "Hello\0World"; + var position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, stringWithNull); Assert.Equal(13, position); Assert.Equal(10, buffer[0]); // Tag Assert.Equal(11, buffer[1]); // Length - byte[] expectedContent = Encoding.UTF8.GetBytes(stringWithNull); - byte[] actualContent = new byte[11]; + var expectedContent = Encoding.UTF8.GetBytes(stringWithNull); + var actualContent = new byte[11]; Array.Copy(buffer, 2, actualContent, 0, 11); Assert.True(expectedContent.SequenceEqual(actualContent)); } @@ -343,15 +343,15 @@ public void WriteStringWithTag_StringWithNullCharacters_WritesCorrectly() [Fact] public void WriteStringWithTag_SurrogatePairs_WritesCorrectly() { - byte[] buffer = new byte[20]; - string surrogatePairString = "\uD83D\uDCD6"; // Books emoji - int position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, surrogatePairString); + var buffer = new byte[20]; + var surrogatePairString = "\uD83D\uDCD6"; // Books emoji + var position = ProtobufSerializer.WriteStringWithTag(buffer, 0, 1, surrogatePairString); Assert.Equal(6, position); Assert.Equal(10, buffer[0]); // Tag Assert.Equal(4, buffer[1]); // Length (4 bytes for the surrogate pair in UTF-8) - byte[] expectedContent = Encoding.UTF8.GetBytes(surrogatePairString); - byte[] actualContent = new byte[4]; + var expectedContent = Encoding.UTF8.GetBytes(surrogatePairString); + var actualContent = new byte[4]; Array.Copy(buffer, 2, actualContent, 0, 4); Assert.True(expectedContent.SequenceEqual(actualContent)); } diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/MockCollectorIntegrationTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/MockCollectorIntegrationTests.cs index 326a086acd6..84b9b71c2da 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/MockCollectorIntegrationTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/MockCollectorIntegrationTests.cs @@ -561,7 +561,7 @@ private sealed class MockCollectorState public void SetStatusCodes(int[] statusCodes) { this.statusCodeIndex = 0; - this.statusCodes = statusCodes.Select(x => (Grpc.Core.StatusCode)x).ToArray(); + this.statusCodes = [.. statusCodes.Select(x => (Grpc.Core.StatusCode)x)]; } public Grpc.Core.StatusCode NextStatus() @@ -580,7 +580,7 @@ private sealed class MockCollectorHttpState public void SetStatusCodes(int[] statusCodes) { this.statusCodeIndex = 0; - this.statusCodes = statusCodes.Select(x => (HttpStatusCode)x).ToArray(); + this.statusCodes = [.. statusCodes.Select(x => (HttpStatusCode)x)]; } public HttpStatusCode NextStatus() diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpAttributeTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpAttributeTests.cs index ec189dbdec4..c738e6b6f07 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpAttributeTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpAttributeTests.cs @@ -283,7 +283,7 @@ public void ExceptionInToStringIsCaught() private static bool TryTransformTag(KeyValuePair tag, [NotNullWhen(true)] out OtlpCommon.KeyValue? attribute) { - ProtobufOtlpTagWriter.OtlpTagWriterState otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState + var otlpTagWriterState = new ProtobufOtlpTagWriter.OtlpTagWriterState { Buffer = new byte[1024], WritePosition = 0, diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterHelperExtensionsTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterHelperExtensionsTests.cs index 3510f3c4153..065ee32a5b3 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterHelperExtensionsTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterHelperExtensionsTests.cs @@ -23,12 +23,12 @@ public void OtlpExporter_Throws_OnGrpcWithDefaultFactory_ForTracing() using var sp = services.BuildServiceProvider(); - Assert.Throws(() => sp.GetRequiredService()); + Assert.Throws(sp.GetRequiredService); var tracerProviderBuilder = Sdk.CreateTracerProviderBuilder() .AddOtlpExporter(o => o.Protocol = OtlpExportProtocol.Grpc); - Assert.Throws(() => tracerProviderBuilder.Build()); + Assert.Throws(tracerProviderBuilder.Build); } [Fact] @@ -41,12 +41,12 @@ public void OtlpExporter_Throws_OnGrpcWithDefaultFactory_ForMetrics() using var sp = services.BuildServiceProvider(); - Assert.Throws(() => sp.GetRequiredService()); + Assert.Throws(sp.GetRequiredService); var meterProviderBuilder = Sdk.CreateMeterProviderBuilder() .AddOtlpExporter(o => o.Protocol = OtlpExportProtocol.Grpc); - Assert.Throws(() => meterProviderBuilder.Build()); + Assert.Throws(meterProviderBuilder.Build); } [Fact] @@ -59,7 +59,7 @@ public void OtlpExporter_Throws_OnGrpcWithDefaultFactory_ForLogging() using var sp = services.BuildServiceProvider(); - Assert.Throws(() => sp.GetRequiredService()); + Assert.Throws(sp.GetRequiredService); Assert.Throws(() => LoggerFactory.Create(builder => { diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsExtensionsTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsExtensionsTests.cs index 0c3457e36d5..faedf472597 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsExtensionsTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsExtensionsTests.cs @@ -27,7 +27,7 @@ public void GetHeaders_NoOptionHeaders_ReturnsStandardHeaders(string? optionHead Assert.Equal(options.StandardHeaders.Length, headers.Count); - for (int i = 0; i < options.StandardHeaders.Length; i++) + for (var i = 0; i < options.StandardHeaders.Length; i++) { Assert.Contains(headers, entry => entry.Key == options.StandardHeaders[i].Key && entry.Value == options.StandardHeaders[i].Value); } @@ -39,9 +39,7 @@ public void GetHeaders_NoOptionHeaders_ReturnsStandardHeaders(string? optionHead [InlineData(",,key1=value1,,key2=value2,,")] [InlineData("key1")] public void GetHeaders_InvalidOptionHeaders_ThrowsArgumentException(string inputOptionHeaders) - { - VerifyHeaders(inputOptionHeaders, string.Empty, true); - } + => VerifyHeaders(inputOptionHeaders, string.Empty, true); [Theory] [InlineData("", "")] @@ -55,9 +53,7 @@ public void GetHeaders_InvalidOptionHeaders_ThrowsArgumentException(string input [InlineData("key1=value1%2Ckey2=value2", "key1=value1,key2=value2")] [InlineData("key1=value1%2Ckey2=value2%2Ckey3=value3", "key1=value1,key2=value2,key3=value3")] public void GetHeaders_ValidAndUrlEncodedHeaders_ReturnsCorrectHeaders(string inputOptionHeaders, string expectedNormalizedOptional) - { - VerifyHeaders(inputOptionHeaders, expectedNormalizedOptional); - } + => VerifyHeaders(inputOptionHeaders, expectedNormalizedOptional); [Theory] #pragma warning disable CS0618 // Suppressing gRPC obsolete warning @@ -136,15 +132,15 @@ private static void AssertTransmissionHandler(OtlpExporterTransmissionHandler tr { if (retryStrategy == "in_memory") { - Assert.True(transmissionHandler is OtlpExporterRetryTransmissionHandler); + Assert.IsType(transmissionHandler); } else if (retryStrategy == "disk") { - Assert.True(transmissionHandler is OtlpExporterPersistentStorageTransmissionHandler); + Assert.IsType(transmissionHandler); } else { - Assert.True(transmissionHandler is OtlpExporterTransmissionHandler); + Assert.IsType(transmissionHandler); } Assert.Equal(exportClientType, transmissionHandler.ExportClient.GetType()); diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs index bc4f7820b9c..eed48e1e492 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs @@ -31,11 +31,11 @@ public class OtlpLogExporterTests [Fact] public void AddOtlpExporterWithNamedOptions() { - int defaultConfigureExporterOptionsInvocations = 0; - int namedConfigureExporterOptionsInvocations = 0; + var defaultConfigureExporterOptionsInvocations = 0; + var namedConfigureExporterOptionsInvocations = 0; - int defaultConfigureSdkLimitsOptionsInvocations = 0; - int namedConfigureSdkLimitsOptionsInvocations = 0; + var defaultConfigureSdkLimitsOptionsInvocations = 0; + var namedConfigureSdkLimitsOptionsInvocations = 0; using var loggerProvider = Sdk.CreateLoggerProviderBuilder() .ConfigureServices(services => @@ -73,11 +73,11 @@ public void AddOtlpExporterWithNamedOptions() [Fact] public void UserHttpFactoryCalledWhenUsingHttpProtobuf() { - OtlpExporterOptions options = new OtlpExporterOptions(); + var options = new OtlpExporterOptions(); var defaultFactory = options.HttpClientFactory; - int invocations = 0; + var invocations = 0; options.Protocol = OtlpExportProtocol.HttpProtobuf; options.HttpClientFactory = () => { @@ -131,7 +131,7 @@ public void AddOtlpExporterSetsDefaultBatchExportProcessor() [InlineData(true)] public void AddOtlpLogExporterReceivesAttributesWithParseStateValueSetToFalse(bool callUseOpenTelemetry) { - bool optionsValidated = false; + var optionsValidated = false; var logRecords = new List(); using var loggerFactory = LoggerFactory.Create(builder => @@ -272,7 +272,7 @@ public void OtlpLogRecordTestWhenStateValuesArePopulated() Assert.Single(logRecords); var logRecord = logRecords[0]; - OtlpLogs.LogRecord? otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); + var otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); Assert.NotNull(otlpLogRecord); Assert.Equal("Hello from tomato 2.99.", otlpLogRecord.Body.StringValue); @@ -319,7 +319,7 @@ public void CheckToOtlpLogRecordEventId(string? emitLogEventAttributes) .Build(); var logRecord = logRecords[0]; - OtlpLogs.LogRecord? otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new(configuration), logRecord); + var otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new(configuration), logRecord); Assert.NotNull(otlpLogRecord); Assert.Equal("Hello from tomato 2.99.", otlpLogRecord.Body.StringValue); @@ -376,7 +376,7 @@ public void CheckToOtlpLogRecordTimestamps() logger.LogMessage(); var logRecord = logRecords[0]; - OtlpLogs.LogRecord? otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); + var otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); Assert.NotNull(otlpLogRecord); Assert.True(otlpLogRecord.TimeUnixNano > 0); @@ -396,7 +396,7 @@ public void CheckToOtlpLogRecordTraceIdSpanIdFlagWithNoActivity() logger.LogWhenThereIsNoActivity(); var logRecord = logRecords[0]; - OtlpLogs.LogRecord? otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); + var otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); Assert.Null(Activity.Current); Assert.NotNull(otlpLogRecord); @@ -429,7 +429,7 @@ public void CheckToOtlpLogRecordSpanIdTraceIdAndFlag() var logRecord = logRecords[0]; - OtlpLogs.LogRecord? otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); + var otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); Assert.NotNull(otlpLogRecord); Assert.Equal(expectedTraceId.ToString(), ActivityTraceId.CreateFromBytes(otlpLogRecord.TraceId.ToByteArray()).ToString()); @@ -461,7 +461,7 @@ public void CheckToOtlpLogRecordSeverityLevelAndText(LogLevel logLevel) Assert.Single(logRecords); var logRecord = logRecords[0]; - OtlpLogs.LogRecord? otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); + var otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); Assert.NotNull(otlpLogRecord); #pragma warning disable CS0618 // Type or member is obsolete @@ -489,6 +489,9 @@ public void CheckToOtlpLogRecordSeverityLevelAndText(LogLevel logLevel) case LogLevel.Critical: Assert.Equal(OtlpLogs.SeverityNumber.Fatal, otlpLogRecord.SeverityNumber); break; + case LogLevel.None: + default: + break; } } @@ -516,7 +519,7 @@ public void CheckToOtlpLogRecordBodyIsPopulated(bool includeFormattedMessage) Assert.Single(logRecords); var logRecord = logRecords[0]; - OtlpLogs.LogRecord? otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); + var otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); Assert.NotNull(otlpLogRecord); if (includeFormattedMessage) @@ -631,7 +634,7 @@ public void CheckToOtlpLogRecordExceptionAttributes() var logRecord = logRecords[0]; var loggedException = logRecord.Exception; - OtlpLogs.LogRecord? otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); + var otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); Assert.NotNull(otlpLogRecord); var otlpLogRecordAttributes = otlpLogRecord.Attributes.ToString(); @@ -668,7 +671,7 @@ public void CheckToOtlpLogRecordRespectsAttributeLimits() logger.OpenTelemetryWithAttributes("I'm an attribute", "I too am an attribute", "I get dropped :("); var logRecord = logRecords[0]; - OtlpLogs.LogRecord? otlpLogRecord = ToOtlpLogs(sdkLimitOptions, new(), logRecord); + var otlpLogRecord = ToOtlpLogs(sdkLimitOptions, new(), logRecord); Assert.NotNull(otlpLogRecord); Assert.Equal(1u, otlpLogRecord.DroppedAttributesCount); @@ -781,7 +784,7 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsFalse_DoesNotContainScopeAttribu // Assert. var logRecord = logRecords.Single(); - OtlpLogs.LogRecord? otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); + var otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); Assert.NotNull(otlpLogRecord); var actualScope = TryGetAttribute(otlpLogRecord, expectedScopeKey); @@ -1367,11 +1370,11 @@ public void ValidateInstrumentationScope() Assert.Equal(2, logRecords.Count); - var batch = new Batch(logRecords.ToArray(), logRecords.Count); + var batch = new Batch([.. logRecords], logRecords.Count); var resourceBuilder = ResourceBuilder.CreateEmpty(); var processResource = CreateResourceSpans(resourceBuilder.Build()); - OtlpCollector.ExportLogsServiceRequest request = CreateLogsExportRequest(DefaultSdkLimitOptions, new ExperimentalOptions(), batch, resourceBuilder.Build()); + var request = CreateLogsExportRequest(DefaultSdkLimitOptions, new ExperimentalOptions(), batch, resourceBuilder.Build()); Assert.Single(request.ResourceLogs); @@ -1401,8 +1404,7 @@ public void ValidateInstrumentationScope() [InlineData("logging", false)] [InlineData(null, true)] [InlineData("logging", true)] - public void VerifyEnvironmentVariablesTakenFromIConfigurationWhenUsingLoggerFactoryCreate(string? optionsName, bool callUseOpenTelemetry) - { + public void VerifyEnvironmentVariablesTakenFromIConfigurationWhenUsingLoggerFactoryCreate(string? optionsName, bool callUseOpenTelemetry) => RunVerifyEnvironmentVariablesTakenFromIConfigurationTest( optionsName, configure => @@ -1419,15 +1421,13 @@ public void VerifyEnvironmentVariablesTakenFromIConfigurationWhenUsingLoggerFact return (factory, factory); }); - } [Theory] [InlineData(null, false)] [InlineData("logging", false)] [InlineData(null, true)] [InlineData("logging", true)] - public void VerifyEnvironmentVariablesTakenFromIConfigurationWhenUsingLoggingBuilder(string? optionsName, bool callUseOpenTelemetry) - { + public void VerifyEnvironmentVariablesTakenFromIConfigurationWhenUsingLoggingBuilder(string? optionsName, bool callUseOpenTelemetry) => RunVerifyEnvironmentVariablesTakenFromIConfigurationTest( optionsName, configure => @@ -1448,7 +1448,6 @@ public void VerifyEnvironmentVariablesTakenFromIConfigurationWhenUsingLoggingBui return (sp, factory); }); - } [Theory] [InlineData("my_instrumentation_scope_name", "my_instrumentation_scope_name")] @@ -1474,7 +1473,7 @@ public void LogRecordLoggerNameIsExportedWhenUsingBridgeApi(string? loggerName, Assert.Single(logRecords); var batch = new Batch([logRecords[0]], 1); - OtlpCollector.ExportLogsServiceRequest request = CreateLogsExportRequest(DefaultSdkLimitOptions, new ExperimentalOptions(), batch, ResourceBuilder.CreateEmpty().Build()); + var request = CreateLogsExportRequest(DefaultSdkLimitOptions, new ExperimentalOptions(), batch, ResourceBuilder.CreateEmpty().Build()); Assert.NotNull(request); Assert.Single(request.ResourceLogs); @@ -1511,7 +1510,7 @@ public void LogRecordEventNameIsExportedWhenUsingBridgeApi(bool emitEventName) Assert.Single(logRecords); var logRecord = logRecords[0]; - OtlpLogs.LogRecord? otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); + var otlpLogRecord = ToOtlpLogs(DefaultSdkLimitOptions, new ExperimentalOptions(), logRecord); Assert.NotNull(otlpLogRecord); Assert.Equal("test body", otlpLogRecord.Body.StringValue); @@ -1639,9 +1638,7 @@ private static void RunVerifyEnvironmentVariablesTakenFromIConfigurationTest( } private static OtlpCommon.KeyValue? TryGetAttribute(OtlpLogs.LogRecord record, string key) - { - return record.Attributes.FirstOrDefault(att => att.Key == key); - } + => record.Attributes.FirstOrDefault(att => att.Key == key); private static void ConfigureOtlpExporter( ILoggingBuilder builder, @@ -1723,7 +1720,7 @@ private static OtlpCollector.ExportLogsServiceRequest CreateLogsExportRequest(Sd private static ResourceSpans CreateResourceSpans(Resource resource) { - byte[] buffer = new byte[1024]; + var buffer = new byte[1024]; var writePosition = ProtobufOtlpResourceSerializer.WriteResource(buffer, 0, resource); ResourceSpans? resourceSpans; diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpMetricsExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpMetricsExporterTests.cs index 4e138ace4fb..2eae4129db0 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpMetricsExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpMetricsExporterTests.cs @@ -57,7 +57,7 @@ void CheckMetricReaderDefaults() var metricReader = typeof(MetricReader) .Assembly .GetType("OpenTelemetry.Metrics.MeterProviderSdk")? - .GetField("reader", bindingFlags)? + .GetProperty("Reader", bindingFlags)? .GetValue(meterProvider) as PeriodicExportingMetricReader; Assert.NotNull(metricReader); @@ -73,8 +73,8 @@ void CheckMetricReaderDefaults() [Fact] public void TestAddOtlpExporter_NamedOptions() { - int defaultExporterOptionsConfigureOptionsInvocations = 0; - int namedExporterOptionsConfigureOptionsInvocations = 0; + var defaultExporterOptionsConfigureOptionsInvocations = 0; + var namedExporterOptionsConfigureOptionsInvocations = 0; using var meterProvider = Sdk.CreateMeterProviderBuilder() .ConfigureServices(services => @@ -100,11 +100,11 @@ public void TestAddOtlpExporter_NamedOptions() [Fact] public void UserHttpFactoryCalled() { - OtlpExporterOptions options = new OtlpExporterOptions(); + var options = new OtlpExporterOptions(); var defaultFactory = options.HttpClientFactory; - int invocations = 0; + var invocations = 0; options.Protocol = OtlpExportProtocol.HttpProtobuf; options.HttpClientFactory = () => { @@ -142,7 +142,7 @@ public void ServiceProviderHttpClientFactoryInvoked() services.AddHttpClient(); - int invocations = 0; + var invocations = 0; services.AddHttpClient("OtlpMetricExporter", configureClient: (client) => invocations++); @@ -167,11 +167,10 @@ public void ToOtlpResourceMetricsTest(bool includeServiceNameInResource, string if (includeServiceNameInResource) { resourceBuilder.AddAttributes( - new List> - { + [ new KeyValuePair(ResourceSemanticConventions.AttributeServiceName, "service-name"), new KeyValuePair(ResourceSemanticConventions.AttributeServiceNamespace, "ns1"), - }); + ]); } var metrics = new List(); @@ -201,7 +200,7 @@ public void ToOtlpResourceMetricsTest(bool includeServiceNameInResource, string provider.ForceFlush(); - var batch = new Batch(metrics.ToArray(), metrics.Count); + var batch = new Batch([.. metrics], metrics.Count); var request = CreateMetricExportRequest(batch, resourceBuilder.Build()); Assert.Single(request.ResourceMetrics); @@ -257,7 +256,7 @@ public void TestGaugeToOtlpMetric(string name, string? description, string? unit provider.ForceFlush(); - var batch = new Batch(metrics.ToArray(), metrics.Count); + var batch = new Batch([.. metrics], metrics.Count); var request = CreateMetricExportRequest(batch, ResourceBuilder.CreateEmpty().Build()); @@ -323,7 +322,7 @@ public void TestCounterToOtlpMetric(string name, string? description, string? un }) .Build(); - var attributes = enableKeyValues ? KeyValues : Array.Empty>(); + var attributes = enableKeyValues ? KeyValues : []; if (longValue.HasValue) { var counter = meter.CreateCounter(name, unit, description); @@ -337,7 +336,7 @@ public void TestCounterToOtlpMetric(string name, string? description, string? un provider.ForceFlush(); - var batch = new Batch(metrics.ToArray(), metrics.Count); + var batch = new Batch([.. metrics], metrics.Count); var request = CreateMetricExportRequest(batch, ResourceBuilder.CreateEmpty().Build()); var resourceMetric = request.ResourceMetrics.Single(); @@ -418,7 +417,7 @@ public void TestUpDownCounterToOtlpMetric(string name, string? description, stri }) .Build(); - var attributes = enableKeyValues ? KeyValues : Array.Empty>(); + var attributes = enableKeyValues ? KeyValues : []; if (longValue.HasValue) { var counter = meter.CreateUpDownCounter(name, unit, description); @@ -432,7 +431,7 @@ public void TestUpDownCounterToOtlpMetric(string name, string? description, stri provider.ForceFlush(); - var batch = new Batch(metrics.ToArray(), metrics.Count); + var batch = new Batch([.. metrics], metrics.Count); var request = CreateMetricExportRequest(batch, ResourceBuilder.CreateEmpty().Build()); @@ -518,7 +517,7 @@ public void TestExponentialHistogramToOtlpMetric(string name, string? descriptio }) .Build(); - var attributes = enableKeyValues ? KeyValues : Array.Empty>(); + var attributes = enableKeyValues ? KeyValues : []; if (longValue.HasValue) { var histogram = meter.CreateHistogram(name, unit, description); @@ -534,7 +533,7 @@ public void TestExponentialHistogramToOtlpMetric(string name, string? descriptio provider.ForceFlush(); - var batch = new Batch(metrics.ToArray(), metrics.Count); + var batch = new Batch([.. metrics], metrics.Count); var request = CreateMetricExportRequest(batch, ResourceBuilder.CreateEmpty().Build()); var resourceMetric = request.ResourceMetrics.Single(); @@ -652,7 +651,7 @@ public void TestHistogramToOtlpMetric(string name, string? description, string? }) .Build(); - var attributes = enableKeyValues ? KeyValues : Array.Empty>(); + var attributes = enableKeyValues ? KeyValues : []; if (longValue.HasValue) { var histogram = meter.CreateHistogram(name, unit, description); @@ -666,7 +665,7 @@ public void TestHistogramToOtlpMetric(string name, string? description, string? provider.ForceFlush(); - var batch = new Batch(metrics.ToArray(), metrics.Count); + var batch = new Batch([.. metrics], metrics.Count); var request = CreateMetricExportRequest(batch, ResourceBuilder.CreateEmpty().Build()); var resourceMetric = request.ResourceMetrics.Single(); @@ -813,7 +812,7 @@ public void ToOtlpExemplarTests(bool enableTagFiltering, bool enableTracing) ? null : new MetricStreamConfiguration { - TagKeys = Array.Empty(), + TagKeys = [], }; }) .AddInMemoryExporter(exportedItems) @@ -838,7 +837,7 @@ public void ToOtlpExemplarTests(bool enableTagFiltering, bool enableTracing) meterProvider.ForceFlush(); - var batch = new Batch(exportedItems.ToArray(), exportedItems.Count); + var batch = new Batch([.. exportedItems], exportedItems.Count); var request = CreateMetricExportRequest(batch, ResourceBuilder.CreateEmpty().Build()); Assert.Single(request.ResourceMetrics); @@ -875,11 +874,11 @@ void AssertExemplars(T value, OtlpMetrics.Metric metric) } else { - byte[] traceIdBytes = new byte[16]; + var traceIdBytes = new byte[16]; Assert.NotNull(activity); activity.TraceId.CopyTo(traceIdBytes); - byte[] spanIdBytes = new byte[8]; + var spanIdBytes = new byte[8]; activity.SpanId.CopyTo(spanIdBytes); Assert.Equal(ByteString.CopyFrom(traceIdBytes), otlpExemplar.TraceId); @@ -938,7 +937,7 @@ public void MetricsSerialization_ExpandsBufferForMetricsAndSerializes() provider.ForceFlush(); - var batch = new Batch(metrics.ToArray(), metrics.Count); + var batch = new Batch([.. metrics], metrics.Count); var buffer = new byte[50]; var writePosition = ProtobufOtlpMetricSerializer.WriteMetricsData(ref buffer, 0, ResourceBuilder.CreateEmpty().Build(), in batch); diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpResourceTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpResourceTests.cs index 97d63f3a145..4f3cebb4f8f 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpResourceTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpResourceTests.cs @@ -25,7 +25,7 @@ public void ToOtlpResourceTest(bool includeServiceNameInResource) var resource = resourceBuilder.Build(); Proto.Resource.V1.Resource otlpResource; - byte[] buffer = new byte[1024]; + var buffer = new byte[1024]; var writePosition = ProtobufOtlpResourceSerializer.WriteResource(buffer, 0, resource); // Deserialize the ResourceSpans and validate the attributes. diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSecureHttpClientFactoryTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSecureHttpClientFactoryTests.cs index c68db2f4428..e34d2f75cc8 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSecureHttpClientFactoryTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSecureHttpClientFactoryTests.cs @@ -72,8 +72,7 @@ public void CreateHttpClient_ConfiguresClientCertificate_WhenValidCertificatePro } [Fact] - public void CreateHttpClient_ConfiguresServerCertificateValidation_WhenCaCertificatesProvided() - { + public void CreateHttpClient_ConfiguresServerCertificateValidation_WhenCaCertificatesProvided() => SkipTestIfCryptoNotSupported(() => { var tempTrustStoreFile = Path.GetTempFileName(); @@ -110,11 +109,9 @@ public void CreateHttpClient_ConfiguresServerCertificateValidation_WhenCaCertifi } } }); - } [Fact] - public void CreateHttpClient_ConfiguresServerValidation_WithCaOnly() - { + public void CreateHttpClient_ConfiguresServerValidation_WithCaOnly() => SkipTestIfCryptoNotSupported(() => { var tempTrustStoreFile = Path.GetTempFileName(); @@ -152,11 +149,9 @@ public void CreateHttpClient_ConfiguresServerValidation_WithCaOnly() } } }); - } [Fact] - public void CreateHttpClient_InvokesServerValidationCallbackAfterFactoryReturns() - { + public void CreateHttpClient_InvokesServerValidationCallbackAfterFactoryReturns() => SkipTestIfCryptoNotSupported(() => { var tempTrustStoreFile = Path.GetTempFileName(); @@ -202,7 +197,6 @@ public void CreateHttpClient_InvokesServerValidationCallbackAfterFactoryReturns( } } }); - } [Fact] public void ValidateServerCertificate_ReturnsTrue_WhenNoSslPolicyErrors() @@ -326,7 +320,7 @@ private static X509Certificate2 CreateSelfSignedCertificate() DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow.AddDays(30)); - return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); + return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), null, X509KeyStorageFlags.Exportable); } private static X509Certificate2 CreateCertificateAuthority() @@ -348,7 +342,7 @@ private static X509Certificate2 CreateCertificateAuthority() DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow.AddYears(1)); - return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); + return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), null, X509KeyStorageFlags.Exportable); } private static X509Certificate2 CreateServerCertificate(X509Certificate2 issuer) @@ -379,7 +373,7 @@ private static X509Certificate2 CreateServerCertificate(X509Certificate2 issuer) DateTimeOffset.UtcNow.AddDays(30), serialNumber); - return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); + return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), null, X509KeyStorageFlags.Exportable); } private static X509Certificate2 CreateExpiredCertificate() @@ -397,7 +391,7 @@ private static X509Certificate2 CreateExpiredCertificate() DateTimeOffset.UtcNow.AddDays(-30), DateTimeOffset.UtcNow.AddDays(-1)); - return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); + return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), null, X509KeyStorageFlags.Exportable); } private static string ExportCertificateWithPrivateKey(X509Certificate2 certificate) @@ -405,7 +399,7 @@ private static string ExportCertificateWithPrivateKey(X509Certificate2 certifica var builder = new StringBuilder(); builder.AppendLine(certificate.ExportCertificatePem().Trim()); - using RSA? privateKey = certificate.GetRSAPrivateKey(); + using var privateKey = certificate.GetRSAPrivateKey(); if (privateKey != null) { var pkcs8Bytes = privateKey.ExportPkcs8PrivateKey(); diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSpecConfigDefinitionTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSpecConfigDefinitionTests.cs index a2a2c4e193d..d64de24edbb 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSpecConfigDefinitionTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSpecConfigDefinitionTests.cs @@ -187,9 +187,7 @@ public TestData( public string ProtocolValue { get; } public IConfiguration ToConfiguration() - { - return this.AddToConfiguration(new ConfigurationBuilder()).Build(); - } + => this.AddToConfiguration(new ConfigurationBuilder()).Build(); public ConfigurationBuilder AddToConfiguration(ConfigurationBuilder configurationBuilder) { @@ -311,12 +309,14 @@ public void AssertMatches(MetricReaderOptions metricReaderOptions) if (!string.IsNullOrWhiteSpace(this.HistogramAggregationValue)) { +#pragma warning disable IDE0370 // Remove unnecessary suppression // Map spec-defined snake_case values to enum var expectedValue = this.HistogramAggregationValue!.Equals("base2_exponential_bucket_histogram", StringComparison.OrdinalIgnoreCase) ? MetricReaderHistogramAggregation.Base2ExponentialBucketHistogram : this.HistogramAggregationValue.Equals("explicit_bucket_histogram", StringComparison.OrdinalIgnoreCase) ? MetricReaderHistogramAggregation.ExplicitBucketHistogram : (MetricReaderHistogramAggregation?)null; +#pragma warning restore IDE0370 // Remove unnecessary suppression Assert.Equal(expectedValue, metricReaderOptions.DefaultHistogramAggregation); } diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTestHelpers.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTestHelpers.cs index 65a5bbd82ec..66e1584a233 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTestHelpers.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTestHelpers.cs @@ -14,8 +14,8 @@ public static void AssertOtlpAttributes( RepeatedField actual) { var expectedAttributes = expected.ToList(); - int expectedSize = 0; - for (int i = 0; i < expectedAttributes.Count; i++) + var expectedSize = 0; + for (var i = 0; i < expectedAttributes.Count; i++) { var current = expectedAttributes[i].Value; Assert.Equal(expectedAttributes[i].Key, actual[i].Key); @@ -70,7 +70,7 @@ public static void AssertOtlpAttributes( Assert.Equal(source.Length, actual[i].Value.ArrayValue.Values.Count); - for (int j = 0; j < source.Length; j++) + for (var j = 0; j < source.Length; j++) { var item = source.GetValue(j); diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTlsOptionsTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTlsOptionsTests.cs index 2986993eb1f..1b48dc1700b 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTlsOptionsTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTlsOptionsTests.cs @@ -53,8 +53,7 @@ public void OtlpMtlsOptions_IsMtlsEnabled_ReturnsFalse_WhenOnlyCaCertificateProv } [Fact] - public void OtlpSecureHttpClientFactory_CreatesClient_WithCaCertificateOnly() - { + public void OtlpSecureHttpClientFactory_CreatesClient_WithCaCertificateOnly() => SkipTestIfCryptoNotSupported(() => { var tempCertFile = Path.GetTempFileName(); @@ -81,11 +80,9 @@ public void OtlpSecureHttpClientFactory_CreatesClient_WithCaCertificateOnly() } } }); - } [Fact] - public void OtlpSecureHttpClientFactory_CreatesClient_WithMtlsClientCertificate() - { + public void OtlpSecureHttpClientFactory_CreatesClient_WithMtlsClientCertificate() => SkipTestIfCryptoNotSupported(() => { var tempCertFile = Path.GetTempFileName(); @@ -113,14 +110,11 @@ public void OtlpSecureHttpClientFactory_CreatesClient_WithMtlsClientCertificate( } } }); - } [Fact] - public void OtlpSecureHttpClientFactory_ThrowsArgumentNullException_WhenOptionsIsNull() - { + public void OtlpSecureHttpClientFactory_ThrowsArgumentNullException_WhenOptionsIsNull() => Assert.Throws(() => OpenTelemetryProtocol.Implementation.OtlpSecureHttpClientFactory.CreateSecureHttpClient(null!)); - } [Fact] public void OtlpSecureHttpClientFactory_ThrowsInvalidOperationException_WhenTlsNotEnabled() @@ -131,11 +125,9 @@ public void OtlpSecureHttpClientFactory_ThrowsInvalidOperationException_WhenTlsN } [Fact] - public void OtlpCertificateManager_LoadCaCertificate_ThrowsFileNotFoundException() - { + public void OtlpCertificateManager_LoadCaCertificate_ThrowsFileNotFoundException() => Assert.Throws(() => OpenTelemetryProtocol.Implementation.OtlpCertificateManager.LoadCaCertificate("/nonexistent/cert.pem")); - } [Fact] public void OtlpCertificateManager_ValidateServerCertificate_ReturnsTrue_WhenNoSslPolicyErrors() @@ -185,7 +177,7 @@ private static X509Certificate2 CreateSelfSignedCertificate() DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow.AddDays(30)); - return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); + return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), null, X509KeyStorageFlags.Exportable); } private static X509Certificate2 CreateCertificateAuthority() @@ -207,7 +199,7 @@ private static X509Certificate2 CreateCertificateAuthority() DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow.AddYears(1)); - return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); + return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), null, X509KeyStorageFlags.Exportable); } private static X509Certificate2 CreateServerCertificate(X509Certificate2 issuer) @@ -238,7 +230,7 @@ private static X509Certificate2 CreateServerCertificate(X509Certificate2 issuer) DateTimeOffset.UtcNow.AddDays(30), serialNumber); - return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable); + return X509CertificateLoader.LoadPkcs12(cert.Export(X509ContentType.Pfx), null, X509KeyStorageFlags.Exportable); } private static string ExportCertificateWithPrivateKey(X509Certificate2 certificate) @@ -246,7 +238,7 @@ private static string ExportCertificateWithPrivateKey(X509Certificate2 certifica var builder = new StringBuilder(); builder.AppendLine(certificate.ExportCertificatePem().Trim()); - using RSA? privateKey = certificate.GetRSAPrivateKey(); + using var privateKey = certificate.GetRSAPrivateKey(); if (privateKey != null) { var pkcs8Bytes = privateKey.ExportPkcs8PrivateKey(); diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs index 5cb06bfc5a6..c684990df63 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs @@ -36,7 +36,7 @@ public OtlpTraceExporterTests() this.activityListener = new ActivityListener { ShouldListenTo = _ => true, - Sample = (ref ActivityCreationOptions options) => options.Parent.TraceFlags.HasFlag(ActivityTraceFlags.Recorded) + Sample = (ref options) => options.Parent.TraceFlags.HasFlag(ActivityTraceFlags.Recorded) ? ActivitySamplingResult.AllDataAndRecorded : ActivitySamplingResult.AllData, }; @@ -45,15 +45,13 @@ public OtlpTraceExporterTests() } public void Dispose() - { - this.activityListener.Dispose(); - } + => this.activityListener.Dispose(); [Fact] public void AddOtlpTraceExporterNamedOptionsSupported() { - int defaultExporterOptionsConfigureOptionsInvocations = 0; - int namedExporterOptionsConfigureOptionsInvocations = 0; + var defaultExporterOptionsConfigureOptionsInvocations = 0; + var namedExporterOptionsConfigureOptionsInvocations = 0; using var tracerProvider = Sdk.CreateTracerProviderBuilder() .ConfigureServices(services => @@ -80,11 +78,11 @@ public void OtlpExporter_BadArgs() [Fact] public void UserHttpFactoryCalled() { - OtlpExporterOptions options = new OtlpExporterOptions(); + var options = new OtlpExporterOptions(); var defaultFactory = options.HttpClientFactory; - int invocations = 0; + var invocations = 0; options.Protocol = OtlpExportProtocol.HttpProtobuf; options.HttpClientFactory = () => { @@ -122,7 +120,7 @@ public void ServiceProviderHttpClientFactoryInvoked() services.AddHttpClient(); - int invocations = 0; + var invocations = 0; services.AddHttpClient("OtlpTraceExporter", configureClient: (client) => invocations++); @@ -175,11 +173,11 @@ public void ToOtlpResourceSpansTest(bool includeServiceNameInResource) var activityKind = isEven ? ActivityKind.Client : ActivityKind.Server; var activityTags = isEven ? evenTags : oddTags; - using Activity? activity = source.StartActivity($"span-{i}", activityKind, parentContext: default, activityTags); + using var activity = source.StartActivity($"span-{i}", activityKind, parentContext: default, activityTags); } Assert.Equal(10, exportedItems.Count); - var batch = new Batch(exportedItems.ToArray(), exportedItems.Count); + var batch = new Batch([.. exportedItems], exportedItems.Count); RunTest(DefaultSdkLimitOptions, batch); void RunTest(SdkLimitOptions sdkOptions, Batch batch) @@ -261,7 +259,7 @@ public void ScopeAttributesRemainConsistentAcrossMultipleBatches() nestedChildActivity?.Dispose(); Assert.Equal(2, exportedItems.Count); - var batch = new Batch(exportedItems.ToArray(), exportedItems.Count); + var batch = new Batch([.. exportedItems], exportedItems.Count); RunTest(DefaultSdkLimitOptions, batch, activitySourceWithTags); exportedItems.Clear(); @@ -270,7 +268,7 @@ public void ScopeAttributesRemainConsistentAcrossMultipleBatches() parentActivityNoTags?.Dispose(); Assert.Single(exportedItems); - batch = new Batch(exportedItems.ToArray(), exportedItems.Count); + batch = new Batch([.. exportedItems], exportedItems.Count); RunTest(DefaultSdkLimitOptions, batch, activitySourceWithoutTags); void RunTest(SdkLimitOptions sdkOptions, Batch batch, ActivitySource activitySource) @@ -344,7 +342,7 @@ public void ScopeSpansSchemaUrlTest(string? schemaUrl, string? expectedScopeSpan activity?.Stop(); Assert.Single(exportedItems); - var batch = new Batch(exportedItems.ToArray(), exportedItems.Count); + var batch = new Batch([.. exportedItems], exportedItems.Count); var request = CreateTraceExportRequest(DefaultSdkLimitOptions, batch, resourceBuilder.Build()); @@ -390,7 +388,7 @@ public void ScopeAttributesLimitsTest() activity?.Dispose(); Assert.Single(exportedItems); - var batch = new Batch(exportedItems.ToArray(), exportedItems.Count); + var batch = new Batch([.. exportedItems], exportedItems.Count); RunTest(sdkOptions, batch); void RunTest(SdkLimitOptions sdkOptions, Batch batch) @@ -541,7 +539,7 @@ public void ToOtlpSpanTest() var expectedEndTimeUnixNano = expectedStartTimeUnixNano + (duration.TotalMilliseconds * 1_000_000); Assert.Equal(expectedEndTimeUnixNano, otlpSpan.EndTimeUnixNano); - var childLinks = new List { new(rootActivity.Context, new ActivityTagsCollection(attributes)) }; + var childLinks = new List { new(rootActivity.Context, [with(attributes)]) }; var childActivity = activitySource.StartActivity( "child", ActivityKind.Client, @@ -552,7 +550,7 @@ public void ToOtlpSpanTest() childActivity.SetStatus(ActivityStatusCode.Error, new string('a', 150)); - var childEvents = new List { new("e0"), new("e1", default, new ActivityTagsCollection(attributes)) }; + var childEvents = new List { new("e0"), new("e1", default, [with(attributes)]) }; childActivity.AddEvent(childEvents[0]); childActivity.AddEvent(childEvents[1]); @@ -578,7 +576,7 @@ public void ToOtlpSpanTest() for (var i = 0; i < childEvents.Count; i++) { Assert.Equal(childEvents[i].Name, otlpSpan.Events[i].Name); - OtlpTestHelpers.AssertOtlpAttributes(childEvents[i].Tags.ToList(), otlpSpan.Events[i].Attributes); + OtlpTestHelpers.AssertOtlpAttributes([.. childEvents[i].Tags], otlpSpan.Events[i].Attributes); } childLinks.Reverse(); @@ -667,7 +665,7 @@ public void TracesSerialization_ExpandsBufferForTracesAndSerializes() var batch = new Batch([activity], 1); RunTest(new(), batch); - void RunTest(SdkLimitOptions sdkOptions, Batch batch) + static void RunTest(SdkLimitOptions sdkOptions, Batch batch) { var buffer = new byte[50]; var writePosition = ProtobufOtlpTraceSerializer.WriteTraceData(ref buffer, 0, sdkOptions, ResourceBuilder.CreateEmpty().Build(), batch); @@ -788,7 +786,7 @@ public void ToOtlpSpanTraceStateTest(bool traceStateWasSet) using var activitySource = new ActivitySource(nameof(this.ToOtlpSpanTest)); using var activity = activitySource.StartActivity("Name"); Assert.NotNull(activity); - string tracestate = "a=b;c=d"; + var tracestate = "a=b;c=d"; if (traceStateWasSet) { activity.TraceStateString = tracestate; @@ -813,11 +811,11 @@ public void UseOpenTelemetryProtocolActivityExporterWithCustomActivityProcessor( { const string ActivitySourceName = "otlp.test"; #pragma warning disable CA2000 // Dispose objects before losing scope - TestActivityProcessor testActivityProcessor = new TestActivityProcessor(); + var testActivityProcessor = new TestActivityProcessor(); #pragma warning restore CA2000 // Dispose objects before losing scope - bool startCalled = false; - bool endCalled = false; + var startCalled = false; + var endCalled = false; testActivityProcessor.StartAction = (a) => @@ -860,8 +858,7 @@ public void Shutdown_ClientShutdownIsCalled() } [Fact] - public void Null_BatchExportProcessorOptions_SupportedTest() - { + public void Null_BatchExportProcessorOptions_SupportedTest() => Sdk.CreateTracerProviderBuilder() .AddOtlpExporter( o => @@ -870,7 +867,6 @@ public void Null_BatchExportProcessorOptions_SupportedTest() o.ExportProcessorType = ExportProcessorType.Batch; o.BatchExportProcessorOptions = null!; }); - } [Fact] public void NonnamedOptionsMutateSharedInstanceTest() @@ -973,7 +969,7 @@ public void SpanFlagsTest(bool isRecorded, bool isRemote) { using var activitySource = new ActivitySource(nameof(this.SpanFlagsTest)); - ActivityContext ctx = new ActivityContext( + var ctx = new ActivityContext( ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), isRecorded ? ActivityTraceFlags.Recorded : ActivityTraceFlags.None, @@ -987,7 +983,7 @@ public void SpanFlagsTest(bool isRecorded, bool isRemote) Assert.NotNull(otlpSpan); var flags = (OtlpTrace.SpanFlags)otlpSpan.Flags; - ActivityTraceFlags traceFlags = (ActivityTraceFlags)(flags & OtlpTrace.SpanFlags.TraceFlagsMask); + var traceFlags = (ActivityTraceFlags)(flags & OtlpTrace.SpanFlags.TraceFlagsMask); if (isRecorded) { @@ -1019,7 +1015,7 @@ public void SpanLinkFlagsTest(bool isRecorded, bool isRemote) { using var activitySource = new ActivitySource(nameof(this.SpanLinkFlagsTest)); - ActivityContext ctx = new ActivityContext( + var ctx = new ActivityContext( ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), isRecorded ? ActivityTraceFlags.Recorded : ActivityTraceFlags.None, @@ -1040,7 +1036,7 @@ public void SpanLinkFlagsTest(bool isRecorded, bool isRemote) var flags = (OtlpTrace.SpanFlags)spanLink.Flags; - ActivityTraceFlags traceFlags = (ActivityTraceFlags)(flags & OtlpTrace.SpanFlags.TraceFlagsMask); + var traceFlags = (ActivityTraceFlags)(flags & OtlpTrace.SpanFlags.TraceFlagsMask); if (isRecorded) { diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/TestHttpMessageHandler.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/TestHttpMessageHandler.cs index 980d17bad14..45c612e6c80 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/TestHttpMessageHandler.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/TestHttpMessageHandler.cs @@ -19,20 +19,16 @@ public HttpResponseMessage InternalSend(HttpRequestMessage request, Cancellation #if NET this.HttpRequestContent = request.Content!.ReadAsByteArrayAsync(cancellationToken).Result; #else - this.HttpRequestContent = request.Content!.ReadAsByteArrayAsync().Result; + this.HttpRequestContent = request.Content.ReadAsByteArrayAsync().Result; #endif return new HttpResponseMessage(); } #if NET protected override HttpResponseMessage Send(HttpRequestMessage request, CancellationToken cancellationToken) - { - return this.InternalSend(request, cancellationToken); - } + => this.InternalSend(request, cancellationToken); #endif protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - return Task.FromResult(this.InternalSend(request, cancellationToken)); - } + => Task.FromResult(this.InternalSend(request, cancellationToken)); } diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/UseOtlpExporterExtensionTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/UseOtlpExporterExtensionTests.cs index 424a9922cba..4aefa00fcd6 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/UseOtlpExporterExtensionTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/UseOtlpExporterExtensionTests.cs @@ -21,9 +21,7 @@ public UseOtlpExporterExtensionTests() } public void Dispose() - { - OtlpSpecConfigDefinitionTests.ClearEnvVars(); - } + => OtlpSpecConfigDefinitionTests.ClearEnvVars(); [Fact] public void UseOtlpExporterDefaultTest() @@ -204,9 +202,9 @@ public void UseOtlpExporterMultipleCallsTest() using var sp = services.BuildServiceProvider(); - Assert.Throws(() => sp.GetRequiredService()); - Assert.Throws(() => sp.GetRequiredService()); - Assert.Throws(() => sp.GetRequiredService()); + Assert.Throws(sp.GetRequiredService); + Assert.Throws(sp.GetRequiredService); + Assert.Throws(sp.GetRequiredService); } [Fact] @@ -220,7 +218,7 @@ public void UseOtlpExporterWithAddOtlpExporterLoggingTest() using var sp = services.BuildServiceProvider(); - Assert.Throws(() => sp.GetRequiredService()); + Assert.Throws(sp.GetRequiredService); } [Fact] @@ -234,7 +232,7 @@ public void UseOtlpExporterWithAddOtlpExporterMetricsTest() using var sp = services.BuildServiceProvider(); - Assert.Throws(() => sp.GetRequiredService()); + Assert.Throws(sp.GetRequiredService); } [Fact] @@ -248,7 +246,7 @@ public void UseOtlpExporterWithAddOtlpExporterTracingTest() using var sp = services.BuildServiceProvider(); - Assert.Throws(() => sp.GetRequiredService()); + Assert.Throws(sp.GetRequiredService); } [Fact] diff --git a/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/PrometheusExporterMeterProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/PrometheusExporterMeterProviderBuilderExtensionsTests.cs index 726b0820d04..0c805f071f1 100644 --- a/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/PrometheusExporterMeterProviderBuilderExtensionsTests.cs +++ b/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/PrometheusExporterMeterProviderBuilderExtensionsTests.cs @@ -12,8 +12,8 @@ public sealed class PrometheusExporterMeterProviderBuilderExtensionsTests [Fact] public void TestAddPrometheusExporter_NamedOptions() { - int defaultExporterOptionsConfigureOptionsInvocations = 0; - int namedExporterOptionsConfigureOptionsInvocations = 0; + var defaultExporterOptionsConfigureOptionsInvocations = 0; + var namedExporterOptionsConfigureOptionsInvocations = 0; using var meterProvider = Sdk.CreateMeterProviderBuilder() .ConfigureServices(services => diff --git a/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/PrometheusExporterMiddlewareTests.cs b/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/PrometheusExporterMiddlewareTests.cs index c0ae96f5770..e7eac55d992 100644 --- a/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/PrometheusExporterMiddlewareTests.cs +++ b/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/PrometheusExporterMiddlewareTests.cs @@ -117,7 +117,7 @@ public Task PrometheusExporterMiddlewareIntegration_MixedPredicateAndPath() services => services.Configure(o => o.ScrapeEndpointPath = "/metrics_options"), validateResponse: rsp => { - if (!rsp.Headers.TryGetValues("X-MiddlewareExecuted", out IEnumerable? headers)) + if (!rsp.Headers.TryGetValues("X-MiddlewareExecuted", out var headers)) { headers = []; } @@ -144,7 +144,7 @@ public Task PrometheusExporterMiddlewareIntegration_MixedPath() services => services.Configure(o => o.ScrapeEndpointPath = "/metrics_options"), validateResponse: rsp => { - if (!rsp.Headers.TryGetValues("X-MiddlewareExecuted", out IEnumerable? headers)) + if (!rsp.Headers.TryGetValues("X-MiddlewareExecuted", out var headers)) { headers = []; } @@ -156,7 +156,7 @@ public Task PrometheusExporterMiddlewareIntegration_MixedPath() [Fact] public async Task PrometheusExporterMiddlewareIntegration_MeterProvider() { - using MeterProvider meterProvider = Sdk.CreateMeterProviderBuilder() + using var meterProvider = Sdk.CreateMeterProviderBuilder() .AddMeter(MeterName) .ConfigureResource(x => x.Clear().AddService("my_service", serviceInstanceId: "id1")) .AddPrometheusExporter() @@ -220,7 +220,7 @@ public Task PrometheusExporterMiddlewareIntegration_MapEndpoint_WithPathNamedOpt [Fact] public async Task PrometheusExporterMiddlewareIntegration_MapEndpoint_WithMeterProvider() { - using MeterProvider meterProvider = Sdk.CreateMeterProviderBuilder() + using var meterProvider = Sdk.CreateMeterProviderBuilder() .AddMeter(MeterName) .ConfigureResource(x => x.Clear().AddService("my_service", serviceInstanceId: "id1")) .AddPrometheusExporter() @@ -445,11 +445,11 @@ private static async Task VerifyAsync(long beginTimestamp, long endTimestamp, Ht ? $"{string.Join(",", meterTags.Select(x => $"{x.Key}=\"{x.Value}\""))}," : string.Empty; - string content = (await response.Content.ReadAsStringAsync()).ReplaceLineEndings(); + var content = (await response.Content.ReadAsStringAsync()).ReplaceLineEndings(); var timestampPart = disableTimestamp ? string.Empty : " (\\d+)"; var timestampPartOpenMetrics = disableTimestamp ? string.Empty : " (\\d+\\.\\d{3})"; - string expected = requestOpenMetrics + var expected = requestOpenMetrics ? $$""" # TYPE target info # HELP target Target metadata diff --git a/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusCollectionManagerTests.cs b/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusCollectionManagerTests.cs index ca33a4f3d5a..e5330bb00b6 100644 --- a/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusCollectionManagerTests.cs +++ b/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusCollectionManagerTests.cs @@ -22,7 +22,7 @@ public async Task EnterExitCollectTest(int scrapeResponseCacheDurationMillisecon var testTimeout = TimeSpan.FromMinutes(1); using var cts = new CancellationTokenSource(testTimeout); - bool cacheEnabled = scrapeResponseCacheDurationMilliseconds != 0; + var cacheEnabled = scrapeResponseCacheDurationMilliseconds != 0; using var meter = new Meter(Utils.GetCurrentMethodName()); using (var provider = Sdk.CreateMeterProviderBuilder() @@ -41,11 +41,11 @@ public async Task EnterExitCollectTest(int scrapeResponseCacheDurationMillisecon throw new InvalidOperationException("PrometheusExporter could not be found on MeterProvider."); } - int runningCollectCount = 0; + var runningCollectCount = 0; var collectFunc = exporter.Collect; exporter.Collect = (timeout) => { - bool result = collectFunc!(timeout); + var result = collectFunc!(timeout); runningCollectCount++; cts.Token.ThrowIfCancellationRequested(); @@ -114,9 +114,9 @@ async Task[]> CollectInParallelAsync(bool advanceClock) return [.. bag.Select((r) => Task.FromResult(r))]; #else - Task[] tasks = new Task[parallelism]; + var tasks = new Task[parallelism]; - for (int i = 0; i < tasks.Length; i++) + for (var i = 0; i < tasks.Length; i++) { tasks[i] = Task.Run(() => CollectAsync(advanceClock), cts.Token); } @@ -140,7 +140,7 @@ async Task[]> CollectInParallelAsync(bool advanceClock) Assert.False(firstResponse.CollectionResponse.FromCache, "Response was served from the cache."); - for (int i = 1; i < collectTasks.Length; i++) + for (var i = 1; i < collectTasks.Length; i++) { var response = await collectTasks[i]; @@ -195,7 +195,7 @@ async Task[]> CollectInParallelAsync(bool advanceClock) Assert.False(firstResponse.CollectionResponse.FromCache, "Response was served from the cache."); - for (int i = 1; i < collectTasks.Length; i++) + for (var i = 1; i < collectTasks.Length; i++) { var response = await collectTasks[i]; diff --git a/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusHttpListenerMeterProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusHttpListenerMeterProviderBuilderExtensionsTests.cs index af08063e267..8acb015d5a9 100644 --- a/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusHttpListenerMeterProviderBuilderExtensionsTests.cs +++ b/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusHttpListenerMeterProviderBuilderExtensionsTests.cs @@ -12,8 +12,8 @@ public sealed class PrometheusHttpListenerMeterProviderBuilderExtensionsTests [Fact] public void TestAddPrometheusHttpListener_NamedOptions() { - int defaultExporterOptionsConfigureOptionsInvocations = 0; - int namedExporterOptionsConfigureOptionsInvocations = 0; + var defaultExporterOptionsConfigureOptionsInvocations = 0; + var namedExporterOptionsConfigureOptionsInvocations = 0; using var meterProvider = Sdk.CreateMeterProviderBuilder() .ConfigureServices(services => diff --git a/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusHttpListenerTests.cs b/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusHttpListenerTests.cs index c584ecc64cc..9213b747155 100644 --- a/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusHttpListenerTests.cs +++ b/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusHttpListenerTests.cs @@ -30,64 +30,48 @@ public class PrometheusHttpListenerTests [InlineData("http://example.com", "https://example.com", "http://127.0.0.1")] [InlineData("http://example.com")] public void UriPrefixesPositiveTest(params string[] uriPrefixes) - { - TestPrometheusHttpListenerUriPrefixOptions(uriPrefixes); - } + => TestPrometheusHttpListenerUriPrefixOptions(uriPrefixes); [Fact] - public void UriPrefixesNull() - { + public void UriPrefixesNull() => Assert.Throws(() => { TestPrometheusHttpListenerUriPrefixOptions(null!); }); - } [Fact] - public void UriPrefixesEmptyList() - { + public void UriPrefixesEmptyList() => Assert.Throws(() => { TestPrometheusHttpListenerUriPrefixOptions([]); }); - } [Fact] - public void UriPrefixesInvalid() - { + public void UriPrefixesInvalid() => Assert.Throws(() => { TestPrometheusHttpListenerUriPrefixOptions(["ftp://example.com"]); }); - } [Theory] [InlineData(true)] [InlineData(false)] public async Task PrometheusExporterHttpServerIntegration(bool disableTimestamp) - { - await RunPrometheusExporterHttpServerIntegrationTest(disableTimestamp: disableTimestamp); - } + => await RunPrometheusExporterHttpServerIntegrationTest(disableTimestamp: disableTimestamp); [Fact] public async Task PrometheusExporterHttpServerIntegration_NoMetrics() - { - await RunPrometheusExporterHttpServerIntegrationTest(skipMetrics: true); - } + => await RunPrometheusExporterHttpServerIntegrationTest(skipMetrics: true); [Theory] [InlineData(true)] [InlineData(false)] public async Task PrometheusExporterHttpServerIntegration_NoOpenMetrics(bool disableTimestamp) - { - await RunPrometheusExporterHttpServerIntegrationTest(acceptHeader: string.Empty, disableTimestamp: disableTimestamp); - } + => await RunPrometheusExporterHttpServerIntegrationTest(acceptHeader: string.Empty, disableTimestamp: disableTimestamp); [Fact] public async Task PrometheusExporterHttpServerIntegration_UseOpenMetricsVersionHeader() - { - await RunPrometheusExporterHttpServerIntegrationTest(acceptHeader: "application/openmetrics-text; version=1.0.0"); - } + => await RunPrometheusExporterHttpServerIntegrationTest(acceptHeader: "application/openmetrics-text; version=1.0.0"); [Fact] public async Task PrometheusExporterHttpServerIntegration_NoOpenMetrics_WithMeterTags() @@ -116,8 +100,8 @@ public async Task PrometheusExporterHttpServerIntegration_OpenMetrics_WithMeterT [Fact] public void PrometheusHttpListenerThrowsOnStart() { - Random random = new Random(); - int retryAttempts = 5; + var random = new Random(); + var retryAttempts = 5; string? address = null; PrometheusExporter? exporter = null; @@ -127,7 +111,7 @@ public void PrometheusHttpListenerThrowsOnStart() while (retryAttempts-- != 0) { #pragma warning disable CA5394 // Do not use insecure randomness - int port = random.Next(2000, 5000); + var port = random.Next(2000, 5000); #pragma warning restore CA5394 // Do not use insecure randomness address = $"http://localhost:{port}/"; @@ -196,7 +180,7 @@ public async Task PrometheusExporterHttpServerIntegration_TestBufferSizeIncrease counter.Add(1); } - using HttpClient client = new HttpClient(); + using var client = new HttpClient(); if (!string.IsNullOrEmpty(acceptHeader)) { @@ -226,15 +210,15 @@ private static void TestPrometheusHttpListenerUriPrefixOptions(string[] uriPrefi private static MeterProvider BuildMeterProvider(Meter meter, IEnumerable> attributes, out string address, bool disableTimestamp = false) { - Random random = new Random(); - int retryAttempts = 5; + var random = new Random(); + var retryAttempts = 5; string? generatedAddress = null; MeterProvider? provider = null; while (retryAttempts-- != 0) { #pragma warning disable CA5394 // Do not use insecure randomness - int port = random.Next(2000, 5000); + var port = random.Next(2000, 5000); #pragma warning restore CA5394 // Do not use insecure randomness generatedAddress = $"http://localhost:{port}/"; @@ -284,7 +268,7 @@ private static async Task RunPrometheusExporterHttpServerIntegrationTest(bool sk counter.Add(0.99D, counterTags); } - using HttpClient client = new HttpClient(); + using var client = new HttpClient(); if (!string.IsNullOrEmpty(acceptHeader)) { @@ -300,11 +284,11 @@ private static async Task RunPrometheusExporterHttpServerIntegrationTest(bool sk if (requestOpenMetrics) { - Assert.Equal("application/openmetrics-text; version=1.0.0; charset=utf-8", response.Content.Headers.ContentType!.ToString()); + Assert.Equal("application/openmetrics-text; version=1.0.0; charset=utf-8", response.Content.Headers.ContentType?.ToString()); } else { - Assert.Equal("text/plain; charset=utf-8; version=0.0.4", response.Content.Headers.ContentType!.ToString()); + Assert.Equal("text/plain; charset=utf-8; version=0.0.4", response.Content.Headers.ContentType?.ToString()); } var additionalTags = meterTags is { Length: > 0 } diff --git a/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusMetricTests.cs b/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusMetricTests.cs index dbf996173c1..4612f75e80b 100644 --- a/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusMetricTests.cs +++ b/test/OpenTelemetry.Exporter.Prometheus.HttpListener.Tests/PrometheusMetricTests.cs @@ -26,243 +26,162 @@ public static TheoryData GetPrometheusType_Data() [Fact] public void SanitizeMetricName_Valid() - { - AssertSanitizeMetricName("active_directory_ds_replication_network_io", "active_directory_ds_replication_network_io"); - } + => AssertSanitizeMetricName("active_directory_ds_replication_network_io", "active_directory_ds_replication_network_io"); [Fact] public void SanitizeMetricName_RemoveConsecutiveUnderscores() - { - AssertSanitizeMetricName("cpu_sp__d_hertz", "cpu_sp_d_hertz"); - } + => AssertSanitizeMetricName("cpu_sp__d_hertz", "cpu_sp_d_hertz"); [Fact] public void SanitizeMetricName_SupportLeadingAndTrailingUnderscores() - { - AssertSanitizeMetricName("_cpu_speed_hertz_", "_cpu_speed_hertz_"); - } + => AssertSanitizeMetricName("_cpu_speed_hertz_", "_cpu_speed_hertz_"); [Fact] public void SanitizeMetricName_RemoveUnsupportedCharacters() - { - AssertSanitizeMetricName("metric_unit_$1000", "metric_unit_1000"); - } + => AssertSanitizeMetricName("metric_unit_$1000", "metric_unit_1000"); [Fact] public void SanitizeMetricName_RemoveWhitespace() - { - AssertSanitizeMetricName("unit include", "unit_include"); - } + => AssertSanitizeMetricName("unit include", "unit_include"); [Fact] public void SanitizeMetricName_RemoveMultipleUnsupportedChracters() - { - AssertSanitizeMetricName("sample_me%%$$$_count_ !!@unit include", "sample_me_count_unit_include"); - } + => AssertSanitizeMetricName("sample_me%%$$$_count_ !!@unit include", "sample_me_count_unit_include"); [Fact] public void SanitizeMetricName_RemoveStartingNumber() - { - AssertSanitizeMetricName("1_some_metric_name", "_some_metric_name"); - } + => AssertSanitizeMetricName("1_some_metric_name", "_some_metric_name"); [Fact] public void SanitizeMetricName_SupportColon() - { - AssertSanitizeMetricName("sample_metric_name__:_per_meter", "sample_metric_name_:_per_meter"); - } + => AssertSanitizeMetricName("sample_metric_name__:_per_meter", "sample_metric_name_:_per_meter"); [Fact] public void Unit_Annotation_None() - { - Assert.Equal("Test", PrometheusMetric.RemoveAnnotations("Test")); - } + => Assert.Equal("Test", PrometheusMetric.RemoveAnnotations("Test")); [Fact] public void Unit_Annotation_RemoveLeading() - { - Assert.Equal("%", PrometheusMetric.RemoveAnnotations("%{percentage}")); - } + => Assert.Equal("%", PrometheusMetric.RemoveAnnotations("%{percentage}")); [Fact] public void Unit_Annotation_RemoveTrailing() - { - Assert.Equal("%", PrometheusMetric.RemoveAnnotations("{percentage}%")); - } + => Assert.Equal("%", PrometheusMetric.RemoveAnnotations("{percentage}%")); [Fact] public void Unit_Annotation_RemoveLeadingAndTrailing() - { - Assert.Equal("%", PrometheusMetric.RemoveAnnotations("{percentage}%{percentage}")); - } + => Assert.Equal("%", PrometheusMetric.RemoveAnnotations("{percentage}%{percentage}")); [Fact] public void Unit_Annotation_RemoveMiddle() - { - Assert.Equal("startend", PrometheusMetric.RemoveAnnotations("start{percentage}end")); - } + => Assert.Equal("startend", PrometheusMetric.RemoveAnnotations("start{percentage}end")); [Fact] public void Unit_Annotation_RemoveEverything() - { - Assert.Equal(string.Empty, PrometheusMetric.RemoveAnnotations("{percentage}")); - } + => Assert.Equal(string.Empty, PrometheusMetric.RemoveAnnotations("{percentage}")); [Fact] public void Unit_Annotation_Multiple_RemoveEverything() - { - Assert.Equal(string.Empty, PrometheusMetric.RemoveAnnotations("{one}{two}")); - } + => Assert.Equal(string.Empty, PrometheusMetric.RemoveAnnotations("{one}{two}")); [Fact] public void Unit_Annotation_NoClose() - { - Assert.Equal("{one", PrometheusMetric.RemoveAnnotations("{one")); - } + => Assert.Equal("{one", PrometheusMetric.RemoveAnnotations("{one")); [Fact] public void Unit_AnnotationMismatch_NoClose() - { - Assert.Equal("}", PrometheusMetric.RemoveAnnotations("{{one}}")); - } + => Assert.Equal("}", PrometheusMetric.RemoveAnnotations("{{one}}")); [Fact] public void Unit_AnnotationMismatch_Close() - { - Assert.Equal(string.Empty, PrometheusMetric.RemoveAnnotations("{{one}")); - } + => Assert.Equal(string.Empty, PrometheusMetric.RemoveAnnotations("{{one}")); [Fact] public void Name_GaugeWithUnit_NoAppendRatio() - { - AssertName("sample", "unit", PrometheusType.Gauge, false, "sample_unit"); - } + => AssertName("sample", "unit", PrometheusType.Gauge, false, "sample_unit"); [Fact] public void Name_SpecialCaseCounter_AppendTotal() - { - AssertName("sample", "unit", PrometheusType.Counter, false, "sample_unit_total"); - } + => AssertName("sample", "unit", PrometheusType.Counter, false, "sample_unit_total"); [Fact] public void Name_SpecialCaseCounterWithoutUnit_DropUnitAppendTotal() - { - AssertName("sample", "1", PrometheusType.Counter, false, "sample_total"); - } + => AssertName("sample", "1", PrometheusType.Counter, false, "sample_total"); [Fact] public void Name_DisableTotalSuffixAddition_TotalNotAppended() - { - AssertName("sample", "1", PrometheusType.Counter, true, "sample"); - } + => AssertName("sample", "1", PrometheusType.Counter, true, "sample"); [Fact] public void Name_TotalSuffixAlreadyPresent_DisableTotalSuffixAddition_TotalNotRemoved() - { - AssertName("sample_total", "1", PrometheusType.Counter, true, "sample_total"); - } + => AssertName("sample_total", "1", PrometheusType.Counter, true, "sample_total"); [Fact] public void Name_SpecialCaseCounterWithNumber_AppendTotal() - { - AssertName("sample", "2", PrometheusType.Counter, false, "sample_2_total"); - } + => AssertName("sample", "2", PrometheusType.Counter, false, "sample_2_total"); [Fact] public void Name_UnsupportedMetricNameChars_Drop() - { - AssertName("s%%ple", "%/m", PrometheusType.Summary, false, "s_ple_percent_per_minute"); - } + => AssertName("s%%ple", "%/m", PrometheusType.Summary, false, "s_ple_percent_per_minute"); [Fact] public void Name_UnitOtherThanOne_Normal() - { - AssertName("metric_name", "2", PrometheusType.Summary, false, "metric_name_2"); - } + => AssertName("metric_name", "2", PrometheusType.Summary, false, "metric_name_2"); [Fact] public void Name_UnitAlreadyPresentInName_NotAppended() - { - AssertName("metric_name_total", "total", PrometheusType.Counter, false, "metric_name_total"); - } + => AssertName("metric_name_total", "total", PrometheusType.Counter, false, "metric_name_total"); [Fact] public void Name_UnitAlreadyPresentInName_TotalNonCounterType_NotAppended() - { - AssertName("metric_name_total", "total", PrometheusType.Summary, false, "metric_name_total"); - } + => AssertName("metric_name_total", "total", PrometheusType.Summary, false, "metric_name_total"); [Fact] public void Name_UnitAlreadyPresentInName_CustomGauge_NotAppended() - { - AssertName("metric_hertz", "hertz", PrometheusType.Gauge, false, "metric_hertz"); - } + => AssertName("metric_hertz", "hertz", PrometheusType.Gauge, false, "metric_hertz"); [Fact] public void Name_UnitAlreadyPresentInName_CustomCounter_NotAppended() - { - AssertName("metric_hertz_total", "hertz_total", PrometheusType.Counter, false, "metric_hertz_total"); - } + => AssertName("metric_hertz_total", "hertz_total", PrometheusType.Counter, false, "metric_hertz_total"); [Fact] public void Name_UnitAlreadyPresentInName_OrderMatters_Appended() - { - AssertName("metric_total_hertz", "hertz_total", PrometheusType.Counter, false, "metric_total_hertz_hertz_total"); - } + => AssertName("metric_total_hertz", "hertz_total", PrometheusType.Counter, false, "metric_total_hertz_hertz_total"); [Fact] public void Name_StartWithNumber_UnderscoreStart() - { - AssertName("2_metric_name", "By", PrometheusType.Summary, false, "_metric_name_bytes"); - } + => AssertName("2_metric_name", "By", PrometheusType.Summary, false, "_metric_name_bytes"); [Fact] public void OpenMetricsName_UnitAlreadyPresentInName_Appended() - { - AssertOpenMetricsName("db_bytes_written", "By", PrometheusType.Gauge, false, "db_bytes_written_bytes"); - } + => AssertOpenMetricsName("db_bytes_written", "By", PrometheusType.Gauge, false, "db_bytes_written_bytes"); [Fact] public void OpenMetricsName_SuffixedWithUnit_NotAppended() - { - AssertOpenMetricsName("db_written_bytes", "By", PrometheusType.Gauge, false, "db_written_bytes"); - } + => AssertOpenMetricsName("db_written_bytes", "By", PrometheusType.Gauge, false, "db_written_bytes"); [Fact] public void OpenMetricsName_Counter_AppendTotal() - { - AssertOpenMetricsName("db_bytes_written", "By", PrometheusType.Counter, false, "db_bytes_written_bytes_total"); - } + => AssertOpenMetricsName("db_bytes_written", "By", PrometheusType.Counter, false, "db_bytes_written_bytes_total"); [Fact] public void OpenMetricsName_Counter_DisableSuffixTotal_AppendTotal() - { - AssertOpenMetricsName("db_bytes_written", "By", PrometheusType.Counter, true, "db_bytes_written_bytes_total"); - } + => AssertOpenMetricsName("db_bytes_written", "By", PrometheusType.Counter, true, "db_bytes_written_bytes_total"); [Fact] public void OpenMetricsName_CounterSuffixedWithTotal_AppendUnitAndTotal() - { - AssertOpenMetricsName("db_bytes_written_total", "By", PrometheusType.Counter, false, "db_bytes_written_bytes_total"); - } + => AssertOpenMetricsName("db_bytes_written_total", "By", PrometheusType.Counter, false, "db_bytes_written_bytes_total"); [Fact] public void OpenMetricsName_CounterSuffixedWithTotal_DisableSuffixTotal_AppendTotal() - { - AssertOpenMetricsName("db_bytes_written_total", "By", PrometheusType.Counter, false, "db_bytes_written_bytes_total"); - } + => AssertOpenMetricsName("db_bytes_written_total", "By", PrometheusType.Counter, false, "db_bytes_written_bytes_total"); [Fact] - public void OpenMetricsMetadataName_Counter_NotAppendTotal() - { - AssertOpenMetricsMetadataName("db_bytes_written", "By", PrometheusType.Counter, false, "db_bytes_written_bytes"); - } + public void OpenMetricsMetadataName_Counter_NotAppendTotal() => AssertOpenMetricsMetadataName("db_bytes_written", "By", PrometheusType.Counter, false, "db_bytes_written_bytes"); [Fact] public void OpenMetricsMetadataName_Counter_DisableSuffixTotal_NotAppendTotal() - { - AssertOpenMetricsMetadataName("db_bytes_written", "By", PrometheusType.Counter, true, "db_bytes_written_bytes"); - } + => AssertOpenMetricsMetadataName("db_bytes_written", "By", PrometheusType.Counter, true, "db_bytes_written_bytes"); [Theory] [MemberData(nameof(GetPrometheusType_Data))] @@ -280,10 +199,7 @@ public void GetPrometheusType_MapsOpenTelemetryMetricsTypeToPrometheus(MetricsMa [InlineData("ms", "milliseconds")] [InlineData("us", "microseconds")] [InlineData("ns", "nanoseconds")] - public void Name_TimeUnits_MappedCorrectly(string unit, string expectedUnit) - { - AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); - } + public void Name_TimeUnits_MappedCorrectly(string unit, string expectedUnit) => AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); [Theory] [InlineData("By", "bytes")] @@ -300,10 +216,7 @@ public void Name_TimeUnits_MappedCorrectly(string unit, string expectedUnit) [InlineData("MB", "megabytes")] [InlineData("GB", "gigabytes")] [InlineData("TB", "terabytes")] - public void Name_ByteUnits_MappedCorrectly(string unit, string expectedUnit) - { - AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); - } + public void Name_ByteUnits_MappedCorrectly(string unit, string expectedUnit) => AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); [Theory] [InlineData("m", "meters")] @@ -312,26 +225,17 @@ public void Name_ByteUnits_MappedCorrectly(string unit, string expectedUnit) [InlineData("J", "joules")] [InlineData("W", "watts")] [InlineData("g", "grams")] - public void Name_SIUnits_MappedCorrectly(string unit, string expectedUnit) - { - AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); - } + public void Name_SIUnits_MappedCorrectly(string unit, string expectedUnit) => AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); [Theory] [InlineData("Cel", "celsius")] [InlineData("Hz", "hertz")] [InlineData("%", "percent")] [InlineData("$", "dollars")] - public void Name_MiscUnits_MappedCorrectly(string unit, string expectedUnit) - { - AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); - } + public void Name_MiscUnits_MappedCorrectly(string unit, string expectedUnit) => AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); [Fact] - public void Name_UnknownUnit_UsedAsIs() - { - AssertName("metric", "custom_unit", PrometheusType.Gauge, false, "metric_custom_unit"); - } + public void Name_UnknownUnit_UsedAsIs() => AssertName("metric", "custom_unit", PrometheusType.Gauge, false, "metric_custom_unit"); [Theory] [InlineData("requests/s", "requests_per_second")] @@ -342,37 +246,22 @@ public void Name_UnknownUnit_UsedAsIs() [InlineData("tasks/w", "tasks_per_week")] [InlineData("jobs/mo", "jobs_per_month")] [InlineData("cycles/y", "cycles_per_year")] - public void Name_RateUnits_MappedCorrectly(string unit, string expectedUnit) - { - AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); - } + public void Name_RateUnits_MappedCorrectly(string unit, string expectedUnit) => AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); [Theory] [InlineData("By/s", "bytes_per_second")] [InlineData("ms/m", "milliseconds_per_minute")] [InlineData("%/h", "percent_per_hour")] - public void Name_RateUnitsWithMapping_MappedCorrectly(string unit, string expectedUnit) - { - AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); - } + public void Name_RateUnitsWithMapping_MappedCorrectly(string unit, string expectedUnit) => AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); [Fact] - public void Name_UnitWithAnnotations_AnnotationsRemoved() - { - AssertName("metric", "{packet}By", PrometheusType.Gauge, false, "metric_bytes"); - } + public void Name_UnitWithAnnotations_AnnotationsRemoved() => AssertName("metric", "{packet}By", PrometheusType.Gauge, false, "metric_bytes"); [Fact] - public void Name_ComplexUnitWithAnnotations_AnnotationsRemoved() - { - AssertName("metric", "{CPU}%{usage}", PrometheusType.Gauge, false, "metric_percent"); - } + public void Name_ComplexUnitWithAnnotations_AnnotationsRemoved() => AssertName("metric", "{CPU}%{usage}", PrometheusType.Gauge, false, "metric_percent"); [Fact] - public void Name_EmptyUnit_NoSuffixAdded() - { - AssertName("metric", string.Empty, PrometheusType.Gauge, false, "metric"); - } + public void Name_EmptyUnit_NoSuffixAdded() => AssertName("metric", string.Empty, PrometheusType.Gauge, false, "metric"); [Fact] public void Name_NullUnit_NoSuffixAdded() @@ -398,20 +287,14 @@ public void Constructor_VerifiesAllProperties() [InlineData("events/quarter", "events_per_quarter")] [InlineData("packets/tick", "packets_per_tick")] [InlineData("items/unknown_unit", "items_per_unknown_unit")] - public void Name_RateUnitsWithUnknownPerUnit_UsedAsIs(string unit, string expectedUnit) - { - // Per units not in the known list (s, m, h, d, w, mo, y) should be used as-is - AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); - } + public void Name_RateUnitsWithUnknownPerUnit_UsedAsIs(string unit, string expectedUnit) => + AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); // Per units not in the known list (s, m, h, d, w, mo, y) should be used as-is [Theory] [InlineData("By/custom", "bytes_per_custom")] [InlineData("%/unknown", "percent_per_unknown")] - public void Name_RateUnitsWithMappedNumeratorAndUnknownDenominator_MapsCorrectly(string unit, string expectedUnit) - { - // Numerator should be mapped, denominator used as-is if unknown - AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); - } + public void Name_RateUnitsWithMappedNumeratorAndUnknownDenominator_MapsCorrectly(string unit, string expectedUnit) => + AssertName("metric", unit, PrometheusType.Gauge, false, $"metric_{expectedUnit}"); // Numerator should be mapped, denominator used as-is if unknown [Fact] public void Name_UntypedMetricType_WorksCorrectly() @@ -431,12 +314,10 @@ public void Name_SummaryMetricType_WorksCorrectly() Assert.Equal(PrometheusType.Summary, metric.Type); } + // Summary metrics should not have _total appended even if not already present [Fact] public void Name_SummaryWithTotal_DoesNotAppendTotal() - { - // Summary metrics should not have _total appended even if not already present - AssertName("requests", "1", PrometheusType.Summary, false, "requests"); - } + => AssertName("requests", "1", PrometheusType.Summary, false, "requests"); [Fact] public void GetPrometheusType_Summary_ReturnsSummary() @@ -450,7 +331,7 @@ public void GetPrometheusType_Summary_ReturnsSummary() public void GetPrometheusType_Untyped_ReturnsUntyped() { // MetricType enum value that maps to Untyped (case 0 in switch) - var result = PrometheusMetric.GetPrometheusType((MetricType)0x00); + var result = PrometheusMetric.GetPrometheusType(0); Assert.Equal(PrometheusType.Untyped, result); } @@ -480,10 +361,7 @@ public void GetPrometheusType_HistogramVariants_ReturnsHistogram(int metricTypeV [Fact] public void Name_MultipleSlashesInUnit_FirstSlashProcessed() - { - // Multiple slashes - AssertName("metric", "req/s/extra", PrometheusType.Gauge, false, "metric_req_per_s/extra"); - } + => AssertName("metric", "req/s/extra", PrometheusType.Gauge, false, "metric_req_per_s/extra"); // // Multiple slashes [Theory] [InlineData(PrometheusType.Counter)] diff --git a/test/OpenTelemetry.Exporter.Zipkin.Tests/Implementation/ZipkinActivityConversionTests.cs b/test/OpenTelemetry.Exporter.Zipkin.Tests/Implementation/ZipkinActivityConversionTests.cs index 723e113da71..357bb91f007 100644 --- a/test/OpenTelemetry.Exporter.Zipkin.Tests/Implementation/ZipkinActivityConversionTests.cs +++ b/test/OpenTelemetry.Exporter.Zipkin.Tests/Implementation/ZipkinActivityConversionTests.cs @@ -31,7 +31,7 @@ public void ToZipkinSpan_AllPropertiesSet() Assert.Equal(activity.StartTimeUtc.ToEpochMicroseconds(), zipkinSpan.Timestamp); Assert.Equal((long)(activity.Duration.TotalMilliseconds * 1000), zipkinSpan.Duration); - int counter = 0; + var counter = 0; var tagsArray = zipkinSpan.Tags.ToArray(); foreach (var tags in activity.TagObjects) @@ -61,7 +61,7 @@ public void ToZipkinSpan_NoEvents() Assert.Equal(activity.TraceId.ToHexString(), zipkinSpan.TraceId); Assert.Equal(activity.SpanId.ToHexString(), zipkinSpan.Id); - int counter = 0; + var counter = 0; var tagsArray = zipkinSpan.Tags.ToArray(); foreach (var tags in activity.TagObjects) diff --git a/test/OpenTelemetry.Exporter.Zipkin.Tests/PooledListTests.cs b/test/OpenTelemetry.Exporter.Zipkin.Tests/PooledListTests.cs index 19b7e3f0378..129259a6b1a 100644 --- a/test/OpenTelemetry.Exporter.Zipkin.Tests/PooledListTests.cs +++ b/test/OpenTelemetry.Exporter.Zipkin.Tests/PooledListTests.cs @@ -51,7 +51,7 @@ public void Verify_AllocatedSize() // The Add() method has a condition to double the size of the buffer // when the Count exceeds the buffer size. // This for loop is meant to trigger that condition. - for (int i = 0; i <= size; i++) + for (var i = 0; i <= size; i++) { PooledList.Add(ref pooledList, i); } diff --git a/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinActivitySource.cs b/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinActivitySource.cs index f638a99f52b..bfb01cd4304 100644 --- a/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinActivitySource.cs +++ b/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinActivitySource.cs @@ -26,7 +26,7 @@ internal static Activity CreateTestActivity( using var activityListener = new ActivityListener { ShouldListenTo = _ => true, - Sample = (ref ActivityCreationOptions options) => options.Parent.TraceFlags.HasFlag(ActivityTraceFlags.Recorded) + Sample = (ref options) => options.Parent.TraceFlags.HasFlag(ActivityTraceFlags.Recorded) ? ActivitySamplingResult.AllDataAndRecorded : ActivitySamplingResult.AllData, }; @@ -72,17 +72,17 @@ internal static Activity CreateTestActivity( new( "Event1", eventTimestamp, - new(new Dictionary + [with(new Dictionary { { "key", "value" }, - })), + })]), new( "Event2", eventTimestamp, - new(new Dictionary + [with(new Dictionary { { "key", "value" }, - })), + })]), }; var linkedSpanId = ActivitySpanId.CreateFromString("888915b6286b9c41".AsSpan()); @@ -106,7 +106,7 @@ internal static Activity CreateTestActivity( parentContext: new(traceId, parentSpanId, ActivityTraceFlags.Recorded), tags, links, - startTime: startTimestamp)!; + startTime: startTimestamp); Assert.NotNull(activity); diff --git a/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinExporterTests.cs b/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinExporterTests.cs index f4b3f113ac7..4e5cc98e8c7 100644 --- a/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinExporterTests.cs +++ b/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinExporterTests.cs @@ -37,7 +37,7 @@ static ZipkinExporterTests() public ZipkinExporterTests() { this.testServer = TestHttpServer.RunServer( - ctx => ProcessServerRequest(ctx), + ProcessServerRequest, out this.testServerHost, out this.testServerPort); @@ -47,7 +47,7 @@ static void ProcessServerRequest(HttpListenerContext context) using StreamReader readStream = new(context.Request.InputStream); - string requestContent = readStream.ReadToEnd(); + var requestContent = readStream.ReadToEnd(); Responses.TryAdd( Guid.Parse(context.Request.QueryString["requestId"]!), @@ -58,15 +58,13 @@ static void ProcessServerRequest(HttpListenerContext context) } public void Dispose() - { - this.testServer.Dispose(); - } + => this.testServer.Dispose(); [Fact] public void AddAddZipkinExporterNamedOptionsSupported() { - int defaultExporterOptionsConfigureOptionsInvocations = 0; - int namedExporterOptionsConfigureOptionsInvocations = 0; + var defaultExporterOptionsConfigureOptionsInvocations = 0; + var namedExporterOptionsConfigureOptionsInvocations = 0; using var tracerProvider = Sdk.CreateTracerProviderBuilder() .ConfigureServices(services => @@ -94,12 +92,12 @@ public void BadArgs() public void SuppressesInstrumentation() { const string activitySourceName = "zipkin.test"; - Guid requestId = Guid.NewGuid(); + var requestId = Guid.NewGuid(); #pragma warning disable CA2000 // Dispose objects before losing scope TestActivityProcessor testActivityProcessor = new(); #pragma warning restore CA2000 // Dispose objects before losing scope - int endCalledCount = 0; + var endCalledCount = 0; testActivityProcessor.EndAction = (a) => @@ -213,7 +211,7 @@ public void UserHttpFactoryCalled() var defaultFactory = options.HttpClientFactory; - int invocations = 0; + var invocations = 0; options.HttpClientFactory = () => { invocations++; @@ -260,7 +258,7 @@ public void ServiceProviderHttpClientFactoryInvoked() services.AddHttpClient(); - int invocations = 0; + var invocations = 0; services.AddHttpClient("ZipkinExporter", configureClient: (client) => invocations++); @@ -329,7 +327,7 @@ public void IntegrationTest( string? statusDescription = null, bool addErrorTag = false) { - Guid requestId = Guid.NewGuid(); + var requestId = Guid.NewGuid(); #pragma warning disable CA2000 // Dispose objects before losing scope ZipkinExporter exporter = new( @@ -399,7 +397,7 @@ public void IntegrationTest( var traceId = useShortTraceIds ? TraceId.Substring(TraceId.Length - 16, 16) : TraceId; string statusTag; - string errorTag = string.Empty; + var errorTag = string.Empty; switch (statusCode) { case ActivityStatusCode.Ok: diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryMetricsBuilderExtensionsTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryMetricsBuilderExtensionsTests.cs index be91bcbf334..9537be95f57 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryMetricsBuilderExtensionsTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryMetricsBuilderExtensionsTests.cs @@ -327,7 +327,7 @@ public void ReloadOfMetricsViaIConfigurationWithoutExportCleanupTest(bool useWit public void WhenOpenTelemetrySdkIsDisabledExceptionNotThrown() { // Arrange - string meterName = "TestMeter"; + var meterName = "TestMeter"; using (new EnvironmentVariableScope("OTEL_SDK_DISABLED", "true")) { diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs index 44b717cbb51..7f95d8cc6b4 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs @@ -32,7 +32,7 @@ public async Task AddOpenTelemetry_StartWithoutProvidersDoesNotThrow() [Fact] public async Task AddOpenTelemetry_StartWithExceptionsThrows() { - bool expectedInnerExceptionThrown = false; + var expectedInnerExceptionThrown = false; var builder = new HostBuilder().ConfigureServices(services => { @@ -92,7 +92,7 @@ public void AddOpenTelemetry_WithTracing_DisposalTest() { var services = new ServiceCollection(); - bool testRun = false; + var testRun = false; services.AddOpenTelemetry().WithTracing(builder => { @@ -124,7 +124,7 @@ public void AddOpenTelemetry_WithTracing_DisposalTest() [Fact] public async Task AddOpenTelemetry_WithTracing_HostConfigurationHonoredTest() { - bool configureBuilderCalled = false; + var configureBuilderCalled = false; var builder = new HostBuilder() .ConfigureAppConfiguration(builder => @@ -171,7 +171,7 @@ public async Task AddOpenTelemetry_WithTracing_HostConfigurationHonoredTest() [Fact] public void AddOpenTelemetry_WithTracing_NestedResolutionUsingConfigureTest() { - bool innerTestExecuted = false; + var innerTestExecuted = false; var services = new ServiceCollection(); @@ -215,7 +215,7 @@ public void AddOpenTelemetry_WithMetrics_DisposalTest() { var services = new ServiceCollection(); - bool testRun = false; + var testRun = false; services.AddOpenTelemetry().WithMetrics(builder => { @@ -247,7 +247,7 @@ public void AddOpenTelemetry_WithMetrics_DisposalTest() [Fact] public async Task AddOpenTelemetry_WithMetrics_HostConfigurationHonoredTest() { - bool configureBuilderCalled = false; + var configureBuilderCalled = false; var builder = new HostBuilder() .ConfigureAppConfiguration(builder => @@ -294,7 +294,7 @@ public async Task AddOpenTelemetry_WithMetrics_HostConfigurationHonoredTest() [Fact] public void AddOpenTelemetry_WithMetrics_NestedResolutionUsingConfigureTest() { - bool innerTestExecuted = false; + var innerTestExecuted = false; var services = new ServiceCollection(); @@ -338,7 +338,7 @@ public void AddOpenTelemetry_WithLogging_DisposalTest() { var services = new ServiceCollection(); - bool testRun = false; + var testRun = false; services.AddOpenTelemetry().WithLogging(builder => { @@ -370,7 +370,7 @@ public void AddOpenTelemetry_WithLogging_DisposalTest() [Fact] public void AddOpenTelemetry_WithLogging_HostConfigurationHonoredTest() { - bool configureBuilderCalled = false; + var configureBuilderCalled = false; var builder = new HostBuilder() .ConfigureAppConfiguration(builder => @@ -411,7 +411,7 @@ public void AddOpenTelemetry_WithLogging_HostConfigurationHonoredTest() [Fact] public void AddOpenTelemetry_WithLogging_NestedResolutionUsingConfigureTest() { - bool innerTestExecuted = false; + var innerTestExecuted = false; var services = new ServiceCollection(); @@ -460,7 +460,7 @@ public async Task AddOpenTelemetry_HostedServiceOrder_DoesNotMatter() .Single(); // Give the background service some time to run. - await Task.WhenAny(service.ExecuteTask!, Task.Delay(TimeSpan.FromSeconds(5))); + await Task.WhenAny(service.ExecuteTask!, Task.Delay(TimeSpan.FromSeconds(5), CancellationToken.None)); await host.StopAsync(); diff --git a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/W3CTraceContextTests.cs b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/W3CTraceContextTests.cs index c6db5a8c752..f541ba32d9a 100644 --- a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/W3CTraceContextTests.cs +++ b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/W3CTraceContextTests.cs @@ -39,7 +39,9 @@ public W3CTraceContextTests(ITestOutputHelper output) [SkipUnlessEnvVarFoundTheory(W3CTraceContextEnvVarName)] [InlineData("placeholder")] [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "xUnit1026:Theory methods should use all of their parameters", Justification = "Need to use SkipUnlessEnvVarFoundTheory")] +#pragma warning disable IDE0060 // Remove unused parameter public async Task W3CTraceContextTestSuiteAsync(string value) +#pragma warning restore IDE0060 // Remove unused parameter { // configure SDK using var tracerProvider = Sdk.CreateTracerProviderBuilder() @@ -78,7 +80,7 @@ public async Task W3CTraceContextTestSuiteAsync(string value) // Assert // TODO: after W3C Trace Context test suite passes, it might go in standard output - string lastLine = ParseLastLine(stderr); + var lastLine = ParseLastLine(stderr); this.output.WriteLine("[stderr]" + stderr); this.output.WriteLine("[stdout]" + stdout); @@ -88,9 +90,7 @@ public async Task W3CTraceContextTestSuiteAsync(string value) } public void Dispose() - { - this.httpClient.Dispose(); - } + => this.httpClient.Dispose(); private static async Task<(string StdOut, string StdErr)> RunCommand(string command, string args) { @@ -173,8 +173,8 @@ private static string ParseLastLine(string output) await Task.WhenAll(processErrors, processOutput); - string error = string.Empty; - string output = string.Empty; + var error = string.Empty; + var output = string.Empty; if (processErrors.Status == TaskStatus.RanToCompletion) { diff --git a/test/OpenTelemetry.Shims.OpenTracing.Tests/IntegrationTests.cs b/test/OpenTelemetry.Shims.OpenTracing.Tests/IntegrationTests.cs index a5ad1d33244..23b34ffd58b 100644 --- a/test/OpenTelemetry.Shims.OpenTracing.Tests/IntegrationTests.cs +++ b/test/OpenTelemetry.Shims.OpenTracing.Tests/IntegrationTests.cs @@ -4,7 +4,6 @@ using System.Diagnostics; using OpenTelemetry.Context.Propagation; using OpenTelemetry.Trace; -using OpenTracing; using Xunit; namespace OpenTelemetry.Shims.OpenTracing.Tests; @@ -68,12 +67,10 @@ public void WithActivities( using (var parentActivity = parentActivitySource.StartActivity(ParentActivityName)) { - using (IScope parentScope = otTracer.BuildSpan(ShimActivityName).StartActive()) - { - parentScope.Span.SetTag("parent", true); + using var parentScope = otTracer.BuildSpan(ShimActivityName).StartActive(); + parentScope.Span.SetTag("parent", true); - using var childActivity = childActivitySource.StartActivity(ChildActivityName); - } + using var childActivity = childActivitySource.StartActivity(ChildActivityName); } var expectedExportedSpans = new string?[] @@ -85,7 +82,7 @@ public void WithActivities( .Where(s => s is not null) .ToList(); - for (int i = 0; i < expectedExportedSpans.Count; i++) + for (var i = 0; i < expectedExportedSpans.Count; i++) { Assert.Equal(expectedExportedSpans[i], exportedSpans[i].DisplayName); } @@ -109,9 +106,7 @@ public TestSampler(Func shouldSampleDelega } public override SamplingResult ShouldSample(in SamplingParameters samplingParameters) - { - return new SamplingResult(this.shouldSampleDelegate(samplingParameters)); - } + => new(this.shouldSampleDelegate(samplingParameters)); } } diff --git a/test/OpenTelemetry.Shims.OpenTracing.Tests/ListenAndSampleAllActivitySourcesFixture.cs b/test/OpenTelemetry.Shims.OpenTracing.Tests/ListenAndSampleAllActivitySourcesFixture.cs index 5240385d83b..64a567f3a1f 100644 --- a/test/OpenTelemetry.Shims.OpenTracing.Tests/ListenAndSampleAllActivitySourcesFixture.cs +++ b/test/OpenTelemetry.Shims.OpenTracing.Tests/ListenAndSampleAllActivitySourcesFixture.cs @@ -19,7 +19,7 @@ public ListenAndSampleAllActivitySourcesFixture() this.listener = new ActivityListener { ShouldListenTo = _ => true, - Sample = (ref ActivityCreationOptions options) => ActivitySamplingResult.AllDataAndRecorded, + Sample = (ref options) => ActivitySamplingResult.AllDataAndRecorded, }; ActivitySource.AddActivityListener(this.listener); diff --git a/test/OpenTelemetry.Shims.OpenTracing.Tests/SpanShimTests.cs b/test/OpenTelemetry.Shims.OpenTracing.Tests/SpanShimTests.cs index bb33f45bdd6..27ca35ea4f4 100644 --- a/test/OpenTelemetry.Shims.OpenTracing.Tests/SpanShimTests.cs +++ b/test/OpenTelemetry.Shims.OpenTracing.Tests/SpanShimTests.cs @@ -16,9 +16,7 @@ public class SpanShimTests [Fact] public void CtorArgumentValidation() - { - Assert.Throws(() => new SpanShim(null!)); - } + => Assert.Throws(() => new SpanShim(null!)); [Fact] public void SpanContextIsNotNull() @@ -124,16 +122,16 @@ public void LogUsingFields() Assert.Throws(() => shim.Log((IEnumerable>)null!)); - shim.Log(new List> - { + shim.Log( + [ new("foo", "bar"), - }); + ]); // "event" is a special event name - shim.Log(new List> - { + shim.Log( + [ new("event", "foo"), - }); + ]); Assert.NotNull(shim.Span.Activity); @@ -158,16 +156,10 @@ public void LogUsingFieldsWithExplicitTimestamp() Assert.Throws(() => shim.Log((IEnumerable>)null!)); var now = DateTimeOffset.UtcNow; - shim.Log(now, new List> - { - new("foo", "bar"), - }); + shim.Log(now, [new("foo", "bar")]); // "event" is a special event name - shim.Log(now, new List> - { - new("event", "foo"), - }); + shim.Log(now, [new("event", "foo")]); Assert.NotNull(shim.Span.Activity); Assert.Equal(2, shim.Span.Activity.Events.Count()); diff --git a/test/OpenTelemetry.Shims.OpenTracing.Tests/TracerShimTests.cs b/test/OpenTelemetry.Shims.OpenTracing.Tests/TracerShimTests.cs index 0fb2c90b1ba..b0caec2ddb7 100644 --- a/test/OpenTelemetry.Shims.OpenTracing.Tests/TracerShimTests.cs +++ b/test/OpenTelemetry.Shims.OpenTracing.Tests/TracerShimTests.cs @@ -146,7 +146,7 @@ private static void AssertOpenTracerSpanContextEqual(SpanContextShim source, ISp /// private sealed class TextMapCarrier : ITextMap { - private readonly Dictionary map = new(); + private readonly Dictionary map = []; public IDictionary Map => this.map; diff --git a/test/OpenTelemetry.Tests.Stress.Metrics/Program.cs b/test/OpenTelemetry.Tests.Stress.Metrics/Program.cs index dd46a5aa853..20c3e84f09b 100644 --- a/test/OpenTelemetry.Tests.Stress.Metrics/Program.cs +++ b/test/OpenTelemetry.Tests.Stress.Metrics/Program.cs @@ -20,9 +20,7 @@ private enum MetricsStressTestType } public static int Main(string[] args) - { - return StressTestFactory.RunSynchronously(args); - } + => StressTestFactory.RunSynchronously(args); #pragma warning disable CA1812 // Avoid uninstantiated internal classes private sealed class MetricsStressTest : StressTests @@ -40,7 +38,7 @@ private sealed class MetricsStressTest : StressTests static MetricsStressTest() { - for (int i = 0; i < ArraySize; i++) + for (var i = 0; i < ArraySize; i++) { DimensionValues[i] = $"DimValue{i}"; } @@ -99,7 +97,12 @@ protected override void WriteRunInformationToConsole() protected override void RunWorkItemInParallel() { +#if NET var random = ThreadLocalRandom.Value!; +#else + var random = ThreadLocalRandom.Value; +#endif + if (this.Options.TestType == MetricsStressTestType.Histogram) { TestHistogram.Record( diff --git a/test/OpenTelemetry.Tests.Stress/StressTestNativeMethods.cs b/test/OpenTelemetry.Tests.Stress/StressTestNativeMethods.cs index 8222c9dc9fc..40098ae0279 100644 --- a/test/OpenTelemetry.Tests.Stress/StressTestNativeMethods.cs +++ b/test/OpenTelemetry.Tests.Stress/StressTestNativeMethods.cs @@ -8,22 +8,12 @@ namespace OpenTelemetry.Tests.Stress; internal static class StressTestNativeMethods { public static ulong GetCpuCycles() - { - if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - return 0; - } - - if (!QueryProcessCycleTime((IntPtr)(-1), out var cycles)) - { - return 0; - } - - return cycles; - } + => !RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? 0 : !QueryProcessCycleTime(new(-1), out var cycles) ? 0 : cycles; +#pragma warning disable SYSLIB1054 // Use 'LibraryImportAttribute' instead of 'DllImportAttribute' to generate P/Invoke marshalling code at compile time [DllImport("kernel32.dll")] [DefaultDllImportSearchPaths(DllImportSearchPath.System32)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool QueryProcessCycleTime(IntPtr hProcess, out ulong cycles); +#pragma warning restore SYSLIB1054 // Use 'LibraryImportAttribute' instead of 'DllImportAttribute' to generate P/Invoke marshalling code at compile time } diff --git a/test/OpenTelemetry.Tests.Stress/StressTests.cs b/test/OpenTelemetry.Tests.Stress/StressTests.cs index 4a39deb0427..8c6cb3bbff6 100644 --- a/test/OpenTelemetry.Tests.Stress/StressTests.cs +++ b/test/OpenTelemetry.Tests.Stress/StressTests.cs @@ -109,20 +109,21 @@ public void RunSynchronously() { var key = Console.ReadKey(true).Key; - switch (key) + if (key is ConsoleKey.Enter) { - case ConsoleKey.Enter: - Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "{0} {1}", DateTime.UtcNow.ToString("O"), this.output)); - break; - case ConsoleKey.Escape: - this.bContinue = false; - return; - case ConsoleKey.Spacebar: - bOutput = !bOutput; - break; + Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "{0} {1}", DateTime.UtcNow.ToString("O"), this.output)); + break; + } + else if (key is ConsoleKey.Escape) + { + this.bContinue = false; + return; + } + else if (key is ConsoleKey.Spacebar) + { + bOutput = !bOutput; + break; } - - continue; } if (bOutput) @@ -134,20 +135,20 @@ public void RunSynchronously() Console.SetCursorPosition(tempCursorLeft, tempCursorTop); } - var cntLoopsOld = (ulong)statistics.Select(data => data.Count).Sum(); + var cntLoopsOld = (ulong)statistics.Sum(data => data.Count); var cntCpuCyclesOld = StressTestNativeMethods.GetCpuCycles(); watch.Restart(); Thread.Sleep(200); watch.Stop(); - cntLoopsTotal = (ulong)statistics.Select(data => data.Count).Sum(); + cntLoopsTotal = (ulong)statistics.Sum(data => data.Count); var cntCpuCyclesNew = StressTestNativeMethods.GetCpuCycles(); var nLoops = cntLoopsTotal - cntLoopsOld; var nCpuCycles = cntCpuCyclesNew - cntCpuCyclesOld; - dLoopsPerSecond = (double)nLoops / ((double)watch.ElapsedMilliseconds / 1000.0); + dLoopsPerSecond = nLoops / (watch.ElapsedMilliseconds / 1000.0); dCpuCyclesPerLoop = nLoops == 0 ? 0 : nCpuCycles / nLoops; var totalElapsedTime = watchForTotal.Elapsed; @@ -184,8 +185,8 @@ public void RunSynchronously() }); watchForTotal.Stop(); - cntLoopsTotal = (ulong)statistics.Select(data => data.Count).Sum(); - var totalLoopsPerSecond = (double)cntLoopsTotal / ((double)watchForTotal.ElapsedMilliseconds / 1000.0); + cntLoopsTotal = (ulong)statistics.Sum(data => data.Count); + var totalLoopsPerSecond = cntLoopsTotal / (watchForTotal.ElapsedMilliseconds / 1000.0); var cntCpuCyclesTotal = StressTestNativeMethods.GetCpuCycles(); var cpuCyclesPerLoopTotal = cntLoopsTotal == 0 ? 0 : cntCpuCyclesTotal / cntLoopsTotal; Console.WriteLine("Stopping the stress test..."); diff --git a/test/OpenTelemetry.Tests/Internal/AssemblyVersionExtensionsTests.cs b/test/OpenTelemetry.Tests/Internal/AssemblyVersionExtensionsTests.cs index fd8f682af1e..465f9a554e1 100644 --- a/test/OpenTelemetry.Tests/Internal/AssemblyVersionExtensionsTests.cs +++ b/test/OpenTelemetry.Tests/Internal/AssemblyVersionExtensionsTests.cs @@ -28,8 +28,9 @@ public void ParseAssemblyInformationalVersionTests(string informationalVersion, private sealed class TestAssembly(string informationalVersion) : Assembly { public override object[] GetCustomAttributes(Type attributeType, bool inherit) - { - return new Attribute[] { new AssemblyInformationalVersionAttribute(informationalVersion) }; - } + => this.GetAttributes(); + + private AssemblyInformationalVersionAttribute[] GetAttributes() + => [new AssemblyInformationalVersionAttribute(informationalVersion)]; } } diff --git a/test/OpenTelemetry.Tests/Internal/CircularBufferTests.cs b/test/OpenTelemetry.Tests/Internal/CircularBufferTests.cs index bb45f1707f0..ea6e6adf090 100644 --- a/test/OpenTelemetry.Tests/Internal/CircularBufferTests.cs +++ b/test/OpenTelemetry.Tests/Internal/CircularBufferTests.cs @@ -16,7 +16,7 @@ public void CheckInvalidArgument() [Fact] public void CheckCapacity() { - int capacity = 1; + var capacity = 1; var circularBuffer = new CircularBuffer(capacity); Assert.Equal(capacity, circularBuffer.Capacity); @@ -25,7 +25,7 @@ public void CheckCapacity() [Fact] public void CheckValueWhenAdding() { - int capacity = 1; + var capacity = 1; var circularBuffer = new CircularBuffer(capacity); var result = circularBuffer.Add("a"); Assert.True(result); @@ -36,7 +36,7 @@ public void CheckValueWhenAdding() [Fact] public void CheckBufferFull() { - int capacity = 1; + var capacity = 1; var circularBuffer = new CircularBuffer(capacity); var result = circularBuffer.Add("a"); Assert.True(result); @@ -52,15 +52,15 @@ public void CheckBufferFull() [Fact] public void CheckRead() { - string value = "a"; - int capacity = 1; + var value = "a"; + var capacity = 1; var circularBuffer = new CircularBuffer(capacity); var result = circularBuffer.Add(value); Assert.True(result); Assert.Equal(1, circularBuffer.AddedCount); Assert.Equal(1, circularBuffer.Count); - string read = circularBuffer.Read(); + var read = circularBuffer.Read(); Assert.Equal(value, read); Assert.Equal(1, circularBuffer.AddedCount); Assert.Equal(1, circularBuffer.RemovedCount); @@ -70,7 +70,7 @@ public void CheckRead() [Fact] public void CheckAddedCountAndCount() { - int capacity = 2; + var capacity = 2; var circularBuffer = new CircularBuffer(capacity); var result = circularBuffer.Add("a"); Assert.True(result); @@ -98,13 +98,13 @@ public async Task CpuPressureTest() var circularBuffer = new CircularBuffer(2048); - List tasks = new(); + List tasks = []; - int numberOfItemsPerWorker = 100_000; + var numberOfItemsPerWorker = 100_000; - for (int i = 0; i < Environment.ProcessorCount; i++) + for (var i = 0; i < Environment.ProcessorCount; i++) { - int tid = i; + var tid = i; tasks.Add(Task.Run(async () => { @@ -112,7 +112,7 @@ public async Task CpuPressureTest() if (tid == 0) { - for (int i = 0; i < numberOfItemsPerWorker * (Environment.ProcessorCount - 1); i++) + for (var i = 0; i < numberOfItemsPerWorker * (Environment.ProcessorCount - 1); i++) { SpinWait wait = default; while (true) @@ -129,7 +129,7 @@ public async Task CpuPressureTest() } else { - for (int i = 0; i < numberOfItemsPerWorker; i++) + for (var i = 0; i < numberOfItemsPerWorker; i++) { SpinWait wait = default; while (true) diff --git a/test/OpenTelemetry.Tests/Internal/JsonStringArrayTagWriterTests.cs b/test/OpenTelemetry.Tests/Internal/JsonStringArrayTagWriterTests.cs index ac67d026c19..2c1cdbabf69 100644 --- a/test/OpenTelemetry.Tests/Internal/JsonStringArrayTagWriterTests.cs +++ b/test/OpenTelemetry.Tests/Internal/JsonStringArrayTagWriterTests.cs @@ -9,142 +9,116 @@ namespace OpenTelemetry.Internal.Tests; public class JsonStringArrayTagWriterTests { [Theory] - [InlineData(new object[] { new char[] { }, "[]" })] - [InlineData(new object[] { new char[] { 'a' }, """["a"]""" })] - [InlineData(new object[] { new char[] { '1', '2', '3' }, """["1","2","3"]""" })] + [InlineData([new char[] { }, "[]"])] + [InlineData([new char[] { 'a' }, """["a"]"""])] + [InlineData([new char[] { '1', '2', '3' }, """["1","2","3"]"""])] public void CharArray(char[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); [Theory] - [InlineData(new object[] { new string[] { }, "[]" })] - [InlineData(new object[] { new string[] { "one" }, """["one"]""" })] - [InlineData(new object[] { new string[] { "" }, """[""]""" })] - [InlineData(new object[] { new string[] { "a", "b", "c", "d" }, """["a","b","c","d"]""" })] - [InlineData(new object[] { new string[] { "\r\n", "\t", "\"" }, """["\r\n","\t","\u0022"]""" })] - [InlineData(new object[] { new string[] { "longlonglonglonglonglonglonglonglong" }, """["longlonglonglonglonglonglonglonglong"]""" })] + [InlineData([new string[] { }, "[]"])] + [InlineData([new string[] { "one" }, """["one"]"""])] +#pragma warning disable SA1122 // Use string.Empty for empty strings + [InlineData([new string[] { "" }, """[""]"""])] +#pragma warning restore SA1122 // Use string.Empty for empty strings + [InlineData([new string[] { "a", "b", "c", "d" }, """["a","b","c","d"]"""])] + [InlineData([new string[] { "\r\n", "\t", "\"" }, """["\r\n","\t","\u0022"]"""])] + [InlineData([new string[] { "longlonglonglonglonglonglonglonglong" }, """["longlonglonglonglonglonglonglonglong"]"""])] public void StringArray(string[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); [Theory] - [InlineData(new object[] { new bool[] { }, "[]" })] - [InlineData(new object[] { new bool[] { true }, "[true]" })] - [InlineData(new object[] { new bool[] { true, false, false, true }, "[true,false,false,true]" })] + [InlineData([new bool[] { }, "[]"])] + [InlineData([new bool[] { true }, "[true]"])] + [InlineData([new bool[] { true, false, false, true }, "[true,false,false,true]"])] public void BooleanArray(bool[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); [Theory] - [InlineData(new object[] { new byte[] { }, "[]" })] - [InlineData(new object[] { new byte[] { 0 }, "[0]" })] - [InlineData(new object[] { new byte[] { byte.MaxValue, byte.MinValue, 4, 13 }, "[255,0,4,13]" })] + [InlineData([new byte[] { }, "[]"])] + [InlineData([new byte[] { 0 }, "[0]"])] + [InlineData([new byte[] { byte.MaxValue, byte.MinValue, 4, 13 }, "[255,0,4,13]"])] public void ByteArray(byte[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); [Theory] - [InlineData(new object[] { new sbyte[] { }, "[]" })] - [InlineData(new object[] { new sbyte[] { 0 }, "[0]" })] - [InlineData(new object[] { new sbyte[] { sbyte.MaxValue, sbyte.MinValue, 4, 13 }, "[127,-128,4,13]" })] + [InlineData([new sbyte[] { }, "[]"])] + [InlineData([new sbyte[] { 0 }, "[0]"])] + [InlineData([new sbyte[] { sbyte.MaxValue, sbyte.MinValue, 4, 13 }, "[127,-128,4,13]"])] public void SByteArray(sbyte[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); [Theory] - [InlineData(new object[] { new short[] { }, "[]" })] - [InlineData(new object[] { new short[] { 0 }, "[0]" })] - [InlineData(new object[] { new short[] { short.MaxValue, short.MinValue, 4, 13 }, "[32767,-32768,4,13]" })] + [InlineData([new short[] { }, "[]"])] + [InlineData([new short[] { 0 }, "[0]"])] + [InlineData([new short[] { short.MaxValue, short.MinValue, 4, 13 }, "[32767,-32768,4,13]"])] public void ShortArray(short[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); [Theory] - [InlineData(new object[] { new ushort[] { }, "[]" })] - [InlineData(new object[] { new ushort[] { 0 }, "[0]" })] - [InlineData(new object[] { new ushort[] { ushort.MaxValue, ushort.MinValue, 4, 13 }, "[65535,0,4,13]" })] + [InlineData([new ushort[] { }, "[]"])] + [InlineData([new ushort[] { 0 }, "[0]"])] + [InlineData([new ushort[] { ushort.MaxValue, ushort.MinValue, 4, 13 }, "[65535,0,4,13]"])] public void UShortArray(ushort[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); [Theory] - [InlineData(new object[] { new int[] { }, "[]" })] - [InlineData(new object[] { new int[] { 0 }, "[0]" })] - [InlineData(new object[] { new int[] { int.MaxValue, int.MinValue, 4, 13 }, "[2147483647,-2147483648,4,13]" })] + [InlineData([new int[] { }, "[]"])] + [InlineData([new int[] { 0 }, "[0]"])] + [InlineData([new int[] { int.MaxValue, int.MinValue, 4, 13 }, "[2147483647,-2147483648,4,13]"])] public void IntArray(int[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); [Theory] - [InlineData(new object[] { new uint[] { }, "[]" })] - [InlineData(new object[] { new uint[] { 0 }, "[0]" })] - [InlineData(new object[] { new uint[] { uint.MaxValue, uint.MinValue, 4, 13 }, "[4294967295,0,4,13]" })] + [InlineData([new uint[] { }, "[]"])] + [InlineData([new uint[] { 0 }, "[0]"])] + [InlineData([new uint[] { uint.MaxValue, uint.MinValue, 4, 13 }, "[4294967295,0,4,13]"])] public void UIntArray(uint[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); [Theory] - [InlineData(new object[] { new long[] { }, "[]" })] - [InlineData(new object[] { new long[] { 0 }, "[0]" })] - [InlineData(new object[] { new long[] { long.MaxValue, long.MinValue, 4, 13 }, "[9223372036854775807,-9223372036854775808,4,13]" })] + [InlineData([new long[] { }, "[]"])] + [InlineData([new long[] { 0 }, "[0]"])] + [InlineData([new long[] { long.MaxValue, long.MinValue, 4, 13 }, "[9223372036854775807,-9223372036854775808,4,13]"])] public void LongArray(long[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); [Theory] - [InlineData(new object[] { new ulong[] { }, "[]" })] - [InlineData(new object[] { new ulong[] { 0 }, """["0"]""" })] - [InlineData(new object[] { new ulong[] { ulong.MaxValue, ulong.MinValue, 4, 13 }, """["18446744073709551615","0","4","13"]""" })] + [InlineData([new ulong[] { }, "[]"])] + [InlineData([new ulong[] { 0 }, """["0"]"""])] + [InlineData([new ulong[] { ulong.MaxValue, ulong.MinValue, 4, 13 }, """["18446744073709551615","0","4","13"]"""])] public void ULongArray(ulong[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); [Theory] - [InlineData(new object[] { new float[] { }, "[]" })] - [InlineData(new object[] { new float[] { 0 }, "[0]" })] - [InlineData(new object[] { new float[] { float.MaxValue, float.MinValue, 4, 13 }, "[3.4028234663852886E+38,-3.4028234663852886E+38,4,13]" })] + [InlineData([new float[] { }, "[]"])] + [InlineData([new float[] { 0 }, "[0]"])] + [InlineData([new float[] { float.MaxValue, float.MinValue, 4, 13 }, "[3.4028234663852886E+38,-3.4028234663852886E+38,4,13]"])] #if NETFRAMEWORK - [InlineData(new object[] { new float[] { float.Epsilon }, "[1.4012984643248171E-45]" })] + [InlineData([new float[] { float.Epsilon }, "[1.4012984643248171E-45]"])] #else - [InlineData(new object[] { new float[] { float.Epsilon }, "[1.401298464324817E-45]" })] + [InlineData([new float[] { float.Epsilon }, "[1.401298464324817E-45]"])] #endif public void FloatArray(float[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); [Theory] - [InlineData(new object[] { new double[] { }, "[]" })] - [InlineData(new object[] { new double[] { 0 }, "[0]" })] - [InlineData(new object[] { new double[] { double.MaxValue, double.MinValue, 4, 13 }, "[1.7976931348623157E+308,-1.7976931348623157E+308,4,13]" })] + [InlineData([new double[] { }, "[]"])] + [InlineData([new double[] { 0 }, "[0]"])] + [InlineData([new double[] { double.MaxValue, double.MinValue, 4, 13 }, "[1.7976931348623157E+308,-1.7976931348623157E+308,4,13]"])] #if NETFRAMEWORK - [InlineData(new object[] { new double[] { double.Epsilon }, "[4.9406564584124654E-324]" })] + [InlineData([new double[] { double.Epsilon }, "[4.9406564584124654E-324]"])] #else - [InlineData(new object[] { new double[] { double.Epsilon }, "[5E-324]" })] + [InlineData([new double[] { double.Epsilon }, "[5E-324]"])] #endif public void DoubleArray(double[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); [Theory] - [InlineData(new object[] { new object?[] { }, "[]" })] - [InlineData(new object[] { new object?[] { null, float.MinValue, float.MaxValue, double.MinValue, double.MaxValue, int.MinValue, int.MaxValue, long.MinValue, long.MaxValue, true, false, "Hello world", new object[] { "inner array" } }, """[null,-3.4028234663852886E+38,3.4028234663852886E+38,-1.7976931348623157E+308,1.7976931348623157E+308,-2147483648,2147483647,-9223372036854775808,9223372036854775807,true,false,"Hello world","System.Object[]"]""" })] + [InlineData([new object?[] { }, "[]"])] + [InlineData([new object?[] { null, float.MinValue, float.MaxValue, double.MinValue, double.MaxValue, int.MinValue, int.MaxValue, long.MinValue, long.MaxValue, true, false, "Hello world", new object[] { "inner array" } }, """[null,-3.4028234663852886E+38,3.4028234663852886E+38,-1.7976931348623157E+308,1.7976931348623157E+308,-2147483648,2147483647,-9223372036854775808,9223372036854775807,true,false,"Hello world","System.Object[]"]"""])] public void ObjectArray(object?[] data, string expectedValue) - { - VerifySerialization(data, expectedValue); - } + => VerifySerialization(data, expectedValue); private static void VerifySerialization(Array data, string expectedValue) { @@ -164,29 +138,23 @@ private TestTagWriter() public static TestTagWriter Instance { get; } = new(); protected override void WriteIntegralTag(ref Tag tag, string key, long value) - { - throw new NotImplementedException(); - } + => throw new NotImplementedException(); protected override void WriteFloatingPointTag(ref Tag tag, string key, double value) - { - throw new NotImplementedException(); - } + => throw new NotImplementedException(); protected override void WriteBooleanTag(ref Tag tag, string key, bool value) - { - throw new NotImplementedException(); - } + => throw new NotImplementedException(); protected override void WriteStringTag(ref Tag tag, string key, ReadOnlySpan value) - { - throw new NotImplementedException(); - } + => throw new NotImplementedException(); protected override void WriteArrayTag(ref Tag tag, string key, ArraySegment arrayUtf8JsonBytes) { +#pragma warning disable IDE0370 // Suppression is unnecessary tag.Key = key; tag.Value = Encoding.UTF8.GetString(arrayUtf8JsonBytes.Array!, 0, arrayUtf8JsonBytes.Count); +#pragma warning restore IDE0370 // Suppression is unnecessary } protected override void OnUnsupportedTagDropped(string tagKey, string tagValueTypeFullName) @@ -194,9 +162,7 @@ protected override void OnUnsupportedTagDropped(string tagKey, string tagValueTy } protected override bool TryWriteEmptyTag(ref Tag state, string key, object? value) - { - throw new NotImplementedException(); - } + => throw new NotImplementedException(); protected override bool TryWriteByteArrayTag(ref Tag consoleTag, string key, ReadOnlySpan value) => false; diff --git a/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsConfigParserTests.cs b/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsConfigParserTests.cs index 11bb09e7c01..09624ce895c 100644 --- a/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsConfigParserTests.cs +++ b/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsConfigParserTests.cs @@ -10,18 +10,18 @@ public class SelfDiagnosticsConfigParserTests [Fact] public void SelfDiagnosticsConfigParser_TryParseFilePath_Success() { - string configJson = "{ \t \n " + var configJson = "{ \t \n " + "\t \"LogDirectory\" \t : \"Diagnostics\", \n" + "FileSize \t : \t \n" + " 1024 \n}\n"; - Assert.True(SelfDiagnosticsConfigParser.TryParseLogDirectory(configJson, out string logDirectory)); + Assert.True(SelfDiagnosticsConfigParser.TryParseLogDirectory(configJson, out var logDirectory)); Assert.Equal("Diagnostics", logDirectory); } [Fact] public void SelfDiagnosticsConfigParser_TryParseFilePath_MissingField() { - string configJson = @"{ + var configJson = @"{ ""path"": ""Diagnostics"", ""FileSize"": 1024 }"; @@ -31,30 +31,30 @@ public void SelfDiagnosticsConfigParser_TryParseFilePath_MissingField() [Fact] public void SelfDiagnosticsConfigParser_TryParseFileSize() { - string configJson = @"{ + var configJson = @"{ ""LogDirectory"": ""Diagnostics"", ""FileSize"": 1024 }"; - Assert.True(SelfDiagnosticsConfigParser.TryParseFileSize(configJson, out int fileSize)); + Assert.True(SelfDiagnosticsConfigParser.TryParseFileSize(configJson, out var fileSize)); Assert.Equal(1024, fileSize); } [Fact] public void SelfDiagnosticsConfigParser_TryParseFileSize_CaseInsensitive() { - string configJson = @"{ + var configJson = @"{ ""LogDirectory"": ""Diagnostics"", ""fileSize"" : 2048 }"; - Assert.True(SelfDiagnosticsConfigParser.TryParseFileSize(configJson, out int fileSize)); + Assert.True(SelfDiagnosticsConfigParser.TryParseFileSize(configJson, out var fileSize)); Assert.Equal(2048, fileSize); } [Fact] public void SelfDiagnosticsConfigParser_TryParseFileSize_MissingField() { - string configJson = @"{ + var configJson = @"{ ""LogDirectory"": ""Diagnostics"", ""size"": 1024 }"; @@ -64,19 +64,19 @@ public void SelfDiagnosticsConfigParser_TryParseFileSize_MissingField() [Fact] public void SelfDiagnosticsConfigParser_TryParseLogLevel() { - string configJson = @"{ + var configJson = @"{ ""LogDirectory"": ""Diagnostics"", ""FileSize"": 1024, ""LogLevel"": ""Error"" }"; - Assert.True(SelfDiagnosticsConfigParser.TryParseLogLevel(configJson, out string? logLevelString)); + Assert.True(SelfDiagnosticsConfigParser.TryParseLogLevel(configJson, out var logLevelString)); Assert.Equal("Error", logLevelString); } [Fact] public void SelfDiagnosticsConfigParser_TryParseFormatMessage_Success() { - string configJson = """ + var configJson = """ { "LogDirectory": "Diagnostics", "FileSize": 1024, @@ -84,42 +84,42 @@ public void SelfDiagnosticsConfigParser_TryParseFormatMessage_Success() "FormatMessage": "true" } """; - Assert.True(SelfDiagnosticsConfigParser.TryParseFormatMessage(configJson, out bool formatMessage)); + Assert.True(SelfDiagnosticsConfigParser.TryParseFormatMessage(configJson, out var formatMessage)); Assert.True(formatMessage); } [Fact] public void SelfDiagnosticsConfigParser_TryParseFormatMessage_CaseInsensitive() { - string configJson = """ + var configJson = """ { "LogDirectory": "Diagnostics", "fileSize": 1024, "formatMessage": "FALSE" } """; - Assert.True(SelfDiagnosticsConfigParser.TryParseFormatMessage(configJson, out bool formatMessage)); + Assert.True(SelfDiagnosticsConfigParser.TryParseFormatMessage(configJson, out var formatMessage)); Assert.False(formatMessage); } [Fact] public void SelfDiagnosticsConfigParser_TryParseFormatMessage_MissingField() { - string configJson = """ + var configJson = """ { "LogDirectory": "Diagnostics", "FileSize": 1024, "LogLevel": "Error" } """; - Assert.True(SelfDiagnosticsConfigParser.TryParseFormatMessage(configJson, out bool formatMessage)); + Assert.True(SelfDiagnosticsConfigParser.TryParseFormatMessage(configJson, out var formatMessage)); Assert.False(formatMessage); // Should default to false } [Fact] public void SelfDiagnosticsConfigParser_TryParseFormatMessage_InvalidValue() { - string configJson = """ + var configJson = """ { "LogDirectory": "Diagnostics", "FileSize": 1024, @@ -127,14 +127,14 @@ public void SelfDiagnosticsConfigParser_TryParseFormatMessage_InvalidValue() "FormatMessage": "invalid" } """; - Assert.False(SelfDiagnosticsConfigParser.TryParseFormatMessage(configJson, out bool formatMessage)); + Assert.False(SelfDiagnosticsConfigParser.TryParseFormatMessage(configJson, out var formatMessage)); Assert.False(formatMessage); // Should default to false } [Fact] public void SelfDiagnosticsConfigParser_TryParseFormatMessage_UnquotedBoolean() { - string configJson = """ + var configJson = """ { "LogDirectory": "Diagnostics", "FileSize": 1024, @@ -142,7 +142,7 @@ public void SelfDiagnosticsConfigParser_TryParseFormatMessage_UnquotedBoolean() "FormatMessage": true } """; - Assert.True(SelfDiagnosticsConfigParser.TryParseFormatMessage(configJson, out bool formatMessage)); + Assert.True(SelfDiagnosticsConfigParser.TryParseFormatMessage(configJson, out var formatMessage)); Assert.True(formatMessage); } } diff --git a/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsConfigRefresherTests.cs b/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsConfigRefresherTests.cs index a87d8823cff..cbe22154ed3 100644 --- a/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsConfigRefresherTests.cs +++ b/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsConfigRefresherTests.cs @@ -27,16 +27,16 @@ public void SelfDiagnosticsConfigRefresher_OmitAsConfigured() { try { - string logDirectory = Utils.GetCurrentMethodName(); + var logDirectory = Utils.GetCurrentMethodName(); CreateConfigFile(logDirectory); using var configRefresher = new SelfDiagnosticsConfigRefresher(); // Emitting event of EventLevel.Warning OpenTelemetrySdkEventSource.Log.ObservableInstrumentCallbackException("exception"); - int bufferSize = 512; - byte[] actualBytes = ReadFile(logDirectory, bufferSize); - string logText = Encoding.UTF8.GetString(actualBytes); + var bufferSize = 512; + var actualBytes = ReadFile(logDirectory, bufferSize); + var logText = Encoding.UTF8.GetString(actualBytes); this.output.WriteLine(logText); // for debugging in case the test fails Assert.StartsWith(MessageOnNewFileString, logText, StringComparison.Ordinal); @@ -54,22 +54,22 @@ public void SelfDiagnosticsConfigRefresher_CaptureAsConfigured() { try { - string logDirectory = Utils.GetCurrentMethodName(); + var logDirectory = Utils.GetCurrentMethodName(); CreateConfigFile(logDirectory); using var configRefresher = new SelfDiagnosticsConfigRefresher(); // Emitting event of EventLevel.Error OpenTelemetrySdkEventSource.Log.TracerProviderException("Event string sample", "Exception string sample"); - string expectedMessage = "Unknown error in TracerProvider '{0}': '{1}'.{Event string sample}{Exception string sample}"; + var expectedMessage = "Unknown error in TracerProvider '{0}': '{1}'.{Event string sample}{Exception string sample}"; - int bufferSize = 2 * (MessageOnNewFileString.Length + expectedMessage.Length); - byte[] actualBytes = ReadFile(logDirectory, bufferSize); - string logText = Encoding.UTF8.GetString(actualBytes); + var bufferSize = 2 * (MessageOnNewFileString.Length + expectedMessage.Length); + var actualBytes = ReadFile(logDirectory, bufferSize); + var logText = Encoding.UTF8.GetString(actualBytes); Assert.StartsWith(MessageOnNewFileString, logText, StringComparison.Ordinal); // The event was captured - string logLine = logText.Substring(MessageOnNewFileString.Length); - string logMessage = ParseLogMessage(logLine); + var logLine = logText.Substring(MessageOnNewFileString.Length); + var logMessage = ParseLogMessage(logLine); Assert.StartsWith(expectedMessage, logMessage, StringComparison.Ordinal); } finally @@ -80,7 +80,7 @@ public void SelfDiagnosticsConfigRefresher_CaptureAsConfigured() private static string ParseLogMessage(string logLine) { - int timestampPrefixLength = "2020-08-14T20:33:24.4788109Z:".Length; + var timestampPrefixLength = "2020-08-14T20:33:24.4788109Z:".Length; Assert.Matches(@"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{7}Z:", logLine.Substring(0, timestampPrefixLength)); return logLine.Substring(timestampPrefixLength); } @@ -95,20 +95,20 @@ private static byte[] ReadFile(string logDirectory, int byteCount) #endif var outputFilePath = Path.Combine(logDirectory, outputFileName); using var file = File.Open(outputFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); - byte[] actualBytes = new byte[byteCount]; + var actualBytes = new byte[byteCount]; _ = file.Read(actualBytes, 0, byteCount); return actualBytes; } private static void CreateConfigFile(string logDirectory) { - string configJson = $@"{{ + var configJson = $@"{{ ""LogDirectory"": ""{logDirectory}"", ""FileSize"": 1024, ""LogLevel"": ""Error"" }}"; - using FileStream file = File.Open(ConfigFilePath, FileMode.Create, FileAccess.Write); - byte[] configBytes = Encoding.UTF8.GetBytes(configJson); + using var file = File.Open(ConfigFilePath, FileMode.Create, FileAccess.Write); + var configBytes = Encoding.UTF8.GetBytes(configJson); file.Write(configBytes, 0, configBytes.Length); } diff --git a/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsEventListenerTests.cs b/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsEventListenerTests.cs index b164d13fff7..c741aadc618 100644 --- a/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsEventListenerTests.cs +++ b/test/OpenTelemetry.Tests/Internal/SelfDiagnosticsEventListenerTests.cs @@ -55,7 +55,7 @@ public void SelfDiagnosticsEventListener_WriteEvent() var memoryMappedFile = MemoryMappedFile.CreateFromFile(LOGFILEPATH, FileMode.Create, null, 1024); Stream stream = memoryMappedFile.CreateViewStream(); using var configRefresher = new TestSelfDiagnosticsConfigRefresher(stream); - string eventMessage = "Event Message"; + var eventMessage = "Event Message"; using var listener = new SelfDiagnosticsEventListener(EventLevel.Error, configRefresher); // Act: call WriteEvent method directly @@ -85,20 +85,20 @@ public void SelfDiagnosticsEventListener_DateTimeGetBytes() ]; // Expect to match output string from DateTime.ToString("O") - string[] expected = new string[datetimes.Length]; - for (int i = 0; i < datetimes.Length; i++) + var expected = new string[datetimes.Length]; + for (var i = 0; i < datetimes.Length; i++) { expected[i] = datetimes[i].ToString("O"); } - byte[] buffer = new byte[40 * datetimes.Length]; - int pos = 0; + var buffer = new byte[40 * datetimes.Length]; + var pos = 0; // Get string after DateTimeGetBytes() write into a buffer - string[] results = new string[datetimes.Length]; - for (int i = 0; i < datetimes.Length; i++) + var results = new string[datetimes.Length]; + for (var i = 0; i < datetimes.Length; i++) { - int len = SelfDiagnosticsEventListener.DateTimeGetBytes(datetimes[i], buffer, pos); + var len = SelfDiagnosticsEventListener.DateTimeGetBytes(datetimes[i], buffer, pos); results[i] = Encoding.Default.GetString(buffer, pos, len); pos += len; } @@ -123,11 +123,11 @@ public void SelfDiagnosticsEventListener_EmitEvent_OmitAsConfigured() stream.Dispose(); memoryMappedFile.Dispose(); - using FileStream file = File.Open(LOGFILEPATH, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete); + using var file = File.Open(LOGFILEPATH, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete); var buffer = new byte[256]; - int bytesRead = 0; - int totalBytesRead = 0; + var bytesRead = 0; + var totalBytesRead = 0; while (totalBytesRead < buffer.Length) { @@ -167,113 +167,113 @@ public void SelfDiagnosticsEventListener_EmitEvent_CaptureAsConfigured() [Fact] public void SelfDiagnosticsEventListener_EncodeInBuffer_Null() { - byte[] buffer = new byte[20]; - int startPos = 0; - int endPos = SelfDiagnosticsEventListener.EncodeInBuffer(null, false, buffer, startPos); + var buffer = new byte[20]; + var startPos = 0; + var endPos = SelfDiagnosticsEventListener.EncodeInBuffer(null, false, buffer, startPos); Assert.Equal(startPos, endPos); } [Fact] public void SelfDiagnosticsEventListener_EncodeInBuffer_Empty() { - byte[] buffer = new byte[20]; - int startPos = 0; - int endPos = SelfDiagnosticsEventListener.EncodeInBuffer(string.Empty, false, buffer, startPos); - byte[] expected = Encoding.UTF8.GetBytes(string.Empty); + var buffer = new byte[20]; + var startPos = 0; + var endPos = SelfDiagnosticsEventListener.EncodeInBuffer(string.Empty, false, buffer, startPos); + var expected = Encoding.UTF8.GetBytes(string.Empty); AssertBufferOutput(expected, buffer, startPos, endPos); } [Fact] public void SelfDiagnosticsEventListener_EncodeInBuffer_EnoughSpace() { - byte[] buffer = new byte[20]; - int startPos = buffer.Length - Ellipses.Length - 6; // Just enough space for "abc" even if "...\n" needs to be added. - int endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", false, buffer, startPos); + var buffer = new byte[20]; + var startPos = buffer.Length - Ellipses.Length - 6; // Just enough space for "abc" even if "...\n" needs to be added. + var endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", false, buffer, startPos); // '\n' will be appended to the original string "abc" after EncodeInBuffer is called. // The byte where '\n' will be placed should not be touched within EncodeInBuffer, so it stays as '\0'. - byte[] expected = "abc\0"u8.ToArray(); + var expected = "abc\0"u8.ToArray(); AssertBufferOutput(expected, buffer, startPos, endPos + 1); } [Fact] public void SelfDiagnosticsEventListener_EncodeInBuffer_NotEnoughSpaceForFullString() { - byte[] buffer = new byte[20]; - int startPos = buffer.Length - Ellipses.Length - 5; // Just not space for "abc" if "...\n" needs to be added. + var buffer = new byte[20]; + var startPos = buffer.Length - Ellipses.Length - 5; // Just not space for "abc" if "...\n" needs to be added. // It's a quick estimate by assumption that most Unicode characters takes up to 2 16-bit UTF-16 chars, // which can be up to 4 bytes when encoded in UTF-8. - int endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", false, buffer, startPos); - byte[] expected = "ab...\0"u8.ToArray(); + var endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", false, buffer, startPos); + var expected = "ab...\0"u8.ToArray(); AssertBufferOutput(expected, buffer, startPos, endPos + 1); } [Fact] public void SelfDiagnosticsEventListener_EncodeInBuffer_NotEvenSpaceForTruncatedString() { - byte[] buffer = new byte[20]; - int startPos = buffer.Length - Ellipses.Length; // Just enough space for "...\n". - int endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", false, buffer, startPos); - byte[] expected = "...\0"u8.ToArray(); + var buffer = new byte[20]; + var startPos = buffer.Length - Ellipses.Length; // Just enough space for "...\n". + var endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", false, buffer, startPos); + var expected = "...\0"u8.ToArray(); AssertBufferOutput(expected, buffer, startPos, endPos + 1); } [Fact] public void SelfDiagnosticsEventListener_EncodeInBuffer_NotEvenSpaceForTruncationEllipses() { - byte[] buffer = new byte[20]; - int startPos = buffer.Length - Ellipses.Length + 1; // Not enough space for "...\n". - int endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", false, buffer, startPos); + var buffer = new byte[20]; + var startPos = buffer.Length - Ellipses.Length + 1; // Not enough space for "...\n". + var endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", false, buffer, startPos); Assert.Equal(startPos, endPos); } [Fact] public void SelfDiagnosticsEventListener_EncodeInBuffer_IsParameter_EnoughSpace() { - byte[] buffer = new byte[20]; - int startPos = buffer.Length - EllipsesWithBrackets.Length - 6; // Just enough space for "abc" even if "...\n" need to be added. - int endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", true, buffer, startPos); - byte[] expected = "{abc}\0"u8.ToArray(); + var buffer = new byte[20]; + var startPos = buffer.Length - EllipsesWithBrackets.Length - 6; // Just enough space for "abc" even if "...\n" need to be added. + var endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", true, buffer, startPos); + var expected = "{abc}\0"u8.ToArray(); AssertBufferOutput(expected, buffer, startPos, endPos + 1); } [Fact] public void SelfDiagnosticsEventListener_EncodeInBuffer_IsParameter_NotEnoughSpaceForFullString() { - byte[] buffer = new byte[20]; - int startPos = buffer.Length - EllipsesWithBrackets.Length - 5; // Just not space for "...\n". - int endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", true, buffer, startPos); - byte[] expected = "{ab...}\0"u8.ToArray(); + var buffer = new byte[20]; + var startPos = buffer.Length - EllipsesWithBrackets.Length - 5; // Just not space for "...\n". + var endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", true, buffer, startPos); + var expected = "{ab...}\0"u8.ToArray(); AssertBufferOutput(expected, buffer, startPos, endPos + 1); } [Fact] public void SelfDiagnosticsEventListener_EncodeInBuffer_IsParameter_NotEvenSpaceForTruncatedString() { - byte[] buffer = new byte[20]; - int startPos = buffer.Length - EllipsesWithBrackets.Length; // Just enough space for "{...}\n". - int endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", true, buffer, startPos); - byte[] expected = "{...}\0"u8.ToArray(); + var buffer = new byte[20]; + var startPos = buffer.Length - EllipsesWithBrackets.Length; // Just enough space for "{...}\n". + var endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", true, buffer, startPos); + var expected = "{...}\0"u8.ToArray(); AssertBufferOutput(expected, buffer, startPos, endPos + 1); } [Fact] public void SelfDiagnosticsEventListener_EncodeInBuffer_IsParameter_NotEvenSpaceForTruncationEllipses() { - byte[] buffer = new byte[20]; - int startPos = buffer.Length - EllipsesWithBrackets.Length + 1; // Not enough space for "{...}\n". - int endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", true, buffer, startPos); + var buffer = new byte[20]; + var startPos = buffer.Length - EllipsesWithBrackets.Length + 1; // Not enough space for "{...}\n". + var endPos = SelfDiagnosticsEventListener.EncodeInBuffer("abc", true, buffer, startPos); Assert.Equal(startPos, endPos); } private static void AssertFileOutput(string filePath, string eventMessage) { - using FileStream file = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete); + using var file = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete); var buffer = new byte[256]; - int bytesRead = 0; - int totalBytesRead = 0; + var bytesRead = 0; + var totalBytesRead = 0; while (totalBytesRead < buffer.Length) { @@ -286,14 +286,14 @@ private static void AssertFileOutput(string filePath, string eventMessage) totalBytesRead += bytesRead; } - string logLine = Encoding.UTF8.GetString(buffer, 0, totalBytesRead); - string logMessage = ParseLogMessage(logLine); + var logLine = Encoding.UTF8.GetString(buffer, 0, totalBytesRead); + var logMessage = ParseLogMessage(logLine); Assert.StartsWith(eventMessage, logMessage, StringComparison.Ordinal); } private static string ParseLogMessage(string logLine) { - int timestampPrefixLength = "2020-08-14T20:33:24.4788109Z:".Length; + var timestampPrefixLength = "2020-08-14T20:33:24.4788109Z:".Length; Assert.Matches(@"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{7}Z:", logLine.Substring(0, timestampPrefixLength)); return logLine.Substring(timestampPrefixLength); } diff --git a/test/OpenTelemetry.Tests/Logs/BatchLogRecordExportProcessorTests.cs b/test/OpenTelemetry.Tests/Logs/BatchLogRecordExportProcessorTests.cs index cd76a4c8880..2537ff45b84 100644 --- a/test/OpenTelemetry.Tests/Logs/BatchLogRecordExportProcessorTests.cs +++ b/test/OpenTelemetry.Tests/Logs/BatchLogRecordExportProcessorTests.cs @@ -15,7 +15,7 @@ public void StateValuesAndScopeBufferingTest() { var scopeProvider = new LoggerExternalScopeProvider(); - List exportedItems = new(); + List exportedItems = []; using var processor = new BatchLogRecordExportProcessor( #pragma warning disable CA2000 // Dispose objects before losing scope @@ -45,13 +45,13 @@ public void StateValuesAndScopeBufferingTest() Assert.NotNull(logRecord.AttributeStorage); Assert.NotNull(logRecord.ILoggerData.BufferedScopes); - KeyValuePair actualState = logRecord.StateValues[0]; + var actualState = logRecord.StateValues[0]; Assert.Same("Value", actualState.Key); Assert.Same("Hello world", actualState.Value); - int scopeCount = 0; - bool foundScope = false; + var scopeCount = 0; + var foundScope = false; logRecord.ForEachScope( (s, o) => @@ -77,7 +77,7 @@ public void StateBufferingTest() // after OnEnd may throw. This test verifies that behavior. TODO: // Investigate this. Potentially obsolete logRecord.State and force // StateValues/ParseStateValues behavior. - List exportedItems = new(); + List exportedItems = []; using var processor = new BatchLogRecordExportProcessor( #pragma warning disable CA2000 // Dispose objects before losing scope @@ -101,7 +101,7 @@ public void StateBufferingTest() Assert.Throws(() => { - IReadOnlyList> state = (IReadOnlyList>)logRecord.State; + var state = (IReadOnlyList>)logRecord.State; foreach (var kvp in state) { @@ -112,7 +112,7 @@ public void StateBufferingTest() [Fact] public void CopyMadeWhenLogRecordIsFromThreadStaticPoolTest() { - List exportedItems = new(); + List exportedItems = []; using var processor = new BatchLogRecordExportProcessor( #pragma warning disable CA2000 // Dispose objects before losing scope @@ -133,7 +133,7 @@ public void CopyMadeWhenLogRecordIsFromThreadStaticPoolTest() [Fact] public void LogRecordAddedToBatchIfNotFromAnyPoolTest() { - List exportedItems = new(); + List exportedItems = []; using var processor = new BatchLogRecordExportProcessor( #pragma warning disable CA2000 // Dispose objects before losing scope diff --git a/test/OpenTelemetry.Tests/Logs/LogRecordSharedPoolTests.cs b/test/OpenTelemetry.Tests/Logs/LogRecordSharedPoolTests.cs index 624d3a64cf8..dcbaa46f985 100644 --- a/test/OpenTelemetry.Tests/Logs/LogRecordSharedPoolTests.cs +++ b/test/OpenTelemetry.Tests/Logs/LogRecordSharedPoolTests.cs @@ -117,12 +117,13 @@ public void ClearTests() var pool = LogRecordSharedPool.Current; var logRecord1 = pool.Rent(); - logRecord1.AttributeStorage = new List>(16) - { + logRecord1.AttributeStorage = + [ +with(16), new("key1", "value1"), new("key2", "value2"), - }; - logRecord1.ScopeStorage = new List(8) { null, null }; + ]; + logRecord1.ScopeStorage = [with(8), null, null]; pool.Return(logRecord1); @@ -136,12 +137,12 @@ public void ClearTests() Assert.NotNull(logRecord1.AttributeStorage); Assert.NotNull(logRecord1.ScopeStorage); - for (int i = 0; i <= LogRecordPoolHelper.DefaultMaxNumberOfAttributes; i++) + for (var i = 0; i <= LogRecordPoolHelper.DefaultMaxNumberOfAttributes; i++) { logRecord1.AttributeStorage!.Add(new KeyValuePair("key", "value")); } - for (int i = 0; i <= LogRecordPoolHelper.DefaultMaxNumberOfScopes; i++) + for (var i = 0; i <= LogRecordPoolHelper.DefaultMaxNumberOfScopes; i++) { logRecord1.ScopeStorage!.Add(null); } @@ -163,7 +164,7 @@ public async Task ExportTest(bool warmup) if (warmup) { - for (int i = 0; i < LogRecordSharedPool.DefaultMaxPoolSize; i++) + for (var i = 0; i < LogRecordSharedPool.DefaultMaxPoolSize; i++) { pool.Return(new LogRecord { Source = LogRecord.LogRecordSource.FromSharedPool, PoolReferenceCount = 1 }); } @@ -177,7 +178,7 @@ public async Task ExportTest(bool warmup) List tasks = []; - for (int i = 0; i < Environment.ProcessorCount; i++) + for (var i = 0; i < Environment.ProcessorCount; i++) { tasks.Add(Task.Run(async () => { @@ -192,7 +193,7 @@ public async Task ExportTest(bool warmup) await Task.Delay(random.Next(100, 150)); #pragma warning restore CA5394 // Do not use insecure randomness - for (int i = 0; i < 1000; i++) + for (var i = 0; i < 1000; i++) { var logRecord = pool.Rent(); @@ -242,13 +243,13 @@ public async Task DeadlockTest() List tasks = []; - for (int i = 0; i < Environment.ProcessorCount; i++) + for (var i = 0; i < Environment.ProcessorCount; i++) { tasks.Add(Task.Run(async () => { await Task.Delay(2_000); - for (int i = 0; i < 100_000; i++) + for (var i = 0; i < 100_000; i++) { var logRecord = pool.Rent(); @@ -274,7 +275,7 @@ public async Task RentShouldNeverReturnSameInstanceConcurrently() var pool = LogRecordSharedPool.Current; // Pre-warm the pool - for (int i = 0; i < 16; i++) + for (var i = 0; i < 16; i++) { pool.Return(new LogRecord { Source = LogRecord.LogRecordSource.FromSharedPool, PoolReferenceCount = 1 }); } @@ -285,13 +286,13 @@ public async Task RentShouldNeverReturnSameInstanceConcurrently() var tasks = new List(); using var barrier = new Barrier(Environment.ProcessorCount); - for (int t = 0; t < Environment.ProcessorCount; t++) + for (var t = 0; t < Environment.ProcessorCount; t++) { tasks.Add(Task.Run(() => { barrier.SignalAndWait(); // Synchronize start for maximum contention - for (int i = 0; i < 10_000; i++) + for (var i = 0; i < 10_000; i++) { var record = pool.Rent(); diff --git a/test/OpenTelemetry.Tests/Logs/LogRecordStateProcessorTests.cs b/test/OpenTelemetry.Tests/Logs/LogRecordStateProcessorTests.cs index ff4badcdeaa..c592094de73 100644 --- a/test/OpenTelemetry.Tests/Logs/LogRecordStateProcessorTests.cs +++ b/test/OpenTelemetry.Tests/Logs/LogRecordStateProcessorTests.cs @@ -17,7 +17,7 @@ public class LogRecordStateProcessorTests [InlineData(false, false)] public void LogProcessorSetStateTest(bool includeAttributes, bool parseStateValues) { - List exportedItems = new(); + List exportedItems = []; using (var loggerFactory = CreateLoggerFactory(includeAttributes, parseStateValues, exportedItems, OnEnd)) { @@ -58,7 +58,7 @@ void OnEnd(LogRecord logRecord) [InlineData(false, false)] public void LogProcessorSetStateToUnsupportedTypeTest(bool includeAttributes, bool parseStateValues) { - List exportedItems = new(); + List exportedItems = []; using (var loggerFactory = CreateLoggerFactory(includeAttributes, parseStateValues, exportedItems, OnEnd)) { @@ -98,7 +98,7 @@ void OnEnd(LogRecord logRecord) [InlineData(false, false)] public void LogProcessorSetAttributesTest(bool includeAttributes, bool parseStateValues) { - List exportedItems = new(); + List exportedItems = []; using (var loggerFactory = CreateLoggerFactory(includeAttributes, parseStateValues, exportedItems, OnEnd)) { @@ -125,10 +125,7 @@ void OnEnd(LogRecord logRecord) out var state, out var attributes); - logRecord.Attributes = new List>(attributes) - { - new("enrichedData", "OTel"), - }; + logRecord.Attributes = [.. attributes, new("enrichedData", "OTel")]; } } @@ -143,7 +140,7 @@ void OnEnd(LogRecord logRecord) [InlineData(false, false, 1)] public void LogProcessorSetAttributesAndStateMixedTest(bool includeAttributes, bool parseStateValues, int order) { - List exportedItems = new(); + List exportedItems = []; using (var loggerFactory = CreateLoggerFactory(includeAttributes, parseStateValues, exportedItems, OnEnd)) { @@ -172,10 +169,7 @@ void OnEnd(LogRecord logRecord) if (order == 0) { - logRecord.State = logRecord.Attributes = new List>(attributes) - { - new("enrichedData", "OTel"), - }; + logRecord.State = logRecord.Attributes = [.. attributes, new("enrichedData", "OTel")]; } else { @@ -195,8 +189,7 @@ private static ILoggerFactory CreateLoggerFactory( bool parseStateValues, List exportedItems, Action onEndAction) - { - return LoggerFactory.Create(logging => logging + => LoggerFactory.Create(logging => logging .AddOpenTelemetry(options => { options.IncludeAttributes = includeAttributes; @@ -206,7 +199,6 @@ private static ILoggerFactory CreateLoggerFactory( .AddProcessor(new LogRecordStateProcessor(onEndAction)) .AddInMemoryExporter(exportedItems); })); - } private static void AssertStateAndAttributes( LogRecord logRecord, diff --git a/test/OpenTelemetry.Tests/Logs/LogRecordTests.cs b/test/OpenTelemetry.Tests/Logs/LogRecordTests.cs index e6a45e9fc46..462c8e6dbc7 100644 --- a/test/OpenTelemetry.Tests/Logs/LogRecordTests.cs +++ b/test/OpenTelemetry.Tests/Logs/LogRecordTests.cs @@ -26,7 +26,7 @@ private enum Field [Fact] public void CheckCategoryNameForLog() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems); var logger = loggerFactory.CreateLogger(); logger.Log(); @@ -44,7 +44,7 @@ public void CheckCategoryNameForLog() [InlineData(LogLevel.Critical)] public void CheckLogLevel(LogLevel logLevel) { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: null); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: null); var logger = loggerFactory.CreateLogger(); logger.Log(logLevel); @@ -58,7 +58,7 @@ public void CheckLogLevel(LogLevel logLevel) [InlineData(false)] public void CheckStateForUnstructuredLog(bool includeFormattedMessage) { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage); var logger = loggerFactory.CreateLogger(); logger.HelloWorld(); @@ -87,7 +87,7 @@ public void CheckStateForUnstructuredLog(bool includeFormattedMessage) [InlineData(false)] public void CheckStateForUnstructuredLogWithStringInterpolation(bool includeFormattedMessage) { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage); var logger = loggerFactory.CreateLogger(); #pragma warning disable CA2254 // Template should be a static expression @@ -121,7 +121,7 @@ public void CheckStateForUnstructuredLogWithStringInterpolation(bool includeForm [InlineData(false)] public void CheckStateForStructuredLogWithTemplate(bool includeFormattedMessage) { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage); var logger = loggerFactory.CreateLogger(); logger.HelloFrom("tomato", 2.99); @@ -162,7 +162,7 @@ public void CheckStateForStructuredLogWithTemplate(bool includeFormattedMessage) [InlineData(false)] public void CheckStateForStructuredLogWithStrongType(bool includeFormattedMessage) { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage); var logger = loggerFactory.CreateLogger(); var food = new Food { Name = "artichoke", Price = 3.99 }; @@ -204,7 +204,7 @@ public void CheckStateForStructuredLogWithStrongType(bool includeFormattedMessag [InlineData(false)] public void CheckStateForStructuredLogWithAnonymousType(bool includeFormattedMessage) { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage); var logger = loggerFactory.CreateLogger(); var anonymousType = new { Name = "pumpkin", Price = 5.99 }; @@ -246,7 +246,7 @@ public void CheckStateForStructuredLogWithAnonymousType(bool includeFormattedMes [InlineData(false)] public void CheckStateForStructuredLogWithGeneralType(bool includeFormattedMessage) { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage); var logger = loggerFactory.CreateLogger(); var trufflePrice = 299.99; @@ -291,7 +291,7 @@ public void CheckStateForStructuredLogWithGeneralType(bool includeFormattedMessa [Fact] public void CheckStateForExceptionLogged() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: null); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: null); var logger = loggerFactory.CreateLogger(); var exceptionMessage = "Exception Message"; @@ -326,7 +326,7 @@ public void CheckStateForExceptionLogged() [Fact] public void CheckStateCanBeSet() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: null); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: null); var logger = loggerFactory.CreateLogger(); logger.Log(); @@ -341,7 +341,7 @@ public void CheckStateCanBeSet() [Fact] public void CheckStateValuesCanBeSet() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.ParseStateValues = true); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: options => options.ParseStateValues = true); var logger = loggerFactory.CreateLogger(); logger.Log( @@ -361,7 +361,7 @@ public void CheckStateValuesCanBeSet() [Fact] public void CheckFormattedMessageCanBeSet() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.IncludeFormattedMessage = true); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: options => options.IncludeFormattedMessage = true); var logger = loggerFactory.CreateLogger(); logger.HelloFrom("tomato", 3.0); @@ -444,7 +444,7 @@ public void CheckFormattedMessageCanBeSetByProcessor() [Fact] public void CheckTraceIdForLogWithinDroppedActivity() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: null); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: null); var logger = loggerFactory.CreateLogger(); logger.LogWithinADroppedActivity(); @@ -461,7 +461,7 @@ public void CheckTraceIdForLogWithinDroppedActivity() [InlineData(false)] public void CheckTraceIdForLogWithinActivityMarkedAsRecordOnly(bool includeTraceState) { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: o => o.IncludeTraceState = includeTraceState); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: o => o.IncludeTraceState = includeTraceState); var logger = loggerFactory.CreateLogger(); var sampler = new RecordOnlySampler(); @@ -500,7 +500,7 @@ public void CheckTraceIdForLogWithinActivityMarkedAsRecordOnly(bool includeTrace [Fact] public void CheckTraceIdForLogWithinActivityMarkedAsRecordAndSample() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: null); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: null); var logger = loggerFactory.CreateLogger(); var sampler = new AlwaysOnSampler(); @@ -528,7 +528,7 @@ public void CheckTraceIdForLogWithinActivityMarkedAsRecordAndSample() [Fact] public void VerifyIncludeFormattedMessage_False() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.IncludeFormattedMessage = false); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: options => options.IncludeFormattedMessage = false); var logger = loggerFactory.CreateLogger(); logger.Log(); @@ -539,7 +539,7 @@ public void VerifyIncludeFormattedMessage_False() [Fact] public void VerifyIncludeFormattedMessage_True() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.IncludeFormattedMessage = true); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: options => options.IncludeFormattedMessage = true); var logger = loggerFactory.CreateLogger(); logger.Log(); @@ -554,7 +554,7 @@ public void VerifyIncludeFormattedMessage_True() [Fact] public void IncludeFormattedMessageTestWhenFormatterNull() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.IncludeFormattedMessage = true); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: options => options.IncludeFormattedMessage = true); var logger = loggerFactory.CreateLogger(); logger.Log(LogLevel.Information, default, "Hello World!", null, null!); @@ -577,7 +577,7 @@ public void IncludeFormattedMessageTestWhenFormatterNull() [Fact] public void VerifyIncludeScopes_False() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.IncludeScopes = false); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: options => options.IncludeScopes = false); var logger = loggerFactory.CreateLogger(); using var scope = logger.BeginScope("string_scope"); @@ -593,7 +593,7 @@ public void VerifyIncludeScopes_False() [Fact] public void VerifyIncludeScopes_True() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.IncludeScopes = true); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: options => options.IncludeScopes = true); var logger = loggerFactory.CreateLogger(); using var scope = logger.BeginScope("string_scope"); @@ -606,13 +606,13 @@ public void VerifyIncludeScopes_True() logger.Log(); logRecord = exportedItems[1]; - int reachedDepth = -1; + var reachedDepth = -1; logRecord.ForEachScope( (scope, state) => { reachedDepth++; scopes.Add(scope.Scope); - foreach (KeyValuePair item in scope) + foreach (var item in scope) { Assert.Equal(string.Empty, item.Key); Assert.Equal("string_scope", item.Value); @@ -642,7 +642,7 @@ public void VerifyIncludeScopes_True() scopes.Add(scope.Scope); if (reachedDepth++ == 1) { - foreach (KeyValuePair item in scope) + foreach (var item in scope) { Assert.Contains(item, expectedScope2); } @@ -673,7 +673,7 @@ public void VerifyIncludeScopes_True() scopes.Add(scope.Scope); if (reachedDepth++ == 2) { - foreach (KeyValuePair item in scope) + foreach (var item in scope) { Assert.Contains(item, expectedScope3); } @@ -692,7 +692,7 @@ public void VerifyIncludeScopes_True() [InlineData(false)] public void VerifyParseStateValues_UsingStandardExtensions(bool parseStateValues) { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.ParseStateValues = parseStateValues); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: options => options.ParseStateValues = parseStateValues); var logger = loggerFactory.CreateLogger(); // Tests state parsing with standard extensions. @@ -737,7 +737,7 @@ public void VerifyParseStateValues_UsingStandardExtensions(bool parseStateValues Assert.Equal(new KeyValuePair("Year", 2021), logRecord.StateValues[1]); Assert.Equal(new KeyValuePair("{OriginalFormat}", "{Product} {Year} {Complex}!"), logRecord.StateValues[3]); - KeyValuePair actualComplex = logRecord.StateValues[2]; + var actualComplex = logRecord.StateValues[2]; Assert.Equal("Complex", actualComplex.Key); Assert.Same(complex, actualComplex.Value); } @@ -745,7 +745,7 @@ public void VerifyParseStateValues_UsingStandardExtensions(bool parseStateValues [Fact] public void ParseStateValuesUsingStructTest() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.ParseStateValues = true); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: options => options.ParseStateValues = true); var logger = loggerFactory.CreateLogger(); // Tests struct IReadOnlyList> parse path. @@ -767,7 +767,7 @@ public void ParseStateValuesUsingStructTest() [Fact] public void ParseStateValuesUsingListTest() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.ParseStateValues = true); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: options => options.ParseStateValues = true); var logger = loggerFactory.CreateLogger(); // Tests ref IReadOnlyList> parse path. @@ -789,7 +789,7 @@ public void ParseStateValuesUsingListTest() [Fact] public void ParseStateValuesUsingIEnumerableTest() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.ParseStateValues = true); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: options => options.ParseStateValues = true); var logger = loggerFactory.CreateLogger(); // Tests IEnumerable> parse path. @@ -811,12 +811,12 @@ public void ParseStateValuesUsingIEnumerableTest() [Fact] public void ParseStateValuesUsingNonconformingCustomTypeTest() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.ParseStateValues = true); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: options => options.ParseStateValues = true); var logger = loggerFactory.CreateLogger(); // Tests unknown state parse path. - CustomState state = new CustomState + var state = new CustomState { Property = "Value", }; @@ -841,10 +841,10 @@ public void ParseStateValuesUsingNonconformingCustomTypeTest() [Fact] public void DisposingStateTest() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems, configure: options => options.ParseStateValues = true); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems, configure: options => options.ParseStateValues = true); var logger = loggerFactory.CreateLogger(); - DisposingState state = new DisposingState("Hello world"); + var state = new DisposingState("Hello world"); logger.Log( LogLevel.Information, @@ -860,7 +860,7 @@ public void DisposingStateTest() Assert.NotNull(logRecord.StateValues); Assert.Single(logRecord.StateValues); - KeyValuePair actualState = logRecord.StateValues[0]; + var actualState = logRecord.StateValues[0]; Assert.Same("Value", actualState.Key); Assert.Same("Hello world", actualState.Value); @@ -905,7 +905,7 @@ public void ReusedLogRecordScopeTest(bool buffer) public void IncludeStateTest() { using var loggerFactory = InitializeLoggerFactory( - out List exportedItems, configure: options => + out var exportedItems, configure: options => { options.IncludeAttributes = false; }); @@ -971,7 +971,7 @@ public void SeverityLogLevelTest(int logSeverity, LogLevel logLevel, int? transf [Fact] public void LogRecordInstrumentationScopeTest() { - using var loggerFactory = InitializeLoggerFactory(out List exportedItems); + using var loggerFactory = InitializeLoggerFactory(out var exportedItems); var logger = loggerFactory.CreateLogger(); @@ -1033,7 +1033,7 @@ public void CheckOriginalFormatAtArbitraryPosition(bool includeFormattedMessage, // at the last position. The fix ensures it's found at ANY position. using var loggerFactory = InitializeLoggerFactory( - out List exportedItems, + out var exportedItems, configure: o => o.IncludeFormattedMessage = includeFormattedMessage); var logger = loggerFactory.CreateLogger(); diff --git a/test/OpenTelemetry.Tests/Logs/LogRecordThreadStaticPoolTests.cs b/test/OpenTelemetry.Tests/Logs/LogRecordThreadStaticPoolTests.cs index 4fd6f588c85..b539d9b32cc 100644 --- a/test/OpenTelemetry.Tests/Logs/LogRecordThreadStaticPoolTests.cs +++ b/test/OpenTelemetry.Tests/Logs/LogRecordThreadStaticPoolTests.cs @@ -37,12 +37,13 @@ public void RentReturnTests() public void ClearTests() { var logRecord1 = LogRecordThreadStaticPool.Instance.Rent(); - logRecord1.AttributeStorage = new List>(16) - { + logRecord1.AttributeStorage = + [ +with(16), new KeyValuePair("key1", "value1"), new KeyValuePair("key2", "value2"), - }; - logRecord1.ScopeStorage = new List(8) { null, null }; + ]; + logRecord1.ScopeStorage = [with(8), null, null]; LogRecordThreadStaticPool.Instance.Return(logRecord1); @@ -56,12 +57,12 @@ public void ClearTests() Assert.NotNull(logRecord1.AttributeStorage); Assert.NotNull(logRecord1.ScopeStorage); - for (int i = 0; i <= LogRecordPoolHelper.DefaultMaxNumberOfAttributes; i++) + for (var i = 0; i <= LogRecordPoolHelper.DefaultMaxNumberOfAttributes; i++) { logRecord1.AttributeStorage!.Add(new KeyValuePair("key", "value")); } - for (int i = 0; i <= LogRecordPoolHelper.DefaultMaxNumberOfScopes; i++) + for (var i = 0; i <= LogRecordPoolHelper.DefaultMaxNumberOfScopes; i++) { logRecord1.ScopeStorage!.Add(null); } diff --git a/test/OpenTelemetry.Tests/Logs/LoggerProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.Tests/Logs/LoggerProviderBuilderExtensionsTests.cs index c956a9a7920..5551067287f 100644 --- a/test/OpenTelemetry.Tests/Logs/LoggerProviderBuilderExtensionsTests.cs +++ b/test/OpenTelemetry.Tests/Logs/LoggerProviderBuilderExtensionsTests.cs @@ -49,9 +49,9 @@ public void LoggerProviderBuilderAddInstrumentationTest() [InlineData(false)] public void LoggerProviderBuilderNestedResolutionUsingBuilderTest(bool callNestedConfigure) { - bool innerConfigureBuilderTestExecuted = false; - bool innerConfigureOpenTelemetryLoggerProviderTestExecuted = false; - bool innerConfigureOpenTelemetryLoggerProviderTestWithServiceProviderExecuted = false; + var innerConfigureBuilderTestExecuted = false; + var innerConfigureOpenTelemetryLoggerProviderTestExecuted = false; + var innerConfigureOpenTelemetryLoggerProviderTestWithServiceProviderExecuted = false; using var provider = Sdk.CreateLoggerProviderBuilder() .ConfigureServices(services => @@ -154,8 +154,9 @@ public void LoggerProviderBuilderUsingDependencyInjectionTest() [Fact] public void LoggerProviderBuilderAddProcessorTest() { - List processorsToAdd = new() - { +#pragma warning disable CA2000 // Dispose objects before losing scope + List processorsToAdd = + [ new CustomProcessor() { Name = "A", @@ -168,7 +169,8 @@ public void LoggerProviderBuilderAddProcessorTest() { Name = "C", }, - }; + ]; +#pragma warning restore CA2000 // Dispose objects before losing scope var builder = Sdk.CreateLoggerProviderBuilder(); foreach (var processor in processorsToAdd) @@ -176,14 +178,14 @@ public void LoggerProviderBuilderAddProcessorTest() builder.AddProcessor(processor); } - List expectedProcessors = new() - { + List expectedProcessors = + [ processorsToAdd.First(p => p.Name == "A"), processorsToAdd.First(p => p.Name == "B"), processorsToAdd.First(p => p.Name == "C"), - }; + ]; - List actualProcessors = new(); + List actualProcessors = []; using (var provider = builder.Build() as LoggerProviderSdk) { @@ -218,8 +220,9 @@ public void LoggerProviderBuilderAddProcessorTest() [Fact] public void LoggerProviderBuilderAddProcessorWithWeightTest() { - List processorsToAdd = new() - { +#pragma warning disable CA2000 // Dispose objects before losing scope + List processorsToAdd = + [ new CustomProcessor() { Name = "C", @@ -250,7 +253,8 @@ public void LoggerProviderBuilderAddProcessorWithWeightTest() Name = "D", PipelineWeight = 0, }, - }; + ]; +#pragma warning restore CA2000 // Dispose objects before losing scope var builder = Sdk.CreateLoggerProviderBuilder(); foreach (var processor in processorsToAdd) @@ -258,17 +262,17 @@ public void LoggerProviderBuilderAddProcessorWithWeightTest() builder.AddProcessor(processor); } - List expectedProcessors = new() - { + List expectedProcessors = + [ processorsToAdd.First(p => p.Name == "A"), processorsToAdd.First(p => p.Name == "B"), processorsToAdd.First(p => p.Name == "C"), processorsToAdd.First(p => p.Name == "D"), processorsToAdd.First(p => p.Name == "E"), processorsToAdd.First(p => p.Name == "F"), - }; + ]; - List actualProcessors = new(); + List actualProcessors = []; using (var provider = builder.Build() as LoggerProviderSdk) { @@ -310,7 +314,7 @@ public void LoggerProviderBuilderCustomImplementationBuildTest() { var builder = new CustomLoggerProviderBuilder(); - Assert.Throws(() => builder.Build()); + Assert.Throws(builder.Build); } private sealed class CustomInstrumentation : IDisposable @@ -319,9 +323,7 @@ private sealed class CustomInstrumentation : IDisposable public LoggerProvider? Provider; public void Dispose() - { - this.Disposed = true; - } + => this.Disposed = true; } private sealed class CustomProcessor : BaseProcessor @@ -340,8 +342,6 @@ protected override void Dispose(bool disposing) private sealed class CustomLoggerProviderBuilder : LoggerProviderBuilder { public override LoggerProviderBuilder AddInstrumentation(Func instrumentationFactory) - { - throw new NotImplementedException(); - } + => throw new NotImplementedException(); } } diff --git a/test/OpenTelemetry.Tests/Logs/LoggerProviderExtensionsTests.cs b/test/OpenTelemetry.Tests/Logs/LoggerProviderExtensionsTests.cs index 20e36e1cc6b..06913c496fe 100644 --- a/test/OpenTelemetry.Tests/Logs/LoggerProviderExtensionsTests.cs +++ b/test/OpenTelemetry.Tests/Logs/LoggerProviderExtensionsTests.cs @@ -32,7 +32,7 @@ public void AddProcessorTest() [Fact] public void ForceFlushTest() { - List exportedItems = new(); + List exportedItems = []; using var provider = Sdk.CreateLoggerProviderBuilder() .AddProcessor( #pragma warning disable CA2000 // Dispose objects before losing scope diff --git a/test/OpenTelemetry.Tests/Logs/LoggerProviderSdkTests.cs b/test/OpenTelemetry.Tests/Logs/LoggerProviderSdkTests.cs index f321551dec1..27740eb7a74 100644 --- a/test/OpenTelemetry.Tests/Logs/LoggerProviderSdkTests.cs +++ b/test/OpenTelemetry.Tests/Logs/LoggerProviderSdkTests.cs @@ -35,7 +35,7 @@ public void ForceFlushTest() Assert.True(provider.ForceFlush()); - List exportedItems = new(); + List exportedItems = []; #pragma warning disable CA2000 // Dispose objects before losing scope provider.AddProcessor(new BatchLogRecordExportProcessor(new InMemoryExporter(exportedItems))); diff --git a/test/OpenTelemetry.Tests/Logs/OpenTelemetryLoggingExtensionsTests.cs b/test/OpenTelemetry.Tests/Logs/OpenTelemetryLoggingExtensionsTests.cs index 424c4144d4a..bdd33e10ba2 100644 --- a/test/OpenTelemetry.Tests/Logs/OpenTelemetryLoggingExtensionsTests.cs +++ b/test/OpenTelemetry.Tests/Logs/OpenTelemetryLoggingExtensionsTests.cs @@ -18,7 +18,7 @@ public sealed class OpenTelemetryLoggingExtensionsTests [InlineData(true)] public void ServiceCollectionAddOpenTelemetryNoParametersTest(bool callUseExtension) { - bool optionsCallbackInvoked = false; + var optionsCallbackInvoked = false; var serviceCollection = new ServiceCollection(); @@ -39,9 +39,9 @@ public void ServiceCollectionAddOpenTelemetryNoParametersTest(bool callUseExtens optionsCallbackInvoked = true; }); - using ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); + using var serviceProvider = serviceCollection.BuildServiceProvider(); - ILoggerFactory? loggerFactory = serviceProvider.GetService(); + var loggerFactory = serviceProvider.GetService(); Assert.NotNull(loggerFactory); @@ -60,15 +60,15 @@ public void ServiceCollectionAddOpenTelemetryConfigureActionTests( int numberOfBuilderRegistrations, int numberOfOptionsRegistrations) { - int configureCallbackInvocations = 0; - int optionsCallbackInvocations = 0; + var configureCallbackInvocations = 0; + var optionsCallbackInvocations = 0; OpenTelemetryLoggerOptions? optionsInstance = null; var serviceCollection = new ServiceCollection(); serviceCollection.AddLogging(logging => { - for (int i = 0; i < numberOfBuilderRegistrations; i++) + for (var i = 0; i < numberOfBuilderRegistrations; i++) { if (callUseExtension) { @@ -81,14 +81,14 @@ public void ServiceCollectionAddOpenTelemetryConfigureActionTests( } }); - for (int i = 0; i < numberOfOptionsRegistrations; i++) + for (var i = 0; i < numberOfOptionsRegistrations; i++) { serviceCollection.Configure(OptionsCallback); } - using ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); + using var serviceProvider = serviceCollection.BuildServiceProvider(); - ILoggerFactory? loggerFactory = serviceProvider.GetService(); + var loggerFactory = serviceProvider.GetService(); Assert.NotNull(loggerFactory); @@ -162,10 +162,10 @@ public void UseOpenTelemetryDependencyInjectionTest() [Fact] public void UseOpenTelemetryOptionsOrderingTest() { - int currentIndex = -1; - int beforeDelegateIndex = -1; - int extensionDelegateIndex = -1; - int afterDelegateIndex = -1; + var currentIndex = -1; + var beforeDelegateIndex = -1; + var extensionDelegateIndex = -1; + var afterDelegateIndex = -1; var serviceCollection = new ServiceCollection(); diff --git a/test/OpenTelemetry.Tests/Metrics/AggregatorTests.cs b/test/OpenTelemetry.Tests/Metrics/AggregatorTests.cs index 0957583cea4..dcac57e9f84 100644 --- a/test/OpenTelemetry.Tests/Metrics/AggregatorTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/AggregatorTests.cs @@ -1,7 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using System.Diagnostics; using System.Diagnostics.Metrics; using Xunit; @@ -66,7 +65,7 @@ public void HistogramDistributeToAllBucketsDefault() Assert.Equal(32, count); - int actualCount = 0; + var actualCount = 0; foreach (var histogramMeasurement in histogramPoint.GetHistogramBuckets()) { Assert.Equal(2, histogramMeasurement.BucketCount); @@ -102,8 +101,8 @@ public void HistogramDistributeToAllBucketsCustom() // Count = # of recordings Assert.Equal(7, count); - int index = 0; - int actualCount = 0; + var index = 0; + var actualCount = 0; var expectedBucketCounts = new long[] { 5, 2, 0 }; foreach (var histogramMeasurement in histogramPoint.GetHistogramBuckets()) { @@ -195,8 +194,8 @@ public void MultiThreadedHistogramUpdateAndSnapShotTest() var numberOfThreads = 2; var snapshotThread = new Thread(HistogramSnapshotThread); - Thread[] updateThreads = new Thread[numberOfThreads]; - for (int i = 0; i < numberOfThreads; ++i) + var updateThreads = new Thread[numberOfThreads]; + for (var i = 0; i < numberOfThreads; ++i) { updateThreads[i] = new Thread(HistogramUpdateThread); updateThreads[i].Start(argsToThread); @@ -204,7 +203,7 @@ public void MultiThreadedHistogramUpdateAndSnapShotTest() snapshotThread.Start(argsToThread); - for (int i = 0; i < numberOfThreads; ++i) + for (var i = 0; i < numberOfThreads; ++i) { updateThreads[i].Join(); } @@ -251,7 +250,7 @@ public void HistogramBucketsDefaultUpdatesForSecondsTest(string meterName, strin AggregationTemporality.Cumulative, cardinalityLimit: 1024); - KnownHistogramBuckets actualHistogramBounds = KnownHistogramBuckets.Default; + var actualHistogramBounds = KnownHistogramBuckets.Default; if (aggregatorStore.HistogramBounds == Metric.DefaultHistogramBoundsShortSeconds) { actualHistogramBounds = KnownHistogramBuckets.DefaultShortSeconds; @@ -331,7 +330,7 @@ internal void ExponentialHistogramTests(AggregationType aggregationType, Aggrega foreach (var value in valuesToRecord) { - aggregatorStore.Update(value, Array.Empty>()); + aggregatorStore.Update(value, []); if (value >= 0) { @@ -439,7 +438,7 @@ internal void ExponentialMaxScaleConfigWorks(int? maxScale) AggregationTemporality.Cumulative, cardinalityLimit: 1024); - aggregatorStore.Update(10, Array.Empty>()); + aggregatorStore.Update(10, []); aggregatorStore.Snapshot(); @@ -480,8 +479,8 @@ internal void HistogramBucketBoundariesTest(HistogramBoundaryTestCase boundaryTe var count = histogramPoint.GetHistogramCount(); Assert.Equal(boundaryTestCase.InputValues.Length, count); - int bucketIndex = 0; - int actualBucketCount = 0; + var bucketIndex = 0; + var actualBucketCount = 0; foreach (var histogramBucket in histogramPoint.GetHistogramBuckets()) { @@ -497,7 +496,6 @@ internal void HistogramBucketBoundariesTest(HistogramBoundaryTestCase boundaryTe private static void HistogramSnapshotThread(object? obj) { var args = obj as ThreadArguments; - Debug.Assert(args != null, "args was null"); var mreToEnsureAllThreadsStart = args!.MreToEnsureAllThreadsStart; if (Interlocked.Increment(ref args.ThreadStartedCount) == 3) @@ -519,7 +517,6 @@ private static void HistogramSnapshotThread(object? obj) private static void HistogramUpdateThread(object? obj) { var args = obj as ThreadArguments; - Debug.Assert(args != null, "args was null"); var mreToEnsureAllThreadsStart = args!.MreToEnsureAllThreadsStart; if (Interlocked.Increment(ref args.ThreadStartedCount) == 3) @@ -529,7 +526,7 @@ private static void HistogramUpdateThread(object? obj) mreToEnsureAllThreadsStart.WaitOne(); - for (int i = 0; i < 10; ++i) + for (var i = 0; i < 10; ++i) { args.HistogramPoint.Update(10); } diff --git a/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs index fa87ebe5da8..4efc7d926b6 100644 --- a/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs @@ -111,8 +111,8 @@ public void SetAndConfigureResourceTest() { var builder = Sdk.CreateMeterProviderBuilder(); - int configureInvocations = 0; - bool serviceProviderTestExecuted = false; + var configureInvocations = 0; + var serviceProviderTestExecuted = false; builder.SetResourceBuilder(ResourceBuilder.CreateEmpty().AddService("Test")); builder.ConfigureResource(builder => @@ -157,7 +157,7 @@ public void ConfigureBuilderIConfigurationAvailableTest() { Environment.SetEnvironmentVariable("TEST_KEY", "TEST_KEY_VALUE"); - bool configureBuilderCalled = false; + var configureBuilderCalled = false; using var provider = Sdk.CreateMeterProviderBuilder() .ConfigureBuilder((sp, builder) => @@ -180,7 +180,7 @@ public void ConfigureBuilderIConfigurationAvailableTest() [Fact] public void ConfigureBuilderIConfigurationModifiableTest() { - bool configureBuilderCalled = false; + var configureBuilderCalled = false; using var provider = Sdk.CreateMeterProviderBuilder() .ConfigureServices(services => @@ -211,9 +211,9 @@ public void ConfigureBuilderIConfigurationModifiableTest() [InlineData(false)] public void MeterProviderNestedResolutionUsingBuilderTest(bool callNestedConfigure) { - bool innerConfigureBuilderTestExecuted = false; - bool innerConfigureOpenTelemetryLoggerProviderTestExecuted = false; - bool innerConfigureOpenTelemetryLoggerProviderTestWithServiceProviderExecuted = false; + var innerConfigureBuilderTestExecuted = false; + var innerConfigureOpenTelemetryLoggerProviderTestExecuted = false; + var innerConfigureOpenTelemetryLoggerProviderTestWithServiceProviderExecuted = false; using var provider = Sdk.CreateMeterProviderBuilder() .ConfigureServices(services => @@ -262,7 +262,7 @@ public void MeterProviderNestedResolutionUsingBuilderTest(bool callNestedConfigu [Fact] public void MeterProviderAddReaderFactoryTest() { - bool factoryInvoked = false; + var factoryInvoked = false; using var meterProvider = Sdk.CreateMeterProviderBuilder() .AddReader(sp => @@ -286,7 +286,7 @@ public void MeterProviderBuilderCustomImplementationBuildTest() { var builder = new MyMeterProviderBuilder(); - Assert.Throws(() => builder.Build()); + Assert.Throws(builder.Build); } private static void RunBuilderServiceLifecycleTest( @@ -298,7 +298,7 @@ private static void RunBuilderServiceLifecycleTest( builder.AddMeter("TestSource"); - bool configureServicesCalled = false; + var configureServicesCalled = false; builder.ConfigureServices(services => { configureServicesCalled = true; @@ -317,7 +317,7 @@ private static void RunBuilderServiceLifecycleTest( }); }); - int configureBuilderInvocations = 0; + var configureBuilderInvocations = 0; builder.ConfigureBuilder((sp, builder) => { configureBuilderInvocations++; @@ -366,25 +366,17 @@ private sealed class MyInstrumentation : IDisposable internal bool Disposed; public void Dispose() - { - this.Disposed = true; - } + => this.Disposed = true; } - private sealed class MyReader : MetricReader - { - } + private sealed class MyReader : MetricReader; private sealed class MyMeterProviderBuilder : MeterProviderBuilder { public override MeterProviderBuilder AddInstrumentation(Func instrumentationFactory) - { - throw new NotImplementedException(); - } + => throw new NotImplementedException(); public override MeterProviderBuilder AddMeter(params string[] names) - { - throw new NotImplementedException(); - } + => throw new NotImplementedException(); } } diff --git a/test/OpenTelemetry.Tests/Metrics/MetricApiTests.cs b/test/OpenTelemetry.Tests/Metrics/MetricApiTests.cs index b4912522bff..1a9216fcea8 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricApiTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricApiTests.cs @@ -225,7 +225,7 @@ public void MetricInstrumentationScopeAttributesAreTreatedAsIdentifyingProperty( Assert.Equal(2, exportedItems.Count); - bool TagComparator(KeyValuePair lhs, KeyValuePair rhs) + static bool TagComparator(KeyValuePair lhs, KeyValuePair rhs) { return lhs.Key.Equals(rhs.Key, StringComparison.Ordinal) && lhs.Value!.GetHashCode().Equals(rhs.Value!.GetHashCode()); } @@ -637,7 +637,7 @@ public void MeterSourcesWildcardSupportNegativeTestNoMeterAdded(bool hasView) [InlineData(false)] public void CounterAggregationTest(bool exportDelta) { - DateTime testStartTime = DateTime.UtcNow; + var testStartTime = DateTime.UtcNow; var exportedItems = new List(); @@ -654,7 +654,7 @@ public void CounterAggregationTest(bool exportDelta) counterLong.Add(10); counterLong.Add(10); meterProvider.ForceFlush(MaxTimeToAllowForFlush); - long sumReceived = GetLongSum(exportedItems); + var sumReceived = GetLongSum(exportedItems); Assert.Equal(20, sumReceived); var metricPoint = GetFirstMetricPoint(exportedItems); @@ -662,8 +662,8 @@ public void CounterAggregationTest(bool exportDelta) Assert.True(metricPoint.Value.StartTime >= testStartTime); Assert.True(metricPoint.Value.EndTime != default); - DateTimeOffset firstRunStartTime = metricPoint.Value.StartTime; - DateTimeOffset firstRunEndTime = metricPoint.Value.EndTime; + var firstRunStartTime = metricPoint.Value.StartTime; + var firstRunEndTime = metricPoint.Value.EndTime; exportedItems.Clear(); @@ -734,7 +734,7 @@ public void ObservableCounterAggregationTest(bool exportDelta) var exportedItems = new List(); using var meter = new Meter($"{Utils.GetCurrentMethodName()}.{exportDelta}"); - int i = 1; + var i = 1; var counterLong = meter.CreateObservableCounter( "observable-counter", () => @@ -753,7 +753,7 @@ public void ObservableCounterAggregationTest(bool exportDelta) })); meterProvider.ForceFlush(MaxTimeToAllowForFlush); - long sumReceived = GetLongSum(exportedItems); + var sumReceived = GetLongSum(exportedItems); Assert.Equal(10, sumReceived); exportedItems.Clear(); @@ -877,7 +877,7 @@ public void ObservableCounterWithTagsAggregationTest(bool exportDelta) ValidateMetricPointTags(tags3, metricPoint3.Tags); } - [Theory(Skip = "Known issue.")] + [Theory(Skip = "https://github.com/open-telemetry/opentelemetry-specification/issues/1874")] [InlineData(true)] [InlineData(false)] public void ObservableCounterSpatialAggregationTest(bool exportDelta) @@ -948,7 +948,7 @@ public void ObservableCounterSpatialAggregationTest(bool exportDelta) [InlineData(false)] public void UpDownCounterAggregationTest(bool exportDelta) { - DateTime testStartTime = DateTime.UtcNow; + var testStartTime = DateTime.UtcNow; var exportedItems = new List(); @@ -965,7 +965,7 @@ public void UpDownCounterAggregationTest(bool exportDelta) counterLong.Add(10); counterLong.Add(-5); meterProvider.ForceFlush(MaxTimeToAllowForFlush); - long sumReceived = GetLongSum(exportedItems); + var sumReceived = GetLongSum(exportedItems); Assert.Equal(5, sumReceived); var metricPoint = GetFirstMetricPoint(exportedItems); @@ -973,8 +973,8 @@ public void UpDownCounterAggregationTest(bool exportDelta) Assert.True(metricPoint.Value.StartTime >= testStartTime); Assert.True(metricPoint.Value.EndTime != default); - DateTimeOffset firstRunStartTime = metricPoint.Value.StartTime; - DateTimeOffset firstRunEndTime = metricPoint.Value.EndTime; + var firstRunStartTime = metricPoint.Value.StartTime; + var firstRunEndTime = metricPoint.Value.EndTime; exportedItems.Clear(); @@ -1025,7 +1025,7 @@ public void ObservableUpDownCounterAggregationTest(bool exportDelta) var exportedItems = new List(); using var meter = new Meter($"{Utils.GetCurrentMethodName()}.{exportDelta}"); - int i = 1; + var i = 1; var counterLong = meter.CreateObservableUpDownCounter( "observable-counter", () => @@ -1044,7 +1044,7 @@ public void ObservableUpDownCounterAggregationTest(bool exportDelta) })); meterProvider.ForceFlush(MaxTimeToAllowForFlush); - long sumReceived = GetLongSum(exportedItems); + var sumReceived = GetLongSum(exportedItems); Assert.Equal(10, sumReceived); exportedItems.Clear(); @@ -1415,7 +1415,7 @@ public void DimensionsAreOrderInsensitiveWithSortedKeysFirst(bool exportDelta) CheckTagsForNthMetricPoint(exportedItems, expectedTagsForSecondMetricPoint, 2); CheckTagsForNthMetricPoint(exportedItems, expectedTagsForThirdMetricPoint, 3); CheckTagsForNthMetricPoint(exportedItems, expectedTagsForFourthMetricPoint, 4); - long sumReceived = GetLongSum(exportedItems); + var sumReceived = GetLongSum(exportedItems); Assert.Equal(75, sumReceived); exportedItems.Clear(); @@ -1506,7 +1506,7 @@ public void DimensionsAreOrderInsensitiveWithUnsortedKeysFirst(bool exportDelta) CheckTagsForNthMetricPoint(exportedItems, expectedTagsForSecondMetricPoint, 2); CheckTagsForNthMetricPoint(exportedItems, expectedTagsForThirdMetricPoint, 3); CheckTagsForNthMetricPoint(exportedItems, expectedTagsForFourthMetricPoint, 4); - long sumReceived = GetLongSum(exportedItems); + var sumReceived = GetLongSum(exportedItems); Assert.Equal(75, sumReceived); exportedItems.Clear(); @@ -1646,7 +1646,7 @@ int MetricPointCount() // for no tag point! // This may be changed later. counterLong.Add(10); - for (int i = 0; i < MeterProviderBuilderSdk.DefaultCardinalityLimit + 1; i++) + for (var i = 0; i < MeterProviderBuilderSdk.DefaultCardinalityLimit + 1; i++) { counterLong.Add(10, new KeyValuePair("key", "value" + i)); } @@ -1656,7 +1656,7 @@ int MetricPointCount() exportedItems.Clear(); counterLong.Add(10); - for (int i = 0; i < MeterProviderBuilderSdk.DefaultCardinalityLimit + 1; i++) + for (var i = 0; i < MeterProviderBuilderSdk.DefaultCardinalityLimit + 1; i++) { counterLong.Add(10, new KeyValuePair("key", "value" + i)); } @@ -1665,7 +1665,7 @@ int MetricPointCount() Assert.Equal(MeterProviderBuilderSdk.DefaultCardinalityLimit, MetricPointCount()); counterLong.Add(10); - for (int i = 0; i < MeterProviderBuilderSdk.DefaultCardinalityLimit + 1; i++) + for (var i = 0; i < MeterProviderBuilderSdk.DefaultCardinalityLimit + 1; i++) { counterLong.Add(10, new KeyValuePair("key", "value" + i)); } @@ -1681,39 +1681,27 @@ int MetricPointCount() [Fact] public void MultithreadedByteCounterTest() - { - this.MultithreadedCounterTest((byte)DeltaLongValueUpdatedByEachCall); - } + => this.MultithreadedCounterTest((byte)DeltaLongValueUpdatedByEachCall); [Fact] public void MultithreadedShortCounterTest() - { - this.MultithreadedCounterTest((short)DeltaLongValueUpdatedByEachCall); - } + => this.MultithreadedCounterTest((short)DeltaLongValueUpdatedByEachCall); [Fact] public void MultithreadedIntCounterTest() - { - this.MultithreadedCounterTest((int)DeltaLongValueUpdatedByEachCall); - } + => this.MultithreadedCounterTest((int)DeltaLongValueUpdatedByEachCall); [Fact] public void MultithreadedLongCounterTest() - { - this.MultithreadedCounterTest(DeltaLongValueUpdatedByEachCall); - } + => this.MultithreadedCounterTest(DeltaLongValueUpdatedByEachCall); [Fact(Skip = "https://github.com/open-telemetry/opentelemetry-dotnet/issues/6803")] public void MultithreadedSingleCounterTest() - { - this.MultithreadedCounterTest((float)DeltaDoubleValueUpdatedByEachCall); - } + => this.MultithreadedCounterTest((float)DeltaDoubleValueUpdatedByEachCall); [Fact] public void MultithreadedDoubleCounterTest() - { - this.MultithreadedCounterTest(DeltaDoubleValueUpdatedByEachCall); - } + => this.MultithreadedCounterTest(DeltaDoubleValueUpdatedByEachCall); [Fact] public void MultithreadedByteHistogramTest() @@ -2010,14 +1998,14 @@ private static void CounterUpdateThread(object? obj) where T : struct, IComparable { var arguments = obj as UpdateThreadArguments; - Debug.Assert(arguments != null, "arguments was null"); + Assert.NotNull(arguments); - var mre = arguments!.MreToBlockUpdateThread; + var mre = arguments.MreToBlockUpdateThread; var mreToEnsureAllThreadsStart = arguments.MreToEnsureAllThreadsStart; var valueToUpdate = arguments.ValuesToRecord[0]; var counter = arguments.Instrument as Counter; - Debug.Assert(counter != null, "counter was null"); + Assert.NotNull(counter); if (Interlocked.Increment(ref arguments.ThreadsStartedCount) == NumberOfThreads) { @@ -2027,9 +2015,9 @@ private static void CounterUpdateThread(object? obj) // Wait until signalled to start calling update on aggregator mre.WaitOne(); - for (int i = 0; i < NumberOfMetricUpdateByEachThread; i++) + for (var i = 0; i < NumberOfMetricUpdateByEachThread; i++) { - counter!.Add(valueToUpdate, new KeyValuePair("verb", "GET")); + counter.Add(valueToUpdate, new KeyValuePair("verb", "GET")); } } @@ -2037,12 +2025,12 @@ private static void HistogramUpdateThread(object? obj) where T : struct, IComparable { var arguments = obj as UpdateThreadArguments; - Debug.Assert(arguments != null, "arguments was null"); + Assert.NotNull(arguments); - var mre = arguments!.MreToBlockUpdateThread; + var mre = arguments.MreToBlockUpdateThread; var mreToEnsureAllThreadsStart = arguments.MreToEnsureAllThreadsStart; var histogram = arguments.Instrument as Histogram; - Debug.Assert(histogram != null, "histogram was null"); + Assert.NotNull(histogram); if (Interlocked.Increment(ref arguments.ThreadsStartedCount) == NumberOfThreads) { @@ -2052,11 +2040,11 @@ private static void HistogramUpdateThread(object? obj) // Wait until signalled to start calling update on aggregator mre.WaitOne(); - for (int i = 0; i < NumberOfMetricUpdateByEachThread; i++) + for (var i = 0; i < NumberOfMetricUpdateByEachThread; i++) { - for (int j = 0; j < arguments.ValuesToRecord.Length; j++) + for (var j = 0; j < arguments.ValuesToRecord.Length; j++) { - histogram!.Record(arguments.ValuesToRecord[j]); + histogram.Record(arguments.ValuesToRecord[j]); } } } @@ -2087,10 +2075,10 @@ private static void ObservableUpDownCounterReportsActiveMeasurementsOnlyTest( new("key", "value2"), }; - int callbackInvocationCount = 0; + var callbackInvocationCount = 0; using var meter = new Meter($"{Utils.GetCurrentMethodName()}.{temporality}"); - var counter = meter.CreateObservableUpDownCounter( + var counter = meter.CreateObservableUpDownCounter( "observable-updowncounter", () => { @@ -2098,24 +2086,24 @@ private static void ObservableUpDownCounterReportsActiveMeasurementsOnlyTest( if (callbackInvocationCount == 1) { // First callback: Report 2 time series - return new List> - { + return + [ new(convertFromByte(10), tags1), new(convertFromByte(10), tags2), - }; + ]; } else if (callbackInvocationCount == 2) { // Second callback: Report 1 time series - return new List> - { + return + [ new(convertFromByte(10), tags1), - }; + ]; } else { // Third callback onwards: Report no time series - return new List>(); + return []; } }); @@ -2196,33 +2184,20 @@ private static void ObservableGaugeReportsActiveMeasurementsOnlyTest( new("key", "value2"), }; - int callbackInvocationCount = 0; + var callbackInvocationCount = 0; using var meter = new Meter($"{Utils.GetCurrentMethodName()}.{temporality}"); - var gauge = meter.CreateObservableGauge( + var gauge = meter.CreateObservableGauge( "observable-gauge", () => { callbackInvocationCount++; - if (callbackInvocationCount == 1) - { - return new List> - { - new(convertFromByte(10), tags1), - new(convertFromByte(20), tags2), - }; - } - else if (callbackInvocationCount == 2) + return callbackInvocationCount switch { - return new List> - { - new(convertFromByte(30), tags1), - }; - } - else - { - return new List>(); - } + 1 => [new(convertFromByte(10), tags1), new(convertFromByte(20), tags2)], + 2 => [new(convertFromByte(30), tags1)], + _ => [], + }; }); using var container = BuildMeterProvider(out var meterProvider, builder => builder @@ -2309,37 +2284,20 @@ private static void ObservableCounterDeltaAttributeSetReappearsAfterGapTest( new("key", "B"), }; - int callbackInvocationCount = 0; + var callbackInvocationCount = 0; using var meter = new Meter(Utils.GetCurrentMethodName()); - meter.CreateObservableCounter( + meter.CreateObservableCounter( "my_observable_counter", () => { callbackInvocationCount++; - if (callbackInvocationCount == 1) - { - return new List> - { - new(convertFromByte(100), tagsA), - new(convertFromByte(50), tagsB), - }; - } - else if (callbackInvocationCount == 2) + return callbackInvocationCount switch { - return new List> - { - new(convertFromByte(150), tagsA), - }; - } - else - { - return new List> - { - new(convertFromByte(200), tagsA), - new(convertFromByte(80), tagsB), - }; - } + 1 => [new(convertFromByte(100), tagsA), new(convertFromByte(50), tagsB)], + 2 => [new(convertFromByte(150), tagsA)], + _ => [new(convertFromByte(200), tagsA), new(convertFromByte(80), tagsB)], + }; }); using var container = BuildMeterProvider(out var meterProvider, builder => builder @@ -2441,33 +2399,20 @@ private static void ObservableCounterReportsActiveMeasurementsOnlyTest( new("key", "value2"), }; - int callbackInvocationCount = 0; + var callbackInvocationCount = 0; using var meter = new Meter($"{Utils.GetCurrentMethodName()}.{temporality}"); - meter.CreateObservableCounter( + meter.CreateObservableCounter( "observable-counter", () => { callbackInvocationCount++; - if (callbackInvocationCount == 1) + return callbackInvocationCount switch { - return new List> - { - new(convertFromByte(10), tags1), - new(convertFromByte(10), tags2), - }; - } - else if (callbackInvocationCount == 2) - { - return new List> - { - new(convertFromByte(20), tags1), - }; - } - else - { - return new List>(); - } + 1 => [new(convertFromByte(10), tags1), new(convertFromByte(10), tags2)], + 2 => [new(convertFromByte(20), tags1)], + _ => [], + }; }); using var container = BuildMeterProvider(out var meterProvider, builder => builder @@ -2534,18 +2479,18 @@ private void MultithreadedCounterTest(T deltaValueUpdatedByEachCall) var argToThread = new UpdateThreadArguments(new ManualResetEvent(false), new ManualResetEvent(false), meter.CreateCounter("counter"), [deltaValueUpdatedByEachCall]); - Thread[] t = new Thread[NumberOfThreads]; - for (int i = 0; i < NumberOfThreads; i++) + var t = new Thread[NumberOfThreads]; + for (var i = 0; i < NumberOfThreads; i++) { t[i] = new Thread(CounterUpdateThread); t[i].Start(argToThread); } argToThread.MreToEnsureAllThreadsStart.WaitOne(); - Stopwatch sw = Stopwatch.StartNew(); + var sw = Stopwatch.StartNew(); argToThread.MreToBlockUpdateThread.Set(); - for (int i = 0; i < NumberOfThreads; i++) + for (var i = 0; i < NumberOfThreads; i++) { t[i].Join(); } @@ -2586,18 +2531,18 @@ private void MultithreadedHistogramTest(long[] expected, T[] values) var argsToThread = new UpdateThreadArguments(new ManualResetEvent(false), new ManualResetEvent(false), meter.CreateHistogram("histogram"), values); - Thread[] t = new Thread[NumberOfThreads]; - for (int i = 0; i < NumberOfThreads; i++) + var t = new Thread[NumberOfThreads]; + for (var i = 0; i < NumberOfThreads; i++) { t[i] = new Thread(HistogramUpdateThread); t[i].Start(argsToThread); } argsToThread.MreToEnsureAllThreadsStart.WaitOne(); - Stopwatch sw = Stopwatch.StartNew(); + var sw = Stopwatch.StartNew(); argsToThread.MreToBlockUpdateThread.Set(); - for (int i = 0; i < NumberOfThreads; i++) + for (var i = 0; i < NumberOfThreads; i++) { t[i].Join(); } @@ -2610,7 +2555,7 @@ private void MultithreadedHistogramTest(long[] expected, T[] values) { foreach (var metricPoint in metric.GetMetricPoints()) { - bucketCounts = metricPoint.GetHistogramBuckets().BucketCounts.Select(v => v.RunningValue).ToArray(); + bucketCounts = [.. metricPoint.GetHistogramBuckets().BucketCounts.Select(v => v.RunningValue)]; } } diff --git a/test/OpenTelemetry.Tests/Metrics/MetricExemplarTests.cs b/test/OpenTelemetry.Tests/Metrics/MetricExemplarTests.cs index a45db006b80..0abc880494b 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricExemplarTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricExemplarTests.cs @@ -66,7 +66,7 @@ public void TestExemplarFilterSetFromConfiguration( [InlineData(MetricReaderTemporalityPreference.Delta)] public void TestExemplarsCounter(MetricReaderTemporalityPreference temporality) { - DateTime testStartTime = DateTime.UtcNow; + var testStartTime = DateTime.UtcNow; var exportedItems = new List(); using var meter = new Meter(Utils.GetCurrentMethodName()); @@ -180,7 +180,7 @@ void ValidateSecondPhase( [InlineData(MetricReaderTemporalityPreference.Delta)] public void TestExemplarsObservable(MetricReaderTemporalityPreference temporality) { - DateTime testStartTime = DateTime.UtcNow; + var testStartTime = DateTime.UtcNow; var exportedItems = new List(); (double Value, bool ExpectTraceId)[] measurementValues = @@ -189,7 +189,7 @@ public void TestExemplarsObservable(MetricReaderTemporalityPreference temporalit (19D, false) ]; - int measurementIndex = 0; + var measurementIndex = 0; using var meter = new Meter(Utils.GetCurrentMethodName()); var gaugeDouble = meter.CreateObservableGauge("testGaugeDouble", () => measurementValues[measurementIndex].Value); @@ -271,7 +271,7 @@ static void ValidateSecondPhase( [InlineData(MetricReaderTemporalityPreference.Delta, "always_on")] public void TestExemplarsHistogramWithBuckets(MetricReaderTemporalityPreference temporality, string? configValue) { - DateTime testStartTime = DateTime.UtcNow; + var testStartTime = DateTime.UtcNow; var exportedItems = new List(); using var meter = new Meter(Utils.GetCurrentMethodName()); @@ -412,7 +412,7 @@ static void ValidateScondPhase( [InlineData(MetricReaderTemporalityPreference.Delta)] public void TestExemplarsHistogramWithoutBuckets(MetricReaderTemporalityPreference temporality) { - DateTime testStartTime = DateTime.UtcNow; + var testStartTime = DateTime.UtcNow; var exportedItems = new List(); using var meter = new Meter(Utils.GetCurrentMethodName()); @@ -530,7 +530,7 @@ static void ValidateSecondPhase( [InlineData(MetricReaderTemporalityPreference.Delta)] public void TestExemplarsExponentialHistogram(MetricReaderTemporalityPreference temporality) { - DateTime testStartTime = DateTime.UtcNow; + var testStartTime = DateTime.UtcNow; var exportedItems = new List(); using var meter = new Meter(Utils.GetCurrentMethodName()); @@ -771,7 +771,7 @@ private static (double Value, bool ExpectTraceId)[] GenerateRandomValues( { var random = new Random(); var values = new (double, bool)[count]; - for (int i = 0; i < count; i++) + for (var i = 0; i < count; i++) { #pragma warning disable CA5394 // Do not use insecure randomness var nextValue = random.NextDouble() * 100_000; @@ -796,7 +796,7 @@ private static void ValidateExemplars( IEnumerable<(double Value, bool ExpectTraceId)> measurementValues, Func getExemplarValueFunc) { - int count = 0; + var count = 0; var measurements = measurementValues.ToArray(); diff --git a/test/OpenTelemetry.Tests/Metrics/MetricExporterTests.cs b/test/OpenTelemetry.Tests/Metrics/MetricExporterTests.cs index fc202267f1f..c5c5ae886be 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricExporterTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricExporterTests.cs @@ -52,6 +52,8 @@ public void FlushMetricExporterTest(ExportModes mode) Assert.True(reader.Collect()); Assert.True(meterProvider.ForceFlush()); break; + default: + break; } } @@ -59,9 +61,7 @@ public void FlushMetricExporterTest(ExportModes mode) private sealed class PushOnlyMetricExporter : BaseExporter { public override ExportResult Export(in Batch batch) - { - return ExportResult.Success; - } + => ExportResult.Success; } [ExportModes(ExportModes.Pull)] @@ -70,17 +70,13 @@ private sealed class PullOnlyMetricExporter : BaseExporter, IPullMetricE public Func? Collect { get; set; } public override ExportResult Export(in Batch batch) - { - return ExportResult.Success; - } + => ExportResult.Success; } [ExportModes(ExportModes.Pull | ExportModes.Push)] private sealed class PushPullMetricExporter : BaseExporter { public override ExportResult Export(in Batch batch) - { - return ExportResult.Success; - } + => ExportResult.Success; } } diff --git a/test/OpenTelemetry.Tests/Metrics/MetricOverflowAttributeTests.cs b/test/OpenTelemetry.Tests/Metrics/MetricOverflowAttributeTests.cs index 2652d3de0c9..45098c3425f 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricOverflowAttributeTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricOverflowAttributeTests.cs @@ -31,9 +31,9 @@ public void MetricOverflowAttributeIsRecordedCorrectlyForCounter(MetricReaderTem counter.Add(10); // Record measurement for zero tags // Max number for MetricPoints available for use when emitted with tags - int maxMetricPointsForUse = MeterProviderBuilderSdk.DefaultCardinalityLimit; + var maxMetricPointsForUse = MeterProviderBuilderSdk.DefaultCardinalityLimit; - for (int i = 0; i < maxMetricPointsForUse; i++) + for (var i = 0; i < maxMetricPointsForUse; i++) { // Emit unique key-value pairs to use up the available MetricPoints // Once this loop is run, we have used up all available MetricPoints for metrics emitted with tags @@ -88,7 +88,7 @@ public void MetricOverflowAttributeIsRecordedCorrectlyForCounter(MetricReaderTem counter.Add(15); // Record another measurement for zero tags // Emit 2500 more newer MetricPoints with distinct dimension combinations - for (int i = 2001; i < 4501; i++) + for (var i = 2001; i < 4501; i++) { counter.Add(5, new KeyValuePair("Key", i)); } @@ -171,9 +171,9 @@ public void MetricOverflowAttributeIsRecordedCorrectlyForHistogram(MetricReaderT histogram.Record(10); // Record measurement for zero tags // Max number for MetricPoints available for use when emitted with tags - int maxMetricPointsForUse = MeterProviderBuilderSdk.DefaultCardinalityLimit; + var maxMetricPointsForUse = MeterProviderBuilderSdk.DefaultCardinalityLimit; - for (int i = 0; i < maxMetricPointsForUse; i++) + for (var i = 0; i < maxMetricPointsForUse; i++) { // Emit unique key-value pairs to use up the available MetricPoints // Once this loop is run, we have used up all available MetricPoints for metrics emitted with tags @@ -228,7 +228,7 @@ public void MetricOverflowAttributeIsRecordedCorrectlyForHistogram(MetricReaderT histogram.Record(15); // Record another measurement for zero tags // Emit 2500 more newer MetricPoints with distinct dimension combinations - for (int i = 2001; i < 4501; i++) + for (var i = 2001; i < 4501; i++) { histogram.Record(5, new KeyValuePair("Key", i)); } diff --git a/test/OpenTelemetry.Tests/Metrics/MetricPointReclaimTests.cs b/test/OpenTelemetry.Tests/Metrics/MetricPointReclaimTests.cs index ded82e43297..184ae6d8af6 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricPointReclaimTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricPointReclaimTests.cs @@ -38,7 +38,7 @@ void EmitMetric(object? obj) var random = new Random(); while (true) { - int i = Interlocked.Increment(ref threadArguments!.Counter); + var i = Interlocked.Increment(ref threadArguments!.Counter); if (i <= MaxNumberOfDistinctMetricPoints) { // Check for cases where a metric with no dimension is also emitted @@ -71,13 +71,13 @@ void EmitMetric(object? obj) var threads = new Thread[NumberOfUpdateThreads]; var threadArgs = new ThreadArguments(); - for (int i = 0; i < threads.Length; i++) + for (var i = 0; i < threads.Length; i++) { threads[i] = new Thread(EmitMetric); threads[i].Start(threadArgs); } - for (int i = 0; i < threads.Length; i++) + for (var i = 0; i < threads.Length; i++) { threads[i].Join(); } @@ -126,7 +126,7 @@ public void MeasurementsAreAggregatedEvenAfterTheyAreDropped(bool emitMetricWith // Note that one MetricPoint is reserved for zero tags and one MetricPoint is reserved for the overflow tag. // This would lead to dropping a few measurements. We want to make sure that they can still be // aggregated later on when there are free MetricPoints available. - for (int i = 0; i < MaxMetricPointsPerMetricStream; i++) + for (var i = 0; i < MaxMetricPointsPerMetricStream; i++) { counter.Add(100, new KeyValuePair("key", $"value{i}")); } @@ -138,7 +138,7 @@ public void MeasurementsAreAggregatedEvenAfterTheyAreDropped(bool emitMetricWith void EmitMetric() { - int numberOfMeasurements = 0; + var numberOfMeasurements = 0; var random = new Random(); while (numberOfMeasurements < NumberOfMeasurementsPerThread) { @@ -164,13 +164,13 @@ void EmitMetric() var threads = new Thread[NumberOfUpdateThreads]; - for (int i = 0; i < threads.Length; i++) + for (var i = 0; i < threads.Length; i++) { threads[i] = new Thread(EmitMetric); threads[i].Start(); } - for (int i = 0; i < threads.Length; i++) + for (var i = 0; i < threads.Length; i++) { threads[i].Join(); } diff --git a/test/OpenTelemetry.Tests/Metrics/MetricPointTests.cs b/test/OpenTelemetry.Tests/Metrics/MetricPointTests.cs index 9e50c5354b5..005f34781e4 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricPointTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricPointTests.cs @@ -23,7 +23,7 @@ public MetricPointTests() // Evenly distribute the bound values over the range [0, MaxValue) this.bounds = new double[10]; - for (int i = 0; i < this.bounds.Length; i++) + for (var i = 0; i < this.bounds.Length; i++) { this.bounds[i] = i * 1000 / this.bounds.Length; } diff --git a/test/OpenTelemetry.Tests/Metrics/MetricReaderTests.cs b/test/OpenTelemetry.Tests/Metrics/MetricReaderTests.cs index a4580cf3780..e7c2019dc14 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricReaderTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricReaderTests.cs @@ -93,6 +93,9 @@ public void LowMemoryTemporality_UsesCorrectAggregationTemporality(string instru } break; + + default: + break; } provider.ForceFlush(); diff --git a/test/OpenTelemetry.Tests/Metrics/MetricTestsBase.cs b/test/OpenTelemetry.Tests/Metrics/MetricTestsBase.cs index 9ca73b30b43..9b5ff8b1bf4 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricTestsBase.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricTestsBase.cs @@ -85,7 +85,7 @@ static void ConfigureBuilder(MeterProviderBuilder builder, Action> expectedTags, ReadOnlyTagCollection actualTags) { - int tagIndex = 0; + var tagIndex = 0; foreach (var tag in actualTags) { Assert.Equal(expectedTags[tagIndex].Key, tag.Key); @@ -140,7 +140,7 @@ internal static double GetDoubleSum(List metrics) internal static int GetNumberOfMetricPoints(List metrics) { - int count = 0; + var count = 0; foreach (var metric in metrics) { foreach (ref readonly var metricPoint in metric.GetMetricPoints()) @@ -173,12 +173,12 @@ internal static void CheckTagsForNthMetricPoint(List metrics, List metrics, List GetExemplars(MetricPoint mp) - { - return mp.TryGetExemplars(out var exemplars) - ? exemplars.ToReadOnlyList() - : []; - } + => mp.TryGetExemplars(out var exemplars) ? exemplars.ToReadOnlyList() : []; internal static IDisposable BuildMeterProvider( out MeterProvider meterProvider, @@ -225,25 +221,21 @@ private sealed class MetricsSubscriptionManagerCleanupHostedService : IHostedSer { private readonly object metricsSubscriptionManager; +#pragma warning disable IDE0370 // Suppression is unnecessary public MetricsSubscriptionManagerCleanupHostedService(IServiceProvider serviceProvider) { this.metricsSubscriptionManager = serviceProvider.GetRequiredService( - typeof(ConsoleMetrics).Assembly.GetType("Microsoft.Extensions.Diagnostics.Metrics.MetricsSubscriptionManager")!); - - if (this.metricsSubscriptionManager == null) - { + typeof(ConsoleMetrics).Assembly.GetType("Microsoft.Extensions.Diagnostics.Metrics.MetricsSubscriptionManager")!) ?? throw new InvalidOperationException("MetricsSubscriptionManager could not be found reflectively."); - } } + // Note: The current version of MetricsSubscriptionManager seems to + // be bugged in that it doesn't implement IDisposable. This hack + // manually invokes Dispose so that tests don't clobber each other. + // See: https://github.com/dotnet/runtime/issues/94434. public void Dispose() - { - // Note: The current version of MetricsSubscriptionManager seems to - // be bugged in that it doesn't implement IDisposable. This hack - // manually invokes Dispose so that tests don't clobber each other. - // See: https://github.com/dotnet/runtime/issues/94434. - this.metricsSubscriptionManager.GetType().GetMethod("Dispose")!.Invoke(this.metricsSubscriptionManager, null); - } + => this.metricsSubscriptionManager.GetType().GetMethod("Dispose")!.Invoke(this.metricsSubscriptionManager, null); +#pragma warning restore IDE0370 // Suppression is unnecessary public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask; diff --git a/test/OpenTelemetry.Tests/Metrics/MetricViewTests.cs b/test/OpenTelemetry.Tests/Metrics/MetricViewTests.cs index 96a1122be39..8b52b497fed 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricViewTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricViewTests.cs @@ -271,18 +271,10 @@ public void ViewToRenameMetricConditionally() using var container = BuildMeterProvider(out var meterProvider, builder => builder .AddMeter(meter1.Name) .AddMeter(meter2.Name) - .AddView((instrument) => - { - if (instrument.Meter.Name.Equals(meter2.Name, StringComparison.OrdinalIgnoreCase) - && instrument.Name.Equals("name1", StringComparison.OrdinalIgnoreCase)) - { - return new MetricStreamConfiguration() { Name = "name1_Renamed", Description = "new description" }; - } - else - { - return null; - } - }) + .AddView((instrument) => instrument.Meter.Name.Equals(meter2.Name, StringComparison.OrdinalIgnoreCase) + && instrument.Name.Equals("name1", StringComparison.OrdinalIgnoreCase) + ? new MetricStreamConfiguration() { Name = "name1_Renamed", Description = "new description" } + : null) .AddInMemoryExporter(exportedItems)); // Without views only 1 stream would be @@ -530,8 +522,8 @@ public void ViewToProduceCustomHistogramBound() Assert.Equal(40, sum); Assert.Equal(7, count); - int index = 0; - int actualCount = 0; + var index = 0; + var actualCount = 0; var expectedBucketCounts = new long[] { 2, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; foreach (var histogramMeasurement in histogramPoint.GetHistogramBuckets()) { @@ -575,7 +567,7 @@ public void HistogramWithAdviceBoundaries_HandlesAllTypes() { using var meter = new Meter(Utils.GetCurrentMethodName()); var exportedItems = new List(); - int counter = 0; + var counter = 0; using var container = BuildMeterProvider(out var meterProvider, builder => { @@ -825,7 +817,7 @@ public void HistogramMinMax(double[] values, HistogramConfiguration histogramCon } var histogramPoint = metricPoints[0]; - if (histogramPoint.TryGetHistogramMinMaxValues(out double min, out double max)) + if (histogramPoint.TryGetHistogramMinMaxValues(out var min, out var max)) { Assert.Equal(expectedMin, min); Assert.Equal(expectedMax, max); @@ -872,7 +864,7 @@ public void HistogramMinMaxNotPresent(double[] values, HistogramConfiguration hi } var histogramPoint = metricPoints[0]; - Assert.False(histogramPoint.TryGetHistogramMinMaxValues(out double _, out double _)); + Assert.False(histogramPoint.TryGetHistogramMinMaxValues(out var _, out var _)); } [Fact] @@ -1127,15 +1119,7 @@ public void CardinalityLimitOfMatchingViewTakesPrecedenceOverMeterProvider(bool builder .AddMeter(meter.Name) - .AddView((instrument) => - { - if (instrument.Name == "counter2") - { - return new MetricStreamConfiguration() { Name = "MetricStreamA", CardinalityLimit = 10000 }; - } - - return null; - }) + .AddView((instrument) => instrument.Name == "counter2" ? new MetricStreamConfiguration() { Name = "MetricStreamA", CardinalityLimit = 10000 } : null) .AddInMemoryExporter(exportedItems); }); @@ -1216,7 +1200,7 @@ public void ViewConflict_TwoDistinctInstruments_ThreeStreams() Assert.Equal("MetricStreamC", metricC.Name); Assert.Equal(10, GetAggregatedValue(metricC)); - long GetAggregatedValue(Metric metric) + static long GetAggregatedValue(Metric metric) { var metricPoints = new List(); foreach (ref readonly var mp in metric.GetMetricPoints()) @@ -1410,17 +1394,7 @@ public void ViewConflict_TwoInstruments_OneMatchesView() using var container = BuildMeterProvider(out var meterProvider, builder => builder .AddMeter(meter.Name) - .AddView((instrument) => - { - if (instrument.Name == "name") - { - return new MetricStreamConfiguration { Name = "othername", TagKeys = ["key1"] }; - } - else - { - return null; - } - }) + .AddView((instrument) => instrument.Name == "name" ? new MetricStreamConfiguration { Name = "othername", TagKeys = ["key1"] } : null) .AddInMemoryExporter(exportedItems)); var instrument1 = meter.CreateCounter("name"); @@ -1463,17 +1437,7 @@ public void ViewConflict_TwoInstruments_ConflictAvoidedBecauseSecondInstrumentIs using var container = BuildMeterProvider(out var meterProvider, builder => builder .AddMeter(meter.Name) - .AddView((instrument) => - { - if (instrument.Name == "name") - { - return new MetricStreamConfiguration { Name = "othername" }; - } - else - { - return MetricStreamConfiguration.Drop; - } - }) + .AddView((instrument) => instrument.Name == "name" ? new MetricStreamConfiguration { Name = "othername" } : MetricStreamConfiguration.Drop) .AddInMemoryExporter(exportedItems)); var instrument1 = meter.CreateCounter("name"); diff --git a/test/OpenTelemetry.Tests/Metrics/MultipleReadersTests.cs b/test/OpenTelemetry.Tests/Metrics/MultipleReadersTests.cs index 26769fe39ab..ca826b6c1b9 100644 --- a/test/OpenTelemetry.Tests/Metrics/MultipleReadersTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MultipleReadersTests.cs @@ -28,7 +28,7 @@ public void ReaderCannotBeRegisteredMoreThanOnce() .AddReader(reader); using var meterProvider1 = meterProviderBuilder1.Build(); - Assert.Throws(() => meterProviderBuilder2.Build()); + Assert.Throws(meterProviderBuilder2.Build); } [Fact] @@ -115,18 +115,28 @@ public void SdkSupportsMultipleReaders(MetricReaderTemporalityPreference aggrega var counter = meter.CreateCounter("counter"); - int index = 0; + var index = 0; var values = new long[] { 100, 200, 300, 400 }; - long GetValue() => values[index++]; - var gauge = meter.CreateObservableGauge("gauge", () => GetValue()); - int indexSum = 0; + long GetValue() + { + return values[index++]; + } + + var gauge = meter.CreateObservableGauge("gauge", GetValue); + + var indexSum = 0; var valuesSum = new long[] { 1000, 1200, 1300, 1400 }; - long GetSum() => valuesSum[indexSum++]; - var observableCounter = meter.CreateObservableCounter("obs-counter", () => GetSum()); - bool defaultNamedOptionsConfigureCalled = false; - bool namedOptionsConfigureCalled = false; + long GetSum() + { + return valuesSum[indexSum++]; + } + + var observableCounter = meter.CreateObservableCounter("obs-counter", GetSum); + + var defaultNamedOptionsConfigureCalled = false; + var namedOptionsConfigureCalled = false; var meterProviderBuilder = Sdk.CreateMeterProviderBuilder() .ConfigureServices(services => @@ -256,7 +266,7 @@ public void ObservableInstrumentCallbacksInvokedForEachReaders(bool hasViews) var exportedItems1 = new List(); var exportedItems2 = new List(); using var meter = new Meter($"{Utils.GetCurrentMethodName()}.{hasViews}"); - int callbackInvocationCount = 0; + var callbackInvocationCount = 0; var gauge = meter.CreateObservableGauge("gauge", () => { callbackInvocationCount++; diff --git a/test/OpenTelemetry.Tests/OpenTelemetrySdkTests.cs b/test/OpenTelemetry.Tests/OpenTelemetrySdkTests.cs index ba456cbc4e0..b8688de7d5e 100644 --- a/test/OpenTelemetry.Tests/OpenTelemetrySdkTests.cs +++ b/test/OpenTelemetry.Tests/OpenTelemetrySdkTests.cs @@ -20,7 +20,7 @@ public void BuilderDelegateRequiredTest() [Fact] public void NoopProvidersReturnedTest() { - bool builderDelegateInvoked = false; + var builderDelegateInvoked = false; using var sdk = OpenTelemetrySdk.Create(builder => { diff --git a/test/OpenTelemetry.Tests/Resources/ResourceTests.cs b/test/OpenTelemetry.Tests/Resources/ResourceTests.cs index 8f844b77e4e..4e86076d9c4 100644 --- a/test/OpenTelemetry.Tests/Resources/ResourceTests.cs +++ b/test/OpenTelemetry.Tests/Resources/ResourceTests.cs @@ -82,7 +82,7 @@ public void CreateResource_EmptyArray() // Assert Assert.Single(resource.Attributes); - Assert.Equal(Array.Empty(), resource.Attributes.Where(x => x.Key == "EmptyArray").FirstOrDefault().Value); + Assert.Equal(Array.Empty(), resource.Attributes.FirstOrDefault(x => x.Key == "EmptyArray").Value); } [Fact] @@ -157,7 +157,7 @@ public void CreateResource_SupportedAttributeTypes() Assert.Contains(new KeyValuePair("int", 1L), resource.Attributes); Assert.Contains(new KeyValuePair("short", 1L), resource.Attributes); - double convertedFloat = Convert.ToDouble(0.1f, System.Globalization.CultureInfo.InvariantCulture); + var convertedFloat = Convert.ToDouble(0.1f, System.Globalization.CultureInfo.InvariantCulture); Assert.Contains(new KeyValuePair("float", convertedFloat), resource.Attributes); } @@ -340,14 +340,14 @@ public void MergeResource_MultiAttributeSource_DuplicatedKeysInPrimary() // Arrange var sourceAttributes = new List> { - new KeyValuePair("key1", "value1"), - new KeyValuePair("key1", "value1.1"), + new("key1", "value1"), + new("key1", "value1.1"), }; var sourceResource = new Resource(sourceAttributes); var otherAttributes = new List> { - new KeyValuePair("key2", "value2"), + new("key2", "value2"), }; var otherResource = new Resource(otherAttributes); @@ -502,7 +502,7 @@ public void GetResource_WithServiceNameSetWithTwoEnvVarsAndCode() [Fact] public void ResourceBuilder_AddDetector_Test() { - bool factoryExecuted = false; + var factoryExecuted = false; var builder = ResourceBuilder.CreateDefault(); @@ -512,7 +512,7 @@ public void ResourceBuilder_AddDetector_Test() return new NoopResourceDetector(); }); - Assert.Throws(() => builder.Build()); + Assert.Throws(builder.Build); Assert.False(factoryExecuted); var serviceCollection = new ServiceCollection(); @@ -530,7 +530,7 @@ public void ResourceBuilder_AddDetectorInternal_Test() { var builder = ResourceBuilder.CreateDefault(); - bool nullTestRun = false; + var nullTestRun = false; builder.AddDetectorInternal(sp => { @@ -545,7 +545,7 @@ public void ResourceBuilder_AddDetectorInternal_Test() builder = ResourceBuilder.CreateDefault(); - bool validTestRun = false; + var validTestRun = false; var serviceCollection = new ServiceCollection(); using var serviceProvider = serviceCollection.BuildServiceProvider(); @@ -595,7 +595,7 @@ private static void AddAttributes(Dictionary attributes, int att private static void ValidateAttributes(IEnumerable> attributes, int startIndex = 0, int endIndex = 0) { - var keyValuePairs = attributes as KeyValuePair[] ?? attributes.ToArray(); + var keyValuePairs = attributes as KeyValuePair[] ?? [.. attributes]; var endInd = endIndex == 0 ? keyValuePairs.Length - 1 : endIndex; for (var i = startIndex; i <= endInd; ++i) { diff --git a/test/OpenTelemetry.Tests/Shared/IEEE754Double.cs b/test/OpenTelemetry.Tests/Shared/IEEE754Double.cs index 9053be979e8..2dad14529bd 100644 --- a/test/OpenTelemetry.Tests/Shared/IEEE754Double.cs +++ b/test/OpenTelemetry.Tests/Shared/IEEE754Double.cs @@ -23,24 +23,16 @@ public IEEE754Double(double value) } public static implicit operator double(IEEE754Double value) - { - return ToDouble(value); - } + => ToDouble(value); public static IEEE754Double operator ++(IEEE754Double value) - { - return Increment(value); - } + => Increment(value); public static IEEE754Double operator --(IEEE754Double value) - { - return Decrement(value); - } + => Decrement(value); public static double ToDouble(IEEE754Double value) - { - return value.DoubleValue; - } + => value.DoubleValue; public static IEEE754Double Increment(IEEE754Double value) { @@ -55,20 +47,15 @@ public static IEEE754Double Decrement(IEEE754Double value) } public static IEEE754Double FromDouble(double value) - { - return new IEEE754Double(value); - } + => new(value); public static IEEE754Double FromLong(long value) - { - return new IEEE754Double { LongValue = value }; - } + => new() { LongValue = value }; public static IEEE754Double FromULong(ulong value) - { - return new IEEE754Double { ULongValue = value }; - } + => new() { ULongValue = value }; +#pragma warning disable IDE0022 // Use expression body for method public static IEEE754Double FromString(string value) { #if NET @@ -77,31 +64,32 @@ public static IEEE754Double FromString(string value) return FromLong(Convert.ToInt64(value.Replace(" ", string.Empty), 2)); #endif } +#pragma warning restore IDE0022 // Use expression body for method - public override string ToString() + public override readonly string ToString() { Span chars = stackalloc char[66]; var bits = this.ULongValue; var index = chars.Length - 1; - for (int i = 0; i < 52; i++) + for (var i = 0; i < 52; i++) { - chars[index--] = (char)(bits & 0x01 | 0x30); + chars[index--] = (char)((bits & 0x01) | 0x30); bits >>= 1; } chars[index--] = ' '; - for (int i = 0; i < 11; i++) + for (var i = 0; i < 11; i++) { - chars[index--] = (char)(bits & 0x01 | 0x30); + chars[index--] = (char)((bits & 0x01) | 0x30); bits >>= 1; } chars[index--] = ' '; - chars[index--] = (char)(bits & 0x01 | 0x30); + chars[index--] = (char)((bits & 0x01) | 0x30); return chars.ToString(); } diff --git a/test/OpenTelemetry.Tests/Shared/MathHelper.cs b/test/OpenTelemetry.Tests/Shared/MathHelper.cs index 0248af0a70d..b14fecf9bfb 100644 --- a/test/OpenTelemetry.Tests/Shared/MathHelper.cs +++ b/test/OpenTelemetry.Tests/Shared/MathHelper.cs @@ -15,7 +15,7 @@ public static double BitIncrement(double x) #if NET return Math.BitIncrement(x); #else - long bits = BitConverter.DoubleToInt64Bits(x); + var bits = BitConverter.DoubleToInt64Bits(x); if (((bits >> 32) & 0x7FF00000) >= 0x7FF00000) { @@ -45,7 +45,7 @@ public static double BitDecrement(double x) #if NET return Math.BitDecrement(x); #else - long bits = BitConverter.DoubleToInt64Bits(x); + var bits = BitConverter.DoubleToInt64Bits(x); if (((bits >> 32) & 0x7FF00000) >= 0x7FF00000) { diff --git a/test/OpenTelemetry.Tests/Shared/SkipUnlessEnvVarFoundFactAttribute.cs b/test/OpenTelemetry.Tests/Shared/SkipUnlessEnvVarFoundFactAttribute.cs index 624dbc2c2ed..6eaa5c7f9d0 100644 --- a/test/OpenTelemetry.Tests/Shared/SkipUnlessEnvVarFoundFactAttribute.cs +++ b/test/OpenTelemetry.Tests/Shared/SkipUnlessEnvVarFoundFactAttribute.cs @@ -20,7 +20,7 @@ public SkipUnlessEnvVarFoundFactAttribute(string environmentVariable) public static string? GetEnvironmentVariable(string environmentVariableName) { - string? environmentVariableValue = Environment.GetEnvironmentVariable(environmentVariableName, EnvironmentVariableTarget.Process); + var environmentVariableValue = Environment.GetEnvironmentVariable(environmentVariableName, EnvironmentVariableTarget.Process); if (string.IsNullOrEmpty(environmentVariableValue)) { diff --git a/test/OpenTelemetry.Tests/Shared/SkipUnlessEnvVarFoundTheoryAttribute.cs b/test/OpenTelemetry.Tests/Shared/SkipUnlessEnvVarFoundTheoryAttribute.cs index f08dd03a6ef..1630861ff3f 100644 --- a/test/OpenTelemetry.Tests/Shared/SkipUnlessEnvVarFoundTheoryAttribute.cs +++ b/test/OpenTelemetry.Tests/Shared/SkipUnlessEnvVarFoundTheoryAttribute.cs @@ -22,7 +22,7 @@ public SkipUnlessEnvVarFoundTheoryAttribute(string environmentVariable) public static string? GetEnvironmentVariable(string environmentVariableName) { - string? environmentVariableValue = Environment.GetEnvironmentVariable(environmentVariableName, EnvironmentVariableTarget.Process); + var environmentVariableValue = Environment.GetEnvironmentVariable(environmentVariableName, EnvironmentVariableTarget.Process); if (string.IsNullOrEmpty(environmentVariableValue)) { diff --git a/test/OpenTelemetry.Tests/Shared/TestActivityExportProcessor.cs b/test/OpenTelemetry.Tests/Shared/TestActivityExportProcessor.cs index bdeb432b516..b498b6e8e0d 100644 --- a/test/OpenTelemetry.Tests/Shared/TestActivityExportProcessor.cs +++ b/test/OpenTelemetry.Tests/Shared/TestActivityExportProcessor.cs @@ -7,7 +7,7 @@ namespace OpenTelemetry.Tests; internal sealed class TestActivityExportProcessor : SimpleActivityExportProcessor { - public List ExportedItems = new(); + public List ExportedItems = []; public TestActivityExportProcessor(BaseExporter exporter) : base(exporter) diff --git a/test/OpenTelemetry.Tests/Shared/TestEventListener.cs b/test/OpenTelemetry.Tests/Shared/TestEventListener.cs index 722bf5ed973..34434f8c373 100644 --- a/test/OpenTelemetry.Tests/Shared/TestEventListener.cs +++ b/test/OpenTelemetry.Tests/Shared/TestEventListener.cs @@ -89,7 +89,7 @@ protected override void OnEventWritten(EventWrittenEventArgs eventData) protected override void OnEventSourceCreated(EventSource eventSource) { // Check for null because this method is called by the base class constructor before we can initialize it - Action? callback = this.OnOnEventSourceCreated; + var callback = this.OnOnEventSourceCreated; callback?.Invoke(eventSource); } } diff --git a/test/OpenTelemetry.Tests/Shared/Utils.cs b/test/OpenTelemetry.Tests/Shared/Utils.cs index 95f24821d0e..9b6ac635926 100644 --- a/test/OpenTelemetry.Tests/Shared/Utils.cs +++ b/test/OpenTelemetry.Tests/Shared/Utils.cs @@ -12,10 +12,6 @@ internal static class Utils public static string GetCurrentMethodName() { var method = new StackFrame(1).GetMethod(); - - Debug.Assert(method != null, "Failed to get Method from the executing stack."); - Debug.Assert(method!.DeclaringType != null, "DeclaringType is not expected to be null."); - - return $"{method.DeclaringType!.FullName}.{method.Name}"; + return $"{method?.DeclaringType?.FullName}.{method?.Name}"; } } diff --git a/test/OpenTelemetry.Tests/SimpleExportProcessorTests.cs b/test/OpenTelemetry.Tests/SimpleExportProcessorTests.cs index 6476db62cc2..c150334d938 100644 --- a/test/OpenTelemetry.Tests/SimpleExportProcessorTests.cs +++ b/test/OpenTelemetry.Tests/SimpleExportProcessorTests.cs @@ -10,7 +10,7 @@ public class SimpleExportProcessorTests [Fact] public void Verify_SimpleExportProcessor_HandlesException() { - int counter = 0; + var counter = 0; // here our exporter will throw an exception. #pragma warning disable CA2000 // Dispose objects before losing scope diff --git a/test/OpenTelemetry.Tests/Trace/AttributesExtensions.cs b/test/OpenTelemetry.Tests/Trace/AttributesExtensions.cs index deb5e383b5b..cdb63f409b5 100644 --- a/test/OpenTelemetry.Tests/Trace/AttributesExtensions.cs +++ b/test/OpenTelemetry.Tests/Trace/AttributesExtensions.cs @@ -16,8 +16,8 @@ public static void AssertAreSame( this IEnumerable> attributes, IEnumerable> expectedAttributes) { - var expectedKeyValuePairs = expectedAttributes as KeyValuePair[] ?? expectedAttributes.ToArray(); - var actualKeyValuePairs = attributes as KeyValuePair[] ?? attributes.ToArray(); + var expectedKeyValuePairs = expectedAttributes as KeyValuePair[] ?? [.. expectedAttributes]; + var actualKeyValuePairs = attributes as KeyValuePair[] ?? [.. attributes]; Assert.Equal(actualKeyValuePairs.Length, expectedKeyValuePairs.Length); foreach (var attr in actualKeyValuePairs) diff --git a/test/OpenTelemetry.Tests/Trace/BatchExportActivityProcessorTests.cs b/test/OpenTelemetry.Tests/Trace/BatchExportActivityProcessorTests.cs index b8443c9e2b1..a56bde60a68 100644 --- a/test/OpenTelemetry.Tests/Trace/BatchExportActivityProcessorTests.cs +++ b/test/OpenTelemetry.Tests/Trace/BatchExportActivityProcessorTests.cs @@ -101,7 +101,7 @@ public async Task CheckForceFlushExport(int timeout) Assert.Equal(timeout != 0, result); // Wait for the expected number of items to be exported - int expectedCount = 2; + var expectedCount = 2; await WaitForMinimumCountAsync(exportedItems, expectedCount); diff --git a/test/OpenTelemetry.Tests/Trace/BatchTests.cs b/test/OpenTelemetry.Tests/Trace/BatchTests.cs index 918852a45bf..47ffa05ec20 100644 --- a/test/OpenTelemetry.Tests/Trace/BatchTests.cs +++ b/test/OpenTelemetry.Tests/Trace/BatchTests.cs @@ -12,8 +12,8 @@ public class BatchTests public void CheckConstructorExceptions() { Assert.Throws(() => new Batch((string[]?)null!, 0)); - Assert.Throws(() => new Batch(Array.Empty(), -1)); - Assert.Throws(() => new Batch(Array.Empty(), 1)); + Assert.Throws(() => new Batch([], -1)); + Assert.Throws(() => new Batch([], 1)); Assert.Throws(() => new Batch(null!)); } @@ -94,7 +94,7 @@ public void CheckMultipleEnumerator() circularBuffer.Add(value); var batch = new Batch(circularBuffer, 10); - int itemsProcessed = 0; + var itemsProcessed = 0; foreach (var item in batch) { itemsProcessed++; @@ -117,7 +117,7 @@ public void CheckEnumeratorResetException() var value = "a"; var batch = new Batch(value); var enumerator = batch.GetEnumerator(); - Assert.Throws(() => enumerator.Reset()); + Assert.Throws(enumerator.Reset); } [Fact] @@ -127,13 +127,13 @@ public void DrainIntoNewBatchTest() circularBuffer.Add("a"); circularBuffer.Add("b"); - Batch batch = new Batch(circularBuffer, 10); + var batch = new Batch(circularBuffer, 10); Assert.Equal(2, batch.Count); - string[] storage = new string[10]; - int selectedItemCount = 0; - foreach (string item in batch) + var storage = new string[10]; + var selectedItemCount = 0; + foreach (var item in batch) { if (item == "b") { diff --git a/test/OpenTelemetry.Tests/Trace/CurrentSpanTests.cs b/test/OpenTelemetry.Tests/Trace/CurrentSpanTests.cs index 76a85d5b2f6..16d830146a4 100644 --- a/test/OpenTelemetry.Tests/Trace/CurrentSpanTests.cs +++ b/test/OpenTelemetry.Tests/Trace/CurrentSpanTests.cs @@ -8,21 +8,17 @@ namespace OpenTelemetry.Trace.Tests; public sealed class CurrentSpanTests : IDisposable { - private readonly Tracer tracer; - public CurrentSpanTests() { Activity.DefaultIdFormat = ActivityIdFormat.W3C; Activity.ForceDefaultIdFormat = true; - this.tracer = TracerProvider.Default.GetTracer(null!); + _ = TracerProvider.Default.GetTracer(null!); } [Fact] public void CurrentSpan_WhenNoContext() - { - Assert.False(Tracer.CurrentSpan.Context.IsValid); - } + => Assert.False(Tracer.CurrentSpan.Context.IsValid); [Fact] public void CurrentSpan_WhenActivityExists() diff --git a/test/OpenTelemetry.Tests/Trace/ExceptionProcessorTests.cs b/test/OpenTelemetry.Tests/Trace/ExceptionProcessorTests.cs index 178db510e83..4c132dbbf23 100644 --- a/test/OpenTelemetry.Tests/Trace/ExceptionProcessorTests.cs +++ b/test/OpenTelemetry.Tests/Trace/ExceptionProcessorTests.cs @@ -134,9 +134,7 @@ public void ActivityStatusNotSetWhenExceptionProcessorNotEnabled() private static object? GetTagValue(Activity activity, string tagName) { - Debug.Assert(activity != null, "Activity should not be null"); - - foreach (ref readonly var tag in activity!.EnumerateTagObjects()) + foreach (ref readonly var tag in activity.EnumerateTagObjects()) { if (tag.Key == tagName) { diff --git a/test/OpenTelemetry.Tests/Trace/Propagation/TraceContextPropagatorTests.cs b/test/OpenTelemetry.Tests/Trace/Propagation/TraceContextPropagatorTests.cs index f9ec9a60a4d..bedc451b06e 100644 --- a/test/OpenTelemetry.Tests/Trace/Propagation/TraceContextPropagatorTests.cs +++ b/test/OpenTelemetry.Tests/Trace/Propagation/TraceContextPropagatorTests.cs @@ -149,7 +149,7 @@ public void Inject_NoTracestate() }; var activityContext = new ActivityContext(traceId, spanId, ActivityTraceFlags.Recorded, traceState: null); - PropagationContext propagationContext = new PropagationContext(activityContext, default); + var propagationContext = new PropagationContext(activityContext, default); var carrier = new Dictionary(); var f = new TraceContextPropagator(); f.Inject(propagationContext, carrier, Setter); @@ -169,7 +169,7 @@ public void Inject_WithTracestate() }; var activityContext = new ActivityContext(traceId, spanId, ActivityTraceFlags.Recorded, expectedHeaders[TraceState]); - PropagationContext propagationContext = new PropagationContext(activityContext, default); + var propagationContext = new PropagationContext(activityContext, default); var carrier = new Dictionary(); var f = new TraceContextPropagator(); f.Inject(propagationContext, carrier, Setter); @@ -248,10 +248,10 @@ public void MemberCountLimit() public void Key_KeyLengthLimit() { // test_tracestate_key_length_limit - string input1 = new string('z', 256) + "=1"; + var input1 = new string('z', 256) + "=1"; Assert.Equal(input1, CallTraceContextPropagator(input1)); Assert.Empty(CallTraceContextPropagator(new string('z', 257) + "=1")); - string input2 = new string('t', 241) + "@" + new string('v', 14) + "=1"; + var input2 = new string('t', 241) + "@" + new string('v', 14) + "=1"; Assert.Equal(input2, CallTraceContextPropagator(input2)); Assert.Empty(CallTraceContextPropagator(new string('t', 242) + "@v=1")); Assert.Empty(CallTraceContextPropagator("t@" + new string('v', 15) + "=1")); diff --git a/test/OpenTelemetry.Tests/Trace/SamplersTests.cs b/test/OpenTelemetry.Tests/Trace/SamplersTests.cs index db42188513f..24518125b3a 100644 --- a/test/OpenTelemetry.Tests/Trace/SamplersTests.cs +++ b/test/OpenTelemetry.Tests/Trace/SamplersTests.cs @@ -28,7 +28,7 @@ public void AlwaysOnSampler_AlwaysReturnTrue(ActivityTraceFlags flags) Assert.Equal( SamplingDecision.RecordAndSample, - new AlwaysOnSampler().ShouldSample(new SamplingParameters(parentContext, this.traceId, "Another name", ActivityKind.Server, null, new List { link })).Decision); + new AlwaysOnSampler().ShouldSample(new SamplingParameters(parentContext, this.traceId, "Another name", ActivityKind.Server, null, [link])).Decision); } [Fact] @@ -47,7 +47,7 @@ public void AlwaysOffSampler_AlwaysReturnFalse(ActivityTraceFlags flags) Assert.Equal( SamplingDecision.Drop, - new AlwaysOffSampler().ShouldSample(new SamplingParameters(parentContext, this.traceId, "Another name", ActivityKind.Server, null, new List { link })).Decision); + new AlwaysOffSampler().ShouldSample(new SamplingParameters(parentContext, this.traceId, "Another name", ActivityKind.Server, null, [link])).Decision); } [Fact] @@ -80,7 +80,7 @@ public void TracerProviderSdkSamplerAttributesAreAppliedToLegacyActivity(Samplin .AddLegacySource(operationNameForLegacyActivity) .Build(); - using Activity activity = new Activity(operationNameForLegacyActivity); + using var activity = new Activity(operationNameForLegacyActivity); activity.Start(); Assert.NotNull(activity); if (samplingDecision != SamplingDecision.Drop) diff --git a/test/OpenTelemetry.Tests/Trace/SpanContextTests.cs b/test/OpenTelemetry.Tests/Trace/SpanContextTests.cs index f6240870f9f..1dee3f29360 100644 --- a/test/OpenTelemetry.Tests/Trace/SpanContextTests.cs +++ b/test/OpenTelemetry.Tests/Trace/SpanContextTests.cs @@ -99,7 +99,7 @@ public void Equality3() { var traceId = ActivityTraceId.CreateRandom(); var spanId = ActivitySpanId.CreateRandom(); - IEnumerable> tracestate = new List>(); + IEnumerable> tracestate = []; var context1 = new SpanContext(traceId, spanId, ActivityTraceFlags.None, false, tracestate); var context2 = new SpanContext(traceId, spanId, ActivityTraceFlags.None, false, tracestate); @@ -112,7 +112,7 @@ public void Equality4() { var traceId = ActivityTraceId.CreateRandom(); var spanId = ActivitySpanId.CreateRandom(); - IEnumerable> tracestate = new List>(); + IEnumerable> tracestate = []; var context1 = new SpanContext(traceId, spanId, ActivityTraceFlags.None, false, tracestate); object context2 = new SpanContext(traceId, spanId, ActivityTraceFlags.None, false, tracestate); @@ -147,7 +147,7 @@ public void Not_Equality_DifferentTraceFlags() { var traceId = ActivityTraceId.CreateRandom(); var spanId = ActivitySpanId.CreateRandom(); - IEnumerable> tracestate = new List>(); + IEnumerable> tracestate = []; var context1 = new SpanContext(traceId, spanId, ActivityTraceFlags.Recorded, false, tracestate); var context2 = new SpanContext(traceId, spanId, ActivityTraceFlags.None, false, tracestate); @@ -160,7 +160,7 @@ public void Not_Equality_DifferentIsRemote() { var traceId = ActivityTraceId.CreateRandom(); var spanId = ActivitySpanId.CreateRandom(); - IEnumerable> tracestate = new List>(); + IEnumerable> tracestate = []; var context1 = new SpanContext(traceId, spanId, ActivityTraceFlags.Recorded, true, tracestate); var context2 = new SpanContext(traceId, spanId, ActivityTraceFlags.Recorded, false, tracestate); @@ -173,8 +173,8 @@ public void Not_Equality_DifferentTraceState() { var traceId = ActivityTraceId.CreateRandom(); var spanId = ActivitySpanId.CreateRandom(); - IEnumerable> tracestate1 = new List>() { new KeyValuePair("k", "v1") }; - IEnumerable> tracestate2 = new List>() { new KeyValuePair("k", "v2") }; + IEnumerable> tracestate1 = [new KeyValuePair("k", "v1")]; + IEnumerable> tracestate2 = [new KeyValuePair("k", "v2")]; var context1 = new SpanContext(traceId, spanId, ActivityTraceFlags.Recorded, true, tracestate1); var context2 = new SpanContext(traceId, spanId, ActivityTraceFlags.Recorded, true, tracestate2); @@ -187,7 +187,7 @@ public void TestGetHashCode() { var traceId = ActivityTraceId.CreateRandom(); var spanId = ActivitySpanId.CreateRandom(); - IEnumerable> tracestate = new List>(); + IEnumerable> tracestate = []; var context1 = new SpanContext(traceId, spanId, ActivityTraceFlags.Recorded, true, tracestate); Assert.NotEqual(0, context1.GetHashCode()); diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderBaseTests.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderBaseTests.cs index 9b6d5e7c2ac..c567500e6c5 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderBaseTests.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderBaseTests.cs @@ -27,7 +27,7 @@ public void TracerProviderIsExpectedType(string? value, Type expected) [Fact] public void AddInstrumentationInvokesFactoryTest() { - bool factoryInvoked = false; + var factoryInvoked = false; var instrumentation = new TestTracerProviderBuilder(); instrumentation.AddInstrumentationViaProtectedMethod(() => diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTests.cs index 502d68faca5..c2e5dc01420 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTests.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTests.cs @@ -139,8 +139,9 @@ public void ServiceLifecycleAvailableToSDKBuilderTest() [Fact] public void AddProcessorTest() { - List processorsToAdd = new() - { +#pragma warning disable CA2000 // Dispose objects before losing scope + List processorsToAdd = + [ new MyProcessor() { Name = "A", @@ -153,7 +154,8 @@ public void AddProcessorTest() { Name = "C", }, - }; + ]; +#pragma warning restore CA2000 // Dispose objects before losing scope var builder = Sdk.CreateTracerProviderBuilder(); foreach (var processor in processorsToAdd) @@ -161,14 +163,14 @@ public void AddProcessorTest() builder.AddProcessor(processor); } - List expectedProcessors = new() - { + List expectedProcessors = + [ processorsToAdd.First(p => p.Name == "A"), processorsToAdd.First(p => p.Name == "B"), processorsToAdd.First(p => p.Name == "C"), - }; + ]; - List actualProcessors = new(); + List actualProcessors = []; using (var provider = builder.Build() as TracerProviderSdk) { @@ -203,8 +205,9 @@ public void AddProcessorTest() [Fact] public void AddProcessorWithWeightTest() { - List processorsToAdd = new() - { +#pragma warning disable CA2000 // Dispose objects before losing scope + List processorsToAdd = + [ new MyProcessor() { Name = "C", @@ -235,7 +238,8 @@ public void AddProcessorWithWeightTest() Name = "D", PipelineWeight = 0, }, - }; + ]; +#pragma warning restore CA2000 // Dispose objects before losing scope var builder = Sdk.CreateTracerProviderBuilder(); foreach (var processor in processorsToAdd) @@ -243,17 +247,17 @@ public void AddProcessorWithWeightTest() builder.AddProcessor(processor); } - List expectedProcessors = new() - { + List expectedProcessors = + [ processorsToAdd.First(p => p.Name == "A"), processorsToAdd.First(p => p.Name == "B"), processorsToAdd.First(p => p.Name == "C"), processorsToAdd.First(p => p.Name == "D"), processorsToAdd.First(p => p.Name == "E"), processorsToAdd.First(p => p.Name == "F"), - }; + ]; - List actualProcessors = new(); + List actualProcessors = []; using (var provider = builder .SetErrorStatusOnException() // Forced to be first processor @@ -266,7 +270,7 @@ public void AddProcessorWithWeightTest() Assert.NotNull(compositeProcessor); - bool isFirstProcessor = true; + var isFirstProcessor = true; var lastWeight = int.MinValue; var current = compositeProcessor.Head; while (current != null) @@ -370,8 +374,8 @@ public void SetAndConfigureResourceTest() { var builder = Sdk.CreateTracerProviderBuilder(); - int configureInvocations = 0; - bool serviceProviderTestExecuted = false; + var configureInvocations = 0; + var serviceProviderTestExecuted = false; builder.SetResourceBuilder(ResourceBuilder.CreateEmpty().AddService("Test")); builder.ConfigureResource(builder => @@ -415,7 +419,7 @@ public void ConfigureBuilderIConfigurationAvailableTest() { Environment.SetEnvironmentVariable("TEST_KEY", "TEST_KEY_VALUE"); - bool configureBuilderCalled = false; + var configureBuilderCalled = false; using var provider = Sdk.CreateTracerProviderBuilder() .ConfigureBuilder((sp, builder) => @@ -438,7 +442,7 @@ public void ConfigureBuilderIConfigurationAvailableTest() [Fact] public void ConfigureBuilderIConfigurationModifiableTest() { - bool configureBuilderCalled = false; + var configureBuilderCalled = false; using var provider = Sdk.CreateTracerProviderBuilder() .ConfigureServices(services => @@ -469,9 +473,9 @@ public void ConfigureBuilderIConfigurationModifiableTest() [InlineData(false)] public void TracerProviderNestedResolutionUsingBuilderTest(bool callNestedConfigure) { - bool innerConfigureBuilderTestExecuted = false; - bool innerConfigureOpenTelemetryLoggerProviderTestExecuted = false; - bool innerConfigureOpenTelemetryLoggerProviderTestWithServiceProviderExecuted = false; + var innerConfigureBuilderTestExecuted = false; + var innerConfigureOpenTelemetryLoggerProviderTestExecuted = false; + var innerConfigureOpenTelemetryLoggerProviderTestWithServiceProviderExecuted = false; using var provider = Sdk.CreateTracerProviderBuilder() .ConfigureServices(services => @@ -520,7 +524,7 @@ public void TracerProviderNestedResolutionUsingBuilderTest(bool callNestedConfig [Fact] public void TracerProviderSetSamplerFactoryTest() { - bool factoryInvoked = false; + var factoryInvoked = false; using var tracerProvider = Sdk.CreateTracerProviderBuilder() .SetSampler(sp => @@ -542,7 +546,7 @@ public void TracerProviderSetSamplerFactoryTest() [Fact] public void TracerProviderAddProcessorFactoryTest() { - bool factoryInvoked = false; + var factoryInvoked = false; using var tracerProvider = Sdk.CreateTracerProviderBuilder() .AddProcessor(sp => @@ -566,7 +570,7 @@ public void TracerProviderBuilderCustomImplementationBuildTest() { var builder = new MyTracerProviderBuilder(); - Assert.Throws(() => builder.Build()); + Assert.Throws(builder.Build); } private static void RunBuilderServiceLifecycleTest( @@ -581,7 +585,7 @@ private static void RunBuilderServiceLifecycleTest( .AddLegacySource("TestLegacySource1") .SetSampler(); - bool configureServicesCalled = false; + var configureServicesCalled = false; builder.ConfigureServices(services => { configureServicesCalled = true; @@ -600,7 +604,7 @@ private static void RunBuilderServiceLifecycleTest( }); }); - int configureBuilderInvocations = 0; + var configureBuilderInvocations = 0; builder.ConfigureBuilder((sp, builder) => { configureBuilderInvocations++; @@ -651,9 +655,7 @@ private static void RunBuilderServiceLifecycleTest( private sealed class MySampler : Sampler { public override SamplingResult ShouldSample(in SamplingParameters samplingParameters) - { - return new SamplingResult(SamplingDecision.RecordAndSample); - } + => new(SamplingDecision.RecordAndSample); } private sealed class MyInstrumentation : IDisposable @@ -661,10 +663,7 @@ private sealed class MyInstrumentation : IDisposable internal TracerProvider? Provider; internal bool Disposed; - public void Dispose() - { - this.Disposed = true; - } + public void Dispose() => this.Disposed = true; } private sealed class MyProcessor : BaseProcessor @@ -683,18 +682,12 @@ protected override void Dispose(bool disposing) private sealed class MyTracerProviderBuilder : TracerProviderBuilder { public override TracerProviderBuilder AddInstrumentation(Func instrumentationFactory) - { - throw new NotImplementedException(); - } + => throw new NotImplementedException(); public override TracerProviderBuilder AddLegacySource(string operationName) - { - throw new NotImplementedException(); - } + => throw new NotImplementedException(); public override TracerProviderBuilder AddSource(params string[] names) - { - throw new NotImplementedException(); - } + => throw new NotImplementedException(); } } diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTests.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTests.cs index a24d0869e3b..f8784a07e6c 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTests.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTests.cs @@ -157,8 +157,10 @@ public void TracerProviderSdkInvokesSamplingWithCorrectParameters() } // Validate that Samplers get the tags passed with Activity creation - var initialTags = new ActivityTagsCollection(); - initialTags["tagA"] = "tagAValue"; + var initialTags = new ActivityTagsCollection + { + ["tagA"] = "tagAValue", + }; using (var withInitialTags = activitySource.StartActivity("withInitialTags", ActivityKind.Client, default(ActivityContext), initialTags)) { Assert.NotNull(withInitialTags); @@ -264,7 +266,7 @@ public void TracerSdkSetsActivitySamplingResultAsPropagationWhenParentIsRemote() return new SamplingResult(SamplingDecision.Drop); }; - ActivityContext ctx = new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.None, isRemote: true); + var ctx = new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.None, isRemote: true); using var activity = activitySource.StartActivity("root", ActivityKind.Server, ctx); @@ -357,10 +359,10 @@ public void TracerSdkSetsActivitySamplingResultToNoneWhenSuppressInstrumentation [Fact] public void TracerSdkSetsActivityDataRequestedToFalseWhenSuppressInstrumentationIsTrueForLegacyActivity() { - using TestActivityProcessor testActivityProcessor = new TestActivityProcessor(); + using var testActivityProcessor = new TestActivityProcessor(); - bool startCalled = false; - bool endCalled = false; + var startCalled = false; + var endCalled = false; testActivityProcessor.StartAction = (a) => @@ -398,10 +400,10 @@ public void ProcessorDoesNotReceiveNotRecordDecisionSpan() { var activitySourceName = Utils.GetCurrentMethodName(); var testSampler = new TestSampler(); - using TestActivityProcessor testActivityProcessor = new TestActivityProcessor(); + using var testActivityProcessor = new TestActivityProcessor(); - bool startCalled = false; - bool endCalled = false; + var startCalled = false; + var endCalled = false; testActivityProcessor.StartAction = (a) => @@ -426,7 +428,7 @@ public void ProcessorDoesNotReceiveNotRecordDecisionSpan() return new SamplingResult(SamplingDecision.Drop); }; - using ActivitySource source = new ActivitySource(activitySourceName); + using var source = new ActivitySource(activitySourceName); using var activity = source.StartActivity("somename"); Assert.NotNull(activity); @@ -444,10 +446,10 @@ public void ProcessorDoesNotReceiveNotRecordDecisionSpan() [Fact] public void SdkDoesNotProcessLegacyActivityWithNoAdditionalConfig() { - using TestActivityProcessor testActivityProcessor = new TestActivityProcessor(); + using var testActivityProcessor = new TestActivityProcessor(); - bool startCalled = false; - bool endCalled = false; + var startCalled = false; + var endCalled = false; testActivityProcessor.StartAction = (a) => @@ -488,7 +490,7 @@ public void SdkDoesNotProcessLegacyActivityWithNoAdditionalConfig() [Fact] public void SdkSamplesAndProcessesLegacyActivityWithRightConfig() { - bool samplerCalled = false; + var samplerCalled = false; var sampler = new TestSampler { @@ -500,10 +502,10 @@ public void SdkSamplesAndProcessesLegacyActivityWithRightConfig() }, }; - using TestActivityProcessor testActivityProcessor = new TestActivityProcessor(); + using var testActivityProcessor = new TestActivityProcessor(); - bool startCalled = false; - bool endCalled = false; + var startCalled = false; + var endCalled = false; testActivityProcessor.StartAction = (a) => @@ -549,7 +551,7 @@ public void SdkSamplesAndProcessesLegacyActivityWithRightConfig() [Fact] public void SdkSamplesAndProcessesLegacyActivityWithRightConfigOnWildCardMode() { - bool samplerCalled = false; + var samplerCalled = false; var sampler = new TestSampler { @@ -561,10 +563,10 @@ public void SdkSamplesAndProcessesLegacyActivityWithRightConfigOnWildCardMode() }, }; - using TestActivityProcessor testActivityProcessor = new TestActivityProcessor(); + using var testActivityProcessor = new TestActivityProcessor(); - bool startCalled = false; - bool endCalled = false; + var startCalled = false; + var endCalled = false; testActivityProcessor.StartAction = (a) => @@ -611,10 +613,10 @@ public void SdkSamplesAndProcessesLegacyActivityWithRightConfigOnWildCardMode() [Fact] public void SdkCallsOnlyProcessorOnStartForLegacyActivityWhenActivitySourceIsUpdatedWithoutAddSource() { - using TestActivityProcessor testActivityProcessor = new TestActivityProcessor(); + using var testActivityProcessor = new TestActivityProcessor(); - bool startCalled = false; - bool endCalled = false; + var startCalled = false; + var endCalled = false; testActivityProcessor.StartAction = (a) => @@ -661,10 +663,10 @@ public void SdkCallsOnlyProcessorOnStartForLegacyActivityWhenActivitySourceIsUpd [Fact] public void SdkProcessesLegacyActivityWhenActivitySourceIsUpdatedWithAddSource() { - using TestActivityProcessor testActivityProcessor = new TestActivityProcessor(); + using var testActivityProcessor = new TestActivityProcessor(); - bool startCalled = false; - bool endCalled = false; + var startCalled = false; + var endCalled = false; testActivityProcessor.StartAction = (a) => @@ -711,10 +713,10 @@ public void SdkProcessesLegacyActivityWhenActivitySourceIsUpdatedWithAddSource() [Fact] public void SdkProcessesLegacyActivityEvenAfterAddingNewProcessor() { - using TestActivityProcessor testActivityProcessor = new TestActivityProcessor(); + using var testActivityProcessor = new TestActivityProcessor(); - bool startCalled = false; - bool endCalled = false; + var startCalled = false; + var endCalled = false; testActivityProcessor.StartAction = (a) => @@ -753,8 +755,8 @@ public void SdkProcessesLegacyActivityEvenAfterAddingNewProcessor() // the following validates that updated processors are processing the legacy activities created from here on. using var testActivityProcessorNew = new TestActivityProcessor(); - bool startCalledNew = false; - bool endCalledNew = false; + var startCalledNew = false; + var endCalledNew = false; testActivityProcessorNew.StartAction = (a) => @@ -899,8 +901,8 @@ public void SdkSamplesLegacyActivityWithRemoteParentWithCustomSampler(SamplingDe var parentTraceId = ActivityTraceId.CreateRandom(); var parentSpanId = ActivitySpanId.CreateRandom(); var parentTraceFlag = (parentTraceFlags == ActivityTraceFlags.Recorded) ? "01" : "00"; - string remoteParentId = $"00-{parentTraceId}-{parentSpanId}-{parentTraceFlag}"; - string tracestate = "a=b;c=d"; + var remoteParentId = $"00-{parentTraceId}-{parentSpanId}-{parentTraceFlag}"; + var tracestate = "a=b;c=d"; var operationNameForLegacyActivity = Utils.GetCurrentMethodName(); var sampler = new TestSampler() @@ -949,7 +951,7 @@ public void SdkSamplesLegacyActivityWithRemoteParentWithAlwaysOnSampler(Activity var parentTraceId = ActivityTraceId.CreateRandom(); var parentSpanId = ActivitySpanId.CreateRandom(); var parentTraceFlag = (parentTraceFlags == ActivityTraceFlags.Recorded) ? "01" : "00"; - string remoteParentId = $"00-{parentTraceId}-{parentSpanId}-{parentTraceFlag}"; + var remoteParentId = $"00-{parentTraceId}-{parentSpanId}-{parentTraceFlag}"; var operationNameForLegacyActivity = Utils.GetCurrentMethodName(); @@ -985,7 +987,7 @@ public void SdkSamplesLegacyActivityWithRemoteParentWithAlwaysOffSampler(Activit var parentTraceId = ActivityTraceId.CreateRandom(); var parentSpanId = ActivitySpanId.CreateRandom(); var parentTraceFlag = (parentTraceFlags == ActivityTraceFlags.Recorded) ? "01" : "00"; - string remoteParentId = $"00-{parentTraceId}-{parentSpanId}-{parentTraceFlag}"; + var remoteParentId = $"00-{parentTraceId}-{parentSpanId}-{parentTraceFlag}"; var operationNameForLegacyActivity = Utils.GetCurrentMethodName(); @@ -1019,7 +1021,7 @@ public void SdkSamplesLegacyActivityWithRemoteParentWithAlwaysOffSampler(Activit public void SdkPopulatesSamplingParamsCorrectlyForLegacyActivityWithInProcParent(ActivityTraceFlags traceFlags) { // Create some parent activity. - string tracestate = "a=b;c=d"; + var tracestate = "a=b;c=d"; using var activityLocalParent = new Activity("TestParent") { ActivityTraceFlags = traceFlags, @@ -1185,7 +1187,7 @@ public void TracerProviderSdkBuildsWithSDKResource(bool useConfigure) [Fact] public void TracerProviderSdkFlushesProcessorForcibly() { - using TestActivityProcessor testActivityProcessor = new TestActivityProcessor(); + using var testActivityProcessor = new TestActivityProcessor(); using var tracerProvider = Sdk.CreateTracerProviderBuilder() .AddProcessor(testActivityProcessor) @@ -1211,7 +1213,7 @@ public void SdkSamplesAndProcessesLegacySourceWhenAddLegacySourceIsCalledWithWil }, }; - using TestActivityProcessor testActivityProcessor = new TestActivityProcessor(); + using var testActivityProcessor = new TestActivityProcessor(); var onStartProcessedActivities = new List(); var onStopProcessedActivities = new List(); @@ -1345,9 +1347,7 @@ public void CheckActivityLinksAddedAfterActivityCreation() } public void Dispose() - { - GC.SuppressFinalize(this); - } + => GC.SuppressFinalize(this); private static Action CreateActivitySourceSetter() { @@ -1364,9 +1364,7 @@ private static Action CreateActivitySourceSetter() private sealed class TestTracerProviderBuilder : TracerProviderBuilderBase { public TracerProviderBuilder AddInstrumentation() - { - return this.AddInstrumentation("SomeInstrumentation", "1.0.0", () => new object()); - } + => this.AddInstrumentation("SomeInstrumentation", "1.0.0", () => new object()); } private sealed class TestInstrumentation : IDisposable @@ -1379,8 +1377,6 @@ public TestInstrumentation() } public void Dispose() - { - this.IsDisposed = true; - } + => this.IsDisposed = true; } } diff --git a/test/TestApp.AspNetCore/ActivityMiddlewareCore.cs b/test/TestApp.AspNetCore/ActivityMiddlewareCore.cs index 7a1df1eece9..15b9b7597e7 100644 --- a/test/TestApp.AspNetCore/ActivityMiddlewareCore.cs +++ b/test/TestApp.AspNetCore/ActivityMiddlewareCore.cs @@ -5,6 +5,7 @@ namespace TestApp.AspNetCore; internal sealed class ActivityMiddlewareCore { +#pragma warning disable IDE0060 // Remove unused parameter public void PreProcess(HttpContext context) { // Do nothing @@ -14,4 +15,5 @@ public void PostProcess(HttpContext context) { // Do nothing } +#pragma warning restore IDE0060 // Remove unused parameter } diff --git a/test/TestApp.AspNetCore/CallbackMiddlewareCore.cs b/test/TestApp.AspNetCore/CallbackMiddlewareCore.cs index c45091b1951..0a0d3b18cd0 100644 --- a/test/TestApp.AspNetCore/CallbackMiddlewareCore.cs +++ b/test/TestApp.AspNetCore/CallbackMiddlewareCore.cs @@ -7,6 +7,7 @@ internal sealed class CallbackMiddlewareCore { public Task ProcessAsync(HttpContext context) { + System.Diagnostics.Debug.Assert(context != null, "HttpContext is null."); return Task.FromResult(true); } } diff --git a/test/TestApp.AspNetCore/Controllers/ValuesController.cs b/test/TestApp.AspNetCore/Controllers/ValuesController.cs index 4c8a591980e..d7d36a668bc 100644 --- a/test/TestApp.AspNetCore/Controllers/ValuesController.cs +++ b/test/TestApp.AspNetCore/Controllers/ValuesController.cs @@ -5,22 +5,18 @@ namespace TestApp.AspNetCore.Controllers; +#pragma warning disable IDE0060 // Remove unused parameter + [Route("api/[controller]")] public class ValuesController : Controller { // GET api/values [HttpGet] - public IEnumerable Get() - { - return ["value1", "value2"]; - } + public IEnumerable Get() => ["value1", "value2"]; // GET api/values/5 [HttpGet("{id}")] - public string Get(int id) - { - return "value"; - } + public string Get(int id) => "value"; // POST api/values [HttpPost] From 89ae793ab83c96990654b6a38090568d90178f21 Mon Sep 17 00:00:00 2001 From: martincostello Date: Sun, 15 Mar 2026 15:30:42 +0000 Subject: [PATCH 09/55] Fix more warnings Fix warnings I get locally trying to run the W3cTraceContext tests. --- src/OpenTelemetry.Api/Baggage.cs | 4 ++-- .../Context/RuntimeContextSlot.cs | 4 ++-- src/OpenTelemetry.Api/Trace/SpanContext.cs | 4 ++-- src/OpenTelemetry.Api/Trace/Tracer.cs | 2 +- src/OpenTelemetry/BaseExportProcessor.cs | 2 +- src/OpenTelemetry/Batch.cs | 7 +++---- .../Logs/ILogger/OpenTelemetryLoggerProvider.cs | 2 +- src/OpenTelemetry/Logs/LogRecord.cs | 8 +------- src/OpenTelemetry/Logs/LoggerProviderSdk.cs | 2 +- .../Metrics/Builder/MeterProviderBuilderBase.cs | 2 +- .../Metrics/Builder/MeterProviderBuilderSdk.cs | 3 +-- .../Exemplar/FixedSizeExemplarReservoir.cs | 2 +- .../Exemplar/ReadOnlyExemplarCollection.cs | 2 +- src/OpenTelemetry/Metrics/Metric.cs | 2 +- .../Metrics/MetricPoint/MetricPointsAccessor.cs | 2 +- .../Metrics/Reader/BaseExportingMetricReader.cs | 2 +- .../View/ExplicitBucketHistogramConfiguration.cs | 2 +- .../Metrics/View/MetricStreamConfiguration.cs | 2 +- .../Trace/Builder/TracerProviderBuilderBase.cs | 2 +- .../Builder/TracerProviderBuilderExtensions.cs | 15 ++++++--------- .../TestTextMap.cs | 4 +--- 21 files changed, 31 insertions(+), 44 deletions(-) diff --git a/src/OpenTelemetry.Api/Baggage.cs b/src/OpenTelemetry.Api/Baggage.cs index 317131227b8..b550d542078 100644 --- a/src/OpenTelemetry.Api/Baggage.cs +++ b/src/OpenTelemetry.Api/Baggage.cs @@ -318,14 +318,14 @@ public Baggage RemoveBaggage(string name) return new Baggage(baggage); } +#pragma warning disable CA1822 // Mark members as static /// /// Returns a new with all the key/value pairs removed. /// /// New with all the key/value pairs removed. -#pragma warning disable CA1822 // Mark members as static public Baggage ClearBaggage() -#pragma warning restore CA1822 // Mark members as static => default; +#pragma warning restore CA1822 // Mark members as static /// /// Returns an enumerator that iterates through the . diff --git a/src/OpenTelemetry.Api/Context/RuntimeContextSlot.cs b/src/OpenTelemetry.Api/Context/RuntimeContextSlot.cs index 7502070ffc0..3f4c004f4f2 100644 --- a/src/OpenTelemetry.Api/Context/RuntimeContextSlot.cs +++ b/src/OpenTelemetry.Api/Context/RuntimeContextSlot.cs @@ -27,19 +27,19 @@ protected RuntimeContextSlot(string name) /// public string Name { get; private set; } +#pragma warning disable CA1716 // Identifiers should not match keywords /// /// Get the value from the context slot. /// /// The value retrieved from the context slot. -#pragma warning disable CA1716 // Identifiers should not match keywords public abstract T? Get(); #pragma warning restore CA1716 // Identifiers should not match keywords +#pragma warning disable CA1716 // Identifiers should not match keywords /// /// Set the value to the context slot. /// /// The value to be set. -#pragma warning disable CA1716 // Identifiers should not match keywords public abstract void Set(T value); #pragma warning restore CA1716 // Identifiers should not match keywords diff --git a/src/OpenTelemetry.Api/Trace/SpanContext.cs b/src/OpenTelemetry.Api/Trace/SpanContext.cs index 3baf72907f7..fb1969f1cc7 100644 --- a/src/OpenTelemetry.Api/Trace/SpanContext.cs +++ b/src/OpenTelemetry.Api/Trace/SpanContext.cs @@ -101,14 +101,14 @@ public IEnumerable> TraceState } } +#pragma warning disable CA2225 // Operator overloads have named alternates /// /// Converts a into an . /// /// source. -#pragma warning disable CA2225 // Operator overloads have named alternates public static implicit operator ActivityContext(SpanContext spanContext) -#pragma warning restore CA2225 // Operator overloads have named alternates => spanContext.ActivityContext; +#pragma warning restore CA2225 // Operator overloads have named alternates /// /// Compare two for equality. diff --git a/src/OpenTelemetry.Api/Trace/Tracer.cs b/src/OpenTelemetry.Api/Trace/Tracer.cs index d0fb906ec18..4c6f23d0175 100644 --- a/src/OpenTelemetry.Api/Trace/Tracer.cs +++ b/src/OpenTelemetry.Api/Trace/Tracer.cs @@ -52,10 +52,10 @@ public static TelemetrySpan CurrentSpan /// /// The span to be made current. /// The supplied span for call chaining. + [MethodImpl(MethodImplOptions.AggressiveInlining)] #if NET [return: NotNullIfNotNull(nameof(span))] #endif - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TelemetrySpan? WithSpan(TelemetrySpan? span) { span?.Activate(); diff --git a/src/OpenTelemetry/BaseExportProcessor.cs b/src/OpenTelemetry/BaseExportProcessor.cs index bafa4c117ca..c42e33b6689 100644 --- a/src/OpenTelemetry/BaseExportProcessor.cs +++ b/src/OpenTelemetry/BaseExportProcessor.cs @@ -34,10 +34,10 @@ public abstract class BaseExportProcessor : BaseProcessor #pragma warning restore CA1708 // Identifiers should differ by more than case where T : class { +#pragma warning disable CA1051 // Do not declare visible instance fields /// /// Gets the exporter used by the processor. /// -#pragma warning disable CA1051 // Do not declare visible instance fields protected readonly BaseExporter exporter; #pragma warning restore CA1051 // Do not declare visible instance fields diff --git a/src/OpenTelemetry/Batch.cs b/src/OpenTelemetry/Batch.cs index 48d9d42eb55..343d409b3c7 100644 --- a/src/OpenTelemetry/Batch.cs +++ b/src/OpenTelemetry/Batch.cs @@ -92,11 +92,10 @@ public void Dispose() /// . public Enumerator GetEnumerator() => this.circularBuffer != null - ? new Enumerator(this.circularBuffer, this.targetCount) + ? new(this.circularBuffer, this.targetCount) : this.item != null - ? new Enumerator(this.item) - /* In the event someone uses default/new Batch() to create Batch we fallback to empty items mode. */ - : new Enumerator(this.items ?? [], this.targetCount); + ? new(this.item) + : new(this.items ?? [], this.targetCount); /// /// Enumerates the elements of a . diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerProvider.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerProvider.cs index b4f3044f0fe..7283fd357d8 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerProvider.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerProvider.cs @@ -74,8 +74,8 @@ internal OpenTelemetryLoggerProvider( internal IExternalScopeProvider? ScopeProvider { get; private set; } - /// #pragma warning disable CA1033 // Interface methods should be callable by child types + /// void ISupportExternalScope.SetScopeProvider(IExternalScopeProvider scopeProvider) #pragma warning restore CA1033 // Interface methods should be callable by child types { diff --git a/src/OpenTelemetry/Logs/LogRecord.cs b/src/OpenTelemetry/Logs/LogRecord.cs index 822aa84175f..7581183a040 100644 --- a/src/OpenTelemetry/Logs/LogRecord.cs +++ b/src/OpenTelemetry/Logs/LogRecord.cs @@ -154,7 +154,6 @@ public string? TraceState set => this.ILoggerData.TraceState = value; } -#if EXPOSE_EXPERIMENTAL_FEATURES /// /// Gets or sets the log category name. /// @@ -164,11 +163,6 @@ public string? TraceState /// Setting a new value for will result in a new /// being set. /// -#else - /// - /// Gets or sets the log category name. - /// -#endif public string? CategoryName { get => this.Logger.Name; @@ -181,10 +175,10 @@ public string? CategoryName } } +#if EXPOSE_EXPERIMENTAL_FEATURES /// /// Gets or sets the log . /// -#if EXPOSE_EXPERIMENTAL_FEATURES [Obsolete("Use Severity instead. LogLevel will be removed in a future version.")] #endif public LogLevel LogLevel diff --git a/src/OpenTelemetry/Logs/LoggerProviderSdk.cs b/src/OpenTelemetry/Logs/LoggerProviderSdk.cs index ff7857c70d4..17760cb8a52 100644 --- a/src/OpenTelemetry/Logs/LoggerProviderSdk.cs +++ b/src/OpenTelemetry/Logs/LoggerProviderSdk.cs @@ -187,8 +187,8 @@ public bool Shutdown(int timeoutMilliseconds) } } - /// #if EXPOSE_EXPERIMENTAL_FEATURES + /// protected #else internal diff --git a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs index 2745dc5a277..2fe7bdacaa0 100644 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs +++ b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs @@ -85,8 +85,8 @@ MeterProviderBuilder IMeterProviderBuilder.ConfigureServices(Action #pragma warning disable CA1033 // Interface methods should be callable by child types + /// MeterProviderBuilder IDeferredMeterProviderBuilder.Configure(Action configure) #pragma warning restore CA1033 // Interface methods should be callable by child types { diff --git a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs index 1565d24ac75..2381d8f8a76 100644 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs @@ -69,8 +69,7 @@ public static bool IsValidInstrumentName(string instrumentName) /// The view name. /// Boolean indicating if the instrument is valid. public static bool IsValidViewName(string customViewName) => - /* Only validate the view name in case it's not null. In case it's null, the view name will be the instrument name as per the spec. */ - customViewName == null || InstrumentNameRegex.IsMatch(customViewName); + customViewName == null || InstrumentNameRegex.IsMatch(customViewName); // Only validate the view name in case it's not null. In case it's null, the view name will be the instrument name as per the spec. public void RegisterProvider(MeterProviderSdk meterProvider) { diff --git a/src/OpenTelemetry/Metrics/Exemplar/FixedSizeExemplarReservoir.cs b/src/OpenTelemetry/Metrics/Exemplar/FixedSizeExemplarReservoir.cs index fc0dfb6ca62..9b0e0c400e5 100644 --- a/src/OpenTelemetry/Metrics/Exemplar/FixedSizeExemplarReservoir.cs +++ b/src/OpenTelemetry/Metrics/Exemplar/FixedSizeExemplarReservoir.cs @@ -24,12 +24,12 @@ abstract class FixedSizeExemplarReservoir : ExemplarReservoir private readonly Exemplar[] runningExemplars; private readonly Exemplar[] snapshotExemplars; +#pragma warning disable RS0022 // Constructor make noninheritable base class inheritable /// /// Initializes a new instance of the class. /// /// The capacity (number of s) /// to be contained in the reservoir. -#pragma warning disable RS0022 // Constructor make noninheritable base class inheritable protected FixedSizeExemplarReservoir(int capacity) #pragma warning restore RS0022 // Constructor make noninheritable base class inheritable { diff --git a/src/OpenTelemetry/Metrics/Exemplar/ReadOnlyExemplarCollection.cs b/src/OpenTelemetry/Metrics/Exemplar/ReadOnlyExemplarCollection.cs index 20cbf404d9c..fc5eaaaefaa 100644 --- a/src/OpenTelemetry/Metrics/Exemplar/ReadOnlyExemplarCollection.cs +++ b/src/OpenTelemetry/Metrics/Exemplar/ReadOnlyExemplarCollection.cs @@ -72,10 +72,10 @@ internal IReadOnlyList ToReadOnlyList() return list; } +#pragma warning disable CA1034 // Nested types should not be visible - already part of public API /// /// Enumerates the elements of a . /// -#pragma warning disable CA1034 // Nested types should not be visible - already part of public API public struct Enumerator #pragma warning restore CA1034 // Nested types should not be visible - already part of public API { diff --git a/src/OpenTelemetry/Metrics/Metric.cs b/src/OpenTelemetry/Metrics/Metric.cs index 2623ae4f2e4..eab94605d6b 100644 --- a/src/OpenTelemetry/Metrics/Metric.cs +++ b/src/OpenTelemetry/Metrics/Metric.cs @@ -234,10 +234,10 @@ internal Metric( /// public string MeterVersion => this.InstrumentIdentity.MeterVersion; +#pragma warning disable CA1056 // Change the type of property from 'string' to 'System.Uri' /// /// Gets the meter schema URL for the metric stream. /// -#pragma warning disable CA1056 // Change the type of property from 'string' to 'System.Uri' public string MeterSchemaUrl => this.InstrumentIdentity.MeterSchemaUrl; #pragma warning restore CA1056 // Change the type of property from 'string' to 'System.Uri' diff --git a/src/OpenTelemetry/Metrics/MetricPoint/MetricPointsAccessor.cs b/src/OpenTelemetry/Metrics/MetricPoint/MetricPointsAccessor.cs index e006eb5b9ab..0b30e1933ec 100644 --- a/src/OpenTelemetry/Metrics/MetricPoint/MetricPointsAccessor.cs +++ b/src/OpenTelemetry/Metrics/MetricPoint/MetricPointsAccessor.cs @@ -27,10 +27,10 @@ internal MetricPointsAccessor(MetricPoint[] metricsPoints, int[] metricPointsToP public Enumerator GetEnumerator() => new(this.metricsPoints, this.metricPointsToProcess, this.targetCount); +#pragma warning disable CA1034 // Nested types should not be visible - already part of public API /// /// Enumerates the elements of a . /// -#pragma warning disable CA1034 // Nested types should not be visible - already part of public API public struct Enumerator #pragma warning restore CA1034 // Nested types should not be visible - already part of public API { diff --git a/src/OpenTelemetry/Metrics/Reader/BaseExportingMetricReader.cs b/src/OpenTelemetry/Metrics/Reader/BaseExportingMetricReader.cs index 0d9d9c4572b..242ad99c814 100644 --- a/src/OpenTelemetry/Metrics/Reader/BaseExportingMetricReader.cs +++ b/src/OpenTelemetry/Metrics/Reader/BaseExportingMetricReader.cs @@ -14,10 +14,10 @@ namespace OpenTelemetry.Metrics; public class BaseExportingMetricReader : MetricReader #pragma warning restore CA1708 // Identifiers should differ by more than case { +#pragma warning disable CA1051 // Do not declare visible instance fields /// /// Gets the exporter used by the metric reader. /// -#pragma warning disable CA1051 // Do not declare visible instance fields protected readonly BaseExporter exporter; #pragma warning restore CA1051 // Do not declare visible instance fields diff --git a/src/OpenTelemetry/Metrics/View/ExplicitBucketHistogramConfiguration.cs b/src/OpenTelemetry/Metrics/View/ExplicitBucketHistogramConfiguration.cs index ba4fb73f4cb..661ce42629d 100644 --- a/src/OpenTelemetry/Metrics/View/ExplicitBucketHistogramConfiguration.cs +++ b/src/OpenTelemetry/Metrics/View/ExplicitBucketHistogramConfiguration.cs @@ -8,6 +8,7 @@ namespace OpenTelemetry.Metrics; /// public class ExplicitBucketHistogramConfiguration : HistogramConfiguration { +#pragma warning disable CA1819 // Properties should not return arrays /// /// Gets or sets the optional boundaries of the histogram metric stream. /// @@ -23,7 +24,6 @@ public class ExplicitBucketHistogramConfiguration : HistogramConfiguration /// /// Note: A copy is made of the provided array. /// -#pragma warning disable CA1819 // Properties should not return arrays public double[]? Boundaries #pragma warning restore CA1819 // Properties should not return arrays { diff --git a/src/OpenTelemetry/Metrics/View/MetricStreamConfiguration.cs b/src/OpenTelemetry/Metrics/View/MetricStreamConfiguration.cs index ba1e55941b1..cb40df4f0b1 100644 --- a/src/OpenTelemetry/Metrics/View/MetricStreamConfiguration.cs +++ b/src/OpenTelemetry/Metrics/View/MetricStreamConfiguration.cs @@ -54,6 +54,7 @@ public string? Name /// public string? Description { get; set; } +#pragma warning disable CA1819 // Properties should not return arrays /// /// Gets or sets the optional tag keys to include in the metric stream. /// @@ -69,7 +70,6 @@ public string? Name /// A copy is made of the provided array. /// /// -#pragma warning disable CA1819 // Properties should not return arrays public string[]? TagKeys #pragma warning restore CA1819 // Properties should not return arrays { diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index 600cbdaa0e8..501a6f6105f 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -93,8 +93,8 @@ TracerProviderBuilder ITracerProviderBuilder.ConfigureServices(Action #pragma warning disable CA1033 // Interface methods should be callable by child types + /// TracerProviderBuilder IDeferredTracerProviderBuilder.Configure(Action configure) #pragma warning restore CA1033 // Interface methods should be callable by child types { diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs index c76befd9b75..ad875e9de43 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs @@ -17,6 +17,7 @@ namespace OpenTelemetry.Trace; /// public static class TracerProviderBuilderExtensions { +#pragma warning disable IDE0055 /// /// Sets whether the status of /// should be set to Status.Error when it ended abnormally due to an unhandled exception. @@ -30,6 +31,7 @@ public static class TracerProviderBuilderExtensions #if NET [RequiresDynamicCode("The code for detecting exception and setting error status might not be available.")] #endif +#pragma warning restore IDE0055 public static TracerProviderBuilder SetErrorStatusOnException(this TracerProviderBuilder tracerProviderBuilder, bool enabled = true) { tracerProviderBuilder.ConfigureBuilder((sp, builder) => @@ -242,13 +244,8 @@ public static TracerProviderBuilder AddProcessor( /// /// . /// . - public static TracerProvider Build(this TracerProviderBuilder tracerProviderBuilder) - { - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) - { - return tracerProviderBuilderBase.InvokeBuild(); - } - - throw new NotSupportedException($"Build is not supported on '{tracerProviderBuilder?.GetType().FullName ?? "null"}' instances."); - } + public static TracerProvider Build(this TracerProviderBuilder tracerProviderBuilder) => + tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase + ? tracerProviderBuilderBase.InvokeBuild() + : throw new NotSupportedException($"Build is not supported on '{tracerProviderBuilder?.GetType().FullName ?? "null"}' instances."); } diff --git a/test/OpenTelemetry.Shims.OpenTracing.Tests/TestTextMap.cs b/test/OpenTelemetry.Shims.OpenTracing.Tests/TestTextMap.cs index 39e5893fbe3..f4bad3b0d3b 100644 --- a/test/OpenTelemetry.Shims.OpenTracing.Tests/TestTextMap.cs +++ b/test/OpenTelemetry.Shims.OpenTracing.Tests/TestTextMap.cs @@ -12,9 +12,7 @@ internal sealed class TestTextMap : ITextMap public bool SetCalled { get; private set; } -#pragma warning disable IDE0028 // Simplify collection initialization - public Dictionary Items { get; } = new(); -#pragma warning restore IDE0028 // Simplify collection initialization + public Dictionary Items { get; } = []; public IEnumerator> GetEnumerator() { From c4f5de2098f46f3a060f2fcc20eb0f5e37b63666 Mon Sep 17 00:00:00 2001 From: martincostello Date: Sun, 15 Mar 2026 15:50:44 +0000 Subject: [PATCH 10/55] Fix W3C context tests for .NET 11 Patch the w3c/trace-context tests so they work with Python 3.14. --- .../Dockerfile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile index 5871f323302..c74cc822645 100644 --- a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile +++ b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile @@ -12,7 +12,7 @@ RUN apt-get update && apt-get install -y git RUN git clone --branch level-1 https://github.com/w3c/trace-context.git FROM mcr.microsoft.com/dotnet/sdk:10.0.201@sha256:478b9038d187e5b5c29bfa8173ded5d29e864b5ad06102a12106380ee01e2e49 AS dotnet-sdk-10.0 -FROM mcr.microsoft.com/dotnet/sdk:11.0-preview@sha256:97f9050efe8b816bd5e616997f754f31ab8ccbdd536272c639f94b1c23d96c53 AS dotnet-sdk-11.0 +FROM mcr.microsoft.com/dotnet/sdk:11.0-preview@sha256:899e7d93f1bc113bf9654afbc4a6be21f407f69f29618e8a0fdfe75ae5348258 AS dotnet-sdk-11.0 FROM dotnet-sdk-${BUILD_SDK_VERSION} AS build ARG PUBLISH_CONFIGURATION=Release @@ -30,7 +30,11 @@ COPY --from=w3c /w3c . RUN apt-get update \ && apt-get install -y python3-pip python3-dev \ && cd /usr/local/bin \ - && ln -s /usr/bin/python3 python + && ln -s /usr/bin/python3 python \ + && python3 --version + +# HACK Workaround the python tests not working with Python 3.14 +RUN python3 -c "from pathlib import Path; path = Path('/test/trace-context/test/server.py'); original = path.read_text(); old = '\t\tself.loop = asyncio.get_event_loop()\n'; new = '\t\tself.loop = asyncio.new_event_loop()\n\t\tasyncio.set_event_loop(self.loop)\n'; import sys; old in original or sys.exit('Expected asyncio.get_event_loop() not found in server.py'); path.write_text(original.replace(old, new, 1))" RUN pip3 install --requirement requirements.txt --require-hashes --break-system-packages ENTRYPOINT ["dotnet", "vstest", "OpenTelemetry.Instrumentation.W3cTraceContext.Tests.dll", "--logger:console;verbosity=detailed"] From 93df166dda83200f96c5f4466fa22ff1abf95060 Mon Sep 17 00:00:00 2001 From: martincostello Date: Sun, 15 Mar 2026 15:53:09 +0000 Subject: [PATCH 11/55] Fix more style warnings Apply more fixes from local testing. --- src/OpenTelemetry/Logs/LogRecord.cs | 4 ++++ .../Metrics/Reader/BaseExportingMetricReader.cs | 13 ++++--------- .../Metrics/View/MetricStreamConfiguration.cs | 12 ++++-------- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/OpenTelemetry/Logs/LogRecord.cs b/src/OpenTelemetry/Logs/LogRecord.cs index 7581183a040..dfe1c587f90 100644 --- a/src/OpenTelemetry/Logs/LogRecord.cs +++ b/src/OpenTelemetry/Logs/LogRecord.cs @@ -180,6 +180,10 @@ public string? CategoryName /// Gets or sets the log . /// [Obsolete("Use Severity instead. LogLevel will be removed in a future version.")] +#else + /// + /// Gets or sets the log . + /// #endif public LogLevel LogLevel { diff --git a/src/OpenTelemetry/Metrics/Reader/BaseExportingMetricReader.cs b/src/OpenTelemetry/Metrics/Reader/BaseExportingMetricReader.cs index 242ad99c814..907d5874433 100644 --- a/src/OpenTelemetry/Metrics/Reader/BaseExportingMetricReader.cs +++ b/src/OpenTelemetry/Metrics/Reader/BaseExportingMetricReader.cs @@ -48,20 +48,15 @@ public BaseExportingMetricReader(BaseExporter exporter) if (exporter is IPullMetricExporter pullExporter) { - if (this.SupportedExportModes.HasFlag(ExportModes.Push)) - { - pullExporter.Collect = this.Collect; - } - else - { - pullExporter.Collect = (timeoutMilliseconds) => + pullExporter.Collect = this.SupportedExportModes.HasFlag(ExportModes.Push) + ? this.Collect + : ((timeoutMilliseconds) => { using (PullMetricScope.Begin()) { return this.Collect(timeoutMilliseconds); } - }; - } + }); } this.exportCalledMessage = $"{nameof(BaseExportingMetricReader)} calling {this.Exporter}.{nameof(this.Exporter.Export)} method."; diff --git a/src/OpenTelemetry/Metrics/View/MetricStreamConfiguration.cs b/src/OpenTelemetry/Metrics/View/MetricStreamConfiguration.cs index cb40df4f0b1..5a2d9d5edd0 100644 --- a/src/OpenTelemetry/Metrics/View/MetricStreamConfiguration.cs +++ b/src/OpenTelemetry/Metrics/View/MetricStreamConfiguration.cs @@ -13,10 +13,6 @@ namespace OpenTelemetry.Metrics; /// public class MetricStreamConfiguration { - private string? name; - - private int? cardinalityLimit; - /// /// Gets the drop configuration. /// @@ -34,7 +30,7 @@ public class MetricStreamConfiguration /// public string? Name { - get => this.name; + get; set { if (value != null && !MeterProviderBuilderSdk.IsValidViewName(value)) @@ -42,7 +38,7 @@ public string? Name throw new ArgumentException($"Custom view name {value} is invalid.", nameof(value)); } - this.name = value; + field = value; } } @@ -94,7 +90,7 @@ public string[]? TagKeys /// public int? CardinalityLimit { - get => this.cardinalityLimit; + get; set { if (value != null) @@ -102,7 +98,7 @@ public int? CardinalityLimit Guard.ThrowIfOutOfRange(value.Value, min: 1, max: int.MaxValue); } - this.cardinalityLimit = value; + field = value; } } From 74dbad9d33d2dfd3ba621501cf93872d68494a24 Mon Sep 17 00:00:00 2001 From: martincostello Date: Sun, 15 Mar 2026 16:09:06 +0000 Subject: [PATCH 12/55] Add link to issue Add link to issue for failing python tests. --- .../Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile index c74cc822645..a1320d3b499 100644 --- a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile +++ b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile @@ -34,6 +34,7 @@ RUN apt-get update \ && python3 --version # HACK Workaround the python tests not working with Python 3.14 +# See https://github.com/w3c/trace-context/issues/581 RUN python3 -c "from pathlib import Path; path = Path('/test/trace-context/test/server.py'); original = path.read_text(); old = '\t\tself.loop = asyncio.get_event_loop()\n'; new = '\t\tself.loop = asyncio.new_event_loop()\n\t\tasyncio.set_event_loop(self.loop)\n'; import sys; old in original or sys.exit('Expected asyncio.get_event_loop() not found in server.py'); path.write_text(original.replace(old, new, 1))" RUN pip3 install --requirement requirements.txt --require-hashes --break-system-packages From af0faf1daa3bda2fa8bfe345a9c57c7ebdf97c07 Mon Sep 17 00:00:00 2001 From: martincostello Date: Sun, 15 Mar 2026 16:40:55 +0000 Subject: [PATCH 13/55] Update W3C workaround Point to fix in my fork, rather than patching the code directly. --- .../Dockerfile | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile index a1320d3b499..aca7e93e7da 100644 --- a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile +++ b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile @@ -6,10 +6,14 @@ ARG BUILD_SDK_VERSION=11.0 ARG TEST_SDK_VERSION=11.0 FROM ubuntu:24.04@sha256:d1e2e92c075e5ca139d51a140fff46f84315c0fdce203eab2807c7e495eff4f9 AS w3c -#Install git +# Install git WORKDIR /w3c RUN apt-get update && apt-get install -y git -RUN git clone --branch level-1 https://github.com/w3c/trace-context.git +# HACK Workaround the python tests not working with Python 3.14 +# See https://github.com/w3c/trace-context/issues/581 +RUN git clone https://github.com/martincostello/trace-context.git \ + && cd trace-context \ + && git checkout e37efba66396bff25b737b33bce3c117cc6eb287 FROM mcr.microsoft.com/dotnet/sdk:10.0.201@sha256:478b9038d187e5b5c29bfa8173ded5d29e864b5ad06102a12106380ee01e2e49 AS dotnet-sdk-10.0 FROM mcr.microsoft.com/dotnet/sdk:11.0-preview@sha256:899e7d93f1bc113bf9654afbc4a6be21f407f69f29618e8a0fdfe75ae5348258 AS dotnet-sdk-11.0 @@ -33,9 +37,8 @@ RUN apt-get update \ && ln -s /usr/bin/python3 python \ && python3 --version -# HACK Workaround the python tests not working with Python 3.14 -# See https://github.com/w3c/trace-context/issues/581 -RUN python3 -c "from pathlib import Path; path = Path('/test/trace-context/test/server.py'); original = path.read_text(); old = '\t\tself.loop = asyncio.get_event_loop()\n'; new = '\t\tself.loop = asyncio.new_event_loop()\n\t\tasyncio.set_event_loop(self.loop)\n'; import sys; old in original or sys.exit('Expected asyncio.get_event_loop() not found in server.py'); path.write_text(original.replace(old, new, 1))" +ENV SPEC_LEVEL=1 +ENV STRICT_LEVEL=1 RUN pip3 install --requirement requirements.txt --require-hashes --break-system-packages ENTRYPOINT ["dotnet", "vstest", "OpenTelemetry.Instrumentation.W3cTraceContext.Tests.dll", "--logger:console;verbosity=detailed"] From aeeb7f2a823115d141353d37d75b03e7d7cb90c3 Mon Sep 17 00:00:00 2001 From: martincostello Date: Tue, 17 Mar 2026 09:59:34 +0000 Subject: [PATCH 14/55] Fix build - Fix suppression lost in merge. - Fix some formatting. - Fix bug. - Remove workaround. - Use more specific Dockerfile tags. --- examples/MicroserviceExample/WebApi/Dockerfile | 4 ++-- examples/MicroserviceExample/WorkerService/Dockerfile | 4 ++-- .../GrpcRetryTestCase.cs | 2 ++ .../IntegrationTest/Dockerfile | 2 +- .../OpenTelemetry.Extensions.Hosting.Tests.csproj | 2 -- .../Dockerfile | 2 +- test/OpenTelemetry.Tests.Stress/StressTests.cs | 2 ++ test/OpenTelemetry.Tests/Logs/LogRecordSharedPoolTests.cs | 2 +- 8 files changed, 11 insertions(+), 9 deletions(-) diff --git a/examples/MicroserviceExample/WebApi/Dockerfile b/examples/MicroserviceExample/WebApi/Dockerfile index 7adab7d5f31..5a56bc136b1 100644 --- a/examples/MicroserviceExample/WebApi/Dockerfile +++ b/examples/MicroserviceExample/WebApi/Dockerfile @@ -1,6 +1,6 @@ ARG SDK_VERSION=11.0 FROM mcr.microsoft.com/dotnet/sdk:10.0.201@sha256:478b9038d187e5b5c29bfa8173ded5d29e864b5ad06102a12106380ee01e2e49 AS dotnet-sdk-10.0 -FROM mcr.microsoft.com/dotnet/sdk:11.0-preview@sha256:97f9050efe8b816bd5e616997f754f31ab8ccbdd536272c639f94b1c23d96c53 AS dotnet-sdk-11.0 +FROM mcr.microsoft.com/dotnet/sdk:11.0.100-preview.2@sha256:98c96a6331e1ab4eb73abe6ba341807d686d2ab24a915c617497a8b5995eefe9 AS dotnet-sdk-11.0 FROM dotnet-sdk-${SDK_VERSION} AS build ARG PUBLISH_CONFIGURATION=Release @@ -10,7 +10,7 @@ COPY . ./ RUN dotnet publish ./examples/MicroserviceExample/WebApi -c "${PUBLISH_CONFIGURATION}" -f "${PUBLISH_FRAMEWORK}" -o /out -p:IntegrationBuild=true FROM mcr.microsoft.com/dotnet/aspnet:10.0.5@sha256:a04d1c1d2d26119049494057d80ea6cda25bbd8aef7c444a1fc1ef874fd3955b AS dotnet-aspnet-10.0 -FROM mcr.microsoft.com/dotnet/aspnet:11.0-preview@sha256:e74f6c63a18661d28eeb39ec7990f649da73cb099bf813aee956b8020c843a72 AS dotnet-aspnet-11.0 +FROM mcr.microsoft.com/dotnet/aspnet:11.0.0-preview.2@sha256:9546302bd8d9700170fb88274c99bb3ddb1a9afb34921ff1957e17b6127edba3 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 68f2096a248..af8f7aa80c4 100644 --- a/examples/MicroserviceExample/WorkerService/Dockerfile +++ b/examples/MicroserviceExample/WorkerService/Dockerfile @@ -1,7 +1,7 @@ ARG SDK_VERSION=11.0 FROM mcr.microsoft.com/dotnet/sdk:10.0.201@sha256:478b9038d187e5b5c29bfa8173ded5d29e864b5ad06102a12106380ee01e2e49 AS dotnet-sdk-10.0 -FROM mcr.microsoft.com/dotnet/sdk:11.0-preview@sha256:97f9050efe8b816bd5e616997f754f31ab8ccbdd536272c639f94b1c23d96c53 AS dotnet-sdk-11.0 +FROM mcr.microsoft.com/dotnet/sdk:11.0.100-preview.2@sha256:98c96a6331e1ab4eb73abe6ba341807d686d2ab24a915c617497a8b5995eefe9 AS dotnet-sdk-11.0 FROM dotnet-sdk-${SDK_VERSION} AS build ARG PUBLISH_CONFIGURATION=Release @@ -11,7 +11,7 @@ COPY . ./ RUN dotnet publish ./examples/MicroserviceExample/WorkerService -c "${PUBLISH_CONFIGURATION}" -f "${PUBLISH_FRAMEWORK}" -o /out -p:IntegrationBuild=true FROM mcr.microsoft.com/dotnet/aspnet:10.0.5@sha256:a04d1c1d2d26119049494057d80ea6cda25bbd8aef7c444a1fc1ef874fd3955b AS dotnet-aspnet-10.0 -FROM mcr.microsoft.com/dotnet/aspnet:11.0-preview@sha256:e74f6c63a18661d28eeb39ec7990f649da73cb099bf813aee956b8020c843a72 AS dotnet-aspnet-11.0 +FROM mcr.microsoft.com/dotnet/aspnet:11.0.0-preview.2@sha256:9546302bd8d9700170fb88274c99bb3ddb1a9afb34921ff1957e17b6127edba3 AS dotnet-aspnet-11.0 FROM dotnet-aspnet-${SDK_VERSION} AS runtime WORKDIR /app diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs index d23a1103f58..662a32342da 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs @@ -24,6 +24,7 @@ private GrpcRetryTestCase(string testRunnerName, GrpcRetryAttempt[] retryAttempt internal GrpcRetryAttempt[] RetryAttempts { get; } +#pragma warning disable CA1825 // HACK Workaround for https://github.com/dotnet/sdk/issues/53047 public static TheoryData GetGrpcTestCases() => [ new("Cancelled", [new(StatusCode.Cancelled)]), @@ -82,6 +83,7 @@ public static TheoryData GetGrpcTestCases() => ], expectedRetryAttempts: 9), ]; +#pragma warning restore CA1825 // HACK Workaround for https://github.com/dotnet/sdk/issues/53047 public override string ToString() => this.testRunnerName; diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/IntegrationTest/Dockerfile b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/IntegrationTest/Dockerfile index d886e31763f..4f0a19edbaf 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/IntegrationTest/Dockerfile +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/IntegrationTest/Dockerfile @@ -5,7 +5,7 @@ ARG BUILD_SDK_VERSION=11.0 ARG TEST_SDK_VERSION=11.0 FROM mcr.microsoft.com/dotnet/sdk:10.0.201@sha256:478b9038d187e5b5c29bfa8173ded5d29e864b5ad06102a12106380ee01e2e49 AS dotnet-sdk-10.0 -FROM mcr.microsoft.com/dotnet/sdk:11.0-preview@sha256:97f9050efe8b816bd5e616997f754f31ab8ccbdd536272c639f94b1c23d96c53 AS dotnet-sdk-11.0 +FROM mcr.microsoft.com/dotnet/sdk:11.0.100-preview.2@sha256:98c96a6331e1ab4eb73abe6ba341807d686d2ab24a915c617497a8b5995eefe9 AS dotnet-sdk-11.0 FROM dotnet-sdk-${BUILD_SDK_VERSION} AS build ARG PUBLISH_CONFIGURATION=Release diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj index 2294d4435d5..062a5abc873 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj @@ -35,8 +35,6 @@ - - diff --git a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile index 18a4b92af4a..03f027c7863 100644 --- a/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile +++ b/test/OpenTelemetry.Instrumentation.W3cTraceContext.Tests/Dockerfile @@ -25,7 +25,7 @@ RUN git init trace-context \ && rm -rf .git FROM mcr.microsoft.com/dotnet/sdk:10.0.201@sha256:478b9038d187e5b5c29bfa8173ded5d29e864b5ad06102a12106380ee01e2e49 AS dotnet-sdk-10.0 -FROM mcr.microsoft.com/dotnet/sdk:11.0-preview@sha256:899e7d93f1bc113bf9654afbc4a6be21f407f69f29618e8a0fdfe75ae5348258 AS dotnet-sdk-11.0 +FROM mcr.microsoft.com/dotnet/sdk:11.0.100-preview.2@sha256:98c96a6331e1ab4eb73abe6ba341807d686d2ab24a915c617497a8b5995eefe9 AS dotnet-sdk-11.0 FROM dotnet-sdk-${BUILD_SDK_VERSION} AS build ARG PUBLISH_CONFIGURATION=Release diff --git a/test/OpenTelemetry.Tests.Stress/StressTests.cs b/test/OpenTelemetry.Tests.Stress/StressTests.cs index 8c6cb3bbff6..303691a91e4 100644 --- a/test/OpenTelemetry.Tests.Stress/StressTests.cs +++ b/test/OpenTelemetry.Tests.Stress/StressTests.cs @@ -124,6 +124,8 @@ public void RunSynchronously() bOutput = !bOutput; break; } + + continue; } if (bOutput) diff --git a/test/OpenTelemetry.Tests/Logs/LogRecordSharedPoolTests.cs b/test/OpenTelemetry.Tests/Logs/LogRecordSharedPoolTests.cs index dcbaa46f985..7f342626978 100644 --- a/test/OpenTelemetry.Tests/Logs/LogRecordSharedPoolTests.cs +++ b/test/OpenTelemetry.Tests/Logs/LogRecordSharedPoolTests.cs @@ -119,7 +119,7 @@ public void ClearTests() var logRecord1 = pool.Rent(); logRecord1.AttributeStorage = [ -with(16), + with(16), new("key1", "value1"), new("key2", "value2"), ]; From 29a41be2d8be18ee227af8d7ffcc5feb00e7a50b Mon Sep 17 00:00:00 2001 From: martincostello Date: Fri, 27 Mar 2026 11:30:01 +0000 Subject: [PATCH 15/55] [API] Fix IDE0200 warnings Fix IDE0200 warnings from the .NET 11 SDK. --- test/OpenTelemetry.Api.Tests/Trace/TracerTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/OpenTelemetry.Api.Tests/Trace/TracerTests.cs b/test/OpenTelemetry.Api.Tests/Trace/TracerTests.cs index 09479d8fb64..9a20fdc4f31 100644 --- a/test/OpenTelemetry.Api.Tests/Trace/TracerTests.cs +++ b/test/OpenTelemetry.Api.Tests/Trace/TracerTests.cs @@ -608,7 +608,7 @@ public void StartSpan_WhenCurrentActivityStoppedOnAnotherThread_DoesNotLeaveNewS var previousActivity = Activity.Current; Assert.NotNull(previousActivity); - var thread = new Thread(() => previousActivity.Stop()); + var thread = new Thread(previousActivity.Stop); thread.Start(); thread.Join(); @@ -645,7 +645,7 @@ public void StartSpan_WhenCurrentActivityStoppedOnAnotherThread_RestoresFirstRun Assert.Same(grandparentActivity, parentActivity.Parent); Assert.Same(parentActivity, currentActivity.Parent); - var thread = new Thread(() => currentActivity.Stop()); + var thread = new Thread(currentActivity.Stop); thread.Start(); thread.Join(); @@ -713,7 +713,7 @@ public void StartRootSpan_WhenCurrentActivityStoppedOnAnotherThread_DoesNotLeave var previousActivity = Activity.Current; Assert.NotNull(previousActivity); - var thread = new Thread(() => previousActivity.Stop()); + var thread = new Thread(previousActivity.Stop); thread.Start(); thread.Join(); From ccd198c9a14ec6e47c316b415ee072bbcb44aa09 Mon Sep 17 00:00:00 2001 From: martincostello Date: Wed, 15 Apr 2026 20:53:50 +0100 Subject: [PATCH 16/55] Update to .NET 11 preview 3 - Update to preview 3 of .NET 11. - Fix new analyzer warnings. --- Directory.Packages.props | 20 +++++++++---------- .../MicroserviceExample/WebApi/Dockerfile | 4 ++-- .../WorkerService/Dockerfile | 4 ++-- global.json | 2 +- .../Context/Propagation/BaggagePropagator.cs | 2 +- .../BaggagePropagatorBenchmarks.cs | 6 ++++-- .../IntegrationTest/Dockerfile | 2 +- .../Dockerfile | 2 +- .../Internal/InterlockedHelperTests.cs | 8 +++++++- .../BatchLogRecordExportProcessorTests.cs | 2 +- 10 files changed, 30 insertions(+), 22 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 29b327774dd..0b92d00cb82 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -12,10 +12,10 @@ --> - - - - + + + + @@ -25,10 +25,10 @@ - - - - + + + + - + - - - - + + + + @@ -25,10 +25,10 @@ - - - - + + + + - + - - - - + + + + @@ -25,10 +25,10 @@ - - - - + + + + - + - - - - - + + + + + @@ -27,11 +27,11 @@ - - - - - + + + + + - +