隨著應(yīng)用組件的可觀測性逐漸受到重視,Apache APISIX 引入插件機制豐富了可觀測數(shù)據(jù)源。然而,這些數(shù)據(jù)分散在多個平臺,形成了數(shù)據(jù)孤島。本文旨在闡述如何利用 DeepFlow 基于 eBPF 的零侵?jǐn)_特性構(gòu)建 APISIX 可觀測性解決方案,在此基礎(chǔ)上統(tǒng)一集成 APISIX 插件已有的豐富數(shù)據(jù)源,消除孤島、構(gòu)建統(tǒng)一的可觀測性平臺,以全面監(jiān)控和分析 APISIX 網(wǎng)關(guān)。通過 DeepFlow,APISIX 可以實現(xiàn)從流量監(jiān)控、追蹤分析、到性能優(yōu)化的全面可觀測性,消除數(shù)據(jù)分散并提供中心化的監(jiān)控視圖,加速故障排查和性能調(diào)優(yōu),讓 DevOps 和 SRE 團隊的工作更加高效。本文將重點梳理 APISIX 的追蹤數(shù)據(jù)、指標(biāo)數(shù)據(jù)、訪日日志及性能剖析數(shù)據(jù)如何對接 DeepFlow。
基于 DeepFlow 構(gòu)建 APISIX 的統(tǒng)一可觀測性能力
01
安裝 APISIX 和 DeepFlow
基于 DeepFlow 建構(gòu) APISIX 的統(tǒng)一可觀測性能力,需要先將 DeepFlow 及 APISIX 都部署起來。本文為了方便,將 DeepFlow 和 APISIX 都以 K8s 服務(wù)的形式部署在一個 All-in-One 的 K8s 集群中,整個部署過程大概 5 分鐘左右完成。詳細(xì)的部署過程,參考 DeepFlow 官方部署文檔[1]及 APISIX 官方部署文檔[2]。
注意:為了發(fā)揮 DeepFlow 基于 eBPF 的可觀測性能力,請確保服務(wù)器 Linux 操作系統(tǒng)內(nèi)核在 4.14 之上。
02
分布式追蹤
使用 DeepFlow 實現(xiàn) APISIX 及后端服務(wù)的分布式追蹤能力有兩種方案:利用 eBPF,DeepFlow 可以在不修改 APISIX 及后端服務(wù)配置及代碼的前提下實現(xiàn)開箱即用的 RPC 粒度分布式追蹤;而當(dāng)后端服務(wù)已具備 APM(Application Performance Monitoring) 能力 —— 比如已經(jīng)使用了 OpenTelemetry 或者 SkyWalking 等工具時,可結(jié)合 APISIX 的 Tracers 插件,將所有追蹤數(shù)據(jù)統(tǒng)一集成到 DeepFlow,實現(xiàn)全鏈路的應(yīng)用函數(shù)粒度的分布式追蹤。
DeepFlow 中 APISIX 及后端服務(wù)實現(xiàn)分布式追蹤的兩種方式
方式一:DeepFlow eBPF AutoTracing
DeepFlow 的分布式追蹤(AutoTracing)能力是開箱即用的,無需 APISIX 開啟任何插件,僅需要將 deepflow-agent 部署在 APSIX 所在的服務(wù)器即可。在 Grafana 中找到 DeepFlow 提供的 Distributed Tracing Dashboard,即可對某一個調(diào)用點擊發(fā)起追蹤,并看到這個調(diào)用在 APISIX 及其后端服務(wù)中的全鏈路追蹤過程。如下圖所示:
①:通過 nodeport 的形式訪問到 APISIX 網(wǎng)關(guān)服務(wù)所在 K8s Node 的端口
②:進入到 APISIX 網(wǎng)關(guān)服務(wù)所對應(yīng)的 POD 的網(wǎng)卡
③:進入到 APISIX 網(wǎng)關(guān)服務(wù)中的 OpenResty 進程
④:完成業(yè)務(wù)處理,經(jīng)由 OpenResty 進程將請求轉(zhuǎn)發(fā)給后端服務(wù)
⑤:經(jīng)由 APISIX 網(wǎng)關(guān)服務(wù)所對應(yīng)的 POD 網(wǎng)卡轉(zhuǎn)發(fā)
⑥/⑦:將請求轉(zhuǎn)發(fā)給后端服務(wù)
DeepFlow eBPF AutoTracing
方式二:DeepFlow eBPF + OpenTelemetry
此方式為 APISIX 利用 OpenTelemetry 插件生成 Trace 數(shù)據(jù),后端服務(wù)也具備 APM 能力并且可將生成的 Trace 數(shù)據(jù)轉(zhuǎn)化為 OpenTelemetry 格式。當(dāng) APISIX 與后端服務(wù)都將 Trace 數(shù)據(jù)發(fā)送給 DeepFlow 時,DeepFlow 能夠生成包含APM 應(yīng)用 SPAN、eBPF 系統(tǒng) SPAN、cBPF 網(wǎng)絡(luò) SPAN 的無盲點全棧調(diào)用鏈追蹤火焰圖。
當(dāng)我們希望得到應(yīng)用進程內(nèi)部函數(shù)粒度的分布式追蹤鏈路,或者后端服務(wù)在處理一個調(diào)用時使用了線程池(會導(dǎo)致 DeepFlow AutoTracing 斷鏈)時,可以采用這種方式。
1. 部署具備 APM 能力的后端服務(wù)
為了展示完整的追蹤效果,我們首先在 APISIX 網(wǎng)關(guān)后面部署了一個支持 OpenTelemetry 能力的 Demo 應(yīng)用。Demo 應(yīng)用的部署可參考:DeepFlow Demo - 一鍵部署基于 Spring Boot 編寫的五個微服務(wù)組成的 WebShop 應(yīng)用[3]。在 APISIX 上創(chuàng)建訪問后端服務(wù)的路由,訪問域名為 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: ##將數(shù)據(jù)傳給deepflow-agent ##當(dāng)然,這里也可以發(fā)給otel-collector進行處理后,再由otel-collectorf發(fā)送至deepflow-agent address:deepflow-agent.deepflow.svc.cluster.local/api/v1/otel/trace request_timeout:3 ##添加后更新helmupgrade--install-napisixapisix./apisix
針對指定路由開啟 OpenTelemetry 功能:
##查看路由ID ##找到對應(yīng)域名的路由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標(biāo)簽 "deepflow=demo" ] } }, "upstream":{ "type":"roundrobin",##RR輪詢 "nodes":{##上游地址 "10.1.23.200:18090":1##服務(wù)訪問地址:上游編號 } } }'
3. 使用 DeepFlow 集成 OpenTelemetry 追蹤數(shù)據(jù)
通過 DeepFlow Agent 集成 OpenTelemetry 的 Span 數(shù)據(jù),功能默認(rèn)開啟,無需額外配置。
##查看deepflow-agent默認(rèn)配置 ##deepflow-ctlagent-group-configexample ##這個參數(shù)控制是否啟接收外部數(shù)據(jù)源,包括 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 集成效果展示
我們在客戶端發(fā)起一條訪問 WebShop 服務(wù)的命令:
curl-H"Host:apisix.deepflow.demo"10.1.23.200:44640/shop/full-test ##此處IP為k8s集群節(jié)點IP,44640端口為APISIX9180暴露的NodePort
在 Grafana 中打開 DeepFlow 提供的 Distributed Tracing Dashboard,找到對應(yīng)的調(diào)用點擊發(fā)起追蹤,能看到 APISIX 與后端服務(wù)都能追蹤出來,且 APM 生成的應(yīng)用 SPAN 與 DeepFlow 生成的網(wǎng)絡(luò) SPAN 及系統(tǒng) SPAN 都完整的關(guān)聯(lián)在一張火焰圖上:
注:火焰圖中的 A 表示 APM 生成的應(yīng)用 SPAN,N 和 S 表示 DeepFLow 生成的網(wǎng)絡(luò) SPAN 及系統(tǒng) SPAN。
DeepFlow eBPF + OTel
03
性能指標(biāo)
對于性能指標(biāo),在 DeepFlow 中同樣能開箱即用查看 Endpoint 粒度的 RED(吞吐、時延、異常)性能指標(biāo),以及豐富的 TCP 網(wǎng)絡(luò)性能指標(biāo)(吞吐、重傳、零窗、建連異常等)。同樣,APISIX 的 Metrics 類的插件 —— 比如 Prometheus、node-status 等插件獲取到的實例、路由粒度的 HTTP 狀態(tài)碼、帶寬、連接數(shù)、時延等指標(biāo)數(shù)據(jù),可集成到 DeepFlow 中,并在 APISIX 提供的 Grafana Dashboard 中查看。
使用 DeepFlow 采集 APISIX 性能指標(biāo)
1. 開箱即用的 eBPF 性能指標(biāo)
在 APISIX 所在的服務(wù)器上部署 deepflow-agent 后,可自動采集應(yīng)用及網(wǎng)絡(luò)層面非常細(xì)粒度的指標(biāo)量,例如精細(xì)到某個客戶端、某個 Endpoint 的請求速率、響應(yīng)時延、異常狀態(tài);某一次 TCP 建連時延,建連異常等等。詳細(xì)的指標(biāo)量可參考 DeepFlow 官網(wǎng)關(guān)于指標(biāo)量的介紹[4]。在 Grafana 中打開 DeepFlow 提供的 Applicaiton - xxx Ingress Dashboard,可查看 APISIX 相關(guān)的應(yīng)用層性能指標(biāo),在 Network xxx Dashboard 中可查看網(wǎng)絡(luò)相關(guān)的指標(biāo)。
DeepFlow eBPF 性能指標(biāo)(應(yīng)用)
DeepFlow eBPF 性能指標(biāo)(網(wǎng)絡(luò))
2. 在 APISIX 中開啟 Prometheus 插件
在 APISIX 配置中添加 Prometheus 插件:
##vim./apisix/.values.yaml plugins: -prometheus #... pluginAttrs: prometheus: export_uri:/metrics##默認(rèn)uri為/apisix/prometheus/metrics export_addr: ip:0.0.0.0##抓取地址 port:9091##默認(rèn)端口9091 metrics: http_status:##具體作用在apisix_http_status指標(biāo)中 extra_labels:##添加額外內(nèi)容 -upstream_addr:$upstream_addr##例如此處添加一個上游服務(wù)器地址(此處的變量是NGINX變量) -upstream_status:$upstream_status##例如此處添加一個上游服務(wù)器狀態(tài)(此處的變量是NGINX變量) ## APISIX 自帶變量:https://apisix.apache.org/docs/apisix/3.2/apisix-variable/ ## NGINX 自帶變量:https://nginx.org/en/docs/varindex.html
啟用 Prometheus 插件:
##注:上面啟用了 otel 功能,所以此處要在啟用 otel 的基礎(chǔ)上開啟 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指標(biāo)中,打印路由/服務(wù)名稱而不是ID } }, "upstream":{ "type":"roundrobin", "nodes":{ "10.1.23.200:18090":1 } } }'
3. 使用 Prometheus 拉取 APISIX 指標(biāo)數(shù)據(jù)
Prometheus 采集 APISIX metrics(此處以 Prometheus CRD 部署方式舉例):
##ServiceMonitor方式采集(Prometheus以CRD形式部署在k8s中) ##APISIXvalues.yaml文件中提供了對應(yīng)模塊 serviceMonitor: ##是否啟用 enabled:true ##創(chuàng)建在哪個命名空間 namespace:"apisix" ##servicemonitor名稱,默認(rèn)為fullname name:"" ##抓取間隔 interval:15s ##metrics暴露的uri path:/metrics ##給抓取到的指標(biāo)添加前綴 metricPrefix:apisix_ ##抓取端口 containerPort:9091 ##添加labels labels: ##此次使用項目為kube-prometheus,使用此標(biāo)簽使kube-prometheus識別servicemonitor app.kubernetes.io/part-of:kube-prometheus annotations:{}
此時需要一個 Prometheus 后端服務(wù)用于采集 APISIX 插件生成的指標(biāo),所以需要先部署一個 prometheus-server。但實際上由于不依賴 prometheus-server 存儲這些指標(biāo),因此可以部署一個 Agent Mode 的 prometheus-server,或者使用更加輕量級的 grafana-agent 替代 prometheus-server。假設(shè)已經(jīng)部署了 prometheus-server,開啟 RemoteWrite 可將指標(biāo)數(shù)據(jù)發(fā)送給 DeepFlow:
##https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write ##https://deepflow.io/docs/zh/integration/input/metrics/prometheus/#配置-remote-write ##kube-prometheus方式發(fā)送至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 指標(biāo)數(shù)據(jù)
通過 DeepFlow Agent 集成 Prometheus 指標(biāo)數(shù)據(jù),功能默認(rèn)開啟,無需額外配置。
##查看deepflow-agent默認(rèn)配置 ##deepflow-ctlagent-group-configexample ##這個參數(shù)控制是否啟接收外部數(shù)據(jù)源,包括 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] 的數(shù)據(jù)源改為 DeepFlow,即可查看 APISIX 原生的豐富性能指標(biāo)了,指標(biāo)的使用說明參考官方文檔中關(guān)于 Prometheus 插件的說明[6]。
通過 DeepFlow 數(shù)據(jù)源展示 APISIX Dashboard
04
訪問日志和持續(xù)剖析
使用 DeepFlow 采集 APISIX 的訪問日志和剖析數(shù)據(jù)
對于訪問日志,此時無需 APISIX 做什么修改,僅需要將 deepflow-agent 部署在 APSIX 所在的服務(wù)器即可,在 Grafana 中打開 DeepFlow 提供的 Application - Request Log Dashboard 即可查看訪問日志,包含了 Request 及 Response 中 header 信息,并可分析每一次請求的響應(yīng)時延和錯誤碼。
DeepFlow 提供的訪問日志 Dashboard
DeepFlow 還通過 eBPF 獲取應(yīng)用程序的函數(shù)調(diào)用棧快照(企業(yè)版功能),可繪制 APISIX 進程的 On-CPU Profile,函數(shù)調(diào)用棧中除了包含業(yè)務(wù)函數(shù)以外,還可展現(xiàn)動態(tài)鏈接庫、內(nèi)核系統(tǒng)調(diào)用函數(shù)的耗時情況。
DeepFlow 企業(yè)版中的持續(xù)剖析功能
05
什么是 APISIX
Apache APISIX 是一個動態(tài)、實時、高性能的開源 API 網(wǎng)關(guān),提供負(fù)載均衡、動態(tài)上游、灰度發(fā)布、服務(wù)熔斷、身份認(rèn)證、可觀測性等豐富的流量管理功能。Apache APISIX 基于 NGINX 和 LuaJIT 構(gòu)建,具有超高性能,單核 QPS 高達 23000,平均延遲僅為 0.2 毫秒。
Apache APISIX 的應(yīng)用場景非常廣泛,可應(yīng)用于 API 網(wǎng)關(guān)、Kubernetes Ingress 和服務(wù)網(wǎng)格等場景,幫助企業(yè)快速、安全地處理 API 和微服務(wù)流量。目前已獲得 Zoom、Airwallex、Lotus Cars、vivo、歐洲數(shù)字工廠等全球企業(yè)和組織的測試和高度認(rèn)可。
Apache APISIX 于 2019 年開源并由 API7.ai 捐贈給 Apache 軟件基金會,目前是 GitHub 上最活躍的 API 網(wǎng)關(guān)項目,每天處理超萬億次的 API 調(diào)用,并且這一數(shù)字仍在增長。
06
什么是 DeepFlow
DeepFlow 是云杉網(wǎng)絡(luò)開發(fā)的一款可觀測性產(chǎn)品,旨在為復(fù)雜的云基礎(chǔ)設(shè)施及云原生應(yīng)用提供深度可觀測性。DeepFlow 基于 eBPF 實現(xiàn)了應(yīng)用性能指標(biāo)、分布式追蹤、持續(xù)性能剖析等觀測信號的零侵?jǐn)_(Zero Code)采集,并結(jié)合智能標(biāo)簽(SmartEncoding)技術(shù)實現(xiàn)了所有觀測信號的全棧(Full Stack)關(guān)聯(lián)和高效存取。使用 DeepFlow,可以讓云原生應(yīng)用自動具有深度可觀測性,從而消除開發(fā)者不斷插樁的沉重負(fù)擔(dān),并為 DevOps/SRE 團隊提供從代碼到基礎(chǔ)設(shè)施的監(jiān)控及診斷能力。
審核編輯:劉清
-
RPC
+關(guān)注
關(guān)注
0文章
111瀏覽量
11573 -
線程池
+關(guān)注
關(guān)注
0文章
57瀏覽量
6893 -
APM
+關(guān)注
關(guān)注
1文章
71瀏覽量
13045 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
316瀏覽量
21742
原文標(biāo)題:基于 DeepFlow 構(gòu)建 APISIX 的統(tǒng)一可觀測性能力
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
關(guān)于 eBPF 安全可觀測性,你需要知道的那些事兒
基于拓?fù)浞指畹木W(wǎng)絡(luò)可觀測性分析方法
![基于拓?fù)浞指畹木W(wǎng)絡(luò)<b class='flag-5'>可觀測</b>性分析方法](https://file.elecfans.com/web1/M00/46/7D/pIYBAFqeaBOALGXrAACJkMIvKco618.jpg)
如何將可觀測性策略與APM工具結(jié)合起來
介紹eBPF針對可觀測場景的應(yīng)用
eBPF安全可觀測性的前景展望
六大頂級、開源的數(shù)據(jù)可觀測性工具
華為云應(yīng)用運維管理平臺獲評中國信通院可觀測性評估先進級
![華為云應(yīng)用運維管理平臺獲評中國信通院<b class='flag-5'>可觀測</b>性評估先進級](https://file1.elecfans.com//web2/M00/8B/DD/wKgaomSgJzWAb7-kAACkCL3FpX073.jpeg)
從技術(shù)到商業(yè)價值:基調(diào)聽云智能可觀測性平臺能力升級,持續(xù)滿足不斷變化的市場需求
高性能力反饋方向盤MXsteerWheel,線控轉(zhuǎn)向系統(tǒng)開發(fā)的新幫手
![高<b class='flag-5'>性能力</b>反饋方向盤MXsteerWheel,線控轉(zhuǎn)向系統(tǒng)開發(fā)的新幫手](https://file.elecfans.com/web2/M00/52/D4/pYYBAGLNkrKAeFJaAAAjXRuImx0496.png)
使用APM無法實現(xiàn)真正可觀測性的原因
![使用APM無法實現(xiàn)真正<b class='flag-5'>可觀測</b>性的原因](https://file1.elecfans.com/web2/M00/A4/F4/wKgaomUHtQWAHpATAAAi7-QKIrA449.png)
華為云發(fā)布全棧可觀測平臺 AOM,以 AI 賦能應(yīng)用運維可觀測
![華為云發(fā)布全棧<b class='flag-5'>可觀測</b>平臺 AOM,以 AI 賦能應(yīng)用運維<b class='flag-5'>可觀測</b>](https://file1.elecfans.com//web2/M00/0A/13/wKgaomcGc-yAQXy9AAPSwMcQGCk763.png)
【質(zhì)量視角】可觀測性背景下的質(zhì)量保障思路
![【質(zhì)量視角】<b class='flag-5'>可觀測</b>性背景下的質(zhì)量保障思路](https://file1.elecfans.com//web2/M00/09/92/wKgZomcPUjyAAhXjAAJPaPLnO3M403.png)
華為云全棧可觀測平臺——9 月 10 月新功能特性
![華為云全棧<b class='flag-5'>可觀測</b>平臺——9 月 10 月新功能特性](https://file1.elecfans.com//web3/M00/00/6D/wKgZPGdJRmaALJGsAAsHS7j46jw194.png)
評論