0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何构建APISIX基于DeepFlow的统一可观测性能力呢?

Linux阅码场 来源:DeepFlow 2024-01-18 10:11 次阅读

随着应用组件的可观测性逐渐受到重视,Apache APISIX 引入插件机制丰富了可观测数据源。然而,这些数据分散在多个平台,形成了数据孤岛。本文旨在阐述如何利用 DeepFlow 基于 eBPF 的零侵扰特性构建 APISIX 可观测性解决方案,在此基础上统一集成 APISIX 插件已有的丰富数据源,消除孤岛、构建统一的可观测性平台,以全面监控和分析 APISIX 网关。通过 DeepFlow,APISIX 可以实现从流量监控、追踪分析、到性能优化的全面可观测性,消除数据分散并提供中心化的监控视图,加速故障排查和性能调优,让 DevOps 和 SRE 团队的工作更加高效。本文将重点梳理 APISIX 的追踪数据、指标数据、访日日志及性能剖析数据如何对接 DeepFlow。

e11bcfd6-b5a2-11ee-8b88-92fbcf53809c.png

基于 DeepFlow 构建 APISIX 的统一可观测性能力

01

安装 APISIX 和 DeepFlow

基于 DeepFlow 建构 APISIX 的统一可观测性能力,需要先将 DeepFlow 及 APISIX 都部署起来。本文为了方便,将 DeepFlow 和 APISIX 都以 K8s 服务的形式部署在一个 All-in-One 的 K8s 集群中,整个部署过程大概 5 分钟左右完成。详细的部署过程,参考 DeepFlow 官方部署文档[1]及 APISIX 官方部署文档[2]。

注意:为了发挥 DeepFlow 基于 eBPF 的可观测性能力,请确保服务器 Linux 操作系统内核在 4.14 之上。

02

分布式追踪

使用 DeepFlow 实现 APISIX 及后端服务的分布式追踪能力有两种方案:利用 eBPF,DeepFlow 可以在不修改 APISIX 及后端服务配置及代码的前提下实现开箱即用的 RPC 粒度分布式追踪;而当后端服务已具备 APM(Application Performance Monitoring) 能力 —— 比如已经使用了 OpenTelemetry 或者 SkyWalking 等工具时,可结合 APISIX 的 Tracers 插件,将所有追踪数据统一集成到 DeepFlow,实现全链路的应用函数粒度的分布式追踪。

e12f610e-b5a2-11ee-8b88-92fbcf53809c.png

DeepFlow 中 APISIX 及后端服务实现分布式追踪的两种方式

方式一:DeepFlow eBPF AutoTracing

DeepFlow 的分布式追踪(AutoTracing)能力是开箱即用的,无需 APISIX 开启任何插件,仅需要将 deepflow-agent 部署在 APSIX 所在的服务器即可。在 Grafana 中找到 DeepFlow 提供的 Distributed Tracing Dashboard,即可对某一个调用点击发起追踪,并看到这个调用在 APISIX 及其后端服务中的全链路追踪过程。如下图所示:

①:通过 nodeport 的形式访问到 APISIX 网关服务所在 K8s Node 的端口

②:进入到 APISIX 网关服务所对应的 POD 的网卡

③:进入到 APISIX 网关服务中的 OpenResty 进程

④:完成业务处理,经由 OpenResty 进程将请求转发给后端服务

⑤:经由 APISIX 网关服务所对应的 POD 网卡转发

⑥/⑦:将请求转发给后端服务

e13970a4-b5a2-11ee-8b88-92fbcf53809c.png

DeepFlow eBPF AutoTracing

方式二:DeepFlow eBPF + OpenTelemetry

此方式为 APISIX 利用 OpenTelemetry 插件生成 Trace 数据,后端服务也具备 APM 能力并且可将生成的 Trace 数据转化为 OpenTelemetry 格式。当 APISIX 与后端服务都将 Trace 数据发送给 DeepFlow 时,DeepFlow 能够生成包含APM 应用 SPAN、eBPF 系统 SPAN、cBPF 网络 SPAN 的无盲点全栈调用链追踪火焰图。

当我们希望得到应用进程内部函数粒度的分布式追踪链路,或者后端服务在处理一个调用时使用了线程池(会导致 DeepFlow AutoTracing 断链)时,可以采用这种方式。

1. 部署具备 APM 能力的后端服务

为了展示完整的追踪效果,我们首先在 APISIX 网关后面部署了一个支持 OpenTelemetry 能力的 Demo 应用。Demo 应用的部署可参考:DeepFlow Demo - 一键部署基于 Spring Boot 编写的五个微服务组成的 WebShop 应用[3]。在 APISIX 上创建访问后端服务的路由,访问域名为 apisix.deepflow.demo。

