APISIX 可观测性最佳实践
本文介绍如何通过观测云采集 APISIX 指标、日志、链路数据,优化 APISIX 性能,保障业务连续性,并为用户提供更好的体验。
APISIX 介绍
APACHE APISIX(简称 APISIX)是 Apache 软件基金会下的顶级项目,由 API7.ai 开发并捐赠。它是一个具有动态、实时、高性能等特点的云原生 API 网关。可以使用 APISIX 网关作为所有业务的流量入口,它提供了动态路由、动态上游、动态证书、A/B 测试、灰度发布(金丝雀发布)、蓝绿部署、限速、防攻击、收集指标、监控报警、可观测、服务治理等功能。APISIX 以其高性能、灵活性和强大的功能,在微服务架构和云原生环境中得到了广泛的应用。
为确保 APISIX 高效、稳定和安全地运行,及时发现和解决运行中遇到的问题,我们需要对 APISIX 进行可观测,以便优化 APISIX 性能,保障业务连续性,并为用户提供更好的体验。
APISIX 的可观测性可分为三部分:指标、日志、链路追踪。APISIX 提供了丰富的可观测插件,通过使用和设置这些插件,来了解 API 行为,进而使整个业务流程更加清晰。接下来让我们逐个了解它们。

观测云
观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。
DataKit 是一个开源的、跨平台的数据收集和监控工具,由观测云开发并维护。它旨在帮助用户收集、处理和分析各种数据源,如日志、指标和事件,以便进行有效的监控和故障排查。为了实现对 APISIX 的可观测,需要部署 DataKit,并开通对应的指标、日志、链路采集器,本文使用 DataKit1.69.1 版本。
前置条件
- Kubernetes 集群
- Helm 部署 APISIX(3.11.0)、APISIX Dashboard
- 部署 DataKit Operator(1.5.12)
- 部署 Java 测试微服务
部署 DataKit
登录观测云控制台,点击「集成」 -「DataKit」 - 「Kubernetes」,下载 datakit.yaml,拷贝第 3 步中的 token。

编辑 datakit.yaml ,把 token 粘贴到 ENV_DATAWAY 环境变量值中“token=”后面,设置环境变量 ENV_CLUSTER_NAME_K8S 的值并增加环境变量 ENV_NAMESPACE,这两个环境变量的值一般和集群名称对应,一个工作空间集群名称要唯一。
- name: ENV_NAMESPACE
value: xxxx

把 datakit.yaml 上传到可以连接到 Kubernetes 集群的主机上,执行如下命令。
kubectl apply -f datakit.yaml
kubectl get pod -n datakit
数据采集步骤
1、配置 APISIX
APISIX 的插件开启是在 config.yaml 中,本文采用的是 helm 安装 APISIX 时,使用 helm pull 把 apisix 包拉下来,在 values.yaml 中开启插件。
修改 values.yaml 内容如下图,开启 opentelemetry 插件上报链路、开启 prometheus 插件暴露指标、开启 http-logger 插件输出日志。本示例 Apisix Service 端口 30080,Apisix Dashboard 端口 30081。
- prometheus 插件
apisix:
prometheus:
enabled: true
path: /apisix/prometheus/metrics
metricPrefix: apisix_
containerPort: 9091
plugins:
- prometheus
- http-logger 日志插件
apisix:
plugins:
- http-logger
- opentelemetry 插件
apisix:
plugins:
- opentelemetry
pluginAttrs:
opentelemetry:
resource:
service.name: APISIX
tenant.id: business_id
collector:
address: datakit-service.datakit.svc:9529/otel
request_timeout: 3

- Dashboard 配置
插件界面开启 prometheus。

插件界面开启 opentelemetry。
{
"_meta": {
"disable": false
},
"disable": false,
"sampler": {
"name": "always_on"
}
}

为 Java 微服务配置上游服务和路由,在路由中开启 http-logger 插件,输入下面内容,其中 “apisix_logstreaming” 将显示在观测云日志查看器的数据来源中 。
{
"batch_max_size": 1,
"uri": "http://datakit-service.datakit.svc:9529/v1/write/logstreaming?source=apisix_logstreaming"
}

