如何通过OpenTelemetry .NET在Application Insights中注册自定义事件
解决方案:把OpenTelemetry遥测转成Application Insights自定义事件(.NET)
1. 自定义Span处理器修改跟踪/依赖为自定义事件
Azure Monitor Exporter默认会把OTel的Span映射成跟踪或依赖,你可以写一个自定义SpanProcessor,在Span结束时添加特定属性,让Exporter把它识别成自定义事件:
using OpenTelemetry; using OpenTelemetry.Trace; public class CustomEventSpanProcessor : BaseProcessor<Activity> { public override void OnEnd(Activity activity) { // 标记该Span为自定义事件类型 activity.SetTag("ai.type", "Event"); // 设置自定义事件的名称(用Span的显示名或者自定义值都可以) activity.SetTag("ai.event.name", activity.DisplayName); // 可以额外添加自定义属性 activity.SetTag("custom.property", "your-value"); base.OnEnd(activity); } }
然后在配置TracerProvider的时候加上这个处理器:
var tracerProvider = Sdk.CreateTracerProviderBuilder() .AddSource("Your-SDK-Source-Name") // 替换成你SDK的Source名称 .AddAzureMonitorTraceExporter(options => { options.ConnectionString = "Your-App-Insights-Connection-String"; }) .AddProcessor(new CustomEventSpanProcessor()) .Build();
2. 日志转自定义事件的处理
如果是OTel日志要转成自定义事件,同样用自定义LogProcessor来修改日志属性:
using OpenTelemetry; using OpenTelemetry.Logs; public class CustomEventLogProcessor : BaseProcessor<LogRecord> { public override void OnEnd(LogRecord logRecord) { // 添加标识让Exporter转为自定义事件 logRecord.Attributes.Add("ai.type", "Event"); logRecord.Attributes.Add("ai.event.name", logRecord.CategoryName); // 把日志内容作为事件属性 logRecord.Attributes.Add("log.message", logRecord.FormattedMessage); base.OnEnd(logRecord); } }
配置LoggerProvider时引入这个处理器:
var loggerFactory = LoggerFactory.Create(builder => { builder.AddOpenTelemetry(options => { options.AddAzureMonitorLogExporter(exporterOptions => { exporterOptions.ConnectionString = "Your-App-Insights-Connection-String"; }); options.AddProcessor(new CustomEventLogProcessor()); }); });
3. 指标转自定义事件的折中方案
指标在App Insights里有专属的存储类型,如果非要转成自定义事件,可以把指标值打包成OTel事件的属性发送,这样既保持OTel中立性,又能在App Insights里显示为自定义事件:
// 封装一个工具方法,把指标数据转成OTel事件 public static void TrackMetricAsCustomEvent(string metricName, double metricValue, Dictionary<string, object>? customProps = null) { using var activity = new Activity(metricName); activity.Start(); activity.SetTag("ai.type", "Event"); activity.SetTag("ai.event.name", $"Metric_{metricName}"); activity.SetTag($"metric.value", metricValue); if (customProps != null) { foreach (var prop in customProps) { activity.SetTag(prop.Key, prop.Value); } } activity.Stop(); }
目前.NET的Azure Monitor Exporter没有类似Python的现成扩展,通过自定义处理器修改遥测属性是最直接的实现方式,这些属性会告诉Azure Monitor把数据解析成自定义事件。
内容的提问来源于stack exchange,提问作者nolicus
相关产品推荐
相关产品推荐