apiVersion:apisix.apache.org/v2
kind:ApisixRoute
metadata:
name:deepflow-apisix-demo
namespace:deepflow-otel-spring-demo
spec:
http:
-name:deepflow-apisix-demo
match:
hosts:
-apisix.deepflow.demo
paths:
-"/*"
backends:
-serviceName:web-shop
servicePort:18090

2. 在 APSIX 中开启 OpenTelemetry 插件

在 APISIX 配置中添加 opentelemetry plugins:

##vim./apisix/.values.yaml
plugins:
-opentelemetry
#...
pluginAttrs:
opentelemetry:
resource:
service.name:APISIX
collector:
##将数据传给deepflow-agent
##当然,这里也可以发给otel-collector进行处理后,再由otel-collectorf发送至deepflow-agent
address:deepflow-agent.deepflow.svc.cluster.local/api/v1/otel/trace
request_timeout:3

##添加后更新helmupgrade--install-napisixapisix./apisix

针对指定路由开启 OpenTelemetry 功能:

##查看路由ID
##找到对应域名的路由ID
curl-shttp://10.109.77.186:9180/apisix/admin/routes-H'X-API-KEY:此处为apisix-admintoken'|jq
##针对具体路由开启otel功能
curlhttp://10.109.77.186:9180/apisix/admin/routes/此处为路由ID-H'X-API-KEY:此处为apisix-admintoken'-XPUT-d'
{
"name":"deepflow-apisix-demo",##给这个路由配置个名字
"methods":["GET"],
"uris":["/*"],
"plugins":{
"opentelemetry":{
"sampler":{
"name":"always_on"
},
"additional_attributes":[##可通过additional_attributes自定义Span标签
"deepflow=demo"
]
}
},
"upstream":{
"type":"roundrobin",##RR轮询
"nodes":{##上游地址
"10.1.23.200:18090":1##服务访问地址:上游编号
}
}
}'

3. 使用 DeepFlow 集成 OpenTelemetry 追踪数据

通过 DeepFlow Agent 集成 OpenTelemetry 的 Span 数据,功能默认开启,无需额外配置。

##查看deepflow-agent默认配置
##deepflow-ctlagent-group-configexample

##这个参数控制是否启接收外部数据源,包括 Prometheus Telegraf OpenTelemetry 和 SkyWalking
##DataIntegrationSocket
##Default:1.Options:0(disabled),1(enabled).
##Note:WhethertoenablereceivingexternaldatasourcessuchasPrometheus,
##Telegraf,OpenTelemetry,andSkyWalking.
#external_agent_http_proxy_enabled:1

4. OpenTelemetry 集成效果展示

我们在客户端发起一条访问 WebShop 服务的命令:

curl-H"Host:apisix.deepflow.demo"10.1.23.200:44640/shop/full-test
##此处IP为k8s集群节点IP,44640端口为APISIX9180暴露的NodePort

在 Grafana 中打开 DeepFlow 提供的 Distributed Tracing Dashboard,找到对应的调用点击发起追踪,能看到 APISIX 与后端服务都能追踪出来,且 APM 生成的应用 SPAN 与 DeepFlow 生成的网络 SPAN 及系统 SPAN 都完整的关联在一张火焰图上:

注:火焰图中的 A 表示 APM 生成的应用 SPAN,N 和 S 表示 DeepFLow 生成的网络 SPAN 及系统 SPAN。

e15622b2-b5a2-11ee-8b88-92fbcf53809c.png

DeepFlow eBPF + OTel

03

性能指标

对于性能指标,在 DeepFlow 中同样能开箱即用查看 Endpoint 粒度的 RED(吞吐、时延、异常)性能指标,以及丰富的 TCP 网络性能指标(吞吐、重传、零窗、建连异常等)。同样,APISIX 的 Metrics 类的插件 —— 比如 Prometheus、node-status 等插件获取到的实例、路由粒度的 HTTP 状态码、带宽、连接数、时延等指标数据,可集成到 DeepFlow 中,并在 APISIX 提供的 Grafana Dashboard 中查看。

e15ad17c-b5a2-11ee-8b88-92fbcf53809c.png

使用 DeepFlow 采集 APISIX 性能指标

1. 开箱即用的 eBPF 性能指标

