Mackerel の式グラフで叶える夢 (式グラフの便利な使い方)

前置き

サイドバーにあるように、
10 月頃から Pixela で飲酒量を記録してみたら
どうかしてるんじゃないかと自分で自分を思うようになりました……。

さて、せっかくここまで続いてきた Mackerel アドベントカレンダー
このまま途切れてしまうのは悲しいので
計測してみた系の記事ではなくて機能を使ってみた系でお邪魔します。
24 日目の記事です!

qiita.com

前日はのにれんさん (id:nonylene) の「mackerel-plugin-strongswan を作った」でした。

nonylene.hatenablog.jp

式グラフ

みなさん式グラフはご利用されているでしょうか?
「カスタマイズされたグラフ」としても表現されている機能で、
いまのところ (2018/12/24) 実験的機能として提供されています。

mackerel.io

Mackerel ではそのままでも便利にサーバーやいろいろなもののグラフ化が可能ですが、
式グラフを使うとよりいっそう表現の幅が広がります!
使い方次第なものって具体例があるとより良いかなと思いますので
作業や仕事で使っている例をいくつか紹介します。

※もっと良いやり方もあると思いますので「ん?」と思った方はおしえてください!!

いくつかのメトリックを合計したグラフがほしいとき

例えば同じロールに属するサーバーそれぞれに nginx が入っていて、
個別のリクエスト数だけではなくロール全体のリクエスト数も合計値として監視したいとき。
そのままでは以下のグラフ (サーバー 2 台の例) のようにサーバー別に表示されます。
f:id:nishikawasasaki:20181223141719p:plain
ケース的にロードバランサが入っていることが多いでしょうから
ELB などそれ自体に Mackerel が対応しているものを利用していれば
そちらで計測してしまうのもありですが、
式グラフを使うことでも合計値の監視ができます。

メトリックの合計を計算する式は、そのまま sum です。
これを利用してロールに属するすべてのサーバーの nginx リクエスト数の合計を表現するには

sum(
  role(serviceA:roleX, custom.nginx.requests.requests)
)

のように書くことができます。
グラフはこうなります。
f:id:nishikawasasaki:20181223141838p:plain

簡単に合計値のグラフを表示することができました。

いくつかのメトリックを 1 つのグラフに表示したいとき

合計値だけだとサーバーによってリクエスト数の偏りがあることを見逃してしまうかもしれません。
そんなときは式 group を使って

group(
  role(serviceA:roleX, custom.nginx.requests.requests),
  sum(role(serviceA:roleX, custom.nginx.requests.requests))
)

のように
role(serviceA:roleX, custom.nginx.requests.requests) でサーバー別のリクエスト数も表示してから、
group で 1 つのグラフにまとめてやると良いですね。
f:id:nishikawasasaki:20181223141936p:plain

簡単に 1 まとめにして表示することができました。

グラフに別名をつけたいとき

ここまでで作ったグラフ、オンマウスにしてある時点での数値をみようとすると
f:id:nishikawasasaki:20181223142428p:plain
のように式がそのまま表示されてしまって直感的ではありません。
そんなときは式 alias を使って表示名がカスタマイズできます。

group(
    role(serviceA:roleX, custom.nginx.requests.requests),
    alias(
      sum(role(serviceA:roleX,custom.nginx.requests.requests)),
      'sum'
    )
)

「sum」という名前にしました。 f:id:nishikawasasaki:20181223142904p:plain
グラフにも反映されていますね。

一定期間前の数値と比較したいとき

昨日の、先週の、先月の、去年の同じ時間帯と今の数値を比較したいことは多々あります。
去年の今頃のリクエスト数と比べてどうだろう?
定期的に受信しているテキストデータは増えているのか減っているのか?
いろいろなケースがありますよね。
そんなときは式 timeShift を使って

timeShift(
  role(serviceA:roleX, custom.nginx.requests.requests),
  1d
)

のようにあるメトリックの指定期間前の値を表示することができます。

でも過去分だけ表示してもわかりにくいので、
groupalias をつかって

group(
  alias(
    sum(
     role(serviceA:roleX, custom.nginx.requests.requests) 
    ), 
    'now'
  ),
  alias(
    timeShift(
      sum(role(serviceA:roleX, custom.nginx.requests.requests)),
      1d
    ),
    'past'
  )
)

のように組み合わせると、
f:id:nishikawasasaki:20181223144253p:plain
とグラフにすることができます。

一定期間前の数値と比較したいとき (差分編)

上では現在分・過去分をグラフにしてみましたが、
そうではなく変化量だけを監視したいときもあります。
普段は安定している値なんだけど
何かあると大きく変化するような値の監視に良いんじゃないでしょうか。

こういうときは先ほどの timeShiftdiff を組み合わせると表現できます。

diff(
  role(serviceA:roleY, custom.なにかの行数A.*),
  timeShift(role(serviceA:roleY, custom.なにかの行数A.*), 1m)
)

1 分前の値と今の値の差分をグラフにしてみています。

f:id:nishikawasasaki:20181223145258p:plain

どこで増えたり減ったりしたのか一目瞭然ですね。

他に

紹介しきれませんでしたが、
他にも式には

  • 平均値や最大値・最小値
  • メトリックどうしでの掛算や割算・定数倍や定数割
  • 移動平均や線形回帰

など用意されていて
監視する数値と使い方によって可能性は無限大 (?) です。
せっかくの楽しい機能なのでぜひ公式のドキュメントを読みながらいろいろ試してみてください!!

真打:式による監視

実はここまで式を使ってグラフにしていたのは前座でした。

mackerel.io

個人的には式の真価は監視によって発揮されると思っています。
というのもグラフを作ってそれ自体を見ることから発展して、
人がグラフを見ていくうちに発見した監視した方がよいパターンを式によって表現し
それを Mackerel の監視対象として設定することで
監視漏れの危険や監視コストを減らすことができるからです。
すべての監視を自動にできなくてもその少しでも Mackerel が頑張ってくれるなら助かることです。

「式による監視」は式グラフに慣れた方なら簡単で、
グラフの時と同じように式を使ってメトリックをもとに計算させて
アラートの発生条件等を設定するだけです。
(5 分間隔での監視となるなど、いくつか監視の制限がありますので公式をご確認ください。)

上で紹介した差分値に対して一定以上の変化があったらアラートしたり
これまでに計測値した値の最大値を更新したときにアラートしたりと、
とても便利な監視が実現できますね!

当機能は、有償オプションとなります。Freeプランでは利用できません。

いやーこれは課金待ったなし!
いますぐ Standard プランに入りましょう!!
(2018/12/24 現在)

おあとがよろしいようで