Ubuntu 18.04にPrometheusを導入してWebサーバー(nginx)の死活監視をしてみる

# Prometheusとは？

次世代監視ツールの大本命と呼ばれています。

Datadogっぽく使えるらしく、仕事でDatadogを使っているのでこれは良いと感じ導入することにしました。

## 参考文献

[10分で理解する Prometheus](https://qiita.com/Chanmoro/items/ac0eb1bf93760566b338)
同僚Chanmoro氏の分かりやすい記事です。
[nginx-prometheus-exporterをインストールする](https://scrapbox.io/gosyujin/nginx-prometheus-exporter%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)

## Prometheusのインストール＆起動

まず監視する側である、Prometheus本体を導入します。

Ubuntuの場合はaptやsnapのパッケージも存在しますが若干古めなので、公式のGetting Startedの手順通りにバイナリをインストールします。
https://prometheus.io/docs/prometheus/latest/getting_started/

まずこちらから最新のバイナリをダウンロードして設置します。
https://prometheus.io/download/

Linuxの場合は、たいたい`Operating system`が`Linux`、`Architecture`は`amd64`だと思います。

```sh
wget https://github.com/prometheus/prometheus/releases/download/v2.20.1/prometheus-2.20.1.linux-amd64.tar.gz
tar xf prometheus-2.20.1.linux-amd64.tar.gz
mv prometheus-2.20.1.linux-amd64 prometheus
rm prometheus-2.20.1.linux-amd64.tar.gz 
```

起動してみます。

```sh
cd prometheus
./prometheus
```

ブラウザでサーバーのポート9090を開くと管理画面の確認ができます。

![Screenshot from 2020-08-09 09-48-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32030/84117214-cc01-0cf8-93b6-1152a6959d21.png)

## nginx-prometheus-exporterの導入

次に監視される側にexporterを導入します。今回はnginxの死活監視をしたいので、公式が出している[nginx-prometheus-exporter](https://github.com/nginxinc/nginx-prometheus-exporter)をインストールします。

### ngx_http_stub_status_moduleの有効化

まず最初に、nginxが標準で提供している、[ngx_http_stub_status_module](http://nginx.org/en/docs/http/ngx_http_stub_status_module.html#stub_status)を有効化します。これはnginxの基本的なステータス情報を返すモジュールです。

モジュールが入っているか、一応確認してみます。

```sh
$ 2>&1 nginx -V | tr -- - '\n' | grep stub
http_stub_status_module 
```

入っていました。aptでnginxを導入した場合は入っていると思います。

`/etc/nginx/sites-enabled/default`に以下を追加して有効化します。

```sh
server {
  location /stub_status {
    stub_status on;
  }
}
```

nginxをリロードし、curlでURLを叩いて以下のようなステータスが返ってくれば成功です。

```sh
$ curl localhost/stub_status
Active connections: 2 
server accepts handled requests
 39 39 110 
Reading: 0 Writing: 2 Waiting: 0
```

### nginx-prometheus-exporterのインストールと起動

次に、`nginx-prometheus-exporter`をインストールします。公式を見るとdockerイメージもあるようですが、今回はバイナリで導入してみます。

```sh
wget https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v0.8.0/nginx-prometheus-exporter-0.8.0-linux-amd64.tar.gz
tar xf nginx-prometheus-exporter-0.8.0-linux-amd64.tar.gz 
rm nginx-prometheus-exporter-0.8.0-linux-amd64.tar.gz 
```

`nginx-prometheus-exporter`というバイナリファイルのみが展開されました。

次に、先程のstub URLに接続して起動します。`-nginx.scrape-uri`オプションでstub URLを指定します。

```sh
$ ./nginx-prometheus-exporter -nginx.scrape-uri http://localhost/stub_status

2020/08/09 10:59:10 Starting NGINX Prometheus Exporter Version=0.8.0 GitCommit=de15093
2020/08/09 10:59:10 Listening on :9113
2020/08/09 10:59:10 NGINX Prometheus Exporter has successfully started
```

9113番ポートで起動するようです。

## Prometheusの監視対象にnginxを追加する

Prometheusを導入したディレクトリの`prometheus.yml`の末尾あたりに以下を追記します。

```yaml
  - job_name: nginx
    metrics_path: '/metrics'
    scheme: http

    static_configs:
      - targets: [
        'ホスト:9113'
      ]
```

Prometheusを再起動するとnginxが監視対象として追加されます。

とりあえず`nginx_http_requests_total`を見てみます。

![Screenshot from 2020-08-09 11-21-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32030/ea16284a-b82c-4b9d-510a-1777d89f6b7a.png)

ちゃんと動いているっぽいですね。

死活監視なら`nginx_up`を見れば大丈夫かと思います。

## 終わりに

今回はここまでです。

今後は以下のようなことをやろうと思っています。

- Prometheus本体とnginx-prometheus-exporterのサービス化
- Prometheus本体には認証機構がないのでプロキシサーバーで認証する
- [exporter_proxy](https://github.com/rrreeeyyy/exporter_proxy)を使ってexporterのポートを一元化する
- [Grafana](https://grafana.com/)でダッシュボードを作る
- アラートを飛ばす