Cập nhật gần nhất: 10/11/2024
Chào các bạn, chúc các bạn có một kỳ nghỉ 30/4-1/5 vui vẻ và an toàn! Trong bài viết hôm nay, chúng ta sẽ tiếp tục hành trình khám phá Docker và CI/CD bằng cách thiết lập ELK Stack (bao gồm Elasticsearch, Logstash, Kibana và Filebeat) để giám sát log cho ứng dụng NodeJS. Chúng ta sẽ cùng tìm hiểu cách Docker giúp đơn giản hóa việc triển khai hạ tầng (infrastructure) và rút ngắn thời gian thiết lập một cách đáng kể.
1. Chuẩn Bị
Để bắt đầu, các bạn hãy clone source code từ kho của mình tại nhánh master và thư mục docker-elk-node. Sau khi clone xong, chạy lệnh sau để khởi động ứng dụng:
docker compose up -d
Mở trình duyệt và truy cập vào địa chỉ http://localhost:3000
hoặc http://localhost:3000/users
để xem ứng dụng.
2. Tổng Quan Về Ứng Dụng
Ứng dụng NodeJS mà chúng ta sẽ xây dựng rất đơn giản. Mỗi khi có yêu cầu vào server (cũng như tải trang, CSS/JS, API...), log sẽ được ghi vào file trong thư mục logs
. Dưới đây là một ví dụ về định dạng log:
json
{"level":"info","message":"::ffff:192.168.65.1 - - [29/Apr/2024:14:31:57 +0000] \"GET / HTTP/1.1\" 200 204 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\"\n","timestamp":"2024-04-29T14:31:57.843Z"}
Để gửi thông tin log này sang ELK và có thể theo dõi, chúng ta sẽ sử dụng Filebeat.
3. Giới Thiệu ELK Stack và Filebeat
Qua phần kiến thức vỡ lòng, ELK Stack bao gồm 3 thành phần chính:
- Elasticsearch: Nền tảng lưu trữ, tìm kiếm và phân tích dữ liệu theo phân tán.
- Logstash: Pipeline xử lý dữ liệu, nhận, biến đổi và gửi dữ liệu tới Elasticsearch.
- Kibana: Công cụ trực quan hóa dữ liệu qua giao diện web.
- Filebeat: Công cụ chuyên nhận và gửi log tới Logstash.
ELK Stack được ưa chuộng vì tính bảo mật, khả năng mở rộng và nhiều tính năng hữu ích.
4. Thiết Lập ELK Stack
Chúng ta sẽ xây dựng quy trình triển khai như sau:
- Người dùng truy cập vào ứng dụng NodeJS.
- Ứng dụng ghi log vào file.
- Filebeat chuyển log từ file sang Logstash.
- Logstash xử lý log và gửi tới Elasticsearch.
- Kibana nhận dữ liệu từ Elasticsearch và hiển thị trên giao diện.
4.1 Tạo Cấu Hình Filebeat
Tạo thư mục elk
trong thư mục gốc của dự án, sau đó tạo file filebeat.yml
:
yaml
filebeat.inputs:
- type: filestream
id: my-log-input
paths:
- "/var/log/server/*.log"
output.logstash:
hosts: ["logstash:5044"]
4.2 Cấu Hình Logstash
Tạo file logstash.conf
:
ruby
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
target => "parseJson"
}
grok {
match => {
"message" => "%{IPV6:ipv6}:%{IPV4:ipv4} - - \[%{DATA:parsed_timestamp}\] \"%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response}"
}
}
date {
match => [ "parsed_timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch {
hosts => "${ELASTIC_HOSTS}"
user => "${ELASTIC_USER}"
password => "${ELASTIC_PASSWORD}"
index => "my-log-%{+YYYY.MM.dd}"
}
}
4.3 Tạo Docker Compose File
Tạo file docker-compose.yml
:
yaml
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- 3000:3000
volumes:
- ./logs:/app/logs
elastic:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2
environment:
- ELASTIC_PASSWORD=myelasticpass
- KIBANA_PASSWORD=kibanapass
- discovery.type=single-node
- xpack.security.http.ssl.enabled=false
- cluster.routing.allocation.disk.threshold_enabled=false
volumes:
- ./elk/data:/usr/share/elasticsearch/data
logstash:
image: docker.elastic.co/logstash/logstash:8.12.2
volumes:
- ./elk/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
environment:
- ELASTIC_USER=elastic
- ELASTIC_PASSWORD=myelasticpass
- ELASTIC_HOSTS=http://elastic:9200
depends_on:
- elastic
kibana:
image: docker.elastic.co/kibana/kibana:8.12.2
environment:
SERVER_NAME: kibana
ELASTICSEARCH_HOSTS: 'http://elastic:9200'
ELASTICSEARCH_USERNAME: kibana_system
ELASTICSEARCH_PASSWORD: kibanapass
ports:
- "5601:5601"
depends_on:
- elastic
filebeat:
image: docker.elastic.co/beats/filebeat:8.12.2
volumes:
- ./elk/filebeat.yml:/usr/share/filebeat/filebeat.yml
- ./logs:/var/log/server
Chúng ta sẽ khởi động dịch vụ với lệnh:
docker compose up -d
4.4 Đặt Mật Khẩu Cho User Kibana
Kitana cần thiết phải có mật khẩu, ta sẽ vào container elastic
và thực hiện lệnh sau:
docker compose exec elastic sh
curl -X POST -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" http://localhost:9200/_security/user/kibana_system/_password -d "{ \"password\": \"${KIBANA_PASSWORD}\" }"
Sau khi đặt mật khẩu, các bạn truy cập Kibana tại http://localhost:5601
, đăng nhập với tài khoản elastic/myelasticpass
.
5. Khám Phá Dữ Liệu Trên Kibana
Khi đăng nhập thành công, chọn menu Discover để tạo Data View mới. Nhập thông tin như sau:
- Name: Tên cho Data View.
- Index pattern:
my-log-*
- Timestamp field:
parseJson.timestamp
Sau khi lưu, hãy truy cập lại ứng dụng để tạo log và F5 để xem dữ liệu trong Kibana.
6. Kết Luận
Việc sử dụng Docker để triển khai ELK Stack đã giúp đơn giản hóa quá trình thiết lập hạ tầng rất nhiều. Bằng cách này, các bạn có thể dễ dàng giám sát log ứng dụng với mức chi phí thấp và hiệu quả cao. Hãy thử nghiệm và vọc vạch để tìm hiểu thêm nhé!
Chúc các bạn thành công và hẹn gặp lại trong những bài viết tiếp theo!
source: viblo