09.5自动插桩 数据库查询追踪

分类: 后端集成 Java Spring Boot OpenTelemetry

自动插桩:数据库查询追踪

欢迎回到第 9 章的学习。在上一节,我们学习了 HTTP 请求追踪。现在我们要学习数据库查询追踪,这对于诊断性能问题非常重要。

本节将学习:Spring Data JPA 集成、SQL 查询追踪、以及数据库连接池监控。

Spring Data JPA 集成

Spring Data JPA 集成是什么? OpenTelemetry Spring Boot Starter 自动为 Spring Data JPA 和 JDBC 操作创建 Span,追踪数据库查询。

如何验证数据库查询追踪呢?

第一步:创建 Entity。 创建

Order.java
Entity 类,定义数据库表结构。

第二步:创建 Repository。 创建

OrderRepository.java
Repository 接口,继承 JpaRepository。

第三步:在 Controller 中调用 Repository。 在 Controller 中注入 Repository 并调用查询方法。

第四步:启动应用并执行查询。 启动应用,发送 HTTP 请求触发数据库查询。

第五步:查看 Trace。 在 Grafana Tempo 中查看自动生成的数据库查询 Span。

代码示例:

文件路径:

src/main/java/com/shoehub/orderservice/model/Order.java

package com.shoehub.orderservice.model;

import jakarta.persistence.*;
import lombok.Data;

@Entity
@Table(name = "orders")
@Data
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String userId;
    private String productId;
    private Integer quantity;
    private Double amount;
    private String status;
}

文件路径:

src/main/java/com/shoehub/orderservice/repository/OrderRepository.java

package com.shoehub.orderservice.repository;

import com.shoehub.orderservice.model.Order;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface OrderRepository extends JpaRepository<Order, Long> {
    List<Order> findByUserId(String userId);
    List<Order> findByStatus(String status);
}

SQL 查询被自动追踪,无需额外配置。

SQL 查询追踪

SQL 查询追踪包含哪些属性呢?

SQL 查询属性:

  • db.system: 数据库系统(mysql/postgresql)。
  • db.name: 数据库名称。
  • db.statement: SQL 语句。
  • db.operation: SELECT/INSERT/UPDATE/DELETE。
  • db.sql.table: 表名。
  • db.user: 数据库用户。
  • net.peer.name: 数据库主机。
  • net.peer.port: 数据库端口。

这些属性由 OpenTelemetry 自动添加。

可以使用 TraceQL 查询:

{db.system="mysql"} && {db.operation="SELECT"}

SQL 查询追踪对于性能分析非常重要。

数据库连接池监控

数据库连接池监控是什么? OpenTelemetry 自动收集连接池 Metrics,用于监控连接池状态。

连接池 Metrics 有哪些呢?

  • jdbc_connections_active: 活跃连接数。
  • jdbc_connections_idle: 空闲连接数。
  • jdbc_connections_max: 最大连接数。
  • jdbc_connections_waiting: 等待连接数。
  • jdbc_connections_timeout: 连接超时次数。

这些 Metrics 由 OpenTelemetry 自动收集。

如何识别连接池问题呢? 连接池耗尽、连接等待时间过长、连接超时等。通过监控这些 Metrics,可以快速识别连接池问题。

本节小结

在本节中,我们学习了自动插桩:数据库查询追踪:

第一个是 Spring Data JPA 集成。 OpenTelemetry Spring Boot Starter 自动为 Spring Data JPA 和 JDBC 操作创建 Span。

第二个是 SQL 查询追踪。 SQL 查询属性(db.system、db.name、db.statement、db.operation 等)。

第三个是数据库连接池监控。 连接池 Metrics(jdbc_connections_active、jdbc_connections_idle 等)。

数据库查询追踪总结: 数据库查询追踪包括自动追踪(Spring Data JPA 自动创建 Span)、SQL 查询属性(自动添加数据库属性)、连接池监控(自动收集连接池 Metrics)。这些功能组合在一起,构成了完整的数据库查询追踪能力。

这就是自动插桩:数据库查询追踪。掌握这些功能,可以追踪和分析数据库查询。

在下一节,我们将学习自动插桩:消息队列追踪。学习 Kafka 和 RabbitMQ 集成。