首页 > 解决方案 > OpenTelemetry 导出到 Collector Contrib

问题描述

本周我一直在尝试使用 opentelemetry,我希望能得到一些建议。

我已经使用以下 opentelemetry 库检测了一个用 C# 编写的 .net Core API 应用程序,并最初安装了 Jaeger 来收集和显示结果。我在本地机器上的 docker 容器中运行 jaeger。

我在 StartUp.cs 文件中添加到 ConfigureServices 的代码如下:

            services.AddOpenTelemetryTracing(builder =>
            {
                builder.AddAspNetCoreInstrumentation()
                    .AddHttpClientInstrumentation()
                    .AddSqlClientInstrumentation()
                    .AddSource(nameof(CORSBaseController))
                    .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("MyAppAPI"))
                    .AddJaegerExporter(opts =>
                    {
                        opts.AgentHost = Configuration["Jaeger:AgentHost"];
                        opts.AgentPort = Convert.ToInt32(Configuration["Jaeger:AgentPort"]);
                    });
            });

在 Jaeger 前端,当我搜索过去一小时内收到的跟踪时,在使用连接到 API 'jaeger-query' 和'MyAppAPI' 的前端后,我得到了两个列出的服务。我可以深入了解“MyAppAPI”并查看显示已收集的遥测数据的跨度。到目前为止,一切都很好。

显示两种服务的 Jeager UI

我在我的机器上安装了 opentelemetry-collector-contrib。我使用了 contrib,因为我最终想将结果导出到 newrelic 并需要他们的库。我使用示例 docker-compose yaml 文件使用 docker 启动了控制器:

version: "3"
services:
  # Jaeger
  jaeger:
    image: jaegertracing/all-in-one:latest
    ports:
      - "16686:16686"
      - "14268"
      - "14250"

  #Zipkin
  zipkin:
    image: openzipkin/zipkin
    container_name: zipkin
    ports:
      - 9411:9411

  otel-collector:
    build:
      context: ../..
      dockerfile: examples/tracing/Dockerfile
    command: ["--config=/etc/otel-collector-config.yml"]
    volumes:
      - ./otel-collector-config.yml:/etc/otel-collector-config.yml
    ports:
      - "1888:1888"   # pprof extension
      - "8888:8888"   # Prometheus metrics exposed by the collector
      - "8889:8889"   # Prometheus exporter metrics
      - "13133:13133" # health_check extension
      - "9411"   # Zipkin receiver
      - "55679:55679" # zpages extension
    depends_on:
      - jaeger
      - zipkin

  # Expose the frontend on http://localhost:8081
  frontend:
    image: openzipkin/example-sleuth-webmvc
    command: Frontend
    environment:
      JAVA_OPTS: -Dspring.zipkin.baseUrl=http://otel-collector:9511
    ports:
      - 8081:8081
    depends_on:
      - otel-collector

  # Expose the backend on http://localhost:9000
  backend:
    image: openzipkin/example-sleuth-webmvc
    command: Backend
    environment:
      JAVA_OPTS: -Dspring.zipkin.baseUrl=http://otel-collector:9511
    ports:
      - 9000:9000
    depends_on:
      - otel-collector

docker compose 文件中引用的 otel-collector-config.yml 文件如下所示,将“otlp”和“zipkin”都公开为接收者。

receivers:
  otlp:
    protocols:
      grpc:
  zipkin:

exporters:
  logging:
  zipkin:
    endpoint: "http://zipkin:9411/api/v2/spans"

processors:
  batch:

extensions:
  health_check:
  pprof:
  zpages:

service:
  extensions: [pprof, zpages, health_check]
  pipelines:
    traces:
      receivers: [otlp, zipkin]
      exporters: [zipkin, logging]
      processors: [batch]

我将 .Net 项目中的代码更改为以下代码,以使用 otlp 导出器将数据发送到收集器,如下所示:

            services.AddOpenTelemetryTracing(builder =>
            {
                builder.AddAspNetCoreInstrumentation()
                    .AddHttpClientInstrumentation()
                    .AddSqlClientInstrumentation()
                    .AddAspNetCoreInstrumentation()
                    .AddSource(nameof(CORSBaseController))
                    .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("MyAppAPI"))
                    .AddZipkinExporter(opts => 
                    {
                        opts.Endpoint = new Uri("http://localhost:9411/api/v2/spans");
                    });
            });

现在,当我使用前端向 API 发送请求时,再也无法将 MyAppAPI 视为 jaeger 中的服务之一(应该一直使用 zipkin)。我只能看到与我使用前端的时间相对应的 jaeger-query 跨度。

使用收集器的 Jaeger 前端

编辑:我有这个工作。这是由于在 startup.cs 文件中对 zipkin 收集器的调用不正确。另外,当我写出问题时,我意识到我正在导出到 zipkin 而不是 jaeger,所以我现在可以在 http://localhost:9411 上的 zipkin 前端看到我的踪迹。

上面的代码已被更正,因此可以正常工作。

标签: open-telemetry

解决方案


推荐阅读