Philips hueで、Jenkinsでビルドが失敗する度にパカパカするやつ作った

January 10, 2014 | by | hue

どうも、@jacopenです。

昨年買ったPhilips hue。以前のエントリーでも書いたとおり、hueのウリとしてAPIを叩けるというものがあります。

色々遊べるハイテク照明 「Philips hue」のAPIを叩いてみた。 http://blog.udcp.net/2013/10/09/philips-hue-api/

・・・ということで、Jenkinsからhue APIを叩いて、テストが失敗する度にhueで通知する仕組みをつくりました。

コケるとこんな感じでパカパカします。

仕組み

Jenkinsにはhue-lightというプラグインがあり、これを使っても通知ができるのですが、 – APIの投げ先にIPアドレスしか指定できない – ポートが指定できない

という欠点があります。インターネットから自宅のhueへは、間にnginxリバースプロキシを挟んで名前ベースのバーチャルホストを設定しているため、個人的にこの欠点は致命的です。 プラグインに手をいれることも考えたのですが、もともとhueのAPIは非常にシンプルなため、プラグインを利用しない形で作ってみました。

解説

hueのグループ作成

hueの電球をひとつひとつ制御することもできるのですが、今回は一斉にアクションさせたいため、電球をグループ化します。

まず、hueのdebuggerを開きます。 http:///debug/clip.html

そして、URLに

/api/<username>/groups

Bodyに {“name”: “All”, “lights”: ["1", "2", "3"]}

と入力します。nameの中身は好きなもので構いません。lightsは、グループ化したい電球のIDを配列でいれます。買い足していなければ、1, 2, 3となるはず。 これでPOSTすれば、グループが作成されます。

API_Debug_tool-2

余談ですが、hueのapiドキュメントではこのCreate groupがNot supportedとなっています。でも、ふつうに使えます。謎。 http://developers.meethue.com/2_groupsapi.html

JenkinsのJobの作成

JenkinsのJobは、シェルの実行でこのように書きました。

#!/bin/sh
bundle exec rake spec #実行したいテスト
status=$?

if [ $status -ne 0 ]; then
curl http://hue.udcp.info/api/username/groups/1/action -X PUT -d '{"alert": "select"}'
sleep 1
curl http://hue.udcp.info/api/username/groups/1/action -X PUT -d '{"alert": "select"}'
sleep 1
curl http://hue.udcp.info/api/username/groups/1/action -X PUT -d '{"alert": "select"}'
fi

exit $status

テストのステータスコードをstatusフラグに代入し、0以外のときにhue APIを直接叩いています。 groupsのactionに{“alert”: “select”}を渡すところがキモです。

{“alert”: “select”}を渡すと、1回だけ電球がパカッと点滅します。 それを1秒ごとに3回投げているわけです。

今回は色を変えずにalert:selectしているだけですが、もうちょっと手を加えれば色を変えたり、電球によってアクションのタイミングをかえたり、自在にできると思います。 curlだけで簡単に叩けるのがいいですねー。

No Comments »

Cloudn PaaSにRails+PostgreSQLなアプリケーションをデプロイする方法

January 3, 2014 | by | cloudfoundry

どうも、@jacopenです。

パクえ先生がCloudn PaaSにRailsアプリケーションをデプロイするエントリーを書いてくださっています。

色々なクラウド上にサービスを立上げてみます [第5回目 Cloudn編]
http://blog.cloudninja.asia/?p=5957

が、情報がが不十分で分かりづらいという感想を頂いてしまいました。すみません・・・

このエントリーでは、Cloudn PaaSにPostgreSQLを使ったRailsアプリケーションをデプロイするところまでを、一通りやってみます。

Railsアプリケーションの準備

今回使っている環境はRuby 1.9とRails3.2が入ったMac(Mavericks)です。brew install postgresqlで、postgresの実行環境も入っています。

まずはRailsアプリケーションを作るため、rails newします。
今回はPostgresをバインドしていることを確認したいため、簡単なデータ登録をやってみましょう。なので、scaffoldを使って簡単な画面も作っておきます。

$ rails new cloudn
(中略)
$ cd cloudn
$ rails generate scaffold entry title:string body:string
(中略)

Gemfileの修正

(1) 今回はPostgreSQLを使う前提なので、Gemfileにpgを追加します。

#gem 'sqlite3'   #コメントアウト
gem 'pg'

(2) jquery-railsをcloudfoundry-jquery-railsに変更

ここ、分かりづらいポイントなので注意です。Cloud Foundry+Ruby 1.9環境でのjquery-railsに若干問題があるため、cloudfoundry向けに手が入ったものに差し替えます。

#gem 'jquery-rails'
gem 'cloudfoundry-jquery-rails'

Gemfileの修正はこの2点です。PostgreSQLではなくMySQLを使いたい場合は、gem ‘mysql2′に読み替えればOK。

bundle install

bundle packageとbundle installします。

$ bundle package
$ bundle install

assets precompile

ここは先のエントリーでパクえ先生も実行されてますが、assets precompileをやっておきます。

config/environments/production.rbの中のconfig.serve_static_assetsを

config.serve_static_assets = true

と変更し

bundle exec rake assets:precompile

します。
これでRails側の準備は完了です。

UDN環境の準備

Cloudn PaaSにデプロイを行うためのudnコマンドをセットアップします。

gem install udn

udnコマンドではなく、Cloud Foundry(v1)標準のvmcコマンドも利用できます。ですが、vmcコマンドの最新版は安定していないため、古いバージョンの利用をお勧めします。

gem install vmc -v 0.3.23

次に、ポータルのAPIアクセスキー・秘密鍵管理画面から、APIアクセスキーと秘密鍵をコピーしておきます。

api

最後にログインします。

