+1

Sử dụng OpenTelemetry để lấy Traces của ứng dụng Java backend (P1)

OpenTelemetry là gì?

OpenTelemetry là một bộ công cụ mã nguồn mở giúp thu thập, xử lý, và xuất các dữ liệu về giám sát như traces, metrics, và logs từ các ứng dụng phân tán. Nó hỗ trợ việc quan sát hệ thống, giúp phát hiện và phân tích hiệu năng ứng dụng, các sự cố trong môi trường microservices hoặc cloud-native.

OpenTelemetry hỗ trợ:

  • Cung cấp một chuẩn chung để thu thập dữ liệu giám sát từ nhiều ngôn ngữ lập trình và hệ thống khác nhau.
  • Dễ dàng tích hợp với các hệ thống giám sát và quản lý hiện có như Prometheus, Jaeger, Grafana.
  • Giúp phát hiện tắc nghẽn (bottleneck) trong ứng dụng, cải thiện hiệu suất hệ thống.
  • Hỗ trợ tốt cho môi trường microservices, cloud-native với khả năng theo dõi các dịch vụ chạy phân tán.

Ngoài ra OpenTelemetry hỗ trợ hầu hết các ứng dụng ngôn ngữ phổ biến như Java, .NET, Go, Python, C++, Javascript, Ruby, ...

Theo như tiêu đề bài viết thì tại bài viết này sẽ chỉ quan tâm giải quyết vấn đề lấy trace của ứng dụng Java backend, các loại dữ liệu còn lại như metrics và logs sẽ thực hiện tương tự và cũng tương tự cho mọi loại ứng dụng ngôn ngữ khác, ta có thể tìm hiểu thêm tại doc chính thức của OpenTelemetry (Có thể gọi tắt là Otel).

Traces là gì?

Theo như vấn đề bên trên Traces hay dịch sang tiếng việt là dấu vết là một loại dữ liệu Telemetry giúp theo dõi và ghi lại luồng thực thi của các yêu cầu trong hệ thống phân tán. Mỗi trace cung cấp một bản ghi chi tiết về cách một yêu cầu di chuyển qua các dịch vụ, thành phần và lớp khác nhau của ứng dụng. Để hiểu một cách đơn giản thì ta có thể ví dụ với luồng xử lý của ứng dụng như sau:

Một ứng dụng sẽ có 3 phần chính đó là Frontend (FE), Backend (BE) và Database (DB). Khi người dùng thao tác trên giao diện của ứng dụng là FE để yêu cầu một cái gì đó thì FE sẽ gửi yêu cầu đến BE, BE sẽ gửi yêu cầu đến DB, rồi tiếp tục DB sẽ gửi lại data đến BE và BE sẽ trả cho chúng ta cái mà ta cần khi thao tác trên giao diện FE. Vậy khoảng mà FE gửi yêu cầu đến BE rồi từ BE đến DB rồi lại từ DB đến BE rồi tới FE chính là một traces. Hay một lần load lại trang cũng chính là một traces.

Lợi ích của Traces

  • Traces giúp theo dõi chi tiết từng bước của một yêu cầu khi nó di chuyển qua các dịch vụ và thành phần khác nhau.
  • Traces cung cấp thông tin chi tiết về các lỗi và thời gian phản hồi, giúp phát hiện các nút thắt cổ chai và lỗi trong hệ thống.
  • Bằng cách phân tích traces, bạn có thể tối ưu hóa luồng yêu cầu và cải thiện hiệu suất của hệ thống.

Hoặc đơn giản là traces sẽ giúp cho chúng ta biết được thời gian cũng như tốc độ phản hồi của ứng dụng, từ đó giúp ta cải thiện được ứng dụng để đáp ứng được nhu cầu của người dùng cuối.

Dựng app Java

Trong bài viết này sử dụng ứng dụng Java Spring Boot có database là MySQL và Redis. Clone project này tại đây hoặc có thể clone từ Repo của anh Mai Trung Đức, tác giả series Docker và CI/CD.

