菜单
文档breadcrumb arrow Grafana Alloybreadcrumb arrow 采集和转发数据breadcrumb arrow 采集 OpenTelemetry 数据并转发到 Grafana
开源

采集 OpenTelemetry 数据并转发到 Grafana

您可以配置 Alloy 来采集 OpenTelemetry 兼容的数据并将其转发到 Grafana 堆栈。

本主题介绍了如何

  • 配置 Alloy 将您的数据发送到 Loki。
  • 配置 Alloy 将您的数据发送到 Tempo。
  • 配置 Alloy 将您的数据发送到 Mimir 或 Prometheus Remote Write。

本主题中使用的组件

开始之前

  • 确保您对使用 OpenTelemetry 对应用进行插桩有基本的了解。
  • 准备好一组 OpenTelemetry 应用,以便将遥测数据推送到 Alloy。
  • 确定 Alloy 将接收到的遥测数据写入何处。
  • 熟悉 Alloy 中的 组件 概念。
  • 完成 采集 OpenTelemetry 数据 任务。

数据处理管道

您可以使用在 采集 OpenTelemetry 数据 任务中创建的 Alloy 配置作为起点。

alloy
otelcol.receiver.otlp "example" {
  grpc {
    endpoint = "127.0.0.1:4317"
  }

  http {
    endpoint = "127.0.0.1:4318"
  }

  output {
    metrics = [otelcol.processor.batch.example.input]
    logs    = [otelcol.processor.batch.example.input]
    traces  = [otelcol.processor.batch.example.input]
  }
}

otelcol.processor.batch "example" {
  output {
    metrics = [otelcol.exporter.otlp.default.input]
    logs    = [otelcol.exporter.otlp.default.input]
    traces  = [otelcol.exporter.otlp.default.input]
  }
}

otelcol.exporter.otlp "default" {
  client {
    endpoint = "my-otlp-grpc-server:4317"
  }
}

数据处理管道如下所示

plaintext
Metrics, Logs, Traces: OTLP Receiver → batch processor → OTLP Exporter

Grafana Cloud

Grafana Cloud 提供 OTLP 端点,您可以直接在 Alloy 中使用它们。

您可以在 Grafana Cloud Portal 中 OpenTelemetry 的详细信息页面找到 OTLP 连接详情。

您必须按如下方式更新配置文件

alloy
otelcol.auth.basic "default" {
  username = "<ACCOUNT ID>"
  password = "<API TOKEN>"
}

otelcol.exporter.otlphttp "default" {
  client {
    endpoint = "<OTLP_ENDPOINT>"
    auth     = otelcol.auth.basic.default.handler
  }
}

替换以下内容

  • <ACCOUNT ID>: 您的 Grafana Cloud 账户 ID。
  • <API TOKEN>: 您的 Grafana Cloud API token。
  • <OTLP_ENDPOINT>: 您的 OTLP 端点。

此配置使用存储在 otelcol.auth.basic "default" 中的凭据对 Grafana Cloud OTLP 端点进行认证,您的数据应该开始到达。

其他平台(Grafana Enterprise, Grafana Open Source)

您可以实现以下数据处理管道,将数据发送到 Loki、Tempo 以及 Mimir 或 Prometheus。

plaintext
Metrics: OTel → batch processor → Mimir or Prometheus remote write
Logs: OTel → batch processor → Loki exporter
Traces: OTel → batch processor → OTel exporter

Grafana Loki

Grafana Loki 是一个受 Prometheus 启发的可水平扩展、高可用、多租户日志聚合系统。与 Prometheus 类似,要将 OTLP 数据发送到 Loki,您可以配置从 otelcol.exporter.loki 组件到 loki.write 组件的直通。

alloy
otelcol.exporter.loki "default" {
  forward_to = [loki.write.default.receiver]
}

loki.write "default" {
  endpoint {
    url = "http://loki-endpoint:8080/loki/api/v1/push"
        }
}

要将 Loki 与基本认证一起使用(Grafana Cloud Logs 需要基本认证),您必须配置 loki.write 组件。您可以从 Grafana Cloud Portal 中 Loki 的详细信息页面获取 Loki 配置。

alloy
otelcol.exporter.loki "grafana_cloud_logs" {
  forward_to = [loki.write.grafana_cloud_logs.receiver]
}

loki.write "grafana_cloud_logs" {
  endpoint {
    url = "https://logs-prod-us-central1.grafana.net/loki/api/v1/push"

    basic_auth {
      username = "5252"
      password = sys.env("GRAFANA_CLOUD_API_KEY")
    }
  }
}

Grafana Tempo

Grafana Tempo 是一个开源、易用、可扩展的分布式追踪后端。Tempo 可以直接接收 OTLP 数据,您可以使用 OTLP 导出器将追踪发送到 Tempo。

alloy
otelcol.exporter.otlp "default" {
  client {
    endpoint = "tempo-server:4317"
  }
}

要将 Tempo 与基本认证一起使用(Grafana Cloud Traces 需要基本认证),您必须使用 otelcol.auth.basic 组件。您可以从 Grafana Cloud Portal 中 Tempo 的详细信息页面获取 Tempo 配置。

alloy
otelcol.exporter.otlp "grafana_cloud_traces" {
  client {
    endpoint = "tempo-us-central1.grafana.net:443"
    auth     = otelcol.auth.basic.grafana_cloud_traces.handler
  }
}

otelcol.auth.basic "grafana_cloud_traces" {
  username = "4094"
  password = sys.env("GRAFANA_CLOUD_API_KEY")
}

Grafana Mimir 或 Prometheus Remote Write

Prometheus Remote Write 是一种流行的指标传输协议,受到大多数指标系统的支持,包括 Grafana Mimir 和 Grafana Cloud。要将 OTLP 数据发送到 Prometheus 兼容的 remote_write 端点,您可以配置从 otelcol.exporter.prometheus 组件到 prometheus.remote_write 组件的直通。Alloy 中的 Prometheus remote write 组件是一个强大的协议实现,包括用于弹性的预写日志 (WAL)。

alloy
otelcol.exporter.prometheus "default" {
  forward_to = [prometheus.remote_write.default.receiver]
}

prometheus.remote_write "default" {
  endpoint {
    url = "http://prometheus:9090/api/v1/write"
  }
}

要将 Prometheus 与基本认证一起使用(Grafana Cloud Metrics 需要基本认证),您必须配置 prometheus.remote_write 组件。您可以从 Grafana Cloud Portal 中 Prometheus 的详细信息页面获取 Prometheus 配置。

alloy
otelcol.exporter.prometheus "grafana_cloud_metrics" {
        forward_to = [prometheus.remote_write.grafana_cloud_metrics.receiver]
    }

prometheus.remote_write "grafana_cloud_metrics" {
    endpoint {
        url = "https://prometheus-us-central1.grafana.net/api/prom/push"

        basic_auth {
            username = "12690"
            password = sys.env("GRAFANA_CLOUD_API_KEY")
        }
    }
}

整合所有配置

您需要引用设置的三个导出器,而不是在 otelcol.processor.batch 的输出中引用 otelcol.exporter.otlp.default.input。最终配置如下:

alloy
otelcol.receiver.otlp "example" {
  grpc {
    endpoint = "127.0.0.1:4317"
  }

  http {
    endpoint = "127.0.0.1:4318"
  }

  output {
    metrics = [otelcol.processor.batch.example.input]
    logs    = [otelcol.processor.batch.example.input]
    traces  = [otelcol.processor.batch.example.input]
  }
}

otelcol.processor.batch "example" {
  output {
    metrics = [otelcol.exporter.prometheus.grafana_cloud_metrics.input]
    logs    = [otelcol.exporter.loki.grafana_cloud_logs.input]
    traces  = [otelcol.exporter.otlp.grafana_cloud_traces.input]
  }
}

otelcol.exporter.otlp "grafana_cloud_traces" {
  client {
    endpoint = "tempo-us-central1.grafana.net:443"
    auth     = otelcol.auth.basic.grafana_cloud_traces.handler
  }
}

otelcol.auth.basic "grafana_cloud_traces" {
  username = "4094"
  password = sys.env("GRAFANA_CLOUD_API_KEY")
}

otelcol.exporter.prometheus "grafana_cloud_metrics" {
        forward_to = [prometheus.remote_write.grafana_cloud_metrics.receiver]
    }

prometheus.remote_write "grafana_cloud_metrics" {
    endpoint {
        url = "https://prometheus-us-central1.grafana.net/api/prom/push"

        basic_auth {
            username = "12690"
            password = sys.env("GRAFANA_CLOUD_API_KEY")
        }
    }
}

otelcol.exporter.loki "grafana_cloud_logs" {
  forward_to = [loki.write.grafana_cloud_logs.receiver]
}

loki.write "grafana_cloud_logs" {
  endpoint {
    url = "https://logs-prod-us-central1.grafana.net/loki/api/v1/push"

    basic_auth {
      username = "5252"
      password = sys.env("GRAFANA_CLOUD_API_KEY")
    }
  }
}

运行 Alloy 将显示如下信息

