LoginSignup
15
17

Prometheus/Loki/Grafanaを使ってメトリクス、ログを監視してみる

Last updated at Posted at 2023-07-26

はじめに

社内でも監視ツールのコスト見直しによりOSSを使った監視ツールの検討・導入が進んでいるため、まずは検証環境で実際に構築して、個人の理解を深めることを目的としています。

やりたいこと

監視サーバ(Grafanaのダッシュボード)から監視対象サーバの下記メトリクス、ログを可視化する。

  • CPU使用率
  • メモリ使用率
  • sshdプロセスの死活監視
  • /var/log/messagesのログ
  • /var/log/crondのログ

概要図

image.png


成果物

今回の検証で下図のようにGrafanaでログ、メトリクスのダッシュボードを作成し可視化ができました。

image.png


用語の確認

監視の三本柱

ログ

  • サービスやアプリケーションから吐き出される特定のコードブロックが実行されたときにシステムが生成する単なるテキスト行

メトリクス

  • 定期的にグループ化または収集された測定値の集合。特定の期間のデータの集合

トレース

  • マイクロサービスエコシステムの異なるコンポーネント間のイベント(またはトランザクション)の因果連鎖のサンプル。命令の実行を順番にたどって各段階の状態・状況を確認する作業をトレースという。

参考
https://newrelic.com/jp/blog/how-to-relic/metrics-events-logs-and-traces
https://e-words.jp/w/%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9.html

ツール

Prometheus

  • サービスやアプリケーションのメトリクスを収集し、可視化することができるツール

Loki

  • ログ収集およびクエリシステム

Grafana

  • データの可視化ツール

Node Exporter

  • メトリクスを収集するためのツール
  • 転送はpull型で監視サーバ側の設定でprometheusから被監視サーバのNoe Exporterの情報を取得する設定を入れる

Process Exporter

  • プロセスの状態を収集するためのツール
  • 転送はpull型で監視サーバ側の設定でprometheusから被監視サーバのProcess Exporterの情報を取得する設定を入れる

Promtail

  • ログを転送するツール
  • 転送はpush型で被監視サーバから監視サーバに向けてログを転送する設定をいれる

構成

監視サーバ、被監視サーバは下記構成で作成します。

用途 IP インスタンス情報 導入ツール
被監視サーバ 172.16.10.125 t2.small ・Node Exporter
・Process Exporter
・Promtail
監視サーバ 172.16.10.106 t2.large ・Grafana
・Loki
・Prometheus

設定手順

はじめに

管理が煩雑になるのを防ぐため、下記ディレクトリ構成でソースのダウンロードや配置を行う。

# ソースのダウンロード用ディレクトリ
# e.g. /usr/local/src/prometheus
/usr/local/src/[ツール名]

# バイナリの配置先
/usr/bin

# コンフィグの格納用ディレクトリ
# e.g. /etc/prometheus
/etc/[ツール名]

被監視サーバ設定

被監視サーバ(172.16.10.125)で下記3つの設定を行う。

  • node exporter
  • process exporter
  • promtail

node exporterのインストール

下記から最新のバージョンをインストールする
https://github.com/prometheus/node_exporter/releases

# ソースダウンロード用ディレクトリの作成
$ mkdir /usr/local/src/prometheus
# ソースダウンロード用ディレクトリに移動
$ cd /usr/local/src/prometheus
# ソースの圧縮ファイルをダウンロード
$ wget https://github.com/prometheus/node_exporter/releases/download/v0.16.0/node_exporter-0.16.0.linux-amd64.tar.gz
# 圧縮ファイルの解凍
$ tar zxvf node_exporter-0.16.0.linux-amd64.tar.gz
# /usr/binに格納
$ cp -r node_exporter-0.16.0.linux-amd64 /usr/bin

起動スクリプト作成

vi /usr/lib/systemd/system/prometheus-node-exporter.service
/usr/lib/systemd/system/prometheus-node-exporter.service
[Unit]
Description=Node Exporter
Documentation=https://github.com/prometheus/node_exporter