在 APISIX 所在的服务器上部署 deepflow-agent 后,可自动采集应用及网络层面非常细粒度的指标量,例如精细到某个客户端、某个 Endpoint 的请求速率、响应时延、异常状态;某一次 TCP 建连时延,建连异常等等。详细的指标量可参考 DeepFlow 官网关于指标量的介绍[4]。在 Grafana 中打开 DeepFlow 提供的 Applicaiton - xxx Ingress Dashboard,可查看 APISIX 相关的应用层性能指标,在 Network xxx Dashboard 中可查看网络相关的指标。

e1738a78-b5a2-11ee-8b88-92fbcf53809c.png

DeepFlow eBPF 性能指标(应用)

e15622b2-b5a2-11ee-8b88-92fbcf53809c.png

DeepFlow eBPF 性能指标(网络)

2. 在 APISIX 中开启 Prometheus 插件

在 APISIX 配置中添加 Prometheus 插件:

##vim./apisix/.values.yaml
plugins:
-prometheus
#...
pluginAttrs:
prometheus:
export_uri:/metrics##默认uri为/apisix/prometheus/metrics
export_addr:
ip:0.0.0.0##抓取地址
port:9091##默认端口9091
metrics:
http_status:##具体作用在apisix_http_status指标中
extra_labels:##添加额外内容
-upstream_addr:$upstream_addr##例如此处添加一个上游服务器地址(此处的变量是NGINX变量)
-upstream_status:$upstream_status##例如此处添加一个上游服务器状态(此处的变量是NGINX变量)
## APISIX 自带变量:https://apisix.apache.org/docs/apisix/3.2/apisix-variable/
## NGINX 自带变量:https://nginx.org/en/docs/varindex.html

启用 Prometheus 插件:

##注:上面启用了 otel 功能,所以此处要在启用 otel 的基础上开启 prometheus

curlhttp://10.109.77.186:9180/apisix/admin/routes/此处为路由ID-H'X-API-KEY:此处为apisix-admintoken'-XPUT-d'
{
"name":"deepflow-apisix-demo",##给这个路由配置个名字
"methods":["GET"],
"uris":["/*"],
"plugins":{
"prometheus":{##启用prometheus
"prefer_name":true##为"true"时,Prometheus指标中,打印路由/服务名称而不是ID
}
},
"upstream":{
"type":"roundrobin",
"nodes":{
"10.1.23.200:18090":1
}
}
}'

3. 使用 Prometheus 拉取 APISIX 指标数据

Prometheus 采集 APISIX metrics(此处以 Prometheus CRD 部署方式举例):

##ServiceMonitor方式采集(Prometheus以CRD形式部署在k8s中)
##APISIXvalues.yaml文件中提供了对应模块
serviceMonitor:
##是否启用
enabled:true
##创建在哪个命名空间
namespace:"apisix"
##servicemonitor名称,默认为fullname
name:""
##抓取间隔
interval:15s
##metrics暴露的uri
path:/metrics
##给抓取到的指标添加前缀
metricPrefix:apisix_
##抓取端口
containerPort:9091
##添加labels
labels:
##此次使用项目为kube-prometheus,使用此标签使kube-prometheus识别servicemonitor
app.kubernetes.io/part-of:kube-prometheus
annotations:{}

此时需要一个 Prometheus 后端服务用于采集 APISIX 插件生成的指标,所以需要先部署一个 prometheus-server。但实际上由于不依赖 prometheus-server 存储这些指标,因此可以部署一个 Agent Mode 的 prometheus-server,或者使用更加轻量级的 grafana-agent 替代 prometheus-server。假设已经部署了 prometheus-server,开启 RemoteWrite 可将指标数据发送给 DeepFlow:

##https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
##https://deepflow.io/docs/zh/integration/input/metrics/prometheus/#配置-remote-write

##kube-prometheus方式发送至DeepFlow(yaml清单中添加远程写入)
apiVersion:monitoring.coreos.com/v1
kind:Prometheus
metadata:
labels:
...
name:k8s
namespace:monitoring
spec:
enableRemoteWriteReceiver:true
remoteWrite:
##注:此处为 deepflow-agent svc 地址,要按实际位置写
-url:"http://deepflow-agent.deepflow.svc.cluster.local/api/v1/prometheus"

4. 使用 DeepFlow 集成 Prometheus 指标数据

通过 DeepFlow Agent 集成 Prometheus 指标数据,功能默认开启,无需额外配置。

##查看deepflow-agent默认配置
##deepflow-ctlagent-group-configexample

