前回に引き続き、Mackerelの設定についてみていきます。
目次
・閾値、通知設定
前回まででグラフの表示はできていると思います。 監視を行う為、閾値等の設定を行っていきましょう。 Mackerelの管理ページから、Monitorを選択し、 右上の「監視ルールを追加」をクリックします。
メトリック、閾値の設定を行い「作成」をクリックします。
続いて通知設定を行います。 メールはデフォルトでサインアップ時のアドレスに通知するようになっています。 色々な通知先を指定できますが、ここではSlackへの通知設定を行ってみます。 Slackへの通知はincomming WebHooksを使用するようです。
先ずはSlackに任意のチャンネルを作成します。 作成したチャンネルの画面から"+Add an app"をクリック。
表示されたページから"Incomming WebHooks"を検索し、クリック。
"Add Configuration"をクリック。
Post to Channelで先程作成したチャンネルを指定します。
作成した"Incomming WebHooks"ページから"Webhook URL"を控えておきます。
Mackerelの管理ページへ戻り、Monitorを選択します。 右上の「チャンネル設定」をクリック。
通知チャンネル名は任意の名称を入力。 URLへ控えておいた"Web hook URL"を入力し作成します。
設定完了です。 通知が行われると下図のように表示されます。
便利ですね!
・カスタムプラグインの使用
さて、前回公式プラグインを使用してみましたが作成したい場合についてみていきます。 公式ページのサンプルでは、 "6面、20面の2つのサイコロの出た目の値をメトリックとして投稿する"という例があります。 Rubyで書かれたものなのですが、これをPythonで書いてみました。(特に意味はないです) 汚いですが以下のような感じです。 サイコロの出た目を投稿するスクリプト(mackerel.py)
import os import json import datetime import random if os.environ.get('MACKEREL_AGENT_PLUGIN_META') == 1: #mackerel-agent起動確認 """グラフ定義""" meta = { 'graphs': { 'super.dice': { 'label': 'My Dice', 'unit': 'integer', 'metrics': [ { 'name': 'd6', 'label': 'Die (d6)' }, { 'name': 'd20', 'label': 'Die (d20)' } ] } } } print('# mackerel-agent-plugin') #メタ情報出力に必要 print(json.dumps(meta)) #辞書型からJSON形式へ変換し出力 #経過時間(秒)を計算 d = datetime.datetime.now() z = datetime.datetime(1970,1,1,0,0,0,0) i = d-z i = int(i.total_seconds()) #メトリックの投稿 result1 = ['super.dice.d6', random.randint(1,6), i] result2 = ['super.dice.d20', random.randint(1,20), i] result1 = list(map(str, result1)) result2 = list(map(str, result2)) result1 = '\t'.join(result1) result2 = '\t'.join(result2) print(result1) print(result2)
冒頭で"MACKEREL_AGENT_PLUGIN_META"という環境変数の値をチェックしてますが、 エージェントが起動していると値が"1"となるようです。 "# mackerel-agent-plugin"ですが、 これがないとメタ情報が無いと認識され、 グラフ定義が行えないようです。 グラフ定義は辞書型で定義したものをJSONに直して出力します。
最終的に "{metric name}タブ{metric value}タブ{epoch seconds}"の形式で 値を出力すればよいようです。
エージェント設定ファイルを編集します。(/etc/mackerel-agent/mackerel-agent.conf)
plugin.metrics.の後ろは任意の名称にできます。 commandへ先程作成したスクリプトをフルパスで入力します。
[plugin.metrics.dice] command = "python スクリプト名(フルパス)"
編集後、エージェントを再起動し投稿さていることを確認します。
長々とお付き合い頂きありがとうございました。 それではまた。