こんにちは、エンジニアの HK です。
突然ですが皆さんは Grafana でサーバー監視をしていますか?
弊社ではサーバーの負荷状況などを確認するために Grafana を使っています。
今回は Grafana を効率的に構築する方法をご紹介します。すでに実務で Grafana を使っている人にとってはもしかしたら馴染みのある話題かもしれません。
また、これから Grafana を使ってサーバーの監視をしようと考えている人にとっては参考になれば幸いです。
先に結論を言ってしまうと、2 台以上のサーバーを Grafana で管理したい場合は、アラートルールの管理は yaml でコード化して管理する方がおすすめです!
実務では何台ものサーバーを扱うことになるとおもいますので、そういった時はアラートルールをコード化しておいた方が何倍も楽に管理ができるというのが今回の内容となります。
それでは、簡単に設定方法を紹介します。
まずは UI 上でアラートルールを設定します。
今回はサーバーの CPU 使用率を計測して、80%以上だった場合にアラートが発報するルールにしましょう。

これで元となるアラートルールができました。

それでは、このルールをもとに、閾値を変えつつ他のサーバーにも設定していきます。
まず、このアラートルールを export して yaml として出力します。


yaml ファイルを表示
apiVersion: 1
groups:
- orgId: 1
name: test_evaluation_1m
folder: test_folder
interval: 1m
rules:
- uid: ****************
title: test-cpu-usage
condition: C
data:
- refId: A
relativeTimeRange:
from: 600
to: 0
datasourceUid: ****************
model:
disableTextWrap: false
editorMode: code
expr: 100 - (avg by (hostname) (irate(node_cpu_seconds_total{mode="idle",hostname="********"}[1m])) * 100)
fullMetaSearch: false
includeNullMetadata: true
instant: true
intervalMs: 1000
legendFormat: __auto
maxDataPoints: 43200
range: false
refId: A
useBackend: false
- refId: C
datasourceUid: __expr__
model:
conditions:
- evaluator:
params:
- 80
type: gt
operator:
type: and
query:
params:
- C
reducer:
params: []
type: last
type: query
datasource:
type: __expr__
uid: __expr__
expression: A
intervalMs: 1000
maxDataPoints: 43200
refId: C
type: threshold
noDataState: NoData
execErrState: Error
for: 1m
annotations: {}
labels: {}
isPaused: false
notification_settings:
receiver: test-receiver
この yaml をもとにアラートルールを増やしていきます。
grafana-server があるサーバーで yaml ファイルを所定のディレクトリに設置しましょう。(今回は閾値を 90%に変更してみます)
yaml ファイルを表示
# vim provisioning/alerting/test-cpu-usage-90.yaml
apiVersion: 1
groups:
- orgId: 1
name: test_evaluation_1m
folder: test_folder
interval: 1m
rules:
- uid: cpu-usage-01
title: test-cpu-usage-90
condition: C
data:
- refId: A
relativeTimeRange:
from: 600
to: 0
datasourceUid: ****************
model:
disableTextWrap: false
editorMode: code
expr: 100 - (avg by (hostname) (irate(node_cpu_seconds_total{mode="idle",hostname="********"}[1m])) * 100)
fullMetaSearch: false
includeNullMetadata: true
instant: true
intervalMs: 1000
legendFormat: __auto
maxDataPoints: 43200
range: false
refId: A
useBackend: false
- refId: C
datasourceUid: __expr__
model:
conditions:
- evaluator:
params:
- 90
type: gt
operator:
type: and
query:
params:
- C
reducer:
params: []
type: last
type: query
datasource:
type: __expr__
uid: __expr__
expression: A
intervalMs: 1000
maxDataPoints: 43200
refId: C
type: threshold
noDataState: NoData
execErrState: Error
for: 1m
annotations: {}
labels: {}
isPaused: false
notification_settings:
receiver: test-receiver
設定したら grafana-server に更新を反映させます。
# systemctl restart grafana-server
Grafana を確認してみると、アラートルールが増えています。

また、yaml ファイルで設定したアラートルールには Provision と表示され、UI からは編集できません(編集するための鉛筆マークが付いていない)。
設定変更がしたくなったときはファイルから編集する必要があります。
実際の業務では、何台もの VM に同じ監視ルールを適用して、なおかつルールごとに微妙に値を調整することもあります。
そんな時、既存ルールをコピーして一部を書き換えるだけでアラートルールを量産できると便利です。
yaml ファイルを表示
# cp test-cpu-usage-90.yaml test-cpu-usage-95.yaml
# vim test-cpu-usage-95.yaml
apiVersion: 1
groups:
- orgId: 1
name: test_evaluation_1m
folder: test_folder
interval: 1m
rules:
- uid: cpu-usage-02
title: test-cpu-usage-95
condition: C
data:
- refId: A
relativeTimeRange:
from: 600
to: 0
datasourceUid: ****************
model:
disableTextWrap: false
editorMode: code
expr: 100 - (avg by (hostname) (irate(node_cpu_seconds_total{mode="idle",hostname="********"}[1m])) * 100)
fullMetaSearch: false
includeNullMetadata: true
instant: true
intervalMs: 1000
legendFormat: __auto
maxDataPoints: 43200
range: false
refId: A
useBackend: false
- refId: C
datasourceUid: __expr__
model:
conditions:
- evaluator:
params:
- 95
type: gt
operator:
type: and
query:
params:
- C
reducer:
params: []
type: last
type: query
datasource:
type: __expr__
uid: __expr__
expression: A
intervalMs: 1000
maxDataPoints: 43200
refId: C
type: threshold
noDataState: NoData
execErrState: Error
for: 1m
annotations: {}
labels: {}
isPaused: true
notification_settings:
receiver: test-receiver
今度は閾値を 95%に設定しました。

アラートルールが paused(一時停止)になっていますが、yaml 内で isPaused: true
にすることでアラートの停止設定も切り替えることができます。
今回は 2 台だけの想定で試しましたが、台数が何台、何十台とあっても同じ方法でアラートルールを増やすことができます。
また、アラートルールをコード化しておくことで、git で組織内でいつどのような変更があったかを把握しやすくなるメリットもあります。
最初は直感的な GUI でなくファイル編集でアラートルールを管理することに違和感があるかもしれませんが、管理するサーバー台数が増えてくるとむしろコード化したファイルを編集して設定できる方が楽に感じられます。よければぜひ試してみてください。
それでは、また。

