センスある構成だと思います。
Sensu だけに。

Introduction

肝障害引いたので再検査受けに行ったら正常値に戻ってました。みなさまいかがお過ごしでしょうか。
アドカレで話題に上げたこれの話をしに参りました。
自宅でもほとんど同じ構成で運用しているので、参考になれば幸いですしならなくてもいいです。
InfluxDB と Grafana の話はオマケ程度です。

Sandbox Repository

これをベースに作っていきます。
毎度お馴染み Vagrant です。

https://github.com/voltaxic-rift/monitoring-sandbox/tree/sensu-only

構成

ざっくりと

  • Sensu Go Backend: 監視対象 (Sensu Go Agent) から監視イベントを受け取って、アラートを出したりメトリクスを InfluxDB にブチ込んだりする人
  • Sensu Go Agent: Sensu Go Backend に登録されている監視コマンドをひたすら実行する人
  • InfluxDB: 時系列データをひたすら溜め込む人
  • Grafana: InfluxDB の時系列データを美しく映し出す人

Sensu Go

Sensu Go は、Sensu, Inc. が開発する OSS ベースの監視プラットフォームであり、Sensu の後継に位置します。
旧 Sensu と違い、外部ミドルウェア (RabbitMQ と Redis) への依存が完全に排除されているため、運用負荷が著しく軽減されています。
データストアとして etcd を使用しますが、デフォルトで組み込まれているため分散構成も容易に組むことができます。僕は1台で困っていないので組んでいませんが…
あと、名の通り Golang 製です。

Setup

監視サーバ

Sensu Go CLI と Sensu Go Backend をインストールします。

1
2
3
# at monitor
sudo dnf install -y https://packagecloud.io/sensu/stable/packages/el/8/sensu-go-cli-6.6.5-5744.x86_64.rpm/download.rpm
sudo dnf install -y https://packagecloud.io/sensu/stable/packages/el/8/sensu-go-backend-6.6.5-5744.x86_64.rpm/download.rpm

backend.yml/etc/sensu/ に設置した後、サービスを起動します。
特に編集する箇所はありませんが、無いと動かないので設置しておきます。

1
2
3
# at monitor
sudo cp /usr/share/doc/sensu-go-backend-6.6.5/backend.yml.example /etc/sensu/backend.yml
sudo systemctl enable --now sensu-backend

Sensu Go Backend の初回起動時はユーザが作成されていませんので、 sensu-backend init を実行して Admin ユーザを作成します。

1
2
# at monitor
sudo SENSU_BACKEND_CLUSTER_ADMIN_USERNAME=admin SENSU_BACKEND_CLUSTER_ADMIN_PASSWORD=admin sensu-backend init

この時点で、 http://localhost:3000 にアクセスして Sensu Go の Web UI を開くことができます。

コマンドも使用したいので、 sensuctl configure を実行して、Sensu Go CLI が使用する認証情報を作成します。

1
2
# at monitor
sensuctl configure -n --username admin --password admin --namespace default --url 'http://localhost:8080'

監視エージェント

(めんどくさいので agent VM には指一本触れていませんが、使ってもよいです)

Sensu Go Agent をインストールします。

1
2
# at monitor and agent
sudo dnf install -y https://packagecloud.io/sensu/stable/packages/el/8/sensu-go-agent-6.6.5-5744.x86_64.rpm/download.rpm

agent.yml/etc/sensu/ に設置した後、サービスを起動します。
2点だけ変更しておく必要があるので、以下のように patch でも当てておきましょう。
どの VM でも同じ設定になります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# at monitor and agent
sudo cp /usr/share/doc/sensu-go-agent-6.6.5/agent.yml.example /etc/sensu/agent.yml
# patch 入ってないので入れとく
sudo dnf install -y patch

sudo patch -u /etc/sensu/agent.yml << 'EOS'
--- /usr/share/doc/sensu-go-agent-6.6.5/agent.yml.example 2022-02-03 22:52:31.000000000 +0000
+++ /etc/sensu/agent.yml 2022-02-11 07:37:18.933906298 +0000
@@ -6,8 +6,8 @@
##
#name: "hostname"
#namespace: "default"
-#subscriptions:
-# - example
+subscriptions:
+ - system
#labels:
# example_key: "example value"
#annotations:
@@ -16,8 +16,8 @@
##
# agent configuration
##
-#backend-url:
-# - "ws://127.0.0.1:8081"
+backend-url:
+ - "ws://192.168.56.254:8081"
#cache-dir: "/var/cache/sensu/sensu-agent"
#config-file: "/etc/sensu/agent.yml"
#log-level: "warn" # available log levels: panic, fatal, error, warn, info, debug
EOS

sudo systemctl enable --now sensu-agent

subscriptions では、購読する Subscription 名を指定します。
web, db など、ロールに基づいて指定しておくのがよいでしょう。
特定の Subscription を購読している Agent にのみ監視コマンドを実行させる、といった用途に使用されます。
とりあえず system にしてあります。

backend-url は、名の通り Backend の URL を指定します。
WebSocket で通信するため、URI スキームは wswss になります。

Sensu Go Agent を起動した時点で、Agent の情報 (Entity) が Backend に自動的に登録されます。

1
2
3
4
[vagrant@monitor ~]$ sensuctl entity list
ID Class OS Subscriptions Last Seen
────────── ─────── ─────── ─────────────────────── ────────────────────────────────
monitor agent linux system,entity:monitor 2022-02-11 08:04:04 +0000 UTC

Check の実行

