in src/Elastic.OpenTelemetry.Core/SignalBuilder.cs [188:232]
public static void AddInstrumentationViaReflection<T>(T builder, ILogger logger, ReadOnlySpan<InstrumentationAssemblyInfo> assemblyInfos, string builderInstanceId)
where T : class
{
var builderTypeName = builder.GetType().Name;
foreach (var assemblyInfo in assemblyInfos)
{
try
{
var type = Type.GetType($"{assemblyInfo.FullyQualifiedType}, {assemblyInfo.AssemblyName}");
if (type is null)
{
logger.LogUnableToFindType(assemblyInfo.FullyQualifiedType, assemblyInfo.AssemblyName);
continue;
}
var methodInfo = type.GetMethod(assemblyInfo.InstrumentationMethod, BindingFlags.Static | BindingFlags.Public,
Type.DefaultBinder, [typeof(T)], null);
if (methodInfo is null)
{
logger.LogUnableToFindMethodWarning(assemblyInfo.FullyQualifiedType, assemblyInfo.InstrumentationMethod,
assemblyInfo.AssemblyName);
continue;
}
methodInfo.Invoke(null, [builder]); // Invoke the extension method to register the instrumentation with the builder.
if (builderTypeName.StartsWith("ResourceBuilder"))
{
logger.LogAddedResourceDetectorViaReflection(assemblyInfo.Name, builderTypeName, builderInstanceId);
}
else
{
logger.LogAddedInstrumentationViaReflection(assemblyInfo.Name, builderTypeName, builderInstanceId);
}
}
catch (Exception ex)
{
logger.LogError(new EventId(503, "DynamicInstrumentaionFailed"), ex, "Failed to dynamically enable " +
"{InstrumentationName} on {Provider}.", assemblyInfo.Name, builderTypeName);
}
}
}