Damien Mathieu

使用 OpenTelemetry 自动检测 Go 应用程序

使用 OpenTelemetry 检测 Go 应用程序可以深入了解应用程序性能、依赖关系和错误。我们将向您展示如何使用 Docker 自动检测 Go 应用程序,而无需更改应用程序代码。

阅读时长 8 分钟
Auto-instrumentation of Go applications with OpenTelemetry

在快速发展的软件开发领域,尤其是在云原生领域,DevOps 和 SRE 团队正日益成为应用程序稳定性和增长的重要合作伙伴。

DevOps 工程师不断优化软件交付,而 SRE 团队则充当应用程序可靠性、可扩展性和顶级性能的管理者。挑战是什么?这些团队需要一个尖端的观测解决方案,该解决方案应涵盖全栈洞察,使他们能够在潜在中断演变成运营挑战之前快速管理、监控和纠正这些中断。

在我们现代的分布式软件生态系统中,可观测性不仅仅是监控 — 它需要无限的数据收集、精确的处理以及将这些数据关联为可操作的见解。然而,实现这种整体视图的道路上充满了障碍,从处理版本不兼容到与限制性专有代码作斗争。

进入 OpenTelemetry (OTel),为那些采用它的人带来以下好处

  • 借助 OTel 摆脱供应商的限制,让您摆脱供应商锁定,并确保一流的可观测性。
  • 查看统一日志、指标和跟踪的和谐结合,以提供完整的系统视图。
  • 通过更丰富和增强的检测来改进您的应用程序监督。
  • 拥抱向后兼容性的好处,以保护您之前的检测投资。
  • 以简单的学习曲线开始 OpenTelemetry 之旅,简化入门和可扩展性。
  • 依靠经过验证的、面向未来的标准来增强您对每一项投资的信心。

在本博客中,我们将探讨如何使用 Docker 在您的 Go 中使用自动检测应用程序,而无需重构您的应用程序代码的任何部分。我们将使用一个名为 Elastiflix 的应用程序,它以简单的方式帮助突出显示自动检测。

应用程序、先决条件和配置

本博客中使用的应用程序名为 Elastiflix,是一款电影流应用程序。它由用 .NET、NodeJS、Go 和 Python 编写的多个微服务组成。

在检测我们的示例应用程序之前,我们首先需要了解 Elastic 如何接收遥测数据。

Elastic Observability 的所有 APM 功能都可通过 OTel 数据使用。其中一些包括

  • 服务地图
  • 服务详细信息(延迟、吞吐量、失败的事务)
  • 服务之间的依赖关系、分布式跟踪
  • 事务(跟踪)
  • 机器学习 (ML) 相关性
  • 日志关联

除了 Elastic 的 APM 和遥测数据的统一视图之外,您还可以使用 Elastic 强大的机器学习功能来减少分析和警报,从而帮助缩短 MTTR。

先决条件

查看示例源代码

完整的源代码,包括本博客中使用的 Dockerfile,可以在 GitHub 上找到。

以下步骤将向您展示如何检测此应用程序并在命令行或 Docker 中运行它。如果您对更完整的 OTel 示例感兴趣,请查看 此处的 docker-compose 文件,它将启动整个项目。

分步指南

第 0 步。登录到您的 Elastic Cloud 帐户

本博客假设您有一个 Elastic Cloud 帐户 — 如果没有,请按照说明开始使用 Elastic Cloud

第 1 步。运行带有自动检测的 Docker 映像

我们将使用来自 Elastiflix 演示应用程序的 Go 服务进行自动检测。

我们将使用 Elastiflix 中的以下服务

Elastiflix/go-favorite

根据 OpenTelemetry Go 自动检测文档,您将配置应用程序以使用 docker-compose 进行自动检测。

正如 OTEL Go 文档中指定的,我们将使用环境变量并传入配置值,以使其能够与Elastic Observability 的 APM 服务器连接。

因为 Elastic 本机接受 OTLP,我们只需要提供 OTEL Exporter 需要发送数据的端点和身份验证,以及其他一些环境变量。

获取 Elastic Cloud 变量 您可以从 Kibana 中的以下路径复制端点和令牌

/app/apm/onboarding?agent=openTelemetry
.

您将需要复制以下环境变量