CheckConfig Resource を作成することで、Agent に対して監視を実行させることができます。
例えば CPU 使用率を監視したいとします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# at monitor
cat << 'EOS' > check-cpu-usage.yml
---
type: CheckConfig
api_version: core/v2
metadata:
name: check-cpu-usage
spec:
command: check-cpu-usage -c 95 -w 85
runtime_assets:
- check-cpu-usage
subscriptions:
- system
interval: 60
publish: true
---
type: Asset
api_version: core/v2
metadata:
name: check-cpu-usage
annotations:
io.sensu.bonsai.url: https://bonsai.sensu.io/assets/sensu/check-cpu-usage
io.sensu.bonsai.api_url: https://bonsai.sensu.io/api/v1/assets/sensu/check-cpu-usage
io.sensu.bonsai.tier: Community
io.sensu.bonsai.version: 0.2.2
io.sensu.bonsai.namespace: sensu
io.sensu.bonsai.name: check-cpu-usage
io.sensu.bonsai.tags: ''
spec:
builds:
- url: https://assets.bonsai.sensu.io/a7ced27e881989c44522112aa05dd3f25c8f1e49/check-cpu-usage_0.2.2_windows_amd64.tar.gz
sha512: 900cfdf28d6088b929c4bf9a121b628971edee5fa5cbc91a6bc1df3bd9a7f8adb1fcfb7b1ad70589ed5b4f5ec87d9a9a3ba95bcf2acda56b0901406f14f69fe7
filters:
- entity.system.os == 'windows'
- entity.system.arch == 'amd64'
- url: https://assets.bonsai.sensu.io/a7ced27e881989c44522112aa05dd3f25c8f1e49/check-cpu-usage_0.2.2_darwin_amd64.tar.gz
sha512: db81ee70426114e4cd4b3f180f2b0b1e15b4bffc09d7f2b41a571be2422f4399af3fbd2fa2918b8831909ab4bc2d3f58d0aa0d7b197d3a218b2391bb5c1f6913
filters:
- entity.system.os == 'darwin'
- entity.system.arch == 'amd64'
- url: https://assets.bonsai.sensu.io/a7ced27e881989c44522112aa05dd3f25c8f1e49/check-cpu-usage_0.2.2_linux_armv7.tar.gz
sha512: 400aacce297176e69f3a88b0aab0ddfdbe9dd6a37a673cb1774c8d4750a91cf7713a881eef26ea21d200f74cb20818161c773490139e6a6acb92cbd06dee994c
filters:
- entity.system.os == 'linux'
- entity.system.arch == 'armv7'
- url: https://assets.bonsai.sensu.io/a7ced27e881989c44522112aa05dd3f25c8f1e49/check-cpu-usage_0.2.2_linux_arm64.tar.gz
sha512: bef7802b121ac2a2a5c5ad169d6003f57d8b4f5e83eae998a0e0dd1e7b89678d4a62e678d153edacdd65fd1d0123b5f51308622690455e77cec6deccfa183397
filters:
- entity.system.os == 'linux'
- entity.system.arch == 'arm64'
- url: https://assets.bonsai.sensu.io/a7ced27e881989c44522112aa05dd3f25c8f1e49/check-cpu-usage_0.2.2_linux_386.tar.gz
sha512: a2dcb5324952567a61d76a2e331c1c16df69ef0e0b9899515dad8d1531b204076ad0c008f59fc2f4735a5a779afb0c1baa132268c41942b203444e377fe8c8e5
filters:
- entity.system.os == 'linux'
- entity.system.arch == '386'
- url: https://assets.bonsai.sensu.io/a7ced27e881989c44522112aa05dd3f25c8f1e49/check-cpu-usage_0.2.2_linux_amd64.tar.gz
sha512: 24539739b5eb19bbab6eda151d0bcc63a0825afdfef3bc1ec3670c7b0a00fbbb2fd006d605a7a038b32269a22026d8947324f2bc0acdf35e8563cf4cb8660d7f
filters:
- entity.system.os == 'linux'
- entity.system.arch == 'amd64'
EOS

sensuctl create -f check-cpu-usage.yml

上記のような YAML を sensuctl create で適用すると、各種リソースが作成されます。
後は作成した CheckConfig に従って、Agent が監視コマンドを実行します。

1
2
3
4
[vagrant@monitor ~]$ sensuctl check list
Name Command Interval Cron Timeout TTL Subscriptions Handlers Assets Hooks Publish? Stdin? Metric Format Metric Handlers
────────────────── ───────────────────────────── ────────── ────── ───────── ───── ─────────────── ────────── ───────────────── ─────── ────────── ──────── ─────────────── ──────────────────
check-cpu-usage check-cpu-usage -c 95 -w 85 60 0 0 system check-cpu-usage true false
1
2
3
4
5
6
7
8
9
[vagrant@monitor ~]$ sensuctl asset list
Name URL Hash
────────────────── ───────────────────────────────────────────────────────────────────────── ──────────
check-cpu-usage //assets.bonsai.sensu.io/.../check-cpu-usage_0.2.2_windows_amd64.tar.gz 900cfdf
check-cpu-usage //assets.bonsai.sensu.io/.../check-cpu-usage_0.2.2_darwin_amd64.tar.gz db81ee7
check-cpu-usage //assets.bonsai.sensu.io/.../check-cpu-usage_0.2.2_linux_armv7.tar.gz 400aacc
check-cpu-usage //assets.bonsai.sensu.io/.../check-cpu-usage_0.2.2_linux_arm64.tar.gz bef7802
check-cpu-usage //assets.bonsai.sensu.io/.../check-cpu-usage_0.2.2_linux_386.tar.gz a2dcb53
check-cpu-usage //assets.bonsai.sensu.io/.../check-cpu-usage_0.2.2_linux_amd64.tar.gz 2453973

YAML の量がクソデカいですが、あまり難しくはないです。

CheckConfig

1
2
3
4
5
6
7
8
9
10
11
12
13
---
type: CheckConfig
api_version: core/v2
metadata:
name: check-cpu-usage
spec:
command: check-cpu-usage -c 95 -w 85
runtime_assets:
- check-cpu-usage
subscriptions:
- system
interval: 60
publish: true

type

リソースの種類を指定します。
Check を走らせるので CheckConfig を指定します。

api_version

使用する API バージョンを指定します。
core/v2 を使うことがほとんどですが、使用するリソースによっては他のバージョンを指定する必要があります。

metadata.name

リソースの名前を定義します。
type 毎に一意でなければいけません。

spec.command

Agent で実行したいコマンドを記述します。

spec.runtime_assets

Dynamic runtime asset と呼ばれる、Resource に基づく処理を行う際に動的に使用されるプラグインを指定します。
Asset の説明は後ほど記載しますが、今回は CPU 使用率をチェックするためのコマンドが含まれている Asset を指定しています。

spec.subscriptions

Check を走らせる対象の subscription 名を指定します。

spec.interval

Check の実行間隔を指定します。
単位は秒です。

spec.publish

true にしておくと、リソース作成後に自動的に Check が走るようになります。
false の場合は、 core/v2/checks に対して手動で Check の実行要求を投げる必要があります。

