AWS上でPrometheus構築(1)

タイトル通りAWS EC2上でPrometheus構築時のメモ
Alertingの設定は(2)で書く

## 前提
とりあえずnode exporter(監視される側)とPrometheus server(監視する側)のみ
また、デフォルトポートはなんかスキャン対象とかなっててもイヤだねえ精神により起動ポートを変更する

監視サーバ/監視対象サーバは同一のVPCに所属し、yumのupdate等、基本的な設定とかそういうのは済んでる前提

また、prometheus本体/node_exporter共に構築時点の最新リリースverなので構築前にバージョン新しくなってないか確認しようね
prometheusのオプションはv1とv2でちと違うらしく、ダッシュの本数が1個から2個になってたり、storage.local.*がなくなってたりするようなので、もしこの2億番煎じくらいの記事を資料として使う場合はそのあたりも気を付けよう

## 監視される側
t2.micro(el7)
プライベートサブネットに浮かぶ
prometheusを載せる予定のインスタンスからの通信を遮断しないようにセキュリティグループを確認しておこう
作業ユーザはroot

こちらはさほど語ることもなし

### node_exporterの設置
```bash
mkdir /opt/prometheus
cd /opt/prometheus
wget https://github.com/prometheus/node_exporter/releases/download/v0.17.0/node_exporter-0.17.0.linux-amd64.tar.gz
tar -zxf node_exporter-0.17.0.linux-amd64.tar.gz
mv node_exporter-0.17.0.linux-amd64 node_exporter
rm -f node_exporter-0.17.0.linux-amd64.tar.gz
```

### node_exporter起動オプションファイルの作成と設置
```bash
mkdir -p /etc/prometheus/node_exporter
vi /etc/prometheus/node_exporter/env_settings
```

```bash:/etc/prometheus/node_exporter/env_settings
OPTIONS="--web.listen-address=:9500"
```

### service登録
```bash
vi /usr/lib/systemd/system/node_exporter.service
```

```bash:/usr/lib/systemd/system/node_exporter.service
[Unit]
# そのまんま、いわゆる説明
Description=PrometheusNodeExporter
# ネットワークを「利用」するサービスなのでネットワーク起動後に立ち上がるようにする
After=network.target
# ユニット起動前に該当パスが存在するか確認してくれる
ConditionPathExists=/opt/prometheus/node_exporter

[Service]
# プロセス起動と同時にサービスがグリーンと判断される 起動に時間がかかるようなモノの場合はnotifyでやるんかな？
Type=simple
# 環境変数設定ファイルフルパス systemdはユーザの環境変数は見ないのでこれで設定する
EnvironmentFile=/etc/prometheus/node_exporter/env_settings
# 実行ファイルフルパスとEnvironmentFileに設定されてる起動オプションが詰まった変数
ExecStart=/opt/prometheus/node_exporter/node_exporter $OPTIONS
# プロセスが異常終了したとき自動で再起動を実施してくれるらしい 監視なんだし再起動させよう
# 万全を考えるなら/var/log/messagesを監視して起動時にエラーループしてないか見るのが良いか？
Restart=always

[Install]
# WantedByはmulti-user.targetの起動と同時に起こしてもらえるようになる設定
# ちなみにec2で `systemctl get-default` 叩くと graphical.targetって出るんで一瞬「えっ！？」となったけどgraphical.targetの中身を見ると納得
# それについてはこの記事の最後の参考記事に載せてるのでそちらで
WantedBy=multi-user.target
```

追加したら確認
`systemctl list-unit-files --type=service | grep node_exporter`
disableって出ればok

### 反映と起動
```bash
systemctl daemon-reload
systemctl enable node_exporter
systemctl start node_exporter
```

終わったらprometheusサーバにする予定のインスタンスから
`curl http://[[監視対象インスタンスプライベートIP]]:9500/metrics`
叩いて、なんかすごい量の文字列が返ってきたらok

## 監視する側
t2.micro(el7)
パブリックサブネットに浮かぶ
作業ユーザはroot
EC2roleにEC2ReadOnlyAccessを持つRoleを割り当てておく
webuiを利用するため、あらかじめセキュリティグループに起動ポート(今回はTCP:9800)のマイIP許可をしたものをアタッチ


