首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

我们如何在 Rails 中配置 OpenTelemetry 日志

摘要

Recently, we needed to add observability to a Rails project without getting locked into a single vendor. OpenTelemetry was the natural choice. It generates three kinds of telemetry data, called signal...

the gem OpenTelemetry logs and opentelemetry vendor Collector SDK directly
2026-09-01 1 阅读 约8分钟阅读 __vivek
分享:
字号:
最近,我们需要向 Rails 项目添加可观察性,而不必局限于单一供应商。 OpenTelemetry 是自然的选择。它生成三种遥测数据,称为信号:日志、指标和跟踪。每个信号都是独立的,因此您可以采用其中一个而无需其他信号。所有这些信号都以与供应商无关的标准格式传输,称为 OTLP(开放遥测协议)。由于这种格式是整个行业的标准,因此我们将来可以切换后端(例如 Datadog、New Relic 或 Grafana Cloud),而无需重写任何应用程序代码。在这篇文章中,我们将解释如何配置 OpenTelemetry Ruby SDK 以将日志直接导出到我们的供应商 Grafana Cloud。我们还将讨论我们在此过程中遇到的一些问题以及我们贡献的上游修复。直接导出到供应商 标准 OpenTelemetry 部署涉及与应用程序一起运行 OpenTelemetry Collector。 Collector是一个单独的进程,通常是一个sidecar容器或同一主机上的服务。您的应用程序通过本地网络向其发送遥测数据,然后收集器对该数据进行批处理并将其转发给供应商。为了保持基础设施简单,我们绕过收集器并将日志直接从 Ruby SDK 导出到 Grafana Cloud。 Scout APM 日志记录 gem 使用类似的方法并直接从应用程序发送日志。我们的日志量很小,所以SDK内置的批处理就足够了。如果您需要在应用程序外部进行缓冲、采样或清理,那么收集器仍然是更好的选择。设置用于日志的 Ruby SDK 将以下 gem 添加到 Gemfile 中: gem "opentelemetry-sdk" gem "opentelemetry-logs-sdk" gem "opentelemetry-exporter-otlp" gem "opentelemetry-exporter-otlp-logs" gem "opentelemetry-instrumentation-all" gem "opentelemetry-instrumentation-logger" OpenTelemetry 是高度模块化的,因此每个 gem 处理一个具体职责: opentelemetry-sdk :核心 OpenTelemetry 框架(跟踪和配置入口点)。 opentelemetry-logs-sdk :添加对日志记录信号的支持(与跟踪分开)。 opentelemetry-exporter-otlp :通过 OTLP 通过网络导出跟踪。 opentelemetry-exporter-otlp-logs :通过 OTLP 通过网络导出日志。 opentelemetry-instrumentation-all :捆绑仪表 gem,包括 Rails、Rack 和 Active Record。 opentelemetry-instrumentation-logger :挂钩到标准 Ruby Logger,以便日志消息成为 OpenTelemetry 日志记录。安装这些 gem 后,导出器需要知道将数据发送到哪里。将供应商的端点和身份验证令牌设置为环境变量(SDK 自动检测标准 OTLP 导出器环境变量): OTEL_EXPORTER_OTLP_ENDPOINT = "https://your-vendor.com/otlp" OTEL_EXPORTER_OTLP_HEADERS = "Authorization=Basic " 最后,我们需要初始化 SDK,以便它开始收集和导出数据。创建一个初始化程序 ( config/initializers/opentelemetry.rb ):如果 ENV [ "OTEL_EXPORTER_OTLP_ENDPOINT" ],则返回。空白的?开放遥测::SDK。配置做| c | c. service_name = "our-rails-app" c. use_all end 这里, c.use_all 启用了所需的所有检测,这意味着捆绑在 opentelemetry-instrumentation-all 和 opentelemetry-instrumentation-logger 中的检测。本地测试 现在 SDK 已配置完毕,您可以通过设置 OTEL_LOGS_EXPORTER=console 来测试它。这会在您的终端中打印日志记录,而不是将其发送给供应商,这是在部署之前确认您的设置是否有效的最快方法。我们在 Ruby SDK 中发现并修复的问题 当我们将日志导出到 Grafana Cloud 时,我们发现了两个问题,即 Ruby SDK 的行为与其他语言 SDK 和 OpenTelemetry 规范不同。 1. 导出器删除了基本路径 一些供应商后端要求将 OTLP 数据发送到具有特定基本路径的端点,例如在我们使用 Grafana Cloud 的情况下的 /otlp,但导出器在附加信号路径时删除了它。端点:https://your-vendor.com/otlp 预期:https://your-vendor.com/otlp/v1/logs 实际:https://your-vendor.com/v1/logs 我们在问题 #2157 中报告了此问题,并在 PR #2158 中修复了该问题,该问题已在 opentelemetry-exporter-otlp-logs v0.5.1 中发布。 2. 处理 HTTP 204 响应 Grafana Cloud 在摄取日志后返回 204 No Content,但导出器仅将 200 OK 视为成功。导出实际上成功了,但我们的应用程序将每一项都记录为失败。我们提出了问题 #2043 并在 PR #2044 中修复了该问题,该问题在 opentelemetry-exporter-otlp-logs v0.4.0 中发布。后续步骤:结构化日志记录 现在日志已成功导出,下一个逻辑步骤是结构化日志记录。这里要介绍的内容太多了,但rails_semantic_logger gem 是一个很好的起点,我们甚至可能在以后的文章中介绍它的完整 OpenTelemetry 设置!
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