跳到主要内容

19 篇博文 含有标签「APO」

查看所有标签

APO v1.1.0 更新:大模型根因分析支持深入分析;优化数据筛选功能;内置 NGINX 日志分析看板

· 阅读需 4 分钟

cover 图

APO 新版本 v1.1.0 更新发布!本次更新主要包含以下内容:

大模型根因分析支持对节点深入分析(企业版)

本次更新允许用户在大模型推理结束后,针对疑似故障根因节点作进一步深入分析,例如检查应用的RED指标、北极星指标、错误链路或错误日志等,在同一个页面闭环完成故障根因分析。

1 图

优化数据筛选功能

在此前版本中,查看“服务概览”或“故障现场”数据时,用户只能手动输入“服务名”或“服务端点”进行筛选,且不支持多选。这在监控服务较多的情况下,极大降低了数据查看的效率。

本次更新优化了筛选体验:

  • 提供了直观的可筛选数据列表
  • 支持通过点击筛选多个数据项
  • 降低了翻页频率,提高了数据查询速度和查看效率

2 图

内置 NGINX 日志分析看板

APO 充分利用 Vector + ClickHouse 实现的日志方案,做到了开箱即用、高效、低成本。利用 APO 的日志功能,不仅可以检索日志内容本身,还可以实现很多有意思的功能。一种使用场景是采集 NGINX 的请求日志,然后通过 Grafana 看板将日志统计为指标进行展示。

3 ��图

本次更新将该看板内置在产品中,现在只需要配置三步即可使用。配置文档见“APO文档”-“配置指南”-“配置NGINX请求分析看板”。

4 图

更多变化请查看下文的更新日志。


更新日志

新增功能

  • (企业版)大模型根因分析支持针对疑似故障节点深入分析
  • 内置集成 ClickHouse 数据源和 NGINX 日志请求看板。配置方式请参考“APO官网-APO文档”-“配置指南”-“配置NGINX请求分析看板”
  • OneAgent 支持采集 RabbitMQ 的监控指标,并提供指标展示看板

功能优化

  • 优化筛选功能,展示可筛选列表,支持通过选择筛选项展示数据
  • 故障现场日志自动合并多行日志,降低存储成本
  • 全量日志支持隐藏部分展示字段
  • 全量日志中支持通过选择直方图范围切换查询时间

缺陷修复

  • 修复可能无法采集到故障现场日志的问题
  • 修复全量日志无法展示部分日志字段的问题
  • 修复全量日志中配置结构化日志后可能出现无法保存日志的问题
  • 修复配置日志库后,日志库描述可能错误的问题

二维码 图

基于APO四步实现炫酷的NGINX请求分析看板

· 阅读需 5 分钟

Cover 图

APO 充分利用 Vector + ClickHouse 实现的日志方案,做到了开箱即用、高效、低成本。利用 APO 的日志功能,不仅可以检索日志内容本身,还可以实现很多有意思的功能。本次为大家介绍使用 APO 的日志功能实现炫酷的 NGINX 请求分析看板,只需简单几步即可实现!

先上效果图:

  • 请求与耗时分析总览

1 图

  • 异常请求分析

2 图

  • URI请求分析

3 图

  • 请求日志明细

4 图


配置步骤

第一步 修改NGINX日志格式

打开 NGINX 配置文件(一般在/etc/nginx/nginx.conf路径下),按照下面的示例修改log_format部分,该部分要完全一样:

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '{"@timestamp":"$time_iso8601",'
'"client_ip":"$remote_addr",'
'"server_ip":"$server_addr",'
'"domain":"$server_name",'
'"request_method":"$request_method",'
'"path":"$uri",'
'"top_path":"$uri",'
'"query":"$args",'
'"request_length":$request_length,'
'"responsetime":$request_time,'
'"response_length":$body_bytes_sent,'
'"referer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"status":$status,'
'"upstreamhost":"$upstream_addr",'
'"upstreamtime":"$upstream_response_time"'
'}';
access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;
}

修改完成后,重启NGINX或者执行命令nginx -s reload使配置生效。

第二步 采集NGINX日志

在安装 apo-one-agent 的 Kubernetes 集群中,编辑名为apo-ilogtail-user-config的ConfigMap,添加采集NGINX日志的配置,注意修改其中LogPath为 NGINX 日志的路径,下面是示例:

data:
pod_stdout_all.yaml: |
...
pod_stdout_file.yaml: |
...
# 以下为新增配置内容
pod_log_file.yaml: |
enable: true
inputs:
- Type: file_log
LogPath: /var/log/nginx/
FilePattern: "*.log"
ContainerFile: true
processors:
- Type: processor_wait_for_signal
DisableSignalSampler: true
ContentsRename:
"__tag__:_container_id_": "_container_id_"
"__tag__:__path__": "_source_"
flushers:
- Type: flusher_http
RemoteURL: http://apo-vector-svc:4310

第三步 在 APO 平台上配置日志库

打开 APO 平台的全量日志页面,在“日志库”部分点击 +,添加新的日志库:

5 图

