加载中

托管摄入服务事件 API

警告

此 API 专为 APM 代理开发人员设计。绝大多数用户没有理由与此 API 进行交互。

托管摄取服务公开了以下内容的端点:

托管摄取服务公开了一个用于查询通用服务器信息的 API 端点。这个轻量级端点可用作服务器的上下线健康检查。

向服务器信息端点发送 HTTP GET 请求

https://{hostname}:{port}/
		

此端点始终返回 HTTP 200。

对此端点的请求必须经过身份验证。

托管摄取服务信息请求示例

curl -X POST http://127.0.0.1:8200/ \
  -H "Authorization: ApiKey api_key"

{
  "build_date": "2021-12-18T19:59:06Z",
  "build_sha": "24fe620eeff5a19e2133c940c7e5ce1ceddb1445",
  "publish_ready": true,
  "version": "8.16.1"
}
		
注意

大多数用户不需要直接与事件摄取 API 进行交互。

事件摄取 API 是我们所说的 APM 代理与托管摄取服务通信所使用的内部协议。代理通过在 HTTP 请求中发送事件(捕获的信息片段)来与服务器通信。事件可以是

  • 事务
  • 跨度(Spans)
  • 错误
  • 指标聚合 (Metrics)

每个事件作为 HTTP 请求正文中的独立行发送。这被称为 换行符分隔的 JSON (NDJSON)

使用 NDJSON,代理可以打开 HTTP POST 请求,并在代理中记录事件后立即使用分块编码将事件流式传输到托管摄取服务。这使得代理可以轻松地将每个事件序列化为换行符分隔的 JSON 流。托管摄取服务还将 HTTP 正文视为压缩流,从而独立读取和处理每个事件。

请参阅了解数据类型以详细了解不同类型的事件。

托管摄取服务公开了以下用于 Elastic APM 代理数据摄取的端点

名称 端点
APM 代理事件摄取 /intake/v2/events

向托管摄取服务的 intake/v2/events 端点发送 HTTP POST 请求

https://{hostname}:{port}/intake/v2/events
		

托管摄取服务支持批处理的异步处理。要请求异步处理,可以在对 intake/v2/events 端点的 POST 请求中设置 async 查询参数

https://{hostname}:{port}/intake/v2/events?async=true
		
注意

由于异步处理将部分事件处理推迟到后台,并且在客户端关闭请求之后进行,因此某些错误无法传回给客户端,而是由托管摄取服务记录。此外,只有在托管摄取服务能够处理传入请求时,才会调度异步处理请求,无法处理的请求将收到内部错误 503“队列已满”(queue is full) 错误。

成功后,服务器将响应 202 Accepted 状态码且无正文。

请记住,事件可以相互独立地成功或失败。只有所有事件都成功,服务器才会响应 202。

托管摄取服务可能会向代理返回两种类型的错误

  • 事件相关错误(通常是验证错误)
  • 非事件相关错误

托管摄取服务会逐个处理事件。如果在处理事件时遇到错误,则所遇到的错误以及导致错误的文档将被添加到内部数组中。托管摄取服务只会保存 5 个事件相关错误。如果遇到超过 5 个事件相关错误,则不会将额外的错误返回给代理。处理完所有事件后,将发送错误响应。

某些与特定事件无关的错误可能会立即终止请求。例如:达到 IP 速率限制、元数据错误等。如果在任何时候遇到这些错误之一,它将被添加到内部数组并立即返回。

错误响应示例可能如下所示

{
  "errors": [
    {
      "message": "<json-schema-err>",
      "document": "<ndjson-obj>"
    },{
      "message": "<json-schema-err>",
      "document": "<ndjson-obj>"
    },{
      "message": "<json-decoding-err>",
      "document": "<ndjson-obj>"
    },{
      "message": "too many requests"
    },
  ],
  "accepted": 2320
}
		
  1. 事件相关错误
  2. 导致错误的文档
  3. 立即返回的非事件相关错误
  4. 接受的事件数量

如果您正在开发代理,这些错误对于调试会很有用。

托管摄取服务使用一系列 JSON 架构来验证对摄取 API 的请求。

与托管摄取服务的每个新连接都以 metadata 段开始。这提供了关于流中其他对象的通用元数据。

托管摄取服务不会让代理多次发送此元数据信息,而是保留此信息,并在必要时将其应用于流中的其他对象。

提示

在 Elasticsearch 中查看文档时,元数据存储在 context 下。

托管摄取服务使用 JSON 架构来验证请求。元数据的规范定义在 GitHub 上,并包含在下方。

APM 代理会自动读取 Kubernetes 数据并将其发送到托管摄取服务。在大多数情况下,代理能够从容器内部读取此数据。如果并非如此,或者您希望覆盖此数据,您可以设置供代理读取的环境变量。这些环境变量通过 Kubernetes Downward API 进行设置。以下是如何将环境变量添加到您的 Kubernetes pod 规范中的方法

- name: KUBERNETES_NODE_NAME
   valueFrom:
     fieldRef:
       fieldPath: spec.nodeName
 - name: KUBERNETES_POD_NAME
   valueFrom:
     fieldRef:
       fieldPath: metadata.name
 - name: KUBERNETES_NAMESPACE
   valueFrom:
     fieldRef:
       fieldPath: metadata.namespace
 - name: KUBERNETES_POD_UID
   valueFrom:
     fieldRef:
       fieldPath: metadata.uid
		

下表将这些环境变量映射到 APM 元数据事件字段

环境变量 元数据字段名称
KUBERNETES_NODE_NAME system.kubernetes.node.name
KUBERNETES_POD_NAME system.kubernetes.pod.name
KUBERNETES_NAMESPACE system.kubernetes.namespace
KUBERNETES_POD_UID system.kubernetes.pod.uid

事务是与受监视服务中发生的传入请求或类似任务相对应的事件。

托管摄取服务使用 JSON 架构来验证请求。事务的规范定义在 GitHub 上,并包含在下方。

跨度是由代理捕获的在受监视服务中发生的事件。

托管摄取服务使用 JSON 架构来验证请求。跨度的规范定义在 GitHub 上,并包含在下方。

由代理捕获的在受监视服务中发生的错误或记录的错误消息。

托管摄取服务使用 JSON 架构来验证请求。错误的规范定义在 GitHub 上,并包含在下方。

指标包含由 APM 代理捕获的应用指标数据。

托管摄取服务使用 JSON 架构来验证请求。指标的规范定义在 GitHub 上,并包含在下方。

Elastic 支持通过 OpenTelemetry 协议 (OTLP) 接收跟踪、指标和日志。OTLP 是 OpenTelemetry 的默认传输协议,托管摄取服务对此提供了本地支持。

托管摄取服务在同一端口上支持两种 OTLP 通信协议

  • OTLP/HTTP (protobuf)
  • OTLP/gRPC
名称 端点
OTLP 指标摄取 /opentelemetry.proto.collector.metrics.v1.MetricsService/Export
OTLP 跟踪摄取 /opentelemetry.proto.collector.trace.v1.TraceService/Export
OTLP 日志摄取 /opentelemetry.proto.collector.logs.v1.LogsService/Export
名称 端点
OTLP 指标摄取 /v1/metrics
OTLP 跟踪摄取 /v1/traces
OTLP 日志摄取 /v1/logs
提示

请参阅我们的 OpenTelemetry 文档以了解如何从 OpenTelemetry 代理或 OpenTelemetry 收集器向托管摄取服务发送数据。

© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.