标签 eBPF 下的文章

观测云更新

故障中心

“异常追踪”功能全面升级为“故障中心”

故障中心提供一体化的故障处理支持。当监控器发现异常时,会自动生成故障事件,合并重复告警,并按值班规则通知负责人。若超时未处理,将根据升级策略扩大通知范围。在故障详情页中,可一站式查看关联的监控指标、错误日志、调用链路等信息,支持状态流转与团队协作,所有操作均有完整记录。故障中心这一功能将进一步帮助团队规范故障处理流程,提升响应效率与过程透明度。

在故障中心的计费逻辑中:每命中一次升级策略,在发送通知时记录 100 次任务调用。

  • 创建监控器时,开启「关联故障」,自动生成故障事件

图片

  • 故障事件列表

图片

  • 故障事件详情页

图片

  • 值班规则配置

图片

错误

“错误中心”功能全新上线!可自动汇总 APM、RUM 和日志中的错误,并通过智能聚合将相同问题收敛为统一 Issue 进行跟踪。使用前需配置投递规则以设定监控范围,即可在列表中查看错误概况、处理状态与发生趋势,也可进入详情页分析完整堆栈、关联链路和用户会话。所有错误支持状态流转与团队协作,实现从发现到解决的全流程管理。

同步增加“错误条数”计费,统计每日新增的 Issue 数据条数,包含错误中心产生的 Issue 数据。

  • 错误中心列表,可自定义筛选查看不同来源的错误列表

图片

  • 错误详情页,基于错误来源展示对应的详情页,下图为用户访问监测错误详情页

图片

Open API

1、资源目录:新增支持创建、编辑、删除资源分组信息;

2、支持直接编辑账号状态(值班中、休假中)。

指标分析

1、新增 Top N 序列及最大返回点数选项,可以指定在每个查询中,返回排序后最大或最小的若干条(20/50/100/500)数据序列;

2、新增支持点击图表数据点,下拉选择查看相似趋势指标、下钻分析或其他关联查看。

图片

基础设施

1、主机:

  • 新增支持通过 df_mute 字段进行列表筛选;
  • 对于通过 Open API 或规则创建的主机全局静默,系统将在主机列表新增支持展示“静默”标识。

图片

2、资源目录:新增“服务清单”列表入口。

图片

场景

1、仪表板:新增关联监控器按钮,支持一键查看与该仪表板关联的监控器;

图片

2、图表:为所有图表别名配置新增统一序号标识和悬停联动直观化展示多查询行配置时的对应关系。

图片

APM

Profiling:若 Profile 文件体积超过 20MB,系统暂不支持在线解析,同时新增友好提示,您可使用专业分析工具进行查看。

LLM 监测

LLM 查看器【所有 Trace】列表中,“总 Tokens 数” 调整为统计整条 Trace 消耗的 Tokens 数;总 Tokens 列将同步显示输入、输出 Tokens 数量。

图片

日志

查看器:在显示项选择“重置为默认字段”后,message 字段显示逻辑优化

图片

管理

SSO 管理:优化 SSO 登录流程。用户需先通过邮箱选择身份提供商并完成认证,成功后才能在受保护状态下查看可访问的工作空间,避免权限信息外泄。

部署版

管理后台 > 全局配置:新增平台级系统公告管理配置

集成更新

  • 新增 RedPeaks SAP 集成;
  • 更新 AWS rds mysql 仪表盘;
  • 新增 kingbase 监控器;
  • 更新英文版本dashbord,主要处理中英文转换问题;
  • 更新腾讯 PGSQL 仪表板&监控器;
  • 更新资源目录 icon 以及分类目录。

DataKit 更新

新加功能

  • 新增主机变更检测功能,支持用户、crontab、服务及文件变更监控
  • flameshot 支持持续采集模式,增加默认定时采集和阈值触发持续采集功能
  • 新增 DataKit 自身日志采集配置功能