Asset

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
---
type: Asset
api_version: core/v2
metadata:
name: check-cpu-usage
annotations:
io.sensu.bonsai.url: https://bonsai.sensu.io/assets/sensu/check-cpu-usage
io.sensu.bonsai.api_url: https://bonsai.sensu.io/api/v1/assets/sensu/check-cpu-usage
io.sensu.bonsai.tier: Community
io.sensu.bonsai.version: 0.2.2
io.sensu.bonsai.namespace: sensu
io.sensu.bonsai.name: check-cpu-usage
io.sensu.bonsai.tags: ''
spec:
builds:
- url: https://assets.bonsai.sensu.io/a7ced27e881989c44522112aa05dd3f25c8f1e49/check-cpu-usage_0.2.2_windows_amd64.tar.gz
sha512: 900cfdf28d6088b929c4bf9a121b628971edee5fa5cbc91a6bc1df3bd9a7f8adb1fcfb7b1ad70589ed5b4f5ec87d9a9a3ba95bcf2acda56b0901406f14f69fe7
filters:
- entity.system.os == 'windows'
- entity.system.arch == 'amd64'
- url: https://assets.bonsai.sensu.io/a7ced27e881989c44522112aa05dd3f25c8f1e49/check-cpu-usage_0.2.2_darwin_amd64.tar.gz
sha512: db81ee70426114e4cd4b3f180f2b0b1e15b4bffc09d7f2b41a571be2422f4399af3fbd2fa2918b8831909ab4bc2d3f58d0aa0d7b197d3a218b2391bb5c1f6913
filters:
- entity.system.os == 'darwin'
- entity.system.arch == 'amd64'
- url: https://assets.bonsai.sensu.io/a7ced27e881989c44522112aa05dd3f25c8f1e49/check-cpu-usage_0.2.2_linux_armv7.tar.gz
sha512: 400aacce297176e69f3a88b0aab0ddfdbe9dd6a37a673cb1774c8d4750a91cf7713a881eef26ea21d200f74cb20818161c773490139e6a6acb92cbd06dee994c
filters:
- entity.system.os == 'linux'
- entity.system.arch == 'armv7'
- url: https://assets.bonsai.sensu.io/a7ced27e881989c44522112aa05dd3f25c8f1e49/check-cpu-usage_0.2.2_linux_arm64.tar.gz
sha512: bef7802b121ac2a2a5c5ad169d6003f57d8b4f5e83eae998a0e0dd1e7b89678d4a62e678d153edacdd65fd1d0123b5f51308622690455e77cec6deccfa183397
filters:
- entity.system.os == 'linux'
- entity.system.arch == 'arm64'
- url: https://assets.bonsai.sensu.io/a7ced27e881989c44522112aa05dd3f25c8f1e49/check-cpu-usage_0.2.2_linux_386.tar.gz
sha512: a2dcb5324952567a61d76a2e331c1c16df69ef0e0b9899515dad8d1531b204076ad0c008f59fc2f4735a5a779afb0c1baa132268c41942b203444e377fe8c8e5
filters:
- entity.system.os == 'linux'
- entity.system.arch == '386'
- url: https://assets.bonsai.sensu.io/a7ced27e881989c44522112aa05dd3f25c8f1e49/check-cpu-usage_0.2.2_linux_amd64.tar.gz
sha512: 24539739b5eb19bbab6eda151d0bcc63a0825afdfef3bc1ec3670c7b0a00fbbb2fd006d605a7a038b32269a22026d8947324f2bc0acdf35e8563cf4cb8660d7f
filters:
- entity.system.os == 'linux'
- entity.system.arch == 'amd64'

Sensu Go では、Dynamic runtime asset を使用して、Sensu Go で動的に実行できるコマンドを追加することが出来ます。
Dynamic runtime asset は、Bonsai でホストされているものを使用することが一般的ですが、自前でホストした Asset を使用することも可能です。
今回は sensu/check-cpu-usage を使用して CPU 使用率を監視しますが、実行可能ファイルが Agent に存在していればよいので、例えば Nagios Plugins が既に入っている環境であれば、Asset が無くても Check を実行できます。
Check 結果の仕様は Nagios と同じであるため、Nagios 用のプラグインは流用することができます。
なお、上記の YAML は Asset Definition に記載されているものとほとんど同等です。
そのため、Asset Resource を自分で書く必要はありません。
ただし、ラベルを定義しない場合は labels: を消しておきましょう。怒られるので。

Monitoring as Code

YAML ファイルを使用せずに sensuctl check create を実行して対話的にリソースを作成することもできますが、リソースは可能な限りコードに落とし込んで Git 等で管理しておくと安心できるでしょう。
SensuFlow の実装では、Resource のディレクトリ構成は以下のような形になります。

1
2
3
4
5
6
7
8
9
10
11
.sensu/
cluster/
namespaces.yml
namespaces/
<namespace>/
checks/
hooks/
filters/
handlers/
handelersets/
mutators/

今回は SensuFlow は使用せずコマンド直打ちでリソースを管理していくので、ディレクトリ構成のみ拝借します。
出来上がったものがこちらにあるので、 sensuctl create -r -f でまとめて作成してしまいます。

