02.4自动插桩vs手动插桩

分类: OpenTelemetry架构概览

自动插桩 vs 手动插桩

本节将学习:自动插桩的优势和使用场景、手动插桩的必要性和方法、何时使用哪种方式,以及如何混合使用。

自动插桩的优势

自动插桩有什么优势呢?

第一个优势:无需修改代码。 零代码入侵,通过 Agent 自动插桩,适用于现有项目。不需要修改任何代码,就可以获得可观察性。

第二个优势:快速开始。 配置简单,快速获得可观察性,适合快速验证。只需要配置 Agent,就可以开始采集数据。

第三个优势:覆盖广泛。 支持常见的框架和库,自动采集 HTTP、数据库、消息队列等,覆盖大部分场景。例如,Spring Boot 自动插桩可以采集 HTTP 请求、数据库查询等信息。

第四个优势:维护成本低。 不需要维护插桩代码,SDK 更新自动升级,减少维护负担。只需要升级 SDK,就可以获得新的功能。

自动插桩支持哪些框架? 支持很多框架和库,比如:

  • Web 框架:Spring Boot、Express、FastAPI 等
  • 数据库:MySQL、PostgreSQL、MongoDB 等
  • 消息队列:Kafka、RabbitMQ 等
  • HTTP 客户端:OkHttp、Apache HttpClient 等

这就是自动插桩的优势。它让可观察性变得非常简单。

手动插桩的必要性

什么时候需要手动插桩呢?

第一个场景:自定义业务逻辑。 追踪特定业务操作,添加业务相关的属性,自定义 Span 名称和标签。例如,要追踪订单创建的完整流程,需要手动插桩。

第二个场景:自动插桩不支持的场景。 自定义框架或库、第三方 API 调用、复杂的业务逻辑。自动插桩可能不支持这些场景,需要手动插桩。

第三个场景:精细化控制。 控制哪些操作需要追踪,添加自定义的 Metrics,记录业务相关的 Logs。自动插桩可能不够灵活,需要手动插桩。

手动插桩的过程是这样的:在业务逻辑中,手动创建自定义 Span,添加业务属性,记录业务事件,然后导出数据。

代码示例:在订单创建业务逻辑中,可以这样手动插桩:

Span span = tracer.spanBuilder("order.create")
    .setAttribute("order.user_id", request.getUserId())
    .setAttribute("order.total_amount", request.getTotalAmount())
    .startSpan();

这个代码手动创建 Span,添加业务属性。这样就可以追踪订单创建的完整流程,添加业务相关的信息。

自动插桩和手动插桩的对比

让我们对比一下自动插桩和手动插桩。

对比表

  • 代码修改:自动插桩无需修改代码,手动插桩需要修改代码
  • 配置复杂度:自动插桩配置简单,手动插桩配置中等
  • 覆盖范围:自动插桩覆盖广泛的框架和库,手动插桩覆盖自定义逻辑
  • 灵活性:自动插桩灵活性有限,手动插桩灵活性高
  • 维护成本:自动插桩维护成本低,手动插桩维护成本中等到高
  • 业务属性:自动插桩业务属性有限,手动插桩业务属性完整
  • 适用场景:自动插桩适用于通用场景,手动插桩适用于特定业务场景

选择建议:一般来说,优先使用自动插桩,因为它简单、快速、维护成本低。如果需要业务属性或自动插桩不支持,再使用手动插桩。也可以混合使用:自动插桩覆盖通用场景,手动插桩覆盖业务场景。

混合使用策略

最佳实践是什么? 使用自动插桩 + 手动插桩,混合使用。

第一步:使用自动插桩覆盖通用场景。 HTTP 请求、数据库查询、消息队列等,这些都可以用自动插桩。不需要手动插桩,就可以获得这些信息的追踪。

第二步:使用手动插桩覆盖业务场景。 业务逻辑追踪、业务属性添加、自定义 Metrics 等,这些需要手动插桩。可以在业务逻辑中添加自定义的 Span、Metrics、Logs。

混合使用的示例:HTTP 请求由自动插桩创建 Span,然后在业务逻辑中手动添加业务 Span,数据库查询由自动插桩创建 Span,这样就形成了一个完整的 Trace。

代码示例:在控制器中,HTTP 请求由自动插桩创建 Span,然后在服务中手动添加业务 Span。

这就是混合使用策略。自动插桩覆盖通用场景,手动插桩覆盖业务场景,两者结合,可以获得完整的可观察性。

本节小结

在本节中,我们学习了两种插桩方式:

第一个是自动插桩。 无需修改代码,快速开始,覆盖广泛。它适用于通用场景,维护成本低。

第二个是手动插桩。 精细控制,业务属性,自定义逻辑。它适用于特定业务场景,灵活性高。

最佳实践:自动插桩 + 手动插桩混合使用。自动插桩覆盖通用场景,手动插桩覆盖业务场景。

选择建议:优先使用自动插桩,需要时添加手动插桩。这样可以在简单性和灵活性之间取得平衡。

这就是插桩方式的对比。理解这两种方式的区别和适用场景,是掌握 OpenTelemetry 的关键。

在下一节,我们将深入了解采样策略:如何控制成本和数据完整性。