ようへいの日々精進XP

よかろうもん

sensu で Elasticsearch にメトリクスを突っ込む handler を書いた

はじめに

  • 前回のついででメトリクスを Elasticsearch に突っ込む handler を作ってみた
  • 決して Graphite を諦めたわけではありませんが...
  • 試した環境は Amazon Linux です
  • [追記]「メトリクスデータ」という言葉に違和感あったので「メトリクス」に直した*1

スクリプト

github

  • 人様にお見せ出来る代物ではありませんが...アップしました

レッツモニタリング!

config.json に elasticsearch-metrics.rb を使うぞーという設定を行う

/etc/sensu/config.json に以下のような設定を行う。

    "elasticsearch-metrics":{
      "type": "pipe",
      "command": "/etc/sensu/handlers/elasticsearch-metrics.rb"
    }

ディスク使用量を監視するスクリプトを設置

以下を /etc/sensu/conf.d/metric_disk_usage.json というファイル名で保存する。(ファイル名にルールが無いのが良い点でもあり悪い点でもある...)

{
  "checks": {
    "disk_usage_metrics": {
      "type": "metric",
      "handlers": ["elasticsearch-metrics"],
      "command": "/etc/sensu/plugins/system/disk-usage-metrics.rb",
      "subscribers": [
        "conohi","mon"
      ],
      "interval": 60
    }
  }
}

disk-usage-metrics.rb をダウンロードしてくる。

cd /etc/sensu/plugins/system/
wget https://raw.githubusercontent.com/sensu/sensu-community-plugins/master/plugins/system/disk-usage-metrics.rb

Load Average を監視するスクリプトの設置

以下を /etc/sensu/conf.d/metric_load.json というファイル名で保存する。

{
  "checks": {
    "load_metrics": {
      "type": "metric",
      "handlers": ["elasticsearch-metrics"],
      "command": "/etc/sensu/plugins/system/load-metrics.rb",
      "subscribers": [
        "conohi","mon"
      ],
      "interval": 60
    }
  }
}

load-metrics.rb をダウンロードしてくる。

cd /etc/sensu/plugins/system
sudo wget https://raw.githubusercontent.com/sensu/sensu-community-plugins/master/plugins/system/load-metrics.rb

Elasticsearch にメトリクスを突っ込むスクリプトの用意

elasticsearch-metrics.rb を適当に /etc/sensu/handlers 辺りに保存する。

sudo wget https://raw.githubusercontent.com/inokappa/sensu-handler-metrics-elasticsearch/master/elasticsearch-metrics.rb

さらに elasticsearch-metrics.json/etc/sensu/conf.d に保存する。

sudo wget https://raw.githubusercontent.com/inokappa/sensu-handler-metrics-elasticsearch/master/elasticsearch-metrics.json

elasticsearch-metrics.jsonelasticsearch-metrics.rb を使う為の設定(Elasticsearch のホスト名、ポート番号等)が定義されている。

Elasticsearch 側の注意点

  • mapping をちゃんと考えておく...の一言に尽きる。ディスク使用量は Integer で Load Average は float にとか...
  • 監視項目毎にインデックス分けた方が良さそう

以下のような mapping 定義の template を試した。

// ディスク使用量のデータを放り込むインデックスの mapping template
curl -XPUT localhost:9200/_template/template_1 -d '
{
    "template" : "sensu-metrics*",
    "mappings" : {
      "disk_usage_metrics" : {
        "properties" : {
          "@timestamp" : { "type":"date", "format":"dateOptionalTime" },
          "client" : {type: "string"},
          "status": {type: "long"},
          "address": {type: "string"},
          "check_name": {type: "string"},
          "occurrences": {type: "long"},
          "value": {type: "float"},
          "command": {type: "string"},
          "key": {type: "string"}
          }
        }
      }
    }
  }
'

// Load Average のデータを放り込むインデックスの mapping template
curl -XPUT localhost:9200/_template/template_2 -d '
{
    "template" : "sensu-metrics*",
    "mappings" : {
      "load_metrics" : {
        "properties" : {
          "@timestamp" : { "type":"date", "format":"dateOptionalTime" },
          "client" : {type: "string"},
          "status": {type: "long"},
          "address": {type: "string"},
          "check_name": {type: "string"},
          "occurrences": {type: "long"},
          "value": {type: "float"},
          "command": {type: "string"},
          "key": {type: "string"}
          }
        }
      }
    }
  }
'

kibana へ

Elasticsearch にデータが入ったということで、お待ちかねの kibana での可視化。

ディスク使用量のスクリーンショット

f:id:inokara:20140323090634p:plain

Load Average のメトリクスを可視化しているスクリーンショット

f:id:inokara:20140323090647p:plain


実際に運用する際のポイント等

  • Elasticsearch のインデックスの設定やマッピングの定義をちゃんと考慮するべき
  • メトリクスを突っ込む間隔、インデックスのローテーション等も合わせて考慮が必要

kibana の Histgram を利用する際のポイント

Histgram の Panel 設定のデフォルトは下図のようになっている。

f:id:inokara:20140323092222p:plain

以下のように修正する。

f:id:inokara:20140323092237p:plain

*1:計算や分析を加えてわかりやすいデータ(数値)に変換したのがメトリクス