云原生 Profiling:零侵入、随用随取的动态采集实战

背景

应用在运行过程中,开启性能分析(Profiling)通常是诊断性能瓶颈、内存泄漏和线程问题的关键手段。然而,持续开启 Profiling 会带来显著的性能开销(可能达 5%-20%),并可能生成大量数据,影响生产环境稳定性。动态开启 Profiling 允许开发或运维人员按需、实时地启动/停止数据收集,实现以下目标:

  1. 降低持续开销:仅在需要时启用,避免长期性能损耗;
  2. 精准问题定位:针对特定时段(如流量高峰或故障期间)进行分析;
  3. 在线诊断:无需重启应用即可获取生产环境实时性能快照;
  4. 灵活控制:可结合监控指标(如 CPU 飙升)自动触发,或在安全审计时手动开启。

通过动态控制,实现了观测能力与系统负载的平衡,保障了关键业务场景的效率和稳定性。

Flameshot

Flameshot 是一个基于 Sidecar 模式运行的轻量级自动性能剖析(Profiling)工具。它通过监控目标进程的资源使用情况(CPU/内存),在达到预设阈值时自动触发底层 Profiler(如 async-profiler ),从而实现无侵入的现场快照采集。

Flameshot 采用 Sidecar 容器 模式部署。它必须与业务主容器(Main Container)运行在同一个 Pod 中,并开启 PID 命名空间共享。

  1. 监控 (Monitor):Flameshot 持续轮询主容器内目标进程的资源水位。
  2. 触发 (Trigger):当满足阈值(如 CPU > 80%)或收到 HTTP API 请求时,触发采集任务。
  3. 执行 (Execute):根据配置的语言类型(目前支持 Java),调用对应的 Profiler 工具 attach 到目标进程。
  4. 收集 (Collect):生成的 Profile 文件(如 .jfr )存储于共享卷中,随后上传至数据观测中心。

观测云 datakit-operator 从 1.7.0 版本开始支持工具 flameshots,实现动态开启应用 Profiling。

实践

当前在 K8S 环境上部署 JAVA 应用,当 CPU、内存使用率达到 20%(演示方便)则触发 Profiling 数据采集。

前提条件

  • 观测云帐号
  • K8S 环境

DataKit

DataKit 主要是用来采集数据并上报观测云。

1. 下载 & 安装
wget https://static.guance.com/datakit/datakit.yaml
2. 配置 datakit.yaml

配置 DataWay 数据网关地址

name: ENV_DATAWAY
value: https://openway.guance.com?token=tkn_xxxxx

DataKit 会默认开启主机相关采集器,这里需要追加 pyroscope

name: ENV_DEFAULT_ENABLED_INPUTS
value: cpu,disk,diskio,mem,swap,system,hostobject,net,host_processes,container,pyroscope
3. 启动

调整完配置后,启动 DataKit

root@root:~$ kubectl apply -f datakit.yaml
root@root:~$ kubectl get pods -n datakit
NAME                                READY   STATUS    RESTARTS   AGE
datakit-4zg7q                       1/1     Running   0          14h
datakit-wdtdq                       1/1     Running   0          14h

DataKit Operator

1. 下载

下载最新的 datakit-operator.yaml

wget https://static.guance.com/datakit-operator/datakit-operator.yaml
2. 配置 datakit-operator.yaml

主要调整 jsonconfig 下的 flameshots 内容,参考如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: datakit-operator-config
  namespace: datakit
