ども、cloudpackかっぱ (@inokara) です。

追記

REGION の指定が出来るようにプルリクエストしたら取り込まれたので git pull して bundle install したら以下のように環境変数に指定して Tasseo を起動します。

export AWS_ACCESS_KEY_ID=AKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export AWS_REGION=ap-northeast-1
foreman start

はじめに

Tasseo というちょっと変わった(と思っている)可視化ツールがありまして…。その Tasseo は CloudWatch のメトリクスも表示することが出来るということで試してみました。

Tasseo とは

Tasseo で CloudWatch のメトリクスを表示させる: Tasseo とは

ざっくり

  • Tasseo is a lightweight, easily configurable, near-realtime dashboard for time-series metrics.
  • 時系列データベース用の軽量、簡単設定、リアルタイムっぽいダッシュボード

github

実装は

以下のようなツールで実装されています。

  • AWS SDK for JavaScript
  • Sinatra
  • D3.js
  • rickshaw
  • underscore.js

Sinatra は HTTP リクエストを処理するだけに使用されていて 100 行程度とコンパクトな作りになっているようです。コアは JavaScript で書かれているこの部分です。

選べるバックエンド

Tasseo 単体では何もできませんが、以下のような時系列データベース等をバックエンドとして利用可能です。

  • Graphite
  • Librato
  • InfluxDB
  • Amazon CloudWatch

機能としては

  • 各種バックエンドに蓄積された時系列データのメトリクスを表示
  • しきい値を設けて表示させる色を変えることも可能(デフォルトは緑)
  • 設定ファイルは /dashboard/ ディレクトリ以下に JavaScript で書かれたファイルを置くだけ
  • GitHUB のアカウント認証が利用出来る

せっかくなんで CloudWatch のメトリクスを表示させてみる

試した環境

  • Ubuntu 14.04(Docker コンテナ)
  • Ruby 2.1.5p273

インストール

適当なディレクトリに git clone して bundle install します。

git clone https://github.com/obfuscurity/tasseo.git
cd tasseo
bundle install

アクセスキーとシークレットキー

事前に IAM ユーザーを用意しておいて CloudWatch に対するリードオンリー権限を付与しておきましょう。

export AWS_ACCESS_KEY_ID=AKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

環境変数にセットしておきましょう。

設定ファイルの用意

設定ファイルは JavaScript のフォーマットで記載する必要がありますが、イチイチ書くのはカッタルイので設定ファイルを生成するスクリプトを用意しました。以下はステータスが Running である EC2 インスタンスのインスタンス ID を取得して CloudWatch メトリクス用の設定ファイルを生成します。

実行すると以下のような設定ファイルが生成されます。

var period = 60;
var refresh = 1 * 60 * 1000;
var usingCloudWatch = true;
var metrics = [
{
  "target": "CPUUtilization(%)",
  "Namespace": "AWS/EC2",
  "MetricName": "CPUUtilization",
  "Statistics": [
    "Average"
  ],
  "Dimensions": [
    {
      "Name": "InstanceId",
      "Value": "${instance_id}"
    }
  ]
},
{
  "target": "DiskReadOps(Num)",
  "Namespace": "AWS/EC2",
  "MetricName": "DiskReadOps",
  "Statistics": [
    "Average"
  ],
  "Dimensions": [
    {
      "Name": "InstanceId",
      "Value": "${instance_id}"
    }
  ]
},
(略)
{
  "target": "NetworkOut(Byte)",
  "Namespace": "AWS/EC2",
  "MetricName": "NetworkOut",
  "Statistics": [
    "Average"
  ],
  "Dimensions": [
    {
      "Name": "InstanceId",
      "Value": "${instance_id}"
    }
  ]
}
]

設定ファイルは dashboards ディレクトリ以下に置くことで利用可能となります。

尚、period = 60 で 60 分毎の Statistics な値を取得します。また、Tasseo はデフォルトで 2000ms 毎にブラウザをリロードしてリアルタイムっぽさを実現していますが、refresh = 1 * 60 * 1000 で 60 秒毎にリロードして取得するようにデフォルト値を上書きしています。

ちょっと修正

実は tasseo パイセンの CloudWatch メトリクスの取得先は us-east-1 に固定されてしまっているのでちょっと修正してリージョンも環境変数から渡せるように修正しました。

修正する必要があるファイルは lib/tasseo/views/index.hamllib/tasseo/public/j/tasseo.js の二つのファイルです。

