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

ASP.NET Core 7+OpenTelemetry对接Grafana的配置与数据源设置咨询

ASP.NET Core 7 指标/追踪数据接入Grafana问题解答

1. 当前配置的问题及修正方案

你的现有配置存在几处关键错误,以下是具体问题和修正方法:

(1) OpenTelemetry Collector 配置错误

当前Collector的exporters配置指向自身(otel-collector:4317),会导致数据循环发送,无法传递到Grafana。需要替换为Grafana兼容的存储/转发后端,比如添加Prometheus(存储指标)和Jaeger(存储追踪),或者直接导出到Grafana的OTLP端点。

修正后的Collector配置示例:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:
    timeout: 10s
    send_batch_size: 1000

exporters:
  # 导出指标到Prometheus
  prometheus:
    endpoint: "0.0.0.0:9090"
  # 导出追踪到Jaeger
  jaeger:
    endpoint: jaeger:14250
    tls:
      insecure: true
  # 可选:直接导出到Grafana的OTLP端点(需Grafana开启OTLP接收)
  otlp/grafana:
    endpoint: grafana:4317
    tls:
      insecure: true

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [jaeger, otlp/grafana]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [prometheus, otlp/grafana]

(2) ASP.NET代码中的OTLP端点错误

代码中硬编码了http://localhost:4317,但Docker容器内的localhost指向容器自身,无法访问otel-collector服务。同时环境变量已配置OTEL_EXPORTER_OTLP_ENDPOINT=grpc://otel-collector:4317,应该让代码自动读取环境变量,无需硬编码。

修正后的代码:

public static class TelemetryConfiguration
{
    public static IServiceCollection AddTelemetry(this IServiceCollection services,
        IWebHostEnvironment webHostEnvironment,
        string telemetryNamespace)
    {
        services.AddOpenTelemetry()
            .ConfigureResource(resource =>
            {
                resource
                    .AddService(
                        serviceName: webHostEnvironment.ApplicationName,
                        serviceNamespace: telemetryNamespace,
                        serviceVersion: Assembly.GetEntryAssembly()?.GetName().Version?.ToString() ?? "1.0.0",
                        serviceInstanceId: Environment.MachineName)
                    .AddAttributes(new Dictionary<string, object>
                    {
                        { "deployment.environment", webHostEnvironment.EnvironmentName }
                    });
            })
            .WithMetrics(metrics =>
            {
                metrics
                    .AddAspNetCoreInstrumentation()
                    .AddConsoleExporter((exporterOptions, metricReaderOptions) =>
                    {
                        metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = 1000;
                    })
                    .AddOtlpExporter(); // 自动读取环境变量配置
            })
            .WithTracing(tracing =>
            {
                tracing
                    .AddAspNetCoreInstrumentation()
                    .AddConsoleExporter()
                    .AddOtlpExporter(); // 自动读取环境变量配置
            });

        return services;
    }
}

(3) Docker Compose的两处错误

  • Grafana的volume路径错误:/var/lib/grafanaa应为/var/lib/grafana
  • 缺少Prometheus/Jaeger服务(如果使用上述Collector配置,需要添加对应的服务)

修正后的Docker Compose片段:

services:
  # ... 原有sample.restaurant.server服务 ...
  otel-collector:
    image: otel/opentelemetry-collector
    ports:
      - 4317:4317
      - 4318:4318
      - 9090:9090
    volumes:
      - ./collector-config.yml:/etc/otel-collector/collector-config.yml
    networks:
      - my-network
  prometheus:
    image: prom/prometheus
    ports:
      - 9090:9090
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    networks:
      - my-network
  jaeger:
    image: jaegertracing/all-in-one:latest
    ports:
      - 16686:16686
      - 14250:14250
    networks:
      - my-network
  grafana:
    image: grafana/grafana
    restart: unless-stopped
    ports:
      - 3000:3000
    volumes:
      - grafana_data:/var/lib/grafana # 修正路径
    depends_on:
      - otel-collector
      - prometheus
      - jaeger
    networks:
      - my-network

对应的Prometheus配置文件prometheus.yml:

scrape_configs:
  - job_name: 'otel-collector'
    scrape_interval: 10s
    static_configs:
      - targets: ['otel-collector:9090']

2. Grafana中配置数据源的步骤

前提:已按上述修正配置,启动所有服务(ASP.NET应用、otel-collector、prometheus、jaeger、grafana)

(1) 添加Prometheus数据源(用于指标)

  1. 访问Grafana控制台(http://localhost:3000),默认账号密码admin/admin
  2. 左侧菜单点击「Connections」→「Data sources」→「Add data source」
  3. 搜索并选择「Prometheus」
  4. 在「HTTP」→「URL」中输入http://prometheus:9090(Docker网络内的服务地址)
  5. 点击「Save & test」,提示数据源连接成功即可

(2) 添加Jaeger数据源(用于追踪)

  1. 同样在「Data sources」页面点击「Add data source」,搜索选择「Jaeger」
  2. 在「HTTP」→「URL」中输入http://jaeger:16686
  3. 点击「Save & test」,验证连接成功

(3) 可选:添加OTLP数据源(直接接收Collector数据)

如果使用Collector的otlp/grafana导出器,需要先开启Grafana的OTLP接收:

  • 在Docker Compose的grafana服务中添加环境变量:
    environment:
      - GF_FEATURE_TOGGLES_ENABLE=traceqlEditor,otlpReceivers
      - GF_OTLP_ENABLED=true
    
  • 然后在Grafana中添加「OTLP」数据源,URL填写http://grafana:4318(HTTP协议)或grpc://grafana:4317(gRPC协议),保存测试即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:25:14