2、DataKit 开通采集器
DataKit 需要开启指标(KubernetesPrometheus )、日志(Log Streaming)、链路(OTEL)采集器。
- KubernetesPrometheus 采集器
编辑 datakit.yaml,ConfigMap 中增加 apisix.conf 部分。
apiVersion: v1
kind: ConfigMap
metadata:
name: datakit-conf
namespace: datakit
data:
apisix.conf: |-
[inputs.kubernetesprometheus]
node_local = true
scrape_interval = "30s"
keep_exist_metric_name = false
[[inputs.kubernetesprometheus.instances]]
role = "pod"
namespaces = ["apisix"]
selector = "app.kubernetes.io/name=apisix"
scrape = "true"
scheme = "http"
port = "9091"
path = "/apisix/prometheus/metrics"
interval = "30s"
[inputs.kubernetesprometheus.instances.custom]
measurement = "apisix"
job_as_measurement = false
[inputs.kubernetesprometheus.instances.custom.tags]
node_name = "__kubernetes_pod_node_name"
namespace = "__kubernetes_pod_namespace"
pod_name = "__kubernetes_pod_name"
instance = "__kubernetes_mate_instance"
host = "__kubernetes_mate_host"
注意 apisix 部署在 apisix namespace下面,如果部署在其它 namespace下面,需要修改上面 namespaces 的值。
再把 apisix.conf 挂载到 DataKit 的 /usr/local/datakit/conf.d/kubernetesprometheus/ 目录。
- mountPath: /usr/local/datakit/conf.d/kubernetesprometheus/apisix.conf
name: datakit-conf
subPath: apisix.conf

- OTEL 采集器
编辑 datakit.yaml,在 ENV_DEFAULT_ENABLED_INPUTS 环境变量值中添加“opentelemetry”,增加 ENV_INPUT_DDTRACE_COMPATIBLE_OTEL 环境变量, 用来开启 OTEL 和 DDTrace 兼容。
- name: ENV_INPUT_DDTRACE_COMPATIBLE_OTEL
value: 'true'

- Log Streaming 采集器
编辑 datakit.yaml,在 ENV_DEFAULT_ENABLED_INPUTS 环境变量值中添加“logstreaming”。

最后,重新部署 DataKit。
3、Pipeline
使用 Pipeline 把日志中的 trace_id 提取出来,观测云会自动实现链路和日志的关联。
登录观测云控制台,点击「日志」 -「Pipelines」 - 「新建Pipeline」,过滤中选择 “apisix_logstreaming” 。

输入解析规则,点击“保存”。
jsonData=load_json(_)
requestJson = jsonData["request"]
responseJson = jsonData["response"]
add_key(http_status,responseJson["status"])
add_key(url,requestJson["url"])
add_key(client_ip,jsonData["client_ip"])
trace_id = requestJson["headers"]["traceparent"]
grok(trace_id, "%{DATA}-%{DATA:trace_id}-%{DATA}")

4、请求链路
查看 apisix-gateway 对外端口是 30080,访问 http://xx.xx.xx.xx:30080/server/gateway 产生链路和日志。

关键指标
HTTP 请求和响应指标
apisix_http_request_total:记录了通过 APISIX 的 HTTP 请求总数。它可以用来观察系统的整体流量。apisix_http_latency_bucket:用于记录 APISIX 中每个服务的 HTTP 请求延迟分布。可以帮助我们了解不同延迟区间内的请求数量。apisix_http_latency_count:表示在 APISIX 中每个服务的 HTTP 请求总数。apisix_http_latency_sum:表示在 APISIX 中每个服务的 HTTP 请求延迟总和,单位是毫秒。
Nginx 指标
apisix_nginx_http_current_connections:表示当前 Nginx 的 HTTP 连接数。apisix_nginx_metric_errors_total:用于记录 Nginx-lua-prometheus 导出器产生的错误总数。
ETCD 指标
apisix_etcd_modify_indexes:表示APISIX 键在 etcd 中的修改索引。apisix_etcd_reachable:用于指示配置服务器 etcd 是否可以从 APISIX 达到。
流量指标
apisix_bandwidth:上行和下行的带宽使用情况。
错误和异常指标
apisix_http_status:HTTP 响应状态码的分布,特别是 4xx 和 5xx 错误,这对于识别潜在的问题很重要。
场景视图
登录观测云控制台,点击「场景」 -「新建仪表板」,输入 “APISIX”, 选择 “APISIX 监控视图”,点击 “确定”。

点击「应用性能监测」 -「链路」,服务选择“APISIX”,点击一条 span 查看服务调用关系、火焰图、日志等信息。


监控器(告警)
4XX 错误数量过高
简要描述:API 调用过程中出现的错误次数也是一个重要的告警指标。高错误率可能意味着服务不稳定或存在bug。

5XX 错误数量过高
简要描述:API 调用过程中出现的错误次数也是一个重要的告警指标。高错误率可能意味着服务不稳定或存在bug。

P90 请求延时过高
简要描述:请求延迟是指 API 从接收到处理完成所需的时间。过长的处理延迟可能表明后端服务处理能力不足或存在性能瓶颈。

总结
Apache APISIX 通过集成观测云,可以帮助企业获得对其 API 基础设施的深入洞察,确保其以高效和安全的方式运行,使得 API 流量监控逐渐成为一个能够主动预防问题、优化性能和保障安全的重要工具。
Contact us
Join the community
to join the community
Try Guance
Start online and pay only for what you use.
Get startedChoose a Guance plan