如何将JSON格式OTLP请求转为Protobuf并发送至Elastic APM?
解决Elastic APM OTLP/HTTP Protobuf格式转换与请求问题
正确的Content-Type
发送OTLP/HTTP Protobuf格式的追踪事件时,Content-Type必须设置为application/x-protobuf。
JSON转Protobuf并发送的几种方法
方法1:使用OpenTelemetry CLI(otel-cli)
这是最简便的方式,无需手动转换格式,工具会自动生成Protobuf负载并发送:
otel-cli span create \ --endpoint https://REDACTED.apm.ap-southeast-2.aws.found.io:443/v1/traces \ --header "Authorization: ApiKey REDACTED" \ --name "test" \ --trace-id 00000000000000000000000000000001 \ --span-id 0000000000000001 \ --start 1544712660300000000 \ --end 1544712660600000000
注意:OTLP标准端点是
/v1/traces,而非原请求中的/intake/v2/events,Elastic APM的OTLP端点使用这个标准路径。
方法2:使用protoc工具手动转换
- 获取OTLP的Protobuf定义文件:包括
trace.proto以及依赖的common.proto、resource.proto文件 - 将JSON数据转换为二进制Protobuf文件:
protoc --proto_path=. --encode=opentelemetry.proto.trace.v1.TracesData trace.proto < your-trace.json > trace.pb
- 用curl发送二进制文件:
curl --location --request POST 'https://REDACTED.apm.ap-southeast-2.aws.found.io/v1/traces' \ --header 'Content-Type: application/x-protobuf' \ --header 'Authorization: ApiKey REDACTED' \ --data-binary '@trace.pb'
方法3:在Postman中使用Protobuf插件
- 安装Postman的「Protobuf Support」插件
- 将OTLP的
trace.proto定义文件导入插件 - 请求中设置
Content-Type为application/x-protobuf,通过插件可视化界面填入追踪数据(对应原JSON中的字段),插件会自动生成Protobuf负载 - 添加
Authorization: ApiKey REDACTED请求头,发送到https://REDACTED.apm.ap-southeast-2.aws.found.io/v1/traces端点
关键注意事项
- Elastic APM的OTLP端点不需要
kbn-xsrf请求头,可直接移除 trace_id和span_id需符合OTLP规范:trace_id是16字节(32位十六进制字符串),span_id是8字节(16位十六进制字符串),原示例中的"1"需补全为符合长度的值(如00000000000000000000000000000001对应trace_id)
内容的提问来源于stack exchange,提问作者Ryan.Bartsch
相关产品推荐
相关产品推荐