在弹出的配置页面中,按照以下步骤进行配置:

  1. “日志库名”填写nginx_access_log
  2. 在“匹配规则”中配置能够匹配到NGINX日志的规则,例如通过 _source_=/var/log/nginx/access.log 进行匹配
  3. “日志格式配置”中选择“结构化日志”,并在文本框中输入以下内容:
{
"@timestamp": "2024-12-06T06:44:17+00:00",
"client_ip": "10.244.0.46",
"client_region": "",
"client_city": "",
"client_latitude": 0.1,
"client_longitude": 0.1,
"server_ip": "10.244.167.148",
"domain": "localhost",
"request_method": "GET",
"path": "/grafana/api/live/ws",
"top_path": "/grafana/api/live/ws",
"query": "-",
"request_length": 1259,
"responsetime": 0.010,
"response_length": 10,
"referer": "-",
"http_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"status": 403,
"upstreamhost": "10.96.2.121:80",
"upstreamtime": 0.009
}
  1. 最后点击“保存”。

第四步 导入NGINX看板并查看数据

打开 APO 平台的“中间件大盘”,在右侧点击“新建”->“导入”:

6 图

在导入页面,输入仪表板ID“22037”,点击加载:

7 图

然后在页面中选择数据源为“ClickHouse”(如果没有该数据源需要手动配置),点击“Import”即可导入成功。在该看板的“项目”筛选框中手动输入

apo.logs_nginx_access_log

(与配置日志库时的日志库名称保持一致):

8 图

到这里就完成了所有步骤,尽情享受炫酷的NGINX请求分析看板吧!


鸣谢

文中使用的 Nginx 日志分析看板StarsL 设计并发布在 Grafana 中,感谢大佬的分享。文中给出的方案简化了配置流程,因此看板中部分数据可能存在缺失,您可以检查看板中的查询条件,根据需求调整 NGINX 日志格式解锁完整看板。


APO介绍:

国内开源首个 OpenTelemetry 结合 eBPF 的向导式可观测性产品

apo.kindlingx.com

https://github.com/CloudDetail/apo

APO OneAgent 设计思路

· 阅读需 12 分钟
Autopilot Observability
APO 向导式可观测性平台

Cover 图

之前的文章介绍过APO是如何使用Grafana Alloy采集prometheus生态的指标体系。这篇文章介绍APO是如何采集Trace和log的,这两项数据的采集存在以下问题:

  • 日志需要配置采集的日志目录,并不是每个应用的日志目录都非常规范,这就导致配置工作量的增加
  • Trace需要配置针对语言的Agent完成数据采集
  • 在容器环境不管是修改镜像或者使用init Container方式,都有挺多配置的工作

OneAgent的设计目标

OneAgent的设计目标是尽量减少用户的配置工作,尽快的完成数据的采集。在设计过程中,参考了很多的业界先进的技术实现,比如datadog的onestep agent的实现机制,另外重要的就是Odigos这家公司的实现。Datadog不用做更多的介绍,这里简单介绍下Odigos这家公司:Odigos的口号是“Instant Distributed Tracing”,有兴趣可以访问其官网:https://odigos.io/ ,OpenTelmetry 的 GO auto instrument 项目:https://github.com/open-telemetry/opentelemetry-go-instrumentation 就是由该公司捐献的。

Odigos开源的https://github.com/odigos-io/odigos 实现中能够实现以下功能:

  • 基于应用当前已经启动的POD进行语言识别
  • 基于K8s manifest挂载对应语言的探针文件和配置到对应的应用
  • 通过更新K8s manifest触发应用重启以应用探针

为了实现OneAgent的设计目标,我们调整了Odigos的执行流程,使用Webhook将'更新K8s manifest'和'应用重启'两个步骤进行了分离:

  1. 更新内容以patch形式存储到应用的Annotations中
  2. 用户手动重启pod时,通过webhook拦截pod创建请求,应用Annotations中保存的patch

这样可以避免用户对整个Namespace装载探针时,集群所有应用同时重启,造成资源紧张;而是预先设置好探针配置,在应用下次更新时,自动完成探针的添加。

Odigos中没有包含非K8s应用的实现,我们采用了Linux的Preload机制来完成下面的工作:

  • 通过LD_PRELOAD加载Preload库,在应用启动前拦截启动命令,完成语言识别和后续工作
  • 基于识别到的语言设置探针配置,通常以特定的环境变量加入到启动命令
  • 将改造后的启动命令交给Linux继续执行,完成应用的启动和探针的应用

为了实现OneAgent的设计目标,我们调整了Odigos的执行流程,使用Webhook将'更新K8s manifest'和'应用重启'两个步骤进行了分离:

  1. 更新内容以patch形式存储到应用的Annotations中
  2. 用户手动重启pod时,通过webhook拦截pod创建请求,应用Annotations中保存的patch

这样可以避免用户对整个Namespace装载探针时,集群所有应用同时重启,造成资源紧张;而是预先设置好探针配置,在应用下次更新时,自动完成探针的添加。

