1. Qiita
  2. 投稿
  3. 監視

モニタリングサービス(Mackerel、Datadog、New Relic)を使ってみよう

  • 10
    いいね
  • 0
    コメント

はじめに

  • モニタリングサービスMackerelDataDogNewRelicについて簡単にまとめてみました。
  • サーバのリソース監視、ログ、プロセス監視ができれば良かったので、今回はAWSインテグレーション機能などについてはあっさりとしか触れてません。
  • どのサービスも、監視対象のサーバーを用意した状態で、15分あれば無料でサーバのリソースがモニタリングできるところまでいけます(そしてクレジットカードなどの登録は不要)ので、是非はじめてみてはどうでしょうか。

サービスの紹介

Mackerel(マカレル)

  • 「株式会社はてな」が提供しているサーバ管理・監視ツール
  • 監視/メトリクス
    • デフォルトで様々なメトリクスが取得されており、閾値を設定して監視することができる。(CPU,Network,Disk,Memory)
    • プロセスやログ監視などはサーバー上の設定ファイルに設定を追加することでとても簡単に実現できる。
    • プラグインを利用することでかなりの種類のミドルウェアのメトリクス可視化が可能
  • 通知
    • Email、Slack、HipChat、ChatWork、Lineなど幅広い通知先に対応
  • 料金
    • Standardで1ホスト1800円
  • Freeアカウント
    • Trialは14日でStandard相当の機能が利用可能。制約はあるが無料でも使い続けられる。
  • 気になった機能
    • http/httpsの外形監視が可能
    • AWSインテグレーション機能
      • MackerelのホストとしてAWSのサービスを登録できる。
      • 現在の対応サービスはEC2、ELB (CLB)、ALB、RDS、ElastiCache・Redshift。EC2だけではなくマネージドなサービスを監視できる。
  • 雑感
    • 日本語であることを差し引いてもマニュアルが親切で、試しているときに3つの中で一番躓かなかった
    • 設定がとてもシンプルでわかり易い(ログ監視、プロセス監視もDatadogみたいにpythonのスクリプト書かなくてもよい。)
    • 外形監視はMackerelしかない機能。
    • AWSインテグレーションは今日現在対応サービスがそんなにあるわけではないので、不足分はCloudWatchで補っていくのかな。

Datadog

  • Datadogが提供しているリソース管理・監視サービス
  • 監視/メトリクス
    • デフォルトで様々なメトリクスが取得されており、閾値などで監視が可能(CPU,Network,Disk,Memory)
    • プロセスの監視についてはサーバー上の設定ファイルに設定を追加し、実現する。
    • ログの監視は標準のログのフォーマット以外はカスタムのログのパーサをpythonで記載する必要がある。(後述)
    • HTTPの監視については外部からの監視ではなく、あくまでAgentからの監視のよう。
  • 通知
    • Email、HipChat、Pagerduty(インシデントとして登録)
    • 本文はカスタマイズ可能。日本語も使えました。
  • 料金
  • Freeアカウント
    • 14日間特に制限なしで利用可能(クレジットカードの登録不要)
  • 気になった機能
  • 雑感
    • マニュアルが揃っており、始めやすくUIも直観的。
    • インテグレーション機能が強烈
    • 異常値の検出機能など高度なモニタリングができ、今後の機能拡張も期待できそう
    • 日本語の情報源も多く、利用しているユーザも多そう。マニュアルも全部ではありませんが日本語で提供されている。

NewRelic Infrastructure

  • NewRelicが提供するモニタリングサービス
  • 監視/メトリクス
    • デフォルトで様々なメトリクスが取得されており、閾値で監視が可能(CPU,Network,Disk,Memory)
    • プロセスの監視もUIからできる。ログの監視についてはやり方が見つけられなかった。
  • プラン・料金
    • 30日間のFreeアカウントプランとEssential,Proという3つの体系
    • EssentialとProの違いはデータの保持期間(3日と13日)とEC2以外のモニタリングができるか否かのようです。
    • こちらのページを見て計算してみたのですが、インスタンスタイプや年払い、月払いで料金が異なるようです。
  • Freeアカウント
    • 14日間特に制限なしで利用可能(クレジットカードの登録不要)
  • 雑感
    • 製品ラインナップが多くて調べ始めたら混乱した。
    • Infrastructure単体で使うというよりAPMとセットで使うイメージがしっくりくる。サーバの監視はMackerelやDatadog、アプリケーションの監視としてピンポイントでAPMを導入するという形になる気がする。
    • Qiitaやブログの記事がDatadog,Mackerelと比べると少ない。販売代理店のページで翻訳されているマニュアルがある。

