share facebook facebook2 twitter menu hatena pocket slack

2016.08.24 WED

Mackerel事始め 将来予測機能

WRITTEN BY 大住 孝之

Mackerel の将来予測機能を試してみます。

20160808180208

機能としては式による監視で特定の関数(線形回帰)を使って実現するようです。

将来予測機能

式による監視の仕様

公式サイトの記載より

  • 監視間隔は5分ごと
  • 設定可能な式は、グラフの系列が1本になるものだけ
  • 式が複雑過ぎる等で値が取れない場合はステータス Unknown としてアラートが発生
  • 監視項目上限数20
  • Free プランでは使用不可

線形回帰関数

使用できる関数は カスタマイズしたグラフを表示する – Mackerel ヘルプ で確認できます。

  • linearRegression(metrics, duration)
    • 現在時刻から duration 前 までのメトリック値をもとに線形回帰したメトリックを返します
  • timeLeftForecast(metrics, duration, threshold)
    • 現在時刻から duration 前 までのメトリック値をもとに線形回帰した値が threshold になるまでの残り秒数を返します

公式にある例では timeLeftForecast を使用しており、日数で閾値設定するため scale 関数を使用しています。

  • scale(metrics, factor)
    • 定数倍したメトリックを返します

1ホストのメモリ使用量について設定例

あまり良い例(グラフ)が無かったのですが、memory.usedに対して設定をしてみます。

対象グラフ

監視対象となる あるホストの1ヶ月のメモリ使用量のグラフ は以下になります。

20160808180202

監視設定

1ヶ月分のメトリックを使用して、メモリ使用量が 1.5GB となる日数を取得する式を設定してみます。

scale(timeLeftForecast(host('2KcXXXXXXXX', 'memory.used'),'1mo', 1500000000), 1/86400)

12.81日で到達するという予測となりました。

20160808180203

Excelの線形予測結果との比較

同metricsから値を取得し、Excelで線形予測を出した結果が以下になります。
取得したDatapoint、丸めなどで誤差が出てますが、概ね同じような予測となりました。

20160808180204

複数ホスト(role)に対しての設定例

hostIdに対しての設定だけだとホストが増えてきた場合に設定が追いつかなくなるので、role に対して設定します。
グラフの系列を1本だけにするという点に注意すれば他は1ホストの時と同じです。

20160808180205

ディスク使用量の予測設定例

予測機能の用途としては、やはり公式に記載されているディスク使用量に使用する事が多くなりそうです。

  • 公式記載の式の例
scale(timeLeftForecast(host('host_id', 'filesystem.drive.used'),'3mo', 2000000000000), 1/86400)

式の例

  • 特定ホスト/ドライブを対象
    • hostId = 2KcXXXXXXXX 、 ドライブ = xvda3 の場合
host('2KcXXXXXXXX', 'filesystem.xvda3.used')
  • 特定ホスト/全ドライブを対象
    • ホストに紐付く全ドライブの中の最大値
    • ドライブ指定を「*」
max(host('2KcXXXXXXXX', 'filesystem.*.used'))
  • 特定ロール/全ドライブを対象
    • ロールに紐付く全ドライブの中の最大値
    • role = ‘service:role’ の場合
    • ドライブ指定を「*」
max(role('service:role', 'filesystem.*.used'))

パーセンテージ設定

上記例だと絶対値で閾値設定を行う必要があるため、異なるディスクサイズの場合にそれぞれ設定する必要が出てきます。 となるとやはりパーセンテージで設定したくなるので、式を調整します。

  • 対象ドライブ構成

20160808180207

ドライブ毎にディスクサイズが異なるので、ドライブ毎に設定が必要になるかと思います。 ロール内のディスク構成は同一である場合は以下のように定義可能です。

  • ディスク使用率取得例
divide(
   max(role('service:role','filesystem.xvda3.used'))
  ,max(role('service:role','filesystem.xvda3.size'))
)
  • ディスク使用率の将来予測例
    • 使用率が100%に到達する日数
scale(timeLeftForecast(divide(
   max(role('service:role','filesystem.xvda3.used'))
  ,max(role('service:role','filesystem.xvda3.size'))
),'1mo',1), 1/86400)

通知例

通知メッセージには式の内容がそのまま入ります。 (少々見難いので、将来的には通知メッセージをカスタマイズできるようになると嬉しいですね。)

20160808180206

通常の閾値設定によるアラート発生前に傾向を掴めるというのは中々面白いのではないでしょうか。
長期間のメトリクスを対象にした設定を行えていないので、ディスク使用量の予測設定をして観察してみたいと思います。

元記事はこちら

Mackerel事始め 将来予測機能