Odigos中没有包含非K8s应用的实现,我们采用了Linux的Preload机制来完成下面的工作:

  1. 通过LD_PRELOAD加载Preload库,在应用启动前拦截启动命令,完成语言识别和后续工作
  2. 基于识别到的语言设置探针配置,通常以特定的环境变量加入到启动命令
  3. 将改造后的启动命令交给Linux继续执行,完成应用的启动和探针的应用

针对日志数据的采集,我们采用了阿里开源的 https://github.com/alibaba/ilogtail 工具,它有下面一些优点:

  1. 基于Linux的inotify机制,相较于轮询读取文件,消耗更低
  2. 内置一套设计良好的插件系统,性能开销较大的采集阶段使用C语言实现,确保高效;后续处理采用Go实现,可以快速的进行数据完善和处理
  3. 内置的采集插件支持了对父级目录下日志文件检索,避免用户手动配置每个应用日志地址

在ilogtail基础上,我们实现了功能增强插件,用于统计需要的日志指标,填充日志进程信息和日志数据采样。


程序语言的自动识别

目前的程序语言识别均基于启动命令特征和启动文件信息:

  1. JAVA: 检查启动命令是否满足 java [-options] class [args。。。] 或 java [-options] -jar jarfile [args。。。] 格式
  2. PYTHON: 检查启动命令中是否包含python
  3. Golang: 读取启动文件的内容,检查是否有可识别的buildInfo信息
  4. NodeJS: 检查启动命令中和启动文件路径中是否包含node
  5. Dotnet: 检查启动环境变量中的环境变量名中是否包含DOTNET和ASPNET

探针配置的注入

在完成应用语言类型的识别后,开始准备探针的配置信息。

1.OTEL体系下的APM探针均原生支持基于环境变量来设置探针,我们目前主要预设了下面的配置:

  • OTEL_EXPORTER_OTLP_ENDPOINT 设置探针数据的发送地址
  • OTEL_SERVICE_NAME 设置应用名称
  • OTEL_METRICS_EXPORTER/OTEL_LOGS_EXPORTER 设置为 none,关闭指标/日志采集

2.Skywalking当前以内置的配置文件作为中转,也支持使用环境变量进行配置,主要设置:

  • SW_AGENT_COLLECTOR_BACKEND_SERVICES 设置探针数据发送地址
  • SW_AGENT_NAME 设置应用名称

对于K8s应用,大部分的环境变量会由Odigos通过k8s提供的Device Plugins加入到容器内;

用户已经在K8s Manifest定义了的环境变量,会在K8sManifest显式的合并到用户定义的Envs部分。

对于非K8s应用,环境变量会直接被添加到启动命令中,如果和用户定义变量发生冲突,始终使用用户定义变量。


探针的拷贝

在K8s环境中,由于容器的文件隔离特性,应用无法直接获取到需要的探针文件。Odigos通过将宿主机路径挂载到应用容器内部来向应用提供探针文件,默认将探针文件放到应用的/var/odigos 目录下。

在非K8s环境中,由于应用可以直接获取到宿主机上的探针文件,所以当前没有进行探针文件的拷贝。

日志和进程信息关联

在K8s环境下,采集器通过日志的文件路径可以直接关联到容器,再由容器可以直接关联到所属的应用。这使得在查询日志时,可以通过应用来过滤日志,对于查找关键信息有很大帮助。

非K8s环境中,采集器获得的日志的文件路径就不再像K8s环境中那么规范。不论是ilogtail所使用的inotify机制,或者其他基于文件轮询的日志采集工具,都无法获取到日志是由哪个进程产生的。常规的处理方式是整个项目推行日志文件路径规范,从而可以解析日志文件路径来获取应用信息,这是一种成本较高的解决方案。

APO使用了Linux的Fanotify接口来关联文件和应用信息,它是一个在linux内核2.6.37引入的系统接口,利用Fanotify可以自动关联进程所产生日志文件。

为了降低监听Fanotify事件的资源开销,APO遵循下面这套方案进行文件到应用关联关系的维护:

  1. 通过inotify获取到日志文件更新信息
  2. 将日志文件路径添加fanotify监控标记,监控该文件的修改和关闭事件
  3. 日志文件下次被修改时,获取到修改该文件的进程信息。缓存该日志文件路径对应的进程信息,并关闭对该文件修改事件的监控
  4. 直到接收到该日志文件的关闭事件,这意味着之前获取的进程停止了对该文件的写入;此时重新开始监控该文件的修改事件,以更新该日志文件路径对应的进程信息

通常仅应用进程会对日志文件进行修改,因此上面这套方案可以以极低的消耗完成较为可靠的日志文件路径到进程信息的关联。


总结

APO通过OneAgent中的集成修改的Odigos机制,实现了不同语言的应用程序自动完成OTEL trace探针的安装和环境变量配置,同时通过集成ilogtail采集了日志,并能够实现日志和应用的关联。

OneAgent能够在容器环境和传统虚拟机上同样工作。

APO介绍:

国内开源首个 OpenTelemetry 结合 eBPF 的向导式可观测性产品

apo.kindlingx.com

