16 - Spring Boot OpenTelemetry
03/03/2025 - 3 phút
Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot OpenTelemetry, cách theo dõi và tracing ứng dụng hiệu quả.
Hiểu Về Spring Boot OpenTelemetry - Theo Dõi Và Tracing Ứng Dụng Hiệu Quả
1. Giới Thiệu
Trong hệ thống microservices và ứng dụng phân tán, việc theo dõi và giám sát hiệu suất là cực kỳ quan trọng để phát hiện lỗi và tối ưu hệ thống. OpenTelemetry là một giải pháp mạnh mẽ giúp bạn:
- Thu thập và phân tích tracing, metrics và logs trong hệ thống.
- Theo dõi request từ đầu đến cuối giữa nhiều microservices.
- Hỗ trợ nhiều nền tảng giám sát như Jaeger, Zipkin, Prometheus, Grafana, Datadog.
Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot OpenTelemetry, cách cài đặt, cấu hình tracing, và tích hợp với Jaeger để giám sát request hiệu quả.
2. Cài Đặt OpenTelemetry Trong Spring Boot
2.1. Thêm Dependencies
Spring Boot hỗ trợ OpenTelemetry thông qua thư viện opentelemetry-javaagent
. Thêm vào pom.xml
:
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-spring-boot-starter</artifactId>
<version>1.31.0</version>
</dependency>
Nếu muốn gửi dữ liệu tracing đến Jaeger, thêm:
<dependency>
<groupId>io.opentelemetry.exporter</groupId>
<artifactId>opentelemetry-exporter-jaeger</artifactId>
</dependency>
2.2. Cấu Hình application.properties
otel.traces.exporter=jaeger
otel.exporter.jaeger.endpoint=http://localhost:14250
otel.service.name=spring-boot-app
- otel.traces.exporter=jaeger: Xuất dữ liệu tracing đến Jaeger.
- otel.exporter.jaeger.endpoint: Địa chỉ của Jaeger collector.
- otel.service.name: Đặt tên ứng dụng để dễ theo dõi trong dashboard.
3. Chạy Jaeger Để Xem Tracing
Jaeger giúp hiển thị request end-to-end giữa các microservices. Chạy Jaeger bằng Docker:
docker run -d --name jaeger \
-p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 \
-p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 \
jaegertracing/all-in-one:latest
Sau khi chạy, truy cập Jaeger UI tại:
http://localhost:16686
4. Tích Hợp OpenTelemetry Vào Spring Boot
4.1. Ghi Nhận Tracing Trong REST API
Tạo API mẫu HelloController.java
:
import org.springframework.web.bind.annotation.*;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
@RestController
@RequestMapping("/hello")
public class HelloController {
private final Tracer tracer;
public HelloController(Tracer tracer) {
this.tracer = tracer;
}
@GetMapping("/{name}")
public String sayHello(@PathVariable String name) {
Span span = tracer.spanBuilder("sayHello-span").startSpan();
try {
return "Hello, " + name + "!";
} finally {
span.end();
}
}
}
- Tracer giúp ghi nhận tracing cho từng request.
- spanBuilder() tạo một span mới để theo dõi request.
- span.end() đánh dấu kết thúc request.
4.2. Ghi Log Tracing Khi Gọi API Khác
Tạo UserService.java
để giả lập gọi API bên ngoài:
import org.springframework.stereotype.Service;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
@Service
public class UserService {
private final Tracer tracer;
public UserService(Tracer tracer) {
this.tracer = tracer;
}
public String fetchUser(String userId) {
Span span = tracer.spanBuilder("fetchUser-span").startSpan();
try {
return "User: " + userId;
} finally {
span.end();
}
}
}
5. Kiểm Tra Tracing Trong Jaeger
- Chạy ứng dụng Spring Boot:
mvn spring-boot:run
Gọi API:
http://localhost:8080/hello/Alice
Mở Jaeger Dashboard (
http://localhost:16686
)
- Chọn
spring-boot-app
trong danh sách services. - Xem các request tracing, bao gồm request đến
/hello/{name}
.
6. Tích Hợp OpenTelemetry Với Prometheus & Grafana
6.1. Chạy OpenTelemetry Collector
Tạo otel-config.yaml
:
receivers:
otlp:
protocols:
grpc:
http:
exporters:
prometheus:
endpoint: "0.0.0.0:9464"
logging:
service:
pipelines:
metrics:
receivers: [otlp]
exporters: [prometheus]
Chạy OpenTelemetry Collector:
docker run --rm -p 4317:4317 -p 9464:9464 \
-v $(pwd)/otel-config.yaml:/etc/otel/config.yaml \
otel/opentelemetry-collector-contrib:latest --config /etc/otel/config.yaml
6.2. Kết Nối Grafana Với Prometheus
- Chạy Prometheus:
docker run -d --name prometheus -p 9090:9090 prom/prometheus
- Chạy Grafana:
docker run -d --name grafana -p 3000:3000 grafana/grafana
- Thêm Prometheus làm nguồn dữ liệu trong Grafana (
http://localhost:9090
). - Import OpenTelemetry Dashboard từ Grafana Dashboards.
7. Kết Luận
Spring Boot OpenTelemetry giúp theo dõi và tracing ứng dụng hiệu quả, hỗ trợ tích hợp với Jaeger, Prometheus và Grafana để giám sát hệ thống tốt hơn.
Tóm tắt:
- Tracing giúp theo dõi request từ đầu đến cuối giữa các microservices.
- Tích hợp với Jaeger để phân tích log tracing.
- Hỗ trợ xuất metric đến Prometheus & Grafana để trực quan hóa dữ liệu.
👉 Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu về Spring Boot Resilience4j, giúp tăng cường khả năng chịu lỗi của ứng dụng!