Chào mừng các bạn đến với Series Prometheus, ở bài trước chúng ta đã tìm hiểu sơ qua về Prometheus. Trong bài viết này, chúng ta sẽ xem xét kỹ hơn các khái niệm về Prometheus và kiến trúc của nó, sau đó chúng ta sẽ cài đặt và cấu hình một Prometheus đơn giản.
Như chúng ta đã nói ở bài trước Prometheus là công cụ chuyên dụng để theo dõi hệ thống bằng cách thu thập dữ liệu sức khỏe của các ứng dụng, vậy Prometheus sẽ làm được điều đó như thế nào?
Prometheus hoạt động như thế nào?
Prometheus sẽ thực sự thu thập dữ liệu bằng cách lấy dữ liệu từ cơ sở hạ tầng hoặc ứng dụng mà nó cần theo dõi. Cơ sở hạ tầng và ứng dụng mà Prometheus giám sát được gọi là mục tiêu, được xác định trong tệp cấu hình Prometheus.
Các mục tiêu cần cung cấp một điểm cuối HTTP, sau đó Prometheus kéo dữ liệu bằng cách gọi các điểm cuối và lưu kết quả do điểm cuối trả về, được gọi là dữ liệu chuỗi thời gian.Để các mục tiêu cung cấp dữ liệu chuỗi thời gian, có hai cách:
- Đối với cơ sở hạ tầng, chúng tôi sẽ sử dụng một công cụ có tên là exporters, ví dụ như
prometheus/node_exporter
cho máy chủ. - Đối với ứng dụng, chúng ta sẽ cài đặt thư viện tương ứng trong ứng dụng đó, ví dụ đối với ứng dụng JAVA, chúng ta sẽ sử dụng
prometheus/client_java
.
Chúng ta sẽ thường nghe đến thuật ngữ chỉ số, giải thích đơn giản các chỉ số là tập hợp của nhiều chuỗi thời gian có cùng tên. Để hiểu rõ hơn về chuỗi thời gian và số liệu được trả về từ các mục tiêu, chúng ta sẽ tìm hiểu cách dữ liệu được định dạng.
Mô hình dữ liệu Prometheus
Ví dụ: một chuỗi thời gian được trả về từ mục tiêu có giá trị sau:
1 2 | container_cpu_load_average_10s{id="/docker", instance="10.0.2.15:8080", job="docker"} 0 |
Định dạng của dữ liệu trên như sau:
1 2 | <metric name>{<label name>=<label value>, ...} <samples> |
Dưới đây là những điều khoản bạn cần nhớ khi đi phỏng vấn:
- Phần
<metric name>{<label name>=<label value>, ...}
được gọi là ký hiệu, nó là tập hợp các tên chỉ số và một hoặc nhiều nhãn, ký hiệu sẽ được sử dụng để xác định chuỗi thời gian. - Phần
<samples>
được gọi là Mẫu, nó là dữ liệu của chuỗi thời gian, giá trị của nó là một số kiểu dữ liệu float64. - Phần
<metric name>
là tên của chỉ số. section {<label name>=<label value>, ...}
sẽ chứa một tập hợp các nhãn, một nhãn là các cặp khóa-giá trị kiểu dữ liệu.
Ví dụ dữ liệu trên chúng ta sẽ có container_cpu_load_average_10s
là metric name, id="/docker"
là nhãn có key id và value docker, ký hiệu để xác định chuỗi thời gian trên là container_cpu_load_average_10s{id="/docker", instance="10.0.2.15:8080", job="docker"}
và dữ liệu của nó là 0.
Khi Prometheus gọi đến endpoint của một target thì sẽ có rất nhiều dữ liệu chuỗi thời gian như trên trả về, khi đó Prometheus sẽ lưu lại dữ liệu đó, và Prometheus sẽ cung cấp cho chúng ta một bộ công cụ để truy vấn dữ liệu đó, hoặc sử dụng một công cụ khác để truy vấn dữ liệu và biểu diễn nó dưới dạng đồ họa để chúng ta biết trạng thái của hệ thống và ứng dụng.
Truy vấn dữ liệu, Cảnh báo và Hình ảnh hóa
Để truy vấn dữ liệu trong Prometheus, chúng tôi sử dụng ngôn ngữ PromQL, Prometheus cung cấp cho chúng tôi một Trình duyệt Biểu thức để chúng tôi nhập các truy vấn.
Không phải lúc nào chúng ta cũng có thể bật máy tính và quan sát hệ thống, chúng ta cần một hệ thống báo động, Prometheus cung cấp cho chúng ta bộ công cụ Alertmanager. Nếu có điều gì đó không ổn trong hệ thống của tôi, Prometheus sẽ thông báo cho chúng tôi thông qua Alertmanager.
Và cuối cùng, để biểu diễn dữ liệu trên biểu đồ, chúng tôi sẽ sử dụng Grafana.
Chúng ta sẽ tìm hiểu về cách truy vấn dữ liệu, cảnh báo và trực quan trong các bài viết sau. Bây giờ chúng ta sẽ tiến hành cài đặt và cấu hình Prometheus đơn giản.
Cài đặt Prometheus
Trong loạt bài này mình sẽ hướng dẫn các bạn trên môi trường Linux, bạn có thể cài máy ảo để thực hành loạt bài này, để cài đặt Prometheus chúng ta có thể sử dụng Linux package hoặc docker.
Để cài đặt bằng gói Linux, bạn truy cập trang Tải xuống Prometheus và tìm gói phù hợp với hệ điều hành của bạn, ví dụ với Centos.
1 2 | <span class="token function">wget</span> https://github.com/prometheus/prometheus/releases/download/v2.39.0/prometheus-2.39.0.linux-amd64.tar.gz |
Nếu chưa có wget thì bạn cài đặt, tiếp theo chúng ta giải nén file tải về ở trên.
1 2 3 | <span class="token function">tar</span> -xzf prometheus-2.39.0.linux-amd64.tar.gz <span class="token function">sudo</span> <span class="token function">mv</span> prometheus-2.39.0.linux-amd64/prometheus /usr/local/bin/ |
Ngoài ra còn có một công cụ khác trong thư mục prometheus-2.39.0.linux-amd64
khá hữu ích, đó là tệp nhị phân promtool, chúng ta sẽ sử dụng để kiểm tra cú pháp của tệp cấu hình Prometheus.
1 2 | <span class="token function">sudo</span> <span class="token function">mv</span> prometheus-2.39.0.linux-amd64/promtool /usr/local/bin/ |
Kiểm tra xem chúng tôi đã cài đặt thành công chưa.
1 2 3 4 5 6 7 | prometheus --version prometheus, version <span class="token number">2.39</span> .0 <span class="token punctuation">(</span> branch: HEAD, revision: 6d7f26c46ff70286944991f95d791dff03174eea <span class="token punctuation">)</span> build user: root@bc053716806f build date: <span class="token number">20221005</span> -05:09:43 go version: go1.19.1 platform: linux/amd64 |
Ok, vậy là chúng ta đã cài đặt Prometheus thành công, tiếp theo chúng ta sẽ chạy Prometheus với cấu hình đơn giản.
Cấu hình Prometheus
Cấu hình Prometheus được viết trong file YAML, cấu hình mặc định của nó nằm trong thư mục prometheus-2.39.0.linux-amd64
với tên prometheus.yml
chúng ta đã giải nén ở trên, chúng ta cùng xem qua nhé.
1 2 | <span class="token function">cat</span> prometheus-2.39.0.linux-amd64/prometheus.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <span class="token comment"># my global config</span> <span class="token key atrule">global</span> <span class="token punctuation">:</span> <span class="token key atrule">scrape_interval</span> <span class="token punctuation">:</span> 15s <span class="token comment"># Set the scrape interval to every 15 seconds. Default is every 1 minute.</span> <span class="token key atrule">evaluation_interval</span> <span class="token punctuation">:</span> 15s <span class="token comment"># Evaluate rules every 15 seconds. The default is every 1 minute.</span> <span class="token comment"># scrape_timeout is set to the global default (10s).</span> <span class="token comment"># Alertmanager configuration</span> <span class="token key atrule">alerting</span> <span class="token punctuation">:</span> <span class="token key atrule">alertmanagers</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">static_configs</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">targets</span> <span class="token punctuation">:</span> <span class="token comment"># - alertmanager:9093</span> <span class="token comment"># Load rules once and periodically evaluate them according to the global 'evaluation_interval'.</span> <span class="token key atrule">rule_files</span> <span class="token punctuation">:</span> <span class="token comment"># - "first_rules.yml"</span> <span class="token comment"># - "second_rules.yml"</span> <span class="token comment"># A scrape configuration containing exactly one endpoint to scrape:</span> <span class="token comment"># Here it's Prometheus itself.</span> <span class="token key atrule">scrape_configs</span> <span class="token punctuation">:</span> <span class="token comment"># The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.</span> <span class="token punctuation">-</span> <span class="token key atrule">job_name</span> <span class="token punctuation">:</span> <span class="token string">"prometheus"</span> <span class="token comment"># metrics_path defaults to '/metrics'</span> <span class="token comment"># scheme defaults to 'http'.</span> <span class="token key atrule">static_configs</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">targets</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">"localhost:9090"</span> <span class="token punctuation">]</span> |
Tệp cấu hình mặc định có bốn phần cấu hình chính: toàn cầu, cảnh báo, rule_files và scrape_configs.
Toàn cầu
Phần toàn cầu chứa các cấu hình chung cho toàn bộ Prometheus.
Trường scrape_intervaldefines
thời gian Prometheus sẽ kéo dữ liệu một lần, chúng tôi chỉ định 15 giây ở trên.
Trường evaluation_interval
xác định thời gian Prometheus sẽ đánh giá lại quy tắc một lần, tạm thời chúng ta không cần quan tâm đến cấu hình này.
Cảnh báo
Phần cảnh báo chứa cấu hình của công cụ mà chúng tôi sẽ gửi cảnh báo nếu có vấn đề với hệ thống của chúng tôi, như đã đề cập ở trên đối với Prometheus, chúng tôi sẽ sử dụng Alertmanager. Hiện tại, chúng tôi không cần sử dụng cảnh báo, vì vậy chúng tôi đóng nó bằng dấu #
.
Tệp quy tắc
Phần rulefiles sẽ chứa cấu hình xác định quy tắc khi Prometheus cần kích hoạt cảnh báo thông qua Alertmanager và các quy tắc về việc ghi lại , chúng ta sẽ tìm hiểu sau.
Cấu hình cạo
Phần mà chúng tôi quan tâm nhất lúc này là scrape_configs, đây là cấu hình để chúng tôi xác định các mục tiêu mà chúng tôi sẽ cần theo dõi.
1 2 3 4 5 | <span class="token key atrule">scrape_configs</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">job_name</span> <span class="token punctuation">:</span> <span class="token string">"prometheus"</span> <span class="token key atrule">static_configs</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">targets</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">"localhost:9090"</span> <span class="token punctuation">]</span> |
Thuộc tính là job_name
được sử dụng để xác định tên của mục tiêu mà chúng tôi theo dõi, ở đây chúng tôi đặt nó là “prometheus”.
Thuộc tính targets
được sử dụng để xác định địa chỉ của đích, đây sẽ là một mảng địa chỉ.
Cấu hình mặc định của Prometheus là tự giám sát, khi bạn chạy Prometheus nó sẽ lắng nghe trên cổng 9090 và cung cấp đường dẫn /metrics
để chúng tôi lấy số liệu của nó.
1 2 | <span class="token function">curl</span> localhost:9090/metrics |
Vì vậy, trong cấu hình trên, thuộc tính job_name mà chúng tôi đặt tên là “prometheus” và các mục tiêu chúng tôi điền vào địa chỉ là localhost: 9090, theo mặc định đường dẫn mà Prometheus sẽ gọi là /metrics
, nếu mục tiêu của chúng tôi có một đường dẫn khác, chúng tôi sẽ chỉ định nó với metrics_path
, ví dụ:
1 2 3 4 5 6 | <span class="token key atrule">scrape_configs</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">job_name</span> <span class="token punctuation">:</span> <span class="token string">"nodejs-server"</span> <span class="token key atrule">metrics_path</span> <span class="token punctuation">:</span> /other <span class="token punctuation">-</span> path <span class="token key atrule">static_configs</span> <span class="token punctuation">:</span> <span class="token punctuation">-</span> <span class="token key atrule">targets</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">"localhost:3000"</span> <span class="token punctuation">]</span> |
Prometheus sẽ kéo dữ liệu thông qua điểm cuối localhost:3000/other-path
.
Chạy Prometheus
Bây giờ chúng ta sẽ chạy Prometheus, nhưng trước đó, chúng ta nên di chuyển tệp cấu hình sang một thư mục thích hợp hơn.
1 2 3 | <span class="token function">sudo</span> <span class="token function">mkdir</span> -p /etc/prometheus <span class="token function">sudo</span> <span class="token function">mv</span> prometheus-2.39.0.linux-amd64/prometheus.yml /etc/prometheus/ |
Tạo thư mục /etc/prometheus
và di chuyển tệp cấu hình vào đó, sau đó chạy máy chủ Prometheus.
1 2 | prometheus --config.file <span class="token string">"/etc/prometheus/prometheus.yml"</span> |
1 2 3 4 | <span class="token assign-left variable">ts</span> <span class="token operator">=</span> <span class="token number">2022</span> -10-05T07:21:29.148Z <span class="token assign-left variable">caller</span> <span class="token operator">=</span> main.go:500 <span class="token assign-left variable">level</span> <span class="token operator">=</span> info <span class="token assign-left variable">msg</span> <span class="token operator">=</span> <span class="token string">"No time or size retention was set so using the default time retention"</span> <span class="token assign-left variable">duration</span> <span class="token operator">=</span> 15d <span class="token assign-left variable">ts</span> <span class="token operator">=</span> <span class="token number">2022</span> -10-05T07:21:29.148Z <span class="token assign-left variable">caller</span> <span class="token operator">=</span> main.go:544 <span class="token assign-left variable">level</span> <span class="token operator">=</span> info <span class="token assign-left variable">msg</span> <span class="token operator">=</span> <span class="token string">"Starting Prometheus Server"</span> <span class="token assign-left variable">mode</span> <span class="token operator">=</span> server <span class="token assign-left variable">version</span> <span class="token operator">=</span> <span class="token string">"(version=2.39.0, branch=HEAD, revision=6d7f26c46ff70286944991f95d791dff03174eea)"</span> <span class="token punctuation">..</span> . |
Nếu bạn có thể thấy rằng nó trả về một loạt dữ liệu chuỗi thời gian, thì bạn đã thiết lập và chạy máy chủ Prometheus. Nếu bạn mở trình duyệt và truy cập địa chỉ máy ảo của mình bằng cổng 9090, chúng ta sẽ thấy giao diện người dùng của Prometheus.
Chạy một truy vấn kiểm tra up{job="prometheus"}
, đây là chuỗi thời gian để cho chúng tôi biết liệu mục tiêu của chúng tôi có còn tồn tại hay không.
Nếu chúng ta thấy rằng Prometheus UI trả về dữ liệu, thì chúng ta đã thành công 😁. Nếu không sử dụng máy ảo, chúng ta có thể thực hành nhanh cách sử dụng docker để chạy, đơn giản với vài câu lệnh như sau.
1 2 3 | docker network create <span class="token builtin class-name">local</span> docker run --name prometheus --network <span class="token builtin class-name">local</span> -p <span class="token number">9090</span> :9090 -v /etc/prometheus:/etc/prometheus -d prom/prometheus |
Bạn có thể chọn chạy với gói Linux hoặc docker, tôi sẽ hướng dẫn bạn cả hai cách trong suốt loạt bài này. Nếu bạn chọn chạy với docker thì bạn nên chạy lệnh docker network create local
để tạo mạng có tên local, chúng ta sẽ cần nó trong các bài viết sau.
Xong.
Sự kết luận
Vì vậy, chúng tôi đã trình bày những kiến thức cơ bản về Prometheus và cách cài đặt nó. Nếu có thắc mắc hoặc cần giải đáp rõ hơn, bạn có thể hỏi trong phần bình luận bên dưới.