Lưu ý: để có thể thực hiện, máy tính cần phải có Java 11, Docker và docker compose.

Sau khi clone về, ta mở Dockerfile lên xem nội dung bên trong:

# Build stage
FROM eclipse-temurin:17-jdk-alpine as build
WORKDIR /app

COPY build.gradle settings.gradle gradlew ./
COPY gradle /app/gradle

RUN ./gradlew build || return 0
COPY . .
RUN ./gradlew build -x test

RUN ./gradlew build -x test

# Production stage
FROM eclipse-temurin:17-jre-alpine as production
WORKDIR /app

COPY --from=build /app/build/libs/demo-0.0.1-SNAPSHOT.jar app.jar
COPY otel/opentelemetry-javaagent.jar /app/otel-agent.jar

ENV OTEL_SERVICE_NAME=spring-boot-application
ENV OTEL_TRACES_EXPORTER=otlp
ENV OTEL_EXPORTER_OTLP_ENDPOINT=http://172.16.1.24:4318

ENTRYPOINT ["java", "-jar", "app.jar"]

Dockerfile này có hai bước chính là build và production. Bạn có thể tìm hiểu quá trình build cũng như xây dựng app java trên google nhé, mình sẽ không giải thích ở đây. Ở đây chúng ta sẽ sử dụng image là eclipse-temurin:17-jdk với bản phân phối là alpine.

Bước build chúng ta sẽ build ra một file là demo-0.0.1-SNAPSHOT.jar đã được định nghĩa trước đó trong file cấu hình và sử dụng file này để chạy ở bước production. Dockerfile sẽ tiến hành copy file này vào trong container để tiến hành chạy lên. Tạm thời chúng ta sẽ chưa cần quan tâm đến opentelemetry-javaagent.jar và ba biến môi trường, chúng ta sẽ dựng app lên trước để xem và test thử đã ổn định hay chưa rồi sẽ tiến hành add các thứ cần thiết để lấy trace. Ta sẽ xóa 4 dòng này trong Dockerfile đi:

COPY otel/opentelemetry-javaagent.jar /app/otel-agent.jar

ENV OTEL_SERVICE_NAME=spring-boot-application
ENV OTEL_TRACES_EXPORTER=otlp
ENV OTEL_EXPORTER_OTLP_ENDPOINT=http://172.16.1.24:4318

Bây giờ chúng ta sẽ chạy lên xem thử app như thế nào. Đầu tiên chúng ta sẽ tiến hành build image, ở đây mình sẽ đặt tên cho image này là java-spring và tag là v1:

docker build -t java-spring:v1 .

Nếu đặt một tên khác cho image thì ta cần phải thay đổi tên image trong file docker-compose.yml ở chỗ image app. Ở đây ta sử dụng thêm db là MySQL và Redis.

version: '3.7'

services:
  app:
    image: java-spring:v1
    restart: always
    ports:
      - "8081:8081"
    volumes:
      - ./docker_application.properties:/app/application.properties:ro
    depends_on:
      - db
      - redis

  db:
    image: mysql:8
    restart: always
    volumes:
      - ./.docker/data/db:/var/lib/mysql
      - ./db.sql:/docker-entrypoint-initdb.d/db.sql:ro
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: demo_app

  redis:
    image: redis:6-alpine
    restart: always
    volumes:
      - ./.docker/data/redis:/data

Sau khi đã setup đầy đủ ta tiến hành chạy ứng dụng lên bằng docker compose.

docker compose up -d

Sau khi chạy xong đợi tầm 15s để db khởi động trước, sau đó vào google truy cập địa chỉ http://localhost:8081 để xem thử. Giao diện sẽ trông như sau:

Ta sử dụng username/password là user/Password1 để đăng nhập vào app. Ta có thể thao tác add user, edit user hoặc delete user.

Cơ bản ứng dụng Java đã chạy tốt và có thể thao tác các tính năng ổn định.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí