elasticsearch 通过cURL/Postman向Elastic APM发送手动OTLP/HTTP(opentelemetry)请求

e0bqpujr  于 2023-04-20  发布在  ElasticSearch
关注(0)|答案(1)|浏览(150)

我尝试通过Postman手动将OTLP/HTTP跟踪事件发送到Elastic APM(在Elastic Cloud中)。
我设法找到了一些OTLP跟踪请求的JSON示例,以生成以下cURL请求:

curl --location --request POST 'https://REDACTED.apm.ap-southeast-2.aws.found.io/intake/v2/events' \
--header 'Content-Type: application/json' \
--header 'kbn-xsrf: true' \
--header 'Authorization: ApiKey REDACTED' \
--data-raw '{
  "resource_spans": [
    {
      "scope_spans": [
        {
          "spans": [
            {
              "trace_id": "1",
              "span_id": "1",
              "name": "test",
              "start_time_unix_nano": 1544712660300000000,
              "end_time_unix_nano": 1544712660600000000
            }
          ]
        }
      ]
    }
  ]
}'

...但是我不能使用JSON到APM端点-APM Server supports both the (OTLP/gRPC) and (OTLP/HTTP) protocol with ProtoBuf payload. APM Server does not yet support JSON Encoding for OTLP/HTTP
如何将JSON消息转换为ProtoBuf,Content-Type是什么?

14ifxucb

14ifxucb1#

Content-Type将是application/x-protobuf。但是有效负载将是二进制的,所以curl不是最好的工具。
还有更合适的工具,例如protocurl(实际上,它只为curl准备正确格式的数据)。protocurl命令可能看起来像:

PAYLOAD=$(< trace.json)

protocurl \
 -i opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest \
 -o opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse \
 -u http://<domain>:<port>/v1/traces \
 -d "$PAYLOAD" -I . -v -D

这将生成请求(请注意请求二进制-这是实际的有效负载):

...
=========================== Request JSON     =========================== >>>
{"resource_spans":[{"resource":{"attributes":[{"key":"service.name", "value":{"string_value":"demo_lambda_x"}}, {"key":"telemetry.sdk.name", "value":{"string_value":"opentelemetry"}}, {"key":"telemetry.sdk.version", "value":{"string_value":"0.0.1"}}]}}]}
=========================== Request Binary   =========================== >>>
00000000  0a 6c 0a 6a 0a 1f 0a 0c  73 65 72 76 69 63 65 2e  |.l.j....service.|
00000010  6e 61 6d 65 12 0f 0a 0d  64 65 6d 6f 5f 6c 61 6d  |name....demo_lam|
00000020  62 64 61 5f 78 0a 25 0a  12 74 65 6c 65 6d 65 74  |bda_x.%..telemet|
00000030  72 79 2e 73 64 6b 2e 6e  61 6d 65 12 0f 0a 0d 6f  |ry.sdk.name....o|
00000040  70 65 6e 74 65 6c 65 6d  65 74 72 79 0a 20 0a 15  |pentelemetry. ..|
00000050  74 65 6c 65 6d 65 74 72  79 2e 73 64 6b 2e 76 65  |telemetry.sdk.ve|
00000060  72 73 69 6f 6e 12 07 0a  05 30 2e 30 2e 31        |rsion....0.0.1|
Found curl: /usr/local/bin/curl
Invoking curl http request.
Understood additional curl args: []
Total curl args:
  -s
  -X
  POST
  --data-binary
  @/tmp/protocurl-temp-366102455/request.bin
  --output
  /tmp/protocurl-temp-366102455/response.bin
  --dump-header
  /tmp/protocurl-temp-366102455/response-headers.txt
  -H
  Content-Type: application/x-protobuf
...

查看protocurl手册了解所有参数。当然,你需要protocull文件-这些是从人类友好的json到机器友好的二进制格式的“Map”-https://github.com/open-telemetry/opentelemetry-proto
很多麻烦。我会启动标准的otel收集器并正确配置它,例如将跟踪发送到APM。然后您可以使用curl将纯文本JSON格式的跟踪发送到otel收集器,收集器将在推送到APM之前执行该proto魔术。
顺便说一句:Postman supports GRPC,但它比普通的JSON请求更复杂。

相关问题