在当今复杂且不断变化的 IT 环境中,可观察性对于确保系统的健康和性能至关重要。通过了解系统中发生的情况,您可以快速识别和解决问题、提高性能、预防问题并做出更好的决策。
以下是可观察性的一些关键组成部分:
指标:指标是系统性能的测量标准。
日志:日志是系统中发生的事件的记录。
跟踪:跟踪是追踪系统中请求流的一种方式。
通过收集和分析这些数据,用户可以深入了解他们的系统及其性能。这有助于识别和排除问题、提高性能并预防问题。
如何实现可观测性?
这需要大量的工作,从选择正确的工具、检测代码、收集和存储数据进行分析,到从中产生见解。拥有一项可以简化大部分这些任务并提供与知名监控提供商集成选项的技术将简化实现基础设施和应用程序性能监控的可观察性。在本文中,我们演示了如何使用 eBPF 和 OpenTelemetry 实现可观察性,而无需任何代码检测。
什么是 eBPF?
eBPF是一种可以在特权上下文(例如操作系统内核)中运行沙盒程序的技术。它可以安全高效地扩展内核的功能,而无需更改内核源代码或加载内核模块。
eBPF 可观察性是一项新技术,可以提高对系统和网络的可见性和控制力。它通过提供一种从内核收集和分析数据的方法来实现这一点,而无需修改内核本身,也无需对应用程序代码进行任何操作。这使它成为解决性能问题、识别安全漏洞和优化系统资源的强大工具。
什么是 OpenTelemetry?
OpenTelemetry 是一个 可观察性 框架和工具包,旨在创建和管理 遥测数据, 例如 跟踪、 指标和 日志。至关重要的是,OpenTelemetry 与供应商和工具无关,这意味 牙医数据库 着它可以与各种可观察性后端一起使用,包括Jaeger 和 Prometheus等开源工具 以及商业产品。OpenTelemetry 是一个 云原生计算基金会 (CNCF) 项目。
eBPF 和 OpenTelemetry 集成
eBPF 为 Linux 内核中的动态跟踪和分析提供了强大的机制,而 OpenTelemetry 是一组用于收集、导出和可视化遥测数据的开放标准和工具。通过结合使用 eBPF 和 OpenTelemetry,您可以以最小的开销深入了解应用程序的内部结构以及底层系统。这种组合使您能够从内核和各个应用程序层收集细粒度的遥测数据,从而全面了解系统的行为和性能。
为什么是 Pixie?
开发人员可以使用 Pixie 查看其集群的 还旨在吸引网站访问者的注意力 高级状态(服务地图、集群资源、应用程序流量),还可以深入了解更详细的视图(pod 状态、火焰图、单个完整应用程序请求)。它提供以下功能:
自动遥测: Pixie 使用 eBPF 自动收集遥测数据,例如全身请求、资源和网络指标、应用程序配置文件等。
集群内边缘计算: Pixie 在集群本地收集、存储和查询所有遥测数据。Pixie 占用的集群 CPU 不到 5%,在大多数情况下不到 2%。
脚本能力: PxL是 Pixie 灵活的 Pythonic 查 询语言,可以在 Pixie 的 UI、CLI 和客户端 API 中使用。
Pixie 自动收集以下数据:
协议跟踪:应用程序 pod 之间的完整消息。跟踪目前支持以下协议列表:Casandra、SQL、Redis、Kafka、AMQP、HTTPS2 (GRPC)、HTTPS 等。
资源指标:您的 Pod 的 CPU、内存和 指标。
网络指标:网络层和连接层的 RX/TX 统计信息。JVM 指标:Java 应用程序的 JVM 内存管理指标。
应用程序 CPU 配置文件:从您的应用程序中采样堆栈跟踪。Pixie 的持续分析器始终处于运行状态,可在您需要时帮助您识别应用程序性能瓶颈。目前支持编译语言。
案例研究
为了演示 eBPF 功能,我们选择了个通 细胞p数据 过简单、自动化和分析来改变数据中心、云网络运营的平台),并在 k8s 环境中部署以在零代码检测的情况下演示其功能。我们能够从基础设施、应用程序、协议、CPU/内存/网络和 JVM 统计信息中收集指标。
自动遥测
eBPF 自动收集遥测数据,例如完整请求、资源和网络指标、应用程序配置文件等。以下 Grafana 仪表板显示 eBPF 生成的 CPU 使用率、网络 RX 字节数和连接统计信息,使用 Pixie 收集并使用 OpenTelemetry 插件将这些指标传输到 Prometheus。
自动遥测
非仪表化性能火焰图
eBPF 收集各个进程的堆栈跟踪(java、Golang 等)以显示内核和用户级性能指标并总结总体 CPU 消耗。如果我们查看这个 mond pod 的框架图,它有助于我们了解 CPU 利用率激增的原因。每隔约 10 毫秒,Pixie 分析器就会对每个 CPU 上的当前堆栈跟踪进行采样。堆栈跟踪包括采样时正在执行的函数,以及在代码中调用以到达这一点的祖先函数。
收集到的样本会汇总到一个更大的 30 秒窗口中,其中包含数千个堆栈跟踪。然后,这些堆栈跟踪会按其共同祖先进行分组。在任何级别,堆栈越宽,该函数在堆栈跟踪中出现的频率就越高。较宽的堆栈跟踪通常更受关注,因为它表明应用程序在该函数上花费了大量时间。
一条评论 “使用 eBPF 和 OpenTelemetry 实现可观察性”