1
2
# at monitor
sensuctl create -r -f /vagrant/sensu/namespaces/default/
1
2
3
4
5
6
7
8
[vagrant@monitor ~]$ sensuctl check list
Name Command Interval Cron Timeout TTL Subscriptions Handlers Assets Hooks Publish? Stdin? Metric Format Metric Handlers
─────────────────────────── ─────────────────────────────────────────────────────────────────────────────────────────────── ────────── ────── ───────── ───── ─────────────── ────────── ────────────────────────── ─────── ────────── ──────── ─────────────── ──────────────────
check-cpu-usage check-cpu-usage -c 95 -w 85 60 0 0 system check-cpu-usage true false
check-disk-usage check-disk-usage --include-fs-type "xfs" --exclude-fs-path "/boot" --warning 90 --critical 95 60 0 0 system check-disk-usage true false
check-memory-usage check-memory-usage -c 90 -w 80 60 0 0 system check-memory-usage true false
check-swap-usage check-swap-usage -c 10 -w 5 60 0 0 system check-memory-usage true false
network-interface-checks network-interface-checks 60 0 0 system network-interface-checks true false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[vagrant@monitor ~]$ sensuctl asset list
Name URL Hash
─────────────────────────── ──────────────────────────────────────────────────────────────────────────────── ──────────
check-cpu-usage //assets.bonsai.sensu.io/.../check-cpu-usage_0.2.2_windows_amd64.tar.gz 900cfdf
check-cpu-usage //assets.bonsai.sensu.io/.../check-cpu-usage_0.2.2_darwin_amd64.tar.gz db81ee7
check-cpu-usage //assets.bonsai.sensu.io/.../check-cpu-usage_0.2.2_linux_armv7.tar.gz 400aacc
check-cpu-usage //assets.bonsai.sensu.io/.../check-cpu-usage_0.2.2_linux_arm64.tar.gz bef7802
check-cpu-usage //assets.bonsai.sensu.io/.../check-cpu-usage_0.2.2_linux_386.tar.gz a2dcb53
check-cpu-usage //assets.bonsai.sensu.io/.../check-cpu-usage_0.2.2_linux_amd64.tar.gz 2453973
check-disk-usage //assets.bonsai.sensu.io/.../check-disk-usage_0.6.0_windows_amd64.tar.gz 0b1df35
check-disk-usage //assets.bonsai.sensu.io/.../check-disk-usage_0.6.0_darwin_amd64.tar.gz dcbe199
check-disk-usage //assets.bonsai.sensu.io/.../check-disk-usage_0.6.0_linux_armv7.tar.gz bc382b5
check-disk-usage //assets.bonsai.sensu.io/.../check-disk-usage_0.6.0_linux_arm64.tar.gz 05a0f21
check-disk-usage //assets.bonsai.sensu.io/.../check-disk-usage_0.6.0_linux_386.tar.gz abd1978
check-disk-usage //assets.bonsai.sensu.io/.../check-disk-usage_0.6.0_linux_amd64.tar.gz fa25e31
check-memory-usage //assets.bonsai.sensu.io/.../check-memory-usage_0.2.2_windows_amd64.tar.gz 90a997a
check-memory-usage //assets.bonsai.sensu.io/.../check-memory-usage_0.2.2_darwin_amd64.tar.gz 57ebebe
check-memory-usage //assets.bonsai.sensu.io/.../check-memory-usage_0.2.2_linux_armv7.tar.gz 6f7d0d2
check-memory-usage //assets.bonsai.sensu.io/.../check-memory-usage_0.2.2_linux_arm64.tar.gz 94a41f3
check-memory-usage //assets.bonsai.sensu.io/.../check-memory-usage_0.2.2_linux_386.tar.gz 125f9c1
check-memory-usage //assets.bonsai.sensu.io/.../check-memory-usage_0.2.2_linux_amd64.tar.gz 663985d
network-interface-checks //assets.bonsai.sensu.io/.../network-interface-checks_0.1.0_linux_armv6.tar.gz 45cc807
network-interface-checks //assets.bonsai.sensu.io/.../network-interface-checks_0.1.0_linux_armv7.tar.gz e229dc0
network-interface-checks //assets.bonsai.sensu.io/.../network-interface-checks_0.1.0_linux_arm64.tar.gz 257ea28
network-interface-checks //assets.bonsai.sensu.io/.../network-interface-checks_0.1.0_linux_386.tar.gz 3a50265
network-interface-checks //assets.bonsai.sensu.io/.../network-interface-checks_0.1.0_linux_amd64.tar.gz 7ee8a2a

CheckConfig と Asset がまとめて作成されました。

これらのリソースに変更を加える際、あるいはリソースを削除する際は、YAML ファイルの編集後に再度 sensuctl create -r -f を実行します。
ただし、 sensuctl create だけではコードから削除したリソースが残ったままになってしまいます。
そのため sensuctl prune を実行して削除する必要があります。

1
2
3
# at monitor
sensuctl create -r -f /vagrant/sensu/namespaces/default/
sensuctl prune checks,handlers,filters,mutators,assets,secrets/v1.Secret,roles,role-bindings,core/v2.HookConfig -r -f /vagrant/sensu/namespaces/default/

これで、手元のコードと Backend に登録されているリソースが同期されます。
なげーので Script 化して CI で回すとかしておくとよいでしょう。
SensuFlow ではもっと丁寧にやっていますが、現状は上記のような手順でも困ることはなさそうです。

InfluxDB

Sensu Go での監視は一通り完了しましたが、監視で取得した結果はメトリクスとして DB に格納しておいて、後から確認できるようにしておくべきでしょう。
これは Sensu Go だけではできないので、InfluxDB に時系列データとして無限に突っ込んでおくのがよいです。

Setup

sensu-influxdb-handler が InfluxDB 2 系に対応していないので、当面は 1.8 を使用する必要があります。

1
2
3
4
5
6
# at monitor
sudo dnf install -y https://dl.influxdata.com/influxdb/releases/influxdb-1.8.10.x86_64.rpm
sudo systemctl enable --now influxdb

# Sensu Go で使用する DB を作成
influx -execute 'create database sensu'

Sensu Observability Pipeline

Observability Pipeline は、Entity (Agent) の登録から Check の実行 -> Check 結果のフィルタ -> 加工 -> 処理 (TSDB への格納、Slack の通知など) を実行する Sensu Go での一連の流れを表す概念です。
Observability Pipeline に従い Resource を定義することで、保守性と可観測性を担保したシステム監視を実現できます。

メトリクスの保存

というワケで、Check の実行で得たメトリクスを InfluxDB に格納していきます。
Check 結果からメトリクスを取得するためには、Output の形式が以下4種類のいずれかに準拠していなければなりません。

  • Nagios Performance Data
  • Prometheus Exposition Format
  • Graphite Plaintext Protocol
  • InfluxDB Line Protocol

現在登録している CheckConfig のうち、check-disk-usage 以外は上記の形式で出力されていますので、check-disk-usage のみ修正してしまいましょう。

1
check-disk-usage       OK: / 11.06% - Total: 19 GB, Used: 2.1 GB, Free: 17 GB