问题修复

  • 修复 Prometheus export 采集器 tags 优先级错误问题
  • 修复全局 host 标签设置 host=__datakit_ip 时无效的问题
  • 修复 eBPF 采集器导致 istio-init 容器不退出的问题
  • 修复容器日志采集使用默认 stdout 配置时存在无用操作的问题
  • 修复 WAL 锁文件使用 PID 导致退出后无法重用的问题
  • 修复 profile 采集器初始化时机问题,避免磁盘缓存未初始化导致的 panic
  • 修复 Statsd 指标采集,新增 event/service check 采集,这俩类数据目前以日志形式来采集

功能优化

  • 为选举模块增加更多日志和指标,便于检测选举频繁切换和采集器暂停失败问题
  • 更新 DataKit HTTP 客户端指标,增加 URL 路径标签和请求体传输汇总指标
  • SQLServer 采集器新增 sqlserver_host 标签,并将 instance 标签改为 counter_instance
  • bug report 新增 Git 配置文件收集功能
  • Windows 进程采集器新增 status 字段支持
  • DDTrace 采集新增更多 source_type 支持

两个月前,我试着想用 ChatGPT 帮我写篇文章《eBPF 介绍》,结果错误百出,导致我又要从头改一遍,从那天我觉得 ChatGPT 生成的内容完全不靠谱,所以,从那天开始我说我不会再用 ChatGPT 来写文章(这篇文章不是由 ChatGPT 生成),因为,在试过一段时间后,我对 ChatGTP 有基于如下的认识:

  1. ChatGPT 不是基于事实,是基于语言模型的,事实对他来说不重要,对他重要的是他能读懂你的问题,并按照一定的套路回答你的问题。
  2. 因为是基于套路的回答,所以,他并不能保证内容是对的,他的目标是找到漂亮的精彩的套路,于是,你会发现,他的内容组织能力和表述还不错,但是只要你认真玩上一段时间,你会发现,ChatGPT 那些表述的套路其实也比较平常一般。它的很多回答其实都不深,只能在表面上。就像 Github 的 Copilot 一样,写不了什么高级的代码,只能帮你写一些常规格式化的代码(当然,这也够了)
ChatGPT 就是一个语言模型,如果不给他足够的数据和信息,它基本就是在胡编乱造

所以,基于上面这两个点认识,以发展的眼光来看问题,我觉得 ChatGPT 这类的 AI 可以成为一个小助理,他的确可以干掉那些初级的脑力工作者,但是,还干不掉专业的人士,这个我估计未来也很难,不过,这也很帅了,因为大量普通的工作的确也很让人费时间和精力,但是有个前提条件——就是ChatGPT所产生的内容必需是真实可靠的,没有这个前提条件的话,那就什么用也没有了

今天,我想从另外一个角度来谈谈 ChatGPT,尤其是我在Youtube上看完了微软的发布会《Introducing your copilot for the web: AI-powered Bing and Microsoft Edge 》,才真正意识到Google 的市值为什么会掉了1000亿美元,是的,谷歌的搜索引擎的霸主位置受到了前所未有的挑战……

我们先来分析一下搜索引擎解决了什么样的用户问题,在我看来搜索引擎解决了如下的问题:

  • 知识或信息索引。查新闻,查股票,查历史,查文档,找答案……
  • 找服务提供商。找卖东西的电商,找帮你修东西的服务,找软件……
  • 信息的准确和可靠。搜索引擎的rank算法保证了最准确、最有用、最权威的信息出现在最前面……(作恶的百度不在此列)

基本上就是上面这几个,搜索引擎在上面这几件事上作的很好,但是,还是有一些东西搜索引擎做的并不好,如:

  • 搜索引擎是基于关键词的,不是基于语义的。所以,搜索引擎并不知道你的真实需求,因此,你会不可避免地要干下面的事,
    • 你经常要不断地增加或调整不同的关键词来提高查询信息的准确度……
    • 你经常要在你查找的信息中进行二次或多次过滤和筛选……
  • 搜索引擎是只能呈现内容,无法解读内容。所以,你找到相关的链接后,你还要花大量的时间来阅读理解,经常性的你不可避免的要干下面的事:
    • 打开一个链接,读到了一大半后,发现你要的内容不在其中,只能关掉再打开一个……
    • 你想要的内容是在的,但是太晦涩,看不懂,太费解,你要找小白友好的版本……
    • 你想要的内容不完整,你需要在很多个链接和网页上做拼图游戏……
    • 内容是无法结构化的展示的,你搜到的东西全都是碎片信息
  • 搜索引擎没有上下文关联,两次搜索是没有关系的。也就是说,人知道的越多,问题也就越多,所以,我们经常会面临下面的问题:
    • 随着我了解的越多,我的信息搜索的会出现分支,这个分支只有我自己的管理,搜索引擎是不关心的,导致我每次都相当于从头开始……
    • 你做计划的时候,你需要从多个不同的搜索中获取你想要的东西,最终组合成你定制化的东西,比如做旅游计划……