$ udn login
Attempting login to [http://api.cloudnpaas.com]
Email: <APIアクセスキー>@cloudnpaas.com
Password: 秘密鍵
Successfully logged into [http://api.cloudnpaas.com]

これでCloudn PaaS側の準備は終わりです。

デプロイする!

早速デプロイしてみましょう。

$ udn push 
Would you like to deploy from the current directory? [Yn]:  #そのままEnter
Application Name: cloudn-rails-pg   #アプリケーション名を入力

このディレクトリをデプロイしていい?とのことなのでそのまま進み、アプリケーション名を入力します。アプリケーション名は自分がデプロイ済の他のアプリと被っていなければ何でも構いません。

Detected a Rails Application, is this correct? [Yn]: #そのままEnter
Application Deployed URL [cloudn-rails-pg.cloudnpaas.com]: #そのままEnter

Railsが自動検出されているのでそのままEnter。次に、URLを決めます。URLを変更したい場合は入力。今回はこのままで良いのでEnterを押します。

Memory reservation (128M, 256M, 512M, 1G, 2G) [256M]: #デプロイしたいメモリサイズを入力
How many instances? [1]: #インスタンス数。今回は1で。

デプロイするアプリケーションの性能を決める場所です。メモリサイズはそのままアプリケーションが利用できるメモリサイズとなります。インスタンス数は、サーバーの数と考えれば良いでしょう。今回は1インスタンスで構わないので、そのままEnterを押します。

Bind existing services to 'cloudn-rails-pg'? [yN]: #そのままEnter
Create services to bind to 'cloudn-rails-pg'? [yN]: #yを入力
1: memcached
2: mongodb
3: mysql
4: postgresql
5: rabbitmq
6: redis
What kind of service?: 4  #4(postgresql)を入力
Specify the name of the service [postgresql-7704d]: #そのままEnter

今回のキモとなるPostgreSQLですね。最初は、作成済みのServices(DBとか)をアプリケーションに紐付けるか?と聞かれています。今回は新規作成するので、N(そのままEnter)とします。

次に、新しいServicesを作るか?と聞かれているので、yとします。
作成できるService一覧が出るので、postgres(4)を入力し、Enterを押します。Service名はそのままで構わないのでEnterで進みます

Create another? [yN]:  #そのままEnter
Would you like to save this configuration? [yN]:  #そのままEnter

他に作る?と聞かれているのでN(そのままEnter)、この設定を保存する?と聞かれているので、ここもそのままEnterを押します。
ここでyを入力すると、manifest.ymlというファイルが作成され、これまで一連のながれで設定したものが保存されます。次回以降、udn pushした際にそれが自動的に使われるようになります。

Creating Application: OK
Creating Service [postgresql-7704d]: OK
Binding Service [postgresql-7704d]: OK
Uploading Application:
  Checking for available resources: OK
  Processing resources: OK
  Packing application: OK
  Uploading (2M): OK
Push Status: OK
Staging Application 'cloudn-rails-pg': OK
Starting Application 'cloudn-rails-pg': OK

できましたー。

Ruby_on_Rails__Welcome_aboard

いつもの画面ですね。

Cloudn

Scaffoldで作った画面も出ています。

Cloudn-2

データ登録もできました。

QA

Q. Railsのdatabase.ymlはどうすればいいの?
A. なにもしなくていいです

database.ymlは、PaaS側が自動で書き換えてくれるので変更する必要はありません。
今回PostgreSQLをバインドしましたが、アプリケーションにバインドした時点で自動で設定してくれます。
Gemfileにはsqliteとpg両方入れておき、ProductionはPostgres、Developmentはsqliteを使うというやり方が良いかなと思います。

Q. デプロイに失敗した!この場合、請求ってどうなるの?
A. アプリケーションが停止状態なので料金はかかりません

デプロイに失敗した場合、アプリケーションは作成されていますが起動していない状態になります。この場合、料金はかかりません。

Q. バインドしたサービスの料金はいくら?
A. Built-in Servicesは無償提供なので、料金はかかりません

MySQL,PostgreSQL,MongoDBなどなど、Built-in Servicesとして提供しているものは開発用途前提で提供しており、料金はかかりません。ですが、容量が小さいなどの制約があるので、Production用途としてはCloudn RDBの利用をお勧めします!

Q. マニュアルとかわかりづらすぎじゃね?
A. すみません・・・早急になんとかします!

実は個別のフレームワークの利用方法については、CloudnマニュアルだけでなくCloud Foundryのドキュメントを参考にするようガイドしていたのですが、Cloud FoundryがV1からV2へ、全く違うものへと進化してしまい、ドキュメントもごっそり変わってしまいました・・・。
今回のエントリーは、V1向けのCloud Foundryのドキュメントを参考に書いています。
https://github.com/cloudfoundry/cf-docs-deprecated/blob/master/content/frameworks/ruby/rails-3-1.md

ドキュメントが分かりづらすぎる問題はPaaSチームも認識しており、なるべく早いうちに分かりやすいケースごとの資料を提供できるように進めています。今月中に形を出してければと思っていますので、もうしばらくお待ち下さい><

Cldoun PaaSでは、PaaS使ってみた記事を歓迎しています。
使ってみて分かりづらかった!とか、上手く動かなかった!と言う場合は、blogのエントリーやTwitterなどでつぶやいていただければ、すぐに対応します。

パクえ先生、ありがとうございました

No Comments »

第16回 Cloud Foundry輪読会をやります

December 25, 2013 | by | #cfcrjp, cloudfoundry

どうも、@jacopenです。

Cloud Foundry Advent Calendar 2013の25日目

思いつきで始めたAdvent Calndarですが、なんとか最後までたどり着けました。 最近Cloud Foundryに関するブログ書けてないなーと思ったのが始めた発端でしたが、AdventCalendar終わっても引き続き書いていきたいですね。

さて、今回はCloud Foundry輪読会の告知です。

1/17(金)に、第16回 Cloud Foundry輪読会をやります。 http://atnd.org/events/46542

場所は今の所前回、前々回と同じく田町のグランパークタワーの予定です。 ただ、3回連続なので、もし今からでも会場提供できるよーという方がいらっしゃいましたら、ご連絡ください!

発表ネタは、今の所決まっているのが@jacopenと@i_yudaiです。まだまだ枠余ってますので、我こそはと言う方は是非発表してもらえると嬉しいです。

ネタはCFに関するものならなんでもおっけーです。 最近某通信会社グループの人の発表ばっかりになってきたので、それ以外でCFに興味がある方が何かやってくれると嬉しいな:)

No Comments »

gostenoをためす

December 24, 2013 | by | #cfcrjp, cloudfoundry

どうも、@jacopenです。

Cloud Foundry Advent Calendar 2013の24日目

今回は、morikawa-tさんが7日目に動画にしていた、gosteno-prettifyを補足する感じの記事です。

そもそもstenoとは

stenoは、Rubyで実装されたloggingのためのライブラリです。CFのコンポーネントでも結構使われています。

https://github.com/cloudfoundry/steno

steno-prettify

stenoで出力されたログはJSON形式になっており、プログラムで処理するには便利なんですが人間の目で読むには非常に辛いという欠点があります。

{"timestamp":1387661923.852295,"message":"Token received from the UAA {\"jti\"=>\"af992454-efd7-4d4b-9d14-2dce52cbe7ab\", \"sub\"=>\"ec480c80-37ea-4720-b4d3-a3d402f54bd6\", \"scope\"=>[\"scim.read\", \"cloud_controller.admin\", \"password.write\", \"scim.write\", \"cloud_controller.write\", \"openid\", \"cloud_controller.read\"], \"client_id\"=>\"cf\", \"cid\"=>\"cf\", \"user_id\"=>\"ec480c80-37ea-4720-b4d3-a3d402f54bd6\", \"user_name\"=>\"admin@example.com\", \"email\"=>\"admin@example.com\", \"iat\"=>1387660241, \"exp\"=>1387667441, \"iss\"=>\"https://uaa.Example.com/oauth/token\", \"aud\"=>[\"scim\", \"openid\", \"cloud_controller\", \"password\"]}","log_level":"info","source":"cc.api","data":{"request_guid":"cf68d8eb-9a0a-4463-a768-1751f2987e6f"},"thread_id":42523220,"fiber_id":40530100,"process_id":10672,"file":"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/lib/cloud_controller.rb","lineno":75,"method":"decode_token"}
{"timestamp":1387661923.8564606,"message":"dispatch VCAP::CloudController::ServicesController get /v2/services/:guid/service_plans","log_level":"debug","source":"cc.api","data":{"request_guid":"cf68d8eb-9a0a-4463-a768-1751f2987e6f"},"thread_id":42523220,"fiber_id":40530100,"process_id":10672,"file":"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/lib/cloud_controller/rest_controller/routes.rb","lineno":12,"method":"block in define_route"}

timestampがunix timeな時点で人間に読ませる気ゼロな感じですね。

そのため、steno形式のログを人間に読みやすいように整形してくれるプログラムが、steno-prettifyです。

steno-prettifyについては、nsntさんが第14回輪読会で発表してくれていました。 http://atnd.org/events/44142

stenoをgemでインストールすると、steno-prettifyが使えるようになります。

gem install steno-prettify

先ほどのログをsteno-prettifyにかけると

2013-12-22 06:38:43.852294 cc.api         pid=10672 tid=aec7 fid=d84f lib/cloud_controller.rb/decode_token:75 request_guid=cf68d8eb-9a0a-4463-a768-1751f2987e6f    INFO -- Token received from the UAA {"jti"=>"af992454-efd7-4d4b-9d14-2dce52cbe7ab", "sub"=>"ec480c80-37ea-4720-b4d3-a3d402f54bd6", "scope"=>["scim.read", "cloud_controller.admin", "password.write", "scim.write", "cloud_controller.write", "openid", "cloud_controller.read"], "client_id"=>"cf", "cid"=>"cf", "user_id"=>"ec480c80-37ea-4720-b4d3-a3d402f54bd6", "user_name"=>"admin@example.com", "email"=>"admin@example.com", "iat"=>1387660241, "exp"=>1387667441, "iss"=>"https://uaa.example.com/oauth/token", "aud"=>["scim", "openid", "cloud_controller", "password"]}
2013-12-22 06:38:43.856460 cc.api         pid=10672 tid=aec7 fid=d84f rest_controller/routes.rb/block in define_route:12 request_guid=cf68d8eb-9a0a-4463-a768-1751f2987e6f   DEBUG -- dispatch VCAP::CloudController::ServicesController get /v2/services/:guid/service_plans

となり、大分読みやすくなります。

しかし、CFコンポーネントはbundlerを使って動くようになっており、グローバルのRubyにはstenoはインストールされていません。つまり、CFコンポーネントが存在するディレクトリに移動してbundle exec steno-prettifyするか、頑張ってパスを通すか、環境を汚すのを目を瞑って新たにstenoをインストールするか、、、と、イマイチ使い勝手が悪いものでした。

また、Rubyで書かれてる以上、動作速度は厳しいものがありました。

steno-prettifyの欠点を解消したgosteno-prettify

そんなわけで、今回登場するのがgosteno-prettifyです。 もうCloud Foundryを触っているとおなじみになってきた、Go言語で実装されたものです。

https://github.com/cloudfoundry/gosteno/tree/master/gosteno-prettify

go実装なので

  • バイナリで配布できる
  • 動作が速い

というメリットがあります。

gosteno-prettifyを使うには、Goの実行環境を整えた上で

go get -u github.com/cloudfoundry/gosteno
cd $GOPATH/src/github.com/cloudfoundry/gosteno/gosteno-prettify
go install

でインストールができます。他の環境に入れたい場合は、バイナリをコピーすればOKです。

morikawa-tさんの動画によると、速度は2倍近く速くなるようです。

バイナリで配布すればそもそもgoの実行環境は不要のため、goの実行環境がなくともインストールできるようなchef recipeでも書いて公開しようかなと考えています。 また完成次第記事にしてみます:)