以下の通り patch を当てます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# at monitor
patch -u /vagrant/sensu/namespaces/default/checks/check-disk-usage.yml << 'EOS'
diff --git a/sensu/namespaces/default/checks/check-disk-usage.yml b/sensu/namespaces/default/checks/check-disk-usage.yml
index e8237ff..396b35f 100644
--- a/sensu/namespaces/default/checks/check-disk-usage.yml
+++ b/sensu/namespaces/default/checks/check-disk-usage.yml
@@ -4,7 +4,7 @@ api_version: core/v2
metadata:
name: check-disk-usage
spec:
- command: check-disk-usage --include-fs-type "xfs" --exclude-fs-path "/boot" --warning 90 --critical 95
+ command: check-disk-usage --include-fs-type "xfs" --exclude-fs-path "/boot" --warning 90 --critical 95 --metrics
runtime_assets:
- check-disk-usage
subscriptions:
@@ -17,42 +17,42 @@ api_version: core/v2
metadata:
name: check-disk-usage
annotations:
- io.sensu.bonsai.url: https://bonsai.sensu.io/assets/sensu/check-disk-usage
- io.sensu.bonsai.api_url: https://bonsai.sensu.io/api/v1/assets/sensu/check-disk-usage
- io.sensu.bonsai.tier: Supported
- io.sensu.bonsai.version: 0.6.0
- io.sensu.bonsai.namespace: sensu
+ io.sensu.bonsai.url: https://bonsai.sensu.io/assets/jadiunr/check-disk-usage
+ io.sensu.bonsai.api_url: https://bonsai.sensu.io/api/v1/assets/jadiunr/check-disk-usage
+ io.sensu.bonsai.tier: Community
+ io.sensu.bonsai.version: 0.6.1
+ io.sensu.bonsai.namespace: jadiunr
io.sensu.bonsai.name: check-disk-usage
io.sensu.bonsai.tags: ''
spec:
builds:
- - url: https://assets.bonsai.sensu.io/c06ba5a541026092d685e4d54b76c490801b9919/check-disk-usage_0.6.0_windows_amd64.tar.gz
- sha512: 0b1df35dc409f7dc8ea849c828036983a5759b6c6ed5940ff1a491b17eb60ca73349dfa9dada73acde0f653a8267c119853771f03b729fd4a95c81e817f9cedb
+ - url: https://assets.bonsai.sensu.io/6fb1d63d9bacf54268c37a2ee01555f1f616efd0/check-disk-usage_0.6.1_windows_amd64.tar.gz
+ sha512: 6bed33f25df0ebfeeffe24364f3ea7f67fca371c96f3121436ef2895482009321dea5d0c19168be082cc5428968050c0e6c8dd7ddbdfdb7a6cbbe9c8d0f3c0d8
filters:
- entity.system.os == 'windows'
- entity.system.arch == 'amd64'
- - url: https://assets.bonsai.sensu.io/c06ba5a541026092d685e4d54b76c490801b9919/check-disk-usage_0.6.0_darwin_amd64.tar.gz
- sha512: dcbe19998d1804c8708836c3ec0a7568442ed8f9b33d7d430dc4e1ef59e37f516648b3147344e79c6deb2ad095f588971e37de1f9f9ef1fac558eacc21c184c7
+ - url: https://assets.bonsai.sensu.io/6fb1d63d9bacf54268c37a2ee01555f1f616efd0/check-disk-usage_0.6.1_darwin_amd64.tar.gz
+ sha512: 3b886514771b86a39cfe49af6dd4333dee668327ee0dda80601ed6cee105b74a3d0b8fb2cfe998d3025c80027223d458f9f6f17f29f46dd44572179a8137c249
filters:
- entity.system.os == 'darwin'
- entity.system.arch == 'amd64'
- - url: https://assets.bonsai.sensu.io/c06ba5a541026092d685e4d54b76c490801b9919/check-disk-usage_0.6.0_linux_armv7.tar.gz
- sha512: bc382b5b8c9bc70a3be64f4af6686640a852417696357fafcc63faa0f2f7538475cb847444ddcbb3c9486a40725e21a3a2a8c2e3493ff6a0bdfb6d5458ebd683
+ - url: https://assets.bonsai.sensu.io/6fb1d63d9bacf54268c37a2ee01555f1f616efd0/check-disk-usage_0.6.1_linux_armv7.tar.gz
+ sha512: dfb90f45df39659a22d71087bb231f72667f290515cc9b177e782419dbe1295974f6b5af2839283d825ed0c8f9566ae4a1e21b1585dc5ab5779f65c45c8b6131
filters:
- entity.system.os == 'linux'
- entity.system.arch == 'armv7'
- - url: https://assets.bonsai.sensu.io/c06ba5a541026092d685e4d54b76c490801b9919/check-disk-usage_0.6.0_linux_arm64.tar.gz
- sha512: 05a0f21ccd93a418eedc596b3b8257a7d34f521e13b8de0d9621c25782829b082391a670e8705f792cd03eddfd36fc965afc6ea3f0f0923202abaebbaabf5467
+ - url: https://assets.bonsai.sensu.io/6fb1d63d9bacf54268c37a2ee01555f1f616efd0/check-disk-usage_0.6.1_linux_arm64.tar.gz
+ sha512: c596f3dcb693d56a7656cfd8c145e67daba90efde9caf74a4ceb3bf7abb24d82206b5fe70feb8b45e9bf3dd9fd71bb9aa10c67e2a4295841287ff5b062e976c7
filters:
- entity.system.os == 'linux'
- entity.system.arch == 'arm64'
- - url: https://assets.bonsai.sensu.io/c06ba5a541026092d685e4d54b76c490801b9919/check-disk-usage_0.6.0_linux_386.tar.gz
- sha512: abd19787ac7c81d99058e48ce678e22dee866bae15d587431838f449876fac255f8c1e8c738342225e459b363af5f8b3b22171c9bc858605ea7bebbf143933e4
+ - url: https://assets.bonsai.sensu.io/6fb1d63d9bacf54268c37a2ee01555f1f616efd0/check-disk-usage_0.6.1_linux_386.tar.gz
+ sha512: 7a001fb98ff1d3f85218ace6c2c05aba752807b021d2e553658811df72449b851e9b758e534206491bc4f8a4c7a9f3b3d02ee44a9e48f13e392e96c569e13f97
filters:
- entity.system.os == 'linux'
- entity.system.arch == '386'
- - url: https://assets.bonsai.sensu.io/c06ba5a541026092d685e4d54b76c490801b9919/check-disk-usage_0.6.0_linux_amd64.tar.gz
- sha512: fa25e317ba8aa3e23d9e3d3c54081ca4529aeba2e7ee437a2bf1ed8cfb3fbf70cd0380eb8cc427a9be17515e437f6346949381cc7ce47f37493e32eb8372ded8
+ - url: https://assets.bonsai.sensu.io/6fb1d63d9bacf54268c37a2ee01555f1f616efd0/check-disk-usage_0.6.1_linux_amd64.tar.gz
+ sha512: 722e94d473d613f75a9d0d501ad86fd7d450bdfeed25b52da2a6ec8902660bb9bc68fb38ba3a1f35ea7681b719acfc9c28d5641388900b1bfe201612b919922e
filters:
- entity.system.os == 'linux'
- entity.system.arch == 'amd64'
EOS

/vagrant/sensuflow.sh

check-disk-usage は --metrics オプションを付けることで、Prometheus Exposition Format でメトリクスを出力できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# HELP disk_critical [GAUGE] non-zero value indicates mountpoint usage is above critical threshold
# TYPE disk_critical GAUGE
disk_critical{mountpoint="/"} 0 1644577780190
disk_critical{mountpoint="any"} 0 1644577780190

# HELP disk_warning [GAUGE] non-zero value indicates mountpoint usage is above warning threshold
# TYPE disk_warning GAUGE
disk_warning{mountpoint="/"} 0 1644577780190
disk_warning{mountpoint="any"} 0 1644577780190

