APISIX 介绍
APACHE APISIX(简称 APISIX)是 Apache 软件基金会下的顶级项目,由 API7.ai 开发并捐赠。它是一个具有动态、实时、高性能等特点的云原生 API 网关。可以使用 APISIX 网关作为所有业务的流量入口,它提供了动态路由、动态上游、动态证书、A/B 测试、灰度发布(金丝雀发布)、蓝绿部署、限速、防攻击、收集指标、监控报警、可观测、服务治理等功能。APISIX 以其高性能、灵活性和强大的功能,在微服务架构和云原生环境中得到了广泛的应用。
为确保 APISIX 高效、稳定和安全地运行,及时发现和解决运行中遇到的问题,我们需要对 APISIX 进行可观测,以便优化 APISIX 性能,保障业务连续性,并为用户提供更好的体验。
APISIX 的可观测性可分为三部分:指标、日志、链路追踪。APISIX 提供了丰富的可观测插件,通过使用和设置这些插件,来了解 API 行为,进而使整个业务流程更加清晰。接下来让我们逐个了解它们。
观测云
观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。
DataKit 是一个开源的、跨平台的数据收集和监控工具,由观测云开发并维护。它旨在帮助用户收集、处理和分析各种数据源,如日志、指标和事件,以便进行有效的监控和故障排查。为了实现对 APISIX 的可观测,需要部署 DataKit,并开通对应的指标、日志、链路采集器,本文使用 DataKit1.66.0 版本。
前置条件
- Kubernetes 集群
- Helm 部署 APISIX(3.11.0)、APISIX Dashboard
- 部署 DataKit Operator(1.5.10)
- 部署 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。
为 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.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 流量监控逐渐成为一个能够主动预防问题、优化性能和保障安全的重要工具。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。