[Service]
Type=simple
ExecStart=/usr/bin/prometheus/node_exporter/node_exporter $OPTIONS
Restart=always

[Install]
WantedBy=multi-user.target

起動・動作確認

# デーモンのリロード
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable prometheus-node-exporter.service
# 起動
$ systemctl start prometheus-node-exporter.service
# ステータス確認
$ systemctl status prometheus-node-exporter.service

下図のようにactiveになっていることを確認
image.png

node exporterのAPIを叩いてみる

curl localhost:9100/metrics

下図のように値が返ってきたらOK
image.png

process exporterのインストール

下記から最新のバージョンをインストールする
https://github.com/ncabatoff/process-exporter/releases/tag/v0.7.10/process-exporter-0.7.10.linux-386.tar.gz

# ソースダウンロード用ディレクトリの作成
$ mkdir /usr/local/src/process-exporter
# ソースダウンロード用ディレクトリに移動
$ cd /usr/local/src/process-exporter
# ソースの圧縮ファイルをダウンロード
$ wget https://github.com/ncabatoff/process-exporter/releases/download/v0.7.10/process-exporter-0.7.10.linux-amd64.tar.gz
# 圧縮ファイルの解凍
$ tar zxvf process-exporter-0.7.10.linux-amd64.tar.gz
# process exporter本体を自動起動するソース配下へコピー
$ cp -r /usr/local/src/process-exporter /usr/bin

# process exporter設定ファイルの配置
## コンフィグの格納用ディレクトリ作成
$ mkdir /etc/process-exporter
## コンフィグの作成
$ vi /etc/process-exporter/process-exporterconfig.yml

/etc/process-exporter/process-exporterconfig.ymlに下記スクリプトを記載する

/etc/process-exporter/config.yml
# comm is the second field of /proc/<pid>/stat minus parens.
# It is the base executable name, truncated at 15 chars.  
# It cannot be modified by the program, unlike exe.
process_names:
  - cmdline:
    - .+

起動スクリプト作成

/usr/lib/systemd/system/process-exporter.service
[Unit]
Description=Process Exporter
Documentation=https://github.com/ncabatoff/process-exporter

[Service]
Type=simple
ExecStart=/usr/bin/process-exporter \
  -config.path /etc/process-exporter/config.yml

[Install]
WantedBy=multi-user.target

起動・動作確認

# デーモンのリロード
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable process-exporter.service
# 起動
$ systemctl start process-exporter.service
# ステータス確認
$ systemctl status process-exporter.service

下図のようにactiveになっていることを確認
image.png

process exporterのAPIを叩いてみる

curl localhost:9256/metrics

下図のように値が返ってきたらOK
image.png

promtailインストール

# ソースダウンロード用ディレクトリの作成
$ mkdir /usr/local/src/promtail
# ソースダウンロード用ディレクトリに移動
$ cd /usr/local/src/promtail
$ ソースの圧縮ファイルをダウンロード
$ curl -O -L "https://github.com/grafana/loki/releases/download/v2.4.1/promtail-linux-amd64.zip"
# 圧縮ファイルの解凍
$ unzip "promtail-linux-amd64.zip"
# 実行権限を付与
$ chmod a+x "promtail-linux-amd64.zip"
# /usr/binにコピー
$ cp -r /usr/local/src/promtail/promtail-linux-amd64 /usr/bin

configのダウンロード

# コンフィグ格納用ディレクトリの作成
$ mkdir /etc/promtail
# コンフィグ格納用ディレクトリに移動
$ cd /etc/promtail
# コンフィグのダウンロード
$ wget https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml

コンフィグの修正

  • localhostから監視サーバへ送信先を変更
  • /var/log/messagesと/var/log/crondのログを収集するように設定
/etc/promtail/promtail-local-config.yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yam