OTEL_EXPORTER_OTLP_ENDPOINT
OTEL_EXPORTER_OTLP_HEADERS

更新

docker-compose.yml
Elastiflix
仓库的顶部添加一个
go-auto
服务,并更新
favorite-go
服务。

  favorite-go:
    build: go-favorite/.
    image: docker.elastic.co/demos/workshop/observability/elastiflix-go-favorite:${ELASTIC_VERSION}-${BUILD_NUMBER}
    depends_on:
      - redis
    networks:
      - app-network
    ports:
      - "5001:5000"
    environment:
      - REDIS_HOST=redis
      - TOGGLE_SERVICE_DELAY=${TOGGLE_SERVICE_DELAY:-0}
      - TOGGLE_CANARY_DELAY=${TOGGLE_CANARY_DELAY:-0}
      - TOGGLE_CANARY_FAILURE=${TOGGLE_CANARY_FAILURE:-0}
    volumes:
      - favorite-go:/app
  go-auto:
    image: otel/autoinstrumentation-go
    privileged: true
    pid: "host"
    networks:
      - app-network
    environment:
      OTEL_EXPORTER_OTLP_ENDPOINT: "REPLACE WITH OTEL_EXPORTER_OTLP_ENDPOINT"
      OTEL_EXPORTER_OTLP_HEADERS: "REPLACE WITH OTEL_EXPORTER_OTLP_HEADERS"
      OTEL_GO_AUTO_TARGET_EXE: "/app/main"
      OTEL_SERVICE_NAME: "go-favorite"
      OTEL_PROPAGATORS: "tracecontext,baggage"
    volumes:
      - favorite-go:/app
      - /proc:/host/proc

并且,在文件底部

volumes:
  favorite-go:
networks:
  app-network:
    driver: bridge

最后,在主节点应用程序的配置中,您需要告诉 Elastiflix 通过替换以下行来调用 Go 收藏夹应用程序:

environment:
  - API_ENDPOINT_FAVORITES=favorite-java:5000

替换为:

environment:
  - API_ENDPOINT_FAVORITES=favorite-go:5000

步骤 3:在 Elastic APM 中探索跟踪和日志

一旦您启动并运行此操作,您可以 ping 您的已检测服务(在我们的例子中,这是 /favorites)的端点,您应该会在 Elastic APM 中看到该应用程序出现,如下所示

它将首先跟踪 SRE 需要注意的吞吐量和延迟关键指标。

深入研究,我们可以看到所有事务的概览。

并查看特定的事务

这使您可以完全了解指标和跟踪!

总结

有了这个 Dockerfile,您已将简单的 Go 应用程序转换为使用 OpenTelemetry 自动检测的应用程序。这将极大地帮助您了解应用程序性能、跟踪错误,并深入了解用户如何与您的软件交互。

请记住,可观察性是现代应用程序开发的关键方面,尤其是在分布式系统中。借助 OpenTelemetry 等工具,理解复杂的系统变得更容易一些。

在此博客中,我们讨论了以下内容

  • 如何使用 OpenTelemetry 自动检测 Go。
  • 通过在 Docker 文件中使用标准命令,可以高效地完成自动检测,而无需在多个位置添加代码,从而实现可管理性。
  • 通过使用 OpenTelemetry 及其对多种语言的支持,DevOps 和 SRE 团队可以轻松地自动检测他们的应用程序,从而立即深入了解整个应用程序堆栈的运行状况,并缩短平均修复时间 (MTTR)。

由于 Elastic 可以支持多种数据摄取方法,无论是使用开源 OpenTelemetry 的自动检测,还是使用其原生 APM 代理的手动检测,您都可以通过首先关注一些应用程序,然后在以后以最适合您业务需求的方式在所有应用程序中使用 OpenTelemety 来规划迁移到 OTel 的过程。

开发者资源

常规配置和用例资源

还没有 Elastic Cloud 帐户?注册 Elastic Cloud 并试用我上面讨论的自动检测功能。我很想知道您在使用 Elastic 获取应用程序堆栈可见性的体验方面的反馈。

本文中描述的任何功能或特性的发布和时间安排均由 Elastic 自行决定。任何目前不可用的功能或特性可能无法按时交付或根本不会交付。