##这个参数控制是否启接收外部数据源,包括 Prometheus Telegraf OpenTelemetry 和 SkyWalking
##DataIntegrationSocket
##Default:1.Options:0(disabled),1(enabled).
##Note:WhethertoenablereceivingexternaldatasourcessuchasPrometheus,
##Telegraf,OpenTelemetry,andSkyWalking.
#external_agent_http_proxy_enabled:1

5. Prometheus 集成效果展示

由于 DeepFlow 支持 PromQL,只需要将 Grafana 中 APISIX 提供的 Grafana Dashboard[5] 的数据源改为 DeepFlow,即可查看 APISIX 原生的丰富性能指标了,指标的使用说明参考官方文档中关于 Prometheus 插件的说明[6]。

e1a89600-b5a2-11ee-8b88-92fbcf53809c.png

通过 DeepFlow 数据源展示 APISIX Dashboard

04

访问日志和持续剖析

e1ad3980-b5a2-11ee-8b88-92fbcf53809c.png

使用 DeepFlow 采集 APISIX 的访问日志和剖析数据

对于访问日志,此时无需 APISIX 做什么修改,仅需要将 deepflow-agent 部署在 APSIX 所在的服务器即可,在 Grafana 中打开 DeepFlow 提供的 Application - Request Log Dashboard 即可查看访问日志,包含了 Request 及 Response 中 header 信息,并可分析每一次请求的响应时延和错误码。

e1bd27c8-b5a2-11ee-8b88-92fbcf53809c.png

DeepFlow 提供的访问日志 Dashboard

DeepFlow 还通过 eBPF 获取应用程序的函数调用栈快照(企业版功能),可绘制 APISIX 进程的 On-CPU Profile,函数调用栈中除了包含业务函数以外,还可展现动态链接库、内核系统调用函数的耗时情况。

e1d85692-b5a2-11ee-8b88-92fbcf53809c.png

DeepFlow 企业版中的持续剖析功能

05

什么是 APISIX

Apache APISIX 是一个动态、实时、高性能的开源 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。Apache APISIX 基于 NGINX 和 LuaJIT 构建,具有超高性能,单核 QPS 高达 23000,平均延迟仅为 0.2 毫秒。

Apache APISIX 的应用场景非常广泛,可应用于 API 网关、Kubernetes Ingress 和服务网格等场景,帮助企业快速、安全地处理 API 和微服务流量。目前已获得 Zoom、Airwallex、Lotus Cars、vivo、欧洲数字工厂等全球企业和组织的测试和高度认可。

Apache APISIX 于 2019 年开源并由 API7.ai 捐赠给 Apache 软件基金会,目前是 GitHub 上最活跃的 API 网关项目,每天处理超万亿次的 API 调用,并且这一数字仍在增长。

06

什么是 DeepFlow

DeepFlow 是云杉网络开发的一款可观测性产品,旨在为复杂的云基础设施及云原生应用提供深度可观测性。DeepFlow 基于 eBPF 实现了应用性能指标、分布式追踪、持续性能剖析等观测信号的零侵扰(Zero Code)采集,并结合智能标签(SmartEncoding)技术实现了所有观测信号的全栈(Full Stack)关联和高效存取。使用 DeepFlow,可以让云原生应用自动具有深度可观测性,从而消除开发者不断插桩的沉重负担,并为 DevOps/SRE 团队提供从代码到基础设施的监控及诊断能力。







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RPC
    RPC
    +关注

    关注

    0

    文章

    102

    浏览量

    11423
  • 线程池
    +关注

    关注

    0

    文章

    53

    浏览量

    6768
  • APM
    APM
    +关注

    关注

    0

    文章

    69

    浏览量

    12861
  • LINUX内核
    +关注

    关注

    1

    文章

    311

    浏览量

    21389

