背景
随着企业越来越多地采用容器化和微服务架构,应用的复杂性显著增加,性能管理变得尤为重要。在 Kubernetes 中,应用性能管理(APM)涉及监控、分析和优化应用的资源使用、响应时间和可用性。有效的性能管理可以提高应用响应速度、优化资源利用率、减少停机时间、提升用户体验。
前提条件
接入方案选型
APM 支持 OpenTelemetry、Skywalking 等多种上报协议。OpenTelemetry 社区活跃度高,技术更迭迅速,广泛兼容主流编程语言、组件与框架,请优先选择 OpenTelemetry 方案,关于 OpenTelemetry 的更多信息请参考 OpenTelemetry 官方网站。
对于部署在 Kubernetes 的应用,请优先选择 Operator 模式自动接入,节省安装探针和修改配置方面的工作量,关于 Operator 模式的更多信息请参考安装 tencent-opentelemetry-operator。
接入方式
Operator 方案
tencent-opentelemetry-operator 是腾讯云基于社区 opentelemetry-operator 构建的探针接入方案。由于实现了 Kubernetes 环境下探针自动注入机制,免去了探针部署和配置的工作量,让应用接入变得更加简单。目前 tencent-opentelemetry-operator 支持 Java、Python、node.js、.Net 应用的快速接入,应用程序部署到腾讯云容器服务 TKE 以后,只需要在工作负载的 YAML 文件中添加2行 annotation,就能完成整个接入流程,无需在开发态涉及任何代码的修改。
快速接入应用性能监控(APM)
1. 登录 容器服务控制台,选择左侧导航栏中的集群。
2. 在集群页面,单击目标集群 ID,进入集群详情页。
3. 选择左侧导航中的工作负载。
4. 单击进入需要监控的工作负载,选择应用性能,单击立即接入,并选择应用类型快速接入应用性能监控。

5. 单击一键安装 Operator,在 TKE 集群安装 Operator。
6. 在一键安装 Operator 页面,通过下拉框选择上报地域、默认业务系统、TKE 集群等信息,确认后单击安装。

说明:
上报地域为 APM 业务系统所在的地域,每个 TKE 集群只能指定唯一的上报地域,建议将上报地域与 TKE 集群所在的地域保持一致。
7. 根据应用类型参考以下文档进行后续的操作步骤。
应用类型 | OpenTelemetry 方案 |
Go | |
Java | |
Python | |
PHP | |
Node.js | |
.Net | |
其他语言 |
8. 以 Java 应用为例,可查看丰富的应用指标:
性能概览

应用拓扑

JVM 监控

接口监控

数据库调用分析

SQL 分析

实例监控

链路追踪

错误监控

接入原理
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 安装流程:安装部署流程,不但上架了 TKE 应用市场,还能在 APM 控制台实现 Operator 一键安装。
通过封装减少人力:对接入过程中需要用到的一系列配置项进行了封装,不再需要手工填写,包括 APM 接入点的地址,业务系统 token 等。
优化证书管理机制:解决了 Operator 安装过程中有可能遇到的各类兼容性问题。
降级处理:当 APM 平台的任何一个组件出现故障的时候,整个接入机制都以不影响业务正常运行为前提,在必要的时候对探针注入和监控数据上报逻辑行降级处理,确保业务的稳定运行。
自定义埋点
在探针接入方案的基础上,Operator 模式通过探针注入进一步简化了应用接入 APM 的流程。tencent-opentelemetry-operator 注入的探针来自 OpenTelemetry 生态,对主流的开发框架与类库实现了运行态自动埋点。对大多数用户而言,应用在接入成功后即可完成监控数据上报,实现分布式链路追踪,不需要修改任何代码。但在某些特殊的场景中,如果探针的自动埋点机制不能满足用户需求,用户可以引入 OpenTelemetry API,在自动埋点的基础上,通过修改应用代码增加自定义埋点。例如下述场景中,可能需要引入自定义埋点:
应用引入的开发框架与类库没有在开发者中被广泛使用,或者版本很低。
应用引入的开发框架与类库由用户自己封装,或者来自于闭源商业化定制开发。
对于某些核心的自定义方法,需要在链路中追加方法级的埋点。
对于 tencent-opentelemetry-operator 注入的探针,可以参考 OpenTelemetry 方案支持的组件和框架 了解自动埋点的范围。自定义埋点代码的具体编写方式,可以参考如下 OpenTelemetry 的官方文档:
以 Java 语言为例,如果我们需要对某个自定义方法在链路中追加方法级埋点,可以参考以下步骤实现。
1. 引入 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>
2. 通过如下代码,在链路中增加 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) {// 创建一个 SpanSpan span = tracer.spanBuilder("doTask").startSpan();// 在 Span 中添加一些 Attributesspan.setAttribute("RequestId", "5fc92ff1-8ca8-45f4-8013-24b4b5257666");// 将此 Span 设置为当前的Spantry (Scope scope = span.makeCurrent()) {doSubTask1();doSubTask2();} catch (Throwable t) {// 处理异常,异常信息将记录到 Span 的对应事件中span.recordException(t);span.setStatus(StatusCode.ERROR);throw t;} finally {// 结束 Spanspan.end();}}
3. 前往 腾讯云可观测平台控制台,在应用性能监控 > 调用查询中,找到相关的调用链,单击 Span ID 后,链路详情页面中,即可查到通过自定义埋点新增的 Span。