はじめに
社内でも監視ツールのコスト見直しによりOSSを使った監視ツールの検討・導入が進んでいるため、まずは検証環境で実際に構築して、個人の理解を深めることを目的としています。
やりたいこと
監視サーバ(Grafanaのダッシュボード)から監視対象サーバの下記メトリクス、ログを可視化する。
- CPU使用率
- メモリ使用率
- sshdプロセスの死活監視
- /var/log/messagesのログ
- /var/log/crondのログ
概要図
成果物
今回の検証で下図のようにGrafanaでログ、メトリクスのダッシュボードを作成し可視化ができました。
用語の確認
監視の三本柱
ログ
- サービスやアプリケーションから吐き出される特定のコードブロックが実行されたときにシステムが生成する単なるテキスト行
メトリクス
- 定期的にグループ化または収集された測定値の集合。特定の期間のデータの集合
トレース
- マイクロサービスエコシステムの異なるコンポーネント間のイベント(またはトランザクション)の因果連鎖のサンプル。命令の実行を順番にたどって各段階の状態・状況を確認する作業をトレースという。
参考
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
[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
node exporterのAPIを叩いてみる
curl localhost:9100/metrics
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
に下記スクリプトを記載する
# 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:
- .+
起動スクリプト作成
[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
process exporterのAPIを叩いてみる
curl localhost:9256/metrics
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のログを収集するように設定
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
起動スクリプト作成
[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
ローカルからpromtailにAPIを叩いてみる
curl localhost:9080/targets
ブラウザからhttp://[グローバルIP]:9080/targets
にアクセスしPromtailが正常に表示されるか確認
※セキュリティグループで9080番ポートを空けること
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
# 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の内容は以下
[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番ポートを開けること)
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/
[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
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番ポートを開けること)
Standard optionsをPercent(0-100)に指定
promethusを起動したままsave&testを押さないと下記エラーがでるため、Prometheusのプロセスを起動していることを確認し、Save & testを押下する
ダッシュボードの設定
CPU使用率
メトリクスの取得
メニュー>Exploreを選択
データソース:Prometheus
Metric: node_cpu_seconds_total
Label filters: mode !~ idle
Rate: Range 1m
Standard optionsをPercent(0-100)に指定
ダッシュボードに追加
Add to dashboardでTargetのダッシュボードを選択し追加
「...」からEditを選択し、Titleを任意の名前とStandard optionsをUnitを「Percet(0-100)」に変更し、保存
メモリ使用率
メトリクスの取得
メニュー>Exploreを選択
右上のモード切替から「Code」を選択
Metrics browser > :
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
下記、記事を参考にメモリ負荷テストをしてみると動きがわかりやすいです。
https://qiita.com/keita0322/items/8fba88debe66fa8d2b39
ダッシュボードに追加
Add to dashboardでTargetのダッシュボードを選択し追加
Standard optionsをPercent(0-100)に指定
「...」からEditを選択し、Titleを任意の名前とStandard optionsをUnitを「Percet(0-100)」に変更し、保存
sshdプロセスの死活監視
メニュー>Exploreを選択
データソース:Prometheus
Metric: nodeprocess_namegroup_num_procs
Label filters: groupname =~ .*sshd.*
ダッシュボードに追加
Add to dashboardでTargetのダッシュボードを選択し追加
「...」からEditを選択し、Titleを任意の名前を変更し、保存
/var/log/messagesのログ
データソース:Prometheus
Label filters: filename = /var/log/messages
ダッシュボードに追加
Add to dashboardでTargetのダッシュボードを選択し追加
「...」からEditを選択し、Titleを任意の名前を変更し、保存
/var/log/crondのログ
データソース:Prometheus
Label filters: filename = /var/log/crond
ダッシュボードに追加
Add to dashboardでTargetのダッシュボードを選択し追加
「...」からEditを選択し、Titleを任意の名前を変更し、保存
ダッシュボードの微調整
感想
今回初めて、監視基盤の構築を行いましたが、公式ドキュメントや他記事を参考になんとかダッシュボードの表示までできて良かったです。
Grafanaの操作は直感的であまり調べなくても、ポチポチして設定できるのが楽しかったです!
今後は、アラート連携なども検証して、社内の基盤に導入していきたいです。
最後まで閲覧いただきありがとうございました!