尝试使用 Prometheus/Loki/Grafana(指标/日志的收集和展示)

首先

    • 業務で扱うシステムで、監視にPrometheusを使っている。これまでPrometheus周りを触ったことがなく、仕組みを理解するために一から簡単な検証を行う。

 

    • こちらの記事「Prometheus/Loki/Grafanaを使ってメトリクス、ログを監視してみる」 が非常に分かりやすく、またやりたかったことが網羅されており、ほぼそのまま実施した。(私の記事では資材のバージョンの最新化や、監視設定変更などを行っており、元記事と合わせてご参照頂ければ)

 

    • 長くなったので、実施内容を分割投稿する。

【初心者】Prometheus/Loki/Grafanaを使ってみる (メトリクス/ログの収集と表示)

本記事。メトリクスとログを収集しGrafanaで表示させる。

【初心者】Prometheus/Loki/Grafanaを使ってみる #2 (AlertManagerによるアラーム通知)

AlertManagerを追加し、CPU高負荷時にslackへの通知を行う。

【初心者】Prometheus/Loki/Grafanaを使ってみる #3 (Amazon Managed Service for Promethus連携)

自分のPrometheusで収集したメトリクスをAmazon Managed Service for Prometheusに連携する。

2. 做过的事情 de

以下のコンポーネントをインストール/設定することにより、監視対象サーバのCPU/MEM、プロセス、ログの監視を行う。

監視サーバ: Prometheus、Loki、Grafana
監視対象サーバ: Node Exporter、Process Exporter、Promtail

処理の大まかな流れは以下の通り。

監視対象サーバのNode Exporterで、CPU/MEMなどの情報を取得する。監視サーバのPrometheusにてメトリクスを収集する。
監視対象サーバのProcess Exporterで、Process(Nginxなど)の情報を取得する。監視サーバのPrometheusにてメトリクスを収集する。
監視対象サーバのPromtailで、ログを取得する。Promtailから、監視サーバのLokiへログを送付する。
監視サーバのGrafanaで、データソースとしてPrometheusを登録し、Prometheus上に収集されたCPU/MEM、プロセス情報を表示する。
監視サーバのGrafanaで、データソースとしてLokiを登録し、Loki上に収集されたログを表示する。

3. 构成图

構成図1.png

4. 程序

4.1 前期准备

    • パブリックサブネット(10.0.0.0/24)を持つVPCを作成する。

 

    • 監視サーバ、監視対象サーバとして、Amazon Linux 2023 のインスタンスを2台作成する。

 

    監視対象サーバにはNginx(プロセス監視・ログ収集検証用)をインストールする。

4.2 监视对象服务器的设置

4.2.1 节点导出器

安装

    資材をダウンロード、インストールする。
# 2023/9時点の最新版 v1.6.1(2023/6/17リリース) を使用 
[ec2-user@ip-10-0-0-124 nodexporter]$ wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
# 解凍して、バイナリを /usr/local/binに展開する
[ec2-user@ip-10-0-0-124 nodexporter]$ tar xvf node_exporter-1.6.1.linux-amd64.tar.gz
[ec2-user@ip-10-0-0-124 nodexporter]$ cd node_exporter-1.6.1.linux-amd64/
[ec2-user@ip-10-0-0-124 node_exporter-1.6.1.linux-amd64]$ sudo cp -p node_exporter /usr/local/bin

服务化

    systemdユニットファイルを作成する。