data:
  jsonconfig: |-
    {
        "server_listen": "0.0.0.0:9543",
        "log_level":     "info",
        "admission_inject_v2": {
            ...
            "flameshots": [
                {
                    "namespace_selectors": ["default"],
                    "label_selectors":     [],
                    "image": "pubrepo.jiagouyun.com/datakit/flameshot:0.1.1",
                    "envs": {
                        "FLAMESHOT_DATAKIT_ADDR":     "http://datakit-service.datakit.svc:9529/profiling/v1/input",
                        "FLAMESHOT_MONITOR_INTERVAL": "1s",
                        "FLAMESHOT_PROFILING_PATH":   "/flameshot-data",
                        "FLAMESHOT_HTTP_LOCAL_IP":    "{fieldRef:status.podIP}",
                        "FLAMESHOT_HTTP_LOCAL_PORT":  "8089",
                        "FLAMESHOT_SERVICE":          "{fieldRef:metadata.labels['app']}",
                        "POD_NAME":                "{fieldRef:metadata.name}",
                        "POD_NAMESPACE":           "{fieldRef:metadata.namespace}",
                        "NODE_NAME":               "{fieldRef:spec.nodeName}",
                        "FLAMESHOT_TAGS":          "pod_name:$(POD_NAME),pod_namespace:$(POD_NAMESPACE),host:$(NODE_NAME)"
                        
                    },
                    "resources": {
                        "requests": {
                            "cpu":    "100m",
                            "memory": "128Mi"
                        },
                        "limits": {
                           "cpu":    "200m",
                           "memory": "256Mi"
                        }
                    },
                    "processes": "[{\"command\":\"java\",\"duration\":\"60s\",\"events\":\"--all\",\"language\":\"java\",\"jdk_version\":\"-\",\"tags\":[\"env:testing\",\"version:1.0.0\"],\"cpu_usage_percent\":20,\"mem_usage_percent\":20,\"mem_usage_mb\":1024}]"
                }
            ]
        },
        ...
    }

参数说明:

  • namespace_selectors: 空间选择,即哪些空间需要开启 flameshots
  • env: 配置环境变量信息
  • processes: 执行命令,如果为空,则 flameshots 不生效

processes 通用字段说明:

  • service (String): 选填,上报到观测中心的服务名称。
  • language (String): 目标进程语言。目前支持 java。
  • command (String): 匹配进程命令行的正则表达式。
  • duration (String): 单次采集时长(例如 30s,1m)。注意:受限于执行超时,建议不超过 5 分钟。
  • tags (List): 自定义标签列表,建议包含 env,version 等元信息。
  • cpu_usage_percent (Int): CPU 触发阈值 (0-N)。多核环境下数值可能超过 100。
  • mem_usage_percent (Int): 内存使用率触发阈值 (0-100)。
  • mem_usage_mb (Int): 内存使用量绝对值触发阈值 (MB)。

当前配置 processes 可以实现所有 JAVA 服务,为了实践方便,当 cpu 使用率达到 20% 或内存使用率达到 20% 或内存使用值达到 1024m,则会触发执行 Profiling 操作。

"processes": "[{\"command\":\"java\",\"duration\":\"60s\",\"events\":\"--all\",\"language\":\"java\",\"jdk_version\":\"-\",\"tags\":[\"env:testing\",\"version:1.0.0\"],\"cpu_usage_percent\":20,\"mem_usage_percent\":20,\"mem_usage_mb\":1024}]"
3. 启动
root@root:~$ kubectl apply -f datakit-operator.yaml
root@root:~$ kubectl get pods -n datakit
NAME                                READY   STATUS    RESTARTS   AGE
datakit-4zg7q                       1/1     Running   0          15h
datakit-operator-849f868b78-zbcd9   1/1     Running   0          58s
datakit-wdtdq                       1/1     Running   0          15h

JAVA 应用

1. Yaml 配置
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-server
spec:
  selector:
    matchLabels:
      app: springboot-server
  replicas: 1
  template:
    metadata:
      labels:
        app: springboot-server
    spec:
      containers:
        - image: registry.cn-shenzhen.aliyuncs.com/lr_715377484/springboot-server:flameshots
          name: springboot-server
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort:  8080
              protocol: TCP

          securityContext:
            seccompProfile:
              type: Unconfined
