如何配置opentelemetry-sdk向Elasticsearch APM Server发送遥测数据?
如何配置opentelemetry-sdk gem将遥测数据发送至Elasticsearch APM Server?
问题背景
已按如下方式配置Rails应用,但APM Server接收请求后Kibana中无追踪记录:
- Gem依赖
# Gemfile gem 'opentelemetry-exporter-otlp' gem 'opentelemetry-instrumentation-all' gem 'opentelemetry-sdk'
- 初始化配置(
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')
- 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 Server
apm-server.auth.secret_token值完全一致 - Span处理器:
BatchSpanProcessor批量导出更稳定,适合生产环境 - 服务名称:确保
service_name与Kibana中筛选的服务名一致,便于查找数据
4. 验证步骤
- 重启Rails应用使配置生效
- 触发包含
Tracer.in_span的业务逻辑 - 查看APM Server日志,确认无解析错误
- 在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
相关产品推荐
相关产品推荐

