mackerel の "カスタマイズしたグラフを表示する" 機能で遊んだメモ

## 概要

* [グラフで式が使えるようになります（実験的機能）](http://blog-ja.mackerel.io/entry/2015/12/25/121456)
* [カスタマイズしたグラフを表示する](http://help-ja.mackerel.io/entry/advanced/advanced-graph)

mackerel のこの機能を試してみた。
というだけです。

この記事では、あまり詳細な説明を書いたりとかする予定はありません。
ちょちょいっとやったら良い感じにできたのが嬉しくて、mackerel良い！ という気持ちを表現したかっただけです。
機能詳細については、[mackerelのヘルプ](http://help-ja.mackerel.io/entry/advanced/advanced-graph)を見るのが手っ取り早いと思います。

## 先に感想

先日、一部のプロダクトで delayed_job から sidekiq への移行を行いました。

それから数日経過して、負荷が変わったりしたかなーと思っていたところにちょうど、[グラフで式が使えるようになります](http://blog-ja.mackerel.io/entry/2015/12/25/121456)というアップデートが。

> 現在と前の週の同時期とのグラフの比較

ちょうどそれが見たかった！

二つのメトリックの差分も計算できる！
先週分から今週分を引いた値をグラフにしたら、どれだけ負荷が下がったかがわかりやすい！
これ素敵！

また Sidekiq のキューの数とサーバの負荷を重ねてみる、といったこともできる！
嬉しい！

## 使い方

query の組み立てが、括弧ばっかりになってちょっと大変ですが、難しくはないです。
URL として見ると、少しだけ「うぅぅっ」となってしまいますけれども。

### 複数のメトリックを重ねて表示する

例えば、Sidekiq のキューの数とサーバのLAを重ねた URL は以下のような感じになります。

```
https://mackerel.io/orgs/organization_name/advanced-graph?query=group(alias(sum(role(%27Xxx:xxx%27,%20%27custom.sidekiq_job_count.scheduled%27)),%20%27scheduled%27),%20alias(max(role(%27Xxx:xxx%27,%20%27loadavg5%27)),%20%27LA%27))&unit=1w&title=sidekiq
```

この `query` パラメータで、表示するグラフを指定しています。
アンエスケープして、見やすく整形すると、こんな感じ。

```
group(
  alias(
    sum(
      role('Xxx:xxx', 'custom.sidekiq_job_count.scheduled')
    ),
    'scheduled'
  ),
  alias(
    max(
      role('Xxx:xxx', 'loadavg5')
    ),
    'LA'
  )
)
```

`group()` は `引数のメトリック列を１つにまとめます` という説明になっていますが、要はこれで複数の情報を囲むと、1つのグラフにして出してくれます。

`alias()` は、グラフに表示する表示名の指定。

`sum()` や `max()` は、メトリックのどの値を表示するか。

`role()` で、指定したロールに所属しているホストのメトリックを指定できます。

### 時間をずらしてメトリックを重ねる

次は 1週間前と比べるグラフを出してみます。

```
https://mackerel.io/orgs/organization_name/advanced-graph?query=group(alias(max(role(%27Xxx:xxx%27%2C%20%27custom.rds.CPUUtilization.*%27))%2C%20%27RDS%20CPU%27)%2C%20alias(timeShift(max(role(%27Xxx:xxx%27%2C%20%27custom.rds.CPUUtilization.*%27))%2C%20%271w%27)%2C%20%271%20week%20ago%27)%2C%20alias(timeShift(max(role(%27Xxx:xxx%27%2C%20%27custom.rds.CPUUtilization.*%27))%2C%20%272w%27)%2C%20%272%20week%20ago%27))&unit=&title=RDS-CPU
```

`query` を見てみましょう。

```
group(
  alias(
    max(role('Xxx:xxx', 'custom.rds.CPUUtilization.*')),
    'RDS CPU'
  ),
  alias(
    timeShift(
      max(role('Xxx:xxx', 'custom.rds.CPUUtilization.*')),
      '1w'
    ),
    '1 week ago'
  ),
  alias(
    timeShift(
      max(role('Xxx:xxx', 'custom.rds.CPUUtilization.*')),
      '2w'
    ),
    '2 week ago'
  )
)
```

時間をずらしたメトリックは `timeShift()` でできます。
期間指定は

> 整数に続けて単位を指定した期間です。使用可能な単位は `m`(分), `h`(時間), `d`(日), `w`(週), `mo`(月), `y`(年)です。

とのこと。

これで、現在の CPUUtilization と、1週間前、2週間前の情報を重ねて表示できるようになります。

### 差分もグラフにしてしまえ

差がどの程度あるのかわかりにくいので、差を出してみましょう。

`diff()` や `divide()` などで、メトリックを計算した上でグラフ表示できます。

```
group(
  alias(
    diff(
      timeShift(
        max(role('Xxx:xxx', 'custom.rds.CPUUtilization.*')),
        '1w'
      ),
      max(role('Xxx:xxx', 'custom.rds.CPUUtilization.*'))
    ),
    'diff'
  )
)
```

これで、1週間前の CPUUtilization - 今の CPUUtilization のグラフが表示できます。
URL にすると、こう。

```
https://mackerel.io/orgs/organization_name/advanced-graph?query=group(alias(diff(timeShift(max(role(%27Xxx:xxx%27%2C%20%27custom.rds.CPUUtilization.*%27))%2C%20%271w%27)%2C%20max(role(%27Xxx:xxx%27%2C%20%27custom.rds.CPUUtilization.*%27)))%2C%20%27diff%27))&unit=&title=RDS-CPU-diff
```

割り算もできるので、1プロセスあたりとか1キューあたり……みたいなグラフも作れるのかと思うと、色々夢広がりますね :smile: