上游 OpenTelemetry 收集器和语言 SDK
编辑

这是您可以用来将 Elastic 与 OpenTelemetry 集成的几种方法之一。

要比较各种方法并为您的用例选择最佳方法,请参阅将 OpenTelemetry 与 APM 一起使用

Elastic Stack 原生支持 OpenTelemetry 协议 (OTLP)。这意味着可以直接将从您的应用程序和基础设施收集的跟踪数据和指标发送到 Elastic Stack。

从上游 OpenTelemetry 收集器发送数据编辑

使用 OTLP 导出器将您的 OpenTelemetry 收集器实例连接到 Elastic 可观测性

receivers: 
  # ...
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
processors: 
  # ...
  memory_limiter:
    check_interval: 1s
    limit_mib: 2000
  batch:

exporters:
  debug:
    verbosity: detailed 
  otlp: 
    # Elastic APM server https endpoint without the "https://" prefix
    endpoint: "${env:ELASTIC_APM_SERVER_ENDPOINT}"  
    headers:
      # Elastic APM Server secret token
      Authorization: "Bearer ${env:ELASTIC_APM_SECRET_TOKEN}"  

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [..., memory_limiter, batch]
      exporters: [debug, otlp]
    metrics:
      receivers: [otlp]
      processors: [..., memory_limiter, batch]
      exporters: [debug, otlp]
    logs: 
      receivers: [otlp]
      processors: [..., memory_limiter, batch]
      exporters: [debug, otlp]

接收器,例如OTLP 接收器,用于转发 APM 代理发出的数据,或者主机指标接收器

我们建议使用批处理处理器内存限制器处理器。有关更多信息,请参阅推荐的处理器

调试导出器有助于进行故障排除,并支持可配置的详细级别:basic(默认)、normaldetailed

Elastic 可观测性端点配置。APM 服务器通过 gRPC 传输(OTLP/gRPC)和通过 HTTP 传输(OTLP/HTTP)的 OTLP 协议支持 ProtoBuf 有效负载。要了解有关这些导出器的更多信息,请参阅 OpenTelemetry 收集器文档:OTLP/HTTP 导出器OTLP/gRPC 导出器。向现有配置添加端点时,可以添加可选的名称组件(如 otlp/elastic)以区分端点,如OpenTelemetry 收集器配置基础知识中所述。

APM 服务器端点的主机名和端口。例如,elastic-apm-server:8200

用于 Elastic APM 密钥令牌授权Authorization: "Bearer a_secret_token")或 API 密钥授权Authorization: "ApiKey an_api_key")的凭证。

特定于环境的配置参数可以方便地作为环境变量传递,如此处所述(例如,ELASTIC_APM_SERVER_ENDPOINTELASTIC_APM_SECRET_TOKEN)。

[预览] 此功能为技术预览版,可能会在未来的版本中更改或删除。Elastic 将努力修复任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 约束。 要将 OpenTelemetry 日志发送到 Elastic Stack 8.0+ 版本,请声明一个 logs 管道。

现在,您可以从您的服务和应用程序导出跟踪和指标了。

使用 OpenTelemetry 收集器时,应始终首选通过OTLP 导出器将数据发送到 Elastic APM 服务器。其他方法,例如使用elasticsearch 导出器将数据直接发送到 Elasticsearch,会将数据发送到 Elastic Stack,但会绕过 APM 服务器执行的所有验证和数据处理。此外,如果您使用 elasticsearch 导出器,则您的数据将无法在 Kibana 可观测性应用程序中查看。

从上游 OpenTelemetry SDK 发送数据编辑

本文档概述了如何直接从上游 OpenTelemetry SDK 向 APM 服务器发送数据,这在开始使用时是合适的。但是,在许多情况下,您应该使用 OpenTelemetry SDK 将数据发送到 OpenTelemetry 收集器,该收集器会处理数据并将其导出到 APM 服务器。请参阅OpenTelemetry 文档,详细了解何时以及如何使用收集器。

