+2

Series Nâng cao Kibana & Elastic APM #1: Triển khai APM Server và Tích hợp "Mắt thần" vào Laravel

1. Mảnh ghép còn thiếu: APM Server

Trong kiến trúc ELK truyền thống, luồng dữ liệu là: Laravel -> Filebeat -> Elasticsearch -> Kibana. Nhưng với APM, chúng ta cần một trạm thu phát trung gian chuyên biệt để xử lý các dữ liệu đo đạc hiệu năng (Metrics & Traces) trước khi ném vào Database. Đó là APM Server.

Hãy mở lại file docker-compose.yml kiến trúc giám sát của chúng ta và thêm service apm-server vào cụm hạ tầng:

version: '3.8'

services:
  # ... (elasticsearch và kibana giữ nguyên như cũ)

  # Trạm thu phát dữ liệu hiệu năng
  apm-server:
    image: docker.elastic.co/apm/apm-server:8.10.2
    container_name: afc_apm_server
    depends_on:
      - elasticsearch
      - kibana
    cap_add: ["CHOWN", "DAC_OVERRIDE", "SETGID", "SETUID"]
    cap_drop: ["ALL"]
    ports:
      - "8200:8200"
    command: >
      apm-server -e
      -E apm-server.rum.enabled=true
      -E setup.kibana.host=kibana:5601
      -E setup.template.settings.index.number_of_replicas=0
      -E apm-server.kibana.enabled=true
      -E apm-server.kibana.host=kibana:5601
      -E output.elasticsearch.hosts=["elasticsearch:9200"]
    networks:
      - elk_network

Khi chạy docker-compose up -d, APM Server sẽ lắng nghe ở cổng 8200, chực chờ Laravel gửi các gói tin báo cáo hiệu năng đến.

2. Cài đặt Elastic APM Agent vào Container PHP

Đây là phần khó nhất và là nơi phân loại đẳng cấp kỹ sư. Để Laravel tự động đo lường thời gian chạy của từng truy vấn Database, từng request HTTP gửi ra ngoài mà không cần phải sửa mã nguồn (Zero-code change), chúng ta phải cài một C-Extension vào tận lõi của PHP.

Mở file Dockerfile dùng để build container PHP-FPM của bạn và thêm các lệnh biên dịch APM Agent của Elastic:

# Sử dụng base image PHP
FROM php:8.2-fpm

# Cài đặt các thư viện lõi cần thiết
RUN apt-get update && apt-get install -y libcurl4-openssl-dev unzip wget

# Tải và biên dịch Elastic APM Agent cho PHP
RUN curl -L https://github.com/elastic/apm-agent-php/releases/download/v1.9.1/apm-agent-php_1.9.1_all.deb -o apm-agent.deb \
    && dpkg -i apm-agent.deb \
    && rm apm-agent.deb

# Kích hoạt Extension
RUN docker-php-ext-enable elastic_apm

Khởi động lại tiến trình build: docker-compose build app. Giờ đây, PHP của bạn đã bị gắn một con "rệp" theo dõi mọi hành động.

3. Khai báo định danh Hệ thống (Environment Variables)

Bước cuối cùng trong Bài 1 là nói cho "con rệp" bên trong PHP biết nó phải gửi dữ liệu báo cáo đi đâu, và hệ thống nó đang theo dõi tên là gì.

Mở file .env của dự án Laravel và cấu hình các thông số sau:

# Kích hoạt đo lường
ELASTIC_APM_ENABLED=true

# Đặt tên cho Service (Sẽ hiển thị to đùng trên Dashboard Kibana)
ELASTIC_APM_SERVICE_NAME="AFC_Core_API"

# Đặt tên môi trường để dễ lọc trên Kibana
ELASTIC_APM_ENVIRONMENT="production"

# Trỏ tới cổng 8200 của Container APM Server mà chúng ta vừa dựng
ELASTIC_APM_SERVER_URL="http://apm-server:8200"

# Tỷ lệ lấy mẫu (1.0 = Lấy 100% request. Nếu hệ thống quá tải, có thể set 0.1 để chỉ đo lường 10% ngẫu nhiên)
ELASTIC_APM_TRANSACTION_SAMPLE_RATE=1.0

Mẹo của Senior: Nhờ cơ chế hook tự động, Elastic APM Agent sẽ tự chui vào Middleware của Laravel. Nó sẽ tự bóc tách các Route (như /api/v1/sync), tự đo đếm thời gian của các câu lệnh Eloquent Transaction::create(...), và tự động đo lường thời gian Laravel gọi các API bên ngoài bằng thư viện Http::post().

4. Nghiệm thu kết quả

Sau khi setup xong, hãy gửi vài Request thử nghiệm vào hệ thống Laravel của bạn.

  1. Mở giao diện Kibana (http://localhost:5601).
  2. Tìm đến menu Observability -> Chọn APM.
  3. Bùm! Bạn sẽ thấy AFC_Core_API xuất hiện chễm chệ trên màn hình.
  4. Click vào đó, bạn sẽ thấy đồ thị vẽ rõ ràng: Thời gian trung bình của hệ thống là bao nhiêu mili-giây, API nào đang chạy chậm nhất, và Database chiếm bao nhiêu % thời gian phản hồi.

Bằng việc tích hợp APM Server, chúng ta đã biến Kibana từ một chỗ "chứa file text" thành một cỗ máy phân tích hiệu năng thời gian thực. Bất kỳ nút thắt cổ chai nào trong luồng code của bạn giờ đây đều bị phơi bày rõ ràng.

Ở bài tiếp theo, bạn muốn chúng ta đi sâu vào cách đọc biểu đồ Trace/Span để tối ưu trực tiếp một hàm bị chậm, hay muốn học cách thiết lập Kibana Watcher (Alerts) để tự động bắn tin nhắn báo động về Slack/Telegram khi tỷ lệ lỗi vượt quá mức cho phép?


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í