ためしてみる

Mackerel(マカレル)

セットアップ

  • ホストへのagentのインストールはすごく簡単
    • スタートガイドにURLがあるのでコピペします。
    • rpm,tar.gz,windows installerとか色々対応してます。
curl -fsSL https://mackerel.io/file/script/amznlinux/setup-all-yum.sh | MACKEREL_APIKEY='xxxxxxxxxxxxxxxxx' sh
  • 数秒後にホストの一覧を見てみると・・・

image

  • サービスとロールを設定してみる
    • サービスとは○○システムという単位
    • ロールというのはWEBサーバ、DBサーバというホストの役割を表すもの。
    • 今回はオンプレとAWSのホストをdemo-appというロールでまとめてみました。
  • CPU、メモリの状況などがロール単位にまとめてみることができます。

image

ログ監視

  • 今回の目的であるログ監視をやってみます。
  • ログ監視は公式サイトによるとプラグインを入れて設定するもののようです。

  • プラグインをインストールします

yum -y install mackerel-check-plugins
  • 設定を追加します
/etc/mackerel-agent/mackerel-agent.conf
[plugin.checks.test_log]
command = "check-log --file /home/ec2-user/test.log --pattern FATAL --return"
  • 設定を反映するためにエージェントを再起動します。
[root@ip-10-0-0-24 ec2-user]# service mackerel-agent restart
Stopping mackerel-agent:                                   [  OK  ]
Starting mackerel-agent:                                   [  OK  ]
[root@ip-10-0-0-24 ec2-user]#
  • FATALというメッセージを出してみましょう
echo "FATAL:message" >> /home/ec2-user/test.log
  • 正しく検知できました!(Alertは自動でCloseされるようです)

image

  • メモとか残せるのは気が利いていていいですね

image

プロセス監視

  • ログ監視と同じ感じで正規表現でプロセス名を指定します。
/etc/mackerel-agent/mackerel-agent.conf
[plugin.checks.check_demo_app]
command = "check-procs --pattern java8"
  • ちょっと待つとホストの表示画面の右側に現れます。

image

  • プロセスを切ってみると・・・ちゃんと検知します

image

  • プロセスを上げると自動でCloseされます

image

外形監視

  • warning,criticalにするレスポンスタイムや、アラートが発生している期間に一定の時間間隔で通知を再送する設定などかなり気が利いてる印象

image

  • 設定した内容は一覧で見ることができます。

image

  • サイトを停止して、ちょっと待つとアラートに引っかかります。復旧後自動でCloseされます。

image

Datadog

セットアップ

  • すごく簡単
  • Distributionとかツールを選ぶとスクリプトがでてくるのでコピペするだけです。

image

DD_API_KEY=xxxxxxxxxxxxxxxxxx bash -c "$(curl -L https://raw.githubusercontent.com/DataDog/dd-agent/master/packaging/datadog-agent/source/install_agent.sh)"
  • シンプルなホストの一覧。タグがつけられるのはどこも一緒
    • デフォルトのタイムゾーンをみて時間を表示してくれます。意外と嬉しい。

image

  • ホストを選択するとメトリクスをみれます

image

  • Metrics Explorerを使うとタグをつけたhostのメトリクスをまとめて見れたりします。ここはすごく柔軟でいいですね

image

プロセス監視

  • サンプルがあるのでコピーして使います
cp /etc/dd-agent/conf.d/process.yaml.example /etc/dd-agent/conf.d/process.yaml
  • sshとjavaのプロセスを監視してみます
/etc/dd-agent/conf.d/process.yaml
init_config:

instances:
- name: ssh
  search_string: ['ssh', 'sshd']

- name: demo-app
  search_string: ['java']
  • agentを再起動します
[root@ip-10-0-0-24 ec2-user]# service datadog-agent restart
Stopping Datadog Agent (using killproc on supervisord):    [  OK  ]
Starting Datadog Agent (using supervisord):                [  OK  ]
[root@ip-10-0-0-24 ec2-user]#
  • 以下のコマンドで取得できていることを確認します。