https://github.com/CloudDetail/apo

APO v0.3.0 发布:关联告警事件;提升数据筛选效率;优化安装体验

· 阅读需 5 分钟
Autopilot Observability
APO 向导式可观测性平台

Cover 图

APO 软件的新版本 v0.3.0 已经正式发布了!这次的更新不仅带来了功能上的改进,还有用户体验上的重大升级。以下是此次更新的主要亮点:

关联告警事件,快速发现故障

在 v0.3.0 版本中,我们引入了全新的告警事件关联功能。这一特性可以帮助您更高效地识别和定位服务相关的潜在问题。通过将相关的告警事件聚合在一起,您可以更容易地追踪到问题的根本原因,从而加快故障排除的速度。 1 图

此外,我们还将告警状态灯关联到了具体的告警原因,只需要将鼠标悬浮到状态灯上即可查看,再也不需要问“为啥这里红”了! 2 图

提升数据筛选效率

为了帮助用户更好地从海量数据中获取有价值的信息,我们在新版本中加强了“服务概览”页面数据筛选的功能。现在,您可以基于“服务名”、“服务端点”或“命名空间”来精确定位期望查看的数据,这将极大地提高数据分析的效率。 3 图

更顺滑的安装流程,优化安装体验

我们一直致力于简化软件的安装步骤,以减少用户的前期投入时间和精力。在本次更新中,我们重新设计了安装流程,尤其减少了探针无法启动的情况,使得整个过程更加流畅。

我们衷心感谢所有参与测试和支持 APO 社区的用户们。正是因为有了你们的反馈和支持,APO 才能不断进步。我们期待着您的宝贵意见,也欢迎您继续参与到 APO 的成长旅程中来!


更多变化请查看下述更新列表。

新增功能

  • “服务概览”页面新增筛选条件,可模糊查询服务名、服务端点和命名空间
  • “服务详情”页面新增告警事件列表
  • 告警状态灯支持鼠标悬浮显示告警原因
  • 指标曲线图支持鼠标悬浮放大,便于查看具体时间的指标
  • “服务详情”页面指标曲线图支持通过选择时间范围修改查询时间
  • 新增中间件指标监控大盘

功能优化

  • 在 Kubernetes 环境安装 OneAgent 时,支持对所有命名空间进行监控
  • 服务概览页面展示服务所属的命名空间,在传统服务器环境中显示N/A
  • 优化“应用基础设施大盘”指标显示效果,兼容各类监控环境
  • 接入 SkyWalking 后,“链路追踪”页面支持按照 SkyWalking 的 TraceID 进行检索

缺陷修复

  • 修复时间选择器在切换页面时可能被重置的问题
  • 修复容器环境可能无法获取到容器启动时间的问题
  • 修复 node-agent 部分情况下会内存溢出的问题

其他

  • 首次进入服务详情页时,展示功能引导
  • 增加功能与术语的解释说明

APO v0.4.0 发布:新增影响面分析;新增调用数据库指标;优化告警事件关联展示

· 阅读需 4 分钟
Autopilot Observability
APO 向导式可观测性平台

Cover 图

APO 新版本 v0.4.0 正式发布!本次更新主要包含以下内容:

新增影响面分析,识别服务端点对服务入口的影响

服务入口是指业务被访问时调用的第一个服务端点,在调用拓扑图中处于最上游。服务入口直接反映了系统对外提供服务的状态,因此了解服务入口的状态对于保证系统服务的稳定性至关重要。

APO 实现了服务端点粒度的拓扑图,还原了每一个服务端点的调用路径,能够准确定位其调用路径上的服务入口。我们在服务详情页中关联了服务入口,便于用户及时了解当前服务对服务入口的影响情况,对影响面进行分析。 1 图

新增服务调用的数据库指标

应用的RED指标(请求次数、错误率、响应延时)反映了应用提供的服务质量,而服务质量受到多种因素影响,其中应用对外部服务的依赖是重要的一部分。本次更新 APO 优先引入了数据库调用指标,当服务质量发生问题时,能在第一时间了解是否是外部数据库导致的。 2 图

优化告警事件关联展示

本次更新中,如果服务端点关联到告警事件,将优先展示告警详情,同时优化了告警列表的展示效果。 3 图

我们衷心感谢所有参与测试和支持 APO 社区的用户们。正是因为有了你们的反馈和支持,APO 才能不断进步。我们期待着您的宝贵意见,也欢迎您继续参与到 APO 的成长旅程中来!


更多变化请查看下述更新列表。

新增功能

  • 服务详情页新增针对服务入口的影响面分析
  • 服务详情页新增数据库调用指标(服务粒度)
  • 调整架构提高适配性,基础功能支持全部内核版本

功能优化

  • 查询故障现场链路增加更多筛选条件
  • Kubernetes 事件统计将警告事件标记为红色
  • 优化 OneAgent 中 Alloy 的内存占用

缺陷修复

  • 修复重启 OneAgent 导致 JS、Python 语言 Instrument 探针丢失的问题
  • 修复服务概览页无法通过指标曲线图切换时间范围的问题

