You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置opentelemetry-sdk向Elasticsearch APM Server发送遥测数据?

如何配置opentelemetry-sdk gem将遥测数据发送至Elasticsearch APM Server?

问题背景

已按如下方式配置Rails应用,但APM Server接收请求后Kibana中无追踪记录:

  1. Gem依赖
# Gemfile
gem 'opentelemetry-exporter-otlp'
gem 'opentelemetry-instrumentation-all'
gem 'opentelemetry-sdk'
  1. 初始化配置(config/initializers/opentelemetry.rb)
require 'opentelemetry/sdk'
require 'opentelemetry/instrumentation/all'
require 'opentelemetry-exporter-otlp'

OpenTelemetry::SDK.configure do |c|
  c.service_name = 'my_app_name'
  c.logger = Rails.logger
  c.use_all

  c.add_span_processor(
    OpenTelemetry::SDK::Trace::Export::SimpleSpanProcessor.new(
      OpenTelemetry::Exporter::OTLP::Exporter.new(
        endpoint: 'http://localhost:8200/',
        headers: { 'Authorization' => 'Bearer MY_ACCESS_TOKEN' }
      )
    )
  )
end

Tracer = OpenTelemetry.tracer_provider.tracer('my_app_name')
  1. APM Server配置(apm-server.yml)
apm-server:
  host: "localhost:8200"
  auth:
    secret_token: qwerty

  kibana:
    enabled: true
    host: "localhost:5601"

output.elasticsearch:
  hosts: ["localhost:9200"]

改用Elastic官方elastic-apm gem可正常采集,但该gem无法为Span添加可搜索属性和事件,因此需要修复OpenTelemetry配置。


问题分析

APM Server收到请求但Kibana无数据,核心是OTLP导出配置与Elastic APM Server要求不匹配:

  • 端点路径错误:Elastic APM对OTLP gRPC/HTTP协议有不同的路径要求
  • 授权凭证不匹配:配置的Bearer token与APM Server的secret_token不一致
  • Span处理器选择不当:SimpleSpanProcessor同步导出稳定性差,可能导致数据未提交

修正方案

1. 调整Gem依赖(可选,针对HTTP/JSON协议)

若选择HTTP/JSON协议替代默认gRPC,需替换导出器gem:

# Gemfile
gem 'opentelemetry-exporter-otlp-http' # HTTP/JSON格式OTLP导出器
gem 'opentelemetry-instrumentation-all'
gem 'opentelemetry-sdk'

2. 修正初始化配置

根据选择的协议,二选一调整配置:

选项1:使用gRPC协议(APM Server默认支持)

require 'opentelemetry/sdk'
require 'opentelemetry/instrumentation/all'
require 'opentelemetry-exporter-otlp'

OpenTelemetry::SDK.configure do |c|
  c.service_name = 'my_app_name'
  c.logger = Rails.logger
  c.use_all

  # 与APM Server的secret_token保持一致
  auth_token = 'qwerty'

  c.add_span_processor(
    OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
      OpenTelemetry::Exporter::OTLP::Exporter.new(
        endpoint: 'http://localhost:8200/',
        headers: { 'Authorization' => "Bearer #{auth_token}" }
      )
    )
  )
end

Tracer = OpenTelemetry.tracer_provider.tracer('my_app_name')

选项2:使用HTTP/JSON协议

require 'opentelemetry/sdk'
require 'opentelemetry/instrumentation/all'
require 'opentelemetry-exporter-otlp-http'

OpenTelemetry::SDK.configure do |c|
  c.service_name = 'my_app_name'
  c.logger = Rails.logger
  c.use_all

  # 与APM Server的secret_token保持一致
  auth_token = 'qwerty'

  c.add_span_processor(
    OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
      OpenTelemetry::Exporter::OTLP::HTTP::Exporter.new(
        endpoint: 'http://localhost:8200/v1/traces', # HTTP/JSON专属Trace端点
        headers: { 'Authorization' => "Bearer #{auth_token}" }
      )
    )
  )
end

Tracer = OpenTelemetry.tracer_provider.tracer('my_app_name')

3. 关键配置说明

  • 端点路径:gRPC直接用http://localhost:8200/,HTTP/JSON需指定/v1/traces路径
  • 授权凭证:必须与APM Serverapm-server.auth.secret_token值完全一致
  • Span处理器:BatchSpanProcessor批量导出更稳定,适合生产环境
  • 服务名称:确保service_name与Kibana中筛选的服务名一致,便于查找数据

4. 验证步骤

  1. 重启Rails应用使配置生效
  2. 触发包含Tracer.in_span的业务逻辑
  3. 查看APM Server日志,确认无解析错误
  4. 在KibanaAPM > 服务中选择my_app_name,即可查看追踪记录

扩展:为Span添加可搜索属性和事件

使用OpenTelemetry SDK可轻松添加自定义属性和事件,示例:

Tracer.in_span 'fn1' do |span|
  # 添加可搜索自定义属性
  span.set_attribute('user.id', current_user.id)
  span.set_attribute('request.method', request.method)

  # 添加事件
  span.add_event('order_created', attributes: { 'order.id' => order.id, 'total' => order.total })

  # 业务逻辑代码
end

这些属性和事件会被APM Server存储到Elasticsearch,支持在Kibana中查看和搜索。


内容的提问来源于stack exchange,提问作者Pioz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:03:21