### prometheusの設置
```bash
mkdir /opt/prometheus
cd /opt/prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.8.1/prometheus-2.8.1.linux-amd64.tar.gz
tar -zxf prometheus-2.8.1.linux-amd64.tar.gz
mv prometheus-2.8.1.linux-amd64 prometheusserver
rm -f prometheus-2.8.1.linux-amd64.tar.gz
```

### prometheus設定ファイルの作成
```bash
cp /opt/prometheus/prometheusserver/prometheus.yml /opt/prometheus/prometheusserver/prometheus.yml.bk
vi /opt/prometheus/prometheusserver/prometheus.yml
```

```yaml:/opt/prometheus/prometheusserver/prometheus.yml
global:
  scrape_interval:     15s # 各exporterエンドポイントにアクセスするポーリング間隔
  # ruleファイルに基づく評価を実施する間隔 scrapeと別軸になっているあたりDB見に行ってるんだろうなと推測される
  # 設定が15sなら、発動時間の15秒前までのデータ見るとかなんだろうか
  evaluation_interval: 15s

# alertmanager関連の設定 (2)でやる
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# 具体的な評価の仕方と評価結果によって何をするかを記述 alertingやる時にやるので後回し
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# 監視対象設定
# 初回だしシンプルにIPポート指定でいこうと思ったが俺もドヤ顔でｻｰﾋﾞｽﾃﾞｨｽｶﾊﾞﾘｨとか言いたかったのでec2_sd_configsを使うことに
# キーを記述しなきゃいけんような説明が多くて「え、うそやろこんなんでキー発行したくないで」と思い色々探したら
# prometheus serverが乗っかるインスタンスにEC2ReadOnlyが含まれるロールがアタッチされていればいけるっぽい
# relabelに関しては記事の最後にもっと参考になる記事のリンクを置くのでそちらで
scrape_configs:
  - job_name: 'ec2-test'
    ec2_sd_configs:
      - region: '監視したいインスタンスがいるリージョン っていうかこれリージョンまたげるん…？'
        port: 9500
    relabel_configs:
      - source_labels: [__meta_ec2_tag_Service]
        regex: prom_test
        action: keep
      - source_labels: [__meta_ec2_tag_Name]
        target_label: instance
```
書いたらシンタックスチェック
`/opt/prometheus/prometheusserver/promtool check config /opt/prometheus/prometheusserver/prometheus.yml`

### prometheus起動オプションファイルの作成と設置
```bash
mkdir -p /etc/prometheus/prometheusserver
vi /etc/prometheus/prometheusserver/env_settings
```

```bash:/etc/prometheus/prometheusserver/env_settings
OPTIONS="--config.file=/opt/prometheus/prometheusserver/prometheus.yml --storage.tsdb.path=/var/lib/prometheus --storage.tsdb.retention=2d --web.console.libraries=/opt/prometheus/prometheusserver/console_libraries --web.console.templates=/opt/prometheus/prometheusserver/consoles --web.listen-address=:9800"
```
テストだしデータは2dayで吹っ飛ぶように記述

### service登録
```bash
vi /usr/lib/systemd/system/prometheus.service
```

```bash:/usr/lib/systemd/system/prometheus.service
[Unit]
Description=PrometheusServer
After=network.target
ConditionPathExists=/opt/prometheus/prometheusserver

[Service]
Type=simple
EnvironmentFile=/etc/prometheus/prometheusserver/env_settings
ExecStart=/opt/prometheus/prometheusserver/prometheus $OPTIONS
Restart=always

[Install]
WantedBy=multi-user.target
```
ほぼ一緒なので説明省略
確認
`systemctl list-unit-files --type=service | grep prometheus`

### 反映と起動
```bash
systemctl daemon-reload
systemctl enable prometheus
systemctl start prometheus
```

適当にブラウザで
`http://[[監視インスタンスパブリックIP]]:9800/targets`
画面が出て1個インスタンスが見えてればok

画面さえ出ない場合は
`journalctl -u prometheus.service`
とかで起動失敗してないか確認しよう

## 次にやること
Alertの設定と、あとfluentdを別件で利用するのでfluentdのプロセス監視設定入れる

## 参考
https://prometheus.io/docs/prometheus/latest/configuration/configuration/
https://qiita.com/stkhr/items/a847dd3c84146a194f02
https://qiita.com/ledmonster/items/5f2e1633d4124cb978fe
https://qiita.com/loftkun/items/4bd3bd3dcfd5864c1b6d