You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中如何用OpenTelemetry向New Relic导出独立自定义事件

解决方案:通过OpenTelemetry Logs API生成New Relic独立自定义事件

你当前用span.AddEvent()实现的事件会绑定到Trace Span上,因此New Relic会将其归类为SpanEvent。要生成和New Relic Agent一致的独立自定义事件,需要使用OpenTelemetry的Logs API——New Relic的OTel Exporter会自动将OTel LogRecords转换为独立的自定义事件。

实现步骤

1. 安装必要依赖

确保项目引入OTel日志组件和New Relic Exporter:

go get go.opentelemetry.io/otel/log go.opentelemetry.io/otel/sdk/log github.com/newrelic/opentelemetry-exporter-go/newrelic

2. 初始化LoggerProvider

在程序启动时配置LoggerProvider(可与已有的TracerProvider共享资源和Exporter):

import (
    "context"
    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/attribute"
    "go.opentelemetry.io/otel/log"
    "go.opentelemetry.io/otel/sdk/log"
    "go.opentelemetry.io/otel/sdk/resource"
    semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
    "github.com/newrelic/opentelemetry-exporter-go/newrelic"
)

func initTelemetry() (*log.LoggerProvider, error) {
    // 创建New Relic Exporter(可共享给Trace和Log使用)
    exporter, err := newrelic.NewExporter(
        newrelic.WithAPIKey("YOUR_NEW_RELIC_API_KEY"),
        newrelic.WithServiceName("FibonacciService"),
    )
    if err != nil {
        return nil, err
    }

    // 设置服务资源元数据
    res, err := resource.Merge(
        resource.Default(),
        resource.NewWithAttributes(
            semconv.SchemaURL,
            semconv.ServiceName("FibonacciService"),
        ),
    )
    if err != nil {
        return nil, err
    }

    // 初始化LoggerProvider
    loggerProvider := log.NewLoggerProvider(
        log.WithResource(res),
        log.WithProcessor(log.NewBatchProcessor(exporter)),
    )
    otel.SetLoggerProvider(loggerProvider)

    // 可选:同时初始化TracerProvider(保留原有Trace功能)
    // tracerProvider := trace.NewTracerProvider(trace.WithResource(res), trace.WithSpanProcessor(batchSpanProcessor))
    // otel.SetTracerProvider(tracerProvider)

    return loggerProvider, nil
}

3. 记录独立自定义事件

在业务逻辑中,使用Logger生成LogRecord,通过event.type属性指定New Relic中的事件名称:

func handleFibonacciRequest(ctx context.Context) {
    // 获取Logger实例
    logger := otel.GetLoggerProvider().Logger("Fibonacci")

    // 定义自定义事件的属性
    eventAttrs := []attribute.KeyValue{
        attribute.String("key1", "value1"),
        attribute.String("key2", "value2"),
        attribute.String("key3", "value3"),
        // 关键:设置event.type指定New Relic中的独立事件名称
        attribute.String("event.type", "my_custom_event"),
    }

    // 发送LogRecord,会被New Relic转换为独立自定义事件
    logger.Emit(ctx, log.Record{
        Attributes: eventAttrs,
        // 可选:添加事件内容
        // Body: log.StringValue("Calculated Fibonacci sequence"),
    })

    // 原有Trace逻辑可保留(如果需要)
    ctx, span := otel.GetTracerProvider().Tracer("Fibonacci").Start(ctx, "GET /fibonacci")
    defer span.End()
    // ... 业务逻辑代码
}

关键说明

  • 事件类型映射:New Relic会将event.type属性的值作为独立事件的名称,在Metrics & Events浏览器中直接显示为my_custom_event,而非SpanEvent的附属属性。
  • 资源共享:LoggerProvider和TracerProvider可共享同一个New Relic Exporter和资源配置,确保事件与Trace关联到同一服务。
  • 批量处理:使用BatchProcessor可优化导出性能,减少网络请求次数。

内容的提问来源于stack exchange,提问作者Andres Corallo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:20:36