Cấu hình Prometheus tự động giám sát AWS EC2 – Service Discovery – Cuongquach.com | Theo cách thông thường khi cập nhật một host trên dịch vụ Prometheus thì thường ta phải cấu hình qua file config, có thể là config trực tiếp vào file hoặc cấu hình ra 1 file list host json rồi trong Prometheus cấu hình load các file json host (file-based service discovery). Nhưng liệu bạn đã biết Prometheus có hỗ trợ tính năng Service Discovery, cho phép bạn tự động tìm kiếm và giám sát các máy chủ hay không ? Các đối tượng máy chủ mà Service Discovery Prometheus hỗ trợ gồm :
- AWS EC2
- Consul
- Kubernetes
Trong bài viết này chúng ta sẽ tìm hiểu cách cấu hình Prometheus tìm kiếm (service discovery) và giám sát tự động các máy chủ AWS EC2 trên AWS.
Mô hình lab
Với mô hình lab như vậy bạn cần đáp ứng các điều kiện sau :
- Hai máy chủ AWS EC2 Linux 1,2 đã cài đặt Node Exporter và mở firewall local cho port 9100.
- Hai máy chủ AWS EC2 Linux 1,2 cần được cấu hình Security Group cho phép truy cập port 9100 Node Exporter.

Prometheus sẽ sử dụng thông tin IAM User để chủ động query API AWS nhằm liệt kê danh sách máy chủ AWS EC2 mà chúng ta cần monitor. Từ đó tạo nên một danh sách các host trong target monitor cùng port tương ứng để pull dữ liệu metrics.
Cấu hình Prometheus tìm kiếm và giám sát AWS EC2
Đầu tiên bạn cần khởi tạo một IAM User với policy đơn giản ‘AmazonEC2ReadOnlyAccess‘, cho phép liệt kê được danh sách các máy chủ AWS EC2 với thông tin cơ bản về nó. Thao tác tạo IAM User cũng không quá phức tạp, bạn có thể chủ động tìm hiểu. Một số hình ảnh tạo IAM User như dưới.
– Tạo user IAM tên mong muốn.

– Khởi tạo hoàn tất với policy mong muốn, kèm theo đó là thông tin Access Key ID và Secret Access key.

– Coi lại thông tin user ở ngoài trang quản lý IAM.

Giờ bạn ssh vào máy chủ dịch vụ Prometheus rồi chỉnh sửa file cấu hình dịch vụ Prometheus. Thêm thông tin region, access key, secret key của user có quyền coi thông tin AWS EC2 mà ta đã tạo ở trên. Khai báo target port là 9100 dùng cho dịch vụ Node Exporter dưới máy chủ Client. Nếu bạn xài service Exporter khác thì khai báo tên cùng port khác.
# vi /etc/prometheus/prometheus.yml scrape_configs: - job_name: 'aws-ec2-node-exporter' ec2_sd_configs: - region: ap-southeast-1 access_key: AKIAWZNG2NCBZXXXXXX secret_key: yh4Wct9r8lhcE4YJO2Nexxxxxxxxxxxxxxxx port: 9100
Bạn truy cập trang quản lý Prometheus ở phần ‘service discovery‘ và ‘targets‘.
Ví dụ: http://prometheus.cuongquachlab.com:9090/service-discovery

Ví dụ: http://prometheus.cuongquachlab.com:9090/targets

Relabeling
Đây là một trong những phần khá quan trọng khi sử dụng với tính năng Service Discovery nhằm tìm kiếm các máy chủ Host EC2 trên AWS. Chúng ta sẽ có những nhu cầu :
- Chỉ tìm kiếm và monitor những máy chủ thuộc đối tượng dịch vụ cụ thể, dựa trên tag tên của EC2 hoặc tag khác của EC2 chẳng hạn.
- Thay đổi target label hoặc thêm target label dựa vào source label.
Một data mẫu về Discovery Labels và Target Labels, các bạn có thể coi lại đường dẫn ‘/service-discovery‘ của Prometheus.
+ Discovery Labels
__address__="10.110.15.175:9100" __meta_ec2_availability_zone="ap-southeast-1c" __meta_ec2_instance_id="i-xxxxx" __meta_ec2_instance_state="running" __meta_ec2_instance_type="t2.nano" __meta_ec2_owner_id="xxxxx" __meta_ec2_primary_subnet_id="subnet-xxxxx" __meta_ec2_private_dns_name="ip-10-110-15-175.ap-southeast-1.compute.internal" __meta_ec2_private_ip="10.110.15.175" __meta_ec2_subnet_id=",subnet-xxxxx," __meta_ec2_tag_Name="CuongQuach-Linux-2" __meta_ec2_vpc_id="vpc-xxxxx" __metrics_path__="/metrics" __scheme__="http" job="aws-ec2-node-exporter"
+ Target Labels
instance="10.110.15.175:9100" job="aws-ec2-node-exporter"
Giờ giả sử nếu để mặc định thì Prometheus tìm kiếm và monitor hết tất cả AWS EC2 kể cả máy chủ Prometheus như lab trên, nhưng mà mình chỉ muốn monitor mỗi các máy chủ EC2 có tag tên có chữ ‘Linux‘ thôi thì sao đây.
Kế đến mình cũng muốn thay thông tin target label instance từ địa chỉ IP thành tên hostname của EC2 đó thì thế nào. Phần cấu hình Regex các bạn tự nghiên cứu nhé.
global: scrape_interval: 10s scrape_configs: - job_name: 'prometheus_master' scrape_interval: 5s static_configs: - targets: ['localhost:9090'] - job_name: 'aws-ec2-node-exporter' ec2_sd_configs: - region: ap-southeast-1 access_key: AKIAWZNG2NCBZXXXXXX secret_key: yh4Wct9r8lhcE4YJO2Nexxxxxxxxxxxxxxxx port: 9100 relabel_configs: # Only monitor instances with a Name has string "Linux" - source_labels: [__meta_ec2_tag_Name] regex: .*Linux.* action: keep # Use the tag name Instance as the instance label - source_labels: [__meta_ec2_tag_Name] target_label: instance
Khởi động lại dịch vụ Prometheus.
# systemctl restart prometheus
Truy cập lại trang ‘targets‘ trên Prometheus sẽ thấy còn 2 endpoint host client là Linux* và label ‘Instance‘ cũng được đổi tên rồi này.
Nguồn: https://cuongquach.com/