in src/Core/Compiling/Policy/EmitTokenMetricCompiler.cs [14:90]
public class LlmEmitTokenMetricCompiler()
: BaseEmitTokenMetricCompiler("llm-emit-token-metric", nameof(IInboundContext.LlmEmitTokenMetric));
public class AzureOpenAiEmitTokenMetricCompiler()
: BaseEmitTokenMetricCompiler("azure-openai-emit-token-metric", nameof(IInboundContext.AzureOpenAiEmitTokenMetric));
public abstract class BaseEmitTokenMetricCompiler : IMethodPolicyHandler
{
private readonly string _policyName;
public string MethodName { get; }
protected BaseEmitTokenMetricCompiler(string policyName, string methodName)
{
this._policyName = policyName;
MethodName = methodName;
}
public void Handle(ICompilationContext context, InvocationExpressionSyntax node)
{
if (!node.TryExtractingConfigParameter<EmitTokenMetricConfig>(context, _policyName, out var values))
{
return;
}
var element = new XElement(_policyName);
element.AddAttribute(values, nameof(EmitTokenMetricConfig.Namespace), "namespace");
if (!values.TryGetValue(nameof(EmitTokenMetricConfig.Dimensions), out var dimensionsInitializer))
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterNotDefined,
node.GetLocation(),
_policyName,
nameof(EmitTokenMetricConfig.Dimensions)
));
return;
}
var dimensions = dimensionsInitializer.UnnamedValues ?? Array.Empty<InitializerValue>();
if (dimensions.Count == 0)
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterIsEmpty,
dimensionsInitializer.Node.GetLocation(),
_policyName,
nameof(EmitTokenMetricConfig.Dimensions)
));
return;
}
foreach (var dimension in dimensions)
{
if (!dimension.TryGetValues<MetricDimensionConfig>(out var result))
{
continue;
}
var dimensionElement = new XElement("dimension");
if (!dimensionElement.AddAttribute(result, nameof(MetricDimensionConfig.Name), "name"))
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterNotDefined,
dimension.Node.GetLocation(),
$"{_policyName}.dimension",
nameof(MetricDimensionConfig.Name)
));
continue;
}
dimensionElement.AddAttribute(result, nameof(MetricDimensionConfig.Value), "value");
element.Add(dimensionElement);
}
context.AddPolicy(element);
}
}