それでは!

No Comments »

Stackato3.0にコマンドでデプロイしてみる

December 23, 2013 | by | #cfcrjp, cloudfoundry

どうも、@jacopenです。 今回はCloud Foundry Advent Calendar 2013の18日目! いろいろあって記事を上げるのが遅くなってしまいました、すみません。

前回にひきつづき、Stackato3.0の話をしましょう。

【前回記事】 CFv2ベースになったStackato 3.0を触ってみよう

Stackato3.0が正式リリースされた!

実は記事書いている間に、Stackato3.0が正式リリースされました。

ActiveState Stackato v3.0 is now available! http://www.activestate.com/blog/2013/12/activestate-stackato-v30-now-available

なので、今回はこの正式版を使う前提で話を進めていきます。

Stackato CLIを入れよう

Stackatoのクライアントは、ここから環境ごとの実行可能ファイルがダウンロードできます。 http://www.activestate.com/stackato/download_client

実行可能ファイルが直接配布されるということで、てっきりCloud Foundryと同じくgoで書かれたクライアントなのかと思いましたが、実はTclで書かれているようです。へー。

stackatoという名前のバイナリがあるはずなので、パスが通ってる場所に放り込んで、さあ始めましょう。

書かれている言語が違うとは言え、コマンドの体系はcfコマンドと似ています。 利用出来るコマンドはhelpで参照しましょう。

stackato help

アプリのデプロイ

では、アプリをデプロイしてみましょう。まずはstackatoコマンドのtargetを、自分の環境に向けます。