原文标题:基于 DeepFlow 构建 APISIX 的统一可观测性能力

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    求大神指导matlab设计观测

    现在课题需要,要做个四阶系统的状态观测器设计,基于matlab设计,四种(全维观测器 降维观测器 自适应观测器 滑模
    发表于 04-16 10:13

    关于 eBPF 安全可观测性,你需要知道的那些事儿

    某种对象或者对象属性不受威胁的状态。安全可观测性:通过观测整个系统,从低级别的内核可见性到跟踪文件访问、网络活动或能力(capability)变化,直到应用层,涵盖了诸如对易受攻击的
    发表于 09-08 15:31

    基于拓扑分割的网络可观测性分析方法

    针对电力网络可观测性分析问题,对量测网络建模、网络拓扑可观测性分析理论、不可观测节点的影响范围等方面进行了研究,提出了一种基于拓扑分割的网络可观测性分析方法,在某42节点系统上对该方法
    发表于 03-06 18:03 0次下载
    基于拓扑分割的网络<b class='flag-5'>可观测</b>性分析方法

    NASA开发可观测宇宙形成和结构的新型探测器

    据麦姆斯咨询报道,美国国家航空航天局正在开发一款可观测宇宙形成和结构的新型探测器。宇宙中众多辐射与机械相互作用,塑造了星系的星际介质并推动着星系演化。
    的头像 发表于 09-26 16:52 3849次阅读

    Apache APISIX云原生API网关

    ./oschina_soft/gitee-apisix.zip
    发表于 05-16 09:23 1次下载
    Apache <b class='flag-5'>APISIX</b>云原生API网关

    如何将可观测性策略与APM工具结合起来

    获悉IBM Instana被Gartner评选为2022年度应用性能监控(APM)和可观测性(Observbility)魔力象限的领导者,我与我身边同事们都与有荣焉。不仅Instana实现了其领先级企业可观测性平台的愿景,对我们
    的头像 发表于 07-27 11:19 957次阅读

    介绍eBPF针对可观测场景的应用

    随着eBPF推出,由于具有高性能、高扩展、安全性等优势,目前已经在网络、安全、可观察等领域广泛应用,同时也诞生了许多优秀的开源项目,如Cilium、Pixie等,而iLogtail 作为阿里内外千万实例可观测数据的采集器,eBP
    的头像 发表于 08-11 09:10 1200次阅读

    eBPF安全可观测性的前景展望

    本次分享将从监控和可观测性、eBPF安全可观测性分析、内核安全可观测性展望三个方面展开。
    的头像 发表于 08-17 11:27 1240次阅读

    API网关Apache APISIX 3.0版本正式发布!

    在 9 月底,Apache APISIX 发布了 3.0.0-beta 预览版,为用户们提前带来了一些新的功能体验。今天,APISIX 正式发布了 3.0.0 版本,将产品从体验和功能角度,带到了新一轮的进程中。
    的头像 发表于 11-21 15:27 594次阅读

    六大顶级、开源的数据可观测性工具

    企业有很多商业数据可观测性工具可供选择。商业工具在可伸缩性、自动化和支持方面具有一些关键优势。然而,数据可观测性的开源工具允许团队在没有前期购买(获得使用许可)成本的情况下试验数据可观察性功能
    的头像 发表于 12-16 11:29 1587次阅读

    华为云应用运维管理平台获评中国信通院可观测性评估先进级

    近日,华为云应用运维管理平台参与了中国信息通信研究院(以下简称“中国信通院”)主办的“稳保行动”的可观测性平台能力评估。经过中国信通院的检验,华为云应用运维管理平台满足云上软件系统稳定-可观测性平台
    的头像 发表于 07-01 21:16 293次阅读
    华为云应用运维管理平台获评中国信通院<b class='flag-5'>可观测</b>性评估先进级

    喜讯!基调听云可观测性平台获评中国信通院根因分析评估先进级

    了2023年上半年度的可信云评估结果。 值得一提的是,在这次大会上,基调听云可观测性平台凭借其稳定性和卓越的根因分析能力受到了广泛关注。基调听云可观测性平台在中国信通院举办的“稳保行动”中通过了根因分析
    的头像 发表于 07-26 13:10 478次阅读

    从技术到商业价值:基调听云智能可观测性平台能力升级,持续满足不断变化的市场需求

    的运维服务,并不断优化底层技术能力以加强客户体验。 其中,基调听云智能可观测性平台的全局拓扑和疑似问题两项核心技术能力再度升级获得行业认可,充分证明了我们在技术创新方面的领先地位和不断提升用户体验的努力! 下面为大家介
    的头像 发表于 08-21 16:56 300次阅读

    使用APM无法实现真正可观测性的原因

    控制理论中的可观测性是指:系统可以由其外部输出确定其内部状态的程度。在复杂 IT 系统中,具备可观测性是为了让系统能达到某个预定的稳定性、错误率目标。随着微服务数量的急速膨胀和云原生基础设施的快速演进,建设可观测性已经成为了保障
    的头像 发表于 09-18 10:23 479次阅读
    使用APM无法实现真正<b class='flag-5'>可观测</b>性的原因

    什么是多云? 为什么我们需要多云可观测性 (Observability)?

    什么是多云? 为什么我们需要多云可观测性 (Observability)?
    的头像 发表于 10-12 17:12 324次阅读
    什么是多云? 为什么我们需要多云<b class='flag-5'>可观测</b>性 (Observability)?