监控 API

APISIX 中提供了很多具有丰富功能的可观测性插件。你可以通过使用和设置这些插件,来了解 API 行为,进而使整个业务流程更加清晰。

API 可观测性

API 可观测性已经成为 API 开发的一部分,因为它解决了与 API 一致性、可靠性和快速迭代 API 功能的相关问题。可观测性可分为三个关键部分:日志、指标、链路追踪,接下来让我们逐个了解它们。

Observability of three key areas

前提条件

在进行该教程之前,请确保你已经公开服务

日志

在 APISIX 中,日志可分为访问日志和错误日志。访问日志主要记录了每个请求的上下文信息,错误日志则是 APISIX 运行打印的日志信息,包括 NGINX 和插件相关的信息。APISIX 的日志存储在 ./apisix/logs/ 目录下。当然你可以通过一些 APISIX 的日志插件,将 APISIX 的日志发送到指定的日志服务中,APISIX 提供了以下插件:

你可以在 APISIX 插件中心 查看 APISIX 支持的所有日志插件。接下来我们将使用 http-logger 插件为你演示如何将 APISIX 的日志数据发送到 HTPP/HTTPS 服务器中。

监控 API - 图2注意

你可以使用 mockbin.com 生成一个模拟的 HTTP 服务器来存储和查看日志。

以下示例展示了在指定路由上启动 http-logger 的示例。

  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  2. -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  3. {
  4. "plugins": {
  5. "http-logger": {
  6. "uri": "http://mockbin.org/bin/5451b7cd-af27-41b8-8df1-282ffea13a61"
  7. }
  8. },
  9. "upstream_id": "1",
  10. "uri": "/get"
  11. }'
监控 API - 图3注意

你可以通过修改 uri 属性,将上述 http-logger 的服务器地址更换为你的服务器地址:

  1. {
  2. "uri": "http://mockbin.org/bin/5451b7cd-af27-41b8-8df1-282ffea13a61"
  3. }

创建成功后,你可以通过以下命令向 get 端点发送请求以生成日志。

  1. curl -i http://127.0.0.1:9080/get

请求成功后,你可以单击模拟服务器链接查看访问日志。

http-logger-plugin-test-screenshot

指标

指标是在⼀段时间内测量的数值。与⽇志不同,指标在默认情况下是结构化的,这使得查询和优化存储变得更加容易。而 APISIX 也提供了 Prometheus 的插件来获取你的 API 指标,并在 Prometheus 中暴露它们。通过使用 APISIX 提供的 Grafana 仪表板元数据,并从 Prometheus 中获取指标,更加方便地监控你的 API。

你可以通过以下命令启用 prometheus 插件:

  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  2. -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  3. {
  4. "uri": "/get",
  5. "plugins": {
  6. "prometheus": {}
  7. },
  8. "upstream_id": "1"
  9. }'

启用成功后,你可以通过 /apisix/prometheus/metrics 接口获取 APISIX 的指标。

  1. curl -i http://127.0.0.1:9091/apisix/prometheus/metrics

返回结果如下:

  1. HTTP/1.1 200 OK
  2. Server: openresty
  3. Content-Type: text/plain; charset=utf-8
  4. Transfer-Encoding: chunked
  5. Connection: keep-alive
  6. # HELP apisix_batch_process_entries batch process remaining entries
  7. # TYPE apisix_batch_process_entries gauge
  8. apisix_batch_process_entries{name="http logger",route_id="1",server_addr="172.19.0.8"} 0
  9. # HELP apisix_etcd_modify_indexes Etcd modify index for APISIX keys
  10. # TYPE apisix_etcd_modify_indexes gauge
  11. apisix_etcd_modify_indexes{key="consumers"} 17819
  12. apisix_etcd_modify_indexes{key="global_rules"} 17832
  13. apisix_etcd_modify_indexes{key="max_modify_index"} 20028
  14. apisix_etcd_modify_indexes{key="prev_index"} 18963
  15. apisix_etcd_modify_indexes{key="protos"} 0
  16. apisix_etcd_modify_indexes{key="routes"} 20028
  17. ...

你还可以通过 http://localhost:9090/targets 在 Prometheus 仪表板上查看端点的状态。

plu​​gin-orchestration-configure-rule-screenshot

如上图,APISIX 公开的指标端点已启动并正在运行。

现在,你可以查询 apisix_http_status 的指标,查看 APISIX 处理了哪些 HTTP 请求及其结果。

prometheus-plugin-dashboard-query-http-status-screenshot

除此之外,你还可以查看在本地实例中运行的 Grafana 仪表板。请访问 http://localhost:3000/

prometheus-plugin-grafana-dashboard-screenshot

目前,APISIX 还提供了其他两个关于指标的插件:

链路追踪

链路追踪就是将一次请求还原成调用链路,并将该请求的调用情况使用拓扑的方式展现,比如展示各个微服务节点上的耗时,请求具体经过了哪些服务器以及每个服务节点的请求状态等内容。

Zipkin 一个开源的分布式追踪系统。 APISIX 的 zipkin 插件 支持根据 Zipkin API 规范 收集链路信息并报告给 Zipkin Collector。

监控 API - 图8提示

使用该插件前,请确保你已经有一个正在运行的 Zipkin 实例。你可以使用 Docker 快速启动一个 Zipkin 实例:

  1. docker run -d -p 9411:9411 openzipkin/zipkin

你可以通过如下示例,在指定路由中启用 zipkin 插件:

  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  2. -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  3. {
  4. "methods": [
  5. "GET"
  6. ],
  7. "uri": "/get",
  8. "plugins": {
  9. "zipkin": {
  10. "endpoint": "http://127.0.0.1:9411/api/v2/spans",
  11. "sample_ratio": 1
  12. }
  13. },
  14. "upstream_id": "1"
  15. }'

你可以通过以下命令请求 APISIX:

  1. curl -i http://127.0.0.1:9080/get

如下所示,返回结果中的 header 部分附加了一些额外的跟踪标识符(TraceId、SpanId 和 ParentId):

  1. "X-B3-Parentspanid": "61bd3f4046a800e7",
  2. "X-B3-Sampled": "1",
  3. "X-B3-Spanid": "855cd5465957f414",
  4. "X-B3-Traceid": "e18985df47dab632d62083fd96626692",

你可以通过访问 http://127.0.0.1:9411/zipkin,在 Zinkin 的 Web UI 上看到请求链路。

Zipkin plugin output 1

Zipkin plugin output 2

你也可以通过另外两个插件进行链路追踪:

总结

API 可观测性是一种用于在 API 世界中管理应用程序的框架,APISIX 的插件可以通过集成到多个可观测性平台来帮助你监控 API,让你更专注于开发核心业务功能,无需为集成多个可观测性应用花费更多时间。