APO v0.5.0 发布:可视化配置告警规则;优化时间筛选器;支持自建的ClickHouse和VictoriaMetrics

· 阅读需 5 分钟
Autopilot Observability
APO 向导式可观测性平台

Cover 图

APO 新版本 v0.5.0 正式发布!本次更新主要包含以下内容:

新增页面配置告警规则和通知

在之前的版本中,APO 平台仅支持展示配置文件中的告警规则,若用户需要添加或调整这些规则,必须手动编辑配置文件。而在新版本中,我们新增了一套可视化的告警规则配置界面,使用户能够直接通过 APO 控制台来进行告警设置。此外,配置界面内置了常用的指标查询模板,用户只需根据实际需求选取相应的指标并设定阈值,即可轻松完成规则配置。

1 图

同时新版本还支持配置告警通知,目前支持邮件通知和 Webhook 通知。

2 图

0.5.0 作为告警配置的第一个版本,仅包含了基础功能,未来我们还将继续优化用户体验,并带来更丰富的配置选项以满足更复杂的场景需求。欢迎大家积极向我们提出建议。

更好用的时间筛选器

在之前的版本中,APO 的时间筛选器仅支持查询绝对时间,并且需要用户手动触发更新操作。而在新版本中,我们重新设计了时间筛选器,增加了相对时间的支持,并实现了页面的自动刷新功能。以后再也不会出现“新监控了一个应用,但怎么刷新页面也没数据”的问题啦!

3 图

支持使用自建的 ClickHouse 和 VictoriaMetrics

从 0.5.0 版本开始,APO 支持将数据存储到用户自建的 ClickHouse 和 VictoriaMetrics 中,无论您是使用单节点还是分布式集群方案,APO 都能够无缝接入。在生产环境中,我们建议使用托管的 ClickHouse 和 VictoriaMetrics 集群来保证可用性。

近期,APO 社区正在积极设计开发“全量日志”的功能,我们调研分析了业内优秀的日志方案,结合在可观测性领域积累多年的经验,完整设计了从日志的采集、处理、存储到展示的方案,将 APO 对日志的思考融入其中。我们的目标始终是为社区提供一款开箱即用、高效率、低成本、强扩展性且拥有良好用户体验的可观测性产品,全量日志方案自然也不例外。全量日志功能预计将于10月开源,敬请期待!

我们衷心感谢所有参与测试和支持 APO 社区的用户们。正是因为有了你们的反馈和支持,APO 才能不断进步。我们期待着您的宝贵意见,也欢迎您继续参与到 APO 的成长旅程中来!


更多变化请查看下述更新列表。

新增功能

  • 新增页面配置告警规则和通知功能
  • 服务实例中关联实例所在节点信息,辅助排查节点

功能优化

  • 优化时间选择器,支持查看相对时间,支持自动更新
  • 优化故障现场链路页面描述,使信息显示更清晰

缺陷修复

  • 修复单进程镜像覆盖JAVA_OPTIONS环环境变量失败导致无法加载探针的问题
  • 修复部分情况下无法获取 Go 语言程序的链路追踪数据的问题

其他

  • 支持对接自建的低版本 VictoriaMetrics,建议版本 v1.78 以上
  • 支持对接自建的 ClickHouse 集群(安装时配置)
  • 服务概览无数据时提示安装和排查手册
  • 提供一键安装脚本部署测试应用,验证 APO 安装结果和产品功能
  • 提供仅使用链路追踪或采集指标的安装方案

APO v0.7.0 更新:日志功能完整版发布!

· 阅读需 5 分钟

Cover 图

在 v0.6.0 版本中,APO 发布了基于 ClickHouse 开箱即用的高效日志方案,为用户提供了采集、处理和检索全量日志的基础功能。新版本在此基础上进一步强化了日志处理和检索的能力,提升了用户体验。

支持为不同日志设置不同的解析规则,提取出关键信息并加速检索

日志中往往存在许多关键信息,将这些关键信息提取出来能够针对性的检索数据,通过分析此类关键信息能够发现平时难以注意到的洞察。通常不同的应用在输出日志时,会采用不同的日志格式,要从日志中提取关键信息,需要能够针对应用和日志格式设置解析规则。

新版本中用户可以根据不同的日志格式设定自定义解析规则,从日志内容中提取出关键字段,例如从 Nginx 日志中解析出用户IP地址、访问路径、响应状态码等信息。通过设置解析规则,APO 能够将这些关键信息独立展示,这不仅加速了检索过程,还提高了数据的准确性和相关性。

1 图

支持对接外部日志表,在同一个平台中查看不同数据源

用户通常需要处理来自多个系统和平台的日志数据。APO 新版本支持对接外部日志表,使用户能够在同一平台上查看和分析不同来源的数据。这一功能简化了数据整合流程,消除了多平台切换的繁琐,提高了管理效率和协作能力。

2 图

支持全文检索和查看日志上下文

