diff --git a/.editorconfig b/.editorconfig
index e3f693c1d13..3d257f44c18 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -174,3 +174,13 @@ indent_size = 2
[*.cshtml.cs]
dotnet_diagnostic.SA1649.severity = none
+
+# Verify settings
+[*.{received,verified}.{json,txt,xml}]
+charset = utf-8-bom
+end_of_line = lf
+indent_size = unset
+indent_style = unset
+insert_final_newline = false
+tab_width = unset
+trim_trailing_whitespace = false
diff --git a/.gitattributes b/.gitattributes
index 50ca329f24b..714ad31c816 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,7 @@
*.sh eol=lf
+
+# Verify settings
+*.verified.txt text eol=lf working-tree-encoding=UTF-8
+*.verified.xml text eol=lf working-tree-encoding=UTF-8
+*.verified.json text eol=lf working-tree-encoding=UTF-8
+*.verified.bin binary
diff --git a/.gitignore b/.gitignore
index 851ee867e69..d48e46a318e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -355,3 +355,6 @@ rewrite.coyote.json
# Test results
TestResults/
+
+# Verify snapshots
+*.received.*
diff --git a/Directory.Packages.props b/Directory.Packages.props
index bcb4124bbb2..98b9ddb6143 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -113,6 +113,7 @@
+
diff --git a/OpenTelemetry.sln b/OpenTelemetry.sln
index 0384bcce8aa..cf3c92d042e 100644
--- a/OpenTelemetry.sln
+++ b/OpenTelemetry.sln
@@ -13,6 +13,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
.editorconfig = .editorconfig
.gitignore = .gitignore
CONTRIBUTING.md = CONTRIBUTING.md
+ Directory.Build.props = Directory.Build.props
+ Directory.Packages.props = Directory.Packages.props
global.json = global.json
LICENSE.TXT = LICENSE.TXT
NuGet.config = NuGet.config
diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md
index c394bd4f0c6..c6a41305073 100644
--- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md
+++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md
@@ -7,6 +7,10 @@ Notes](../../RELEASENOTES.md).
## Unreleased
+* Fixed an issue where OTLP export of some metrics payloads to some OTLP
+ receivers were rejected with an HTTP 400 response due to gRPC protocol errors.
+ ([#6567](https://github.com/open-telemetry/opentelemetry-dotnet/pull/6567))
+
## 1.13.1
Released 2025-Oct-09
diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpMetricSerializer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpMetricSerializer.cs
index 47873bc4c83..27580aa99b0 100644
--- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpMetricSerializer.cs
+++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpMetricSerializer.cs
@@ -292,16 +292,7 @@ private static int WriteMetric(byte[] buffer, int writePosition, Metric metric)
writePosition = ProtobufSerializer.WriteDoubleWithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.HistogramDataPoint_Max, max);
}
- foreach (var histogramMeasurement in metricPoint.GetHistogramBuckets())
- {
- var bucketCount = (ulong)histogramMeasurement.BucketCount;
- writePosition = ProtobufSerializer.WriteFixed64WithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.HistogramDataPoint_Bucket_Counts, bucketCount);
-
- if (histogramMeasurement.ExplicitBound != double.PositiveInfinity)
- {
- writePosition = ProtobufSerializer.WriteDoubleWithTag(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.HistogramDataPoint_Explicit_Bounds, histogramMeasurement.ExplicitBound);
- }
- }
+ writePosition = WriteHistogramBuckets(buffer, writePosition, metricPoint.GetHistogramBuckets());
writePosition = WriteDoubleExemplars(buffer, writePosition, ProtobufOtlpMetricFieldNumberConstants.HistogramDataPoint_Exemplars, in metricPoint);
@@ -513,4 +504,77 @@ private static int WriteExemplar(byte[] buffer, int writePosition, in Exemplar e
ProtobufSerializer.WriteReservedLength(buffer, exemplarLengthPosition, writePosition - (exemplarLengthPosition + ReserveSizeForLength));
return writePosition;
}
+
+ private static int WriteHistogramBuckets(byte[] buffer, int writePosition, HistogramBuckets buckets)
+ {
+ writePosition = WriteBucketCounts(buffer, writePosition, buckets.BucketCounts);
+
+ writePosition = WriteExplicitBounds(buffer, writePosition, buckets.ExplicitBounds!);
+
+ return writePosition;
+
+ static int WriteBucketCounts(byte[] buffer, int writePosition, HistogramBuckets.HistogramBucketValues[] values)
+ {
+ int length = values.Length;
+
+ writePosition = WritePackedLength(
+ buffer,
+ writePosition,
+ length,
+ ProtobufOtlpMetricFieldNumberConstants.HistogramDataPoint_Bucket_Counts);
+
+ for (int i = 0; i < length; i++)
+ {
+ writePosition = ProtobufSerializer.WriteFixed64LittleEndianFormat(
+ buffer,
+ writePosition,
+ (ulong)values[i].SnapshotValue);
+ }
+
+ return writePosition;
+ }
+
+ static int WriteExplicitBounds(byte[] buffer, int writePosition, double[] values)
+ {
+ int length = 0;
+
+ for (int i = 0; i < values.Length; i++)
+ {
+ if (values[i] != double.PositiveInfinity)
+ {
+ length++;
+ }
+ }
+
+ if (length > 0)
+ {
+ writePosition = WritePackedLength(
+ buffer,
+ writePosition,
+ length,
+ ProtobufOtlpMetricFieldNumberConstants.HistogramDataPoint_Explicit_Bounds);
+
+ for (int i = 0; i < values.Length; i++)
+ {
+ var value = values[i];
+ if (value != double.PositiveInfinity)
+ {
+ writePosition = ProtobufSerializer.WriteDouble(buffer, writePosition, value);
+ }
+ }
+ }
+
+ return writePosition;
+ }
+
+ static int WritePackedLength(byte[] buffer, int writePosition, int length, int fieldNumber)
+ {
+ return ProtobufSerializer.WriteTagAndLength(
+ buffer,
+ writePosition,
+ length * 8,
+ fieldNumber,
+ ProtobufWireType.LEN);
+ }
+ }
}
diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufSerializer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufSerializer.cs
index deee79e77db..cb70fa781aa 100644
--- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufSerializer.cs
+++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufSerializer.cs
@@ -160,6 +160,10 @@ internal static int WriteDoubleWithTag(byte[] buffer, int writePosition, int fie
return writePosition;
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ internal static int WriteDouble(byte[] buffer, int writePosition, double value)
+ => WriteFixed64LittleEndianFormat(buffer, writePosition, (ulong)BitConverter.DoubleToInt64Bits(value));
+
///
/// Computes the number of bytes required to encode a 64-bit unsigned integer in Protocol Buffers' varint format.
///
diff --git a/src/OpenTelemetry/Metrics/AggregatorStore.cs b/src/OpenTelemetry/Metrics/AggregatorStore.cs
index cd6d33190d3..d9166cf407a 100644
--- a/src/OpenTelemetry/Metrics/AggregatorStore.cs
+++ b/src/OpenTelemetry/Metrics/AggregatorStore.cs
@@ -298,6 +298,13 @@ internal void SnapshotCumulative(int indexSnapshot)
internal MetricPointsAccessor GetMetricPoints()
=> new(this.metricPoints, this.currentMetricPointBatch, this.batchSize);
+ // This method must only be used for testing purposes
+ internal void OverrideTimeRange(DateTimeOffset startTimeExclusive, DateTimeOffset endTimeInclusive)
+ {
+ this.StartTimeExclusive = startTimeExclusive;
+ this.EndTimeInclusive = endTimeInclusive;
+ }
+
private static double[] FindDefaultHistogramBounds(in MetricStreamIdentity metricStreamIdentity)
{
if (metricStreamIdentity.Unit == "s")
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/EventSourceTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/EventSourceTests.cs
index 69787cec48e..9262550f859 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/EventSourceTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/EventSourceTests.cs
@@ -5,7 +5,6 @@
using OpenTelemetry.PersistentStorage.Abstractions;
using OpenTelemetry.PersistentStorage.FileSystem;
using OpenTelemetry.Tests;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs
index ca659c79a4b..2ae15e66447 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/GrpcRetryTestCase.cs
@@ -4,7 +4,6 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient.Grpc;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/HttpRetryTestCase.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/HttpRetryTestCase.cs
index 6bea0eb7d3a..99388a84391 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/HttpRetryTestCase.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/HttpRetryTestCase.cs
@@ -6,7 +6,6 @@
using System.Net.Http;
#endif
using System.Net.Http.Headers;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/GrpcStatusDeserializerTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/GrpcStatusDeserializerTests.cs
index 36e5eb521ae..f160d568b43 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/GrpcStatusDeserializerTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/GrpcStatusDeserializerTests.cs
@@ -4,7 +4,6 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient.Grpc;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests.Implementation.ExportClient;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/OtlpHttpTraceExportClientTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/OtlpHttpTraceExportClientTests.cs
index d256b4fcf79..92262f35429 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/OtlpHttpTraceExportClientTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/ExportClient/OtlpHttpTraceExportClientTests.cs
@@ -10,7 +10,6 @@
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.Serializer;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
-using Xunit;
using OtlpCollector = OpenTelemetry.Proto.Collector.Trace.V1;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/OtlpArrayTagWriterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/OtlpArrayTagWriterTests.cs
index d8ada0f2f80..49ca3885bbd 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/OtlpArrayTagWriterTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/OtlpArrayTagWriterTests.cs
@@ -5,7 +5,6 @@
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation;
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.Serializer;
using OpenTelemetry.Resources;
-using Xunit;
using OtlpCollector = OpenTelemetry.Proto.Collector.Trace.V1;
using OtlpTrace = OpenTelemetry.Proto.Trace.V1;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/ProtobufOtlpMetricSerializerTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/ProtobufOtlpMetricSerializerTests.cs
new file mode 100644
index 00000000000..e5c62ecd1d8
--- /dev/null
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/ProtobufOtlpMetricSerializerTests.cs
@@ -0,0 +1,124 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+using System.Diagnostics.Metrics;
+using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation;
+using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.Serializer;
+using OpenTelemetry.Metrics;
+using OpenTelemetry.Resources;
+using OpenTelemetry.Tests;
+
+namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests.Implementation.Serializer;
+
+public static class ProtobufOtlpMetricSerializerTests
+{
+ [Fact]
+ public static async Task WriteMetricsData_Serializes_Metrics_Correctly()
+ {
+ // Arrange
+ var metrics = GenerateMetrics();
+
+ var attributes = new Dictionary
+ {
+ { "service.name", "OpenTelemetry-DotNet" },
+ { "service.version", "1.2.3" },
+ };
+
+ var buffer = new byte[1024];
+ var writePosition = 0;
+ var resource = new Resource(attributes);
+
+ // Act
+ var actual = ProtobufOtlpMetricSerializer.WriteMetricsData(
+ ref buffer,
+ writePosition,
+ resource,
+ metrics);
+
+ // Assert
+ Assert.NotEqual(0, actual);
+ Assert.True(actual > writePosition, $"The returned write position, {actual} is not greater than the initial write position, {writePosition}.");
+ Assert.True(actual <= buffer.Length, $"The returned write position, {actual} is beyond the bounds of the buffer, {buffer.Length}.");
+
+ using var stream = new MemoryStream();
+
+#if NET
+ await stream.WriteAsync(buffer.AsMemory(0, actual));
+#else
+ await stream.WriteAsync(buffer, 0, actual);
+#endif
+
+ await Verify(stream, "bin")
+ .IgnoreParametersForVerified()
+ .UseDirectory("snapshots");
+ }
+
+ private static Batch GenerateMetrics()
+ {
+ // Arrange
+ Batch metrics = default;
+
+ // Create some metrics to export
+ using (var exported = new ManualResetEvent(false))
+ {
+ var experimentalOptions = new ExperimentalOptions();
+ var exporterOptions = new OtlpExporterOptions()
+ {
+ Endpoint = new($"http://localhost:4318/v1/"),
+ Protocol = OtlpExportProtocol.HttpProtobuf,
+ };
+
+ using var exporter = new DelegatingExporter()
+ {
+ OnExportFunc = (batch) =>
+ {
+ metrics = batch;
+ exported.Set();
+ return ExportResult.Success;
+ },
+ };
+
+ var meterName = "otlp.protobuf.serialization";
+
+ var builder = Sdk.CreateMeterProviderBuilder().AddMeter(meterName);
+
+ var metricReaderOptions = new MetricReaderOptions();
+ metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = Timeout.Infinite;
+
+ builder.AddReader(
+ (serviceProvider) => OtlpMetricExporterExtensions.BuildOtlpExporterMetricReader(
+ serviceProvider,
+ exporterOptions,
+ metricReaderOptions,
+ experimentalOptions,
+ configureExporterInstance: (_) => exporter));
+
+ using var meterProvider = builder.Build();
+ using var meter = new Meter(meterName);
+
+ var counter = meter.CreateCounter("counter");
+ counter.Add(18);
+
+ var gauge = meter.CreateGauge("gauge");
+ gauge.Record(42);
+
+ var histogram = meter.CreateHistogram("histogram");
+ histogram.Record(100);
+
+ Assert.True(meterProvider.ForceFlush());
+
+ Assert.NotEqual(0, metrics.Count);
+ }
+
+ // Scrub the timestamps for stable snapshots
+ var startTime = new DateTimeOffset(2025, 10, 08, 10, 20, 11, TimeSpan.Zero);
+ var endTime = startTime.AddSeconds(10);
+
+ foreach (var metric in metrics)
+ {
+ metric.AggregatorStore.OverrideTimeRange(startTime, endTime);
+ }
+
+ 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 6c202b528e7..22d5582ad6c 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/ProtobufSerializerTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/ProtobufSerializerTests.cs
@@ -3,7 +3,6 @@
using System.Text;
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.Serializer;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests.Implementation.Serializer;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/snapshots/ProtobufOtlpMetricSerializerTests.WriteMetricsData_Serializes_Metrics_Correctly.verified.bin b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/snapshots/ProtobufOtlpMetricSerializerTests.WriteMetricsData_Serializes_Metrics_Correctly.verified.bin
new file mode 100644
index 00000000000..b319f6df40e
Binary files /dev/null and b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/Implementation/Serializer/snapshots/ProtobufOtlpMetricSerializerTests.WriteMetricsData_Serializes_Metrics_Correctly.verified.bin differ
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/IntegrationTest/IntegrationTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/IntegrationTest/IntegrationTests.cs
index f4089c99875..1b8532548de 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/IntegrationTest/IntegrationTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/IntegrationTest/IntegrationTests.cs
@@ -11,7 +11,6 @@
using OpenTelemetry.Metrics;
using OpenTelemetry.Tests;
using OpenTelemetry.Trace;
-using Xunit;
using Xunit.Abstractions;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/MockCollectorIntegrationTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/MockCollectorIntegrationTests.cs
index 0f810a25d34..326a086acd6 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/MockCollectorIntegrationTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/MockCollectorIntegrationTests.cs
@@ -21,7 +21,6 @@
using OpenTelemetry.Proto.Collector.Trace.V1;
using OpenTelemetry.Tests;
using OpenTelemetry.Trace;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests.csproj b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests.csproj
index 5541cabe5c6..950cc66f0bd 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests.csproj
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests.csproj
@@ -34,6 +34,7 @@
+
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpAttributeTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpAttributeTests.cs
index e260a4544d9..ec189dbdec4 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpAttributeTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpAttributeTests.cs
@@ -4,7 +4,6 @@
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.Serializer;
-using Xunit;
using OtlpCommon = OpenTelemetry.Proto.Common.V1;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExportProtocolParserTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExportProtocolParserTests.cs
index c2fdc81eb2e..fb360bc0638 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExportProtocolParserTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExportProtocolParserTests.cs
@@ -1,8 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
-using Xunit;
-
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
public class OtlpExportProtocolParserTests
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterHelperExtensionsTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterHelperExtensionsTests.cs
index 4dcd98eb22d..6d8e4247f1a 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterHelperExtensionsTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterHelperExtensionsTests.cs
@@ -9,7 +9,6 @@
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsExtensionsTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsExtensionsTests.cs
index 8e0c24601a4..11f2d9563e9 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsExtensionsTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsExtensionsTests.cs
@@ -8,7 +8,6 @@
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation;
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient;
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.Transmission;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsTests.cs
index 9536d283cf5..5878bf1be5f 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpExporterOptionsTests.cs
@@ -2,7 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
using Microsoft.Extensions.Configuration;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpHttpExportClientTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpHttpExportClientTests.cs
index 5de79944839..3bab01deeda 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpHttpExportClientTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpHttpExportClientTests.cs
@@ -5,7 +5,6 @@
using System.Net.Http;
#endif
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs
index c6f7f32f6d0..ee5d571c0d8 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs
@@ -17,7 +17,6 @@
using OpenTelemetry.Resources;
using OpenTelemetry.Tests;
using OpenTelemetry.Trace;
-using Xunit;
using static OpenTelemetry.Proto.Common.V1.AnyValue;
using OtlpCollector = OpenTelemetry.Proto.Collector.Logs.V1;
using OtlpCommon = OpenTelemetry.Proto.Common.V1;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpMetricsExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpMetricsExporterTests.cs
index 52499046070..f394f74aca8 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpMetricsExporterTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpMetricsExporterTests.cs
@@ -12,7 +12,6 @@
using OpenTelemetry.Resources;
using OpenTelemetry.Tests;
using OpenTelemetry.Trace;
-using Xunit;
using OtlpCollector = OpenTelemetry.Proto.Collector.Metrics.V1;
using OtlpMetrics = OpenTelemetry.Proto.Metrics.V1;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpResourceTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpResourceTests.cs
index 5bc0c3601ae..97d63f3a145 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpResourceTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpResourceTests.cs
@@ -4,7 +4,6 @@
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.Serializer;
using OpenTelemetry.Proto.Trace.V1;
using OpenTelemetry.Resources;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpRetryTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpRetryTests.cs
index 9e3a266a749..c6a6bb728b5 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpRetryTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpRetryTests.cs
@@ -2,7 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient.Grpc;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSpecConfigDefinitionTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSpecConfigDefinitionTests.cs
index c5d1b0717a4..6c65703168a 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSpecConfigDefinitionTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpSpecConfigDefinitionTests.cs
@@ -5,7 +5,6 @@
using System.Globalization;
using Microsoft.Extensions.Configuration;
using OpenTelemetry.Metrics;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTestHelpers.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTestHelpers.cs
index 7cc6b10336e..65a5bbd82ec 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTestHelpers.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTestHelpers.cs
@@ -3,7 +3,6 @@
using System.Globalization;
using Google.Protobuf.Collections;
-using Xunit;
using OtlpCommon = OpenTelemetry.Proto.Common.V1;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs
index d9e1fdb9a39..fa574c5e31f 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs
@@ -11,7 +11,6 @@
using OpenTelemetry.Resources;
using OpenTelemetry.Tests;
using OpenTelemetry.Trace;
-using Xunit;
using OtlpCollector = OpenTelemetry.Proto.Collector.Trace.V1;
using OtlpCommon = OpenTelemetry.Proto.Common.V1;
using OtlpTrace = OpenTelemetry.Proto.Trace.V1;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/SdkLimitOptionsTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/SdkLimitOptionsTests.cs
index 0a737ff1438..a7f227c4d05 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/SdkLimitOptionsTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/SdkLimitOptionsTests.cs
@@ -3,7 +3,6 @@
using Microsoft.Extensions.Configuration;
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/UseOtlpExporterExtensionTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/UseOtlpExporterExtensionTests.cs
index 2bb8245b657..293ee236232 100644
--- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/UseOtlpExporterExtensionTests.cs
+++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/UseOtlpExporterExtensionTests.cs
@@ -9,7 +9,6 @@
using OpenTelemetry.Metrics;
using OpenTelemetry.Tests;
using OpenTelemetry.Trace;
-using Xunit;
namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests;
diff --git a/test/OpenTelemetry.Tests/Shared/SkipUnlessEnvVarFoundTheoryAttribute.cs b/test/OpenTelemetry.Tests/Shared/SkipUnlessEnvVarFoundTheoryAttribute.cs
index dd0a5011d51..f08dd03a6ef 100644
--- a/test/OpenTelemetry.Tests/Shared/SkipUnlessEnvVarFoundTheoryAttribute.cs
+++ b/test/OpenTelemetry.Tests/Shared/SkipUnlessEnvVarFoundTheoryAttribute.cs
@@ -1,7 +1,9 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
+#pragma warning disable IDE0005 // Using directive is unnecessary.
using Xunit;
+#pragma warning restore IDE0005 // Using directive is unnecessary.
namespace OpenTelemetry.Tests;
diff --git a/test/Shared/StrongNameTests.cs b/test/Shared/StrongNameTests.cs
index d56435f3e3f..066c1121110 100644
--- a/test/Shared/StrongNameTests.cs
+++ b/test/Shared/StrongNameTests.cs
@@ -1,7 +1,9 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
+#pragma warning disable IDE0005 // Using directive is unnecessary.
using Xunit;
+#pragma warning restore IDE0005 // Using directive is unnecessary.
namespace OpenTelemetry.Tests;