diff --git a/src/OpenTelemetry.AutoInstrumentation/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry.AutoInstrumentation/.publicApi/net462/PublicAPI.Unshipped.txt index e2a17377a0..89ba7748fc 100644 --- a/src/OpenTelemetry.AutoInstrumentation/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.AutoInstrumentation/.publicApi/net462/PublicAPI.Unshipped.txt @@ -1,4 +1,4 @@ -OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.AsyncEventingBasicConsumerIntegration -OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.EventingBasicConsumerIntegration +OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.AsyncDefaultBasicConsumerIntegration +OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.DefaultBasicConsumerIntegration OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.ModelBaseBasicGetIntegration OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.ModelBasicPublishIntegration \ No newline at end of file diff --git a/src/OpenTelemetry.AutoInstrumentation/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.AutoInstrumentation/.publicApi/net6.0/PublicAPI.Unshipped.txt index e2a17377a0..89ba7748fc 100644 --- a/src/OpenTelemetry.AutoInstrumentation/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.AutoInstrumentation/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -1,4 +1,4 @@ -OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.AsyncEventingBasicConsumerIntegration -OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.EventingBasicConsumerIntegration +OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.AsyncDefaultBasicConsumerIntegration +OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.DefaultBasicConsumerIntegration OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.ModelBaseBasicGetIntegration OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.ModelBasicPublishIntegration \ No newline at end of file diff --git a/src/OpenTelemetry.AutoInstrumentation/Generated/net462/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.Derived.g.cs b/src/OpenTelemetry.AutoInstrumentation/Generated/net462/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.Derived.g.cs new file mode 100644 index 0000000000..2d19f9abf9 --- /dev/null +++ b/src/OpenTelemetry.AutoInstrumentation/Generated/net462/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.Derived.g.cs @@ -0,0 +1,35 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by the InstrumentationDefinitionsGenerator tool. To safely +// modify this file, edit InstrumentMethodAttribute on the classes and +// compile project. + +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using OpenTelemetry.AutoInstrumentation.Configurations; + +namespace OpenTelemetry.AutoInstrumentation; + +internal static partial class InstrumentationDefinitions +{ + private static NativeCallTargetDefinition[] GetDerivedDefinitionsArray() + { + var nativeCallTargetDefinitions = new List(2); + // Traces + var tracerSettings = Instrumentation.TracerSettings.Value; + if (tracerSettings.TracesEnabled) + { + // RabbitMq + if (tracerSettings.EnabledInstrumentations.Contains(TracerInstrumentation.RabbitMq)) + { + nativeCallTargetDefinitions.Add(new("RabbitMQ.Client", "RabbitMQ.Client.AsyncDefaultBasicConsumer", "HandleBasicDeliver", new[] {"System.Threading.Tasks.Task", "System.String", "System.UInt64", "System.Boolean", "System.String", "System.String", "RabbitMQ.Client.IBasicProperties", "System.ReadOnlyMemory`1[System.Byte]"}, 6, 0, 0, 6, 65535, 65535, AssemblyFullName, "OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.AsyncDefaultBasicConsumerIntegration")); + nativeCallTargetDefinitions.Add(new("RabbitMQ.Client", "RabbitMQ.Client.DefaultBasicConsumer", "HandleBasicDeliver", new[] {"System.Void", "System.String", "System.UInt64", "System.Boolean", "System.String", "System.String", "RabbitMQ.Client.IBasicProperties", "System.ReadOnlyMemory`1[System.Byte]"}, 6, 0, 0, 6, 65535, 65535, AssemblyFullName, "OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.DefaultBasicConsumerIntegration")); + } + } + + return nativeCallTargetDefinitions.ToArray(); + } +} diff --git a/src/OpenTelemetry.AutoInstrumentation/Generated/net462/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs b/src/OpenTelemetry.AutoInstrumentation/Generated/net462/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs index 47367e7418..ed167739de 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Generated/net462/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Generated/net462/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs @@ -15,11 +15,9 @@ namespace OpenTelemetry.AutoInstrumentation; internal static partial class InstrumentationDefinitions { - private static readonly string AssemblyFullName = typeof(InstrumentationDefinitions).Assembly.FullName!; - private static NativeCallTargetDefinition[] GetDefinitionsArray() { - var nativeCallTargetDefinitions = new List(20); + var nativeCallTargetDefinitions = new List(18); // Traces var tracerSettings = Instrumentation.TracerSettings.Value; if (tracerSettings.TracesEnabled) @@ -57,8 +55,6 @@ private static NativeCallTargetDefinition[] GetDefinitionsArray() // RabbitMq if (tracerSettings.EnabledInstrumentations.Contains(TracerInstrumentation.RabbitMq)) { - nativeCallTargetDefinitions.Add(new("RabbitMQ.Client", "RabbitMQ.Client.Events.AsyncEventingBasicConsumer", "HandleBasicDeliver", new[] {"System.Threading.Tasks.Task", "System.String", "System.UInt64", "System.Boolean", "System.String", "System.String", "RabbitMQ.Client.IBasicProperties", "System.ReadOnlyMemory`1[System.Byte]"}, 6, 0, 0, 6, 65535, 65535, AssemblyFullName, "OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.AsyncEventingBasicConsumerIntegration")); - nativeCallTargetDefinitions.Add(new("RabbitMQ.Client", "RabbitMQ.Client.Events.EventingBasicConsumer", "HandleBasicDeliver", new[] {"System.Void", "System.String", "System.UInt64", "System.Boolean", "System.String", "System.String", "RabbitMQ.Client.IBasicProperties", "System.ReadOnlyMemory`1[System.Byte]"}, 6, 0, 0, 6, 65535, 65535, AssemblyFullName, "OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.EventingBasicConsumerIntegration")); nativeCallTargetDefinitions.Add(new("RabbitMQ.Client", "RabbitMQ.Client.Impl.ModelBase", "BasicGet", new[] {"RabbitMQ.Client.BasicGetResult", "System.String", "System.Boolean"}, 6, 0, 0, 6, 65535, 65535, AssemblyFullName, "OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.ModelBaseBasicGetIntegration")); nativeCallTargetDefinitions.Add(new("RabbitMQ.Client", "RabbitMQ.Client.Framing.Impl.Model", "_Private_BasicPublish", new[] {"System.Void", "System.String", "System.String", "System.Boolean", "RabbitMQ.Client.IBasicProperties", "System.ReadOnlyMemory`1[System.Byte]"}, 6, 0, 0, 6, 65535, 65535, AssemblyFullName, "OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.ModelBasicPublishIntegration")); } diff --git a/src/OpenTelemetry.AutoInstrumentation/Generated/net6.0/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.Derived.g.cs b/src/OpenTelemetry.AutoInstrumentation/Generated/net6.0/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.Derived.g.cs new file mode 100644 index 0000000000..2d19f9abf9 --- /dev/null +++ b/src/OpenTelemetry.AutoInstrumentation/Generated/net6.0/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.Derived.g.cs @@ -0,0 +1,35 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by the InstrumentationDefinitionsGenerator tool. To safely +// modify this file, edit InstrumentMethodAttribute on the classes and +// compile project. + +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using OpenTelemetry.AutoInstrumentation.Configurations; + +namespace OpenTelemetry.AutoInstrumentation; + +internal static partial class InstrumentationDefinitions +{ + private static NativeCallTargetDefinition[] GetDerivedDefinitionsArray() + { + var nativeCallTargetDefinitions = new List(2); + // Traces + var tracerSettings = Instrumentation.TracerSettings.Value; + if (tracerSettings.TracesEnabled) + { + // RabbitMq + if (tracerSettings.EnabledInstrumentations.Contains(TracerInstrumentation.RabbitMq)) + { + nativeCallTargetDefinitions.Add(new("RabbitMQ.Client", "RabbitMQ.Client.AsyncDefaultBasicConsumer", "HandleBasicDeliver", new[] {"System.Threading.Tasks.Task", "System.String", "System.UInt64", "System.Boolean", "System.String", "System.String", "RabbitMQ.Client.IBasicProperties", "System.ReadOnlyMemory`1[System.Byte]"}, 6, 0, 0, 6, 65535, 65535, AssemblyFullName, "OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.AsyncDefaultBasicConsumerIntegration")); + nativeCallTargetDefinitions.Add(new("RabbitMQ.Client", "RabbitMQ.Client.DefaultBasicConsumer", "HandleBasicDeliver", new[] {"System.Void", "System.String", "System.UInt64", "System.Boolean", "System.String", "System.String", "RabbitMQ.Client.IBasicProperties", "System.ReadOnlyMemory`1[System.Byte]"}, 6, 0, 0, 6, 65535, 65535, AssemblyFullName, "OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.DefaultBasicConsumerIntegration")); + } + } + + return nativeCallTargetDefinitions.ToArray(); + } +} diff --git a/src/OpenTelemetry.AutoInstrumentation/Generated/net6.0/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs b/src/OpenTelemetry.AutoInstrumentation/Generated/net6.0/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs index 291a29f5b6..5e930b25e0 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Generated/net6.0/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Generated/net6.0/SourceGenerators/SourceGenerators.InstrumentationDefinitionsGenerator/InstrumentationDefinitions.g.cs @@ -15,11 +15,9 @@ namespace OpenTelemetry.AutoInstrumentation; internal static partial class InstrumentationDefinitions { - private static readonly string AssemblyFullName = typeof(InstrumentationDefinitions).Assembly.FullName!; - private static NativeCallTargetDefinition[] GetDefinitionsArray() { - var nativeCallTargetDefinitions = new List(23); + var nativeCallTargetDefinitions = new List(21); // Traces var tracerSettings = Instrumentation.TracerSettings.Value; if (tracerSettings.TracesEnabled) @@ -51,8 +49,6 @@ private static NativeCallTargetDefinition[] GetDefinitionsArray() // RabbitMq if (tracerSettings.EnabledInstrumentations.Contains(TracerInstrumentation.RabbitMq)) { - nativeCallTargetDefinitions.Add(new("RabbitMQ.Client", "RabbitMQ.Client.Events.AsyncEventingBasicConsumer", "HandleBasicDeliver", new[] {"System.Threading.Tasks.Task", "System.String", "System.UInt64", "System.Boolean", "System.String", "System.String", "RabbitMQ.Client.IBasicProperties", "System.ReadOnlyMemory`1[System.Byte]"}, 6, 0, 0, 6, 65535, 65535, AssemblyFullName, "OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.AsyncEventingBasicConsumerIntegration")); - nativeCallTargetDefinitions.Add(new("RabbitMQ.Client", "RabbitMQ.Client.Events.EventingBasicConsumer", "HandleBasicDeliver", new[] {"System.Void", "System.String", "System.UInt64", "System.Boolean", "System.String", "System.String", "RabbitMQ.Client.IBasicProperties", "System.ReadOnlyMemory`1[System.Byte]"}, 6, 0, 0, 6, 65535, 65535, AssemblyFullName, "OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.EventingBasicConsumerIntegration")); nativeCallTargetDefinitions.Add(new("RabbitMQ.Client", "RabbitMQ.Client.Impl.ModelBase", "BasicGet", new[] {"RabbitMQ.Client.BasicGetResult", "System.String", "System.Boolean"}, 6, 0, 0, 6, 65535, 65535, AssemblyFullName, "OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.ModelBaseBasicGetIntegration")); nativeCallTargetDefinitions.Add(new("RabbitMQ.Client", "RabbitMQ.Client.Framing.Impl.Model", "_Private_BasicPublish", new[] {"System.Void", "System.String", "System.String", "System.Boolean", "RabbitMQ.Client.IBasicProperties", "System.ReadOnlyMemory`1[System.Byte]"}, 6, 0, 0, 6, 65535, 65535, AssemblyFullName, "OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations.ModelBasicPublishIntegration")); } diff --git a/src/OpenTelemetry.AutoInstrumentation/InstrumentationDefinitions.cs b/src/OpenTelemetry.AutoInstrumentation/InstrumentationDefinitions.cs index edef44c3d7..4d7ef7a6b1 100644 --- a/src/OpenTelemetry.AutoInstrumentation/InstrumentationDefinitions.cs +++ b/src/OpenTelemetry.AutoInstrumentation/InstrumentationDefinitions.cs @@ -5,6 +5,8 @@ namespace OpenTelemetry.AutoInstrumentation; internal static partial class InstrumentationDefinitions { + private static readonly string AssemblyFullName = typeof(InstrumentationDefinitions).Assembly.FullName!; + internal static Payload GetAllDefinitions() { return new Payload @@ -29,12 +31,6 @@ internal static Payload GetDerivedDefinitions() }; } - // TODO: Generate this list using source generators - private static NativeCallTargetDefinition[] GetDerivedDefinitionsArray() - => new NativeCallTargetDefinition[] - { - }; - internal struct Payload { public string DefinitionsId { get; set; } diff --git a/src/OpenTelemetry.AutoInstrumentation/Instrumentations/InstrumentMethodAttribute.cs b/src/OpenTelemetry.AutoInstrumentation/Instrumentations/InstrumentMethodAttribute.cs index 959335977e..52a978accf 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Instrumentations/InstrumentMethodAttribute.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Instrumentations/InstrumentMethodAttribute.cs @@ -10,7 +10,7 @@ namespace OpenTelemetry.AutoInstrumentation.Instrumentations; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)] internal class InstrumentMethodAttribute : Attribute { - public InstrumentMethodAttribute(string assemblyName, string typeName, string methodName, string returnTypeName, string[] parameterTypeNames, string minimumVersion, string maximumVersion, string integrationName, InstrumentationType type) + public InstrumentMethodAttribute(string assemblyName, string typeName, string methodName, string returnTypeName, string[] parameterTypeNames, string minimumVersion, string maximumVersion, string integrationName, InstrumentationType type, IntegrationKind integrationKind = IntegrationKind.Direct) { AssemblyName = assemblyName; TypeName = typeName; @@ -24,6 +24,7 @@ public InstrumentMethodAttribute(string assemblyName, string typeName, string me }; IntegrationName = integrationName; Type = type; + Kind = integrationKind; } /// @@ -83,4 +84,9 @@ public string MaximumVersion /// Gets or sets the integration type. /// public InstrumentationType Type { get; set; } + + /// + /// Gets or sets the integration kind. + /// + public IntegrationKind Kind { get; set; } } diff --git a/src/OpenTelemetry.AutoInstrumentation/Instrumentations/IntegrationKind.cs b/src/OpenTelemetry.AutoInstrumentation/Instrumentations/IntegrationKind.cs new file mode 100644 index 0000000000..861c1e96bb --- /dev/null +++ b/src/OpenTelemetry.AutoInstrumentation/Instrumentations/IntegrationKind.cs @@ -0,0 +1,10 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +namespace OpenTelemetry.AutoInstrumentation.Instrumentations; + +internal enum IntegrationKind +{ + Direct = 0, + Derived = 1 +} diff --git a/src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/IntegrationConstants.cs b/src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/IntegrationConstants.cs index f6f07a6bb8..d0abde51ec 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/IntegrationConstants.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/IntegrationConstants.cs @@ -8,8 +8,8 @@ internal static class IntegrationConstants public const string RabbitMqByteCodeIntegrationName = "RabbitMq"; public const string RabbitMqAssemblyName = "RabbitMQ.Client"; public const string ModelBaseTypeName = "RabbitMQ.Client.Impl.ModelBase"; - public const string EventingBasicConsumerTypeName = "RabbitMQ.Client.Events.EventingBasicConsumer"; - public const string AsyncEventingBasicConsumerTypeName = "RabbitMQ.Client.Events.AsyncEventingBasicConsumer"; + public const string DefaultBasicConsumerTypeName = "RabbitMQ.Client.DefaultBasicConsumer"; + public const string AsyncDefaultBasicConsumerTypeName = "RabbitMQ.Client.AsyncDefaultBasicConsumer"; public const string ModelGeneratedTypeName = "RabbitMQ.Client.Framing.Impl.Model"; public const string BasicGetResultTypeName = "RabbitMQ.Client.BasicGetResult"; public const string BasicPropertiesInterfaceTypeName = "RabbitMQ.Client.IBasicProperties"; diff --git a/src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/Integrations/AsyncEventingBasicConsumerIntegration.cs b/src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/Integrations/AsyncDefaultBasicConsumerIntegration.cs similarity index 87% rename from src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/Integrations/AsyncEventingBasicConsumerIntegration.cs rename to src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/Integrations/AsyncDefaultBasicConsumerIntegration.cs index 3a60874abf..363b19627f 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/Integrations/AsyncEventingBasicConsumerIntegration.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/Integrations/AsyncDefaultBasicConsumerIntegration.cs @@ -10,19 +10,20 @@ namespace OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations; /// -/// RabbitMq AsyncEventingBasicConsumer.HandleBasicDeliver integration. +/// RabbitMq AsyncDefaultBasicConsumer.HandleBasicDeliver integration. /// [InstrumentMethod( assemblyName: IntegrationConstants.RabbitMqAssemblyName, - typeName: IntegrationConstants.AsyncEventingBasicConsumerTypeName, + typeName: IntegrationConstants.AsyncDefaultBasicConsumerTypeName, methodName: IntegrationConstants.HandleBasicDeliverMethodName, returnTypeName: ClrNames.Task, parameterTypeNames: new[] { ClrNames.String, ClrNames.UInt64, ClrNames.Bool, ClrNames.String, ClrNames.String, IntegrationConstants.BasicPropertiesInterfaceTypeName, $"System.ReadOnlyMemory`1[{ClrNames.Byte}]" }, minimumVersion: IntegrationConstants.MinSupportedVersion, maximumVersion: IntegrationConstants.MaxSupportedVersion, integrationName: IntegrationConstants.RabbitMqByteCodeIntegrationName, - type: InstrumentationType.Trace)] -public static class AsyncEventingBasicConsumerIntegration + type: InstrumentationType.Trace, + integrationKind: IntegrationKind.Derived)] +public static class AsyncDefaultBasicConsumerIntegration { internal static CallTargetState OnMethodBegin(TTarget instance, string? consumerTag, ulong deliveryTag, bool redelivered, string? exchange, string? routingKey, TBasicProperties properties, TBody body) where TBasicProperties : IBasicProperties diff --git a/src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/Integrations/EventingBasicConsumerIntegration.cs b/src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/Integrations/DefaultBasicConsumerIntegration.cs similarity index 88% rename from src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/Integrations/EventingBasicConsumerIntegration.cs rename to src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/Integrations/DefaultBasicConsumerIntegration.cs index 62894e3f7b..b88c7d0370 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/Integrations/EventingBasicConsumerIntegration.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Instrumentations/RabbitMq6/Integrations/DefaultBasicConsumerIntegration.cs @@ -10,19 +10,20 @@ namespace OpenTelemetry.AutoInstrumentation.Instrumentations.RabbitMq6.Integrations; /// -/// RabbitMq EventingBasicConsumer.HandleBasicDeliver integration. +/// RabbitMq DefaultBasicConsumer.HandleBasicDeliver integration. /// [InstrumentMethod( assemblyName: IntegrationConstants.RabbitMqAssemblyName, - typeName: IntegrationConstants.EventingBasicConsumerTypeName, + typeName: IntegrationConstants.DefaultBasicConsumerTypeName, methodName: IntegrationConstants.HandleBasicDeliverMethodName, returnTypeName: ClrNames.Void, parameterTypeNames: new[] { ClrNames.String, ClrNames.UInt64, ClrNames.Bool, ClrNames.String, ClrNames.String, IntegrationConstants.BasicPropertiesInterfaceTypeName, $"System.ReadOnlyMemory`1[{ClrNames.Byte}]" }, minimumVersion: IntegrationConstants.MinSupportedVersion, maximumVersion: IntegrationConstants.MaxSupportedVersion, integrationName: IntegrationConstants.RabbitMqByteCodeIntegrationName, - type: InstrumentationType.Trace)] -public static class EventingBasicConsumerIntegration + type: InstrumentationType.Trace, + integrationKind: IntegrationKind.Derived)] +public static class DefaultBasicConsumerIntegration { internal static CallTargetState OnMethodBegin(TTarget instance, string? consumerTag, ulong deliveryTag, bool redelivered, string? exchange, string? routingKey, TBasicProperties properties, TBody body) where TBasicProperties : IBasicProperties diff --git a/src/SourceGenerators/InstrumentationDefinitionsGenerator.cs b/src/SourceGenerators/InstrumentationDefinitionsGenerator.cs index 5e793a0a27..1f7656f1dc 100644 --- a/src/SourceGenerators/InstrumentationDefinitionsGenerator.cs +++ b/src/SourceGenerators/InstrumentationDefinitionsGenerator.cs @@ -17,6 +17,8 @@ namespace SourceGenerators; public class InstrumentationDefinitionsGenerator : IIncrementalGenerator { private const string InstrumentMethodAttributeName = "OpenTelemetry.AutoInstrumentation.Instrumentations.InstrumentMethodAttribute"; + private const int IntegrationKindDirect = 0; + private const int IntegrationKindDerived = 1; /// public void Initialize(IncrementalGeneratorInitializationContext context) @@ -41,8 +43,11 @@ private static void Generate(in ImmutableArray instrumen return; } - var result = GenerateInstrumentationDefinitionsPartialClass(instrumentationClasses); - context.AddSource("InstrumentationDefinitions.g.cs", SourceText.From(result, Encoding.UTF8)); + var directIntegrations = GenerateInstrumentationDefinitionsPartialClass(instrumentationClasses, IntegrationKindDirect); + context.AddSource("InstrumentationDefinitions.g.cs", SourceText.From(directIntegrations, Encoding.UTF8)); + + var derivedIntegrations = GenerateInstrumentationDefinitionsPartialClass(instrumentationClasses, IntegrationKindDerived); + context.AddSource("InstrumentationDefinitions.Derived.g.cs", SourceText.From(derivedIntegrations, Encoding.UTF8)); } private static TargetToGenerate CreateTargetToGenerate(AttributeData attribute) @@ -60,6 +65,7 @@ private static TargetToGenerate CreateTargetToGenerate(AttributeData attribute) } var signalType = int.Parse(attribute.ConstructorArguments[8].Value!.ToString()); + var integrationKind = int.Parse(attribute.ConstructorArguments[9].Value!.ToString()); var integrationName = attribute.ConstructorArguments[7].Value!.ToString(); var targetAssembly = attribute.ConstructorArguments[0].Value!.ToString(); var targetType = attribute.ConstructorArguments[1].Value!.ToString(); @@ -76,10 +82,11 @@ private static TargetToGenerate CreateTargetToGenerate(AttributeData attribute) var targetMaximumMinor = maxVersion.Length > 1 && maxVersion[1] != "*" ? int.Parse(maxVersion[1]) : ushort.MaxValue; var targetMaximumPatch = maxVersion.Length > 2 && maxVersion[2] != "*" ? int.Parse(maxVersion[2]) : ushort.MaxValue; - return new TargetToGenerate(signalType, integrationName, targetAssembly, targetType, targetMethod, targetMinimumMajor, targetMinimumMinor, targetMinimumPatch, targetMaximumMajor, targetMaximumMinor, targetMaximumPatch, targetSignatureTypesBuilder.ToString()); + return new TargetToGenerate(signalType, integrationName, targetAssembly, targetType, targetMethod, targetMinimumMajor, targetMinimumMinor, targetMinimumPatch, targetMaximumMajor, targetMaximumMinor, targetMaximumPatch, targetSignatureTypesBuilder.ToString(), integrationKind); } - private static string GenerateInstrumentationDefinitionsPartialClass(ImmutableArray integrationClasses) + private static string GenerateInstrumentationDefinitionsPartialClass( + ImmutableArray integrationClasses, int integrationKind) { var tracesByIntegrationName = new Dictionary>(); var logsByIntegrationName = new Dictionary>(); @@ -89,7 +96,7 @@ private static string GenerateInstrumentationDefinitionsPartialClass(ImmutableAr foreach (var integrationToGenerate in integrationClasses) { - foreach (var targetToGenerate in integrationToGenerate!.Value.Targets) + foreach (var targetToGenerate in integrationToGenerate!.Value.Targets.Where(t => t.IntegrationKind == integrationKind)) { Dictionary> byName; switch (targetToGenerate.SignalType) @@ -125,6 +132,8 @@ private static string GenerateInstrumentationDefinitionsPartialClass(ImmutableAr } } + var generatedMethodName = integrationKind == IntegrationKindDirect ? "GetDefinitionsArray" : "GetDerivedDefinitionsArray"; + var sb = new StringBuilder() .AppendFormat( @"//------------------------------------------------------------------------------ @@ -144,11 +153,10 @@ namespace OpenTelemetry.AutoInstrumentation; internal static partial class InstrumentationDefinitions {{ - private static readonly string AssemblyFullName = typeof(InstrumentationDefinitions).Assembly.FullName!; - - private static NativeCallTargetDefinition[] GetDefinitionsArray() + private static NativeCallTargetDefinition[] {0}() {{ - var nativeCallTargetDefinitions = new List({0});", + var nativeCallTargetDefinitions = new List({1});", + generatedMethodName, instrumentationCount) .AppendLine(); diff --git a/src/SourceGenerators/TargetToGenerate.cs b/src/SourceGenerators/TargetToGenerate.cs index ed5a1a5e38..b30f43e4f7 100644 --- a/src/SourceGenerators/TargetToGenerate.cs +++ b/src/SourceGenerators/TargetToGenerate.cs @@ -3,7 +3,7 @@ namespace SourceGenerators; -internal readonly record struct TargetToGenerate(int SignalType, string IntegrationName, string Assembly, string Type, string Method, int MinimumMajor, int MinimumMinor, int MinimumPatch, int MaximumMajor, int MaximumMinor, int MaximumPatch, string SignatureTypes) +internal readonly record struct TargetToGenerate(int SignalType, string IntegrationName, string Assembly, string Type, string Method, int MinimumMajor, int MinimumMinor, int MinimumPatch, int MaximumMajor, int MaximumMinor, int MaximumPatch, string SignatureTypes, int IntegrationKind) { public readonly int SignalType = SignalType; @@ -28,4 +28,5 @@ internal readonly record struct TargetToGenerate(int SignalType, string Integrat public readonly int MaximumPatch = MaximumPatch; public readonly string SignatureTypes = SignatureTypes; + public readonly int IntegrationKind = IntegrationKind; } diff --git a/test/test-applications/integrations/TestApplication.RabbitMq/Program.cs b/test/test-applications/integrations/TestApplication.RabbitMq/Program.cs index ec9e23fbf3..31c1c49085 100644 --- a/test/test-applications/integrations/TestApplication.RabbitMq/Program.cs +++ b/test/test-applications/integrations/TestApplication.RabbitMq/Program.cs @@ -55,12 +55,13 @@ private static int PublishAndConsumeWithSyncDispatcher(string[] args) Publish(syncConsumersModel, GetTestMessage(), syncConsumersModel.CreateBasicProperties()); - var consumer = new EventingBasicConsumer(syncConsumersModel); + var consumer = new TestSyncConsumer(syncConsumersModel); using var mre = new ManualResetEventSlim(false); consumer.Received += (_, ea) => { + Console.WriteLine("[x] Handling BasicDeliver in TestSyncConsumer."); ProcessReceivedMessage(ea.Body); mre.Set(); }; @@ -88,12 +89,13 @@ private static int PublishAndConsumeAsyncWithAsyncDispatcher(string[] args) using var asyncConsumersModel = asyncConsumersConnection.CreateModel(); Publish(asyncConsumersModel, GetTestMessage(), asyncConsumersModel.CreateBasicProperties()); - var asyncConsumer = new AsyncEventingBasicConsumer(asyncConsumersModel); + var asyncConsumer = new TestAsyncConsumer(asyncConsumersModel); using var mre = new ManualResetEventSlim(false); asyncConsumer.Received += async (_, ea) => { + Console.WriteLine("[x] Handling BasicDeliver in TestAsyncConsumer."); ProcessReceivedMessage(ea.Body); await Task.Yield(); mre.Set(); @@ -142,4 +144,60 @@ private static string GetTestMessage() { return $"Hello World!{_messageNumber++}"; } + + // Custom consumer classes, with implementation (simplified) based on EventingBasicConsumer/AsyncEventingBasicConsumer + // from the library. + private class TestAsyncConsumer : AsyncDefaultBasicConsumer + { + public TestAsyncConsumer(IModel model) + : base(model) + { + } + + public event AsyncEventHandler? Received; + + public override Task? HandleBasicDeliver( + string consumerTag, + ulong deliveryTag, + bool redelivered, + string exchange, + string routingKey, + IBasicProperties properties, + ReadOnlyMemory body) + { + return Received?.Invoke( + this, + new BasicDeliverEventArgs( + consumerTag, + deliveryTag, + redelivered, + exchange, + routingKey, + properties, + body)); + } + } + + private class TestSyncConsumer : DefaultBasicConsumer + { + public TestSyncConsumer(IModel model) + : base(model) + { + } + + public event EventHandler? Received; + + public override void HandleBasicDeliver( + string consumerTag, + ulong deliveryTag, + bool redelivered, + string exchange, + string routingKey, + IBasicProperties properties, + ReadOnlyMemory body) + { + base.HandleBasicDeliver(consumerTag, deliveryTag, redelivered, exchange, routingKey, properties, body); + Received?.Invoke(this, new BasicDeliverEventArgs(consumerTag, deliveryTag, redelivered, exchange, routingKey, properties, body)); + } + } }