全部產品
Search
文件中心

Application Real-Time Monitoring Service:通過arms-obi採集Go應用pprof資料

更新時間:Jun 17, 2026

arms-obi 是一個 Kubernetes DaemonSet 模式的 Go pprof 採集 Agent。它運行在叢集的每個節點上,自動探索並採集暴露了 Go pprof HTTP 介面的業務 Pod 的效能資料,然後上傳至阿里雲CloudMonitor2.0,配合 ARMS Profiling 實現持久性能剖析(Continuous Profiling)。

核心能力

  • 自動探索當前節點上暴露 pprof 介面的 Pod。

  • 支援 CPU、Heap、Goroutine、Mutex、Block 五種 profile 採集。

  • 健全狀態檢查介面,支援 K8s liveness/readiness 探針。

  • 單節點支援 50+ Pod 同時採集。

前置條件

  • Kubernetes 叢集 >= 1.32。

  • 業務 Pod 暴露了 Go net/http/pprof HTTP 介面。

  • 業務 Pod 容器中設定了標識 pprof 連接埠的環境變數(預設為 ILOGTAIL_PROFILE_PORT,可以根據需要調整values配置)。

業務接入

業務 Go 服務需要暴露 pprof HTTP 介面,並在容器中設定連接埠環境變數,已接入可跳過本節。

代碼接入

在 Go 服務的 main 包中匯入 net/http/pprof 並啟動一個獨立的 HTTP 服務:

import _ "net/http/pprof"

func main() {
    // 在獨立連接埠啟動 pprof 服務,避免與業務連接埠衝突
    go func() {
        http.ListenAndServe(":6060", nil)
    }()
    // ... 業務代碼
}

容器環境變數

在業務 Pod 的容器 spec 中設定 pprof 連接埠環境變數,環境變數名稱可配置,預設為 ILOGTAIL_PROFILE_PORT,可根據需要調整 values 配置:

containers:
  - name: myapp
    env:
      - name: ILOGTAIL_PROFILE_PORT  # 與 arms-obi 配置的 port_env_name 一致
        value: "6060"

arms-obi 會讀取該環境變數的值來確定採集目標連接埠。

部署

ACK叢集

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表,單擊目的地組群名稱。

  2. 在左側導覽列選擇組件管理,找到arms-obi組件,installMode選擇profiling,點擊安裝即可。

  3. 預設採集配置了ENV為ILOGTAIL_PROFILE_PORT的Pod,同時使用label中key為app的value值建立應用。如需調整配置,可在安裝時修改profiling中config採集配置。配置項參考採集配置(collector)

外部叢集

  1. 執行以下wget命令下載arms-obi安裝包。

    wget 'https://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/app/charts-incubator/arms-obi-0.9.3.tgz'
  2. 執行以下命令解壓arms-obi安裝包。

    tar xvf arms-obi-0.9.3.tgz               
  3. 編輯安裝包下的values.yaml檔案,根據實際情況修改以下參數,然後儲存。

    重要

    請確認對應的阿里雲帳號(主帳號)已包含AliyunARMSFullAccess和AliyunSTSAssumeRoleAccess許可權。

    workspace: default-cms-__ACK_UID__-__ACK_REGION_ID__
    registry: registry-__ACK_REGION_ID__.ack.aliyuncs.com/acs/
    cluster_id: __ACK_CLUSTER_ID__
    accessKey: __ACCESSKEY__
    accessKeySecret: __ACCESSKEY_SECRET__
    uid: "__ACK_UID__"
    region_id: __ACK_REGION_ID__
    installMode: profiling

    workspace:將__ACK_UID__、__ACK_REGION_ID_ 替換為阿里雲主帳號的UID和需要上報的RegionId。

    registry:arms-obi鏡像地址,arms-obi 包含三個鏡像,如果是無法訪問公網,需要同步這個鏡像到對應內網倉庫:

    registry-cn-hangzhou.ack.aliyuncs.com/acs/obi:obi-app-update-0.9.3
    registry-cn-hangzhou.ack.aliyuncs.com/acs/obi:init-0.9.3
    registry-cn-hangzhou.ack.aliyuncs.com/acs/obi:pprof-agent-0.9.3

    cluster_id:自訂Kubernetes叢集ID,叢集的唯一標識。建議格式為-。

    accessKeyaccessKeySecret:阿里雲帳號(主帳號)的AccessKey ID和AccessKey Secret。擷取方法,請參見建立AccessKey

    uid:阿里雲帳號(主帳號)ID。將滑鼠懸浮於阿里雲控制台右上方的頭像上可以擷取。

    region_id:阿里雲地區ID,應用監控支援的地區,請參見開服地區

    installMode:該值須為profiling

  4. 執行以下命令安裝arms-obi。請在arms-obi安裝包外執行此命令。

    helm3 upgrade --install arms-obi arms-obi --namespace obi-system --create-namespace

