Prometheus
prometheus 插件提供了将 APISIX 与 Prometheus 集成的能力。
启用插件后,APISIX 将开始收集相关指标,例如 API 请求和延迟,并以基于文本的展示格式将它们导出到 Prometheus。然后,你可以在 Prometheus 中创建监控规则和告警,以监控 API 网关和 API 的健康状况。
指标
Prometheus 中有不同类型的指标。要了解它们的区别,请参阅 指标类型。
默认情况下,prometheus 插件会导出以下指标。有关示例,请参阅 获取 APISIX 指标。请注意,如果没有数据,某些指标(如 apisix_batch_process_entries)可能不会立即显示。
| 名称 | 类型 | 描述 |
|---|---|---|
| apisix_bandwidth | counter | 流经 APISIX 的总流量(以字节为单位)。 |
| apisix_etcd_modify_indexes | gauge | APISIX 键对 etcd 的更改次数。 |
| apisix_batch_process_entries | gauge | 批量发送数据时批次中的剩余条目数,例如使用 http logger 和其他日志插件时。 |
| apisix_etcd_reachable | gauge | APISIX 是否可以连接到 etcd。值 1 表示可达,0 表示不可达。 |
| apisix_http_status | counter | 返回给客户端的 HTTP 状态码。这是经过插件处理和代理后客户端实际收到的状态,可能与上游状态不同。 |
| apisix_http_requests_total | gauge | 来自客户端的 HTTP 请求数。 |
| apisix_nginx_http_current_connections | gauge | 当前与客户端的连接数。 |
| apisix_nginx_metric_errors_total | counter | nginx-lua-prometheus 错误总数。 |
| apisix_http_latency | histogram | HTTP 请求延迟(以毫秒为单位)。 |
| apisix_node_info | gauge | 有关 APISIX 节点的信息,例如主机名和 APISIX 版本。 |
| apisix_shared_dict_capacity_bytes | gauge | NGINX 共享字典 的总容量。 |
| apisix_shared_dict_free_space_bytes | gauge | NGINX 共享字典 中的剩余空间。 |
| apisix_upstream_status | gauge | 上游节点的健康检查状态,如果在上游配置了健康检查则可用。值 1 表示健康,0 表示不健康。 |
| apisix_stream_connection_total | counter | 每个流路由处理的连接总数。 |
| apisix_stream_active_connections | gauge | 每个流监听地址上活动的 TCP 连接与 UDP 会话数。需要 APISIX-Runtime。在 API7 企业版 3.9.x 系列中自 3.9.19 起支持,在 3.10.x 系列中自 3.10.6 起支持,并且在 APISIX 中自 3.18.0 起支持。 |
| apisix_stream_status | counter | 按终止状态、监听地址和上游节点统计的已结束流会话数。在 API7 企业版 3.9.x 系列中自 3.9.19 起支持,在 3.10.x 系列中自 3.10.6 起支持,并且在 APISIX 中自 3.18.0 起支持。 |
| apisix_stream_bandwidth | counter | 流子系统按监听地址、方向和连接侧代理的字节数。需要 APISIX-Runtime。在 API7 企业版 3.9.x 系列中自 3.9.19 起支持,在 3.10.x 系列中自 3.10.6 起支持,并且在 APISIX 中自 3.18.0 起支持。 |
| apisix_llm_prompt_tokens | counter | 提示词 Token 数量。仅对 AI 请求类型导出。自 API7 企业版 3.9.7 和 APISIX 3.17.0 起支持。 |
| apisix_llm_completion_tokens | counter | 补全 Token 数量。仅对 AI 请求类型导出。自 API7 企业版 3.9.7 和 APISIX 3.17.0 起支持。 |
| apisix_llm_latency | histogram | LLM 请求延迟,单位为毫秒。仅对 AI 请求类型导出。自 API7 企业版 3.9.7 和 APISIX 3.17.0 起支持。type 标签用于区分完整响应延迟(total)与流式请求的首 Token 时间(ttft),自 API7 企业版 3.9.14、3.10.1 和 APISIX 3.18.0 起引入。未指定 type 的查询会同时匹配两类观测值;如需保留此前的总延迟语义,请筛选 type="total"。每个流式请求会记录一个 total 样本和一个 ttft 样本。 |
| apisix_llm_active_connections | gauge | 正在处理的 LLM 上游请求数。仅对 AI 请求类型导出。自 API7 企业版 3.9.7 和 APISIX 3.17.0 起支持。 |
| apisix_llm_prompt_tokens_dist | histogram | 单个请求的提示词 Token 数量分布。仅对 AI 请求类型导出。自 API7 企业版 3.9.14、3.10.1 和 APISIX 3.18.0 起支持。 |
| apisix_llm_completion_tokens_dist | histogram | 单个请求的补全 Token 数量分布。仅对 AI 请求类型导出。自 API7 企业版 3.9.14、3.10.1 和 APISIX 3.18.0 起支持。 |
| apisix_ai_cache_hits_total | counter | 由 AI Cache 返回的请求数,按精确缓存层或语义缓存层区分。自 API7 企业版 3.9.16、3.10.3 和 APISIX 3.18.0 起支持。 |
| apisix_ai_cache_misses_total | counter | 未返回缓存响应的 AI Cache 查找次数。自 API7 企业版 3.9.16、3.10.3 和 APISIX 3.18.0 起支持。 |
| apisix_ai_cache_bypasses_total | counter | 绕过 AI Cache 查找的请求数。自 API7 企业版 3.9.16、3.10.3 和 APISIX 3.18.0 起支持。 |
| apisix_ai_cache_embedding_latency | histogram | 语义缓存层调用嵌入模型服务提供方的延迟,单位为毫秒。自 API7 企业版 3.9.16、3.10.3 和 APISIX 3.18.0 起支持。 |
仅当请求由 AI 插件(例如 AI Proxy)处理时,才会导出 LLM 指标(apisix_llm_prompt_tokens、apisix_llm_completion_tokens、apisix_llm_latency、apisix_llm_prompt_tokens_dist 和 apisix_llm_completion_tokens_dist)。未启用 AI 插件的路由不会生成这些指标。apisix_llm_active_connections 由 AI 插件直接管理,也仅存在于启用了 AI 的路由中。
当一次 LLM 上游尝试开始时,该 gauge 增加;请求进入日志阶段后,该 gauge 减少。对于单次尝试,它表示正在处理的 LLM 上游请求。使用 ai-proxy-multi 回退重试时,每次重试都会增加一个新的实例级时序,而请求只会使用最终实例的标签减少一次。因此,失败实例的时序可能会一直高于真实活动请求数,直到指标过期或存储被重置。
要减少 LLM 指标中的高基数标签,请使用插件元数据中的 disabled_labels,有选择地禁用 consumer 或 node 等标签。
提示词和补全 Token 直方图使用可配置的桶。有关默认值和配置方式,请参阅静态插件属性。
标签
标签 是指标的属性,用于区分指标。
例如,apisix_http_status 指标可以用 route 信息进行标记,以识别 HTTP 状态源自哪个路由。
以下是非详尽的 APISIX 指标及其描述的标签列表。
apisix_http_status 的标签
以下标签用于区分 apisix_http_status 指标。
| 名称 | 描述 |
|---|---|
| code | 上游节点返回的 HTTP 响应代码。 |
| route | 当 prefer_name 为 false(默认值)时,为 HTTP 状态源自的路由 ID;当 prefer_name 为 true 时,为路由名称。如果请求不匹配任何路由,则默认为空字符串。 |
| route_id | 仅在 Enterprise 中可用。无论 prefer_name 设置如何,HTTP 状态源自的路由 ID。 |
| matched_uri | 匹配请求的路由 URI。如果请求不匹配任何路由,则默认为空字符串。 |
| matched_host | 匹配请求的路由主机。如果请求不匹配任何路由,或者路由上未配置主机,则默认为空字符串。 |
| service | 当 prefer_name 为 false(默认值)时,为 HTTP 状态源自的服务 ID;当 prefer_name 为 true 时,为服务名称。如果匹配的路由不属于任何服务,则默认为路由上配置的主机值。 |
| service_id | 仅在 Enterprise 中可用。无论 prefer_name 设置如何,HTTP 状态源自的服务 ID。 |
| consumer | 与请求关联的消费者名称。如果请求没有关联消费者,则默认为空字符串。 |
| node | 上游节点的 IP 地址。 |
| gateway_group_id | HTTP 状态源自的网关组 ID。仅 API7 企业版可用。 |
| instance_id | HTTP 状态源自的网关实例 ID。仅 API7 企业版可用。 |
| api_product_id | HTTP 状态源自的产品 ID。仅 API7 企业版可用。 |
| request_type | 与 HTTP 状态关联的请求类型:traditional_http、websocket、ai_chat 或 ai_stream。以 101 Switching Protocols 应答的请求为 websocket,在 API7 企业版 3.9.x 系列中自 3.9.21 起引入,在 3.10.x 系列中自 3.10.7 起引入。 |
| request_llm_model | 客户端请求中指定的 LLM 模型。 |
| llm_model | 处理请求的 LLM 模型。 |
| response_source | HTTP 响应的来源:apisix(由 APISIX 生成,如插件拒绝或路由未找到)、nginx(NGINX 代理错误, 如连接被拒绝或上游超时)或 upstream(来自上游服务的真实响应)。该标签自 API7 企业版 3.9.10 和 APISIX 3.17.0 起提供。 |
| mcp_request_type | MCP 请求类型,例如 tools/list 或 tools/call。非 MCP 请求为空。自 API7 企业版 3.9.14 起支持。 |
| mcp_tool_name | tools/call 请求中的 MCP 工具名称,其他请求为空。自 API7 企业版 3.9.14 起支持。 |
response_source 是 apisix_http_status 的必需标签,每个既有状态标签组合最多可能新增三个时序。发布前请更新匹配完整标签集的 PromQL join、记录规则、告警和 Dashboard,并评估新增基数。
apisix_bandwidth 的标签
以下标签用于区分 apisix_bandwidth 指标。
| 名称 | 描述 |
|---|---|
| type | 流量类型,egress(出口)或 ingress(入口)。 |
| route | 当 prefer_name 为 false(默认值)时,为带宽对应的路由 ID;当 prefer_name 为 true 时,为路由名称。如果请求不匹配任何路由,则默认为空字符串。 |
| route_id | 仅在 Enterprise 中可用。无论 prefer_name 设置如何,带宽对应的路由 ID。 |
| service | 当 prefer_name 为 false(默认值)时,为带宽对应的服务 ID;当 prefer_name 为 true 时,为服务名称。如果匹配的路由不属于任何服务,则默认为路由 上配置的主机值。 |
| service_id | 仅在 Enterprise 中可用。无论 prefer_name 设置如何,带宽对应的服务 ID。 |
| consumer | 与请求关联的消费者名称。如果请求没有关联消费者,则默认为空字符串。 |
| node | 上游节点的 IP 地址。 |
| gateway_group_id | 仅在 Enterprise 中可用。带宽对应的网关组 ID。 |
| instance_id | 仅在 Enterprise 中可用。带宽对应的网关实例 ID。 |
| api_product_id | 仅在 Enterprise 中可用。带宽对应的产品 ID。 |
| request_type | 带宽对应的请求类型:traditional_http、websocket、ai_chat 或 ai_stream。以 101 Switching Protocols 应答的请求为 websocket,在 API7 企业版 3.9.x 系列中自 3.9.21 起引入,在 3.10.x 系列中自 3.10.7 起引入。 |
| request_llm_model | 仅在企业版(自 3.9.7 起)可用。客户端请求中指定的 LLM 模型。 |
| llm_model | 仅在 Enterprise 中可用。带宽对应的 LLM 模型。 |
| mcp_request_type | 仅在企业版(自 3.9.14 版本起)可用。MCP 请求类型,例如 tools/list 或 tools/call。非 MCP 请求为空。 |
| mcp_tool_name | 仅在企业版(自 3.9.14 版本起)可用。tools/call 请求中的 MCP 工具名称,其他请求为空。 |
apisix_http_latency 的标签
以下标签用于区分 apisix_http_latency 指标。
| 名称 | 描述 |
|---|---|
| type | 延迟类型。有关详细信息,请参阅 延迟类型。 |
| route | 当 prefer_name 为 false(默认值)时,为延迟对应的路由 ID;当 prefer_name 为 true 时,为路由名称。如果请求不匹配任何路由,则默认为空字符串。 |
| route_id | 仅在 Enterprise 中可用。无论 prefer_name 设置如何,延迟对应的路由 ID。 |
| service | 当 prefer_name 为 false(默认值)时,为延迟对应的服务 ID;当 prefer_name 为 true 时,为服务名称。如果匹配的路由不属于任何服务,则默认为路由上配置的主机值。 |
| service_id | 仅在 Enterprise 中可用。无论 prefer_name 设置如何,延迟对应的服务 ID。 |
| consumer | 与延迟关联的消费者名称。如果请求没有关联消费者,则默认为空字符串。 |
| node | 与延迟关联的上游节点的 IP 地址。 |
| gateway_group_id | 仅在 Enterprise 中可用。延迟对应的网关组 ID。 |
| instance_id | 仅在 Enterprise 中可用。延迟对应的网关实例 ID。 |
| api_product_id | 仅在 Enterprise 中可用。延迟对应的产品 ID。 |
| request_type | 延迟对应的请求类型:traditional_http、websocket、ai_chat 或 ai_stream。以 101 Switching Protocols 应答的请求为 websocket,在 API7 企业版 3.9.x 系列中自 3.9.21 起引入,在 3.10.x 系列中自 3.10.7 起引入。 |
| request_llm_model | 仅在企业版(自 3.9.7 起)可用。客户端请求中指定的 LLM 模型。 |
| llm_model | 仅在 Enterprise 中可用。延迟对应的 LLM 模型。 |
| mcp_request_type | 仅在企业版(自 3.9.14 版本起)可用。MCP 请求类型,例如 tools/list 或 tools/call。非 MCP 请求为空。 |
| mcp_tool_name | 仅在企业版(自 3.9.14 版本起)可用。tools/call 请求中的 MCP 工具名称,其他请求为空。 |
延迟类型
apisix_http_latency 可以用以下三种类型之一进行标记:
-
request表示从客户端读取第一个字节到向客户端发送最后一个字节后的日志写入之间经过的时间。 -
upstream表示等待上游服务响应所经过的时间。 -
apisix表示request延迟与upstream延迟之间的差值。
对于 WebSocket 会话,request 和 upstream 延迟衡量的是升级后的连接保持打开的时长,而不是一次请求-响应往返。在 API7 企业版 3.9.x 系列中自 3.9.21 起、在 3.10.x 系列中自 3.10.7 起,这类请求带有 request_type="websocket",因此可以用 request_type!="websocket" 把它们排除在延迟查询之外。
换句话说,APISIX 延迟不仅仅归因于 Lua 处理。它应该理解如下:
APISIX latency
= downstream request time - upstream response time
= downstream traffic latency + NGINX latency
apisix_upstream_status 的标签
以下标签用于区分 apisix_upstream_status 指标。
| 名称 | 描述 |
|---|---|
| name | 配置了健康检查的上游对应的资源 ID,例如 /apisix/routes/1 和 /apisix/upstreams/1。 |
| ip | 上游节点的 IP 地址。 |
| port | 节点的端口号。 |
流指标的标签
apisix_stream_active_connections 以流监听地址作为标签:
| 名称 | 描述 |
|---|---|
listen_addr | APISIX 接受该 TCP 连接或 UDP 会话的地址,例如 0.0.0.0:9100。 |
apisix_stream_status 在每个流会话结束时记录一次:
| 名称 | 描述 |
|---|---|
code | 会话的结束方式。200 表示正常关闭。400 表示客户端侧的问题,例如客户端重置连接或发送了无效数据。403 表示被访问规则拒绝。500 表示内部错误。502 表示上游或传输层问题,例如连接失败、重置或空闲超时。503 表示被连接数限制拒绝。 |
listen_addr | APISIX 接受该会话的地址。 |
node | 选中的上游地址,形式为 IP:端口。会话在 APISIX 选出上游之前结束时为空。 |
对于上游连接建立之后发生的部分失败,NGINX 报告的 Stream $status 仍为 200。该指标改用会话终止原因来区分正常关闭与之后的超时或重置。worker 关闭以及未记录到可识别原因时同样使用 200。
apisix_stream_bandwidth 在会话保持打开期间持续更新:
| 名称 | 描述 |
|---|---|
listen_addr | APISIX 接受该会话的地址。 |
type | 流量方向:ingress 或 egress。 |
side | 连接侧:downstream 或 upstream。 |
apisix_llm_latency 的标签
以下标签用于区分 apisix_llm_latency 指标。
| 名称 | 描述 |
|---|---|
| type | LLM 延迟类型:total 表示完整响应延迟,ttft 表示流式请求的首 Token 时间。自 API7 企业版 3.9.14、3.10.1 和 APISIX 3.18.0 起引入。此前将每个 apisix_llm_latency 样本 都视为总延迟的 Dashboard、告警和记录规则必须添加 type="total"。 |
| route | 当 prefer_name 为 false(默认值)时,为 HTTP 状态源自的路由 ID;当 prefer_name 为 true 时,为路由名称。如果请求不匹配任何路由,则默认为空字符串。 |
| route_id | 无论 prefer_name 设置如何,HTTP 状态源自的路由 ID。 |
| service | 当 prefer_name 为 false(默认值)时,为 HTTP 状态源自的服务 ID;当 prefer_name 为 true 时,为服务名称。如果匹配的路由不属于任何服务,则默认为路由上配置的主机值。 |
| service_id | 无论 prefer_name 设置如何,HTTP 状态源自的服务 ID。 |
| consumer | 与请求关联的消费者名称。如果请求没有关联消费者,则默认为空字符串。 |
| node | ai-proxy 或 ai-proxy-multi 选中的 LLM 实例名称,而不是上游 IP 地址。 |
| gateway_group_id | HTTP 状态源自的网关组 ID。 |
| instance_id | HTTP 状态源自的网关实例 ID。 |
| api_product_id | HTTP 状态源自的产品 ID。 |
| request_type | HTTP 状态源自的请求类型。 |
| request_llm_model | 客户端请求中发送的模型名称。自 API7 企业版 3.9.7 和 APISIX 3.17.0 起引入。 |
| llm_model | 网关实际使用的目标模型。如果 AI 实例配置了模型,则使用该值;否则使用客户端请求的模型。 |
其他 LLM 指标的标签
以下标签用于区分 apisix_llm_prompt_tokens、apisix_llm_completion_tokens、apisix_llm_active_connections、apisix_llm_prompt_tokens_dist 和 apisix_llm_completion_tokens_dist 指标。
| 名称 | 描述 |
|---|---|
| route | 当 prefer_name 为 false(默认值)时,为 HTTP 状态源自的路由 ID;当 prefer_name 为 true 时,为路由名称。如果请求不匹配任何路由,则默认为空字符串。 |
| route_id | 无论 prefer_name 设置如何,HTTP 状态源自的路由 ID。 |
| matched_uri | 匹配请求的路由 URI。如果请求不匹配任何路由,则默认为空字符串。 |
| matched_host | 匹配请求的路由主机。如果请求不匹配任何路由,或者路由上未配置主机,则默认为空字符串。 |
| service | 当 prefer_name 为 false(默认值)时,为 HTTP 状态源自的服务 ID;当 prefer_name 为 true 时,为服务名称。如果匹配的路由不属于任何服务,则默认为路由上配置的主机值。 |
| service_id | 无论 prefer_name 设置如何,HTTP 状态源自的服务 ID。 |
| consumer | 与请求关联的消费者名称。如果请求没有关联消费者,则默认为空字符串。 |
| node | ai-proxy 或 ai-proxy-multi 选中的 LLM 实例名称,而不是上游 IP 地址。 |
| gateway_group_id | HTTP 状态源自的网关组 ID。 |
| instance_id | HTTP 状态源自的网关实例 ID。 |
| api_product_id | HTTP 状态源自的产品 ID。 |
| request_type | HTTP 状态源自的请求类型。 |
| request_llm_model | 客户端请求中发送的模型名称。自 API7 企业版 3.9.7 和 APISIX 3.17.0 起引入。 |
| llm_model | 网关实际使用的目标模型。如果 AI 实例配置了模型,则使用该值;否则使用客户端请求的模型。 |
提示词与补全 Token 计数器和分布直方图在不同产品中使用不同的标签集。APISIX 导出 route_id、service_id、consumer、node、request_type、request_llm_model 和 llm_model。API7 企业版还导出 route、matched_uri、matched_host 和 service,以及网关实例和 API 产品标签。
request_llm_model 和 llm_model 的值来自客户端和服务提供方数据,最长为 128 字节。自 API7 企业版 3.9.14、3.10.1 和 APISIX 3.18.0 起引入。如果不需要按模型拆分时序,请禁用这些标签。
AI Cache 指标的标签
四个 AI Cache 指标共享以下标签。只有 apisix_ai_cache_hits_total 包含 layer。
| 名称 | 描述 |
|---|---|
layer | 返回缓存命中的缓存层:exact 或 semantic。该结构性标签不能禁用。 |
route | 路由名称;如果路由没有名称,则为空字符串。 |
route_id | 路由 ID。 |
service | 服务名称;如果路由未引用服务,则为空字符串。 |
service_id | 服务 ID;如果路由未引用服务,则为空字符串。 |
consumer | Consumer 名称;如果请求未关联 Consumer,则为空字符串。 |
node | ai-proxy 或 ai-proxy-multi 选中的 LLM 实例名称,而不是上游 IP 地址。 |
request_type | 请求类型,例如 ai_chat 或 ai_stream。 |
request_llm_model | 客户端请求中发送的模型名称。 |
llm_model | 网关实际使用的目标模型。如果 AI 实例配置了模型,则使用该值;否则使用客户端请求的模型。缓存命中时不会访问 LLM,因此该值为空。 |
API7 企业版还为这些指标导出 matched_uri、matched_host,以及网关实例和 API 产品标签。
示例
下面的示例展示了如何在不同场景下使用 prometheus 插件。
获取 APISIX 指标
以下示例展示了如何从 APISIX 获取指标。
默认的 Prometheus 指标端点和其他 Prometheus 相关配置可以在静态配置中找到。如果你想自定义这些配置,请参阅配置文件。
如果你在容器化环境中部署网关,并希望从外部访问 Prometheus 指标端点,请在网 关静态配置中更新 Prometheus 导出地址:
- Host or Docker
- Kubernetes (Helm)
在网关配置文件中新增或更新以下配置:
plugin_attr:
prometheus:
export_addr:
ip: 0.0.0.0
重新加载网关以使更改生效。
对于 APISIX Helm Chart,在 Chart values 中启用 Prometheus。该配置会将 plugin_attr.prometheus.export_addr.ip 渲染为 0.0.0.0:
apisix:
prometheus:
enabled: true
对于 API7 网关 Helm Chart,更新 Prometheus 插件属性:
pluginAttrs:
prometheus:
export_addr:
ip: 0.0.0.0
port: 9091
然后使用当前网关 release 对应的 Chart 应用 values 文件:
helm upgrade <release-name> <chart-name> -n <namespace> -f values.yaml
向 APISIX Prometheus 指标端点发送请求:
curl "http://127.0.0.1:9091/apisix/prometheus/metrics"
你应该看到类似于以下的输出:
# HELP apisix_bandwidth Total bandwidth in bytes consumed per service in Apisix
# TYPE apisix_bandwidth counter
apisix_bandwidth{type="egress",route="",service="",consumer="",node=""} 8417
apisix_bandwidth{type="egress",route="1",service="",consumer="",node="127.0.0.1"} 1420
apisix_bandwidth{type="egress",route="2",service="",consumer="",node="127.0.0.1"} 1420
apisix_bandwidth{type="ingress",route="",service="",consumer="",node=""} 189
apisix_bandwidth{type="ingress",route="1",service="",consumer="",node="127.0.0.1"} 332
apisix_bandwidth{type="ingress",route="2",service="",consumer="",node="127.0.0.1"} 332
# HELP apisix_etcd_modify_indexes Etcd modify index for APISIX keys
# TYPE apisix_etcd_modify_indexes gauge
apisix_etcd_modify_indexes{key="consumers"} 0
apisix_etcd_modify_indexes{key="global_rules"} 0
...