clients:
  - url: http://172.16.10.106:3100/loki/api/v1/push
scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: varlogs
      __path__: /var/log/messages

- job_name: cron
  static_configs:
  - targets:
      - localhost
    labels:
      job: cronlogs
      __path__: /var/log/cron

起動スクリプト作成

/usr/lib/systemd/system/promtail.service
[Unit]
Description=Promtail
Documentation=https://github.com/grafana/loki/releases/

[Service]
Type=simple
ExecStart=/usr/bin/promtail-linux-amd64 \
  --config.file=/etc/promtail/promtail-local-config.yaml

[Install]
WantedBy=multi-user.target

起動・動作確認

# デーモンの再起動
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable promtail.service
# 起動
$ systemctl start promtail.service
# ステータス確認
$ systemctl status promtail.service

下図のようにactiveになっていればOK
image.png

ローカルからpromtailにAPIを叩いてみる

curl localhost:9080/targets

下図のように値が返ってきたらOK
image.png

ブラウザからhttp://[グローバルIP]:9080/targetsにアクセスしPromtailが正常に表示されるか確認
※セキュリティグループで9080番ポートを空けること

image.png

Amazon Linux 2023でつまづいた点

  • 今回、/var/log/messagesと/var/log/cronのログを連携したいが、amazon linux 2023にはrsyslogとchronyが標準で入っていないため、別途入れる必要があった。
    cronieインストール
$ dnf -y install cronie
# /var/log/cronのファイルを生成する
$ crontab -e

rsyslogのインストール

$ yum install -y rsyslog
$ systemctl enable rsyslog.service
$ systemctl start rsyslog.service

監視サーバ

下記の3つのツールのインストールを行う

  • Prometheus
  • Loki
  • Grafana

Prometheusのインストール

wget https://github.com/prometheus/prometheus/releases/download/v2.25.2/prometheus-2.25.2.linux-amd64.tar.gz
tar zxvf prometheus-2.25.2.linux-amd64.tar.gz
cd prometheus-2.25.2.linux-amd64
./prometheus

#prometheus本体を自動起動するソース配下へコピー
cp -r ./prometheus /usr/bin

#prometheus設定ファイルの配置
mkdir /etc/prometheus
cd /etc/prometheus

## wget https://raw.githubusercontent.com/prometheus/prometheus/master/documentation/examples/prometheus.yml
/etc/prometheus/prometheus.yml
# 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: ["172.16.10.125:9100"]
  - job_name: 'process-exporter'
    static_configs:
      - targets: ["172.16.10.125:9256"]

#自動起動のためのprometheus.serviceの内容は以下

/usr/lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus - Monitoring system and time series database
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \

[Install]
WantedBy=multi-user.target

起動・動作確認

# デーモンのリロード
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable prometheus.service
# 起動
$ systemctl start prometheus.service

ブラウザから[IP]:9090でアクセスすると下記画面が表示される(セキュリティグループで9090番ポートを開けること)
image.png

Lokiのインストール

$ mkdir /usr/local/src/loki
$ cd /usr/loca/src/loki
$ curl -O -L "https://github.com/grafana/loki/releases/download/v2.8.3/loki-linux-amd64.zip"
$ unzip "loki-linux-amd64.zip"
$ chmod a+x "loki-linux-amd64"
$ cp -r loki-linux-amd64 /usr/bin
$ mkdir /etc/loki
$ cd /etc/loki
$ wget https://raw.githubusercontent.com/grafana/loki/main/cmd/loki/loki-local-config.yaml
$ ./loki-linux-amd64 -config.file=/etc/loki/loki-local-config.yaml

参考:https://github.com/grafana/loki/releases/

/usr/lib/systemd/system/process-exporter.service
[Unit]
Description=Loki
Documentation=https://github.com/grafana/loki/releases/

[Service]
Type=simple
ExecStart=/usr/bin/loki-linux-amd64 \
  -config.file=/etc/loki/loki-local-config.yaml