好了,我们知道,ChatGPT 这类的技术主要是用来根据用户的需求来按一定的套路来“生成内容”的,只是其中的内容并不怎么可靠,那么,如果把搜索引擎里靠谱的内容交给 ChatGPT 呢?那么,这会是一个多么强大的搜索引擎啊,完全就是下一代的搜索引擎,上面的那些问题完全都可以解决了:

  • 你可以打一段话给搜索引擎,ChatGPT 是读得懂语义的。
  • 因为知道语义,于是在众多搜过结果中,他更知道哪些是你想要的内容。
  • ChatGPT 可以帮你生成 TL;DR,把长文中的要求总结出来形成更易读的短文
  • ChatGPT 可以帮你整理内容,在多个网页中帮你整合和结构化内容
  • ChatGPT 可以有上下文对话,你可以让他帮你不断通过更多的关键词搜索信息,并在同一个主题下生成、组织和优化内容

一旦 ChatGPT 利用上了搜索引擎内容准确和靠谱的优势,那么,ChatGPT 的能力就完全被释放出来了,所以,带 ChatGPT 的搜索引擎,就是真正的“如虎添翼”!

因此,微软的 Bing + ChatGPT,成为了 Google 有史以来最大的挑战者,我感觉——所有跟信息或是文字处理相关的软件应用和服务,都会因为 ChatGPT 而且全部重新洗一次牌的,这应该会是新一轮的技术革命……Copilot 一定会成为下一代软件和应用的标配!

作者:杨易(青风)

在云原生可观测性领域,OpenTelemetry 已经成为事实上的标准。相比于 Java 拥有成熟的字节码增强技术,Go 语言作为静态编译型语言,长期以来缺乏一种成熟、低侵入的自动插桩方案。目前的现有方案主要有:

  1. eBPF:功能强大但主要偏向系统调用层面,对应用层上下文(如 HTTP Header 传播)的处理较为复杂。
  2. 手动埋点:代码改动大,维护成本高,不仅要改业务代码,还得改依赖库的调用方式,显式地在各个关键节点添加 Trace 和 Metrics 逻辑。

为此,阿里云可观测团队和程序语言团队探索了 Go 编译时插桩解决方案,并将其核心能力捐赠给 OpenTelemetry 社区,形成了 opentelemetry-go-compile-instrumentation [ 1] 项目。在和 Datadog、Quesma 等公司的共同努力下,我们发布了首个预览版本 v0.1.0 [ 2]

工作原理

自动插桩工具的核心在于利用 Go 编译器的 -toolexec 参数。-toolexec 会拦截 Go 编译命令,替换成我们的插桩工具。这样,在代码被编译之前,我们就有机会对它进行分析和修改。整个过程可以概括为两个阶段:

1. 依赖分析

在编译开始前,工具会分析应用的构建流程(go build -n),识别出项目中使用的第三方库如 net/http, grpcredis 等。然后,它会自动生成一个文件otel.runtime.go,将对应的 Hook 代码(监测逻辑,后面用 Hook 代码表示)引入到构建依赖中。

2. 代码注入

当编译器处理目标函数时,工具利用 -toolexec 拦截编译,然后修改该目标函数的代码,在函数入口插入一段蹦床代码(Trampoline Code),蹦床代码会跳转到预先写好的 Hook 函数中。

  • 进入函数前(Before):Hook 记录开始时间,提取上下文信息(如 HTTP Headers),启动 Span。
  • 函数执行:执行原有的业务逻辑。
  • 退出函数后(After):Hook 捕获返回值或 Panic,结束 Span,记录耗时。