# HELP disk_percent_usage [GAUGE] Percentage of mounted volume used
# TYPE disk_percent_usage GAUGE
disk_percent_usage{mountpoint="/"} 11.199096496470066 1644577780190

# HELP disk_total_bytes [GAUGE] Total size in bytes of mounted volumed
# TYPE disk_total_bytes GAUGE
disk_total_bytes{mountpoint="/"} 1.8862833664e+10 1644577780190

# HELP disk_used_bytes [GAUGE] Used size in bytes of mounted volumed
# TYPE disk_used_bytes GAUGE
disk_used_bytes{mountpoint="/"} 2.112466944e+09 1644577780190

# HELP disk_free_bytes [GAUGE] Free size in bytes of mounted volumed
# TYPE disk_free_bytes GAUGE
disk_free_bytes{mountpoint="/"} 1.675036672e+10 1644577780190

Prometheus Exposition Format では Timestamp の精度はミリ秒単位であることが求められます (あるいは Timestamp を省いてもよい) が、sensu/check-disk-usage 0.6.0 は秒単位で出力されてしまうため、Sensu Go でメトリクスをパースすると Timestamp が狂ってしまいます。
まだ修正されていないので、上記 patch にて jadiunr/check-disk-usage を使用するように変更しています。

すべての Check 結果のメトリクスを Sensu Go でパースできるようになったので、InfluxDB に格納するための Pipeline を作成します。

Handler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# at monitor
mkdir -p /vagrant/sensu/namespaces/default/handlers/
cat << 'EOS' > /vagrant/sensu/namespaces/default/handlers/influxdb.yml
---
type: Handler
api_version: core/v2
metadata:
name: influxdb
spec:
command: sensu-influxdb-handler -d sensu -c
runtime_assets:
- sensu-influxdb-handler
type: pipe
---
type: Asset
api_version: core/v2
metadata:
name: sensu-influxdb-handler
annotations:
io.sensu.bonsai.url: https://bonsai.sensu.io/assets/sensu/sensu-influxdb-handler
io.sensu.bonsai.api_url: https://bonsai.sensu.io/api/v1/assets/sensu/sensu-influxdb-handler
io.sensu.bonsai.tier: Supported
io.sensu.bonsai.version: 3.7.0
io.sensu.bonsai.namespace: sensu
io.sensu.bonsai.name: sensu-influxdb-handler
io.sensu.bonsai.tags: ''
spec:
builds:
- url: https://assets.bonsai.sensu.io/0e75f54fc34c4f6b3439362256983203f1b6c8ca/sensu-influxdb-handler_3.7.0_linux_386.tar.gz
sha512: 6719527e1b720ec0ba2b15a7a043e7860135cf31483c3812f14659bde92123c89b8edd85a9cd23abffb5bb31caf6e84b5b45dc5605f87bdee30f59c4b8feada7
filters:
- entity.system.os == 'linux'
- entity.system.arch == '386'
- url: https://assets.bonsai.sensu.io/0e75f54fc34c4f6b3439362256983203f1b6c8ca/sensu-influxdb-handler_3.7.0_linux_amd64.tar.gz
sha512: d05650d778f8e9427eca155455fb20a73a996dc46df240a7b84978385bdeeddfa46a624add5d43bed93f08c1b076e0d7ba350df8c3deb08bc007bc3630777a52
filters:
- entity.system.os == 'linux'
- entity.system.arch == 'amd64'
- url: https://assets.bonsai.sensu.io/0e75f54fc34c4f6b3439362256983203f1b6c8ca/sensu-influxdb-handler_3.7.0_linux_armv7.tar.gz
sha512: 38918c179574df64f9ee3a80b3dd9566ff0bc924d75b81742d11f42a39f4f353a6eec7eee3f6536109413408dadeb24aa54dcbe5a295f0de26af8d3e12b2dca6
filters:
- entity.system.os == 'linux'
- entity.system.arch == 'armv7'
- url: https://assets.bonsai.sensu.io/0e75f54fc34c4f6b3439362256983203f1b6c8ca/sensu-influxdb-handler_3.7.0_linux_arm64.tar.gz
sha512: 944075ff9a8525b7633f5685d5f0785df098fa7a0a07f0b444b25fe76b80155c13a867fc6cea2b3f7996a6509683ed5f5bc962337ef6114edad90ec57dbe91fb
filters:
- entity.system.os == 'linux'
- entity.system.arch == 'arm64'
- url: https://assets.bonsai.sensu.io/0e75f54fc34c4f6b3439362256983203f1b6c8ca/sensu-influxdb-handler_3.7.0_windows_amd64.tar.gz
sha512: 8228cbcf622cdca512e828de5f474f5d0e86017921116fa6e7463d78c142a981484f5dc6138f48796d89d5866b162ef8835ddc677f697ef5a4322d7d939f681d
filters:
- entity.system.os == 'windows'
- entity.system.arch == 'amd64'
- url: https://assets.bonsai.sensu.io/0e75f54fc34c4f6b3439362256983203f1b6c8ca/sensu-influxdb-handler_3.7.0_darwin_amd64.tar.gz
sha512: 7c73e1d8d57aab24b12e6a26d4a3bef11dbaecc895e08ef2e9b3df87ac3202ec6a0e34012225f13aca11ea7f5e3bf8ec565507ed9c28a0f74e47ce9defe22a57
filters:
- entity.system.os == 'darwin'
- entity.system.arch == 'amd64'
EOS

spec.typepipe を指定します。
名の通り Check の出力が標準入力を介して sensu-influxdb-handler コマンドに渡されます。

Pipeline

Pipeline リソースは、EventFilter, Mutator, Handler を紐付けるために使用します。
それぞれ、Observability Pipeline において Filter, Transform, Process を担当します。
上記3種のリソースは、1組の Workflow として複数定義することができます。
今回は1組のみで Handler しか使いませんが。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# at monitor
mkdir -p /vagrant/sensu/namespaces/default/pipelines/
cat << 'EOS' > /vagrant/sensu/namespaces/default/pipelines/store-metrics.yml
---
type: Pipeline
api_version: core/v2
metadata:
name: store-metrics
spec:
workflows:
- name: store-metrics
filters:
- name: has_metrics
type: EventFilter
api_version: core/v2
handler:
name: influxdb
type: Handler
api_version: core/v2
EOS

spec.workflows

パイプラインで使用する Workflow を定義します。

spec.workflows[].name

Workflow の名前を定義します。
わかりやすい名前にしておくとよいです。

spec.workflows[].filters

Workflow で使用する Filter を指定します。
has_metrics は Sensu Go ビルトインの Filter で、渡された Event リソースに Metrics が含まれているものだけを使用するようにフィルタリングします。