要将跟踪和指标导出到 APM 服务器,请使用 OpenTelemetry API、SDK 或两者来检测您的服务和应用程序。例如,如果您是 Java 开发人员,则需要使用适用于 Java 的 OpenTelemetry 代理来检测您的 Java 应用程序。请参阅OpenTelemetry 检测指南,以下载适用于您的语言的 OpenTelemetry 代理或 SDK。

定义环境变量以配置 OpenTelemetry 代理或 SDK,并启用与 Elastic APM 的通信。例如,如果您要检测 Java 应用程序,请定义以下环境变量

export OTEL_RESOURCE_ATTRIBUTES=service.name=checkoutService,service.version=1.1,deployment.environment=production
export OTEL_EXPORTER_OTLP_ENDPOINT=https://apm_server_url:8200
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer an_apm_secret_token"
export OTEL_METRICS_EXPORTER="otlp" \
export OTEL_LOGS_EXPORTER="otlp" \ 
java -javaagent:/path/to/opentelemetry-javaagent-all.jar \
     -classpath lib/*:classes/ \
     com.mycompany.checkout.CheckoutServiceServer

[预览] 此功能为技术预览版,可能会在未来的版本中更改或删除。Elastic 将努力修复任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 约束。 通过 APM 服务器进行的 OpenTelemetry 日志摄取目前处于技术预览阶段。

OTEL_RESOURCE_ATTRIBUTES

描述服务和运行服务的环境的字段。有关更多信息,请参阅资源属性

OTEL_EXPORTER_OTLP_ENDPOINT

APM 服务器 URL。APM 服务器侦听事件的主机和端口。

OTEL_EXPORTER_OTLP_HEADERS

包含 Elastic APM 密钥令牌或 API 密钥的授权标头:"Authorization=Bearer an_apm_secret_token""Authorization=ApiKey an_api_key"

有关如何格式化 API 密钥的信息,请参阅API 密钥

请注意 Beareran_apm_secret_token 以及 ApiKeyan_api_key 之间所需的空格。

如果您使用的是 1.27.0 之前版本的 Python OpenTelemetry 代理,则标头的内容必须是 URL 编码的。您可以使用 Python 标准库的 urllib.parse.quote 函数来编码标头的内容。

OTEL_METRICS_EXPORTER

要使用的指标导出器。有关更多信息,请参阅导出器选择

OTEL_LOGS_EXPORTER

要使用的日志导出器。有关更多信息,请参阅导出器选择

现在,您可以收集跟踪和指标,然后再验证指标在 Kibana 中可视化指标

将请求代理到 APM 服务器编辑

APM 服务器在与 Elastic APM 代理请求相同的端口上同时支持 OTLP/gRPCOTLP/HTTP 协议。为了便于设置,我们建议在将请求代理或负载均衡到 APM 服务器时使用 OTLP/HTTP。

如果您使用 OTLP/gRPC 协议,则对 APM 服务器的请求必须使用基于 TLS 的 HTTP/2 或 HTTP/2 明文 (H2C)。无论使用哪种协议,OTLP/gRPC 请求都将包含标头:"Content-Type: application/grpc"

当使用 AWS ALB 等第 7 层 (L7) 代理时,必须以确保对 APM 服务器的请求遵循上述规则的方式代理请求。例如,使用 ALB 时,您可以创建规则以基于进入 ALB 的请求的标头选择替代后端协议。在此示例中,当请求上存在 "Content-Type: application/grpc" 标头时,您将选择 gRPC 协议。

有关如何配置 AWS ALB 以支持 gRPC 的更多信息,请参阅这篇 AWS 博客文章:Application Load Balancer Support for End-to-End HTTP/2 and gRPC

有关 APM 服务器如何处理 gRPC 请求的更多信息,请参阅复用 gRPC 和 HTTP/1.1

后续步骤编辑