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

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

# やりたいこと
監視サーバ（Grafanaのダッシュボード）から監視対象サーバの下記メトリクス、ログを可視化する。
- CPU使用率
- メモリ使用率
- sshdプロセスの死活監視
- /var/log/messagesのログ
- /var/log/crondのログ

---

## 概要図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/aed6df81-ac5a-e3d8-59b4-c93bd0285358.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/75619267-3c78-4cef-b721-5f083a8e1455.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<br>・Process Exporter<br>・Promtail
|監視サーバ|172.16.10.106|t2.large|・Grafana<br>・Loki<br>・Prometheus

    
# 設定手順
## はじめに
管理が煩雑になるのを防ぐため、下記ディレクトリ構成でソースのダウンロードや配置を行う。
```shell
# ソースのダウンロード用ディレクトリ
# 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
```shell
# ソースダウンロード用ディレクトリの作成
$ 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
```
起動スクリプト作成

```shell
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
```

起動・動作確認
```shell
# デーモンのリロード
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable prometheus-node-exporter.service
# 起動
$ systemctl start prometheus-node-exporter.service
# ステータス確認
$ systemctl status prometheus-node-exporter.service
```
下図のようにactiveになっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/950d9902-3044-f001-5679-740c2fbe7620.png)

node exporterのAPIを叩いてみる
```shell
curl localhost:9100/metrics
```
下図のように値が返ってきたらOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/c6b9bbd0-ddb8-6bc5-7d71-db1c42478b81.png)

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

```shell
# ソースダウンロード用ディレクトリの作成
$ 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
```

起動・動作確認
```shell
# デーモンのリロード
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable process-exporter.service
# 起動
$ systemctl start process-exporter.service
# ステータス確認
$ systemctl status process-exporter.service
```
下図のようにactiveになっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/ad5e4546-772f-01f9-482d-fb787616d0b2.png)

process exporterのAPIを叩いてみる
```shell
curl localhost:9256/metrics
```
下図のように値が返ってきたらOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/1f3b05c5-465f-c38f-ee22-5d3f391c0d37.png)


### promtailインストール
```shell
# ソースダウンロード用ディレクトリの作成
$ 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のダウンロード
```shell
# コンフィグ格納用ディレクトリの作成
$ 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のログを収集するように設定
```yaml:/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
```


起動スクリプト作成
```config:/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
```

起動・動作確認
```shell
# デーモンの再起動
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable promtail.service
# 起動
$ systemctl start promtail.service
# ステータス確認
$ systemctl status promtail.service
```
下図のようにactiveになっていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/5a1b127a-949e-5ffe-258b-6df360fabe84.png)

ローカルからpromtailにAPIを叩いてみる
```shell
curl localhost:9080/targets
```
下図のように値が返ってきたらOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/b8182af7-a5ec-2a86-86e0-eb7ed3fc8da5.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/e796fc43-4f90-1fbb-f38e-97288f18f1fb.png)

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


## 監視サーバ
下記の3つのツールのインストールを行う
- Prometheus
- Loki
- Grafana

### Prometheusのインストール
```shell
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
```

```yaml:/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
```

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


ブラウザから[IP]:9090でアクセスすると下記画面が表示される（セキュリティグループで9090番ポートを開けること）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/91f8dc29-b67e-2dde-2d04-72268180fcaf.png)

### Lokiのインストール
```shell
$ 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
```

起動・動作確認
```shell
# デーモンのリロード
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable loki.service
# 起動
$ systemctl start loki.service
```


- 実行完了後、ブラウザから[IP]:3100/metricsにアクセスすると下記画面が表示されることを確認（セキュリティグループで3100番ポートを開けること）
- 実行後はずらずら情報が出力されるが10分ほど待っても終わらなかったためctrl+cで強制終了した。
- プロセスも立ち上がっており、ブラウザからもアクセスが確認できたためとりあえずよさそう
#### プロセス確認
```shell
ps -ax | grep loki
```
![スクリーンショット 2023-07-23 15.04.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/73b6c709-08de-8702-ed08-a1bb688a4cbe.png)


![スクリーンショット 2023-07-23 14.56.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/1681c00d-0706-b73b-006e-3aad55c5f7ab.png)

### Grafanaインストール

```yaml
# 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
```

```shell
# Grafanaインストール、起動
 yum install grafana
 systemctl start grafana-server
```

ブラウザから[IP]:3000でアクセスできることを確認（セキュリティグループで3000番ポートを開けること）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/578b385c-0e6c-00e9-8eee-6ef8de12b22b.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/a8c523e4-d789-d6b0-e659-5b740c42fd5d.png)

Standard optionsをPercent（0-100）に指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/dab35aba-b292-c230-73a3-98f002f6c930.png)
promethusを起動したままsave&testを押さないと下記エラーがでるため、Prometheusのプロセスを起動していることを確認し、Save & testを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/e669dc3c-814b-5310-1b95-c54972d5de98.png)




## ダッシュボードの設定
### CPU使用率
#### メトリクスの取得
メニュー>Exploreを選択

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

Standard optionsをPercent（0-100）に指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/12cf5eb5-27dc-8273-fc88-eaa534bbed47.png)

Exproler画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/2d48d7b3-c945-b3ba-6b88-2d37c51e9a20.png)





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

「...」からEditを選択し、Titleを任意の名前とStandard optionsをUnitを「Percet（0-100）」に変更し、保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/2b9d1490-99e8-cdc7-9c6c-2dd9920ffa7b.png)

ダッシュボード画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/3e44426b-6d94-d7d3-3d7d-e44decebc3bd.png)


### メモリ使用率
#### メトリクスの取得
メニュー>Exploreを選択

右上のモード切替から「Code」を選択
Metrics browser > : 
```
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/3abf0eae-f57d-9ad1-166f-b802b6e0b8df.png)


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

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

Standard optionsをPercent（0-100）に指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/12cf5eb5-27dc-8273-fc88-eaa534bbed47.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/b28a3fdf-795c-18a5-ca28-0cc2f7ff2edc.png)

ダッシュボード画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/3156bf44-f394-dd35-01dd-7e7ac7f2c3db.png)

### sshdプロセスの死活監視
メニュー>Exploreを選択

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/d2f89724-f7e3-6d53-0649-bea87111bb9f.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/d7461c08-1db7-d327-a2f1-2a0fa3e16d98.png)

ダッシュボード画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/da12c117-3443-76d3-ebc5-5958a234aa71.png)

### /var/log/messagesのログ
データソース：`Prometheus`
Label filters: `filename = /var/log/messages`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/7e7616db-3dda-56ec-5597-fbd5b8832508.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/31daaab8-a58f-2f44-9628-d7905f88146e.png)

ダッシュボード画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/431dc43a-0433-31d1-c940-bf3d979c1b8f.png)

### /var/log/crondのログ
データソース：`Prometheus`
Label filters: `filename = /var/log/crond`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/40fe2e55-47a3-d256-ef15-ce1c32937127.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/e83c0d11-633e-5a42-5d13-d19d3f7448dc.png)


ダッシュボード画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/e90e5769-0d6c-e3c9-bfea-446d6c07853b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/431dc43a-0433-31d1-c940-bf3d979c1b8f.png)

### ダッシュボードの微調整
見栄えをよく配置して完了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869300/bbacf551-915e-e172-6148-5973161740f5.png)


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

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