这种方式的优点是零运行时开销(除了必要的监测逻辑执行时间),因为插桩是直接编译进二进制文件的,不需要像 eBPF 那样在内核态和用户态之间切换,也不需要像 Java Agent 那样在启动时加载。

HTTP 插桩示例

让我们通过一个简单的 HTTP 例子来看看它是如何使用的。

package main
import ...
func main() {
    http.HandleFunc("/greet", func(w http.ResponseWriter, r *http.Request) {
        w.Write([ ]byte("Hello, OpenTelemetry!"))
    })
    log.Fatal(http.ListenAndServe(":8080", nil))
}

手动插桩

需要手动引入 OpenTelemetry SDK,手动创建 Tracer,在 Handler 里手动 Start 和 End Span。

package main
import ...
func initTracer() func(context.Context) error { 
  /* ...几十行初始化代码... */
}
func main() {
    // 1. 初始化 Tracer
    shutdown := initTracer()
    defer shutdown(context.Background())
    // 2. 包装 Handler
    handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 3. 手动提取 Context,开始 Span
        tracer := otel.Tracer("demo-server")
        ctx, span := tracer.Start(r.Context(), "GET /greet")
        // 4. 确保结束 Span
        defer span.End() 
        // 5. 可能还需要手动记录属性
        span.SetAttributes(attribute.String("http.method", "GET"))
        w.Write([]byte("Hello, OpenTelemetry!"))
    })
    // 6. ListenAndServe 也可能需要包装...
    log.Fatal(http.ListenAndServe(":8080", handler))
}

对于成百上千个接口的微服务,这种改造成本是灾难性的。

自动插桩

  1. 下载工具:到 Release 页面 [ 2] 下载
  2. 编译应用:./otel-linux-amd64 go build -o myapp
  3. 配置运行:export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4317" export OTEL_SERVICE_NAME="my-app" ./myapp

编译器会默默地将 HTTP 请求的监测逻辑“织入”到应用二进制文件中。配置好 OpenTelemetry 的导出端点(如 Jaeger 或控制台),运行生成的 server。访问 /greet 接口时, Tracing 数据已经自动生成并上报了,包含了请求路径、耗时、状态码等信息。

从商业化到开源

我们在深度实践 eBPF 技术的过程中,虽然认可其强大,但也发现它难以完美处理应用层上下文。更重要的是,我们不断听到用户反馈,大家对繁琐的手动埋点和高昂的维护成本感到困扰。

为了解决这个痛点,我们开始探索 Go 编译时自动插桩方案,将其上线至阿里云可观测 ARMS 产品 [ 3] ,在这片最严苛的“试验田”里不断迭代,逐步演化成一套成熟的解决方案,不仅能实现零代码修改的链路追踪,还扩展支持了丰富的指标统计、Runtime 监控乃至持续剖析等高级功能,甚至还可以通过自定义扩展的功能完成对企业内部 sdk 的埋点 [ 4]

image

调用链分析

image

持续剖析

这套方案在电商、短剧、AI 视频、汽车等众多领域客户处得到了成功验证。在看到它为用户带来巨大价值、并验证了其稳定性和可行性后,我们决定将其核心能力贡献给 OpenTelemetry 社区,希望它能成为一个普惠的技术。同时,我们与可观测领域的顶尖厂商 Datadog 协作,共同推进,最终促成了这个官方项目 [ 1] 的诞生。

目前项目处于活跃开发阶段,欢迎大家试用、反馈并参与贡献,共同构建更美好的云原生可观测生态。

相关链接:

[1] OpenTelemetry Go 编译插桩项目

https://github.com/open-telemetry/opentelemetry-go-compile-instrumentation

[2] Release 链接

https://github.com/open-telemetry/opentelemetry-go-compile-instrumentation/releases/tag/v0.1.0

[3] 阿里云 ARMS Go Agent 商业版

https://help.aliyun.com/zh/arms/application-monitoring/user-g...

[4] 自定义扩展

https://help.aliyun.com/zh/arms/application-monitoring/use-ca...