$ stackato target stackato-ka7j.local
Host redirects to: 'https://api.stackato-ka7j.local'
Successfully targeted to [https://api.stackato-ka7j.local]
Target:       https://api.stackato-ka7j.local
Organization: <none>
Space:        <none>

そしてログイン。

$ stackato login
Attempting login to [https://api.stackato-ka7j.local]
Username: jacopen
Password: ******
Successfully logged into [https://api.stackato-ka7j.local]
Choosing the one available organization: "udcp"
Choosing the one available space: "development"
Target:       https://api.stackato-ka7j.local
Organization: udcp
Space:        development

事前にudcp orgと development spaceを作っておいたので、ここで既に選択されている状態になってますね。

簡単なSinatraアプリを用意しpushします。

bash-3.2$ stackato push
Would you like to deploy from the current directory ?  [Yn]: Y
No manifest
Would you like to use 'sinatra' as application name ?  [Yn]: Y
Application Deployed URL [sinatra.stackato-ka7j.local]:
Application Url: sinatra.stackato-ka7j.local
Enter Memory Reservation [256]:
Enter Disk Reservation [2048]:
Would you like to save this configuration? [yN]:
Creating Application [sinatra] as [https://api.stackato-ka7j.local -> udcp -> development -> sinatra] ... OK
  Map sinatra.stackato-ka7j.local ... OK
Create services to bind to 'sinatra' ?  [yN]: N
Uploading Application [sinatra] ...
  Checking for bad links ... 9 OK
  Copying to temp space ... 8 OK
  Checking for available resources ... 5106 < 64K, skip OK
  Processing resources ... OK
  Packing application ... OK
  Uploading (3K) ... 100% OK
Push Status: OK
Starting Application [sinatra] ...
stackato[cloud_controller_ng]: Updated app 'sinatra' -- {"console"=>true, "state"=>"STARTED"}
staging: -----> Downloaded app package (4.0K)
staging: -----> Using Ruby version: ruby-1.9.3
staging: -----> Installing dependencies using Bundler version 1.3.2
staging:        Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin --deployment
staging:        Fetching gem metadata from http://rubygems.org/..........
staging:        Fetching gem metadata from http://rubygems.org/..
staging:        Installing bunny (0.7.4)
staging:        Installing daemons (1.1.3)
staging:        Installing eventmachine (0.12.10)
staging:        Installing json (1.5.3)
staging:        Installing rack (1.3.2)
staging:        Installing tilt (1.3.2)
staging:        Installing sinatra (1.2.6)
staging:        Installing thin (1.2.11)
staging:        Using bundler (1.3.2)
staging:        Your bundle is complete! It was installed into ./vendor/bundle
staging:
staging:        Post-install message from bunny:
staging:
staging:        [Version 0.7.3] AMQP connection URI parser now respects port
staging:        Cleaning up the bundler cache.
staging: -----> WARNINGS:
staging:
staging:        You have not declared a Ruby version in your Gemfile.
staging:        To set your Ruby version add this line to your Gemfile:"
staging:        ruby '1.9.3'"
staging:
staging:        # See https://devcenter.heroku.com/articles/ruby-versions for more information."
staging:
staging: -----> Uploading droplet (25M)
stackato[dea_ng]: Completed staging application
stackato[dea_ng.0]: Spawning app web process: bundle exec thin start -R config.ru -e $RACK_ENV -p $PORT
OK
http://sinatra.stackato-ka7j.local/ deployed

できましたー。

Cursor_と_sinatra.stackato-ka7j.local_と_sinatra.stackato-ka7j.local_と_名称未設定-2

buildpackは使える?

Cloud Foundry V2のウリといえば、やはりbuildpack。Stackato3.0ではどうでしょうか。

ちなみに、Stackatoは2.xの時点で、buildpackという概念がありました。ただheroku buildpackとは別の概念のものです。 Stackato3.0では、それまでのbuildpackは「legacy buildpack」となり、区別されるようになったようです。 今回試すのは、CFと同じくheroku inspiredなbuildpackです。

今回はCF Buildpack紹介でも使った、WordpressとPHP Buildpackを用いて実験してみます。 https://github.com/dmikusa-pivotal/cf-ex-worpress

まず、ローカルに上記WordPressのリポジトリをcloneしておき、そのディレクトリに移動します。 Stackato3.0でBuildpackを使うには、stackato.ymlに記述するようです。今回はこんな風に記述してみました。

name: wordpress
mem: 256MB
buildpack: https://github.com/dmikusa-pivotal/cf-php-apache-buildpack.git

そしてpush。

bash-3.2$ stackato push
Would you like to deploy from the current directory ?  [Yn]:
Using manifest file "stackato.yml"
Application Deployed URL [wordpress.stackato-ka7j.local]:
Application Url: wordpress.stackato-ka7j.local
Enter Disk Reservation [2048]:
Creating Application [wordpress] as [https://api.stackato-ka7j.local -> udcp -> development -> wordpress] ... OK
  Map wordpress.stackato-ka7j.local ... OK
Create services to bind to 'wordpress' ?  [yN]: y
What kind of service ?
1. free.filesystem
2. free.mysql
3. free.postgresql
Choose: 2
Specify the name of the service [free.mysql-f0cb3]:
Creating new service [free.mysql-f0cb3] ... OK
Binding free.mysql-f0cb3 to wordpress ... OK
Create another ?  [yN]:
Uploading Application [wordpress] ...
  Checking for bad links ... 1173 OK
  Copying to temp space ... 1172 OK
  Checking for available resources ...  OK
  Processing resources ... OK
  Packing application ... OK
  Uploading (20K) ... 100% OK
Push Status: OK
Starting Application [wordpress] ...
stackato[cloud_controller_ng]: Updated app 'wordpress' -- {"console"=>true, "state"=>"STARTED"}
staging: -----> Downloaded app package (4.3M)
staging: Cloning into '/tmp/buildpacks/cf-php-apache-buildpack'...
staging: Custom config found, overriding default options
staging: Configuring HTTPD Version: 2.2.26
staging:
staging: Downloading [https://dl.dropboxusercontent.com/u/186123235/binaries/httpd/2.2/httpd-2.2.26-bin.tar.gz]
staging:
staging: Downloaded [/tmp/cache/httpd-2.2.26-bin.tar.gz]
staging:
staging: Configuring PHP Version: 5.4.23
staging: Downloading [https://dl.dropboxusercontent.com/u/186123235/binaries/php/5.4/php-5.4.23-bin.tar.gz]
staging:
staging: Downloaded [/tmp/cache/php-5.4.23-bin.tar.gz]
staging: Found custom php.ini file, installing.
staging: -----> Uploading droplet (40M)
stackato[dea_ng]: Completed staging application
stackato[dea_ng.0]: Spawning app web process: ./start.sh
OK
http://wordpress.stackato-ka7j.local/ deployed

デプロイできたようです。

ブラウザでアクセスすると・・・・

Cursor_と_Database_Error_と_Database_Error_と_名称未設定-2

動いてねー・・。

ただ、この現象前にも見たことあります。そう、上に貼ったCF Buildpackの紹介スライドです。 きっと今回も、mysql serviceの情報を取得するためのキーが違っているんだと思います。

ここまで動いたと言うことは、今回の目的であるBuildpackを試すという話は達成しているわけですが、やっぱりWordPress動いていないまま終わらせるのも気持ち悪いのでもうちょっと追ってみます。

WordPress動かない原因調べ

おそらく、WordPressが動かないのは、環境変数から取得している部分のキーが違っていることが原因と思われます。 なので、Stackatoでアプリにバインドされた環境変数を調べてみます。

環境変数を調べる方法はいくつかありますが、

stackato files wordpress

を実行した結果、setenv.shというファイルを発見したので

stackato file setenv.sh

をしてみます。すると

export VCAP_SERVICES=”{\”mysql\”:[{\"name\":\"free.mysql-f0cb3\",\"label\":\"mysql-5.5\",\"tags\":[],\”plan\”:\”free\”,\”credentials\”:{\”name\”:\”de2db578211a448138f86fa719f75a921\”,\”hostname\”:\”10.9.8.55\”,\”host\”:\”10.9.8.55\”,\”port\”:3306,\”user\”:\”uUX9IVH3Pur78\”,\”username\”:\”uUX9IVH3Pur78\”,\”password\”:\”pCJj7Km10PlTr\”,\”uri\”:\”mysql://uUX9IVH3Pur78:pCJj7Km10PlTr@10.9.8.55:3306/de2db578211a448138f86fa719f75a921\”,\”jdbcUrl\”:\”jdbc:mysql://uUX9IVH3Pur78:pCJj7Km10PlTr@10.9.8.55:3306/de2db578211a448138f86fa719f75a921\”}}]}”

環境変数を設定している部分が見つかりました。どうやら、キーの名前はそのまんま「mysql」のようですね。
上記WordPressリポジトリの、 htdocs/wp-config.phpを見ると

$service = $services['cleardb-n/a'][0];  // pick the first MySQL service

となっているため

$service = $services['mysql'][0];  // pick the first MySQL service

と書き換えます。そして再push。

Cursor_と_WordPress_›_Installation

動きましたー。

No Comments »

CFv2ベースになったStackato 3.0を触ってみよう

December 17, 2013 | by | #cfcrjp, cloudfoundry

どうも、 @jacopenです。
Cloud Foundry Advent Calendar 2013の17日目

今回は、Cloud Foundryをベースに作られているPaaS、Stackatoの最新版を触ってみます。

新しくなったStackato 3.0

StackatoはActiveStateが作っているPaaSです。
実は2年ほど前に、このブログでも紹介しました。

Stackatoを使ってみた

最近、Stackato3.0という新しいバージョンのベータ版が登場しました。これを書いている時点では、beta2になっています。

Stackato3.0になって、変わった点は以下の通り。

  • Cloud Foundry v2ベースになった
    • OrgやSpaceといったv2の機能がそのまま使えます。
  • OpenStackとCloudStackのネイティブサポート
    • 詳細は良く分かっていないのですが、OpenStackやCloudStackのAPIを叩いてオートスケール等が可能になっているようです
  • Dockerコンテナ
    • もともとStackatoはLXCを使って独自のコンテナを実装していましたが、3.0からはDockerを使って動くようになったようです
  • 新しいランタイムやサービスのサポート
    • Amazon RDS連携も入ってるとか
  • Activity Stream
    • ActiveStateが6月に買収した、Appsecuteをベースにした機能だそう。Webコンソールからリアルタイムのアクティビティストリームが見れるとか。

この他、アップグレードが簡易になったり、Gnatsdを採用したりとさまざまな拡張や機能が投入されている様子です。

さっそく試してみよう

いろいろ新しくなったとはいえ、やっぱり触ってみないことには分かりません。
Stackato3.0のベータ版は、VirtualBoxやVMware、KVMなどさまざまな環境向けのオールインワンパッケージが提供されています。
今回はVirtualBoxイメージを使って、Stackato3.0を体験してみます。

ダウンロード&起動

Stackto3.0は、ここからダウンロード可能です

Virtualbox用のイメージをダウンロードし、インポートします。
次に、設定を開き、ネットワークのアダプター設定を「NAT」から「ブリッジアダプター」に変更します。ブリッジしてIPアドレスを振るので、DHCPが効いている環境じゃないと上手く動かないため要注意。

stackato02

そして起動します。インストールが走るのでしばし待ち。

終わるとこんな画面になります。

stackato03

この例だと、https://stackato-tms8.local/ にコンソールがあるよと表示されていますね。
さっそくアクセスしてみると、初期ユーザーとパスワード、Organizationを入力するよう求められました。何故か私が試したときはCSSが効いていなかったのですが、良く分かりません。
とりあえず必要項目入力してSet Up Fiest Admin Userを登録します。

stackato05

無事、登録できたようでマネジメントコンソールが表示されました。やったね。

アプリをデプロイしてみよう

さっそく、アプリをデプロイしてみましょう。
今回は、マネジメントコンソールからのGUIデプロイを試します。

まず、コンソールを見るとSpaceを作れと書いてあるので、OrgaizationsにアクセスしてSpaceを作成します。名前は何でも構いません。

次に、App Storeにアクセスします。さまざまなサードパーティーアプリケーションが表示されていますので、今回はWordpressを選択します。

stackato06

必要事項を入力し、Deploy Applicationをクリックすると、デプロイが始まります。

stackato07

できました!

今回の感想

今回はGUIの感想のみになりますが、さすがにGUI部分はよく作り込まれています。
Safariだと動きがおかしい場所がありましたが、Chromeなら問題なさそうです。

App StoreからのGUIデプロイのほか、Reports機能でRouterのStatsなんかも確認できます。
DEAやCC、その他様々なコンポーネントの設定も、このコンソールから設定可能です。Cloud Foundryだとyamlを編集してやっているものが、全部GUIから出来ちゃうわけですね。

次回は、Stackatoのクライアントツールを使ったデプロイなど、もうちょっとPaaSらしい使い方を試してみることにします。

No Comments »

Cloud Foundry V2のOrg SpaceとRoleの関係まとめ

December 12, 2013 | by | #cfcrjp, cloudfoundry

Cloud Foundry Advent Calendar 2013の12日目!

どうも、@jacopen です。

今回は、Cloud Foundry V2によって追加されたOrgやSpaceといった概念をまとめてみたいと思います。

Org, Space, Application

Cloud Foundry V1では、ユーザーがあって、ユーザーがもつアプリがあるという非常にシンプルなモデルでした。個人開発者ならこれで十分かもしれませんが、これがもう少し大きいチームになるとどうでしょう。1つのアプリを複数ユーザーでデプロイすることはできませんので、チームで1つのアカウントを共有することになりますね。 となると、メンバーがチームから離れることになったら? 協力会社と一緒に開発したいときは?

そう、V1の仕組みだと、チーム開発する際にちょっと困ったことが起こりやすかったわけですね。 そのため、V2では、チーム開発に向いた仕組みが導入されました。それが、OrgとSpaceです。

Organizations (Org)

その名の通り、組織単位の大きなグループ分けをするためのものです。V2の世界では一番てっぺんにくるメタオブジェクトになります。 大抵の場合は企業名だったり、大企業であれば事業部単位になったりするでしょう。ちなみにOrg名はCloud Foundry内でユニークである必要があります。

CF的には、作ろうと思えば1ユーザーで複数のOrgを作ることができます。しかし、現在pivotalが提供しているオンライン版では1ユーザーが作れるOrgは1つという制約になっています。ちなみにサービスイン当初は複数作れました。たぶん大量に作ってしまうユーザーがいたので対策が入ってしまったと思われます。「VMware」とか「pivotal」とかいうOrgを作れちゃったー という話も聞いたことがありますし。誰から聞いたとは言いませんが。

ただ、他のOrgの管理者からInviteされることで、複数のOrgに所属することは可能です。

Spaces (App Spacesという場合も)

Spaceは、Org内に複数作ることが可能なメタオブジェクトです。例えばどういうときに使うかというと、development, test, productionという形で分けておいて、開発のフェーズに応じて使い分けるという形が考えられます。あるいは、組織の中のさらにチームで分けて使うと言う方法もありますね。 アプリケーションは、このSpaceに属する形でデプロイされます。

DomainとRoute

Cloud Foundryで使えるドメインにも、OrgやSpaceに対応する形で新たな定義が行われました。

Domain

domainは、udcp.netやpivotal.ioのような、いわゆる「ドメイン名」を指しています。

このdomainは2種類に分けられます。

まず「system domain」という概念。これは構築したCloud Foundry全体で使われるデフォルトのドメインのようなものです。例えばpivotalオンライン版の場合、エンドユーザーのOrgやSpacesはsystem domainであるcfapps.ioにマッピングできます。

そしてもう一つが「custom domain」。custom domainは、ユーザーが持ち込むことができるドメインです。これはOrgに対して登録されます。例えば、「UDCP」orgに「udcp.net」domainを結びつけるイメージですね。 ただ、1domainを複数Orgに結びつけることは出来ないので、要注意です。逆に、複数domainを1Orgに結びつけることは可能です。 なお、このドメインはサブドメインでも可能です。(staging.udcp.netのように)

Orgに属したdomainは、複数のspacesに関連づけできます。例えば、Orgに「udcp.info」「udcp.net」「dotstyle.net」を結びつけておき、「Production」spaceに「udcp.info」「udcp.net」、「Staging」spaceに「udcp.net」「dotstyle.net」・・・といった形ですね。

Route

アプリケーションに結びつけるのは、domainではなくてrouteになります。 routeはhost+domainという形で構成されます。app.udcp.net という形になりますね。

このrouteは、一つないしは複数のアプリケーションと関連づけができます。

図にするとこんな感じです

Roles

次にRolesの話です。Rolesは、各メタオブジェクトに対する権限のことです。 Rolesには大きく分けて2種類、Orgに対するRoleと、Spaceに対するRoleが存在します。

Org Roles

Organization Manager Orgのユーザー管理、ユーザーのInviteやプランの選択、変更が可能

Billing Manager Billing Accountの情報を編集したり、支払い情報を変更したりできる

Organization Auditor OrgやSpaceの情報や設定、レポートを閲覧できるリードオンリーな権限

Space Roles

Space Manager Spaceのユーザーを編集したり、Spaceへの機能の有効化などが可能

Space Developer ApplicationやServiceのcreate, delete, manage、 利用レポートやログへのフルアクセスが可能

Space Auditor Space の情報や設定、レポート、ログの閲覧のみが可能なリードオンリー権限

SpaceにもOrgにも、「管理する人(フル権限)」「使う人」「見るだけの人」 の3つがあると覚えておけばよいですね。

No Comments »

cluster対応NATS Clientでgnatsd clusterを叩いてみる

December 6, 2013 | by | #cfcrjp, cloudfoundry

どうも、@jacopenです。 Cloud Foundry Advent Calendar 2013の6日目! おかげざまでだいぶ枠埋まってきました。あと9枠、興味のある方は是非。

さて、今回はgnatsdネタの3回目。cluster対応clientを使って、gnatsdを叩いてみます。 gnatsdネタはひとまず今回で最後の予定です。

これまでの記事

gnatsdを触ってみる

gnatsdでclusterを組んでみる

ruby clientから叩いてみよう

NATS ClientはRuby, Go, Java, Nodeとさまざまな言語向けに出ていますが、今回はRubyのClientを使って試してみます。

Cluster対応NATS Clientは、NATSリポジトリのclusterブランチにあります。 https://github.com/derekcollison/nats/tree/cluster

あるいは、0.5.0.beta.12指定でrubygems.orgからも入れられます。

gem install nats -v 0.5.0.beta.12

publisherをつくる

まずは、clusterに向けてpublishするスクリプトから。

require 'nats/client'

class Publisher
  def run
    @count = 0
    uris = ["nats://192.168.33.10:4222", "nats://192.168.33.11:4222", "nats://192.168.33.13:4222"]
    NATS.on_error { |err| puts "Server Error: #{err}"; exit! }
    NATS.start(:uris => uris, :user => "nats", :pass => "nats") do
      EM.add_periodic_timer(3) { publish_message }
    end
  end

  def publish_message
    msg = "count: #{@count.to_s} connected: #{NATS.server_info[:server_id]}"
    NATS.publish("test", msg) do
      puts "#{Time.now} Pulished: #{msg}"
    end
    @count += 1
  end
end

Publisher.new.run

ポイントは、NATS.startで渡すオプションに:urisでclusterのリストを渡すところです。 これまでは:uriで1サーバーだけを渡していましたが、ここに配列を渡すことでclusterを認識します。

メッセージごとに連番と、現在接続しているserver_idを含めてpublishします。

subscriberをつくる

subscriberはこうつくりました。

require 'nats/client'

class Subscriber
  def run
    @count = 0
    uris = ["nats://192.168.33.10:4222", "nats://192.168.33.11:4222", "nats://192.168.33.13:4222"]
    NATS.on_error { |err| puts "Server Error: #{err}"; exit! }
    NATS.start(:uris => uris, :user => "nats", :pass => "nats") do
      NATS.subscribe('>') { |msg| puts "#{Time.now} Received: #{msg} connected: #{NATS.server_info[:server_id]}" }
    end
  end
end

Subscriber.new.run

とくに凝ったことはしていません。 Publisherも、Subscriberも、これまでと違うのはurisオプションだけですね。

切り替わりを試す

それでは、さっそくpublisherとsubscriberを動かしてみます。 動かしながら、順次gnatsdを落としていきます。

2013-12-07 01:30:14 +0900 Pulished: count: 0 connected: 10fe1ed733a81111a64ad62a5ab4580b 
2013-12-07 01:30:17 +0900 Pulished: count: 1 connected: 10fe1ed733a81111a64ad62a5ab4580b 
2013-12-07 01:30:20 +0900 Pulished: count: 2 connected: 10fe1ed733a81111a64ad62a5ab4580b 
2013-12-07 01:30:23 +0900 Pulished: count: 3 connected: 10fe1ed733a81111a64ad62a5ab4580b 
2013-12-07 01:30:26 +0900 Pulished: count: 4 connected: cbe234aff27fcca71f712e567e16ff91 # gnatsd001を落とした 
2013-12-07 01:30:29 +0900 Pulished: count: 5 connected: cbe234aff27fcca71f712e567e16ff91 
2013-12-07 01:30:32 +0900 Pulished: count: 6 connected: cbe234aff27fcca71f712e567e16ff91 
2013-12-07 01:30:35 +0900 Pulished: count: 7 connected: cbe234aff27fcca71f712e567e16ff91 
2013-12-07 01:30:38 +0900 Pulished: count: 8 connected: 02fa7479f288af5708d231b070067b63 # gnatsd002を落とした 
2013-12-07 01:30:41 +0900 Pulished: count: 9 connected: 02fa7479f288af5708d231b070067b63 
2013-12-07 01:30:44 +0900 Pulished: count: 10 connected: 02fa7479f288af5708d231b070067b63 
2013-12-07 01:30:47 +0900 Pulished: count: 11 connected: 02fa7479f288af5708d231b070067b63 
Server Error: Could not connect to server on nats://nats:nats@192.168.33.13:4222 # gnatsd003を落とした

2013-12-07 01:30:14 +0900 Received: count: 0 connected: 10fe1ed733a81111a64ad62a5ab4580b connected: 10fe1ed733a81111a64ad62a5ab4580b 
2013-12-07 01:30:17 +0900 Received: count: 1 connected: 10fe1ed733a81111a64ad62a5ab4580b connected: 10fe1ed733a81111a64ad62a5ab4580b 
2013-12-07 01:30:20 +0900 Received: count: 2 connected: 10fe1ed733a81111a64ad62a5ab4580b connected: 10fe1ed733a81111a64ad62a5ab4580b 
2013-12-07 01:30:23 +0900 Received: count: 3 connected: 10fe1ed733a81111a64ad62a5ab4580b connected: 10fe1ed733a81111a64ad62a5ab4580b 
2013-12-07 01:30:26 +0900 Received: count: 4 connected: cbe234aff27fcca71f712e567e16ff91 connected: 02fa7479f288af5708d231b070067b63 # cbe234aにpublishされたものを02fa747から受け取るようになった 
2013-12-07 01:30:29 +0900 Received: count: 5 connected: cbe234aff27fcca71f712e567e16ff91 connected: 02fa7479f288af5708d231b070067b63 
2013-12-07 01:30:32 +0900 Received: count: 6 connected: cbe234aff27fcca71f712e567e16ff91 connected: 02fa7479f288af5708d231b070067b63 
2013-12-07 01:30:35 +0900 Received: count: 7 connected: cbe234aff27fcca71f712e567e16ff91 connected: 02fa7479f288af5708d231b070067b63 
2013-12-07 01:30:38 +0900 Received: count: 8 connected: 02fa7479f288af5708d231b070067b63 connected: 02fa7479f288af5708d231b070067b63 # 02fa747にpublishされたものを02fa747から受け取るようになった 
2013-12-07 01:30:41 +0900 Received: count: 9 connected: 02fa7479f288af5708d231b070067b63 connected: 02fa7479f288af5708d231b070067b63 
2013-12-07 01:30:44 +0900 Received: count: 10 connected: 02fa7479f288af5708d231b070067b63 connected: 02fa7479f288af5708d231b070067b63 
2013-12-07 01:30:47 +0900 Received: count: 11 connected: 02fa7479f288af5708d231b070067b63 connected: 02fa7479f288af5708d231b070067b63 
Server Error: Could not connect to server on nats://nats:nats@192.168.33.13:4222 # 全台落ちたため接続できず終了 [/bash]

きちんと切り替わっていることが確認できました。

このログではいずれの切り替わりもスムーズに行われていますが、その後複数回試行すると、接続先が落ちてから他のclusterに切り替わるまで数秒〜十数秒のラグがあったり、切り替わりの間にいくつかのメッセージを欠損したりということがありました。

また、ちょっと問題かなと思った挙動としては 001落とす→002落とす→001立ち上げる→002立ち上げる→003落とす という手順を踏んだ場合、まれに001や002に切り替わらず、そのままCould not connectで落ちてしまうというケースがありました。 おそらくclient側の問題かと思われますが、ここは解決されないとちょっと厳しいですね。

しかし、NATSが落ちたら系が全滅してしまうCloud Foundryにおいて、冗長化できるというのはそれだけで大きな安心をもたらすものだと思います。 近いうちにCloud Foundry V2にもgnatsdとcluster対応clientが投入されるようです。期待ですね。

No Comments »

OpenShift Enterprise 2が発表されました。

December 5, 2013 | by | #cfcrjp, cloudfoundry, openshift

@jacopenです。Cloud Foundry Advent Calendar 2013の5日目です。
Advent Calendarの参加者が増えてきたので、ほっとしています。でも、まだまだ空きありますのでネタがある方は是非。

さて、今回はCloud Foundryからは一歩離れて、OpenShiftの話。国内でOpenShiftの話に触れる人があんまり居ないんで、OpenPaaS繋がりでCF Advent Calendarでやってやるんだ。(拡大解釈)


先日、OpenShiftからなんか発表するよーというメールが届いたので、何かなと思ったらどうやらOpenShift Enterprise 2が発表されたようです。

https://www.openshift.com/products/enterprise

改めて整理しておくと、OpenShiftには3種類あります。

  • RedHatが運営するPaaSである、OpenShift Online
  • RedHatがPrivate PaaS向けに提供するパッケージ、OpenShift Enterprise
  • 上2つのベースとなる、オープンソースPaaSソフトウェア OpenShift Origin

今回はPrivate PaaS向けのパッケージが最新版になったという発表なわけです。

OpenShift Enterpriseが発表されたのは2012年11月なので、おおよそ1年でメジャーバージョンアップが行われたということになりますね。

OpenShift Enterprise 2で変わったところ

公式サイトからまとめた情報だと、以下の点が追加されたようです。

コラボレーション機能

アプリケーション開発のコラボレーション機能がつきました。一つのアプリケーションを複数ユーザーに権限を与えてチーム開発を行うことができます。
権限(Role)には Viewer, Editor, Adminの3種類あり、ユーザーごとに設定が可能です。
Cloud Foundryがv2から搭載した、Auditor, Developer, Managerとほぼ同様の権限設定ですね。

バイナリーデプロイメント

OpenShiftでアプリをデプロイするときは、gitを使ってOpenShiftにpushしていたのですが、gitなんて使っていられないという要望があったんでしょうか。rhcコマンドを通じてtar.gzをアップロードしてデプロイできる仕組みがついたようです。

言語、フレームワークの強化

Node.jsが新たに使えるようになりました。その他、これまで使えていた言語も新たなバージョンが使えるようになっています。

アドミンコンソールの強化

実物みてないんで具体的にどう変わったのかわからないのですが、強化されたようです(◔⊖◔)

インストールと設定の容易化

手間がかかったインストールが簡易化されました。CLIのインストーラが用意され、対話的にインストールを行うことができるようです。
設定はyamlに記述していくようですね。
インストーラはpuppetの仕組みを使ってデプロイを行うようです。

OpenStackインテグレーション

OpenStack Heatのテンプレートが用意され、OpenStack環境でのオーケストレーションが手軽になりました。

アプリケーションポータビリティの強化

これ何を指してるのかよくわかんないです、すみません。

HA Webルーティング

個人的に最近のOpenShiftで一番大きな追加機能かなと思うのがこれです。
8月のCloud Foundry輪読会でも発表しましたが、これまでOpenShiftは、Routingレイヤーを持ちませんでした。

エンドユーザーがアプリケーションにアクセスする際は、グローバルIPアドレスを持つNodeに直接アクセスが来る形になっていて、HA機能はHA Proxy Gearで担保していました。

この仕組みだと、Routingを行う機能が不要なぶん構成がシンプルで、Routerノードがボトルネックになる心配がありません。その一方、全てのNodeがグローバルIPアドレスを持つ必要があったり、開発者がアプリケーションのダウンタイム無しでバージョンアップを行う際に必要な、Green-Blue Deploymentという手段が取りづらかったりとデメリットもありました。

このRoutingレイヤーの有無がCloud FoundryとOpenShiftの大きな違いとなっていたのですが、OpenShift Enterprise 2からオプションでRoutingレイヤーがつくようになったようです。

OpenShift_PEP_005__Highly_Available_Web_Applications

ルーティングメッセージのやりとりには、既存のOpenShiftのメッセージング機構(AMQP)を用いる様子。
ルーティング情報はMongoDBに保存され、Routing SPIを通じてProxyに都度送られます。

CloudFoundryのRoutingと違う大きく違う点は、MongoDBで情報を集約しているところでしょうか。

上の図は、OpenShiftのDocumentからの引用ですが、Cloud Foundryに慣れた身としては、この構成でなぜHA Proxy Gearが必要なのか良く分かりません・・・

いずれにせよ、OpenShiftの使い勝手にも大きな影響があるアップデートなのは間違いありません。

No Comments »

ネットワークの監視に使えるfluent-plugin-network-probeをリリースしました

December 5, 2013 | by | fluentd

@u1です。

本記事はFluentd Advent Calendar 2013(http://qiita.com/advent-calendar/2013/fluentd)の12/5担当の記事です。

前々から作ってはいたのですが最後の詰めを放置していたプラグイン fluent-plugin-network-probe のリリース及び紹介になります。

fluent-plugin-network-probeとはなんぞや

https://github.com/u-ichi/fluent-plugin-network-probe

サーバーを運用・保守するためには外形監視が必要不可欠で、pingを使った簡単な監視、TCP/UDPを使ってのport監視、http/httpsでのアクセスをしてのサービス監視、実際にPOSTしてのシナリオ監視と多岐にわたります。

手段としてもzabbixやnagiosを使えば測定・蓄積は出来るのですが蓄積したデータの取り扱い方、解析を考えるとfluentd側に流した方が有利なケースが実はかなり存在していると思います。

どうせ今時ならばfluentd自体はノードに入ってますしね。

そのため、まずはよく使うicmp pingとhttp/httpsでの監視部分のみですがfluent-input-pluginを作成しました。

出来ること

現状実装では以下の2点のデータを取得出来ます。

  • fpingによるicmp pingのlatency(avg, max, min)
  • curlによるhttp/httpsのrequest time(avg, max, min)

使ってみる

動かすためにはcurl, fpingが必要なため、まずインストールします。

$ sudo apt-get install fping curl

次にpluginをインストールします。(fluentd/td-agentのインストール手順はhttp://docs.fluentd.org/ja/categories/installation を参照ください)

以下はubuntu12.04の例。

$ sudo /usr/lib/fluent/ruby/bin/fluent-gem install fluent-plugin-network-probe

インストールが終わったら、/etc/td-agent/td-agent.confを以下のように書き換えます。

<source> 
  type network_probe
  tag network_probe.fping
  probe_type fping
  target google.co.jp
</source>
<source>
  type network_probe
  tag network_probe.curl
  probe_type curl
  target google.co.jp
</source>
<match **>
  type file
  path /tmp/probe
  time_slice_format %Y%m%d
  time_slice_wait 10m
  time_format %Y%m%dT%H%M%S%z
  utc
</match>

設定を変更したらtd-agentをrestartさせて設定を反映させます。

$ sudo /etc/init.d/td-agent restart

設定が反映されたら5分ほど待って、/tmp/probeディレクトリ以下のファイルをcatしてみると以下のようなログが生成されています。

20131204T161739+0000 network_probe.symphonia.fping_google.co.jp {"min":7.88,"avg":9.93,"max":13.4} 
20131204T161739+0000 network_probe.symphonia.curl_google.co.jp {"max":64.0,"min":57.0,"avg":60.2} 

後はタグの情報を元にfluentdの各種プラグイン、元々の制御機構を使って加工をし値を保存する事で、たとえば以下のようなgrowthforecastに比較グラフを生成する事も出来ます。

network-probe-graph

まとめ

測定メソッドの数はまだまだ少ないですが、fluentdのinput pluginを使ってネットワークの測定を行う事が出来るようになりました。

今後は測定メソッドのパターンを増やして、より細かな値が取れるようにしていきたいと考えています。 

もし、測定したいメソッドがあったら、https://github.com/u-ichi/fluent-plugin-network-probe/issues に書き込むと対応するかもしれません。

No Comments »