--- lib/tasseo/views/index.haml.bk      2014-12-22 21:55:25.753600656 +0000
+++ lib/tasseo/views/index.haml 2014-12-22 21:56:02.464083743 +0000
@@ -53,13 +53,14 @@
           var influxDbAuth = "#{ENV['INFLUXDB_AUTH']}";
           var awsAccessKeyId = "#{ENV['AWS_ACCESS_KEY_ID']}";
           var awsSecretAccessKey = "#{ENV['AWS_SECRET_ACCESS_KEY']}";
+          var awsRegion = "#{ENV['AWS_REGION']}";

           if (libratoAuth != "") {
             datasource = new TasseoLibratoDatasource(libratoAuth)
           } else if (influxDbUrl != "") {
             datasource = new TasseoInfluxDBDatasource(influxDbUrl, influxDbAuth)
           } else if (typeof usingCloudWatch != 'undefined' && usingCloudWatch) {
-            datasource = new TasseoAWSCloudWatchDatasource(awsAccessKeyId, awsSecretAccessKey)
+            datasource = new TasseoAWSCloudWatchDatasource(awsAccessKeyId, awsSecretAccessKey, awsRegion)
           } else {
             var graphiteOptions = {}
             if (typeof padnulls != 'undefined') graphiteOptions['padnulls'] = padnulls;

環境変数 AWS_REGION を引き回す作戦です。

--- lib/tasseo/public/j/tasseo.js.bk    2014-12-22 21:57:18.314990023 +0000
+++ lib/tasseo/public/j/tasseo.js       2014-12-22 21:58:33.934448252 +0000
@@ -357,11 +357,10 @@

 /* AWSCloudWatch datasource */

-function TasseoAWSCloudWatchDatasource(accessKeyId, secretAccessKey, options) {
+function TasseoAWSCloudWatchDatasource(accessKeyId, secretAccessKey, region, options) {
   this.options = _.extend({}, options);
   AWS.config.update({accessKeyId: accessKeyId, secretAccessKey: secretAccessKey});
-  //AWS.config.region = 'us-east-1';
+  AWS.config.region = region ;
   this.client = new AWS.CloudWatch();
 }
 

ですので、tasseo を実行する前に export AWS_REGION=ap-northeast-1 も実行しておきましょう。

export AWS_REGION=ap-northeast-1

Tasseo 起動

Tasseo を起動してみましょう。Tasseo は foreman でプロセスを管理します。

cd tasseo/
foreman start

以下のように Tasseo が起動します。
Tasseo で CloudWatch のメトリクスを表示させる: Tasseo の起動確認

Tasseo はデフォルトで起動したホストの 5000 番で Listen します。

ブラウザでアクセス

とりあえずブラウザでアクセスしてみましょう。
Tasseo で CloudWatch のメトリクスを表示させる: Tasseo の起動確認 (ブラウザ) (1)

今回は三台のインスタンスを利用しましたので三つのリンクが並んでいますのでそのうちの一つをクリックしてみます。
Tasseo で CloudWatch のメトリクスを表示させる: Tasseo の起動確認 (ブラウザ) (2)

yes コマンドで暫く負荷をかけた状態なので数値的に大きくなっていますがちゃんと値は取得出来ていますね!

ということで

Tasseo 使うと何がいいの?

ちゃんとした値を見たいのであればマネジメントコンソールから CloudWatch のコンソールを見たほうがいいかなと思いますが、見たいメトリクスのざっくりとした傾向をできるだけ一つの画面で(ほぼ)リアルタイムに見たいと思ったら Tasseo 使ってもいいのかなと。後は EC2 や RDS や ElastiCache 等の各サービスを横断したメトリクスを表示させたい時もあると思いますが、そんな時にサクッと JavaScript っぽい設定ファイルを書くだけでオリジナルのダッシュボードが作れるのも魅力だと思います。

何が出来ないのか

あくまでも API 叩いて値を取得して表示させるだけの機能(シンプルと言えばシンプル)なので CloudWatch のメトリクスを二週間以上保持したいといった用途には利用出来ませんし、もちろん通知もありません。

とは言っても

バックエンドとして CloudWatch 以外にも Graphite や InfluxDB も利用出来たりしますので引き続き触ってみたいと思いますよ!

レッツメトリクス。

元記事はこちらです。
consul のロギング