配置說明

採集配置(collector)

欄位

類型

預設值

說明

profiles

[ ]string

全部 5 種

Profile 類型白名單,可選值:cpu、mem、goroutines、mutex、block

interval

int

30

採集周期(秒)

timeout

int

30

單次 HTTP 要求逾時(秒)

max_body_size

int

10240

單次響應 Body 上限(KB),超過則丟棄

cpu_duration

int

10

CPU profile 採樣時間長度(秒),必須小於 interval

port_env_name

string

ILOGTAIL_PROFILE_PORT

從容器 env 中讀取 pprof 連接埠的環境變數名

pprof_path

string

/debug/pprof

pprof HTTP 路徑首碼

Profile 採集 URL 構造規則:http://<podIP>:<port><pprof_path>/<profile>

Profile 類型

URL 路徑

備忘

cpu

/profile?seconds=<cpu_duration>

採集耗時 = cpu_duration 秒

mem

/heap

瞬時採集

goroutines

/goroutine

瞬時採集

mutex

/mutex

瞬時採集

block

/block

瞬時採集

過濾配置(selector)

控制哪些 Pod 會被採集。所有條件為 AND 關係,白名單內部為 OR 關係。

欄位

類型

預設值

說明

namespace

string

""

正則匹配 Pod Namespace,空表示不過濾

pod_name

string

""

正則匹配 Pod Name,空表示不過濾

label_whitelist

[ ]LabelKV

[ ]

Pod Label 白名單,匹配任一即通過

label_blacklist

[ ]LabelKV

[ ]

Pod Label 黑名單,匹配任一即排除

env_whitelist

[ ]LabelKV

[ ]

容器環境變數白名單,必須包含其中任一

env_blacklist

[ ]LabelKV

[ ]

容器環境變數黑名單,包含任一即排除

LabelKV 格式:{key: "app", value: "myservice"},value 為空白時僅檢查 key 是否存在。

過濾流水線執行順序:

  1. 節點過濾 — 僅採集當前節點上的 Pod(自動完成)。

  2. Pod Phase — 僅保留 Running 狀態且有 PodIP 的 Pod。

  3. 正則過濾 — namespace / pod_name。

  4. Label 白名單 → Label 黑名單。

  5. Env 白名單 → Env 黑名單。

  6. 連接埠解析 — 從容器 env 中讀取 port_env_name 對應的連接埠值。

ARMS 配置

欄位

類型

預設值

說明

arms.license_key

string

app

從 Pod 的哪個 label 取值作為 ARMS appName

配置更新

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表,單擊目的地組群名稱。

  2. 在左側導覽列選擇組件管理,找到arms-obi組件,點擊配置,修改profiling採集配置即可。

查看Profiling

  1. 登入CloudMonitor2.0控制台,選擇目標工作空間,在左側導覽列單擊應用監控。

  2. 找到部署時的app定義應用程式名稱,查看應用診斷即可看到不同類型的profiling,同時支援在pprof分析下載對應的採集profiling檔案。

常見問題

Agent 日誌中持續出現 "arms sts not ready yet"

ARMS STS 憑證尚未擷取成功。檢查:

  • 叢集網路是否可訪問 ARMS 中繼資料 API({region_id}-intranet-arms.aliyuncs.com)。

  • 可通過 kubectl logs 查看詳細錯誤資訊。

沒有發現任何 Pod

檢查過濾規則配置:

  • 確認業務 Pod 的容器中設定了 port_env_name 指定的環境變數(預設 ILOGTAIL_PROFILE_PORT)。

  • 確認 selector 的 namespace/pod_name 正則、label/env 白名單黑名單配置正確。

  • 查看 Agent 日誌中 pod_count 欄位確認發現的 Pod 數量。

採集失敗

常見原因:

  • 業務 Pod 未暴露 pprof 介面(確認已 import _ "net/http/pprof" 並啟動 HTTP 服務)。

  • pprof 連接埠與 port_env_name 環境變數中配置的連接埠不一致。

  • pprof_path 與商務服務的路徑首碼不匹配。

  • 網路原則阻止了 Agent Pod 到業務 Pod 的 HTTP 串連。

上傳失敗

常見原因:

  • VPC 內網 endpoint 不可達。

  • ARMS STS 憑證到期(Agent 會自動重新整理,檢查日誌中是否有 STS 重新整理失敗的錯誤)。