全文检索功能使用户能够迅速定位具体信息,而查看日志上下文的能力则为用户提供了更全面的事件背景。这对于问题排查和事件分析尤为重要,用户可以更清晰地理解问题的复杂性,快速制定解决方案,从而提高系统的稳定性和可靠性。

3 图

4 图

增强对 Go 语言程序的兼容性

此外,该版本使用 Grafana Beyla 探针替换了 opentelemetry-go-instrumentation 探针,增强对 Go 语言程序的兼容性。Grafana Beyla 能够无侵入性地采集 Go 语言程序的链路追踪数据,APO 集成并增强了该探针,使各类数据能够无缝集成,保证不同语言程序间体验的一致性。 注意 Grafana Beyla 仅支持运行在满足以下条件的内核中:

  • Linux 内核 5.8 及以上版本并且开启了 BTF 内核编译选项;通常 5.14 及以上版本已经默认开启
  • RedHat Enterprise Linux 4.18 kernels build 348 及以上,包括 CentOS, AlmaLinux 和 Oracle Linux

更多变化请查看下述更新列表。

新增功能

  • 日志功能支持为不同的应用配置不同的日志解析规则
  • 支持对接外部 ClickHouse 日志表,在同一个平台中查看不同日志数据源

功能优化

  • 采用 Beyla 替换 openTelemetry-go-instrument 探针,优化对 Go 语言程序的兼容性
  • 优化 OneAgent 的内存开销

缺陷修复

  • 修复 apo-backend 非持久化配置下 SQLite 创建数据库文件失败的问题
  • 修复 ClickHouse 中全量日志数据无法配置副本的问题
  • 修复响应时间90分位数查询失败的问题
  • 修复多实例情况下日志错误数查询失败的问题

APO介绍:

国内开源首个 OpenTelemetry 结合 eBPF 的向导式可观测性产品

apo.kindlingx.com

https://github.com/CloudDetail/apo

APO v0.8.0 更新:告警通知支持钉钉和微信;主机指标大盘;若干问题修复

· 阅读需 4 分钟

Cover 图

本次更新,APO 带来了一些新功能,并对若干问题进行了修复。

支持通过钉钉和微信发送告警通知

APO 现已支持通过钉钉和微信发送告警通知。当系统检测到异常情况时,可以立即通过这两种广泛使用的通讯平台向相关人员或团队发送告警信息,确保问题能够得到及时响应和处理。

1 图

集成主机监控指标大盘

在旧版本中,APO 展示了主机的基础监控指标,如 CPU 使用率、内存占用、网络流量等。但APO 采集到的主机指标远不止于此,为了协助用户迅速发现并定位潜在的问题,优化资源分配,提升效率,在新版本中,APO 集成了详细的主机监控指标大盘,为用户提供了一个直观的界面来查看主机的性能指标。

2 图

预告 1.0 版本

APO 正在向发布 1.0 版本冲刺,1.0 版本将带来账号登录和管理功能,修复已知的若干问题,进一步提高稳定性。从 1.0 版本开始,APO 将尽可能保证向前兼容,减少破坏性改动,以便于用户能够更加顺畅地升级至最新版本。

在 APO 的迭代发展过程中,衷心感谢每一位社区用户的反馈和支持,正是你们的帮助让 APO 不断进步和完善。让我们一起期待 1.0 版本,一起见证 APO 的成长与进步!


更多变化请查看下述更新列表。

新增功能

  • 支持发送告警到钉钉和企业微信
  • 新增宿主机监控大盘

功能优化

  • 配置告警规则时新增更多预置指标

缺陷修复

  • 修复服务概览中日志错误数曲线可能不准确的问题
  • 修复影响面分析中可能出现非服务入口的问题
  • 修复多实例情况下日志错误数指标错误的问题
  • 修复部分场景下服务关联到错误的实例的问题
  • 修复网络延时指标中持续出现值为1的数据问题
  • 修复虚拟机场景下网络延时指标重复的问题

其他

  • 优化 OneAgent CPU和内存开销
  • 升级 OneAgent 集成的 opentelemetry-java-instrumentation 版本到 2.8.0
  • 安装时支持配置服务端持久卷大小

APO介绍:

国内开源首个 OpenTelemetry 结合 eBPF 的向导式可观测性产品

apo.kindlingx.com

https://github.com/CloudDetail/apo

APO v1.0.0 正式发布!

· 阅读需 9 分钟

Cover 图

经过近四个月的打磨,APO 终于迎来了 1.0.0 正式版的发布!自开源以来,APO 团队通过不断迭代和优化,确保了产品的稳定性和功能完整性。从最初的开源版本到今天的正式版,APO 已经经历了一系列重大更新和改进。现在,我们很高兴地向大家介绍 APO 的最新状态以及它所能提供的强大功能。

愿景

APO 致力于打造一个一键安装、开箱即用且简单易用的可观测性平台,我们希望每个用户都能够轻松部署并使用我们的工具,无需复杂的配置过程或深厚的技术背景。通过集成 eBPF 技术与 OpenTelemetry 生态,APO 实现了对分布式系统的高效监控,同时保持了较低的数据存储成本。此外,我们提供的向导式排障界面可以帮助用户快速定位问题根源,减少故障排查时间,提高运维效率。