2. 启动应用
root@root:~$  kubectl apply -f springboot-server.yaml
root@root:~$ kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
springboot-server-d55fc79dd-48c95   2/2     Running   0          3s
3. 查看 flameshot 执行日志

需要指定 containerName 为 -c datakit-flameshot

root@root:~$ kubectl logs -f springboot-server-d55fc79dd-48c95 -c datakit-flameshot
2026-01-15T03:55:58.090Z        ERROR        flameshot        flameshot/config.go:243        read config file failed, err:open /flameshot/flameshot.conf: no such file or directory
2026-01-15T03:55:58.092Z        INFO        flameshot        flameshot/monitor.go:78        start monitor, interval: 1s
2026-01-15T03:55:58.092Z        INFO        flameshot        flameshot/http.go:77        start http server on 10.187.217.101:8089
2026-01-15T03:55:58.092Z        INFO        flameshot        flameshot/http.go:78        profile start at /v1/profile
2026-01-15T03:55:58.092Z        INFO        flameshot        flameshot/http.go:79        prom http start at /metrics
2026-01-15T03:56:58.093Z        INFO        flameshot        flameshot/monitor.go:102        match: PID=7, name=java or cmd=java -jar app.jar

从启动日志上分析,已经找到了 java 服务,且 PID 为 7,等待触发事件

4. 触发阈值

访问应用

root@root:~$ kubectl exec -it springboot-server-d55fc79dd-48c95  -- /bin/bash 
Defaulted container "springboot-server" out of: springboot-server, datakit-flameshot
springboot-server-d55fc79dd-48c95:/home/app#
springboot-server-d55fc79dd-48c95:/home/app# curl http://localhost:8080/profiling/generator
write success!springboot-server-d55fc79dd-48c95:/home/app# 

再来看看 flameshot 执行日志,已触发了阈值 cpu_avg:36.60 且正常上报数据。

之后恢复了正常,正常之后则不会再产生 Profiling 数据,除非再次触发了阈值。

观测云平台

登录观测云平台,访问「应用性能检测」-「Profling」可以查看到刚刚上报的 Profling 信息

点击列表可以查看 Profling 详细信息,如 CPU 耗时、内存分配情况等,可以更深度的剖析应用代码性能损耗。

相关推荐

技术实战:观测云告警到飞书群并精准@相关人

本文介绍观测云如何通过 Webhook 将告警推送至 DataFlux Func,完成消息格式转换并 @责任人,实现精准提醒。

观测云的博客 346

基于 OpenTelemetry 实现 LangChain 观测云全链路可观测

文章介绍基于 OpenTelemetry 为 LangChain 应用构建 Zero-Code 全链路可观测方案,无需修改业务代码即可自动采集工作流、Prompt 与模型调用链路,帮助快速定位性能瓶颈与故障,并分析模型输入输出及 Token 消耗。

观测云的博客 343

Spring AI + Spring AI Alibaba 接入观测云最佳实践

文章介绍 Spring AI 与 Spring AI Alibaba 应用接入观测云的实践方案,通过 OpenTelemetry 自动采集 Agent、LLM 与 Tool 调用链路,实现性能、Token、模型及工具调用的统一观测,提升 AI 应用故障排查与性能优化效率。

观测云的博客 462

观测云 Agent 输出质量评估上线!智能体答得好不好别再靠感觉

观测云上线Agent质量评估系统,支持Prompt Eval和Schema Eval,自动检测输出质量与结构,提升智能化服务可靠性。

观测云的博客 665

观测云产品更新 | Agent 监测、故障中心、应用性能监测、日志、基础设施等

观测云新增AI API计费、告警策略优化、Agent Skills提升、故障作战室、LangChain兼容、性能监测与日志优化等功能。

观测云的博客 361

AI时代的用户访问监测:观测云带你身临其境体验用户与前端UI交互旅程

观测云 RUM 通过真实用户访问数据呈现应用整体体验情况。在应用列表和分析看板中,团队可以查看用户访问量、页面性能、错误情况等关键指标,判断问题影响范围。

