全部产品
Search
文档中心

应用实时监控服务ARMS:通过arms-obi采集Go应用pprof数据

更新时间:Jun 16, 2026

arms-obi 是一个 Kubernetes DaemonSet 模式的 Go pprof 采集 Agent。它运行在集群的每个节点上,自动发现并采集暴露了 Go pprof HTTP 接口的业务 Pod 的性能数据,然后上传至阿里云云监控2.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. 登录容器服务管理控制台,在左侧导航栏选择集群列表,单击目标集群名称。

  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. 登录容器服务管理控制台,在左侧导航栏选择集群列表,单击目标集群名称。

  2. 在左侧导航栏选择组件管理,找到arms-obi组件,点击配置,修改profiling采集配置即可。

查看Profiling

  1. 登录云监控2.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 刷新失败的错误)。