作者:来自 Elastic Damien Mathieu
使用 OpenTelemetry 检测 Go 应用程序可以深入了解应用程序的性能、依赖项和错误。我们将向你展示如何使用 Docker 自动检测 Go 应用程序,而无需更改应用程序代码。
在快节奏的软件开发领域,尤其是在云原生领域,DevOps 和 SRE 团队正日益成为应用程序稳定性和增长的重要合作伙伴。
DevOps 工程师不断优化软件交付,而 SRE 团队则充当应用程序可靠性、可扩展性和顶级性能的管家。挑战是什么?这些团队需要一种尖端的可观察性解决方案,该解决方案包含全栈洞察,使他们能够快速管理、监控和纠正潜在的中断,以免它们最终演变为运营挑战。
我们现代分布式软件生态系统中的可观察性不仅仅是监控 —— 它要求无限的数据收集、精确的处理以及将这些数据关联到可操作的洞察。然而,实现这种整体视角的道路充满障碍,从解决版本不兼容问题到与限制性专有代码作斗争。
进入 OpenTelemetry (OTel),采用它的人将获得以下好处:
- 使用 OTel 摆脱供应商限制,摆脱供应商锁定并确保一流的可观察性。
- 看到统一日志、指标和跟踪的和谐结合在一起,提供完整的系统视图。
- 通过更丰富和增强的仪表来改善你的应用程序监督。
- 利用向后兼容性的好处来保护你之前的检测投资。
- 以简单的学习曲线踏上 OpenTelemetry 之旅,简化入职和可扩展性。
- 依靠经过验证的、面向未来的标准来增强你对每项投资的信心。
在本博客中,我们将探讨如何使用 Docker 在 Go 应用程序中使用自动检测,而无需重构应用程序代码的任何部分。我们将使用一个名为 Elastiflix 的应用程序,它有助于以简单的方式突出显示自动检测。
应用程序、先决条件和配置
我们在本博客中使用的应用程序称为 Elastiflix,这是一款电影流应用程序。它由用 .NET、NodeJS、Go 和 Python 编写的几个微服务组成。
在我们测试示例应用程序之前,我们首先需要了解 Elastic 如何接收遥测数据。
Elastic Observability 的所有 APM 功能均可通过 OTel 数据使用。其中包括:
- 服务地图 - service map
- 服务详细信息(延迟、吞吐量、失败 transactions)
- 服务之间的依赖关系、分布式跟踪
- 事务(跟踪)
- 机器学习 (ML) 关联
- 日志关联
除了 Elastic 的 APM 和遥测数据的统一视图外,你还可以使用 Elastic 强大的机器学习功能来减少分析和警报,以帮助减少 MTTR。
先决条件
- Elastic Cloud 帐户 — 立即注册。
- 克隆 Elastiflix 演示应用程序,或你自己的 Go 应用程序
- 对 Docker 有基本了解 — 可能安装 Docker Desktop
- 对 Go 有基本了解
查看示例源代码
完整的源代码(包括本博客中使用的 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 的以下路径下复制端点和 token /app/apm/onboarding?agent=openTelemetry
你需要复制以下环境变量:
OTEL_EXPORTER_OTLP_ENDPOINT
OTEL_EXPORTER_OTLP_HEADERS
更新 Elastiflix 存储库顶部的 docker-compose.yml 文件,添加 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 需要关注的吞吐量和延迟关键指标。
深入研究后,我们可以看到所有交易的概览。
再看一下具体的 transactions:
这使你可以完全了解所有指标和跟踪!
总结
使用此 Dockerfile,你已将简单的 Go 应用程序转换为使用 OpenTelemetry 自动检测的应用程序。这将极大地帮助你了解应用程序性能、跟踪错误并深入了解用户如何与你的软件交互。
请记住,可观察性是现代应用程序开发的一个重要方面,尤其是在分布式系统中。借助 OpenTelemetry 等工具,理解复杂系统会变得容易一些。
在本博客中,我们讨论了以下内容:
- 如何使用 OpenTelemetry 自动检测 Go。
- 使用 Docker 文件中的标准命令,可以高效地完成自动检测,而无需在多个位置添加代码,从而实现可管理性。
- 使用 OpenTelemetry 及其对多种语言的支持,DevOps 和 SRE 团队可以轻松地自动检测他们的应用程序,立即了解整个应用程序堆栈的运行状况并减少平均解决时间 (mean time to resolution - MTTR)。
由于 Elastic 可以支持多种数据提取方法,无论是使用开源 OpenTelemetry 的自动检测还是使用其原生 APM 代理的手动检测,你都可以先关注几个应用程序来规划向 OTel 的迁移,然后再以最适合你业务需求的方式在你的应用程序中使用 OpenTelemety。
Developer resources:
- Elastiflix application, a guide to instrument different languages with OpenTelemetry
- Python: Auto-instrumentation, Manual-instrumentation
- Java: Auto-instrumentation, Manual-instrumentation
- Node.js: Auto-instrumentation, Manual-instrumentation
- .NET: Auto-instrumentation, Manual-instrumentation
- Go: Auto-instrumentation Manual-instrumentation
- Best practices for instrumenting OpenTelemetry
General configuration and use case resources:
- Independence with OpenTelemetry on Elastic
- Modern observability and security on Kubernetes with Elastic and OpenTelemetry
- 3 models for logging with OpenTelemetry and Elastic
- Adding free and open Elastic APM as part of your Elastic Observability deployment
- Capturing custom metrics through OpenTelemetry API in code with Elastic
- Future-proof your observability platform with OpenTelemetry and Elastic
- Elastic Observability: Built for open technologies like Kubernetes, OpenTelemetry, Prometheus, Istio, and more
还没有 Elastic Cloud 帐户?注册 Elastic Cloud 并试用我上面讨论的自动检测功能。我很想听听你对使用 Elastic 深入了解应用程序堆栈的体验的反馈。
本文中描述的任何特性或功能的发布和时间均由 Elastic 自行决定。任何当前不可用的特性或功能可能无法按时交付或根本无法交付。
原文:Auto-instrumentation of Go applications with OpenTelemetry — Elastic Observability Labs