grasys blog

Grafana アラートルールをコード化して効率的に運用しよう

こんにちは、エンジニアの 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 でなくファイル編集でアラートルールを管理することに違和感があるかもしれませんが、管理するサーバー台数が増えてくるとむしろコード化したファイルを編集して設定できる方が楽に感じられます。よければぜひ試してみてください。

それでは、また。


採用情報
お問い合わせ