[Unit]
Description=NodeExporter
[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter
Restart=always
[Install]
WantedBy=multi-user.target
    Node Exporterをサービスとして登録、起動する。
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl daemon-reload
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl enable nodeexporter.service
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl start nodeexporter.service
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl status nodeexporter.service

确认行动

    9100/tcp で待ち受けできていることを確認する。
[ec2-user@ip-10-0-0-124 bin]$ curl localhost:9100
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Node Exporter</title>
    <style>body {
  font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;
  margin: 0;
}
…省略…

4.2.2 进程导出程序

安装

    資材をダウンロード、インストールする。
# 2023/9時点の最新版 v0.7.10(2021/11/17リリース) を使用 
[ec2-user@ip-10-0-0-124 processexporter]$ wget https://github.com/ncabatoff/process-exporter/releases/download/v0.7.10/process-exporter-0.7.10.linux-amd64.tar.gz
# 解凍して、バイナリを /usr/local/binに展開する
[ec2-user@ip-10-0-0-124 processexporter]$ tar xvf process-exporter-0.7.10.linux-amd64.tar.gz
[ec2-user@ip-10-0-0-124 processexporter]$ cd process-exporter-0.7.10.linux-amd64/
[ec2-user@ip-10-0-0-124 process-exporter-0.7.10.linux-amd64]$ sudo cp -p process-exporter /usr/local/bin/
    設定ファイルを作成する。(全てのプロセスを取得)
process_names:
  - name: "{{.Comm}}"
    cmdline:
    - '.+'

服务化

    systemdユニットファイルを作成する。
[Unit]
Description=ProcessExporter
[Service]
Type=simple
ExecStart=/usr/local/bin/process-exporter -config.path /etc/processexporter/config.yml
Restart=always
[Install]
WantedBy=multi-user.target
    Process Exporterをサービスとして登録、起動する。
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl daemon-reload
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl enable processexporter.service
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl start processexporter.service
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl status processexporter.service

確保行動正確。

    9256/tcp で待ち受けできていることを確認する。
[ec2-user@ip-10-0-0-124 ~]$ curl localhost:9256
<html>
<head><title>Named Process Exporter</title></head>
<body>
<h1>Named Process Exporter</h1>
<p><a href="/metrics">Metrics</a></p>
</body>
</html>[ec2-user@ip-10-0-0-124 ~]$

4.2.3 Promtail-log文件收集工具

安裝

    資材をダウンロード、インストールする。
# 2023/9時点の最新版 v2.9.0(2023/9/6リリース) を使用 
[ec2-user@ip-10-0-0-124 promtail]$ wget https://github.com/grafana/loki/releases/download/v2.9.0/promtail-linux-amd64.zip
[ec2-user@ip-10-0-0-124 promtail]$ unzip promtail-linux-amd64.zip
[ec2-user@ip-10-0-0-124 promtail]$ sudo cp -p promtail-linux-amd64 /usr/local/bin
    設定ファイルを作成する。
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

# 監視サーバのlokiのエンドポイントを指定
clients:
  - url: http://10.0.0.249:3100/loki/api/v1/push

scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: varlogs
      __path__: /var/log/*log

# nginxのaccesslogを収集対象にする
- job_name: nginx
  static_configs:
  - targets:
      - localhost
    labels:
      job: nginx
      __path__: /var/log/nginx/access.log

将服务化

    systemdユニットファイルを作成する。
[Unit]
Description=Promtail
[Service]
Type=simple
ExecStart=/usr/local/bin/promtail-linux-amd64 --config.file=/etc/promtail/promtail-local-config.yaml
Restart=always
[Install]
WantedBy=multi-user.target
    Promtailをサービスとして登録、起動する。
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl daemon-reload
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl enable promtail.service
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl start promtail.service
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl status promtail.service

确认行动

    9080/tcp で待ち受けできていることを確認する。
[ec2-user@ip-10-0-0-124 ~]$ curl localhost:9080/targets
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta name="robots" content="noindex,nofollow">
        <title>Targets</title>
        <link rel="shortcut icon" href="/static/img/favicon.ico?v=%28version%3d2.9.0%2c%20branch%3dHEAD%2c%20revision%3d2feb64f69%29">
        <script src="/static/vendor/js/jquery-3.5.1.min.js?v=%28version%3d2.9.0%2c%20branch%3dHEAD%2c%20revision%3d2feb64f69%29"></script>
        <script src="/static/vendor/js/popper.min.js?v=%28version%3d2.9.0%2c%20branch%3dHEAD%2c%20revision%3d2feb64f69%29"></script>
        <script src="/static/vendor/bootstrap-4.1.3/js/bootstrap.min.js?v=%28version%3d2.9.0%2c%20branch%3dHEAD%2c%20revision%3d2feb64f69%29"></script>
…略…

4.3 监视服务器的配置

4.3.1 帕罗默修斯

安装

    資材をダウンロード、インストールする。
# 2023/9時点の最新版 v2.47.0(2023/9/6リリース) を使用 
[ec2-user@ip-10-0-0-249 prometheus]$ wget https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz
[ec2-user@ip-10-0-0-249 prometheus]$ tar xvf prometheus-2.47.0.linux-amd64.tar.gz
[ec2-user@ip-10-0-0-249 prometheus]$ cd prometheus-2.47.0.linux-amd64/
[ec2-user@ip-10-0-0-249 prometheus-2.47.0.linux-amd64]$ sudo cp -p prometheus /usr/local/bin
    • 設定ファイルを作成する。

デフォルトの設定ファイルに対し、Node ExporterとProcess Exporterを監視対象(JOB)として追加する。

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node-exporter"
    static_configs:
      - targets: ["10.0.0.124:9100"]
  - job_name: "process-exporter"
    static_configs:
      - targets: ["10.0.0.124:9256"]

服务化 huà)

    systemdユニットファイルを作成する。
[Unit]
Description=Prometheus
[Service]
Type=simple
ExecStart=/usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml
Restart=always
[Install]
WantedBy=multi-user.target
    Prometheusをサービスとして登録、起動する。
[ec2-user@ip-10-0-0-124 ~]# sudo systemctl daemon-reload
[ec2-user@ip-10-0-0-124 ~]# sudo systemctl enable prometheus.service
[ec2-user@ip-10-0-0-124 ~]# sudo systemctl start prometheus.service
[ec2-user@ip-10-0-0-124 ~]# sudo systemctl status prometheus.service

确认动作

    9090/tcp で待ち受けできていることを確認する。
[ec2-user@ip-10-0-0-249 ~]$ curl localhost:9090/graph
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="shortcut icon" href="./favicon.ico"/>
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"/><meta name="theme-color" content="#000000"/><script>const GLOBAL_CONSOLES_LINK="",GLOBAL_AGENT_MODE="false",GLOBAL_READY="true"</script>
<link rel="manifest" href="./manifest.json" crossorigin="use-credentials"/><title>Prometheus Time Series Collection and Processing Server</title><script defer="defer" src="./static/js/main.78875f45.js"></script><link href="./static/css/main.4858e794.css" rel="stylesheet"></head>
<body class="bootstrap"><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>

4.3.2 洛基

安装

    資材をダウンロード、インストールする。
# 2023/9時点の最新版 v2.9.0(2023/9リリース) を使用 
[ec2-user@ip-10-0-0-249 loki]$ wget "https://github.com/grafana/loki/releases/download/v2.9.0/loki-linux-amd64.zip"
[ec2-user@ip-10-0-0-249 loki]$ unzip loki-linux-amd64.zip
[ec2-user@ip-10-0-0-249 loki]$ sudo cp -p loki-linux-amd64 /usr/local/bin
# 設定ファイルのひな形取得
[ec2-user@ip-10-0-0-249 loki]$ wget https://raw.githubusercontent.com/grafana/loki/main/cmd/loki/loki-local-config.yaml
    • 設定ファイルを作成する。

今回はダウンロードしたひな形(loki-local-config.yaml)をそのまま使用する。

auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  instance_addr: 127.0.0.1
  path_prefix: /tmp/loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks
      rules_directory: /tmp/loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

query_range:
  results_cache:
    cache:
      embedded_cache:
        enabled: true
        max_size_mb: 100

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

ruler:
  alertmanager_url: http://localhost:9093

# By default, Loki will send anonymous, but uniquely-identifiable usage and configuration
# analytics to Grafana Labs. These statistics are sent to https://stats.grafana.org/
#
# Statistics help us better understand how Loki is used, and they show us performance
# levels for most users. This helps us prioritize features and documentation.
# For more information on what's sent, look at
# https://github.com/grafana/loki/blob/main/pkg/analytics/stats.go
# Refer to the buildReport method to see what goes into a report.
#
# If you would like to disable reporting, uncomment the following lines:
#analytics:
#  reporting_enabled: false

服务化

    systemdユニットファイルを作成する。
[Unit]
Description=Loki
[Service]
Type=simple
ExecStart=/usr/local/bin/loki-linux-amd64 -config.file=/etc/loki/loki-local-config.yaml
Restart=always
[Install]
WantedBy=multi-user.target
    Lokiをサービスとして登録、起動する。
[ec2-user@ip-10-0-0-124 ~]# sudo systemctl daemon-reload
[ec2-user@ip-10-0-0-124 ~]# sudo systemctl enable loki.service
[ec2-user@ip-10-0-0-124 ~]# sudo systemctl start loki.service
[ec2-user@ip-10-0-0-124 ~]# sudo systemctl status loki.service

确认行动

    3100/tcp で待ち受けできていることを確認する。
[ec2-user@ip-10-0-0-249 ~]$ curl localhost:3100/metrics
# HELP cortex_distributor_ingester_clients The current number of ingester clients.
# TYPE cortex_distributor_ingester_clients gauge
cortex_distributor_ingester_clients 0
# HELP cortex_dns_failures_total The number of DNS lookup failures
# TYPE cortex_dns_failures_total counter
cortex_dns_failures_total{name="memberlist"} 0
…以下略…

4.3.3 绘图工具 Grafana

安装

    • 資材をダウンロード、インストールする。手順は「Install Grafana on RHEL or Fedora」を参照する。

 

    GPGキーをインポートする。
[ec2-user@ip-10-0-0-249 grafana]$ wget -q -O gpg.key https://rpm.grafana.com/gpg.key
[ec2-user@ip-10-0-0-249 grafana]$ sudo rpm --import gpg.key
    /etc/yum.repos.d/grafana.repo としてレポジトリファイルを作成する。
[grafana]
name=grafana
baseurl=https://rpm.grafana.com
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://rpm.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
    grafanaをインストールする。(2023/9時点では10.1.1がインストールされる)
[ec2-user@ip-10-0-0-249 bin]$ sudo dnf install grafana
[ec2-user@ip-10-0-0-249 ~]$ grafana-server -v
Version 10.1.1 (commit: 0cfa76b22d, branch: HEAD)

将其服务化

    Grafanaをサービスとして常時起動設定する。
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl enable grafana-server
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl start grafana-server
[ec2-user@ip-10-0-0-124 ~]$ sudo systemctl status grafana-server

确认动作

image.png

4.4 注册Grafana仪表盘

4.4.1 注册 Prometheus

    • Prometheusをデータソースとして登録する。

 

    Home > Connections > Data Sources -> Add data source から、Prometheusを選択する。
image.png
image.png
    Prometheusの登録画面にて、「Prometheus server URL」に、自ホスト「http://localhost:9090」を入力し、「Save & Test」を押して登録する。
image.png
image.png

4.4.2 Loki的注册

    • Lokiをデータソースとして登録する。

 

    Home > Connections > Data Sources -> Add data source から、Lokiを選択する。
image.png
    Lokiの登録画面にて、「URL」に、自ホスト「http://localhost:3100」を入力し、「Save & Test」を押して登録する。
image.png
image.png

4.4.3 将 Node Exporter 提供的信息(CPM / MEM)进行注册和展示。

    • データを表示するためのDashboardを新規作成する。

 

    Home > Dashboards > New dashboard > + Add visualization で新しいDashboardを作成し、data source としてPrometheusを選択する。
image.png
    • パネルの作成画面にて、以下を設定し、Dashboardの名前を付けてSaveする。

Metrics browser(code): 100 – (rate(node_cpu_seconds_total{mode=”idle”}[1m])) * 100
Standard options – Unit: Percent(0-100) ※MiscからPercentを選択可能

image.png
node_cpu_seconds_total 是通过Node Exporter获取的关于CPU使用率的值。通过将idle的值从100中减去来计算使用率,并在面板上以%显示。
    CPU使用率のパネルが登録できたら、次にMEM使用率のパネルを作成する。作成したDashboardsの画面から、「Add Visualization」を選択し、新しいパネルを作成する。
image.png
    • パネルの作成画面にて、以下を設定し、Applyする。

Data source: Prometheus
Metrics browser(code): (node_memory_MemTotal_bytes – node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
Standard options – Unit: Percent(0-100) ※MiscからPercentを選択可能

image.png
node_memory_MemTotal_bytes、node_memory_MemAvailable_bytes 是通过Node Exporter获取的内存使用率相关的值。

4.4.4 通过进程导出器注册和显示(nginx)信息

    • 作成したDashboardsの画面から、「Add Visualization」を選択し、新しいパネルを作成する。

 

    • パネルの作成画面にて、以下を設定し、Applyする。

Metrics browser(code): namedprocess_namegroup_num_procs{groupname=”nginx”}

image.png
namedprocess_namegroup_num_procs 是通过 Process Exporter 获取的进程数的值。正常情况下,nginx 启动了两个进程。

从Promtail(nginx访问日志)中注册并显示信息。

    • 作成したDashboardsの画面から、「Add Visualization」を選択し、新しいパネルを作成する。

 

    • パネルの作成画面にて、以下を設定し、Applyする。

Data source: Loki
Query: {filename=”/var/log/nginx/access.log”}
パネル種別: Logs

image.png
使用Promtail从nginx的accesslog将日志输出到Loki。通过在Grafana中将数据源设为Loki,并指定要显示的文件路径,可以显示文件内容。
    Dashboardにて、作成した4つのパネルを並べ替え、CPU、MEM、nginxのprocess数、nginxのaccess.logが表示されるようにした。
image.png

5. 建议的网站

    • 【Prometheus】Node exporterをざっくり理解

 

    [Loki]Grafana Loki を素振りしたメモ

6. 感受之所在

    Prometheus/Loki/Grafanaがどういう風に連携するのかの基本を確認することができた。AlertManagerなどの追加機能についても続けて確認していきたい。
广告
将在 10 秒后关闭
bannerAds