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));
+ }
+ }
}