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

    前置条件

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

    联系我们

    加入社区

    微信扫码
    加入官方交流群

    立即体验

    在线开通,按量计费,真正的云服务!

    立即开始

    选择观测云版本

    代码托管平台