Grafana Loki là một hệ thống tổng hợp nhật ký lưu trữ và truy vấn nhật ký từ các ứng dụng và cơ sở hạ tầng. Mặc dù phổ biến, nhật ký chứa thông tin quan trọng về hoạt động của hệ thống và là nguồn thông tin gỡ lỗi và khắc phục sự cố có giá trị. Nhật ký thường được sử dụng để xác định và theo dõi hoạt động độc hại hoặc đơn giản là theo dõi hoạt động của người dùng để cung cấp thông tin kinh doanh.
Trong một bài đăng trên blog trước đó, Ghi nhật ký bằng Grafana Loki và MinIO , chúng tôi đã cung cấp tổng quan về các thành phần của Loki và kiến trúc tổng thể của chúng. Hãy coi Loki đối với nhật ký tương tự như Prometheus đối với số liệu. Loki nhẹ và tiết kiệm chi phí vì nó chỉ lập chỉ mục và truy vấn siêu dữ liệu. Các đặc vụ Promtail thu thập, gắn nhãn và biến đổi các bản ghi trước khi gửi chúng cho Loki. Sau đó, Loki lập chỉ mục siêu dữ liệu và nhóm các mục vào luồng được lập chỉ mục bằng nhãn. Grafana sau đó được sử dụng để trực quan hóa và truy vấn thông tin nhật ký từ Loki. Kể từ phiên bản 2.0, Loki lưu trữ dữ liệu trong một phụ trợ lưu trữ đối tượng duy nhất, chẳng hạn như MinIO. Trong khi bài đăng trên blog trước đã giải thích những lợi ích của việc lưu dữ liệu Loki vào MinIO, thì bài đăng trên blog này là một hướng dẫn chỉ cho bạn cách thực hiện.
Đầu tiên, chúng tôi sẽ hướng dẫn bạn cách triển khai Loki và MinIO bằng bộ chứa Docker, sau đó là hướng dẫn cách cài đặt từ nguồn.
Chúng tôi đã tạo một bản demo bằng cách sử dụng bộ chứa Docker, một số tập lệnh và kho lưu trữ Git. Chúng tôi đã bắt đầu với kho lưu trữ Grafana Loki và thêm yaml cấu hình và bộ chứa cho MinIO cũng như tập lệnh để tạo và hiển thị bộ chứa MinIO cho dữ liệu Loki. Các bước sau đây sẽ dẫn đến năm hình ảnh này chạy cục bộ trong bộ chứa Docker:
Ba cái đầu tiên rõ ràng là cần thiết cho Loki, Promtail và Grafana. Chúng đã có sẵn từ Grafana trong kho lưu trữ Loki (có một video giải thích ngắn). MinIO là bộ lưu trữ đối tượng cho Loki và bộ chứa cuối cùng sẽ chạy tập lệnh tạo các bộ chứa làm mục tiêu của Loki.
Loki đã được định cấu hình để lưu dữ liệu nhật ký vào MinIO bằng cách sử dụng loki.yaml
. Đặc biệt quan trọng là phần:
storage_config: boltdb_shipper: active_index_directory: /loki/index cache_location: /loki/index_cache resync_interval: 5s shared_store: s3 aws: s3: http://minioadmin:minioadmin@minio.:9000/loki s3forcepathstyle: true
Lưu ý dấu chấm trong địa chỉ S3 cho MinIO. Điều này được sử dụng vì không cần chỉ định Khu vực AWS.
Chúng tôi tạo môi trường Docker bằng tệp docker-compose.yaml
. Chúng tôi sẽ định cấu hình vùng chứa, ổ đĩa, cổng, mạng và cung cấp các lệnh khởi động.
Để hình ảnh loki
chạy dưới dạng vùng chứa có quyền truy cập vào cấu hình Loki qua các tập:
services: loki: image: grafana/loki:latest volumes: - <your-local-path>/loki/production:/home/loki/production ports: - "3100:3100" command: -config.file=/home/loki/production/loki.yaml networks: - loki
Cấu hình đầu tiên bạn cần thực hiện là đảm bảo rằng thư mục production
cục bộ của bạn đang được chia sẻ với vùng chứa. Vui lòng chỉnh sửa phần volumes
của docker-compose.yaml
của bạn để chỉ thư mục cục bộ trên hệ thống máy chủ nơi bạn đã tải xuống thư mục production
. Chúng tôi đang ánh xạ đường dẫn máy chủ tới đường dẫn vùng chứa để đọc loki.yaml
.
Trong docker-compose.yaml
, chúng tôi cũng xác định một mạng và hiển thị các cổng của bộ chứa đang chạy máy chủ MinIO. Trong trường hợp này, cổng 9000 và 9001 sẽ được hiển thị với máy cục bộ của bạn để bạn truy cập máy chủ MinIO bằng trình duyệt.
Console UI: minio: image: minio/minio:latest ports: - "9000:9000" - "9001:9001" networks: - loki command: server ~ --address ':9000' --console-address ':9001'
Chúng tôi định cấu hình mạng với tất cả các vùng chứa chia sẻ mạng loki
. Mỗi vùng chứa có thể ping các vùng chứa khác và sử dụng API của chúng. Không sử dụng địa chỉ IP cố định cho vùng chứa của bạn. Để dễ dàng hơn, chúng tôi đã định cấu loki
và minio
trong môi trường của mình để phân giải thành vùng chứa thích hợp. Ví dụ:
http://minio:9000 for MinIO http://loki:3100 for Loki http://loki:3000 for Grafana
Hành động tiếp theo do docker-compose.yaml
thực hiện là chạy Máy khách MinIO (mc) trong vùng chứa để định cấu hình Máy chủ MinIO, tạo vùng chứa đích cho dữ liệu Loki và đặt chính sách truy cập thành public
theo yêu cầu.
createbuckets: image: minio/mc networks: - loki depends_on: - minio entrypoint: > /bin/sh -c " /usr/bin/mc config host add myminio http://minio:9000 minioadmin minioadmin; /usr/bin/mc rm -r --force myminio/loki; /usr/bin/mc mb myminio/loki; /usr/bin/mc policy set public myminio/loki; exit 0; "
Promtail, một chương trình Go nhỏ, được sử dụng để theo dõi hoặc thu thập các tệp nhật ký được phân phối và gửi chúng cho Loki. Đối với bản trình diễn này, Promtail được triển khai trong bộ chứa của nó với một tệp cấu hình loại bỏ thư mục /var/log. Không cần thay đổi để chạy bản trình diễn này và để nó xử lý các tệp nhật ký tại vị trí đó - /var/log.
Ở phần cuối của hướng dẫn này, chúng tôi sẽ giới thiệu cách để Promtail cạo các vị trí khác trên hệ thống để tìm tệp nhật ký.
Bây giờ bạn đã hiểu cách định cấu hình môi trường Loki, Promtail và Docker của mình, vui lòng làm theo các bước sau để định cấu hình và chạy môi trường demo. Các bước sau sử dụng docker-compose.yaml
, loki.yaml
và cấu hình Promtail mặc định để minh họa cách Loki hoạt động với MinIO. Sau khi tải xuống các tệp của chúng tôi, hãy chỉnh sửa chúng cho phù hợp với môi trường của bạn.
Sao chép kho lưu trữ này https://github.com/cniackz/loki :
git clone https://github.com/cniackz/loki.git minio-loki-tutorial
Thay đổi thư mục thành thư mục production
cục bộ của bạn:
https://github.com/cniackz/loki/tree/main/production
cd <your-local-path>/minio-loki-tutorial/production Edit docker-compose.yaml to reference your local home directory If necessary, edit promtail.yaml
Xây dựng môi trường Docker cục bộ của bạn:
docker-compose build --no-cache
Khởi chạy bộ chứa Docker cục bộ:
docker-compose up -d
Để xác nhận rằng dữ liệu Loki đang được lưu vào MinIO, hãy đăng nhập vào Bảng điều khiển MinIO tại http://localhost:9001
hoặc http://minio:9001
. Hướng dẫn này sử dụng các thông tin xác thực sau:
user: minioadmin password: minioadmin
Sau khi đăng nhập, nhấp vào Buckets. Bạn sẽ thấy rằng nhóm Loki đã được tạo.
Ở bên phải, nhấp vào Duyệt để xem nội dung của nhóm mới được tạo. Bạn sẽ thấy thư mục fake
bên dưới loki
. Đây là nơi Loki sẽ lưu dữ liệu.
Nhấp vào tên của nó để mở thư mục fake
. Loki giữ nhật ký trong bộ nhớ trong một khoảng thời gian đã định cấu hình rồi ghi chúng vào bộ nhớ đối tượng. Mặc định là khoảng thời gian 5 phút, vì vậy vui lòng đợi 5 phút để dữ liệu xuất hiện trong nhóm của bạn.
Tại thời điểm này, Promtail đang gửi nhật ký cho Loki và Loki đang lưu dữ liệu vào MinIO. Bây giờ, hãy thiết lập Grafana để xem nhật ký của Loki. Grafana 6.0 trở lên bao gồm hỗ trợ tích hợp cho Loki. Grafana 6.3 trở lên bao gồm hỗ trợ chức năng LogQL .
Đăng nhập vào Grafana tại http://loki:3000
(thông tin đăng nhập mặc định là quản trị viên: quản trị viên).
Trong Grafana, hãy nhấp vào biểu tượng răng cưa trên thanh bên trái để chuyển đến Cấu hình và sau đó là Nguồn dữ liệu. Nhấp vào nút Thêm nguồn dữ liệu lớn và sau đó chọn Loki.
Chỉnh sửa trường URL http để dành cho máy chủ Loki của chúng tôi chạy cục bộ bằng ánh xạ cổng Docker: http://loki:3100
.
Sau đó nhấp vào Lưu & Kiểm tra.
Để xem nhật ký ngay lập tức, hãy nhấp vào khám phá. Bạn cũng có thể xem nhật ký bằng cách nhấp vào Khám phá ở thanh bên trái. Tuy nhiên, bạn khám phá, sau đó chọn nguồn dữ liệu Loki trong danh sách thả xuống trên cùng bên trái, sau đó chọn luồng nhật ký bằng nút Nhãn nhật ký.
Bạn có thể nhập truy vấn LogQL và nhấp vào Chạy truy vấn. Tuy nhiên, nếu bạn chưa biết LogQL, bạn có thể sử dụng GUI để chọn nhật ký và tham số truy vấn.
Để xem nhanh nhật ký trong Loki, hãy nhấp vào Trình duyệt nhật ký, sau đó trong phần 1. Select labels to search in
và chọn job
, sau đó trong phần 2. Find values for the selected labels
, nhấp vào tên công việc của bạn (từ promtail-local-config.yaml
). Trong trường hợp này, tôi đã nhấp vào varlogs
. Sau đó nhấp vào nút Hiển thị Nhật ký.
Bạn có thể chọn phạm vi thời gian và đặt khoảng thời gian làm mới truy vấn ở trên cùng bên phải của cửa sổ trình duyệt.
Để xem thêm chi tiết về nhật ký, hãy cuộn xuống và nhấp vào một trong các mục nhật ký, nó sẽ cung cấp thêm thông tin liên quan đến mục nhật ký.
Một tính năng thực sự mạnh mẽ là khả năng lọc hoặc xem số liệu thống kê về labels
và fields
trực tiếp từ chi tiết nhật ký bằng cách nhấp vào biểu tượng. Điều này giúp đơn giản hóa việc khắc phục sự cố vì nó giúp dễ dàng tìm kiếm các lỗi lặp lại và xoay vòng giữa các cụm từ tìm kiếm.
Sau khi bản trình diễn đang chạy, bước tiếp theo là để Promtail cạo một bộ tệp khác có thể thú vị hơn cho trường hợp sử dụng của bạn. Để thực hiện việc này, chúng tôi cần Promtail chạy bằng tệp cấu hình mà chúng tôi có thể chỉnh sửa. Một cách để đạt được điều này là sử dụng các volume trong Docker.
Chỉnh sửa tệp docker-compose.yaml
để tạo 2 tập mới có thể truy cập từ bộ chứa Promtail. Cái đầu tiên cung cấp quyền truy cập vào thư mục trên hệ thống máy chủ nơi tệp cấu hình mới sẽ được tạo. Cái thứ hai cung cấp quyền truy cập vào một thư mục sẽ chứa các tệp nhật ký quan tâm. Ngoài ra, Promtail sẽ được khởi chạy tham chiếu đến tệp cấu hình mới mà chúng tôi đã gọi là promtail-local-config.yaml
:
version: "3" networks: loki: services: loki: image: grafana/loki:latest volumes: - <your-local-path>/loki/minio-loki-tutorial/production:/home/loki/production ports: - "3100:3100" command: -config.file=/home/loki/production/loki.yaml networks: - loki promtail: image: grafana/promtail:2.4.2 volumes: - /var/log:/var/log -- <your-local-path>/loki/minio-loki-tutorial/production:/home/loki/production -- <your-local-path>/access_logs:/home/loki/access_logs command: -config.file=/home/loki/production/promtail-local-config.yaml networks: - loki grafana: image: grafana/grafana:latest ports: - "3000:3000" networks: - loki minio: image: minio/minio:latest ports: - "9000:9000" - "9001:9001" networks: - loki command: server ~ --address ':9000' --console-address ':9001' createbuckets: image: minio/mc networks: - loki depends_on: - minio entrypoint: > /bin/sh -c " /usr/bin/mc config host add myminio http://minio:9000 minioadmin minioadmin; /usr/bin/mc rm -r --force myminio/loki; /usr/bin/mc mb myminio/loki; /usr/bin/mc policy set public myminio/loki; exit 0; "
Còn rất nhiều điều bạn có thể làm với dữ liệu nhật ký trong Grafana. Để bắt đầu, bạn có thể cài đặt promtail ở nhiều nơi hơn để theo dõi nhiều nhật ký hơn cho Loki. Sao chép tệp thực thi và promtail-local-config.yaml
sang các máy/phiên bản/bộ chứa khác, chỉnh sửa cấu hình như được mô tả trong Cấu hình Promtail và chạy nó.
Bây giờ chúng ta cần tạo tệp cấu hình Promtail, promtail-local-config.yaml
để gửi nhật ký hệ thống cục bộ cho Loki. Tải xuống và chỉnh sửa tệp cấu hình mẫu từ Grafana. Phần cần tập trung vào là scrape_configs
vì đây là nơi promtail cho biết cần lấy nhật ký nào, cách định dạng chúng và nơi gửi chúng. Vui lòng xem Nhận nhật ký vào Loki để biết thêm thông tin về cách định cấu hình promtail.
Phần scrape_configs
bao gồm:
static_configs
. Tuy nhiên, thường được xác định bởi vì trong các phiên bản Promtail cũ hơn, nó không phải là tùy chọn. Đây là một thành phần tạo tác từ việc sử dụng trực tiếp mã khám phá dịch vụ Prometheus, yêu cầu mục nhập này.
server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - job_name: apache static_configs: - targets: - localhost labels: job: access_logs __path__: /home/loki/access_logs/*log
Điều quan trọng là phải hiểu các tùy chọn cấu hình khác nhau để cạo trong Promtail và Grafana cung cấp nhiều thông tin chi tiết .
Có thể hữu ích khi tham khảo tài liệu tham khảo cấu hình promtail đầy đủ để xem toàn bộ khả năng của ứng dụng.
Cuối cùng, đặt một số nhật ký truy cập máy chủ web Apache vào thư mục được chỉ định trong tệp docker-compose.yaml
trên hệ thống máy chủ. Đây là những nhật ký mà Promtail sẽ nhập và gửi cho Loki để xử lý:
-- <your-local-path>/access_logs:/home/loki/access_logs
Khi các chỉnh sửa đã được thực hiện và nhật ký truy cập Apache mẫu được đặt đúng chỗ, hãy mang các thùng chứa xuống và sao lưu bằng trình soạn thảo docker:
docker-compose down docker-compose up -d
Promtail sau đó sẽ tải các tệp nhật ký truy cập Apache mới và cung cấp chúng cho Loki.
Môi trường mà chúng tôi đã tạo trong hướng dẫn này rất hữu ích để bắt đầu với Loki, nhưng nó chưa sẵn sàng để sản xuất. Các bước tiếp theo sẽ là rời khỏi Docker cho Kubernetes và sử dụng MinIO phân tán thay vì một phiên bản duy nhất. Cuối cùng, dữ liệu của Loki đủ lớn để nó được hưởng lợi từ cơ sở dữ liệu bên ngoài để tìm kiếm chỉ mục nhanh chóng. Vui lòng xem Khả năng mở rộng - Mở rộng quy mô với Grafana Loki để biết thêm thông tin.
Nhóm khả năng quan sát của Grafana, Prometheus và AlertManager đã có được sự bổ sung mạnh mẽ với Loki (BTW, chúng tôi cũng có một hướng dẫn cho Grafana, Prometheus và AlertManager trên MinIO ). Các hệ thống phân tán, đặc biệt là khi được Kubernetes chứa và điều phối, có nhiều nhật ký cho các ứng dụng và dịch vụ siêu nhỏ của chúng. Loki kết hợp với MinIO là một cách tiết kiệm chi phí để thu thập, lưu trữ và truy vấn nhật ký.
Nếu bạn có bất kỳ câu hỏi nào, vui lòng gửi email cho chúng tôi theo địa chỉ [email protected] hoặc tham gia kênh chậm chạp của MinIO và hỏi đi.
Cũng được xuất bản ở đây .