diff --git a/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.Descriptors.cs b/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.Descriptors.cs index cfce704a..5985fb43 100644 --- a/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.Descriptors.cs +++ b/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.Descriptors.cs @@ -251,7 +251,7 @@ public void AppendRecordDurationStatement(StringBuilder builder, in InterceptorT builder.Append('.'); builder.Append(RecordDurationMethod); builder.Append("(metricStart"); - AppendRecordDurationArguments(builder, target); + AppendRecordDurationArguments(builder, in target); builder.AppendLine(");"); } @@ -286,7 +286,7 @@ public void Append(StringBuilder builder, in InterceptorTarget target) builder.Append('.'); builder.Append(EnrichMethod); builder.Append("(activity"); - AppendArguments(builder, target); + AppendArguments(builder, in target); builder.AppendLine(");"); builder.AppendLine(" }"); } @@ -299,9 +299,9 @@ private void AppendArguments(StringBuilder builder, in InterceptorTarget target) return; case TraceActivityEnrichmentArgumentKind.GraphQlExecutionOptions: builder.Append(", "); - QylAutoInstrumentationGenerator.AppendGraphQlOperationNameExpression(builder, target); + QylAutoInstrumentationGenerator.AppendGraphQlOperationNameExpression(builder, in target); builder.Append(", "); - QylAutoInstrumentationGenerator.AppendGraphQlDocumentCaptureExpression(builder, target); + QylAutoInstrumentationGenerator.AppendGraphQlDocumentCaptureExpression(builder, in target); return; default: throw new InvalidOperationException("Unknown trace activity enrichment argument kind: " + Arguments); @@ -344,7 +344,7 @@ public void AppendStartActivity(StringBuilder builder, in InterceptorTarget targ builder.Append('.'); builder.Append(RuntimeHelper.StartActivityMethod); builder.Append('('); - QylAutoInstrumentationGenerator.AppendTraceStartActivityArguments(builder, target, RuntimeHelper.StartActivityArguments); + QylAutoInstrumentationGenerator.AppendTraceStartActivityArguments(builder, in target, RuntimeHelper.StartActivityArguments); builder.Append(')'); } @@ -365,7 +365,7 @@ public InterceptorMatcherDescriptor( InterceptorEmitterFamily family, InterceptorMethodShape methodShape, SymbolInterceptorMatcher matcher) - : this(name, receiverTypePattern, QylAutoInstrumentationGenerator.InterceptorKinds(targetKind), QylAutoInstrumentationGenerator.ContractKeys(contractKey), family, methodShape, matcher) + : this(name, receiverTypePattern, QylAutoInstrumentationGenerator.InterceptorKinds(targetKind), QylAutoInstrumentationGenerator.BuildContractKeys(contractKey), family, methodShape, matcher) { } @@ -389,7 +389,7 @@ public InterceptorMatcherDescriptor( InterceptorEmitterFamily family, InterceptorMethodShape methodShape, SymbolInterceptorMatcher matcher) - : this(name, receiverTypePattern, targetKindMask, QylAutoInstrumentationGenerator.ContractKeys(contractKey), family, methodShape, matcher) + : this(name, receiverTypePattern, targetKindMask, QylAutoInstrumentationGenerator.BuildContractKeys(contractKey), family, methodShape, matcher) { } @@ -422,7 +422,7 @@ public InterceptorMatcherDescriptor( InterceptorEmitterFamily family, InterceptorMethodShape methodShape, ReceiverInterceptorMatcher matcher) - : this(name, receiverTypePattern, QylAutoInstrumentationGenerator.InterceptorKinds(targetKind), QylAutoInstrumentationGenerator.ContractKeys(contractKey), family, methodShape, matcher) + : this(name, receiverTypePattern, QylAutoInstrumentationGenerator.InterceptorKinds(targetKind), QylAutoInstrumentationGenerator.BuildContractKeys(contractKey), family, methodShape, matcher) { } @@ -446,7 +446,7 @@ public InterceptorMatcherDescriptor( InterceptorEmitterFamily family, InterceptorMethodShape methodShape, ReceiverInterceptorMatcher matcher) - : this(name, receiverTypePattern, targetKindMask, QylAutoInstrumentationGenerator.ContractKeys(contractKey), family, methodShape, matcher) + : this(name, receiverTypePattern, targetKindMask, QylAutoInstrumentationGenerator.BuildContractKeys(contractKey), family, methodShape, matcher) { } @@ -512,10 +512,8 @@ private readonly record struct InterceptorTarget( string ExtensionContainingType = "", EquatableArray AdditionalContractKeys = default, string MatcherName = "", - string MatcherReceiverTypePattern = "", InterceptorEmitterFamily MatcherFamily = default, - InterceptorMethodShape MatcherMethodShape = default, - EquatableArray MatcherContractKeys = default); + InterceptorMethodShape MatcherMethodShape = default); private readonly record struct InterceptedInvocation(InterceptorTarget Target, InterceptableLocation Location); } diff --git a/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.Detection.cs b/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.Detection.cs index 5038361a..4587083b 100644 --- a/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.Detection.cs +++ b/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.Detection.cs @@ -122,7 +122,7 @@ private static bool TryGetHttpWebRequestInvocation(IMethodSymbol symbol, ITypeSy returnType, parameters, isAsync, - AdditionalContractKeys: ContractKeys("signals.metrics.HTTPCLIENT")); + AdditionalContractKeys: BuildContractKeys("signals.metrics.HTTPCLIENT")); return true; } @@ -173,7 +173,7 @@ symbol.Parameters.Length is not 1 || CleanTypeName(symbol.ContainingType), "Invoke", "global::System.Threading.Tasks.Task", - Parameters(symbol), + BuildParameters(symbol), false); return true; } @@ -197,7 +197,7 @@ private static bool TryGetAspNetCoreWebApplicationBuilderBuildInvocation(IMethod CleanTypeName(symbol.ContainingType), "Build", "global::Microsoft.AspNetCore.Builder.WebApplication", - Parameters(symbol), + BuildParameters(symbol), false); return true; } @@ -220,7 +220,7 @@ private static bool TryGetAspNetCoreEndpointMapInvocation(IMethodSymbol symbol, "global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder", symbol.Name, returnType, - Parameters(symbol), + BuildParameters(symbol), false); return true; } @@ -291,10 +291,10 @@ symbol.Parameters.Length is not 1 || CleanTypeName(receiverType), "AddMeter", CleanTypeName(symbol.ReturnType, symbol), - Parameters(symbol), + BuildParameters(symbol), false, ExtensionContainingType: extensionContainingType, - AdditionalContractKeys: ContractKeys( + AdditionalContractKeys: BuildContractKeys( "signals.metrics.HTTPCLIENT", "signals.metrics.NETRUNTIME", "signals.metrics.NPGSQL", @@ -323,7 +323,7 @@ symbol.MethodKind is not MethodKind.Ordinary || CleanTypeName(symbol.ContainingType), symbol.Name, CleanTypeName(symbol.ReturnType, symbol), - Parameters(symbol), + BuildParameters(symbol), isAsync); return true; } @@ -396,7 +396,7 @@ symbol.DeclaredAccessibility is not Accessibility.Public || CleanTypeName(symbol.ContainingType), symbol.Name, CleanTypeName(symbol.ReturnType, symbol), - Parameters(symbol), + BuildParameters(symbol), isAsync, GetTypeParameterList(symbol), GetConstraintClauses(symbol)); @@ -431,7 +431,7 @@ symbol.MethodKind is not MethodKind.Ordinary and not MethodKind.ReducedExtension CleanTypeName(receiverType), symbol.Name, CleanTypeName(symbol.ReturnType, symbol), - Parameters(symbol), + BuildParameters(symbol), isAsync, GetTypeParameterList(symbol), GetConstraintClauses(symbol), @@ -492,7 +492,7 @@ symbol.MethodKind is not MethodKind.Ordinary || CleanTypeName(symbol.ContainingType), symbol.Name, CleanTypeName(symbol.ReturnType, symbol), - Parameters(symbol), + BuildParameters(symbol), IsTask(symbol.ReturnType) || TryGetTaskResult(symbol.ReturnType, out _)); return true; } @@ -530,7 +530,7 @@ private static bool TryGetGrpcNetClientAsyncUnaryInvocation(IMethodSymbol symbol CleanTypeName(symbol.ContainingType), symbol.Name, CleanTypeName(symbol.ReturnType, symbol), - Parameters(symbol), + BuildParameters(symbol), false); return true; } @@ -566,7 +566,7 @@ private static bool TryGetGrpcNetClientStreamingInvocation(IMethodSymbol symbol, CleanTypeName(symbol.ContainingType), symbol.Name, CleanTypeName(symbol.ReturnType, symbol), - Parameters(symbol), + BuildParameters(symbol), false); return true; } @@ -605,7 +605,7 @@ private static bool TryGetMassTransitInvocation(IMethodSymbol symbol, out Interc CleanTypeName(receiverType), symbol.Name, CleanTypeName(symbol.ReturnType, symbol), - Parameters(symbol), + BuildParameters(symbol), true, GetTypeParameterList(symbol), GetConstraintClauses(symbol), @@ -642,7 +642,7 @@ private static bool TryGetNServiceBusInvocation(IMethodSymbol symbol, out Interc var typeParameterList = GetTypeParameterList(symbol); var receiverTypeName = CleanTypeName(receiverType); var returnTypeName = CleanTypeName(symbol.ReturnType, symbol); - var parameters = Parameters(symbol); + var parameters = BuildParameters(symbol); if (string.IsNullOrEmpty(typeParameterList)) typeParameterList = GetTypeParameterListFromVisibleTypes(symbol, receiverType); if (string.IsNullOrEmpty(typeParameterList)) @@ -660,7 +660,7 @@ private static bool TryGetNServiceBusInvocation(IMethodSymbol symbol, out Interc typeParameterList, GetConstraintClauses(symbol), GetReducedExtensionContainingType(symbol), - AdditionalContractKeys: ContractKeys("signals.metrics.NSERVICEBUS")); + AdditionalContractKeys: BuildContractKeys("signals.metrics.NSERVICEBUS")); return true; } @@ -690,7 +690,7 @@ symbol.Parameters.Length is not 1 || CleanTypeName(symbol.ContainingType), "Execute", "global::System.Threading.Tasks.Task", - Parameters(symbol), + BuildParameters(symbol), true); return true; } @@ -778,7 +778,7 @@ resultType is not INamedTypeSymbol namedResult || CleanTypeName(symbol.ContainingType), "ExecuteAsync", CleanTypeName(symbol.ReturnType, symbol), - Parameters(symbol), + BuildParameters(symbol), true); return true; } @@ -803,7 +803,7 @@ private static bool TryGetMongoDbInvocation(IMethodSymbol symbol, out Intercepto var typeParameterList = GetTypeParameterList(symbol); var receiverTypeName = CleanTypeName(receiverType); var returnTypeName = CleanTypeName(symbol.ReturnType, symbol); - var parameters = Parameters(symbol); + var parameters = BuildParameters(symbol); if (string.IsNullOrEmpty(typeParameterList)) typeParameterList = GetTypeParameterListFromVisibleTypes(symbol, receiverType); if (string.IsNullOrEmpty(typeParameterList)) @@ -935,7 +935,7 @@ symbol.Parameters.Length is not 5 || CleanTypeName(symbol.ContainingType), "Log", "void", - Parameters(symbol), + BuildParameters(symbol), false); return true; } @@ -960,7 +960,7 @@ private static bool TryGetLoggerExtensionInvocation(IMethodSymbol symbol, out In "global::Microsoft.Extensions.Logging.ILogger", symbol.Name, "void", - Parameters(symbol), + BuildParameters(symbol), false); return true; } @@ -1026,7 +1026,7 @@ private static bool TryGetNLogInvocation(IMethodSymbol symbol, out InterceptorTa CleanTypeName(symbol.ContainingType), symbol.Name, "void", - Parameters(symbol), + BuildParameters(symbol), false, GetTypeParameterList(symbol), GetConstraintClauses(symbol), @@ -1051,7 +1051,7 @@ private static bool TryGetLog4NetInvocation(IMethodSymbol symbol, out Intercepto CleanTypeName(symbol.ContainingType), symbol.Name, "void", - Parameters(symbol), + BuildParameters(symbol), false, GetTypeParameterList(symbol), GetConstraintClauses(symbol), @@ -1262,7 +1262,7 @@ original.Parameters.Length is 0 || CleanTypeName(original.Parameters[0].Type), symbol.Name, CleanTypeName(symbol.ReturnType, symbol), - Parameters(symbol), + BuildParameters(symbol), true, GetTypeParameterList(symbol), GetConstraintClauses(symbol), diff --git a/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.Shapes.cs b/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.Shapes.cs index 87edf61c..0c565c0c 100644 --- a/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.Shapes.cs +++ b/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.Shapes.cs @@ -91,7 +91,7 @@ private static InterceptorTarget HttpTarget(IMethodSymbol symbol, string methodN returnType, parameters, false, - AdditionalContractKeys: ContractKeys("signals.metrics.HTTPCLIENT")); + AdditionalContractKeys: BuildContractKeys("signals.metrics.HTTPCLIENT")); private static string GetDbTraceContractKey(string instrumentationId) => instrumentationId switch @@ -109,12 +109,12 @@ private static string GetDbTraceContractKey(string instrumentationId) private static EquatableArray GetDbMetricContractKeys(string instrumentationId) => instrumentationId switch { - "NPGSQL" => ContractKeys("signals.metrics.NPGSQL"), - "SQLCLIENT" => ContractKeys("signals.metrics.SQLCLIENT"), + "NPGSQL" => BuildContractKeys("signals.metrics.NPGSQL"), + "SQLCLIENT" => BuildContractKeys("signals.metrics.SQLCLIENT"), _ => default, }; - private static EquatableArray ContractKeys(params string[] contractKeys) + private static EquatableArray BuildContractKeys(params string[] contractKeys) => contractKeys.ToEquatableArray(); private static ulong InterceptorKinds(params InterceptorKind[] kinds) @@ -146,7 +146,7 @@ private static bool TryGetSendShape(IMethodSymbol symbol, out EquatableArray Parameters(IMethodSymbol symbol) + private static EquatableArray BuildParameters(IMethodSymbol symbol) { var builder = ImmutableArray.CreateBuilder(symbol.Parameters.Length); for (var i = 0; i < symbol.Parameters.Length; i++) @@ -852,23 +852,24 @@ private static string CleanTypeName( return typeParameters[i].Name; } - if (symbol is ITypeParameterSymbol typeParameter) - return typeParameter.Name; - - if (symbol is IArrayTypeSymbol array) - return CleanTypeName(array.ElementType, typeParameters, typeArguments) + "[]"; - - if (symbol is INamedTypeSymbol { IsGenericType: true } named && named.TypeArguments.Length > 0) + switch (symbol) { - var constructedName = named.ConstructedFrom.ToDisplayString(s_fullyQualifiedFormat); - var genericStart = constructedName.IndexOf('<'); - var typeName = genericStart < 0 ? constructedName : constructedName.Substring(0, genericStart); - var arguments = named.TypeArguments - .Select(typeArgument => CleanTypeName(typeArgument, typeParameters, typeArguments)); - return typeName + "<" + string.Join(", ", arguments) + ">"; + case ITypeParameterSymbol typeParameter: + return typeParameter.Name; + case IArrayTypeSymbol array: + return CleanTypeName(array.ElementType, typeParameters, typeArguments) + "[]"; + case INamedTypeSymbol { IsGenericType: true, TypeArguments.Length: > 0 } named: + { + var constructedName = named.ConstructedFrom.ToDisplayString(s_fullyQualifiedFormat); + var genericStart = constructedName.IndexOf('<'); + var typeName = genericStart < 0 ? constructedName : constructedName.Substring(0, genericStart); + var arguments = named.TypeArguments + .Select(typeArgument => CleanTypeName(typeArgument, typeParameters, typeArguments)); + return typeName + "<" + string.Join(", ", arguments) + ">"; + } + default: + return CleanTypeName(symbol); } - - return CleanTypeName(symbol); } private static string GetGrpcStreamReaderHelperType(InterceptedInvocation[] invocations) @@ -901,7 +902,7 @@ private static string GetGrpcStreamReaderHelperType(InterceptedInvocation[] invo private static void AppendStringLiteral(StringBuilder builder, string value) { builder.Append('"'); - builder.Append(value.Replace("\\", "\\\\").Replace("\"", "\\\"")); + builder.Append(value.Replace("\\", @"\\").Replace("\"", "\\\"")); builder.Append('"'); } } diff --git a/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.cs b/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.cs index c64905aa..bdcd8fe0 100644 --- a/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.cs +++ b/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylAutoInstrumentationGenerator.cs @@ -75,7 +75,8 @@ public void Initialize(IncrementalGeneratorInitializationContext context) var interceptedInvocations = context.SyntaxProvider .CreateSyntaxProvider( static (node, _) => node is InvocationExpressionSyntax, - static (syntaxContext, cancellationToken) => TryCreateInterceptedInvocation(syntaxContext, cancellationToken)) + static (syntaxContext, cancellationToken) => + TryCreateInterceptedInvocation(syntaxContext, cancellationToken)) .Where(static invocation => invocation is not null) .Collect(); @@ -101,7 +102,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) if (!TryGetInvocation(symbol, receiverType, out var target)) return null; - if (!IsSupportedTarget(target)) + if (!IsSupportedTarget(in target)) return null; var interceptableLocation = context.SemanticModel.GetInterceptableLocation(invocation, cancellationToken); @@ -142,14 +143,12 @@ private static bool TryGetInvocation(IMethodSymbol symbol, ITypeSymbol? receiver { if (descriptor.TryMatch(symbol, receiverType, out target)) { - EnsureTargetDeclaredByMatcher(descriptor, target); + EnsureTargetDeclaredByMatcher(descriptor, in target); target = target with { MatcherName = descriptor.Name, - MatcherReceiverTypePattern = descriptor.ReceiverTypePattern, MatcherFamily = descriptor.Family, MatcherMethodShape = descriptor.MethodShape, - MatcherContractKeys = descriptor.ContractKeys, }; return true; } @@ -159,7 +158,8 @@ private static bool TryGetInvocation(IMethodSymbol symbol, ITypeSymbol? receiver return false; } - private static void EnsureTargetDeclaredByMatcher(InterceptorMatcherDescriptor descriptor, in InterceptorTarget target) + private static void EnsureTargetDeclaredByMatcher(InterceptorMatcherDescriptor descriptor, + in InterceptorTarget target) { EnsureKindDeclaredByMatcher(descriptor, target.Kind); EnsureContractDeclaredByMatcher(descriptor, target.ContractKey, target.Kind); @@ -192,7 +192,8 @@ private static void EnsureContractDeclaredByMatcher( } throw new InvalidOperationException( - "Matcher descriptor '" + descriptor.Name + "' produced interceptor kind '" + kind + "' for undeclared contract key '" + contractKey + "'."); + "Matcher descriptor '" + descriptor.Name + "' produced interceptor kind '" + kind + + "' for undeclared contract key '" + contractKey + "'."); } private static void EmitInterceptors( @@ -237,49 +238,50 @@ private static void EmitInterceptors( var descriptor = GetEmissionDescriptor(invocation.Target); if (descriptor.TraceBody.IsDefined) { - EmitTraceInterceptor(builder, invocation, index, descriptor.TraceBody); + EmitTraceInterceptor(builder, in invocation, index, descriptor.TraceBody); continue; } if (descriptor.ForwardingBody.IsDefined) { - EmitForwardingInterceptor(builder, invocation, index, descriptor.ForwardingBody); + EmitForwardingInterceptor(builder, in invocation, index, descriptor.ForwardingBody); continue; } if (descriptor.HttpWebRequestBody.IsDefined) { - EmitHttpWebRequestInterceptor(builder, invocation, index, descriptor.HttpWebRequestBody); + EmitHttpWebRequestInterceptor(builder, in invocation, index, descriptor.HttpWebRequestBody); continue; } if (descriptor.DbCommandBody.IsDefined) { - EmitDbCommandInterceptor(builder, invocation, index, descriptor.DbCommandBody); + EmitDbCommandInterceptor(builder, in invocation, index, descriptor.DbCommandBody); continue; } if (descriptor.GrpcClientBody.IsDefined) { - EmitGrpcNetClientInterceptor(builder, invocation, index, descriptor.GrpcClientBody); + EmitGrpcNetClientInterceptor(builder, in invocation, index, descriptor.GrpcClientBody); continue; } if (descriptor.MeterProviderBuilderBody.IsDefined) { - EmitMeterProviderBuilderAddMeterInterceptor(builder, invocation, index, descriptor.MeterProviderBuilderBody); + EmitMeterProviderBuilderAddMeterInterceptor(builder, in invocation, index, + descriptor.MeterProviderBuilderBody); continue; } if (descriptor.LoggerBody.IsDefined) { - EmitLoggerInterceptor(builder, invocation, index, descriptor.LoggerBody); + EmitLoggerInterceptor(builder, in invocation, index, descriptor.LoggerBody); continue; } if (descriptor.ExternalLoggerBody.IsDefined) { - EmitExternalLoggerInterceptor(builder, invocation, index, descriptor.ExternalLoggerBody); + EmitExternalLoggerInterceptor(builder, in invocation, index, descriptor.ExternalLoggerBody); continue; } @@ -293,14 +295,16 @@ private static void EmitInterceptors( builder.AppendLine("}"); - context.AddSource("QylAutoInstrumentation.Interceptors.g.cs", SourceText.From(builder.ToString(), Encoding.UTF8)); + context.AddSource("QylAutoInstrumentation.Interceptors.g.cs", + SourceText.From(builder.ToString(), Encoding.UTF8)); } private static void EmitInterceptsLocationAttribute(StringBuilder builder) { builder.AppendLine("namespace System.Runtime.CompilerServices"); builder.AppendLine("{"); - builder.AppendLine(" [global::System.AttributeUsage(global::System.AttributeTargets.Method, AllowMultiple = true)]"); + builder.AppendLine( + " [global::System.AttributeUsage(global::System.AttributeTargets.Method, AllowMultiple = true)]"); builder.AppendLine(" file sealed class InterceptsLocationAttribute : global::System.Attribute"); builder.AppendLine(" {"); builder.AppendLine(" public InterceptsLocationAttribute(int version, string data)"); @@ -318,8 +322,8 @@ private static InterceptorEmissionDescriptor GetEmissionDescriptor(in Intercepto if (descriptor.Kind != target.Kind) continue; - EnsureEmissionDescriptorMatchesMatcher(target, descriptor); - ValidateEmissionDescriptorPolicy(descriptor); + EnsureEmissionDescriptorMatchesMatcher(in target, in descriptor); + ValidateEmissionDescriptorPolicy(in descriptor); return descriptor; } @@ -332,7 +336,8 @@ private static void ValidateDescriptorCatalog() foreach (var descriptor in s_matcherDescriptors) { if ((matcherKindMask & descriptor.TargetKindMask) is not 0) - throw new InvalidOperationException("Matcher descriptor catalog declares a duplicate interceptor kind: " + descriptor.Name); + throw new InvalidOperationException( + "Matcher descriptor catalog declares a duplicate interceptor kind: " + descriptor.Name); matcherKindMask |= descriptor.TargetKindMask; } @@ -342,14 +347,16 @@ private static void ValidateDescriptorCatalog() { var kindMask = GetInterceptorKindMask(descriptor.Kind); if ((emissionKindMask & kindMask) is not 0) - throw new InvalidOperationException("Emission descriptor catalog declares a duplicate interceptor kind: " + descriptor.Kind); + throw new InvalidOperationException( + "Emission descriptor catalog declares a duplicate interceptor kind: " + descriptor.Kind); emissionKindMask |= kindMask; - ValidateEmissionDescriptorPolicy(descriptor); + ValidateEmissionDescriptorPolicy(in descriptor); } if (matcherKindMask != emissionKindMask) - throw new InvalidOperationException("Matcher and emission descriptor catalogs must declare the same interceptor kind set."); + throw new InvalidOperationException( + "Matcher and emission descriptor catalogs must declare the same interceptor kind set."); } private static void EnsureEmissionDescriptorMatchesMatcher( @@ -362,37 +369,41 @@ private static void EnsureEmissionDescriptorMatchesMatcher( if (target.MatcherFamily != descriptor.Family) { throw new InvalidOperationException( - "Matcher descriptor '" + target.MatcherName + "' and emission descriptor '" + descriptor.Kind + "' disagree on emitter family."); + "Matcher descriptor '" + target.MatcherName + "' and emission descriptor '" + descriptor.Kind + + "' disagree on emitter family."); } if (target.MatcherMethodShape != descriptor.MethodShape) { throw new InvalidOperationException( - "Matcher descriptor '" + target.MatcherName + "' and emission descriptor '" + descriptor.Kind + "' disagree on method shape."); + "Matcher descriptor '" + target.MatcherName + "' and emission descriptor '" + descriptor.Kind + + "' disagree on method shape."); } } private static void ValidateEmissionDescriptorPolicy(in InterceptorEmissionDescriptor descriptor) { - ValidateSingleBodyDescriptor(descriptor); - ValidateMethodShape(descriptor); + ValidateSingleBodyDescriptor(in descriptor); + ValidateMethodShape(in descriptor); if (descriptor.DurationPolicy is InterceptorDurationPolicy.RuntimeMetric && descriptor.SignalOwnership is not InterceptorSignalOwnership.TraceAndMetric) { - throw new InvalidOperationException("Runtime metric duration policy requires trace+metric ownership: " + descriptor.Kind); + throw new InvalidOperationException("Runtime metric duration policy requires trace+metric ownership: " + + descriptor.Kind); } if (descriptor.SignalOwnership is InterceptorSignalOwnership.TraceAndMetric && descriptor.DurationPolicy is not InterceptorDurationPolicy.RuntimeMetric) { - throw new InvalidOperationException("Trace+metric ownership requires runtime metric duration policy: " + descriptor.Kind); + throw new InvalidOperationException("Trace+metric ownership requires runtime metric duration policy: " + + descriptor.Kind); } if (descriptor.HttpWebRequestBody.IsDefined) { ValidatePolicy( - descriptor, + in descriptor, InterceptorSignalOwnership.TraceAndMetric, InterceptorErrorPolicy.HttpStatusAndException, InterceptorDurationPolicy.RuntimeMetric); @@ -402,7 +413,7 @@ private static void ValidateEmissionDescriptorPolicy(in InterceptorEmissionDescr if (descriptor.DbCommandBody.IsDefined) { ValidatePolicy( - descriptor, + in descriptor, InterceptorSignalOwnership.TraceAndMetric, InterceptorErrorPolicy.Exception, InterceptorDurationPolicy.RuntimeMetric); @@ -412,7 +423,7 @@ private static void ValidateEmissionDescriptorPolicy(in InterceptorEmissionDescr if (descriptor.GrpcClientBody.IsDefined) { ValidatePolicy( - descriptor, + in descriptor, InterceptorSignalOwnership.Trace, InterceptorErrorPolicy.GrpcStatusAndException, InterceptorDurationPolicy.None); @@ -422,7 +433,7 @@ private static void ValidateEmissionDescriptorPolicy(in InterceptorEmissionDescr if (descriptor.MeterProviderBuilderBody.IsDefined) { ValidatePolicy( - descriptor, + in descriptor, InterceptorSignalOwnership.Metric, InterceptorErrorPolicy.None, InterceptorDurationPolicy.None); @@ -432,7 +443,7 @@ private static void ValidateEmissionDescriptorPolicy(in InterceptorEmissionDescr if (descriptor.LoggerBody.IsDefined) { ValidatePolicy( - descriptor, + in descriptor, InterceptorSignalOwnership.Log, InterceptorErrorPolicy.RuntimeDelegate, InterceptorDurationPolicy.None); @@ -442,7 +453,7 @@ private static void ValidateEmissionDescriptorPolicy(in InterceptorEmissionDescr if (descriptor.ExternalLoggerBody.IsDefined) { ValidatePolicy( - descriptor, + in descriptor, InterceptorSignalOwnership.Log, InterceptorErrorPolicy.Exception, InterceptorDurationPolicy.None); @@ -451,16 +462,20 @@ private static void ValidateEmissionDescriptorPolicy(in InterceptorEmissionDescr if (descriptor.TraceBody.IsDefined) { - if (descriptor.SignalOwnership is not (InterceptorSignalOwnership.Trace or InterceptorSignalOwnership.TraceAndMetric)) + if (descriptor.SignalOwnership is not (InterceptorSignalOwnership.Trace + or InterceptorSignalOwnership.TraceAndMetric)) throw new InvalidOperationException("Trace body descriptor must own traces: " + descriptor.Kind); if (descriptor.ErrorPolicy is not InterceptorErrorPolicy.Exception) - throw new InvalidOperationException("Trace body descriptor must use exception error policy: " + descriptor.Kind); + throw new InvalidOperationException("Trace body descriptor must use exception error policy: " + + descriptor.Kind); if (!descriptor.TraceBody.RuntimeHelper.IsDefined) - throw new InvalidOperationException("Trace body descriptor must provide a runtime helper: " + descriptor.Kind); + throw new InvalidOperationException("Trace body descriptor must provide a runtime helper: " + + descriptor.Kind); if (descriptor.DurationPolicy is InterceptorDurationPolicy.RuntimeMetric && !descriptor.TraceBody.DurationMetric.IsDefined) { - throw new InvalidOperationException("Trace runtime metric descriptor must provide a duration metric descriptor: " + descriptor.Kind); + throw new InvalidOperationException( + "Trace runtime metric descriptor must provide a duration metric descriptor: " + descriptor.Kind); } return; @@ -471,7 +486,7 @@ private static void ValidateEmissionDescriptorPolicy(in InterceptorEmissionDescr if (descriptor.SignalOwnership is InterceptorSignalOwnership.TraceAndMetric) { ValidatePolicy( - descriptor, + in descriptor, InterceptorSignalOwnership.TraceAndMetric, InterceptorErrorPolicy.HttpStatusAndException, InterceptorDurationPolicy.RuntimeMetric); @@ -510,20 +525,21 @@ private static void ValidateSingleBodyDescriptor(in InterceptorEmissionDescripto bodyCount++; if (bodyCount != 1) - throw new InvalidOperationException("Interceptor emission descriptor must define exactly one typed body descriptor: " + descriptor.Kind); + throw new InvalidOperationException( + "Interceptor emission descriptor must define exactly one typed body descriptor: " + descriptor.Kind); } private static void ValidateMethodShape(in InterceptorEmissionDescriptor descriptor) { if (descriptor.HttpWebRequestBody.IsDefined) { - ValidateMethodShape(descriptor, InterceptorMethodShape.AsyncOrSyncValue); + ValidateMethodShape(in descriptor, InterceptorMethodShape.AsyncOrSyncValue); return; } if (descriptor.DbCommandBody.IsDefined) { - ValidateMethodShape(descriptor, InterceptorMethodShape.AsyncOrSyncValue); + ValidateMethodShape(in descriptor, InterceptorMethodShape.AsyncOrSyncValue); return; } @@ -531,7 +547,7 @@ private static void ValidateMethodShape(in InterceptorEmissionDescriptor descrip { if (descriptor.GrpcClientBody.Shape is GrpcClientCallShape.Unary) { - ValidateMethodShape(descriptor, InterceptorMethodShape.GrpcUnary); + ValidateMethodShape(in descriptor, InterceptorMethodShape.GrpcUnary); return; } @@ -539,7 +555,7 @@ private static void ValidateMethodShape(in InterceptorEmissionDescriptor descrip GrpcClientCallShape.ClientStreaming or GrpcClientCallShape.DuplexStreaming) { - ValidateMethodShape(descriptor, InterceptorMethodShape.GrpcStreaming); + ValidateMethodShape(in descriptor, InterceptorMethodShape.GrpcStreaming); return; } @@ -548,25 +564,26 @@ GrpcClientCallShape.ClientStreaming or if (descriptor.MeterProviderBuilderBody.IsDefined) { - ValidateMethodShape(descriptor, InterceptorMethodShape.BuilderRegistration); + ValidateMethodShape(in descriptor, InterceptorMethodShape.BuilderRegistration); return; } if (descriptor.LoggerBody.IsDefined || descriptor.ExternalLoggerBody.IsDefined) { - ValidateMethodShape(descriptor, InterceptorMethodShape.Void); + ValidateMethodShape(in descriptor, InterceptorMethodShape.Void); return; } if (descriptor.TraceBody.IsDefined) { if (descriptor.MethodShape is not ( - InterceptorMethodShape.AsyncOrSyncValue or - InterceptorMethodShape.AsyncOrSyncVoid or - InterceptorMethodShape.AsyncTask or - InterceptorMethodShape.AsyncValue)) + InterceptorMethodShape.AsyncOrSyncValue or + InterceptorMethodShape.AsyncOrSyncVoid or + InterceptorMethodShape.AsyncTask or + InterceptorMethodShape.AsyncValue)) { - throw new InvalidOperationException("Trace body descriptor has unsupported method shape: " + descriptor.Kind); + throw new InvalidOperationException("Trace body descriptor has unsupported method shape: " + + descriptor.Kind); } return; @@ -575,18 +592,20 @@ InterceptorMethodShape.AsyncTask or if (descriptor.ForwardingBody.IsDefined) { if (descriptor.MethodShape is not ( - InterceptorMethodShape.AsyncValue or - InterceptorMethodShape.AsyncTask or - InterceptorMethodShape.BuilderInitialization or - InterceptorMethodShape.EndpointRegistration)) + InterceptorMethodShape.AsyncValue or + InterceptorMethodShape.AsyncTask or + InterceptorMethodShape.BuilderInitialization or + InterceptorMethodShape.EndpointRegistration)) { - throw new InvalidOperationException("Forwarding body descriptor has unsupported method shape: " + descriptor.Kind); + throw new InvalidOperationException("Forwarding body descriptor has unsupported method shape: " + + descriptor.Kind); } return; } - throw new InvalidOperationException("Interceptor emission descriptor has no typed body descriptor: " + descriptor.Kind); + throw new InvalidOperationException("Interceptor emission descriptor has no typed body descriptor: " + + descriptor.Kind); } private static void ValidateMethodShape( @@ -594,7 +613,8 @@ private static void ValidateMethodShape( InterceptorMethodShape methodShape) { if (descriptor.MethodShape != methodShape) - throw new InvalidOperationException("Interceptor emission descriptor method shape mismatch: " + descriptor.Kind); + throw new InvalidOperationException("Interceptor emission descriptor method shape mismatch: " + + descriptor.Kind); } private static void ValidatePolicy( @@ -664,13 +684,13 @@ private static void EmitTraceInterceptor( in TraceInterceptorBodyDescriptor descriptor) { var target = invocation.Target; - var runtimeObservesAsync = ShouldRuntimeObserveAsync(target, descriptor); + var runtimeObservesAsync = ShouldRuntimeObserveAsync(in target, in descriptor); var signatureIsAsync = target.IsAsync && !runtimeObservesAsync; EmitAttributeAndSignature( builder, invocation.Location, target.ReturnType, - GetTraceMethodPrefix(target, descriptor), + GetTraceMethodPrefix(in target, in descriptor), index, target.ReceiverType, descriptor.ReceiverName, @@ -682,14 +702,14 @@ private static void EmitTraceInterceptor( if (descriptor.DurationMetric.IsDefined) descriptor.DurationMetric.AppendMetricStartStatement(builder); builder.Append(" var activity = "); - descriptor.AppendStartActivity(builder, target); + descriptor.AppendStartActivity(builder, in target); builder.AppendLine(";"); if (descriptor.ActivityEnrichment.IsDefined) - descriptor.ActivityEnrichment.Append(builder, target); + descriptor.ActivityEnrichment.Append(builder, in target); builder.AppendLine(" try"); builder.AppendLine(" {"); - EmitTraceInvocation(builder, target, descriptor); + EmitTraceInvocation(builder, in target, in descriptor); builder.AppendLine(" }"); builder.AppendLine(" catch (global::System.Exception exception)"); @@ -697,7 +717,7 @@ private static void EmitTraceInterceptor( builder.Append(" "); builder.AppendLine(descriptor.GetRecordExceptionStatement()); if (descriptor.DurationMetric.IsDefined) - descriptor.DurationMetric.AppendRecordDurationStatement(builder, target); + descriptor.DurationMetric.AppendRecordDurationStatement(builder, in target); if (runtimeObservesAsync) builder.AppendLine(" activity?.Dispose();"); builder.AppendLine(" throw;"); @@ -727,17 +747,17 @@ private static bool ShouldRuntimeObserveAsync( in InterceptorTarget target, in TraceInterceptorBodyDescriptor descriptor) => descriptor.AsyncObservation.IsDefined && - descriptor.AsyncObservation.AppliesTo(target); + descriptor.AsyncObservation.AppliesTo(in target); private static void EmitTraceInvocation( StringBuilder builder, in InterceptorTarget target, in TraceInterceptorBodyDescriptor descriptor) { - if (target.IsAsync && ShouldRuntimeObserveAsync(target, descriptor)) + if (target.IsAsync && ShouldRuntimeObserveAsync(in target, in descriptor)) { builder.Append(" var resultTask = "); - AppendInvocationCall(builder, target, descriptor.ReceiverName); + AppendInvocationCall(builder, in target, descriptor.ReceiverName); builder.AppendLine(";"); builder.Append(" return "); builder.Append(descriptor.AsyncObservation.ObserveAsyncMethod); @@ -750,16 +770,16 @@ private static void EmitTraceInvocation( if (IsTaskLikeReturnWithoutResult(target.ReturnType)) { builder.Append(" await "); - AppendInvocationCall(builder, target, descriptor.ReceiverName); + AppendInvocationCall(builder, in target, descriptor.ReceiverName); builder.AppendLine(".ConfigureAwait(false);"); - EmitTraceSuccessDurationMetric(builder, target, descriptor); + EmitTraceSuccessDurationMetric(builder, in target, in descriptor); return; } builder.Append(" var result = await "); - AppendInvocationCall(builder, target, descriptor.ReceiverName); + AppendInvocationCall(builder, in target, descriptor.ReceiverName); builder.AppendLine(".ConfigureAwait(false);"); - EmitTraceSuccessDurationMetric(builder, target, descriptor); + EmitTraceSuccessDurationMetric(builder, in target, in descriptor); builder.AppendLine(" return result;"); return; } @@ -767,16 +787,16 @@ private static void EmitTraceInvocation( if (string.Equals(target.ReturnType, "void", StringComparison.Ordinal)) { builder.Append(" "); - AppendInvocationCall(builder, target, descriptor.ReceiverName); + AppendInvocationCall(builder, in target, descriptor.ReceiverName); builder.AppendLine(";"); - EmitTraceSuccessDurationMetric(builder, target, descriptor); + EmitTraceSuccessDurationMetric(builder, in target, in descriptor); return; } builder.Append(" var result = "); - AppendInvocationCall(builder, target, descriptor.ReceiverName); + AppendInvocationCall(builder, in target, descriptor.ReceiverName); builder.AppendLine(";"); - EmitTraceSuccessDurationMetric(builder, target, descriptor); + EmitTraceSuccessDurationMetric(builder, in target, in descriptor); builder.AppendLine(" return result;"); } @@ -786,7 +806,7 @@ private static void EmitTraceSuccessDurationMetric( in TraceInterceptorBodyDescriptor descriptor) { if (descriptor.DurationMetric.IsDefined) - descriptor.DurationMetric.AppendRecordDurationStatement(builder, target); + descriptor.DurationMetric.AppendRecordDurationStatement(builder, in target); } private static bool IsTaskLikeReturnWithoutResult(string returnType) @@ -819,7 +839,7 @@ private static void AppendTraceStartActivityArguments( AppendStringLiteral(builder, target.MethodName); return; case TraceStartActivityArgumentKind.RabbitMqExchange: - AppendRabbitMqExchangeExpression(builder, target); + AppendRabbitMqExchangeExpression(builder, in target); return; default: throw new InvalidOperationException("Unknown trace start activity argument kind: " + argumentKind); @@ -833,7 +853,9 @@ private static void EmitHttpWebRequestInterceptor( HttpWebRequestBodyDescriptor descriptor) { var target = invocation.Target; - EmitAttributeAndSignature(builder, invocation.Location, target.ReturnType, descriptor.MethodPrefix + "_" + target.MethodName, index, target.ReceiverType, descriptor.ReceiverName, target.Parameters, target.IsAsync); + EmitAttributeAndSignature(builder, invocation.Location, target.ReturnType, + descriptor.MethodPrefix + "_" + target.MethodName, index, target.ReceiverType, descriptor.ReceiverName, + target.Parameters, target.IsAsync); builder.AppendLine(" {"); builder.Append(" var httpWebRequest = ("); builder.Append(descriptor.RequestType); @@ -904,7 +926,9 @@ private static void EmitDbCommandInterceptor( in DbCommandBodyDescriptor descriptor) { var target = invocation.Target; - EmitAttributeAndSignature(builder, invocation.Location, target.ReturnType, descriptor.MethodPrefix + "_" + target.MethodName, index, target.ReceiverType, descriptor.ReceiverName, target.Parameters, isAsync: false); + EmitAttributeAndSignature(builder, invocation.Location, target.ReturnType, + descriptor.MethodPrefix + "_" + target.MethodName, index, target.ReceiverType, descriptor.ReceiverName, + target.Parameters, isAsync: false); builder.AppendLine(" {"); builder.Append(" var metricStart = "); builder.Append(descriptor.MetricsType); @@ -963,6 +987,7 @@ private static void EmitDbCommandInterceptor( builder.AppendLine(");"); builder.AppendLine(" return result;"); } + builder.AppendLine(" }"); builder.AppendLine(" catch (global::System.Exception exception)"); builder.AppendLine(" {"); @@ -984,6 +1009,7 @@ private static void EmitDbCommandInterceptor( { EmitActivityDisposeFinally(builder); } + builder.AppendLine(" }"); builder.AppendLine(); } @@ -995,10 +1021,12 @@ private static void EmitMeterProviderBuilderAddMeterInterceptor( MeterProviderBuilderBodyDescriptor descriptor) { var target = invocation.Target; - EmitAttributeAndSignature(builder, invocation.Location, target.ReturnType, descriptor.MethodPrefix + "_" + target.MethodName, index, target.ReceiverType, descriptor.ReceiverName, target.Parameters, isAsync: false); + EmitAttributeAndSignature(builder, invocation.Location, target.ReturnType, + descriptor.MethodPrefix + "_" + target.MethodName, index, target.ReceiverType, descriptor.ReceiverName, + target.Parameters, isAsync: false); builder.AppendLine(" {"); builder.Append(" var result = "); - AppendInvocationCall(builder, target, descriptor.ReceiverName); + AppendInvocationCall(builder, in target, descriptor.ReceiverName); builder.AppendLine(";"); builder.Append(" var qylMeters = "); builder.Append(descriptor.EnabledMeterNamesExpression); @@ -1028,9 +1056,11 @@ private static void EmitGrpcNetClientInterceptor( GrpcClientBodyDescriptor descriptor) { var target = invocation.Target; - EmitAttributeAndSignature(builder, invocation.Location, target.ReturnType, descriptor.MethodPrefix + "_" + target.MethodName, index, target.ReceiverType, descriptor.ReceiverName, target.Parameters, isAsync: false); + EmitAttributeAndSignature(builder, invocation.Location, target.ReturnType, + descriptor.MethodPrefix + "_" + target.MethodName, index, target.ReceiverType, descriptor.ReceiverName, + target.Parameters, isAsync: false); builder.AppendLine(" {"); - EmitGrpcCallPreamble(builder, target, descriptor); + EmitGrpcCallPreamble(builder, in target, descriptor); builder.Append(" return new "); builder.Append(target.ReturnType); builder.AppendLine("("); @@ -1056,23 +1086,27 @@ private static void EmitGrpcConstructorArguments(StringBuilder builder, GrpcClie case GrpcClientCallShape.Unary: builder.Append(" "); builder.Append(descriptor.HelperType); - builder.AppendLine(".ObserveUnaryResponseAsync(call.ResponseAsync, call.ResponseHeadersAsync, activity),"); + builder.AppendLine( + ".ObserveUnaryResponseAsync(call.ResponseAsync, call.ResponseHeadersAsync, activity),"); break; case GrpcClientCallShape.ServerStreaming: - builder.AppendLine(" QylObservedAsyncStreamReader.Create(call.ResponseStream, activity, call.ResponseHeadersAsync),"); + builder.AppendLine( + " QylObservedAsyncStreamReader.Create(call.ResponseStream, activity, call.ResponseHeadersAsync),"); break; case GrpcClientCallShape.ClientStreaming: builder.AppendLine(" call.RequestStream,"); builder.Append(" "); builder.Append(descriptor.HelperType); - builder.AppendLine(".ObserveUnaryResponseAsync(call.ResponseAsync, call.ResponseHeadersAsync, activity),"); + builder.AppendLine( + ".ObserveUnaryResponseAsync(call.ResponseAsync, call.ResponseHeadersAsync, activity),"); break; case GrpcClientCallShape.DuplexStreaming: builder.AppendLine(" call.RequestStream,"); - builder.AppendLine(" QylObservedAsyncStreamReader.Create(call.ResponseStream, activity, call.ResponseHeadersAsync),"); + builder.AppendLine( + " QylObservedAsyncStreamReader.Create(call.ResponseStream, activity, call.ResponseHeadersAsync),"); break; default: @@ -1084,7 +1118,8 @@ private static void EmitGrpcConstructorArguments(StringBuilder builder, GrpcClie builder.AppendLine(" call.GetTrailers,"); } - private static void EmitGrpcCallPreamble(StringBuilder builder, in InterceptorTarget target, GrpcClientBodyDescriptor descriptor) + private static void EmitGrpcCallPreamble(StringBuilder builder, in InterceptorTarget target, + GrpcClientBodyDescriptor descriptor) { builder.Append(" var activity = "); builder.Append(descriptor.HelperType); @@ -1093,7 +1128,7 @@ private static void EmitGrpcCallPreamble(StringBuilder builder, in InterceptorTa builder.Append(", "); AppendStringLiteral(builder, target.MethodName); builder.Append(", "); - AppendGrpcMetadataExpression(builder, target); + AppendGrpcMetadataExpression(builder, in target); builder.AppendLine(");"); builder.AppendLine(" try"); builder.AppendLine(" {"); @@ -1145,18 +1180,22 @@ private static void EmitGrpcStreamReaderWrapper(StringBuilder builder, string he builder.AppendLine(); builder.AppendLine(" internal static class QylObservedAsyncStreamReader"); builder.AppendLine(" {"); - builder.AppendLine(" public static global::Grpc.Core.IAsyncStreamReader Create(global::Grpc.Core.IAsyncStreamReader inner, global::System.Diagnostics.Activity? activity, global::System.Threading.Tasks.Task? responseHeadersTask)"); + builder.AppendLine( + " public static global::Grpc.Core.IAsyncStreamReader Create(global::Grpc.Core.IAsyncStreamReader inner, global::System.Diagnostics.Activity? activity, global::System.Threading.Tasks.Task? responseHeadersTask)"); builder.AppendLine(" => new QylObservedAsyncStreamReader(inner, activity, responseHeadersTask);"); builder.AppendLine(" }"); builder.AppendLine(); - builder.AppendLine(" internal sealed class QylObservedAsyncStreamReader : global::Grpc.Core.IAsyncStreamReader"); + builder.AppendLine( + " internal sealed class QylObservedAsyncStreamReader : global::Grpc.Core.IAsyncStreamReader"); builder.AppendLine(" {"); builder.AppendLine(" private readonly global::Grpc.Core.IAsyncStreamReader _inner;"); builder.AppendLine(" private readonly global::System.Diagnostics.Activity? _activity;"); - builder.AppendLine(" private readonly global::System.Threading.Tasks.Task? _responseHeadersTask;"); + builder.AppendLine( + " private readonly global::System.Threading.Tasks.Task? _responseHeadersTask;"); builder.AppendLine(" private bool _completed;"); builder.AppendLine(); - builder.AppendLine(" public QylObservedAsyncStreamReader(global::Grpc.Core.IAsyncStreamReader inner, global::System.Diagnostics.Activity? activity, global::System.Threading.Tasks.Task? responseHeadersTask)"); + builder.AppendLine( + " public QylObservedAsyncStreamReader(global::Grpc.Core.IAsyncStreamReader inner, global::System.Diagnostics.Activity? activity, global::System.Threading.Tasks.Task? responseHeadersTask)"); builder.AppendLine(" {"); builder.AppendLine(" _inner = inner;"); builder.AppendLine(" _activity = activity;"); @@ -1165,11 +1204,13 @@ private static void EmitGrpcStreamReaderWrapper(StringBuilder builder, string he builder.AppendLine(); builder.AppendLine(" public T Current => _inner.Current;"); builder.AppendLine(); - builder.AppendLine(" public async global::System.Threading.Tasks.Task MoveNext(global::System.Threading.CancellationToken cancellationToken)"); + builder.AppendLine( + " public async global::System.Threading.Tasks.Task MoveNext(global::System.Threading.CancellationToken cancellationToken)"); builder.AppendLine(" {"); builder.AppendLine(" try"); builder.AppendLine(" {"); - builder.AppendLine(" var hasNext = await _inner.MoveNext(cancellationToken).ConfigureAwait(false);"); + builder.AppendLine( + " var hasNext = await _inner.MoveNext(cancellationToken).ConfigureAwait(false);"); builder.AppendLine(" if (!hasNext && !_completed)"); builder.AppendLine(" {"); builder.AppendLine(" _completed = true;"); @@ -1199,9 +1240,11 @@ private static void EmitGrpcStreamReaderWrapper(StringBuilder builder, string he private static void AppendGraphQlDocumentCaptureExpression(StringBuilder builder, in InterceptorTarget target) { - if (target.Parameters.Length > 0 && string.Equals(target.Parameters[0].TypeName, "global::GraphQL.ExecutionOptions", StringComparison.Ordinal)) + if (target.Parameters.Length > 0 && string.Equals(target.Parameters[0].TypeName, + "global::GraphQL.ExecutionOptions", StringComparison.Ordinal)) { - builder.Append("global::Qyl.OpenTelemetry.AutoInstrumentation.QylAutoInstrumentationOptions.Current.GraphQlSetDocument && "); + builder.Append( + "global::Qyl.OpenTelemetry.AutoInstrumentation.QylAutoInstrumentationOptions.Current.GraphQlSetDocument && "); builder.Append(target.Parameters[0].Name); builder.Append(" is not null ? "); builder.Append(target.Parameters[0].Name); @@ -1215,7 +1258,8 @@ private static void AppendGraphQlDocumentCaptureExpression(StringBuilder builder private static void AppendGraphQlOperationNameExpression(StringBuilder builder, in InterceptorTarget target) { - if (target.Parameters.Length > 0 && string.Equals(target.Parameters[0].TypeName, "global::GraphQL.ExecutionOptions", StringComparison.Ordinal)) + if (target.Parameters.Length > 0 && string.Equals(target.Parameters[0].TypeName, + "global::GraphQL.ExecutionOptions", StringComparison.Ordinal)) { builder.Append(target.Parameters[0].Name); builder.Append(" is not null ? "); @@ -1247,11 +1291,11 @@ private static void EmitLoggerInterceptor( { if (descriptor.Kind is LoggerInterceptorBodyKind.ILoggerLog) { - EmitDirectLoggerInterceptor(builder, invocation, index, descriptor); + EmitDirectLoggerInterceptor(builder, in invocation, index, descriptor); return; } - EmitLoggerExtensionInterceptor(builder, invocation, index, descriptor); + EmitLoggerExtensionInterceptor(builder, in invocation, index, descriptor); } private static void EmitDirectLoggerInterceptor( @@ -1260,7 +1304,7 @@ private static void EmitDirectLoggerInterceptor( int index, LoggerBodyDescriptor descriptor) { - var attribute = Microsoft.CodeAnalysis.CSharp.CSharpExtensions.GetInterceptsLocationAttributeSyntax(invocation.Location); + var attribute = invocation.Location.GetInterceptsLocationAttributeSyntax(); var displayLocation = invocation.Location.GetDisplayLocation(); builder.Append(" // Intercepted call at "); builder.AppendLine(displayLocation); @@ -1290,19 +1334,22 @@ private static void EmitLoggerExtensionInterceptor( LoggerBodyDescriptor descriptor) { var target = invocation.Target; - EmitAttributeAndSignature(builder, invocation.Location, "void", descriptor.MethodPrefix + "_" + target.MethodName, index, target.ReceiverType, "logger", target.Parameters, isAsync: false); + EmitAttributeAndSignature(builder, invocation.Location, "void", + descriptor.MethodPrefix + "_" + target.MethodName, index, target.ReceiverType, "logger", target.Parameters, + isAsync: false); builder.Append(" => "); builder.Append(descriptor.HelperType); builder.Append(".LogExtension(logger, "); - AppendLoggerLevelExpression(builder, target); + AppendLoggerLevelExpression(builder, in target); builder.Append(", "); - AppendFirstParameterExpression(builder, target, "global::Microsoft.Extensions.Logging.EventId", "default"); + AppendFirstParameterExpression(builder, in target, "global::Microsoft.Extensions.Logging.EventId", "default"); builder.Append(", "); - AppendFirstParameterExpression(builder, target, "global::System.Exception", "null"); + AppendFirstParameterExpression(builder, in target, "global::System.Exception", "null"); builder.Append(", "); - AppendFirstParameterExpression(builder, target, "global::System.String", "null"); + AppendFirstParameterExpression(builder, in target, "global::System.String", "null"); builder.Append(", "); - AppendFirstArrayParameterExpression(builder, target, "global::System.Object", "global::System.Array.Empty()"); + AppendFirstArrayParameterExpression(builder, in target, "global::System.Object", + "global::System.Array.Empty()"); builder.AppendLine(");"); builder.AppendLine(); } @@ -1351,7 +1398,7 @@ private static void EmitExternalLoggerInterceptor( builder.Append(", "); AppendStringLiteral(builder, target.MethodName); builder.Append(", "); - AppendExternalLoggerSeverityExpression(builder, target); + AppendExternalLoggerSeverityExpression(builder, in target); builder.AppendLine(");"); builder.AppendLine(" try"); builder.AppendLine(" {"); @@ -1407,7 +1454,8 @@ private static void AppendLoggerLevelExpression(StringBuilder builder, in Interc { if (string.Equals(target.MethodName, "Log", StringComparison.Ordinal)) { - AppendFirstParameterExpression(builder, target, "global::Microsoft.Extensions.Logging.LogLevel", "global::Microsoft.Extensions.Logging.LogLevel.None"); + AppendFirstParameterExpression(builder, in target, "global::Microsoft.Extensions.Logging.LogLevel", + "global::Microsoft.Extensions.Logging.LogLevel.None"); return; } @@ -1425,7 +1473,8 @@ private static void AppendLoggerLevelExpression(StringBuilder builder, in Interc builder.Append(levelName); } - private static void AppendFirstParameterExpression(StringBuilder builder, in InterceptorTarget target, string typeName, string fallbackExpression) + private static void AppendFirstParameterExpression(StringBuilder builder, in InterceptorTarget target, + string typeName, string fallbackExpression) { foreach (var parameter in target.Parameters) { @@ -1439,7 +1488,8 @@ private static void AppendFirstParameterExpression(StringBuilder builder, in Int builder.Append(fallbackExpression); } - private static void AppendFirstArrayParameterExpression(StringBuilder builder, in InterceptorTarget target, string elementTypeName, string fallbackExpression) + private static void AppendFirstArrayParameterExpression(StringBuilder builder, in InterceptorTarget target, + string elementTypeName, string fallbackExpression) { foreach (var parameter in target.Parameters) { @@ -1454,7 +1504,8 @@ private static void AppendFirstArrayParameterExpression(StringBuilder builder, i } private static bool IsParameterType(ParameterSpec parameter, string typeName) - => string.Equals(NormalizeSpecialTypeName(parameter.TypeName), NormalizeSpecialTypeName(typeName), StringComparison.Ordinal); + => string.Equals(NormalizeSpecialTypeName(parameter.TypeName), NormalizeSpecialTypeName(typeName), + StringComparison.Ordinal); private static string NormalizeSpecialTypeName(string typeName) => typeName switch @@ -1476,7 +1527,8 @@ private static void EmitAttributeAndSignature( string receiverName, EquatableArray parameters, bool isAsync) - => EmitAttributeAndSignature(builder, location, returnType, methodPrefix, index, receiverType, receiverName, parameters, isAsync, string.Empty, string.Empty); + => EmitAttributeAndSignature(builder, location, returnType, methodPrefix, index, receiverType, receiverName, + parameters, isAsync, string.Empty, string.Empty); private static void EmitAttributeAndSignature( StringBuilder builder, @@ -1491,7 +1543,7 @@ private static void EmitAttributeAndSignature( string typeParameterList, string constraintClauses) { - var attribute = Microsoft.CodeAnalysis.CSharp.CSharpExtensions.GetInterceptsLocationAttributeSyntax(location); + var attribute = location.GetInterceptsLocationAttributeSyntax(); var displayLocation = location.GetDisplayLocation(); builder.Append(" // Intercepted call at "); builder.AppendLine(displayLocation); @@ -1542,7 +1594,8 @@ private static void AppendParameterList(StringBuilder builder, EquatableArray parameters, bool includeLeadingComma) + private static void AppendArgumentList(StringBuilder builder, EquatableArray parameters, + bool includeLeadingComma) { for (var i = 0; i < parameters.Length; i++) { @@ -1590,7 +1643,4 @@ private static void AppendInvocationCall(StringBuilder builder, in InterceptorTa AppendArgumentList(builder, target.Parameters, includeLeadingComma: false); builder.Append(')'); } - - - } diff --git a/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylGeneratedSourceInterceptorCatalog.cs b/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylGeneratedSourceInterceptorCatalog.cs index 548a1397..456aff17 100644 --- a/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylGeneratedSourceInterceptorCatalog.cs +++ b/src/Qyl.OpenTelemetry.AutoInstrumentation.SourceGenerators/QylGeneratedSourceInterceptorCatalog.cs @@ -6,27 +6,27 @@ public sealed partial class QylAutoInstrumentationGenerator { private static ImmutableArray CreateGeneratedMatcherDescriptors() => ImmutableArray.Create( - new InterceptorMatcherDescriptor("HttpClient", "global::System.Net.Http.HttpClient", InterceptorKind.HttpClient, ContractKeys("signals.traces.HTTPCLIENT", "signals.metrics.HTTPCLIENT"), InterceptorEmitterFamily.HttpClient, InterceptorMethodShape.AsyncValue, TryGetHttpClientInvocation), - new InterceptorMatcherDescriptor("HttpWebRequest", "global::System.Net.HttpWebRequest", InterceptorKind.HttpWebRequest, ContractKeys("signals.traces.HTTPCLIENT", "signals.metrics.HTTPCLIENT"), InterceptorEmitterFamily.HttpClient, InterceptorMethodShape.AsyncOrSyncValue, TryGetHttpWebRequestInvocation), + new InterceptorMatcherDescriptor("HttpClient", "global::System.Net.Http.HttpClient", InterceptorKind.HttpClient, BuildContractKeys("signals.traces.HTTPCLIENT", "signals.metrics.HTTPCLIENT"), InterceptorEmitterFamily.HttpClient, InterceptorMethodShape.AsyncValue, TryGetHttpClientInvocation), + new InterceptorMatcherDescriptor("HttpWebRequest", "global::System.Net.HttpWebRequest", InterceptorKind.HttpWebRequest, BuildContractKeys("signals.traces.HTTPCLIENT", "signals.metrics.HTTPCLIENT"), InterceptorEmitterFamily.HttpClient, InterceptorMethodShape.AsyncOrSyncValue, TryGetHttpWebRequestInvocation), new InterceptorMatcherDescriptor("AspNetCoreWebApplicationBuilderBuild", "global::Microsoft.AspNetCore.Builder.WebApplicationBuilder", InterceptorKind.AspNetCoreWebApplicationBuilderBuild, "signals.traces.ASPNETCORE", InterceptorEmitterFamily.AspNetCore, InterceptorMethodShape.BuilderInitialization, TryGetAspNetCoreWebApplicationBuilderBuildInvocation), new InterceptorMatcherDescriptor("AspNetCoreRequestDelegate", "global::Microsoft.AspNetCore.Http.RequestDelegate", InterceptorKind.AspNetCoreRequestDelegate, "signals.traces.ASPNETCORE", InterceptorEmitterFamily.AspNetCore, InterceptorMethodShape.AsyncTask, TryGetAspNetCoreRequestDelegateInvocation), new InterceptorMatcherDescriptor("AspNetCoreEndpointMap", "global::Microsoft.AspNetCore.Builder.EndpointRouteBuilderExtensions", InterceptorKind.AspNetCoreEndpointMap, "signals.traces.ASPNETCORE", InterceptorEmitterFamily.AspNetCore, InterceptorMethodShape.EndpointRegistration, TryGetAspNetCoreEndpointMapInvocation), - new InterceptorMatcherDescriptor("MeterProviderBuilderAddMeter", "global::OpenTelemetry.Metrics.MeterProviderBuilder", InterceptorKind.MeterProviderBuilderAddMeter, ContractKeys("signals.metrics.ASPNETCORE", "signals.metrics.HTTPCLIENT", "signals.metrics.NETRUNTIME", "signals.metrics.NPGSQL", "signals.metrics.NSERVICEBUS", "signals.metrics.PROCESS", "signals.metrics.SQLCLIENT"), InterceptorEmitterFamily.Meter, InterceptorMethodShape.BuilderRegistration, TryGetMeterProviderBuilderAddMeterInvocation), + new InterceptorMatcherDescriptor("MeterProviderBuilderAddMeter", "global::OpenTelemetry.Metrics.MeterProviderBuilder", InterceptorKind.MeterProviderBuilderAddMeter, BuildContractKeys("signals.metrics.ASPNETCORE", "signals.metrics.HTTPCLIENT", "signals.metrics.NETRUNTIME", "signals.metrics.NPGSQL", "signals.metrics.NSERVICEBUS", "signals.metrics.PROCESS", "signals.metrics.SQLCLIENT"), InterceptorEmitterFamily.Meter, InterceptorMethodShape.BuilderRegistration, TryGetMeterProviderBuilderAddMeterInvocation), new InterceptorMatcherDescriptor("AzureClient", "Azure.*Client", InterceptorKind.AzureClient, "signals.traces.AZURE", InterceptorEmitterFamily.Azure, InterceptorMethodShape.AsyncOrSyncValue, TryGetAzureClientInvocation), - new InterceptorMatcherDescriptor("Elastic", "Elastic.Clients.Elasticsearch.*Client|Elastic.Transport.ITransport", InterceptorKinds(InterceptorKind.ElasticsearchClient, InterceptorKind.ElasticTransport), ContractKeys("signals.traces.ELASTICSEARCH", "signals.traces.ELASTICTRANSPORT"), InterceptorEmitterFamily.Search, InterceptorMethodShape.AsyncOrSyncValue, TryGetElasticInvocation), + new InterceptorMatcherDescriptor("Elastic", "Elastic.Clients.Elasticsearch.*Client|Elastic.Transport.ITransport", InterceptorKinds(InterceptorKind.ElasticsearchClient, InterceptorKind.ElasticTransport), BuildContractKeys("signals.traces.ELASTICSEARCH", "signals.traces.ELASTICTRANSPORT"), InterceptorEmitterFamily.Search, InterceptorMethodShape.AsyncOrSyncValue, TryGetElasticInvocation), new InterceptorMatcherDescriptor("WcfClient", "global::System.ServiceModel.ClientBase", InterceptorKind.WcfClient, "signals.traces.WCFCLIENT", InterceptorEmitterFamily.Wcf, InterceptorMethodShape.AsyncOrSyncValue, TryGetWcfClientInvocation), new InterceptorMatcherDescriptor("GrpcNetClientUnary", "global::Grpc.Core.ClientBase", InterceptorKind.GrpcNetClientAsyncUnaryCall, "signals.traces.GRPCNETCLIENT", InterceptorEmitterFamily.Grpc, InterceptorMethodShape.GrpcUnary, TryGetGrpcNetClientAsyncUnaryInvocation), new InterceptorMatcherDescriptor("GrpcNetClientStreaming", "global::Grpc.Core.ClientBase", InterceptorKinds(InterceptorKind.GrpcNetClientAsyncServerStreamingCall, InterceptorKind.GrpcNetClientAsyncClientStreamingCall, InterceptorKind.GrpcNetClientAsyncDuplexStreamingCall), "signals.traces.GRPCNETCLIENT", InterceptorEmitterFamily.Grpc, InterceptorMethodShape.GrpcStreaming, TryGetGrpcNetClientStreamingInvocation), new InterceptorMatcherDescriptor("Kafka", "Confluent.Kafka.IProducer|Confluent.Kafka.IConsumer", InterceptorKinds(InterceptorKind.KafkaProducer, InterceptorKind.KafkaConsumer), "signals.traces.KAFKA", InterceptorEmitterFamily.Messaging, InterceptorMethodShape.AsyncOrSyncValue, TryGetKafkaInvocation), new InterceptorMatcherDescriptor("MassTransit", "MassTransit.IPublishEndpoint|MassTransit.ISendEndpoint|MassTransit.ISendEndpointProvider", InterceptorKind.MassTransitMessageOperation, "signals.traces.MASSTRANSIT", InterceptorEmitterFamily.Messaging, InterceptorMethodShape.AsyncTask, TryGetMassTransitInvocation), - new InterceptorMatcherDescriptor("NServiceBus", "NServiceBus.IMessageSession|NServiceBus.IEndpointInstance|NServiceBus.IPipelineContext", InterceptorKind.NServiceBusMessageOperation, ContractKeys("signals.traces.NSERVICEBUS", "signals.metrics.NSERVICEBUS"), InterceptorEmitterFamily.Messaging, InterceptorMethodShape.AsyncTask, TryGetNServiceBusInvocation), + new InterceptorMatcherDescriptor("NServiceBus", "NServiceBus.IMessageSession|NServiceBus.IEndpointInstance|NServiceBus.IPipelineContext", InterceptorKind.NServiceBusMessageOperation, BuildContractKeys("signals.traces.NSERVICEBUS", "signals.metrics.NSERVICEBUS"), InterceptorEmitterFamily.Messaging, InterceptorMethodShape.AsyncTask, TryGetNServiceBusInvocation), new InterceptorMatcherDescriptor("Quartz", "Quartz.IJob", InterceptorKind.QuartzJobExecute, "signals.traces.QUARTZ", InterceptorEmitterFamily.Scheduler, InterceptorMethodShape.AsyncTask, TryGetQuartzInvocation), new InterceptorMatcherDescriptor("StackExchangeRedis", "StackExchange.Redis.IDatabase", InterceptorKind.StackExchangeRedisCommandAsync, "signals.traces.STACKEXCHANGEREDIS", InterceptorEmitterFamily.Cache, InterceptorMethodShape.AsyncValue, TryGetStackExchangeRedisInvocation), new InterceptorMatcherDescriptor("GraphQL", "GraphQL.IDocumentExecuter", InterceptorKind.GraphQlDocumentExecuter, "signals.traces.GRAPHQL", InterceptorEmitterFamily.GraphQl, InterceptorMethodShape.AsyncTask, TryGetGraphQlInvocation), new InterceptorMatcherDescriptor("EntityFrameworkCoreDbContext", "global::Microsoft.EntityFrameworkCore.DbContext", InterceptorKind.EntityFrameworkCoreDbContext, "signals.traces.ENTITYFRAMEWORKCORE", InterceptorEmitterFamily.Database, InterceptorMethodShape.AsyncOrSyncValue, TryGetEntityFrameworkCoreDbContextInvocation), new InterceptorMatcherDescriptor("EntityFrameworkCoreQueryable", "global::Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions", InterceptorKind.EntityFrameworkCoreQueryable, "signals.traces.ENTITYFRAMEWORKCORE", InterceptorEmitterFamily.Database, InterceptorMethodShape.AsyncValue, TryGetEntityFrameworkCoreQueryableInvocation), new InterceptorMatcherDescriptor("MongoDb", "MongoDB.Driver.IMongoCollection", InterceptorKind.MongoDbCollection, "signals.traces.MONGODB", InterceptorEmitterFamily.Database, InterceptorMethodShape.AsyncOrSyncValue, TryGetMongoDbInvocation), - new InterceptorMatcherDescriptor("DbCommand", "global::System.Data.Common.DbCommand", InterceptorKind.DbCommand, ContractKeys("signals.traces.ADONET", "signals.traces.MYSQLCONNECTOR", "signals.traces.MYSQLDATA", "signals.traces.NPGSQL", "signals.traces.ORACLEMDA", "signals.traces.SQLCLIENT", "signals.traces.SQLITE", "signals.metrics.NPGSQL", "signals.metrics.SQLCLIENT"), InterceptorEmitterFamily.Database, InterceptorMethodShape.AsyncOrSyncValue, TryGetDbCommandInvocation), + new InterceptorMatcherDescriptor("DbCommand", "global::System.Data.Common.DbCommand", InterceptorKind.DbCommand, BuildContractKeys("signals.traces.ADONET", "signals.traces.MYSQLCONNECTOR", "signals.traces.MYSQLDATA", "signals.traces.NPGSQL", "signals.traces.ORACLEMDA", "signals.traces.SQLCLIENT", "signals.traces.SQLITE", "signals.metrics.NPGSQL", "signals.metrics.SQLCLIENT"), InterceptorEmitterFamily.Database, InterceptorMethodShape.AsyncOrSyncValue, TryGetDbCommandInvocation), new InterceptorMatcherDescriptor("RabbitMq", "RabbitMQ.Client.IModel|RabbitMQ.Client.IChannel", InterceptorKind.RabbitMqBasicPublish, "signals.traces.RABBITMQ", InterceptorEmitterFamily.Messaging, InterceptorMethodShape.AsyncOrSyncVoid, TryGetRabbitMqInvocation), new InterceptorMatcherDescriptor("LoggerExtensions", "global::Microsoft.Extensions.Logging.LoggerExtensions", InterceptorKind.ILoggerExtensionLog, "signals.logs.ILOGGER", InterceptorEmitterFamily.Logging, InterceptorMethodShape.Void, TryGetLoggerExtensionInvocation), new InterceptorMatcherDescriptor("ILogger", "global::Microsoft.Extensions.Logging.ILogger", InterceptorKind.ILoggerLog, "signals.logs.ILOGGER", InterceptorEmitterFamily.Logging, InterceptorMethodShape.Void, TryGetLoggerInvocation), diff --git a/tools/verify-contract-invariants.py b/tools/verify-contract-invariants.py index 214e07d2..4fee9c93 100644 --- a/tools/verify-contract-invariants.py +++ b/tools/verify-contract-invariants.py @@ -707,7 +707,7 @@ def verify_interceptor_emitter_runtime_delegation(generator: str) -> None: descriptor_delegation_tokens = [ "descriptor.HelperType", - "descriptor.AppendStartActivity(builder, target)", + "descriptor.AppendStartActivity(builder, in target)", "descriptor.GetRecordExceptionStatement()", "descriptor.ObserveAsyncMethod", "EmitDirectLoggerInterceptor(", @@ -1550,14 +1550,14 @@ def verify_interceptor_signal_ownership(generator: str, kinds: set[str]) -> None def verify_interceptor_policy_shapes(generator: str, kinds: set[str]) -> None: for token in [ - "ValidateMethodShape(descriptor);", - "ValidateSingleBodyDescriptor(descriptor);", + "ValidateMethodShape(in descriptor);", + "ValidateSingleBodyDescriptor(in descriptor);", "Interceptor emission descriptor must define exactly one typed body descriptor", "Interceptor emission descriptor method shape mismatch", "Trace body descriptor has unsupported method shape", "Trace body descriptor must provide a runtime helper", "Forwarding body descriptor has unsupported method shape", - "ValidateEmissionDescriptorPolicy(descriptor);", + "ValidateEmissionDescriptorPolicy(in descriptor);", "Runtime metric duration policy requires trace+metric ownership", "Trace+metric ownership requires runtime metric duration policy", "Trace runtime metric descriptor must provide a duration metric descriptor", @@ -1710,7 +1710,7 @@ def verify_interceptor_target_coverage(generator: str, implemented_signal_keys: "Matcher descriptor catalog declares a duplicate interceptor kind", "Emission descriptor catalog declares a duplicate interceptor kind", "Matcher and emission descriptor catalogs must declare the same interceptor kind set", - "EnsureTargetDeclaredByMatcher(descriptor, target);", + "EnsureTargetDeclaredByMatcher(descriptor, in target);", "EnsureKindDeclaredByMatcher(descriptor, target.Kind);", "public ulong TargetKindMask { get; }", "GetInterceptorKindMask(kind)", @@ -1828,9 +1828,9 @@ def verify_generator_keys(artifacts: ModuleType, contract: dict[str, Any]) -> No "TraceMethodPrefixKind.InstrumentationIdAndTargetMethodName", "descriptor.MethodPrefixKind", "descriptor.DurationMetric.AppendMetricStartStatement(builder)", - "descriptor.DurationMetric.AppendRecordDurationStatement(builder, target)", - "descriptor.ActivityEnrichment.Append(builder, target)", - "descriptor.AsyncObservation.AppliesTo(target)", + "descriptor.DurationMetric.AppendRecordDurationStatement(builder, in target)", + "descriptor.ActivityEnrichment.Append(builder, in target)", + "descriptor.AsyncObservation.AppliesTo(in target)", "descriptor.AsyncObservation.ObserveAsyncMethod", ]: if token not in (contract_source if token.startswith(("Implemented", "Source", "Runtime", "Unsupported", "TryGet")) else generator):