spec.workflows[].handler

使用する Handler を指定します。
先ほど作成した InfluxDB Handler を指定します。

Check で Pipeline を使用する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# at monitor
patch -u /vagrant/sensu/namespaces/default/checks/check-cpu-usage.yml << 'EOS'
diff --git a/sensu/namespaces/default/checks/check-cpu-usage.yml b/sensu/namespaces/default/checks/check-cpu-usage.yml
index d4c4f0b..fb10356 100644
--- a/sensu/namespaces/default/checks/check-cpu-usage.yml
+++ b/sensu/namespaces/default/checks/check-cpu-usage.yml
@@ -5,6 +5,11 @@ metadata:
name: check-cpu-usage
spec:
command: check-cpu-usage -c 95 -w 85
+ output_metric_format: nagios_perfdata
+ pipelines:
+ - api_version: core/v2
+ name: store-metrics
+ type: Pipeline
runtime_assets:
- check-cpu-usage
subscriptions:
EOS

patch -u /vagrant/sensu/namespaces/default/checks/check-disk-usage.yml << 'EOS'
diff --git a/sensu/namespaces/default/checks/check-disk-usage.yml b/sensu/namespaces/default/checks/check-disk-usage.yml
index 396b35f..af63059 100644
--- a/sensu/namespaces/default/checks/check-disk-usage.yml
+++ b/sensu/namespaces/default/checks/check-disk-usage.yml
@@ -5,6 +5,11 @@ metadata:
name: check-disk-usage
spec:
command: check-disk-usage --include-fs-type "xfs" --exclude-fs-path "/boot" --warning 90 --critical 95 --metrics
+ output_metric_format: prometheus_text
+ pipelines:
+ - api_version: core/v2
+ name: store-metrics
+ type: Pipeline
runtime_assets:
- check-disk-usage
subscriptions:
EOS

patch -u /vagrant/sensu/namespaces/default/checks/check-memory-usage.yml << 'EOS'
diff --git a/sensu/namespaces/default/checks/check-memory-usage.yml b/sensu/namespaces/default/checks/check-memory-usage.yml
index a8d9252..ba9c085 100644
--- a/sensu/namespaces/default/checks/check-memory-usage.yml
+++ b/sensu/namespaces/default/checks/check-memory-usage.yml
@@ -5,6 +5,11 @@ metadata:
name: check-memory-usage
spec:
command: check-memory-usage -c 90 -w 80
+ output_metric_format: nagios_perfdata
+ pipelines:
+ - api_version: core/v2
+ name: store-metrics
+ type: Pipeline
runtime_assets:
- check-memory-usage
subscriptions:
@@ -18,6 +23,11 @@ metadata:
name: check-swap-usage
spec:
command: check-swap-usage -c 10 -w 5
+ output_metric_format: nagios_perfdata
+ pipelines:
+ - api_version: core/v2
+ name: store-metrics
+ type: Pipeline
runtime_assets:
- check-memory-usage
subscriptions:
EOS

patch -u /vagrant/sensu/namespaces/default/checks/network-interface-checks.yml << 'EOS'
diff --git a/sensu/namespaces/default/checks/network-interface-checks.yml b/sensu/namespaces/default/checks/network-interface-checks.yml
index 88a377e..8118820 100644
--- a/sensu/namespaces/default/checks/network-interface-checks.yml
+++ b/sensu/namespaces/default/checks/network-interface-checks.yml
@@ -5,6 +5,11 @@ metadata:
name: network-interface-checks
spec:
command: network-interface-checks
+ output_metric_format: prometheus_text
+ pipelines:
+ - api_version: core/v2
+ name: store-metrics
+ type: Pipeline
runtime_assets:
- network-interface-checks
subscriptions:
EOS

output_metric_format では、Check 出力のフォーマットを指定します。
Nagios Performance Data で出力されているものは nagios_perfdata 、Prometheus であれば prometheus_text を指定する必要があります。
pipelines には、先ほど作成した Pipeline を指定することで、Check 出力が Pipeline に渡されるようになります。
最後に sensuflow.sh を実行して Resource を同期させれば完了です。

確認

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
[vagrant@monitor ~]$ influx -database sensu -precision rfc3339
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
> show series
key
---
bytes_recv,interface=enp0s3,prom_type=counter,sensu_entity_name=monitor
bytes_recv,interface=enp0s8,prom_type=counter,sensu_entity_name=monitor
bytes_sent,interface=enp0s3,prom_type=counter,sensu_entity_name=monitor
bytes_sent,interface=enp0s8,prom_type=counter,sensu_entity_name=monitor
check-cpu-usage,sensu_entity_name=monitor
check-disk-usage,sensu_entity_name=monitor
check-memory-usage,sensu_entity_name=monitor
check-swap-usage,sensu_entity_name=monitor
cpu_guest,sensu_entity_name=monitor
cpu_guestnice,sensu_entity_name=monitor
cpu_idle,sensu_entity_name=monitor
cpu_iowait,sensu_entity_name=monitor
cpu_irq,sensu_entity_name=monitor
cpu_nice,sensu_entity_name=monitor
cpu_softirq,sensu_entity_name=monitor
cpu_steal,sensu_entity_name=monitor
cpu_system,sensu_entity_name=monitor
cpu_user,sensu_entity_name=monitor
disk_critical,mountpoint=/,prom_type=gauge,sensu_entity_name=monitor
disk_critical,mountpoint=any,prom_type=gauge,sensu_entity_name=monitor
disk_free_bytes,mountpoint=/,prom_type=gauge,sensu_entity_name=monitor
disk_percent_usage,mountpoint=/,prom_type=gauge,sensu_entity_name=monitor
disk_total_bytes,mountpoint=/,prom_type=gauge,sensu_entity_name=monitor
disk_used_bytes,mountpoint=/,prom_type=gauge,sensu_entity_name=monitor
disk_warning,mountpoint=/,prom_type=gauge,sensu_entity_name=monitor
disk_warning,mountpoint=any,prom_type=gauge,sensu_entity_name=monitor
drop_in,interface=enp0s3,prom_type=counter,sensu_entity_name=monitor
drop_in,interface=enp0s8,prom_type=counter,sensu_entity_name=monitor
drop_out,interface=enp0s3,prom_type=counter,sensu_entity_name=monitor
drop_out,interface=enp0s8,prom_type=counter,sensu_entity_name=monitor
err_in,interface=enp0s3,prom_type=counter,sensu_entity_name=monitor
err_in,interface=enp0s8,prom_type=counter,sensu_entity_name=monitor
err_out,interface=enp0s3,prom_type=counter,sensu_entity_name=monitor
err_out,interface=enp0s8,prom_type=counter,sensu_entity_name=monitor
mem_available,sensu_entity_name=monitor
mem_free,sensu_entity_name=monitor
mem_total,sensu_entity_name=monitor
mem_used,sensu_entity_name=monitor
network-interface-checks,sensu_entity_name=monitor
packets_recv,interface=enp0s3,prom_type=counter,sensu_entity_name=monitor
packets_recv,interface=enp0s8,prom_type=counter,sensu_entity_name=monitor
packets_sent,interface=enp0s3,prom_type=counter,sensu_entity_name=monitor
packets_sent,interface=enp0s8,prom_type=counter,sensu_entity_name=monitor
swap_free,sensu_entity_name=monitor
swap_total,sensu_entity_name=monitor
swap_used,sensu_entity_name=monitor
> select * from cpu_idle
name: cpu_idle
time sensu_entity_name value
---- ----------------- -----
2022-02-11T12:13:55Z monitor 99.5
2022-02-11T12:14:55Z monitor 99.62