[Install]
WantedBy=multi-user.target

起動・動作確認

# デーモンのリロード
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable loki.service
# 起動
$ systemctl start loki.service
  • 実行完了後、ブラウザから[IP]:3100/metricsにアクセスすると下記画面が表示されることを確認(セキュリティグループで3100番ポートを開けること)
  • 実行後はずらずら情報が出力されるが10分ほど待っても終わらなかったためctrl+cで強制終了した。
  • プロセスも立ち上がっており、ブラウザからもアクセスが確認できたためとりあえずよさそう

プロセス確認

ps -ax | grep loki

スクリーンショット 2023-07-23 15.04.14.png

スクリーンショット 2023-07-23 14.56.31.png

Grafanaインストール

# Grafanaリポジトリを追加
[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
# Grafanaインストール、起動
 yum install grafana
 systemctl start grafana-server

ブラウザから[IP]:3000でアクセスできることを確認(セキュリティグループで3000番ポートを開けること)
image.png

image.png

Standard optionsをPercent(0-100)に指定
image.png
promethusを起動したままsave&testを押さないと下記エラーがでるため、Prometheusのプロセスを起動していることを確認し、Save & testを押下する
image.png

ダッシュボードの設定

CPU使用率

メトリクスの取得

メニュー>Exploreを選択

データソース:Prometheus
Metric: node_cpu_seconds_total
Label filters: mode !~ idle
Rate: Range 1m

Standard optionsをPercent(0-100)に指定
image.png

Exproler画面
image.png

ダッシュボードに追加

Add to dashboardでTargetのダッシュボードを選択し追加

「...」からEditを選択し、Titleを任意の名前とStandard optionsをUnitを「Percet(0-100)」に変更し、保存
image.png

ダッシュボード画面
image.png

メモリ使用率

メトリクスの取得

メニュー>Exploreを選択

右上のモード切替から「Code」を選択
Metrics browser > :

(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100

image.png

下記、記事を参考にメモリ負荷テストをしてみると動きがわかりやすいです。
https://qiita.com/keita0322/items/8fba88debe66fa8d2b39

ダッシュボードに追加

Add to dashboardでTargetのダッシュボードを選択し追加

Standard optionsをPercent(0-100)に指定
image.png

「...」からEditを選択し、Titleを任意の名前とStandard optionsをUnitを「Percet(0-100)」に変更し、保存

image.png

ダッシュボード画面
image.png

sshdプロセスの死活監視

メニュー>Exploreを選択

データソース:Prometheus
Metric: nodeprocess_namegroup_num_procs
Label filters: groupname =~ .*sshd.*

image.png

ダッシュボードに追加

Add to dashboardでTargetのダッシュボードを選択し追加
「...」からEditを選択し、Titleを任意の名前を変更し、保存

image.png

ダッシュボード画面
image.png

/var/log/messagesのログ

データソース:Prometheus
Label filters: filename = /var/log/messages

image.png

ダッシュボードに追加

Add to dashboardでTargetのダッシュボードを選択し追加
「...」からEditを選択し、Titleを任意の名前を変更し、保存

image.png

ダッシュボード画面
image.png

/var/log/crondのログ

データソース:Prometheus
Label filters: filename = /var/log/crond

image.png

ダッシュボードに追加

Add to dashboardでTargetのダッシュボードを選択し追加
「...」からEditを選択し、Titleを任意の名前を変更し、保存

image.png

ダッシュボード画面
image.png
image.png

ダッシュボードの微調整

見栄えをよく配置して完了!
image.png

感想

今回初めて、監視基盤の構築を行いましたが、公式ドキュメントや他記事を参考になんとかダッシュボードの表示までできて良かったです。
Grafanaの操作は直感的であまり調べなくても、ポチポチして設定できるのが楽しかったです!
今後は、アラート連携なども検証して、社内の基盤に導入していきたいです。

最後まで閲覧いただきありがとうございました!

15
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
17