观测云的博客 297

观测云全新上线「全局工作区」:进一步统一数据查询

观测云全局工作区上线,支持多模块Tab切换,提升故障排查效率。

观测云的博客 412

Fastjson 高危 RCE(CVE-2026-16723):如何用观测云快速发现并完成修复

本文针对 Fastjson 高危 RCE 漏洞 CVE‑2026‑16723,剖析其影响与利用条件,指出 Maven 静态排查的局限。观测云依托 ddtrace 运行时数据,完成漏洞检测定位告警修复闭环,提供升级、应急防护、迁移 fastjson2 处置方案。

观测云的博客 447

观测云应用性能监测 :帮助团队定位性能瓶颈

观测云 APM 将应用运行过程中的关键性能信息连接起来,帮助团队从发现异常服务,到定位请求链路,再到深入分析代码性能,逐步还原问题发生的过程。

观测云的博客 354

基于 DataFlux Func 构建 Vibe Coding 运行底座

DataFlux Func 可以作为 Vibe Coding 的运行底座。Func 本身提供脚本管理、函数执行、定时任务、函数 API、连接器、环境变量和运行日志等能力;MCP 则让 AI Agent 能够以标准化方式连接 Func,把“写代码”和“运行代码”的链路打通。这套实践不限定某一个 AI 客户端。只要客户端支持 MCP 或具备等价的工具接入能力,例如 Cursor、Claude Desktop、OpenCode、Codex 等,都可以按相同思路接入 Func。

观测云的博客 303

AI时代日志分析:观测云让你从海量日志中找到关键线索

观测云日志围绕日志采集、处理、存储、查询分析以及异常定位等场景,将分散在不同来源的日志信息集中管理。通过 Pipeline 对日志进行解析和结构化处理,通过 GuanceDB 3.1 支撑海量数据存储与分析,帮助团队将原始日志转化为可查询、可分析的数据基础。

观测云的博客 198

AI时代基础设施监控:观测云让你的系统指标清晰可见

通过统一的数据视角,将基础设施、应用和业务信息连接起来,让工程团队从发现问题、分析原因到定位影响范围,形成更加完整的问题排查路径。

观测云的博客 182

观测云会话重放:把玩家游戏中的那一秒卡顿完整回放给研发团队

观测云 Browser SDK 3.3.7 WebGL / WebGL2 Session Replay,让游戏画面、用户操作、错误和性能数据回到同一条时间轴。

观测云的博客 334

观测云集成飞书 SSO 最佳实践

本文介绍如何基于 OIDC 协议,通过飞书集成平台、飞书开放平台两大渠道对接观测云实现 SSO 单点登录的完整方案,清晰区分了两大飞书平台的能力差异、适用场景与配置规范,形成了一套完整、可落地的跨系统身份集成流程。

观测云的博客 216

观测云 AI Agent Teams 安全能力漏扫与修复实践场景

一句话标准:这个 Agent 不能只是“会扫”,而要像一名资深 AppSec 工程师一样,知道问题在哪里、为什么危险、先修哪个、怎么安全地修、修完如何证明真的修好了漏洞扫描不是终点,修复闭环才是安全能力真正落地的标志。观测云 AI Agent Teams 的最佳实践,是让 Agent 在安全团队、研发团队和运维团队之间承担“证据整理、优先级判断、修复建议、协同跟踪、复测复盘”的工作,同时把扫描只读、修复审批、官方依据、脱敏输出和证据关闭作为治理底线。

观测云的博客 380

零码改造!Go 语言应用上报观测云完整最佳实践

本文详解 OpenTelemetry 标准协议接入观测云 DataKit 实操,零码无侵入搭建可观测体系,实现日志、调用链路联动分析。

观测云的博客 357

观测云产品更新 | Agent Teams、Agent 监测、日志、基础设施等

本期更新主要为观测云更新和 DataKit 更新。

