前言:本文通过挖掘 APM 的发展史并着重介绍腾讯云新推出的 Operator 方案,实现多语言应用一键接入。
背景
随着现代软件架构的不断发展,越来越多的企业对系统架构进行了微服务化与容器化改造,从而更好地满足海量并发、高可用、弹性伸缩、快速迭代等需求。然而,微服务化与容器化的引入也让分布式系统的复杂度随之增加,使得系统的监控和管理变得更加困难。
因此,应用性能监控(Application Performance Management,简称 APM)工具的重要性就体现出来了,特别是 APM 提供的分布式链路追踪能力,可以帮助开发者快速发现并定位性能问题,是分布式系统稳定运行的重要保障。将分布式应用接入 APM 工具,还能提高系统性能以及稳定性。
APM 简介
APM 是一类用于监控、管理和优化应用程序性能的软件解决方案。APM 的历史可以追溯到20世纪90年代,当时的 IT 环境相对简单,主要是单体应用程序,运行在大型机或服务器上。最初的APM 工具关注基础设施层面的性能监控,例如服务器的 CPU 使用率、内存使用率、磁盘 I/O 等。随着分布式和虚拟化技术的兴起,应用程序的部署和运行环境变得更加复杂和动态,为了适应这样的变化, APM 相关技术也在不断变革,大概经过了以下4个发展阶段。
Google 在2003年发表了一篇具有里程碑意义的论文,名为《Dapper:大规模分布式系统的跟踪基础设施》。这篇论文详细地描述了 Google 内部如何使用分布式追踪系统诊断大规模分布式系统的性能问题,对 APM 工具和分布式系统监控领域产生了深远的影响。
主流的 APM 工具开始借鉴 Dapper 的设计理念,提供类似 Dapper 的分布式跟踪功能。与此同时,开放式追踪标准(如 OpenTracing 和 OpenTelemetry)的发展,也为 APM 工具和分布式系统提供了通用的链路跟踪协议,降低了分布式链路追踪的成本和复杂性。在这样的背景下,APM 工具才真正在广大企业和开发者中普及起来,成为了确保分布式系统稳定运行的必备工具。
除了最重要的分布式链路追踪能力之外,主流的 APM 平台还提供了代码级别诊断、实时性能剖析、事务追踪和分析、用户体验分析等高阶应用诊断能力,进一步帮助企业深入了解应用程序的性能问题,并提供有效的优化建议,有助于企业优化业务流程,提高业务效率。
随着云计算的发展,系统和服务的运行状态变得更加复杂和难以预测,传统的监控方法往往无法提供足够的信息来理解这些复杂系统的内部运行情况。让可观测性(Observability)理念在软件行业兴起,成为软件开发和运维的重要组成部分。在计算机科学和软件工程领域,可观测性主要是通过收集、分析和呈现日志、指标和追踪数据,以便了解系统的运行状况、性能和可靠性。
可观测性依赖于三大数据源:日志(Log,记录系统事件和状态的详细信息)、指标(Metric,度量系统性能和资源使用情况的数值数据)和链路(Trace,描述请求在分布式系统中的执行路径和延迟),通过收集和分析这些数据来实现对应用程序性能的监控和管理。
APM 工具能够直接生成指标和链路数据,并且能够和日志系统合作,围绕三大数据源提供关联分析能力。一个典型的 APM 使用场景是:
因此可观测性和 APM 是密切相关的概念,它们共同关注系统性能和可靠性的管理和优化,APM 工具也是实现可观测性的关键组件,为企业提供有效的性能监控和管理手段。
应用如何接入 APM?
为了让 APM 工具了解应用的内部运行状态,需要对应用进行一定的改造,使其可以将内部运行状态以可观测数据的方式暴露出来,并上报到 APM 接入点,这就是应用接入 APM 的过程。随着 APM 技术的不断发展,接入方式也经历了不断的变革,大致可以归类为如下的几种方案:
接入难度 | 兼容性 | 功能覆盖度 | 成熟度 | |
---|---|---|---|---|
手动上报 | 极高 | 高 | 高 | 高 |
半手动上报 | 高 | 高 | 高 | 高 |
探针 | 低 | 比较高。适合大多数语言 | 高 | 高 |
Sidecar | 低 | 低。依赖特定应用架构 | 低 | 高 |
eBPF | 低 | 比较高。依赖高版本内核 | 中 | 低 |
综合来看,对于 APM 方案的选型,接入难度是首要的考虑因素。如果接入 APM 工具还需要修改业务代码,会给开发团队带来沉重的负担,长远来看必将在团队内部造成推广困难的局面,这也是很多企业在引入 APM 工具的过程中途而废的主要原因。因此,我们需要尽量排除手动上报方案,除非是历史比较久远的遗留项目,由于其他方案无法兼容才不得以而为之。
虽然 eBPF 方案代表着未来 APM 的发展方向,但成熟度还很低,功能覆盖度上也有比较大的不足,因此探针方案依然是目前最成熟、最值得考虑的选择,特别是对于 Java、Python 等基于虚拟机运行的编程语言,天然就和探针方案有极高的匹配度。
Operator 方案
腾讯云应用性能监控是由腾讯云可观测团队推出的 APM 平台,属于腾讯云可观测平台 TCOP 的子产品。为用户提供分布式应用性能分析和故障自检能力,全方位保障系统的可用性和稳定性,协助用户在复杂的业务系统快速定位性能问题,降低 MTTR(平均故障恢复时间),提升用户体验。
为了尽可能的降低应用接入成本,减少 APM 工具对于整个软件研发流程的影响,腾讯云在2024年5月正式推出了 tencent-opentelemetry-operator 接入方案,对于部署在 Kubernetes 的多语言应用,提供简单高效的方式接入 APM。
tencent-opentelemetry-operator 由腾讯云在社区 opentelemetry-operator 基础上构建,是基于探针的接入方案。由于实现了 Kubernetes 环境下探针自动注入机制,免去了探针部署和配置的工作量,让应用接入变得更加简单。
目前 tencent-opentelemetry-operator 支持 Java、Python、node.js、.Net 应用的快速接入,应用程序部署到腾讯云容器服务 TKE 以后,只需要在工作负载的 YAML 文件中添加2行 annotation,就能完成整个接入流程,无需在开发态涉及任何代码的修改。
安装应用
在接入应用之前,需要先在容器服务 TKE 集群安装 tencent-opentelemetry-operator,由于tencent-opentelemetry-operator 是一个符合 K8s Operator 范式的标准 Helm 应用,并已在 TKE 应用市场发布,用户可直接在 TKE 应用市场完成安装、更新和卸载。为了更进一步的提升安装效率,更推荐在 APM 控制台一键安装,免去配置工作量。
前往腾讯云可观测平台控制台,在左侧菜单栏中选择应用性能监控 - 应用监控,单击应用列表 - 接入应用。在弹出的对话框中,点击需要接入的编程语言比如 Java,选择 TKE 环境自动接入上报方式,即可看到一键安装 Operator 按钮。点击这个按钮,进入一键安装 Operator 的弹出窗口,通过下拉框选择上报地域、默认业务系统、TKE 集群等信息,确认后点击安装即可。
其中,上报地域为 APM 业务系统所在的地域,每个 TKE 集群都只能指定唯一的上报地域,最好与 TKE 集群所在的地域保持一致。业务系统管理是腾讯云应用性能监控 APM 的特有能力,用于分类管理不同环境以及不同业务域的应用,实现业务系统级别的应用隔离。用户还可以针对业务系统设置存储时长、上报限额、采样策略等,更进一步对接入 APM 的应用进行精细化性能管理。在安装 Operator 的时候,需要确定 TKE 集群对应的默认业务系统,如果集群内的应用需要接入其他业务系统,用户还可以在应用级别进行指定。
安装完成之后,前往容器服务 TKE 控制台,在左侧菜单栏中选择应用中心 - 应用,就可以查询到安装在 kube-system 命名空间的 tencent-opentelemetry-operator 应用,也可以通过 Helm 客户端执行 helm list 命令检查安装状态。
应用接入
在 TKE 集群完成 Operator 的安装后,得益于 Operator 方案动态探针注入能力,应用接入的过程极为简单,只需要编辑应用所在工作负载的 YAML 文件,在 Pod Template 中添加2个 annotation,即可完成应用接入。以 Java 应用为例,需要添加的内容为:
cloud.tencent.com/inject-java: "true" #接入APM
cloud.tencent.com/otel-service-name: my-app #指定应用名
其中,otel-service-name 字段代表应用名,多个使用相同应用名接入的进程,在 APM 中会表现为相同应用下的多个实例。完整的工作负载 YAML 文件可以参考以下代码片段:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: my-app
name: my-app
namespace: default
spec:
selector:
matchLabels:
k8s-app: my-app
template:
metadata:
labels:
k8s-app: my-app
annotations:
cloud.tencent.com/inject-java: "true" #接入APM
cloud.tencent.com/otel-service-name: my-app #指定应用名
spec:
containers:
image: my-app:0.1
name: my-app
添加完 annotation 之后,将基于不同的工作负载发布策略对工作负载进行更新,触发应用 Pod 的重新创建。新启动的 Pod 会自动注入探针,并连接到 APM 服务端,将监控数据上报到 Operator 的默认业务系统。前往腾讯云可观测平台控制台,在应用性能监控 - 应用监控 - 应用列表中,就能查询到新接入的应用。
接入原理
为什么只需要对应用所在的工作负载添加2行 annotation,就能完成应用接入腾讯云应用性能监控APM的所有流程呢?Operator 方案利用了 Kubernetes 提供的 Dynamic Admission Control 机制实现探针的注入,可以参考以下流程了解 Operator 方案的接入原理:
步骤1:用户对工作负载添加 annotation,API Server 将基于工作负载的发布策略启动工作负载的更新。
步骤2:在 Operator 的相关组件中,包含一个具备 Dynamic Admission Control 能力的工作负载,通过 Mutating Webhook 的形式在容器服务集群中运行,这个组件可以从 API Server 监听工作负载的变化。
步骤3:Operator 监听到应用工作负载添加了接入相关的 annotation 之后,会通过 API Server 对即将创建的应用 Pod 进行动态修改,修改的内容通过 Pod 的 YAML 描述表现出来。
步骤4:Operator 会在应用 Pod 中注入一个初始化容器,在容器本地路径中包含了探针文件。
步骤5:Operator 还会在应用容器中注入一些环境变量,这些环境变量可以对应用进程进行配置,实现挂载探针的动作。以 Java 应用为利,Operator 会对应用容器添加 JAVA_TOOL_OPTIONS 环境变量,其中包括 -javaagent 参数,指向由初始化容器引入的探针文件本地路径,使 Java 进程启动的时候执行挂载探针操作。
步骤6:探针通过字节码增强机制自动采集监控数据,并向 APM 服务端上报。
接入优势
自定义埋点
在探针接入方案的基础上,Operator 模式通过探针注入进一步简化了应用接入 APM 的流程,tencent-opentelemetry-operator 注入的探针来自 OpenTelemetry 生态,对主流的开发框架与类库实现了运行态自动埋点。
对大多数用户而言,应用在接入成功后即可完成监控数据上报,实现分布式链路追踪,不需要修改任何代码。但在某些特殊的场景中,如果探针的自动埋点机制不能满足用户需求,用户可以引入 OpenTelemetry API,在自动埋点的基础上,通过修改应用代码增加自定义埋点。比如下述场景中,可能需要引入自定义埋点:
以 Java 语言为例,如果我们需要对某个自定义方法在链路中追加方法级埋点,可以参考如下代码实现。
首先引入 OpenTelemetry API 依赖:
<dependencies>
<!-- 其他依赖 -->
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-bom</artifactId>
<version>1.9.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
接下来,通过如下代码,在链路中增加 doTask()的方法级埋点。
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.Scope;
// Trace 对象可以在业务方法中获取,或者通过参数传入业务方法
public void doTask(Tracer tracer) {
// 创建一个 Span
Span span = tracer.spanBuilder("doTask").startSpan();
// 在 Span 中添加一些 Attributes
span.setAttribute("RequestId", "5fc92ff1-8ca8-45f4-8013-24b4b5257666");
// 将此 Span 设置为当前的Span
try (Scope scope = span.makeCurrent()) {
doSubTask1();
doSubTask2();
} catch (Throwable t) {
// 处理异常,异常信息将记录到 Span 的对应事件中
span.recordException(t);
span.setStatus(StatusCode.ERROR);
throw t;
} finally {
// 结束 Span
span.end();
}
}
前往腾讯云可观测平台控制台,在应用性能监控 - 调用查询中,找到相关的调用链,点击 Span ID 后,链路详情页面中,即可查到通过自定义埋点新增的 Span。
总结
腾讯云应用性能监控(APM)为企业提供了全面、高效、易用、低成本的应用性能管理解决方案,帮助企业优化应用程序的性能。新发布的 Operator 方案,降低了接入成本,将接入 APM 工具的决策时间点从开发态后移至部署态,用户不再需要在代码中引入 APM 相关 SDK 或者将探针文件打包到容器镜像中。这实现对应用开发的零侵入,对于在团队内部全部推广 APM 工具,有着非常重要的意义。
腾讯云可观测团队还将持续加速腾讯云应用性能监控(APM)的产品功能迭代,在今年将补齐混合云 Kubernetes 环境以及非容器环境的多语言应用一键接入方案,并增加对于 PHP 应用的支持,为用户提升更流畅的接入体验。
联系我们
如有任何疑问,欢迎扫码进入官方交流群~
关于腾讯云可观测平台
腾讯云可观测平台(Tencent Cloud Observability Platform,TCOP)基于指标、链路、日志、事件的全类型监控数据,结合强大的可视化和告警能力,为您提供一体化监控解决方案。满足您全链路、端到端的统一监控诉求,提高运维排障效率,为业务的健康和稳定保驾护航。功能模块有: