Help us understand the problem. What is going on with this article?

PHP で超簡単に Mackerel のサーバーメトリクスを増やす

Mackerel 楽でいいですね。

サーバー上で変化する数値ならだいたい何でもグラフになります。ただ、データ取得方法が自社サービス固有のなにかだった場合、既存のプラグインでは対応できません。

そんなときは Mackerel に独自のメトリクスを増やします。難しそう? Go で書かないとだめ? いやいや、ほんと超簡単ですから。

というわけで、PHP のアプリケーション開発を例に、どれだけ簡単にできるかを説明しましょう。コード例は Symfony ですが、CLI コマンドをサポートする任意のフレームワークで同じ方法が通じます。(じっさい自分が運用してるのは Yii で動いてます)

まずは ちょっと便利なライブラリ を Composer で追加します。

composer require phplucidframe/console-table

CLI コマンドを追加します。

<?php
namespace App\Command;

use LucidFrame\Console\ConsoleTable;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class MackerelDemoCommand extends Command
{
    public static $defaultName = 'app:mackerel-demo';

    protected function configure()
    {
        $this->setDescription("Describes the easiest way to create Mackerel plugin");
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // Prepare random demo data...
        $data = [
            'app.mackerel-demo.sample' => time() % 10000,
            'app.mackerel-demo.2nd-sample' => mt_rand(0, 99999) / 100.0,
            'app.mackerel-demo.3rd-sample' => mt_rand(0, 9999) / 100.0,
        ];

        // Output them to STDOUT.
        $output->write($this->format($data), time());

        return 0;
    }

    private function format(iterable $data, int $timestamp): string
    {
        ob_start();
        $t = new ConsoleTable();
        foreach ($data as $k => $v) {
            $t->addRow([$k, $v, $timestamp]);
        }
        $t->hideBorder()->display();
        return ob_get_clean();
    }
}

はい実装おしまい。

ちょっと冗長なところはありますが、重要なのは $data = に何を入れるかと、そのフォーマット方法だけです。(ConsoleTable できれいな出力を心がけてますが、ぶっちゃけ半角スペースで区切られた3ワードの項目名+数値+タイムスタンプなら何でもOK)

$ bin/console app:mackerel-demo
 app.mackerel-demo.sample      1735    1552545393
 app.mackerel-demo.2nd-sample  545.49  1552545393
 app.mackerel-demo.3rd-sample  23.8    1552545393

Mackerel のプラグインというのは実は、実行可能で標準出力にこういう形式の出力をするものなら何でもありです。自社サービス固有のなにかを、固有の方法で取得して、ここでいう $data に突っ込めばいいのです。PHP配列が「順序ありキーバリュー」になってるところがスマートですね。

このコマンドを mackerel-agent.conf に追加してやれば、独自コマンドをポーリングして Mackerel のコンソールに定期報告が来るというわけです。

/etc/mackerel-agent/mackerel-agent.conf
apikey = "XXXXXXXXXXXXXXXXXXXXXXXXX"
  :
 (略)
  :
[plugin.metrics.app]
command = "/app/current/bin/console app:mackerel-demo"

mackerel-agent デーモンの再起動はお忘れなく。

サーバーの負荷と連動する種類のビジネスの動きを、同じグラフで見ることができると便利です。負荷アラートが出てしまう前に、ユーザーの動向を察知するアラートで予告してくれるとかもできて、かっこいいですよ。

ぱっと考えられるのは、直近のアクティブユーザー数とか、分速で何個いいねが付いてるかとか... SQL の集計関数で(インデックスさえ適切なら)サクッと出せそうです。

難しい技術は不要。フレームワークがあるならほんの少し、やりたいことをコードにするだけ。独自 Mackerel プラグインは、何を計測すると便利かというアイデアの勝負なので、そのあたり PHP で軽快にやる人と相性良さそうな気がします。

もちろん Ruby なら Rake タスクでも! あと以下略

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away