public static void AddInstrumentationViaReflection()

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