0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng Dẫn Triển Khai ELK Stack Sử Dụng Docker Để Giám Sát Log Ứng Dụng NodeJS

Đăng vào 3 ngày trước

• 4 phút đọc

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:

Copy
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 Copy
{"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:

  1. Người dùng truy cập vào ứng dụng NodeJS.
  2. Ứng dụng ghi log vào file.
  3. Filebeat chuyển log từ file sang Logstash.
  4. Logstash xử lý log và gửi tới Elasticsearch.
  5. 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 Copy
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 Copy
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 Copy
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:

Copy
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:

Copy
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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào