モニタリングサービス（Mackerel、Datadog、New Relic）入門！

# はじめに

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


---

# サービスの紹介

## **[Mackerel（マカレル）](https://mackerel.io/)**

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

## **Datadog**

* **Datadogが提供しているリソース管理・監視サービス**
* **[監視/メトリクス](http://docs.datadoghq.com/ja/monitoring/#metric)**
    * デフォルトで様々なメトリクスが取得されており、閾値などで監視が可能（CPU,Network,Disk,Memory）
    * プロセスの監視についてはサーバー上の設定ファイルに設定を追加し、実現する。
    * [ログの監視](http://docs.datadoghq.com/ja/guides/logs/)は標準のログのフォーマット以外はカスタムのログのパーサをpythonで記載する必要がある。（後述）
    * [HTTPの監視](http://docs.datadoghq.com/ja/guides/agent_checks/)については外部からの監視ではなく、あくまでAgentからの監視のよう。
* **通知**
    * Email、HipChat、Pagerduty（インシデントとして登録）
    * 本文はカスタマイズ可能。日本語も使えました。
* **[料金](https://www.datadoghq.com/pricing/)**
    * 無償(5台まで)、Pro（1000台まで1台\$15/month）、Enterprise(1000台以上1台\$23/month）
    * その他は[公式：課金に関するFAQ(日本語）](http://docs.datadoghq.com/ja/guides/billing/)参照
* **Freeアカウント**
    * 14日間特に制限なしで利用可能（クレジットカードの登録不要）
* **気になった機能**
    * **[インテグレーション機能] (https://www.datadoghq.com/product/integrations/)**
        * サポートされているミドルウェアやクラウドの種類がとにかく多いですね。
        * AWSでいうとほぼすべてのサービスをサポート（メトリクスの細かさまでは未調査）
    * **高度なモニタリング機能**
        * [Outlier Detection](http://docs.datadoghq.com/ja/guides/outliers/)
            * 外れ値を検出できる機能
        * [Anomaly Detection](http://docs.datadoghq.com/ja/guides/anomalies/)
            * 過去のデータを参照して普段とは異なる挙動を検出
        * [Datadog でストレージがあと何ヶ月で枯渇するかを予測する](http://qiita.com/spesnova/items/d37927bcc37fed6d12b0)
* **雑感**
    * マニュアルが揃っており、始めやすくUIも直観的。
    * インテグレーション機能が強烈
    * 異常値の検出機能など高度なモニタリングができ、今後の機能拡張も期待できそう
    * 日本語の情報源も多く、利用しているユーザも多そう。マニュアルも全部ではありませんが[日本語で提供](http://docs.datadoghq.com/ja/)されている。

## **[NewRelic Infrastructure](https://newrelic.com/infrastructure)**

* **NewRelicが提供するモニタリングサービス**
    * **NewRelicといえば、アプリケーションの性能監視(APM)。**
        * Ruby,PHP,Python,Java,.Net,Go,nodeに対応
        * 少し古いですが[パフォーマンス監視サービスのNew Relicが超便利な件](http://qiita.com/y_uuki/items/dd4fce78b1bc32b64600)を見てもらえればイメージつくと思いますがかなり詳細に取得できます。
    * サーバのモニタリングは[Infrastructure](https://newrelic.com/infrastructure)というサービスになる。
* **監視/メトリクス**
    * デフォルトで様々なメトリクスが取得されており、閾値で監視が可能（CPU,Network,Disk,Memory）
    * プロセスの監視もUIからできる。ログの監視についてはやり方が見つけられなかった。
* **[プラン・料金](https://newrelic.com/infrastructure/pricing)**
    * 30日間のFreeアカウントプランとEssential,Proという3つの体系
    * EssentialとProの違いはデータの保持期間（3日と13日）とEC2以外のモニタリングができるか否かのようです。
    * [こちら](https://newrelic.com/infrastructure/pricing)のページを見て計算してみたのですが、インスタンスタイプや年払い、月払いで料金が異なるようです。
* **Freeアカウント**
    * 14日間特に制限なしで利用可能（クレジットカードの登録不要）
* **雑感**
    * 製品ラインナップが多くて調べ始めたら混乱した。
    * **Infrastructure単体で使うというよりAPMとセットで使うイメージがしっくりくる。サーバの監視はMackerelやDatadog、アプリケーションの監視としてピンポイントでAPMを導入するという形になる気がする。**
    * Qiitaやブログの記事がDatadog,Mackerelと比べると少ない。[販売代理店のページ](https://newrelic.degica.com/docs)で翻訳されているマニュアルがある。

---

# ためしてみる

## **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](https://qiita-image-store.s3.amazonaws.com/0/57686/880ae7a1-f47f-21f3-8d53-3a0eccae9dc5.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/fd9a0969-1206-dc56-a604-4ed6e92fb91d.png)

### ログ監視

* 今回の目的であるログ監視をやってみます。
* ログ監視は[公式サイト](https://mackerel.io/ja/docs/entry/howto/check/log)によるとプラグインを入れて設定するもののようです。

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

```
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](https://qiita-image-store.s3.amazonaws.com/0/57686/5e613254-711f-0080-62e9-f532e6c37c04.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/823c60e4-5292-1a21-d592-bf3f047851d2.png)


### プロセス監視

* ログ監視と同じ感じで正規表現でプロセス名を指定します。

```/etc/mackerel-agent/mackerel-agent.conf
[plugin.checks.check_demo_app]
command = "check-procs --pattern java8"
```

* ちょっと待つとホストの表示画面の右側に現れます。

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/e1078cc0-b704-6bb2-1b95-aa49c5a0d9d7.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/21d7672b-8a90-89a2-f524-ac4cc0217595.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/753e3e72-7fe9-5123-bb0d-addcaa9c9b45.png)

### 外形監視

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/ebc2441e-a47a-8434-c26c-557f09568c75.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/afeddf6a-6560-fd1c-9d02-6565eb1153d6.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/810d5959-7e8a-945e-0e78-262e0b7299a7.png)


## **Datadog**

### セットアップ

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/243b6862-2bb0-4bf2-11f4-1e4536ac51c9.png)

```
DD_API_KEY=xxxxxxxxxxxxxxxxxx bash -c "$(curl -L https://raw.githubusercontent.com/DataDog/dd-agent/master/packaging/datadog-agent/source/install_agent.sh)"
```

* シンプルなホストの一覧。タグがつけられるのはどこも一緒
    * デフォルトのタイムゾーンをみて時間を表示してくれます。意外と嬉しい。

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/995615d4-e816-835d-7236-f731b84573fc.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/f09a83c6-1883-a5da-7379-77de0bb34006.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/8535f572-87d9-f859-6fc0-64ee4604cd5e.png)



### プロセス監視

* サンプルがあるのでコピーして使います

```
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](https://qiita-image-store.s3.amazonaws.com/0/57686/cf8fa556-375c-917b-a712-7360f77b0913.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/1f029d76-d7ef-ad51-5c4b-6fe14458eb75.png)

### ログ監視

* ログ監視を行うには[こちら](http://docs.datadoghq.com/ja/guides/logs/)を参照。
* 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](https://qiita-image-store.s3.amazonaws.com/0/57686/8a7b0944-15d2-e561-eb0c-76f2bf07ee41.png)


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

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/e2f11560-d5bb-b620-d48c-e880aec56206.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/09011d2e-20f8-4a99-dce1-477a9f184e25.png)


---

## **[NewRelic Infrastructure](https://newrelic.com/infrastructure)**

### セットアップ

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

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/8079a2ce-43e8-f5c2-ee6f-ddcdebeef1eb.png)

* Alertの設定

![image](https://qiita-image-store.s3.amazonaws.com/0/57686/fda68088-e386-16f6-af90-cef6a861de66.png)

### APM（蛇足）

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

[公式ドキュメント](https://newrelic.com/java)を参考にすればイメージがつくかと思います。