plaintext
./alloy run alloy-config.alloy
./alloy run alloy-config.alloy
ts=2023-05-09T09:37:15.300959Z level=info msg="running usage stats reporter"
ts=2023-05-09T09:37:15.300958Z level=info msg="now listening for http traffic" addr=127.0.0.1:12345
ts=2023-05-09T09:37:15.301104Z level=info trace_id=6466516c9e1a556422df7a84c0ade6b0 msg="starting complete graph evaluation"
ts=2023-05-09T09:37:15.301307Z level=info trace_id=6466516c9e1a556422df7a84c0ade6b0 msg="finished node evaluation" node_id=loki.write.grafana_cloud_logs duration=188.209µs
ts=2023-05-09T09:37:15.301334Z level=info trace_id=6466516c9e1a556422df7a84c0ade6b0 msg="finished node evaluation" node_id=otelcol.exporter.loki.grafana_cloud_logs duration=18.791µs
ts=2023-05-09T09:37:15.303138Z component=prometheus.remote_write.grafana_cloud_metrics level=info subcomponent=wal msg="replaying WAL, this may take a while" dir=data-alloy/prometheus.remote_write.grafana_cloud_metrics/wal
ts=2023-05-09T09:37:15.303257Z component=prometheus.remote_write.grafana_cloud_metrics level=info subcomponent=wal msg="WAL segment loaded" segment=0 maxSegment=1
ts=2023-05-09T09:37:15.303302Z component=prometheus.remote_write.grafana_cloud_metrics level=info subcomponent=wal msg="WAL segment loaded" segment=1 maxSegment=1
ts=2023-05-09T09:37:15.303507Z component=prometheus.remote_write.grafana_cloud_metrics subcomponent=rw level=info remote_name=7f623a url=https://prometheus-us-central1.grafana.net/api/prom/push msg="Starting WAL watcher" queue=7f623a
ts=2023-05-09T09:37:15.303515Z component=prometheus.remote_write.grafana_cloud_metrics subcomponent=rw level=info remote_name=7f623a url=https://prometheus-us-central1.grafana.net/api/prom/push msg="Starting scraped metadata watcher"
ts=2023-05-09T09:37:15.303522Z level=info trace_id=6466516c9e1a556422df7a84c0ade6b0 msg="finished node evaluation" node_id=prometheus.remote_write.grafana_cloud_metrics duration=2.181958ms
ts=2023-05-09T09:37:15.303557Z level=info trace_id=6466516c9e1a556422df7a84c0ade6b0 msg="finished node evaluation" node_id=otelcol.exporter.prometheus.grafana_cloud_metrics duration=30.083µs
ts=2023-05-09T09:37:15.303611Z component=prometheus.remote_write.grafana_cloud_metrics subcomponent=rw level=info remote_name=7f623a url=https://prometheus-us-central1.grafana.net/api/prom/push msg="Replaying WAL" queue=7f623a
ts=2023-05-09T09:37:15.303618Z level=info trace_id=6466516c9e1a556422df7a84c0ade6b0 msg="finished node evaluation" node_id=otelcol.auth.basic.grafana_cloud_traces duration=52.5µs
ts=2023-05-09T09:37:15.303694Z level=info trace_id=6466516c9e1a556422df7a84c0ade6b0 msg="finished node evaluation" node_id=otelcol.exporter.otlp.grafana_cloud_traces duration=70.375µs
ts=2023-05-09T09:37:15.303782Z component=otelcol.processor.memory_limiter.default level=info msg="Memory limiter configured" limit_mib=150 spike_limit_mib=30 check_interval=1s
ts=2023-05-09T09:37:15.303802Z level=info trace_id=6466516c9e1a556422df7a84c0ade6b0 msg="finished node evaluation" node_id=otelcol.processor.memory_limiter.default duration=100.334µs
ts=2023-05-09T09:37:15.303853Z level=info trace_id=6466516c9e1a556422df7a84c0ade6b0 msg="finished node evaluation" node_id=otelcol.processor.batch.default duration=44.75µs
ts=2023-05-09T09:37:15.303948Z level=info trace_id=6466516c9e1a556422df7a84c0ade6b0 msg="finished node evaluation" node_id=otelcol.receiver.otlp.default duration=87.333µs
ts=2023-05-09T09:37:15.303968Z level=info trace_id=6466516c9e1a556422df7a84c0ade6b0 msg="finished node evaluation" node_id=tracing duration=10.792µs
ts=2023-05-09T09:37:15.303981Z level=info trace_id=6466516c9e1a556422df7a84c0ade6b0 msg="finished node evaluation" node_id=logging duration=9µs
ts=2023-05-09T09:37:15.303987Z level=info trace_id=6466516c9e1a556422df7a84c0ade6b0 msg="finished complete graph evaluation" duration=2.960333ms
ts=2023-05-09T09:37:15.304Z level=info msg="scheduling loaded components"
ts=2023-05-09T09:37:15.304109Z component=otelcol.receiver.otlp.default level=info msg="Starting GRPC server" endpoint=0.0.0.0:4317
ts=2023-05-09T09:37:15.304234Z component=otelcol.receiver.otlp.default level=info msg="Starting HTTP server" endpoint=0.0.0.0:4318

您可以通过访问 https://:12345/graph 以图形方式查看数据处理管道

Graphical representation of a healthy pipeline