观测云的博客 365

观测云 AI 智能体为什么能精准排查并修复故障?把排障经验写进 Runbook

立刻在观测云免费开通 Obsy AI 智能服务,体验 Obsy AI Copilot 和 AI Agent Teams 强大的故障排查能力;开通观测 Agent Teams,让 观测 AI 智能体团队 7×24 安全的在你生产环境里跑起来,

观测云的博客 541

万卡级算力集群 GPU 监控:基于观测云全链路观测实践

本文介绍如何通过观测云监控万卡级算力集群 GPU,与应用性能 Trace、业务日志、基础设施指标在统一平台中实现全栈关联与跨层下钻,真正构建起从硬件到业务的完整观测链路。

观测云的博客 489

观测云基于 AI Agent Teams 能力的场景实践

本文通过三个场景实践,介绍观测云 AI Agent Teams 如何将可观测性数据、智能分析与自动化运维能力深度结合,帮助用户更快发现问题、定位问题并解决问题。

观测云的博客 581

观测云产品更新 | Agent Teams、Agent 监测、统一目录、基础设施、应用性能监测等

观测云新增企业微信消息渠道、任务管理优化、容器化部署、Agent监测升级、分析看板改进、时间轴视图、联动变更、拓扑筛选、日志优化、性能监测等功能。

观测云的博客 238

观测云入选 OpenTelemetry 官方 Vendors

观测云面向 OpenTelemetry 构建的原生接入与可观测能力,正式进入全球 OpenTelemetry 生态视野。

观测云的博客 453

当 Agent 写代码快过人类审查:软件工程的信任链必须重建

下一阶段的软件工程,不是让人类追着每一行 AI 代码跑,而是让 Agent 提交证据,并让线上系统持续产生可用于纠错的信号。

观测云的博客 356

带你用观测 AI 智能体:自主分析与修复故障

观测云通过 Guance AI Agent Teams,为业务调查与恢复提供了统一的数据基座、受控的执行边界、结构化的证据输出。

观测云的博客 221

观测云正式支持 Qoder 可观测

在「观测云控制台」-「Agent 监测」,点击右上角「接入 Agent」,选择「Qoder」即可快速接入。

观测云的博客 296

带你用观测 AI 智能体:接入你的工作群聊

观测云通过 Guance AI Agent Teams,为生产侧的可观测 Agent 提供了统一的数据基座:日志、指标、Trace、事件,全部统一采集、统一标签、统一存储。

观测云的博客 204

观测云正式支持 Claude Code 可观测

在「观测云控制台」-「Agent 监测」,点击右上角「接入 Agent」,选择「Claude Code」即可快速接入。

观测云的博客 337

观测云产品更新 | Obsy AI、Agent Teams、Agent 监测、安全监测、故障中心等

本期更新主要为观测云更新和 DataKit 更新。详情见官网文档:https://docs.guance.com/release-notes/

观测云的博客 233

带你用观测 AI 智能体:与本地 Coding Agent 协作排障

观测云通过 Guance AI Agent Teams,为生产侧的可观测 Agent 提供了统一的数据基座日志、指标、Trace、事件,全部统一采集、统一标签、统一存储。

观测云的博客 382

观测云 6 月产品升级报告 | 观测 AI Agent Teams 全面升级、观测云安全功能强化、拨测与跨空间协同能力增强

2026 年 6 月,我们收到不少用户反馈。我们把这些声音,一条条变成了产品更新,以下是本月最值得关注的 9 大升级亮点,每一个都为了让你的观测体验更顺滑、更贴合实际业务场景。

观测云的博客 368
上一篇: 阿里云 RocketMQ 4.0 可观测最佳实践
下一篇: 解锁可观测性密码:一文掌握观测云日志监控器超能力
观测云
观测云 上海驻云信息科技有限公司官方账号 上海驻云信息科技有限公司官方账号
博客等级 码龄5年 2589粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值