Elastic APM 和 OpenTelemetry 集成 (使用otel collector)

2022-05-30 15:37:12 浏览数 (1)

什么是 OpenTelemetry?

OpenTelemetry是一个云原生计算基金会 (CNCF) 沙盒项目,它提供了供应商中立的、特定于语言的代理、SDK 和 API,您可以使用它们从所有受监控的应用程序中收集分布式跟踪、指标和日志数据。OpenTelemetry 代理能够自动检测应用程序代码以显示性能数据,这些数据对于帮助您了解服务的健康状况非常重要——为应用程序开发人员提供了选择和选择哪些代理监控其应用程序的灵活性。 

致力于开放标准支持

从开源到开源代码,开放性是我们 Elastic 的 DNA。我们不仅从我们编写和发布的代码的角度,而且从我们摄取的数据的角度来拥抱这种开放性。我们一直站在采用开放标准的最前沿,以此为我们的用户提供灵活性,让他们可以选择他们希望如何将数据传送到 Elasticsearch 并利用 Elastic Stack 的功能。这种支持开放标准的承诺体现在我们对其他开放标准和其他流行的开源项目的支持上,例如 PrometheusOpenTracingW3C Trace-ContextJaeger

2019 年初,OpenTracing 和 OpenCensus 开始了标准化 API 并构建完整解决方案的旅程,使用户能够更轻松地跨所有检测服务捕获跟踪和遥测数据。在Elastic APM中构建了对 OpenTracing 的支持后,我们作为 OpenTelemetry 项目的成员积极参与。

腾讯和Elastic积极贡献Opentelemetry标准腾讯和Elastic积极贡献Opentelemetry标准

如何开始使用 Elastic APM 和 OpenTelemetry

为了向 Elastic APM 添加对 OpenTelemetry 的支持,我们扩展了OpenTelemetry 收集器 contrib 存储库并添加了 Elastic APM 导出器。导出器将从您的服务收集的 OpenTelemetry 跟踪数据转换为 Elastic 的协议,然后再通过 APM 服务器将数据发送到 Elastic APM。扩展 OpenTelemetry 收集器意味着无需对已埋点的服务进行任何更改即可开始使用 Elastic APM。只需将 Elastic 导出器放到您的 OpenTelemetry 设置中,然后在 Elastic APM 中查看您的跟踪数据。

部署导出器并将数据发送到 Elastic 后,您可以在 APM 应用程序中可视化这些数据,就像您对 Elastic APM 代理捕获的任何其他跟踪一样。

OpenTelemetry 收集器贡献存储库包含一个简单的入门示例。只需按照入门指南将 Elastic APM 作为导出器添加到示例中即可。

入门指南

本指南假定您已经使用 OpenTelemetry API 和/或 SDK 检测了您的服务。如果您还没有,请参阅 Elastic APM安装和运行指南以开始使用 Elastic APM 代理。

下载收集器

Elastic exporter 位于opentelemetry-collector-contrib repository,最新版本可以从GitHub 发布页面下载。

Docker 镜像在dockerhub上可用:

代码语言:javascript复制
docker pull otel/opentelemetry-collector-contrib-dev

您还可以通过克隆并运行来构建collector-contrib:

代码语言:javascript复制
make otelcontribcol

配置收集器

创建一个yaml配置文件。

至少,您必须定义要向其发送数据的 APM 服务器实例的 URL。例如:

代码语言:javascript复制
exporters:
  elastic:
    apm_server_url: "https://elasticapm.example.com"

有关其他配置选项,请参阅配置参考,例如指定 API 密钥、秘密令牌或 TLS 设置。

Elastic exporter也必须在service.pipelines.traces.exporters参数中配置。 例如:

代码语言:javascript复制
exporters:
  elastic:
    apm_server_url: "https://elasticapm.example.com"

如果我们将所有内容放在一起,这是一个示例配置文件,它接受来自 OpenTelemetry 代理的输入、处理数据并将其发送到 Elasticsearch Service 实例。

代码语言:javascript复制
receivers:
  otlp:
    endpoint: localhost:55680
processors:
  batch:
    timeout: 1s
    send_batch_size: 1024
exporters:
  elastic:
    apm_server_url: "https://elasticapm.example.com"
    secret_token: "ESS_TOKEN"
service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [elastic]

概念验证

根据入门示例,我们可以通过docker快速的启动多个使用opentelemetry sdk埋点的应用,并且启动一个Elastic collector-contrib,以及一个APM server:

并将colletor的配置设置为:

代码语言:javascript复制
receivers:
 otlp:
 protocols:
 grpc:
 endpoint: 0.0.0.0:55680
 http:
 endpoint: 0.0.0.0:55681
exporters:
 elastic:
 apm_server_url: http://apm-server:8200
processors:
 batch:
 queued_retry:
service:
 pipelines:
 traces:
 receivers: [otlp]
 exporters: [elastic]
 processors: [batch, queued_retry]

这里定义的export会将数据发送到Elastic APM server,在APM UI上,将可以看到来自otel sdk发来的数据:

因为都遵循同样的分布式追踪的逻辑,可以无缝使用Elastic APM上的各种分析工具:

解决方案的灵活性

通过将 OpenTelemetry 与Elastic Observability解决方案和 Elastic Stack 相结合,您可以灵活地选择要使用哪些代理(Elastic 或 OpenTelemetry)来检测您的应用程序。无论您选择什么,您都可以在 APM 应用程序中可视化端到端的分布式跟踪。您还可以获得一个统一的解决方案来可视化跟踪以及指标和日志、强大的分析以及机器学习和具有灵活性和规模的警报等功能的好处。

随着 OpenTelemetry 发展为包含指标和日志,我们将努力增强我们的支持,以便您可以将我们的代理和 Beats 与 OpenTelemetry 代理无缝结合使用。同时,如果您正在寻找捕获指标或日志,您可以使用MetricbeatFilebeat模块为您提供监控堆栈的完整可见性。

0 人点赞