はじめに
Prometheusで使うPromQLのand/or/unlessについて紹介していきます。
論理演算子(and/or/unless)
PromQLで使える論理演算子は下記の3種類になります。
演算子 | 式 | 結果 |
---|---|---|
and (積集合) | vector1 and vector2 | vector1の要素のうちvector2にもある要素 |
or (和集合) | vector1 or vector2 | vector1の要素とvector1にないvector2の要素 |
unless (差集合) | vector1 unless vector2 | vector1の要素からvector2の要素が削除された要素 |
試してみる
Docker ComposeでPrometheusを起動し、それぞれの演算子を試してみます。
Docker Composeで起動するのに必要なdocker-compose.yml
とprometheus.yml
は下記の通りです。
version: '3'
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- '9090:9090'
node-exporter:
image: quay.io/prometheus/node-exporter
ports:
- 9100:9100
volumes:
- ./proc:/host/proc
- ./sys:/host/sys
- ./rootfs:/rootfs
global:
scrape_interval: 15s
external_labels:
monitor: 'codelab-monitor'
scrape_configs:
- job_name: 'node'
scrape_interval: 5s
static_configs:
- targets: ['<PCのIPアドレス>:9100']
docker-compose.yml
とprometheus.yml
を作成したら、Docker Composeで起動します。
docker compose up -d
下記のメトリクスを使って、and/or/unlessを試してみます。
sum(node_cpu_seconds_total) by(mode)
sum(node_cpu_guest_seconds_total) by(mode)
and
and
を使うと下記のように、and
の右側のグループに要素があるものから、左側のグループの要素が返されています。
sum(node_cpu_seconds_total) by(mode) and sum(node_cpu_guest_seconds_total) by(mode)
or
or
を使うと下記のように、or
の左側のグループにある要素と、右側のグループの要素から左側のグループになかった要素が返されています。今回の例だと、左側のグループにある要素は全て右側のグループにも要素があるので、左側のグループの要素のみ表示されています。
sum(node_cpu_seconds_total) by(mode) or sum(node_cpu_guest_seconds_total) by(mode)
unless
unless
を使うと下記のように、unless
の左側のグループにある要素から、右側のグループの要素が引かれたものが返されています。
sum(node_cpu_seconds_total) by(mode) unless sum(node_cpu_guest_seconds_total) by(mode)