功能

为了实现这个愿景,APO 不断迭代和优化,在最新的1.0.0版本中,提供以下亮点功能:

  • 一站式可观测:APO 集成了链路、指标、日志和事件等数据,提供数据查询、告警、分析功能,能够一站式解决可观测性和故障定位的需求

1 图

  • 自动化部署Tracing探针:通过 OneAgent 技术,可以自动在传统服务器和容器环境中安装多语言的 Tracing 探针,极大简化用户的配置工作

  • 开箱即用、高效低成本的日志采集方案:充分利用ClickHouse实现高效低成本的日志方案

2 图

  • (企业版功能)告警分析:针对告警/异常进行分析,帮助用户定位根源告警,自动关联相关数据,快速定位问题根源

3 图

  • (企业版功能)集成大语言模型AI:解释、分析告警事件等关联数据,重塑排障新交互,帮助用户充分利用数据价值

4 图

更多功能详见文章末尾“附录”部分。

未来

展望未来,APO 将继续秉承开放创新的精神,不断迭代优化产品,实现最终的愿景。计划中的改进方向包括但不限于:

  • 持续提升用户体验:增加搜索筛选菜单、日志分词搜索、日志搜索高亮、更多配置可视化……
  • 支持更全面的用户权限体系
  • 支持日志告警功能
  • 支持统计分析业务指标,从业务视角识别故障
  • 支持采集请求级别和进程级别的 OnCPU 和 OffCPU 火焰图数据,定位代码级原因
  • 北极星指标支持数据库类型应用,协助分析SQL执行耗时/性能分析
  • 深度集成大语言模型,降低产品使用门槛,使产品更易用
  • 进一步优化OneAgent资源开销

欢迎大家通过各种渠道积极对 APO 提出建议,一起打造最简单易用的可观测性平台。

总结

随着 APO v1.0.0 的发布,我们迈出了重要的一步,但这仅仅是开始。感谢所有用户的信任与陪伴,让我们携手共进,一起见证 APO 的成长与发展。


相比于 0.9.0 版本,1.0.0 的变化请查看下述更新列表。

新增功能

  • 新增用户登录认证功能
  • 上下游依赖关系中新增应用对外调用节点
  • 新增统计应用对外调用中间件的RED指标
  • 新增 Java JVM 性能指标,并展示在应用基础设施大盘中
  • 企业版功能:告警分析中新增通过大语言模型分析数据的功能

功能优化

  • 配置日志库时,支持设置日志字段的数据类型
  • 配置日志库时,支持自动解析 JSON 格式日志

缺陷修复

  • 修复全量日志中长日志滚动时文字闪烁的问题
  • 修复无法采集容器指标时会持续产生错误告警的问题
  • 修复Pod中存在Go语言容器时无法注入探针的问题
  • 修复为Python语言容器注入探针失败的问题

附录:更多功能列表

基于业务接口级别的拓扑

APO 将相同应用的不同接口调用区分开,清楚地给出应用执行某类业务时的调用关系,相同的应用节点可能会按照调用顺序出现多次。完整拓扑结构太复杂,没有实现拓扑本身应该具有的“地图导航”引导用户找到疑似故障节点的功能,因此 APO 利用延时曲线相似度来收缩相似度较低的节点,更多节点采用表格形式展示,避免拓扑过于复杂无法分析。当用户需要查看下游依赖节点时,可以点击节点名快速切换到不同节点的详情页面。

5 图

基于相似度算法排序高效识别级联的故障节点

在请求延时发生故障时,很多节点都会被级联的影响到,从传统告警中看是很多节点都有告警,在APO中,每个节点都会将其下游依赖的延时进行相似度曲线匹配,从而找到延时最相似的节点,最相似的节点是根因的可疑性更高,这里的下游依赖包括直接下游和下游依赖的依赖。

6 图

7 图

北极星因果指标主因判定算法

单纯的分析链路数据会留下很多盲区,难以快速判断延时升高时是自身导致还是依赖导致。北极星因果指标主因算法能够直接给出延时波动是由何种原因导致的,给出了故障原因的方向。例如下图给出的主因是对外网络调用延时变化导致了应用延时变化,结合网络延时指标可以判断出原因到底是网络延时变化还是下游节点延时变化。

8 图

快速找到故障链路和日志

根据延时、错误率和日志错误数量曲线可以快速定位故障可能发生时间点,从而查看时间点附近的日志或链路数据。

13 图

内置丰富的指标和展示大盘,快速查看各类监控指标

11 图

自定义告警规则,并通过钉钉、微信、邮件等方式发送通知

12 图


APO介绍:

国内开源首个 OpenTelemetry 结合 eBPF 的向导式可观测性产品

apo.kindlingx.com

https://github.com/CloudDetail/apo

APO 如何快速判断云环境网络质量是否有问题

· 阅读需 8 分钟
Autopilot Observability
APO 向导式可观测性平台

Cover 图

基于 eBPF 获取网络指标存在局限