メトリクスが格納されていることが確認できました。
InfluxDB を長期運用する際は、ストレージが逼迫しないように対策しておくとよいです。
https://docs.influxdata.com/influxdb/v1.8/guides/downsample_and_retain/

Slack の Handler も提供されていますので、Pipeline を組んで通知させてみてもよいでしょう。

Keepalive event handlers

Keepalive の結果も Handler に渡せるので、InfluxDB にメトリクスとして突っ込んでおきます。
このメトリクスは、後ほど Grafana で使用します。

1
2
3
4
5
6
7
8
9
10
11
12
# at monitor
cat << 'EOS' > /vagrant/sensu/namespaces/default/handlers/keepalive.yml
---
type: Handler
api_version: core/v2
metadata:
name: keepalive
spec:
handlers:
- influxdb
type: set
EOS

Handler から Handler を使用する際は、 typeset にします。

Grafana

データの可視化ツールといえば Grafana が999割なので、Grafana を使用します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# at monitor
sudo dnf install -y https://dl.grafana.com/oss/release/grafana-8.3.4-1.x86_64.rpm

sudo patch -u /etc/grafana/grafana.ini << 'EOS'
--- /etc/grafana/grafana.ini 2022-02-11 12:21:16.888927633 +0000
+++ /vagrant/grafana.ini 2022-02-09 20:29:59.528174625 +0000
@@ -35,7 +35,7 @@
;http_addr =

# The http port to use
-;http_port = 3000
+http_port = 3001

# The public facing domain name used to access grafana from a browser
;domain = localhost
@@ -389,13 +389,13 @@
#################################### Anonymous Auth ######################
[auth.anonymous]
# enable anonymous access
-;enabled = false
+enabled = true

# specify organization name that should be used for unauthenticated users
;org_name = Main Org.

# specify role for unauthenticated users
-;org_role = Viewer
+org_role = Admin

# mask the Grafana version number for unauthenticated users
;hide_version = false
EOS

sudo systemctl enable --now grafana-server

Port 3000 は Sensu Go に握られているので 3001 を使用します。
あと、だるいので認証も切りますが、真面目に使う際は切ってはいけません。

Grafonnet & Grizzly

ポチポチして Dashboard を作ってもよいのですが、再現性が最悪なので JSON をブチ当てて Dashboard を作ります。
ですが Grafana の JSON は余裕で1000行を超過してまうので、これまた最悪です。
Dashboard もコードとして管理できたほうが嬉しいので、Jsonnet を使用して Grafonnet と Grizzly で JSON を作成することにします。
Jsonnet 周りは Docker と Docker Compose を使っていますので、ホストマシンで実行しましょう。
コードはリポジトリにあるものを実行するだけです。

API キー生成

Grafana の API を叩くので作っておきます。
https://grafana.com/docs/grafana/latest/http_api/auth/#create-api-token

Role は Admin にしておきましょう。

grr apply 実行

1
2
3
4
5
6
7
8
9
# at HOST MACHINE
cd grafana
cp .env.sample .env
# API キー記述
vim .env

docker-compose build
docker-compose run --rm grr jb install
docker-compose run --rm grr grr apply grr.jsonnet
1
2
3
4
5
6
7
[jadiunr@j-aerog grafana]$ docker-compose run --rm grr jb install
GET https://github.com/grafana/grafonnet-lib/archive/3626fc4dc2326931c530861ac5bebe39444f6cbf.tar.gz 200
GET https://github.com/grafana/jsonnet-libs/archive/5a128df878434da37969b811e99bb9cd0a3779e3.tar.gz 200
[jadiunr@j-aerog grafana]$ docker-compose run --rm grr grr apply grr.jsonnet
INFO[0000] Applying 2 resources
Datasource.influxdb_sensu added
Dashboard.system added

このように、コマンド1発で Dashboard が作成されます。
1発ではないですが。

Jsonnet 周りは… 解説する気が全く起きないので Document を読んでください。
もう1000行行きそうなので

https://jsonnet.org/
https://grafana.github.io/grafonnet-lib/
https://grafana.github.io/grizzly/

Sensu Go OSS V.S. Sensu Go Enterprise

これまで扱ってきた Sensu Go は Enterprise 版になります。
Enterprise 版は、登録できる Entity の数が100件までに制限されているため、100件を超える場合は札束で殴るか OSS 版を使用しなければなりません。
なお、OSS 版を使用する場合はソースからビルドする必要があります。

Enterprise 版と異なる点は多くありますが、まず Web UI が事実上ありません。OSS 版の Web UI は開発が停止しているためです。
また、検索機能も無いので、OSS 版 Web UI を使用したとしてもリソースの検索ができません。
sensuctl prune も商用機能であるため、Shell Script で頑張る等の自前実装が必要です。
監視プラットフォームに Web UI が無いのは致命的であるため、大規模な監視基盤を構築するのであればライセンス契約を結ぶのが無難でしょうか。
とはいえ、Sensu Go は水平スケールが可能、かつメンテナンス性が非常に高いため、監視基盤として採用するのは全く問題ないでしょう。
問題は TSDB の方ですが、InfluxDB は Enterprise 版でも分散構成に頭を悩ませる気がしないでもないです。
Grafana も後ろに RDB が必要なので、スケーラビリティを考えるとどうしても骨になってしまいますね。

まとめ

以上、Sensu Go と InfluxDB と Grafana でいい感じに監視基盤を作る話でした。
みんなも監視組人 (かんしくみんちゅ) になろう。

Q. Prometheus じゃあかんのか?
A. アホなので Prometheus わかりません。