0

BÀI 5: THỰC HÀNH PART 2 – TÍCH HỢP APM AGENT VÀO DỰ ÁN LARAVEL THỰC TẾ

Chào các bạn! Ở bài trước, chúng ta đã dựng thành công "bộ chỉ huy trung ương" Elastic APM Server chạy mượt mà trên Port 8200. Hôm nay, chúng ta sẽ thực hiện bước tiếp theo: Cắm "camera giám sát" (APM Agent) vào một dự án backend thực tế – cụ thể trong bài này là framework PHP/Laravel.

Sau bài viết này, các bạn sẽ thấy điều kỳ diệu: Mọi request, mọi câu lệnh SQL chạy trong dự án Laravel sẽ tự động hiển thị trực quan trên giao diện Kibana.

1. Cơ chế hoạt động của Elastic APM PHP Agent

Khác với một số ngôn ngữ như Node.js hay Python (chỉ cần cài thư viện qua npm hoặc pip), đối với PHP, Elastic cung cấp Agent dưới dạng một PHP Extension (viết bằng C).

  • Tại sao lại là Extension? Vì PHP có vòng đời request ngắn (Share-nothing architecture). Việc viết bằng Extension giúp Agent được nạp thẳng vào bộ nhớ của PHP-FPM khi khởi động, giúp nó thu thập dữ liệu ở tầng sâu nhất với overhead (độ trễ ảnh hưởng đến app) gần như bằng 0.

2. Các bước cài đặt cài đặt Agent

Nếu các bạn đang chạy Laravel bằng Docker (tiêu biểu như Laravel Sail hoặc Docker tự build), chúng ta chỉ cần thêm vài dòng lệnh vào Dockerfile để cài đặt extension elastic_apm.

Bước 1: Cài đặt Extension vào PHP

Thêm đoạn lệnh sau vào Dockerfile ứng dụng của bạn (áp dụng cho các image nền Debian/Ubuntu như php:8.x-fpm):

# Tải và cài đặt Elastic APM PHP Agent
RUN curl -fsSL https://github.com/elastic/apm-agent-php/releases/download/v1.9.0/apm-agent-php_1.9.0_amd64.deb -o apm-agent.deb \
    && dpkg -i apm-agent.deb \
    && rm apm-agent.deb

(Lưu ý: Bạn có thể cập nhật phiên bản mới nhất từ trang phát hành của Elastic APM PHP).

Bước 2: Cấu hình file php.ini

Sau khi cài đặt, bạn cấu hình cho Extension này kích hoạt và trỏ về đúng địa chỉ APM Server bằng cách thêm các dòng sau vào file php.ini của dự án:

extension=elastic_apm.so

# Kích hoạt Agent
elastic_apm.enabled=true

# Địa chỉ APM Server chúng ta đã dựng ở Bài 4
elastic_apm.server_url="http://localhost:8200"

# Tên của ứng dụng để hiển thị trên Kibana
elastic_apm.service_name="Laravel-Backend-App"

# Môi trường chạy dự án
elastic_apm.environment="development"

Mẹo nhỏ cho Laravel: Để linh hoạt giữa các môi trường (Dev, Staging, Production), bạn có thể cấu hình trong php.ini nhận từ biến môi trường, sau đó khai báo trực tiếp trong file .env của Laravel: ELASTIC_APM_SERVER_URL=http://apm_server:8200 ELASTIC_APM_SERVICE_NAME=my-laravel-app

3. Tối ưu riêng cho Laravel (Tự động bắt Route và Queue)

Mặc dù Agent dạng extension đã tự động bắt được các sự kiện cơ bản, nhưng để Elastic APM hiểu sâu sắc cấu trúc của Laravel (như tên Route chính xác thay vì chỉ hiện index.php, hay bắt được các job chạy ngầm trong Queue), chúng ta nên cài thêm một gói package nhỏ hỗ trợ.

Cài đặt thông qua Composer:

composer require jonahglover/laravel-elastic-apm

Gói package này sẽ tự động đăng ký một Middleware toàn cục. Nhiệm vụ của nó là:

  • Đổi tên Transaction từ tên URL thô (ví dụ: /user/1/edit) thành tên Route chuẩn của Laravel (ví dụ: users.edit). Điều này giúp dữ liệu trên Kibana không bị phân rã rác.
  • Tự động bắt các dữ liệu bổ sung (Metadata) như User ID đang đăng nhập, thông tin Request Body để phục vụ debug.

4. Chạy thử và hưởng thành quả

Bây giờ, hãy khởi động lại container PHP của bạn để nhận cấu hình mới.

Mở trình duyệt lên và "gõ" liên tục vào một vài API trong dự án Laravel của bạn (ví dụ: trang đăng nhập, trang lấy danh sách sản phẩm) để sinh ra dữ liệu Traffic.

Kiểm tra trên giao diện Kibana:

  1. Quay lại trang Kibana (http://localhost:5601).
  2. Vào mục APM từ menu điều hướng.
  3. Ở tab Services, bạn sẽ thấy ngay tên ứng dụng "Laravel-Backend-App" xuất hiện một cách kiêu hãnh!
  4. Click vào tên service, bạn sẽ thấy toàn bộ biểu đồ về Latency (Độ trễ), Throughput (Lượng request/phút), và Error Rate (Tỉ lệ lỗi) hiển thị theo thời gian thực.

Lời kết & Bài học tiếp theo

Tích hợp APM Agent vào mã nguồn giống như việc bạn vừa gắn một hệ thống cảm biến thông minh vào động cơ xe đua vậy. Từ nay, mọi hành vi của mã nguồn đều nằm trong tầm mắt của bạn.

Tuy nhiên, nhìn thấy tên Service xuất hiện mới chỉ là bước khởi đầu. Làm sao để từ các biểu đồ đó, chúng ta tìm ra câu lệnh SQL nào đang chạy chậm? Làm sao phát hiện ra dự án có bị dính lỗi kinh điển N+1 Query hay không?

Ở Bài 6: Đọc hiểu Dashboard – Cách săn lùng "Slow Query" và "N+1 Problem" bằng APM, chúng ta sẽ cùng nhau học cách "đọc vị" các chỉ số trên Kibana để tối ưu hóa code như một chuyên gia thực thụ.

Nếu quá trình cài đặt Extension PHP có gặp khó khăn gì về phiên bản, hãy để lại câu hỏi dưới phần bình luậ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í