eBPF 可以获取到网络 rtt 以及 srtt 等指标,这些指标确实能够反应网络质量,但是其实现是有局限性的,在当前绝大多数客户使用场景是不能反映网络质量的。

eBPF 在网络质量监控中的局限性主要体现在以下几个方面:

  1. TCP 建连时获取 srtt 指标: eBPF 在 BCC 中的实现是通过在 TCP 建连时获取内核维护的 srtt(smoothed round-trip time)指标。但是,TCP 连接建立完成后,内核并不会持续追踪每个网络包的传输时间。这就意味着在长连接场景中,srtt 指标并不能反映当前的网络质量变化。不仅仅是 BCC,我们自己开源的 Kindling 也有同样的局限,同时我们也对比了 datadog 等 eBPF 探针实现,发现都有这个问题。
  2. 长连接场景中的不足: 现代微服务架构中普遍使用长连接来减少连接建立和拆除的开销。然而,在这种场景下,内核并不会持续更新 srtt 指标,从而无法反映长连接期间的网络质量变化。
  3. 实验验证: 通过在 Tomcat 配置数据库连接池连接 MySQL,然后在两者之间注入网络延时故障的实验。在连接建立后,如果在任意一端注入延迟,BCC 的 srtt 指标将不会变化,因为内核不会追踪这些后续包的传输时间。

有没有其他方式判断网络质量

文章《孙英男-B 站大规模计算负载云原生化实践》是 B 站建立容器云过程的分享,他们在判断网络质量抖动的时候使用的 ping 来判断网络是否抖动。

使用 ping 来判断网络质量是大家常用的一个习惯,而对于 ping 的延时大家在实践中已经形成了一些认知,比如如果 ping 的延时超过 100ms,那么在线网络游戏估计玩不成了。

使用 Ping 来判断网络质量的优点

  1. 简单易用: ping 命令几乎可以在所有操作系统中使用,无需复杂的配置。
  2. 实时监控: 可以实时地检测网络延迟和丢包率。
  3. 网络连通性: 可以快速判断两个节点之间的连通性。
  4. 低开销: 相比其他方法,ping 对系统和网络资源的消耗较低。

使用 Ping 来判断网络质量局限性

  1. 误导性结果: 有时网络中的 ICMP 数据包优先级较低,可能导致延迟或丢包率看起来比实际情况更严重。
  2. ICMP 流量限制: 某些网络设备(如防火墙)可能会限制 ICMP 流量,导致 ping 测试结果不准确,甚至 ping 不通
  3. 大规模集群的限制: 高频 ping 造成的网络负载:在大规模集群环境中,对大量节点进行频繁 ping 操作,会产生大量 ICMP 流量,从而增加网络负载,影响正常业务流量。虽然一次 ping 的资源开销很小,但是集群规模大了之后,每个容器两两之间都进行 ping,这种消耗将是非常大的,大量的 ping 操作会消耗系统的 CPU 和内存资源,尤其是在需要同时监控许多节点的情况下。

如何才能低开销的完成网络质量的快速判断

虽然 eBPF 和 ping 包的方式都有一定局限性,但是 eBPF 的局限性受限于内核的实现,该局限没有办法突破的,而 ping 包的局限是可以突破的。

  • 误导性结果的突破:用户认知的突破,如果发现 ping 延时很严重了,那真实的网络流量更加严重,这点突破很容易。
  • ICMP 流量限制:防火墙的配置即可允许 ping 包的发生。
  • 大规模集群的限制:大规模集群中,如果两两相互都需要 ping 这是非常耗资源的做法,但是我们注意到实际场景中容器通过网络与其他容器交互的范围是有限制的,并不会和所有的容器都进行交互,这点是有优化空间的。

大规模集群适用低开销基于 ping 包的网络质量评估方案

开源项目 coroot 有一个非常好的思路,他们使用了一个叫做 pinger 的组件,该组件工作原理如下:

  • 基于 eBPF 获取容器之间的关系图,并不是获取 SRTT 等指标
  • 根据节点关系图来发送 ping 包,上游节点对下游节点进行 ping,这样能够极大的降低任意两两 pod 互相 ping 的开销

但是 coroot 的 eBPF 实现要求内核版本高于 4.14,国内还有很多操作系统停留在 centos7 系列的用户,他们是没有办法用 coroot 的实现。

我们在 coroot 的基础之上,针对国内的环境做了优化,主要优化如下:

  • 通过读取 proc 目录下来获取关系图,而不是通过 eBPF 获取关系图,这样就降低了对内核版本的依赖
  • 沿用了 coroot 原有 pinger 组件的思路,上游节点对下游节点进行 ping,极大降低任意两两 pod 互相 ping 的开销
  • 数据最后通过 exporter 暴露到 prometheus 或者 victoria metrics 中

最终效果图,展示 srcip 到 dstip 的 ping 值

图 1


题外话:我们不去修改 coroot ebpf 代码使其适配低版本内核主要是基于投入产出比,适配低版本内核需要调整代码量较大,我们通过 eBPF 采集的北极星因果指标是适配了低版本内核的。