GrafanaとPrometheus

# VirtualBox 6 
ゲストOS: CentOS Linux release 7.5.1804 (Core)

仮想マシンの [設定] -> [ネットワーク設定]
割り当て: NAT
[高度] -> [ポートフォワーディング]
SSH: TCP 1022 -> 22
Promethus GUI: TCP 19090 -> 9090
Grafana GUI: TCP 13000 -> 3000

# モジュールバージョンとパッケージ
Prometheus: 2.14.0
パッケージ: prometheus-2.14.0.linux-amd64.tar.gz

Node exporter:　0.18.1
パッケージ: node_exporter-0.18.1.linux-amd64.tar.gz

Grafana: 6.4.4 
パッケージ: grafana-6.4.4-1.x86_64.rpm

# CentOSセットアップ
## firewalldでhttp httpsを許可
[Firewall参考](https://s31o3.hatenablog.com/entry/2017/05/01/120831)

```bash
$ systemctl status firewalld  # active (runnig)
$ sudo firewall-cmd --list-all
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

# ポート許可
$ sudo firewall-cmd --permanent --add-port=22/tcp
$ sudo firewall-cmd --permanent --add-port=9090/tcp
$ sudo firewall-cmd --permanent --add-port=9100/tcp
$ sudo firewall-cmd --permanent --add-port=3000/tcp
$ sudo firewall-cmd --list-ports
$ sudo firewall-cmd --reload

$ sudo systemctl stop firewalld  # 以下検証環境
$ sudo systemctl is-enabled firewalld  # enabledになっていたら下記を実施
$ sudo systemctl disable firewalld
$ sudo systemctl is-enabled firewalld
```

# Prometheusインストール
## インストール作業
[公式サイト](https://prometheus.io/docs/introduction/first_steps/)
Owner等は全てroot

```bash
$ cd /tmp
$ curl -LO https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz
$ tar xvzf prometheus-2.14.0.linux-amd64.tar.gz
$ sudo cp -r prometheus-2.14.0.linux-amd64 /etc/prometheus
```

[Prometheus の起動スクリプト設定、ログローテート設定　参考](https://qiita.com/tiida26/items/d251fb42f7f2d8a68374)

```bash
$ sudo /etc/init.d/prometheus start
$ sudo /etc/init.d/prometheus status
$ sudo /etc/init.d/prometheus stop
```

# Prometheusへのアクセス確認
http://localhost:19090/graph
<img width="479" alt="1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428410/09deca85-d1b1-98cd-9a53-c0aea2019b44.jpeg">

# PromQLの実行確認
Expressionと表示されているの枠にクエリを入力してExecuteをクリックして実行。

上がっているサーバを確認
Expression: `up` 
Element: up{instance="localhost:9090",job="prometheus"}
Value: 1

使用中メモリを確認
（基本単位はバイト、秒、など）
Expression: `process_resident_memory_bytes`
Element: process_resident_memory_bytes{instance="localhost:9090",job="prometheus"}
Value: 49057792

# Exporter
使用されているポート一覧：[port allocations](https://github.com/prometheus/prometheus/wiki/Default-port-allocations)

# Node exporterインストール
```bash
$ cd /tmp
$ curl -LO https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
$ tar xvzf node_exporter-0.18.1.linux-amd64.tar.gz
$ sudo cp -r node_exporter-0.18.1.linux-amd64 /etc/node_exporter
```

[Node exporterの起動スクリプト設定、ログローテート設定　参考](https://qiita.com/tiida26/items/d251fb42f7f2d8a68374)

```bash
$ sudo vim /etc/rc.d/init.d/node_exporter  # 起動スクリプト作成
$ sudo chmod +x /etc/rc.d/init.d/node_exporter
$ sudo mkdir /var/log/node_exporter
$ sudo /etc/init.d/node_exporter start  # 起動スクリプトにてスタート
$ sudo /etc/init.d/node_exporter status
$ sudo chkconfig node_exporter on

$ sudo vim /etc/logrotate.d/node_exporter  # ログローテート設定作成

$ sudo vim /etc/prometheus/prometheus.yml  # Prometheus 設定ファイルに追記
$ sudo /etc/prometheus/promtool check config /etc/prometheus/prometheus.yml
Checking /etc/prometheus/prometheus.yml 
  SUCCESS: 0 rule files found
$ sudo /etc/init.d/prometheus reload
```
Prometheusのコンソールから下記を実行&確認
Expression: `node_memory_Cached_bytes` 
Element: node_memory_Cached_bytes{instance="localhost:9100",job="node"}
Value: 996540416


# Grafana インストール & Prometheus と連携
```bash
$ wget https://dl.grafana.com/oss/release/grafana-6.4.4-1.x86_64.rpm
$ sudo yum install initscripts urw-fonts
$ sudo rpm -Uvh grafana-6.4.4-1.x86_64.rpm
$ sudo /etc/init.d/grafana-server start
$ sudo chkconfig grafana-server on
```
http://localhost:13000/ へアクセス
admin/admin でログインし初回パスワード変更を実施

## Datasourceを追加
[Create your first data source] -> [Add data source] -> [Prometheus] -> [Select]
<img width="322" alt="datasource.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428410/b29969d7-4876-cdd3-755c-8b0d78c448e2.jpeg">

[Save & Test]をクリックすると"Data source is working"が表示された。

## Dashboard作成
[Dashboards - Official & community built dashboards](https://grafana.com/grafana/dashboards) からjsonファイルをダウンロードする。
左のプラスマークから[Import] -> [Upload .json file]を選択してアップロードする。
<img width="957" alt="dashboard.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428410/92a0ea64-2d9e-24d3-8b3a-a89f8d9449ee.jpeg">


## Environment file
```bash
$ cat /etc/sysconfig/grafana-server
GRAFANA_USER=grafana

GRAFANA_GROUP=grafana

GRAFANA_HOME=/usr/share/grafana

LOG_DIR=/var/log/grafana

DATA_DIR=/var/lib/grafana

MAX_OPEN_FILES=10000

CONF_DIR=/etc/grafana

CONF_FILE=/etc/grafana/grafana.ini

RESTART_ON_UPGRADE=true

PLUGINS_DIR=/var/lib/grafana/plugins

PROVISIONING_CFG_DIR=/etc/grafana/provisioning

# Only used on systemd systems
PID_FILE_DIR=/var/run/grafana
```

## Configuration
/etc/grafana/grafana.ini

# PromQL
以下、node_exporterを入れたサーバ(localhost:9100)に関する受信(bytes)の出力結果。

`node_network_receive_bytes_total`
アウトプット例：

|Element|Value|
|-----|-----|
|node_network_receive_bytes_total{device="enp0s3",instance="localhost:9100",job="node"}|54247|
|node_network_receive_bytes_total{device="lo",instance="localhost:9100",job="node"}|354136|
|node_network_receive_bytes_total{device="virbr0",instance="localhost:9100",job="node"}|0|
|node_network_receive_bytes_total{device="virbr0-nic",instance="localhost:9100",job="node"}|0|

## ラベルの正規表現例
virbrがつくdevice情報をすべて出力
`node_network_receive_bytes_total{device=~"virbr.+"}`

deviceがvirbr0 or virbr0-nicのものを出力
`node_network_receive_bytes_total{device=~"virbr0|virbr0-nic"}`

## metricの正規表現
node_network_receive_bytes_totalとnode_network_transmit_bytes_totalの両方をクエリする。
`{__name__=~"node_network_(receive|transmit)_bytes_total"}`

## rate() 指定時間毎の値
* counterのみに使用すること。

node_network_receive_bytes_totalのように時間に比例してデータが蓄積されていくため、時間毎のデータを出力したい場合に使用。

10分毎の値
`rate(node_network_receive_bytes_total[10m])`

## ランキング
上位5個のデータを返す。
`topk(5, max_over_time(node_network_receive_bytes_total[30m]))`  

## 演算子
下記のような演算子も記述可能。
`rate(node_network_transmit_bytes_total[10m])+ 1000 / 10 * 20 - 5 ^ 2 % 2`

## 比較演算子
`==`、`!=`、`>`、`>=`、`<`、`<=`が使用可能。
`rate(node_network_receive_bytes_total[10m]) !=0`
`rate(node_network_receive_bytes_total[10m]) <= 1000`

## グルーピング
instance="localhost:9100"のものをグループして合計値を取得する。
`sum(node_network_receive_bytes_total) by (instance)`
`sum(rate(node_network_receive_bytes_total[5m])) by (instance)`

## ゲージ
* 決まった範囲の値が上下するメモリなどに使う。

`max_over_time`、`min_over_time`、`avg_over_time` functions.
`max_over_time(node_memory_MemFree_bytes[5m])`

# 参考にさせて頂いたサイト
* https://qiita.com/tiida26/items/d251fb42f7f2d8a68374
* https://medium.com/@valyala/promql-tutorial-for-beginners-9ab455142085