BÀI 4: THỰC HÀNH PART 1 – DỰNG ELASTIC APM SERVER & KIBANA BẰNG DOCKER COMPOSE
thuyết, kiến trúc cũng như các khái niệm cốt lõi của APM. Hôm nay, chúng ta sẽ chính thức bắt tay vào phần thực hành: Tự dựng một cụm Elastic APM hoàn chỉnh ngay trên máy Local bằng Docker Compose.
Mục tiêu của bài hôm nay là dựng lên một "bộ máy tiếp nhận" sẵn sàng, để ở bài sau chúng ta chỉ việc cắm Agent từ ứng dụng vào là dữ liệu tự động đổ về.
1. Chuẩn bị "vũ khí"
Trước khi bắt đầu, hãy đảm bảo máy tính của bạn đã cài đặt sẵn:
- Docker và Docker Compose (Nếu dùng Docker Desktop thì đã tích hợp sẵn cả hai).
- Một chút bộ nhớ RAM trống (Tối thiểu khoảng 3GB-4G RAM vì Elasticsearch khá "ngốn" tài nguyên khi khởi chạy).
2. Cấu trúc thư mục dự án
Bạn hãy tạo một thư mục mới tên là elastic-apm-local và tạo các file theo cấu trúc sau:
elastic-apm-local/
├── docker-compose.yml
└── apm-server.yml
3. Chi tiết các file cấu hình
File 1: apm-server.yml
Đây là file cấu hình riêng cho APM Server để nó biết cách lắng nghe các Agent và biết đường đẩy dữ liệu về Elasticsearch.
apm-server:
host: "0.0.0.0:8200" # Lắng nghe từ tất cả các nguồn gửi đến port 8200
rum:
enabled: true # Bật tính năng Real User Monitoring (nếu sau này muốn đo cả Frontend)
output.elasticsearch:
hosts: ["http://elasticsearch:9200"] # Địa chỉ container Elasticsearch trong mạng Docker
# Ở môi trường local dev, chúng ta tạm thời tắt auth để cấu hình đơn giản nhất
username: "elastic"
password: "changeme"
logging.level: info
File 2: docker-compose.yml
File này sẽ định nghĩa 3 dịch vụ tương ứng với kiến trúc chúng ta đã học: elasticsearch, kibana, và apm-server. Chúng ta sử dụng phiên bản 8.12.0 ổn định và mạnh mẽ.
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
container_name: es_backend
environment:
- node.name=elasticsearch
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # Giới hạn RAM cho ES ở local (512MB)
- xpack.security.enabled=false # Tắt security để tiện lab ở local
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es_data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
networks:
- apm_network
kibana:
image: docker.elastic.co/kibana/kibana:8.12.0
container_name: kibana_frontend
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- apm_network
apm-server:
image: docker.elastic.co/apm/apm-server:8.12.0
container_name: apm_server
ports:
- "8200:8200"
volumes:
- ./apm-server.yml:/usr/share/apm-server/apm-server.yml:ro
command: apm-server -e -d "*" -c /usr/share/apm-server/apm-server.yml
depends_on:
- elasticsearch
networks:
- apm_network
volumes:
es_data:
driver: local
networks:
apm_network:
driver: bridge
4. Khởi động và kiểm tra thành quả
Mở Terminal tại thư mục elastic-apm-local và gõ câu lệnh "thần thánh":
docker compose up -d
Docker sẽ tiến hành kéo các Image về và khởi chạy ngầm (-d). Quá trình này có thể mất từ 2-5 phút tùy thuộc vào tốc độ mạng của bạn.
Kiểm tra các Container có chạy ổn định không: Gõ lệnh:
docker compose ps
Nếu cả 3 container es_backend, kibana_frontend, và apm_server đều hiển thị trạng thái Up, xin chúc mừng, bạn đã thành công 90%!
5. Truy cập giao diện và "Xác nhận" kết nối
- Mở trình duyệt: Truy cập vào địa chỉ
http://localhost:5601để mở giao diện Kibana. - Đi tới khu vực APM:
- Bấm vào Menu góc trái (Biểu tượng 3 dấu gạch ngang).
- Tìm đến mục Management -> Chọn Integrations.
- Gõ vào thanh tìm kiếm chữ
APMvà chọn ứng dụng APM. - Hoặc đơn giản là truy cập trực tiếp bằng thanh search toàn cầu của Kibana với từ khóa "APM".
- Kiểm tra trạng thái: Tại tab setup, bạn kéo xuống dưới cùng bấm nút "Check APM Server status". Nếu màn hình hiển thị tick xanh kèm dòng chữ "You have successfully connected to APM Server" thì hệ thống của bạn đã hoàn toàn sẵn sàng nhận dữ liệu!
Lời kết & Bài học tiếp theo
Việc tự tay dựng thành công cụm Elastic APM bằng Docker Compose giúp bạn làm chủ hoàn toàn hạ tầng giám sát của mình mà không phụ thuộc vào bất kỳ nhà cung cấp dịch vụ đám mây tính phí nào.
Hạ tầng đã sẵn sàng, "bẫy" đã được giăng ra. Việc tiếp theo là dụ "con mồi" vào.
Ở Bài 5, chúng ta sẽ thực hành Tích hợp APM Agent vào một dự án backend thực tế để xem cách các Transaction và Span tự động được ghi nhận và bắn về port 8200 của APM Server như thế nào.
Các bạn có gặp lỗi Exit 137 (thiếu RAM) hay lỗi kết nối nào khi chạy docker compose up không? Hãy để lại log lỗi ở phần bình luận để mình hỗ trợ nhé!
All rights reserved