From b444464d0fd98b0bad50f7ee8988b54caf5c9a8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Kie=C5=82kowicz?= Date: Fri, 17 May 2024 21:17:13 +0200 Subject: [PATCH] [repo] Cleanup shared code (#5622) --- OpenTelemetry.sln | 8 - src/Shared/ActivityInstrumentationHelper.cs | 24 -- .../PropertyFetcher.cs | 218 ------------------ src/Shared/RedactionHelper.cs | 59 ----- src/Shared/ResourceSemanticConventions.cs | 43 ---- src/Shared/SemanticConventions.cs | 93 -------- ...nTelemetry.AotCompatibility.TestApp.csproj | 4 - .../Program.cs | 13 -- .../PropertyFetcherAotTest.cs | 56 ----- .../ActivityInstrumentationHelperTest.cs | 39 ---- .../Instrumentation/PropertyFetcherTest.cs | 155 ------------- .../Internal/RedactionHelperTest.cs | 32 --- .../OpenTelemetry.Tests.csproj | 3 - .../Trace/TracerProviderSdkTest.cs | 13 +- 14 files changed, 10 insertions(+), 750 deletions(-) delete mode 100644 src/Shared/ActivityInstrumentationHelper.cs delete mode 100644 src/Shared/DiagnosticSourceInstrumentation/PropertyFetcher.cs delete mode 100644 src/Shared/RedactionHelper.cs delete mode 100644 test/OpenTelemetry.AotCompatibility.TestApp/PropertyFetcherAotTest.cs delete mode 100644 test/OpenTelemetry.Tests/Instrumentation/ActivityInstrumentationHelperTest.cs delete mode 100644 test/OpenTelemetry.Tests/Instrumentation/PropertyFetcherTest.cs delete mode 100644 test/OpenTelemetry.Tests/Internal/RedactionHelperTest.cs diff --git a/OpenTelemetry.sln b/OpenTelemetry.sln index 0cb759d078e..5150016a129 100644 --- a/OpenTelemetry.sln +++ b/OpenTelemetry.sln @@ -242,7 +242,6 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{A49299FB-C5CD-4E0E-B7E1-B7867BBD67CC}" ProjectSection(SolutionItems) = preProject src\Shared\ActivityHelperExtensions.cs = src\Shared\ActivityHelperExtensions.cs - src\Shared\ActivityInstrumentationHelper.cs = src\Shared\ActivityInstrumentationHelper.cs src\Shared\AssemblyVersionExtensions.cs = src\Shared\AssemblyVersionExtensions.cs src\Shared\DiagnosticDefinitions.cs = src\Shared\DiagnosticDefinitions.cs src\Shared\ExceptionExtensions.cs = src\Shared\ExceptionExtensions.cs @@ -251,7 +250,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{A49299 src\Shared\PeerServiceResolver.cs = src\Shared\PeerServiceResolver.cs src\Shared\PeriodicExportingMetricReaderHelper.cs = src\Shared\PeriodicExportingMetricReaderHelper.cs src\Shared\PooledList.cs = src\Shared\PooledList.cs - src\Shared\RedactionHelper.cs = src\Shared\RedactionHelper.cs src\Shared\ResourceSemanticConventions.cs = src\Shared\ResourceSemanticConventions.cs src\Shared\SemanticConventions.cs = src\Shared\SemanticConventions.cs src\Shared\SpanAttributeConstants.cs = src\Shared\SpanAttributeConstants.cs @@ -259,11 +257,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{A49299 src\Shared\ThreadSafeRandom.cs = src\Shared\ThreadSafeRandom.cs EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DiagnosticSourceInstrumentation", "DiagnosticSourceInstrumentation", "{28F3EC79-660C-4659-8B73-F90DC1173316}" - ProjectSection(SolutionItems) = preProject - src\Shared\DiagnosticSourceInstrumentation\PropertyFetcher.cs = src\Shared\DiagnosticSourceInstrumentation\PropertyFetcher.cs - EndProjectSection -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "EnvironmentVariables", "EnvironmentVariables", "{6D4B4FB2-0A8A-4044-948B-C063FD340439}" ProjectSection(SolutionItems) = preProject src\Shared\EnvironmentVariables\EnvironmentVariablesConfigurationProvider.cs = src\Shared\EnvironmentVariables\EnvironmentVariablesConfigurationProvider.cs @@ -640,7 +633,6 @@ Global {800DB925-6014-4136-AC01-3356CF7CADD3} = {5B7FB835-3FFF-4BC2-99C5-A5B5FAE3C818} {9C99621C-343E-479C-A943-332DB6129B71} = {5B7FB835-3FFF-4BC2-99C5-A5B5FAE3C818} {62AF4BD3-DCAE-4D44-AA5B-991C1071166B} = {5B7FB835-3FFF-4BC2-99C5-A5B5FAE3C818} - {28F3EC79-660C-4659-8B73-F90DC1173316} = {A49299FB-C5CD-4E0E-B7E1-B7867BBD67CC} {6D4B4FB2-0A8A-4044-948B-C063FD340439} = {A49299FB-C5CD-4E0E-B7E1-B7867BBD67CC} {494902DD-C63F-48E0-BED3-B58EFB4051C8} = {A49299FB-C5CD-4E0E-B7E1-B7867BBD67CC} {A0CB9A10-F22D-4E66-A449-74B3D0361A9C} = {A49299FB-C5CD-4E0E-B7E1-B7867BBD67CC} diff --git a/src/Shared/ActivityInstrumentationHelper.cs b/src/Shared/ActivityInstrumentationHelper.cs deleted file mode 100644 index 726a65c108e..00000000000 --- a/src/Shared/ActivityInstrumentationHelper.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -using System.Diagnostics; - -namespace OpenTelemetry.Instrumentation; - -internal static class ActivityInstrumentationHelper -{ - internal static readonly Action SetKindProperty = CreateActivityKindSetter(); - internal static readonly Action SetActivitySourceProperty = CreateActivitySourceSetter(); - - private static Action CreateActivitySourceSetter() - { - return (Action)typeof(Activity).GetProperty("Source") - .SetMethod.CreateDelegate(typeof(Action)); - } - - private static Action CreateActivityKindSetter() - { - return (Action)typeof(Activity).GetProperty("Kind") - .SetMethod.CreateDelegate(typeof(Action)); - } -} diff --git a/src/Shared/DiagnosticSourceInstrumentation/PropertyFetcher.cs b/src/Shared/DiagnosticSourceInstrumentation/PropertyFetcher.cs deleted file mode 100644 index a2ac797d8a3..00000000000 --- a/src/Shared/DiagnosticSourceInstrumentation/PropertyFetcher.cs +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#nullable enable - -#if NETSTANDARD2_1_0_OR_GREATER || NET6_0_OR_GREATER -using System.Diagnostics.CodeAnalysis; -#endif -using System.Reflection; - -namespace OpenTelemetry.Instrumentation; - -/// -/// PropertyFetcher fetches a property from an object. -/// -/// The type of the property being fetched. -internal sealed class PropertyFetcher -{ -#if NET6_0_OR_GREATER - private const string TrimCompatibilityMessage = "PropertyFetcher is used to access properties on objects dynamically by design and cannot be made trim compatible."; -#endif - private readonly string propertyName; - private PropertyFetch? innerFetcher; - - /// - /// Initializes a new instance of the class. - /// - /// Property name to fetch. - public PropertyFetcher(string propertyName) - { - this.propertyName = propertyName; - } - - public int NumberOfInnerFetchers => this.innerFetcher == null - ? 0 - : 1 + this.innerFetcher.NumberOfInnerFetchers; - - /// - /// Try to fetch the property from the object. - /// - /// Object to be fetched. - /// Fetched value. - /// if the property was fetched. -#if NET6_0_OR_GREATER - [RequiresUnreferencedCode(TrimCompatibilityMessage)] -#endif - public bool TryFetch( -#if NETSTANDARD2_1_0_OR_GREATER || NET6_0_OR_GREATER - [NotNullWhen(true)] -#endif - object? obj, - out T? value) - { - var innerFetcher = this.innerFetcher; - if (innerFetcher is null) - { - return TryFetchRare(obj, this.propertyName, ref this.innerFetcher, out value); - } - - return innerFetcher.TryFetch(obj, out value); - } - -#if NET6_0_OR_GREATER - [RequiresUnreferencedCode(TrimCompatibilityMessage)] -#endif - private static bool TryFetchRare(object? obj, string propertyName, ref PropertyFetch? destination, out T? value) - { - if (obj is null) - { - value = default; - return false; - } - - var fetcher = PropertyFetch.Create(obj.GetType().GetTypeInfo(), propertyName); - - if (fetcher is null) - { - value = default; - return false; - } - - destination = fetcher; - - return fetcher.TryFetch(obj, out value); - } - - // see https://github.com/dotnet/corefx/blob/master/src/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/DiagnosticSourceEventSource.cs -#if NET6_0_OR_GREATER - [RequiresUnreferencedCode(TrimCompatibilityMessage)] -#endif - private abstract class PropertyFetch - { - public abstract int NumberOfInnerFetchers { get; } - - public static PropertyFetch? Create(TypeInfo type, string propertyName) - { - var property = type.DeclaredProperties.FirstOrDefault(p => string.Equals(p.Name, propertyName, StringComparison.OrdinalIgnoreCase)) ?? type.GetProperty(propertyName); - return CreateFetcherForProperty(property); - - static PropertyFetch? CreateFetcherForProperty(PropertyInfo? propertyInfo) - { - if (propertyInfo == null || !typeof(T).IsAssignableFrom(propertyInfo.PropertyType)) - { - // returns null and wait for a valid payload to arrive. - return null; - } - - var declaringType = propertyInfo.DeclaringType; - if (declaringType!.IsValueType) - { - throw new NotSupportedException( - $"Type: {declaringType.FullName} is a value type. PropertyFetcher can only operate on reference payload types."); - } - - if (declaringType == typeof(object)) - { - // TODO: REMOVE this if branch when .NET 7 is out of support. - // This branch is never executed and is only needed for .NET 7 AOT-compiler at trimming stage; i.e., - // this is not needed in .NET 8, because the compiler is improved and call into MakeGenericMethod will be AOT-compatible. - // It is used to force the AOT compiler to create an instantiation of the method with a reference type. - // The code for that instantiation can then be reused at runtime to create instantiation over any other reference. - return CreateInstantiated(propertyInfo); - } - else - { - return DynamicInstantiationHelper(declaringType, propertyInfo); - } - - // Separated as a local function to be able to target the suppression to just this call. - // IL3050 was generated here because of the call to MakeGenericType, which is problematic in AOT if one of the type parameters is a value type; - // because the compiler might need to generate code specific to that type. - // If the type parameter is a reference type, there will be no problem; because the generated code can be shared among all reference type instantiations. -#if NET6_0_OR_GREATER - [UnconditionalSuppressMessage("AOT", "IL3050", Justification = "The code guarantees that all the generic parameters are reference types.")] -#endif - static PropertyFetch? DynamicInstantiationHelper(Type declaringType, PropertyInfo propertyInfo) - { - return (PropertyFetch?)typeof(PropertyFetch) - .GetMethod(nameof(CreateInstantiated), BindingFlags.NonPublic | BindingFlags.Static)! - .MakeGenericMethod(declaringType) // This is validated in the earlier call chain to be a reference type. - .Invoke(null, new object[] { propertyInfo })!; - } - } - } - - public abstract bool TryFetch( -#if NETSTANDARD2_1_0_OR_GREATER || NET6_0_OR_GREATER - [NotNullWhen(true)] -#endif - object? obj, - out T? value); - - // Goal: make PropertyFetcher AOT-compatible. - // AOT compiler can't guarantee correctness when call into MakeGenericType or MakeGenericMethod - // if one of the generic parameters is a value type (reference types are OK.) - // For PropertyFetcher, the decision was made to only support reference type payloads, i.e.: - // the object from which to get the property value MUST be a reference type. - // Create generics with the declared object type as a generic parameter is OK, but we need the return type - // of the property to be a value type (on top of reference types.) - // Normally, we would have a helper class like `PropertyFetchInstantiated` that takes 2 generic parameters, - // the declared object type, and the type of the property value. - // But that would mean calling MakeGenericType, with value type parameters which AOT won't support. - // - // As a workaround, Generic instantiation was split into: - // 1. The object type comes from the PropertyFetcher generic parameter. - // Compiler supports it even if it is a value type; the type is known statically during compilation - // since PropertyFetcher is used with it. - // 2. Then, the declared object type is passed as a generic parameter to a generic method on PropertyFetcher (or nested type.) - // Therefore, calling into MakeGenericMethod will only require specifying one parameter - the declared object type. - // The declared object type is guaranteed to be a reference type (throw on value type.) Thus, MakeGenericMethod is AOT compatible. - private static PropertyFetch CreateInstantiated(PropertyInfo propertyInfo) - where TDeclaredObject : class - => new PropertyFetchInstantiated(propertyInfo); - -#if NET6_0_OR_GREATER - [RequiresUnreferencedCode(TrimCompatibilityMessage)] -#endif - private sealed class PropertyFetchInstantiated : PropertyFetch - where TDeclaredObject : class - { - private readonly string propertyName; - private readonly Func propertyFetch; - private PropertyFetch? innerFetcher; - - public PropertyFetchInstantiated(PropertyInfo property) - { - this.propertyName = property.Name; - this.propertyFetch = (Func)property.GetMethod!.CreateDelegate(typeof(Func)); - } - - public override int NumberOfInnerFetchers => this.innerFetcher == null - ? 0 - : 1 + this.innerFetcher.NumberOfInnerFetchers; - - public override bool TryFetch( -#if NETSTANDARD2_1_0_OR_GREATER || NET6_0_OR_GREATER - [NotNullWhen(true)] -#endif - object? obj, - out T? value) - { - if (obj is TDeclaredObject o) - { - value = this.propertyFetch(o); - return true; - } - - var innerFetcher = this.innerFetcher; - if (innerFetcher is null) - { - return TryFetchRare(obj, this.propertyName, ref this.innerFetcher, out value); - } - - return innerFetcher.TryFetch(obj, out value); - } - } - } -} diff --git a/src/Shared/RedactionHelper.cs b/src/Shared/RedactionHelper.cs deleted file mode 100644 index 05944efada5..00000000000 --- a/src/Shared/RedactionHelper.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#nullable enable - -using System.Text; - -namespace OpenTelemetry.Internal; - -internal class RedactionHelper -{ - private static readonly string RedactedText = "Redacted"; - - public static string? GetRedactedQueryString(string query) - { - int length = query.Length; - int index = 0; - - // Preallocate some size to avoid re-sizing multiple times. - // Since the size will increase, allocating twice as much. - // TODO: Check to see if we can borrow from https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/Text/ValueStringBuilder.cs - // to improve perf. - StringBuilder queryBuilder = new(2 * length); - while (index < query.Length) - { - // Check if the character is = for redacting value. - if (query[index] == '=') - { - // Append = - queryBuilder.Append('='); - index++; - - // Append redactedText in place of original value. - queryBuilder.Append(RedactedText); - - // Move until end of this key/value pair. - while (index < length && query[index] != '&') - { - index++; - } - - // End of key/value. - if (index < length && query[index] == '&') - { - queryBuilder.Append(query[index]); - } - } - else - { - // Keep adding to the result - queryBuilder.Append(query[index]); - } - - index++; - } - - return queryBuilder.ToString(); - } -} diff --git a/src/Shared/ResourceSemanticConventions.cs b/src/Shared/ResourceSemanticConventions.cs index 1bc599eb20a..a3f93c02fa8 100644 --- a/src/Shared/ResourceSemanticConventions.cs +++ b/src/Shared/ResourceSemanticConventions.cs @@ -15,47 +15,4 @@ internal static class ResourceSemanticConventions public const string AttributeTelemetrySdkName = "telemetry.sdk.name"; public const string AttributeTelemetrySdkLanguage = "telemetry.sdk.language"; public const string AttributeTelemetrySdkVersion = "telemetry.sdk.version"; - - public const string AttributeContainerName = "container.name"; - public const string AttributeContainerImage = "container.image.name"; - public const string AttributeContainerTag = "container.image.tag"; - - public const string AttributeFaasName = "faas.name"; - public const string AttributeFaasId = "faas.id"; - public const string AttributeFaasVersion = "faas.version"; - public const string AttributeFaasInstance = "faas.instance"; - - public const string AttributeK8sCluster = "k8s.cluster.name"; - public const string AttributeK8sNamespace = "k8s.namespace.name"; - public const string AttributeK8sPod = "k8s.pod.name"; - public const string AttributeK8sDeployment = "k8s.deployment.name"; - - public const string AttributeHostHostname = "host.hostname"; - public const string AttributeHostId = "host.id"; - public const string AttributeHostName = "host.name"; - public const string AttributeHostType = "host.type"; - public const string AttributeHostImageName = "host.image.name"; - public const string AttributeHostImageId = "host.image.id"; - public const string AttributeHostImageVersion = "host.image.version"; - - public const string AttributeProcessId = "process.id"; - public const string AttributeProcessExecutableName = "process.executable.name"; - public const string AttributeProcessExecutablePath = "process.executable.path"; - public const string AttributeProcessCommand = "process.command"; - public const string AttributeProcessCommandLine = "process.command_line"; - public const string AttributeProcessUsername = "process.username"; - - public const string AttributeCloudAccount = "cloud.account.id"; - public const string AttributeCloudPlatform = "cloud.platform"; - public const string AttributeCloudProvider = "cloud.provider"; - public const string AttributeCloudRegion = "cloud.region"; - public const string AttributeCloudResourceId = "cloud.resource_id"; - public const string AttributeCloudZone = "cloud.zone"; - - public const string AttributeComponent = "component"; - - public const string AttributeOsType = "os.type"; - public const string AttributeOsVersion = "os.version"; - - public const string AttributeDeploymentEnvironment = "deployment.environment"; } diff --git a/src/Shared/SemanticConventions.cs b/src/Shared/SemanticConventions.cs index 09e9af5eccb..2624acd29cd 100644 --- a/src/Shared/SemanticConventions.cs +++ b/src/Shared/SemanticConventions.cs @@ -7,116 +7,23 @@ namespace OpenTelemetry.Trace; /// /// Constants for semantic attribute names outlined by the OpenTelemetry specifications. -/// and -/// . /// internal static class SemanticConventions { - // The set of constants matches the specification as of this commit. - // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/general/trace.md - // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/exceptions/exceptions-spans.md - public const string AttributeNetTransport = "net.transport"; public const string AttributeNetPeerIp = "net.peer.ip"; public const string AttributeNetPeerPort = "net.peer.port"; public const string AttributeNetPeerName = "net.peer.name"; - public const string AttributeNetHostIp = "net.host.ip"; - public const string AttributeNetHostPort = "net.host.port"; - public const string AttributeNetHostName = "net.host.name"; - - public const string AttributeEnduserId = "enduser.id"; - public const string AttributeEnduserRole = "enduser.role"; - public const string AttributeEnduserScope = "enduser.scope"; public const string AttributePeerService = "peer.service"; - public const string AttributeHttpMethod = "http.method"; - public const string AttributeHttpUrl = "http.url"; - public const string AttributeHttpTarget = "http.target"; public const string AttributeHttpHost = "http.host"; - public const string AttributeHttpScheme = "http.scheme"; - public const string AttributeHttpStatusCode = "http.status_code"; - public const string AttributeHttpStatusText = "http.status_text"; - public const string AttributeHttpFlavor = "http.flavor"; - public const string AttributeHttpServerName = "http.server_name"; - public const string AttributeHttpRoute = "http.route"; - public const string AttributeHttpClientIP = "http.client_ip"; - public const string AttributeHttpUserAgent = "http.user_agent"; - public const string AttributeHttpRequestContentLength = "http.request_content_length"; - public const string AttributeHttpRequestContentLengthUncompressed = "http.request_content_length_uncompressed"; - public const string AttributeHttpResponseContentLength = "http.response_content_length"; - public const string AttributeHttpResponseContentLengthUncompressed = "http.response_content_length_uncompressed"; - - public const string AttributeDbSystem = "db.system"; - public const string AttributeDbConnectionString = "db.connection_string"; - public const string AttributeDbUser = "db.user"; - public const string AttributeDbMsSqlInstanceName = "db.mssql.instance_name"; - public const string AttributeDbJdbcDriverClassName = "db.jdbc.driver_classname"; - public const string AttributeDbName = "db.name"; - public const string AttributeDbStatement = "db.statement"; - public const string AttributeDbOperation = "db.operation"; public const string AttributeDbInstance = "db.instance"; - public const string AttributeDbUrl = "db.url"; - public const string AttributeDbCassandraKeyspace = "db.cassandra.keyspace"; - public const string AttributeDbHBaseNamespace = "db.hbase.namespace"; - public const string AttributeDbRedisDatabaseIndex = "db.redis.database_index"; - public const string AttributeDbMongoDbCollection = "db.mongodb.collection"; - - public const string AttributeRpcSystem = "rpc.system"; - public const string AttributeRpcService = "rpc.service"; - public const string AttributeRpcMethod = "rpc.method"; - public const string AttributeRpcGrpcStatusCode = "rpc.grpc.status_code"; public const string AttributeMessageType = "message.type"; public const string AttributeMessageId = "message.id"; - public const string AttributeMessageCompressedSize = "message.compressed_size"; - public const string AttributeMessageUncompressedSize = "message.uncompressed_size"; - - public const string AttributeFaasTrigger = "faas.trigger"; - public const string AttributeFaasExecution = "faas.execution"; - public const string AttributeFaasDocumentCollection = "faas.document.collection"; - public const string AttributeFaasDocumentOperation = "faas.document.operation"; - public const string AttributeFaasDocumentTime = "faas.document.time"; - public const string AttributeFaasDocumentName = "faas.document.name"; - public const string AttributeFaasTime = "faas.time"; - public const string AttributeFaasCron = "faas.cron"; - - public const string AttributeMessagingSystem = "messaging.system"; - public const string AttributeMessagingDestination = "messaging.destination"; - public const string AttributeMessagingDestinationKind = "messaging.destination_kind"; - public const string AttributeMessagingTempDestination = "messaging.temp_destination"; - public const string AttributeMessagingProtocol = "messaging.protocol"; - public const string AttributeMessagingProtocolVersion = "messaging.protocol_version"; - public const string AttributeMessagingUrl = "messaging.url"; - public const string AttributeMessagingMessageId = "messaging.message_id"; - public const string AttributeMessagingConversationId = "messaging.conversation_id"; - public const string AttributeMessagingPayloadSize = "messaging.message_payload_size_bytes"; - public const string AttributeMessagingPayloadCompressedSize = "messaging.message_payload_compressed_size_bytes"; - public const string AttributeMessagingOperation = "messaging.operation"; public const string AttributeExceptionEventName = "exception"; public const string AttributeExceptionType = "exception.type"; public const string AttributeExceptionMessage = "exception.message"; public const string AttributeExceptionStacktrace = "exception.stacktrace"; - public const string AttributeErrorType = "error.type"; - - // v1.21.0 - // https://github.com/open-telemetry/semantic-conventions/blob/v1.21.0/docs/database/database-spans.md - public const string AttributeServerSocketAddress = "server.socket.address"; // replaces: "net.peer.ip" (AttributeNetPeerIp) - - // v1.23.0 - // https://github.com/open-telemetry/semantic-conventions/blob/v1.23.0/docs/http/http-spans.md - public const string AttributeClientAddress = "client.address"; - public const string AttributeClientPort = "client.port"; - public const string AttributeHttpRequestMethod = "http.request.method"; // replaces: "http.method" (AttributeHttpMethod) - public const string AttributeHttpRequestMethodOriginal = "http.request.method_original"; - public const string AttributeHttpResponseStatusCode = "http.response.status_code"; // replaces: "http.status_code" (AttributeHttpStatusCode) - public const string AttributeNetworkProtocolVersion = "network.protocol.version"; // replaces: "http.flavor" (AttributeHttpFlavor) - public const string AttributeNetworkProtocolName = "network.protocol.name"; - public const string AttributeServerAddress = "server.address"; // replaces: "net.host.name" (AttributeNetHostName) and "net.peer.name" (AttributeNetPeerName) - public const string AttributeServerPort = "server.port"; // replaces: "net.host.port" (AttributeNetHostPort) and "net.peer.port" (AttributeNetPeerPort) - public const string AttributeUrlFull = "url.full"; // replaces: "http.url" (AttributeHttpUrl) - public const string AttributeUrlPath = "url.path"; // replaces: "http.target" (AttributeHttpTarget) - public const string AttributeUrlQuery = "url.query"; - public const string AttributeUrlScheme = "url.scheme"; // replaces: "http.scheme" (AttributeHttpScheme) - public const string AttributeUserAgentOriginal = "user_agent.original"; // replaces: "http.user_agent" (AttributeHttpUserAgent) } diff --git a/test/OpenTelemetry.AotCompatibility.TestApp/OpenTelemetry.AotCompatibility.TestApp.csproj b/test/OpenTelemetry.AotCompatibility.TestApp/OpenTelemetry.AotCompatibility.TestApp.csproj index 4cf2627eb3d..c46810b0b1f 100644 --- a/test/OpenTelemetry.AotCompatibility.TestApp/OpenTelemetry.AotCompatibility.TestApp.csproj +++ b/test/OpenTelemetry.AotCompatibility.TestApp/OpenTelemetry.AotCompatibility.TestApp.csproj @@ -8,10 +8,6 @@ true - - - - diff --git a/test/OpenTelemetry.AotCompatibility.TestApp/Program.cs b/test/OpenTelemetry.AotCompatibility.TestApp/Program.cs index 121d205046b..fec0bdddfaf 100644 --- a/test/OpenTelemetry.AotCompatibility.TestApp/Program.cs +++ b/test/OpenTelemetry.AotCompatibility.TestApp/Program.cs @@ -1,17 +1,4 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using OpenTelemetry.AotCompatibility.TestApp; - -try -{ - PropertyFetcherAotTest.Test(); -} -catch (Exception ex) -{ - Console.WriteLine(ex); - return -1; -} - Console.WriteLine("Passed."); -return 0; diff --git a/test/OpenTelemetry.AotCompatibility.TestApp/PropertyFetcherAotTest.cs b/test/OpenTelemetry.AotCompatibility.TestApp/PropertyFetcherAotTest.cs deleted file mode 100644 index d79a00c9471..00000000000 --- a/test/OpenTelemetry.AotCompatibility.TestApp/PropertyFetcherAotTest.cs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -using System.Diagnostics.CodeAnalysis; -using OpenTelemetry.Instrumentation; - -namespace OpenTelemetry.AotCompatibility.TestApp; - -internal class PropertyFetcherAotTest -{ - [UnconditionalSuppressMessage("", "IL2026", Justification = "Property presence guaranteed by explicit hints.")] - public static void Test() - { - var fetcher = new PropertyFetcher("Property"); - - GuaranteeProperties(); - var r = fetcher.TryFetch(new PayloadTypeWithBaseType(), out var value); - Assert(r, "TryFetch base did not return true."); - Assert(value!.GetType() == typeof(DerivedType), "TryFetch base value is not a derived type."); - - GuaranteeProperties(); - r = fetcher.TryFetch(new PayloadTypeWithDerivedType(), out value); - Assert(r, "TryFetch derived did not return true."); - Assert(value!.GetType() == typeof(DerivedType), "TryFetch derived value is not a derived type."); - } - - private static void GuaranteeProperties<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] T>() - { - } - - private static void Assert(bool condition, string message) - { - if (!condition) - { - throw new InvalidOperationException(message); - } - } - - private class BaseType - { - } - - private class DerivedType : BaseType - { - } - - private class PayloadTypeWithBaseType - { - public BaseType Property { get; set; } = new DerivedType(); - } - - private class PayloadTypeWithDerivedType - { - public DerivedType Property { get; set; } = new DerivedType(); - } -} diff --git a/test/OpenTelemetry.Tests/Instrumentation/ActivityInstrumentationHelperTest.cs b/test/OpenTelemetry.Tests/Instrumentation/ActivityInstrumentationHelperTest.cs deleted file mode 100644 index e5841f53e64..00000000000 --- a/test/OpenTelemetry.Tests/Instrumentation/ActivityInstrumentationHelperTest.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -using System.Diagnostics; -using Xunit; - -namespace OpenTelemetry.Instrumentation.Tests; - -public class ActivityInstrumentationHelperTest -{ - [Theory] - [InlineData("TestActivitySource", null)] - [InlineData("TestActivitySource", "1.0.0")] - public void SetActivitySource(string name, string version) - { - using var activity = new Activity("Test"); - using var activitySource = new ActivitySource(name, version); - - activity.Start(); - ActivityInstrumentationHelper.SetActivitySourceProperty(activity, activitySource); - Assert.Equal(activitySource.Name, activity.Source.Name); - Assert.Equal(activitySource.Version, activity.Source.Version); - activity.Stop(); - } - - [Theory] - [InlineData(ActivityKind.Client)] - [InlineData(ActivityKind.Consumer)] - [InlineData(ActivityKind.Internal)] - [InlineData(ActivityKind.Producer)] - [InlineData(ActivityKind.Server)] - public void SetActivityKind(ActivityKind activityKind) - { - using var activity = new Activity("Test"); - activity.Start(); - ActivityInstrumentationHelper.SetKindProperty(activity, activityKind); - Assert.Equal(activityKind, activity.Kind); - } -} diff --git a/test/OpenTelemetry.Tests/Instrumentation/PropertyFetcherTest.cs b/test/OpenTelemetry.Tests/Instrumentation/PropertyFetcherTest.cs deleted file mode 100644 index 9acf58b3128..00000000000 --- a/test/OpenTelemetry.Tests/Instrumentation/PropertyFetcherTest.cs +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -using System.Diagnostics; -using Xunit; - -namespace OpenTelemetry.Instrumentation.Tests; - -public class PropertyFetcherTest -{ - [Fact] - public void FetchValidProperty() - { - using var activity = new Activity("test"); - - var fetch = new PropertyFetcher("DisplayName"); - - Assert.Equal(0, fetch.NumberOfInnerFetchers); - - Assert.True(fetch.TryFetch(activity, out string result)); - Assert.Equal(activity.DisplayName, result); - - Assert.Equal(1, fetch.NumberOfInnerFetchers); - - Assert.True(fetch.TryFetch(activity, out result)); - Assert.Equal(activity.DisplayName, result); - - Assert.Equal(1, fetch.NumberOfInnerFetchers); - } - - [Fact] - public void FetchInvalidProperty() - { - using var activity = new Activity("test"); - var fetch = new PropertyFetcher("DisplayName2"); - Assert.False(fetch.TryFetch(activity, out string result)); - - var fetchInt = new PropertyFetcher("DisplayName2"); - Assert.False(fetchInt.TryFetch(activity, out int resultInt)); - - Assert.Equal(default, result); - Assert.Equal(default, resultInt); - } - - [Fact] - public void FetchNullProperty() - { - var fetch = new PropertyFetcher("null"); - Assert.False(fetch.TryFetch(null, out _)); - } - - [Fact] - public void FetchPropertyMultiplePayloadTypes() - { - var fetch = new PropertyFetcher("Property"); - - Assert.Equal(0, fetch.NumberOfInnerFetchers); - - Assert.True(fetch.TryFetch(new PayloadTypeA(), out string propertyValue)); - Assert.Equal("A", propertyValue); - - Assert.Equal(1, fetch.NumberOfInnerFetchers); - - Assert.True(fetch.TryFetch(new PayloadTypeB(), out propertyValue)); - Assert.Equal("B", propertyValue); - - Assert.Equal(2, fetch.NumberOfInnerFetchers); - - Assert.False(fetch.TryFetch(new PayloadTypeC(), out _)); - - Assert.Equal(2, fetch.NumberOfInnerFetchers); - - Assert.False(fetch.TryFetch(null, out _)); - - Assert.Equal(2, fetch.NumberOfInnerFetchers); - } - - [Fact] - public void FetchPropertyMultiplePayloadTypes_IgnoreTypesWithoutExpectedPropertyName() - { - var fetch = new PropertyFetcher("Property"); - - Assert.False(fetch.TryFetch(new PayloadTypeC(), out _)); - - Assert.True(fetch.TryFetch(new PayloadTypeA(), out string propertyValue)); - Assert.Equal("A", propertyValue); - } - - [Fact] - public void FetchPropertyWithDerivedInstanceType() - { - var fetch = new PropertyFetcher("Property"); - - Assert.True(fetch.TryFetch(new PayloadTypeWithBaseType(), out BaseType value)); - Assert.IsType(value); - } - - [Fact] - public void FetchPropertyWithDerivedDeclaredType() - { - var fetch = new PropertyFetcher("Property"); - - Assert.True(fetch.TryFetch(new PayloadTypeWithDerivedType(), out BaseType value)); - Assert.IsType(value); - } - - [Fact] - public void FetchPropertyWhenPayloadIsValueType() - { - var fetch = new PropertyFetcher("Property"); - var ex = Assert.Throws(() => fetch.TryFetch(new PayloadTypeIsValueType(), out BaseType value)); - Assert.Contains("PropertyFetcher can only operate on reference payload types.", ex.Message); - } - - private struct PayloadTypeIsValueType - { - public PayloadTypeIsValueType() - { - } - - public DerivedType Property { get; set; } = new DerivedType(); - } - - private class PayloadTypeA - { - public string Property { get; set; } = "A"; - } - - private class PayloadTypeB - { - public string Property { get; set; } = "B"; - } - - private class PayloadTypeC - { - } - - private class BaseType - { - } - - private class DerivedType : BaseType - { - } - - private class PayloadTypeWithBaseType - { - public BaseType Property { get; set; } = new DerivedType(); - } - - private class PayloadTypeWithDerivedType - { - public DerivedType Property { get; set; } = new DerivedType(); - } -} diff --git a/test/OpenTelemetry.Tests/Internal/RedactionHelperTest.cs b/test/OpenTelemetry.Tests/Internal/RedactionHelperTest.cs deleted file mode 100644 index dda28455c72..00000000000 --- a/test/OpenTelemetry.Tests/Internal/RedactionHelperTest.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -using OpenTelemetry.Internal; -using Xunit; - -namespace OpenTelemetry.Tests.Internal; - -public class RedactionHelperTest -{ - [Theory] - [InlineData("?a", "?a")] - [InlineData("?a=b", "?a=Redacted")] - [InlineData("?a=b&", "?a=Redacted&")] - [InlineData("?c=b&", "?c=Redacted&")] - [InlineData("?c=a", "?c=Redacted")] - [InlineData("?a=b&c", "?a=Redacted&c")] - [InlineData("?a=b&c=1&", "?a=Redacted&c=Redacted&")] - [InlineData("?a=b&c=1&a1", "?a=Redacted&c=Redacted&a1")] - [InlineData("?a=b&c=1&a1=", "?a=Redacted&c=Redacted&a1=Redacted")] - [InlineData("?a=b&c=11&a1=&", "?a=Redacted&c=Redacted&a1=Redacted&")] - [InlineData("?c&c&c&", "?c&c&c&")] - [InlineData("?a&a&a&a", "?a&a&a&a")] - [InlineData("?&&&&&&&", "?&&&&&&&")] - [InlineData("?c", "?c")] - [InlineData("?=c", "?=Redacted")] - [InlineData("?=c&=", "?=Redacted&=Redacted")] - public void QueryStringIsRedacted(string input, string expected) - { - Assert.Equal(expected, RedactionHelper.GetRedactedQueryString(input)); - } -} diff --git a/test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj b/test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj index 106ba9ef4bd..2a2532c07e9 100644 --- a/test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj +++ b/test/OpenTelemetry.Tests/OpenTelemetry.Tests.csproj @@ -19,11 +19,8 @@ - - - diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTest.cs index 9e6e7320371..044d40c1c63 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTest.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTest.cs @@ -4,7 +4,6 @@ using System.Diagnostics; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using OpenTelemetry.Instrumentation; using OpenTelemetry.Resources; using OpenTelemetry.Resources.Tests; using OpenTelemetry.Tests; @@ -14,6 +13,8 @@ namespace OpenTelemetry.Trace.Tests; public class TracerProviderSdkTest : IDisposable { + private static readonly Action SetActivitySourceProperty = CreateActivitySourceSetter(); + public TracerProviderSdkTest() { Activity.DefaultIdFormat = ActivityIdFormat.W3C; @@ -639,7 +640,7 @@ public void SdkCallsOnlyProcessorOnStartForLegacyActivityWhenActivitySourceIsUpd using var activity = new Activity(operationNameForLegacyActivity); activity.Start(); - ActivityInstrumentationHelper.SetActivitySourceProperty(activity, activitySourceForLegacyActivity); + SetActivitySourceProperty(activity, activitySourceForLegacyActivity); activity.Stop(); Assert.True(startCalled); // Processor.OnStart is called since we provided the legacy OperationName @@ -690,7 +691,7 @@ public void SdkProcessesLegacyActivityWhenActivitySourceIsUpdatedWithAddSource() using var activity = new Activity(operationNameForLegacyActivity); activity.Start(); - ActivityInstrumentationHelper.SetActivitySourceProperty(activity, activitySourceForLegacyActivity); + SetActivitySourceProperty(activity, activitySourceForLegacyActivity); activity.Stop(); Assert.True(startCalled); // Processor.OnStart is called since we provided the legacy OperationName @@ -1297,6 +1298,12 @@ public void Dispose() GC.SuppressFinalize(this); } + private static Action CreateActivitySourceSetter() + { + return (Action)typeof(Activity).GetProperty("Source") + .SetMethod.CreateDelegate(typeof(Action)); + } + private sealed class TestTracerProviderBuilder : TracerProviderBuilderBase { public TracerProviderBuilder AddInstrumentation()