[root@ip-10-0-0-24 conf.d]# service datadog-agent info
====================
Collector (v 5.10.1)
====================
・・・・
  Checks
  ======

    process
    -------
      - instance #0 [OK]
      - instance #1 [OK]
      - Collected 12 metrics, 0 events & 2 service checks
  • Monitors -> Processを選択して監視を追加しましょう
    • メール通知するタイトルやメッセージは自由に変えられますし、日本語でも問題なく送信できました。

image

  • Javaのプロセスが死ぬとメールが飛んできて、画面もこんな感じになります

image

ログ監視

  • ログ監視を行うにはこちらを参照。
  • apacheのログとかアプリケーションのログのようなDatadog標準のフォーマットではないものについてはpythonでparseしてから送信する必要があるとのこと。
  • まずはこんなログをparseしてみます。
127.0.0.1 - - [31/Jan/2017:00:57:59 +0000] ERROR hogehogehoge
127.0.0.1 - - [31/Jan/2017:00:58:00 +0000] SUCCESS hogehogehoge
  • parserをpythonで書いて用意します。(見様見真似で書いたのでイケてるのかがわかりません)
/opt/datadog-agent/agent/checks/libs/test_log_parser.py
from time import strftime
import re
import time

def test_log_parser(log, line):

    regex = '([(\d\.)]+) - - \[(.*?)\] (.*?) (.*?)'
    parsed = list(re.match(regex, line).groups())

    event = {}
    event["aggregation_key"]  = "test.log-monitor"
    event["timestamp"] = int(time.time())
    event["msg_title"] = "Test log monitor / Log Level: " + parsed[2]
    event["msg_text"] = "message: " + parsed[3]

    if re.match('^ERROR$', parsed[2]):
        event["alert_type"] = "ERROR"
        event["event_type"] = "event.error"
    else:
        event["alert_type"] = "INFO"
        event["event_type"] = "event.info"

    return [event]
  • Datadogの設定に食べさせて、agentを再起動します。
/etc/dd-agent/datadog.conf
dogstreams: /var/log/test.log:/opt/datadog-agent/agent/checks/libs/test_log_parser.py:test_log_parser
[root@ip-10-0-0-24 libs]# service datadog-agent restart
Stopping Datadog Agent (using killproc on supervisord):    [  OK  ]
Starting Datadog Agent (using supervisord):                [  OK  ]
  • こんなログが出てればOK
/var/log/datadog/collector.log
2017-01-31 01:46:32 UTC | INFO | dd.collector | checks.collector(datadog.py:143) | Instantiating function-based dogstream
2017-01-31 01:46:32 UTC | INFO | dd.collector | checks.collector(datadog.py:150) | dogstream: parsing /var/log/test.log with <function test_log_parser at 0x7f7bb5bcc410> (requested /opt/datadog-agent/agent/checks/libs/test_log_parser.py:test_log_parser)
  • ログを流してあげるとEventのページに表示されます
echo "127.0.0.1 - - [31/Jan/2017:00:58:05 +0000] SUCCESS hogehogehoge5" >> /var/log/test.log
echo "127.0.0.1 - - [31/Jan/2017:00:57:59 +0000] ERROR hogehogehoge" >> /var/log/test.log

image

  • NewMonitor -> Eventから監視を設定します

画面上部にイベントが表示されていて、Select events to countの値を変更するとフィルタされた値が表示されています。

image

  • ERRORの時にちゃんとアラートが飛びました。

image


NewRelic Infrastructure

セットアップ

  • DataDog,Macherelと違って少しだけ手順を踏みます。
    • アクセスキーの登録
    • yumリポジトリの設定
    • yumでのインストール
  • 少し待って画面上部の「INFRASTRUCTURE」をクリックするとモニター画面が現れます。
    • タイムゾーンはデフォルトタイムゾーンで表示してくれます。残念ながらAlertsは対応がまだのようでUTC or PSTの表示になります。

image

  • Alertの設定

image

APM(蛇足)

ついでにAPMも試してみようと思ったのですが、今回使っているJavaのアプリケーションはSpringBootで作っておりますが、ApplicationServerのルートディレクトリがないものには対応していないようでした。残念。

公式ドキュメントを参考にすればイメージがつくかと思います。