头图

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 版本。

前置条件

部署 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 流量监控逐渐成为一个能够主动预防问题、优化性能和保障安全的重要工具。


观测云
21 声望85 粉丝

云时代的系统可观测平台


引用和评论

0 条评论