返回

文章详情

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

Hacker News2026年8月31日 21:12

最近,我们需要为Rails项目添加可观察性,而不被锁定在单个供应商。OpenTelemetry是自然的选择。它生成三种类型的遥测数据,称为信号:日志、指标和追踪。每个信号都是独立的,因此您可以选择一个而不需要其他信号。所有这些信号都通过一种标准的、供应商无关的格式传输,这种格式被称为OTLP(OpenTelemetry Protocol)。因为这种格式在行业内是标准的,所以我们可以在未来切换后端(如Datadog、New Relic或Grafana Cloud),而无需重写任何应用程序代码。在这篇文章中,我们将解释如何配置OpenTelemetry Ruby SDK,以便直接将日志导出到我们的供应商——Grafana Cloud。我们还将讨论在这个过程中遇到的一些问题以及我们所贡献的上游修复。\n\n直接导出到供应商\n标准的OpenTelemetry部署涉及在您的应用程序旁边运行一个OpenTelemetry Collector。Collector是一个独立的进程,通常是一个侧车容器或同一主机上的服务。您的应用程序通过本地网络将遥测数据发送给它,然后Collector对那些数据进行批处理并将其转发给供应商。为了保持我们的基础架构简单,我们绕过了Collector,直接从Ruby SDK将日志导出到Grafana Cloud。Scout APM日志gem使用类似的方法,直接从应用程序发送日志。我们的日志量很小,因此SDK内置的批处理足够了。如果您需要在应用程序之外进行缓冲、抽样或清洗,Collector仍然是更好的选择。\n\n为日志设置Ruby SDK\n将以下gem添加到您的Gemfile中:\ngem "opentelemetry-sdk"\ngem "opentelemetry-logs-sdk"\ngem "opentelemetry-exporter-otlp"\ngem "opentelemetry-exporter-otlp-logs"\ngem "opentelemetry-instrumentation-all"\ngem "opentelemetry-instrumentation-logger"\nOpenTelemetry是高度模块化的,因此每个gem执行特定的职责:\nopentelemetry-sdk:核心OpenTelemetry框架(追踪和配置入口)。\nopentelemetry-logs-sdk:添加对日志信号的支持(与追踪分开)。\nopentelemetry-exporter-otlp:通过OTLP在网络上导出追踪。\nopentelemetry-exporter-otlp-logs:通过OTLP在网络上导出日志。\nopentelemetry-instrumentation-all:捆绑了仪器化gem,包括Rails、Rack和Active Record。\nopentelemetry-instrumentation-logger:接入标准Ruby Logger,使日志消息成为OpenTelemetry日志记录。\n安装这些gem后,导出器需要知道将数据发送到哪里。将您的供应商的终端和身份验证令牌设置为环境变量(SDK会自动检测标准OTLP导出器环境变量):\nOTEL_EXPORTER_OTLP_ENDPOINT = "https://your-vendor.com/otlp"\nOTEL_EXPORTER_OTLP_HEADERS = "Authorization=Basic <your-token>"\n最后,我们需要初始化SDK,以便它开始收集和导出数据。创建一个初始化文件(config/initializers/opentelemetry.rb):\nreturn if ENV["OTEL_EXPORTER_OTLP_ENDPOINT"].blank?\nOpenTelemetry :: SDK.configure do |c|\n c.service_name = "我们的Rails应用"\n c.use_all\nend\n这里,c.use_all启用所有已要求的仪器化,这意味着包括opentelemetry-instrumentation-all中捆绑的和opentelemetry-instrumentation-logger中的仪器化。\n\n本地测试\n现在SDK已配置,您可以通过设置OTEL_LOGS_EXPORTER=console进行测试。这将在您的终端中打印日志记录,而不是将它们发送给供应商,这是确认您的设置是否有效的最快方法。\n\n我们在Ruby SDK中发现和修复的一些问题\n当我们将日志导出到Grafana Cloud时,发现Ruby SDK的行为与其他语言SDK和OpenTelemetry规格不同,有两个问题。\n1. 导出器丢弃了基本路径\n一些供应商后端要求将OTLP数据发送到具有特定基本路径的端点,例如在Grafana Cloud的情况下为/otlp,但导出器在附加信号路径时丢弃了它。\n端点:https://your-vendor.com/otlp\n期望:https://your-vendor.com/otlp/v1/logs\n实际:https://your-vendor.com/v1/logs\n我们在问题#2157中报告了此问题,并在PR #2158中修复了,已在opentelemetry-exporter-otlp-logs v0.5.1中发布。\n2. 处理HTTP 204响应\nGrafana Cloud在接收日志后返回204 No Content,但导出器只将200 OK视为成功。导出实际上成功了,但我们的应用程序将每个导出都记录为失败。我们提出了问题#2043,并在PR #2044中修复了,已在opentelemetry-exporter-otlp-logs v0.4.0中发布。\n\n下一步:结构化日志\n现在日志已成功导出,下一步是结构化日志。这是一个太多的内容,无法在这里覆盖,但rails_semantic_logger gem是一个很好的起点,我们可能会在未来的文章中涵盖其完整的OpenTelemetry设置!

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