地方在住IT系ニート

bkds

Grafanaのメモ

はじめに

Grafanaとは、OSSでダッシュボードを作成できるツールです。
様々なデータを取得し、情報をダッシュボードにまとめることができます。

今回は、下記の情報をダッシュボードにまとめてみます。

  • ディスク使用率
  • メモリ使用率
  • CPU使用率
  • WebのStatusごとの件数

サーバの情報を取得するために、PrometheusとExporterを利用します。
PrometheusがExporterにアクセスし、Exporterでメトリクスを取得します。

Webのリクエスト件数は、Nginxのログから取得します。
そのため、PromtailとLokiを利用します。

Exporterのインストール

下記コマンドでnode exporterをダウンロードし、起動します。
exporterはポート9100で起動します。

# node exporterのダウンロード
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-arm64.tar.gz

# 解凍
tar zxvf node_exporter-1.7.0.linux-arm64.tar.gz

# ディレクトリに移動
cd ../node_exporter-1.7.0.linux-arm64/

# portを指定して起動
./node_exporter

Prometheusのインストール

下記コマンドでprometheusをダウンロードし、起動します。
prometheusはポート9090で起動します。

# prometheusのダウンロード
wget https://github.com/prometheus/prometheus/releases/download/v2.49.1/prometheus-2.49.1.linux-arm64.tar.gz

# 解凍
tar zxvf prometheus-2.49.1.linux-arm64.tar.gz

# ディレクトリに移動
cd prometheus-2.49.1.linux-arm64/

# exporterを追加
vim prometheus.yml

# 起動
./prometheus

prometheus.ymlを修正し、node exporterを追加します。

scrape_configs:
  - job_name: "prometheus"
    static_configs:
    # xxx.xxx.xxx.xxxはprometheusのIPアドレスです
      - targets: ["xxx.xxx.xxx.xxx:9090"]
  - job_name: "node"
    static_configs:
    # yyy.yyy.yyy.yyyはexporterのIPアドレスです
      - targets: ["xxx.xxx.xxx.xxx:9100"]

Grafanaのインストール

下記コマンドでgrafanaをインストールし、起動します。
grafanaはポート3000で起動します。

wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor > /etc/apt/keyrings/grafana.gpg

echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | tee /etc/apt/sources.list.d/grafana.list

apt install grafana

ダッシュボードの作成

GrafanaのDashboardsの右上にあるNewボタンから新しいダッシュボードを作成します。

new_dashboard

次に、作成したダッシュボードからAdd Visualizationから新しいパネルを追加します。

Disk容量

disk_query

Data sourceには、prometheusを指定します。
Queryは下記を指定します。

(node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100

node_filesystem_size_bytesは、利用中の容量。node_filesystem_avail_bytesは、利用可能な容量です。

disk_result

上記のQueryでRun queriesを実行するとグラフを確認できます。

CPU容量

Disk容量と同様に下記のQueryで結果が得られます。

avg(rate(node_cpu_seconds_total{mode="idle"}[1m])) * -100 + 100

cpu_result

Memory容量

Disk容量と同様に下記のQueryで結果が得られます。

(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100

memory_result

PromtailとLokiのインストール

Promtailは、Lokiにログを転送するエージェントです。
そして、Lokiがログを保存・処理します。

下記コマンドでLokiとPromtailをインストールし、起動します。

apt install loki promtail

Promtailで送信する対象を/etc/promtail/config.ymlに記載します。

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
- url: http://localhost:3100/loki/api/v1/push

scrape_configs:
- job_name: nginx
  static_configs:
  - targets:
    - localhost
    labels:
      job: nginx
      __path__: /var/log/nginx/*.log
  pipeline_stages:
    - regex:
        expression: '^(?P<ip>.*?) - - \[(?P<date>.*?) (?P<timezone>.*?)\] \"(?P<method>.*?) (?P<path>.*?) (?P<version>.*?)\" (?P<status>.*?) (?P<length>.*?) \"(?P<referrer>.*?)\" \"(?P<user_agent>.*?)\"$'
    - labels:
        ip:
        date:
        timezone:
        method:
        path:
        version:
        status:
        length:
        referrer:
        user_agent:

Lokiの設定は、/etc/loki/config.ymlに記載されています。
どこにログを格納するのか等決定することができます。

auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  instance_addr: 127.0.0.1
  path_prefix: /tmp/loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks
      rules_directory: /tmp/loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

query_range:
  results_cache:
    cache:
      embedded_cache:
        enabled: true
        max_size_mb: 100

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

ruler:
  alertmanager_url: http://localhost:9093

limits_config:
  retention_period: 168h

リクエスト数は、下記のQueryで結果が得られます。

sum(count_over_time({filename="/var/log/nginx/access.log"} | status != "" [$__auto])) by (status)

nginx_status

にほんブログ村 IT技術ブログ IT技術メモへPVアクセスランキング にほんブログ村