AWS利用料金グラフ化Muninプラグインを書いてみた( ^ω^)

◆ AWS Billing Alert いいですね。

今日は、先日の投稿の続きです。Amazon Web Services の利用料金見積もりの機能(AWS Billing Alert) が実装されました。導入手順や Management Console の操作については、こちらをご覧下さい。

AWS Billing Alerts を使った請求金額通知と、CLIを使った金額取得 | Pocketstudio.jp log3
http://pocketstudio.jp/log3/2012/05/19/enable-aws-billing-alerts/

$248…やっちまったぜ…今月はBlu-ray買えません

これが出来ると何が嬉しいかというと、どのサービスに対して、どの程度のお金をかけているのかが、逐次確認出来る点です。EC2にいくら、RDSにいくら払ったかが分かるのは便利。Billing Alert があれば、x4.large インスタンスを立ち上げっぱなしで、悲劇を見ることはありません。(先月やらかしました。今は反省している)。

 

しかも、Billing Alert は、CloudWatch 経由で金額データを確認・通知ができます。CloudWatch が使えるということは…

ピコーン! CloudWatch Command Line Tool(CLI) を使ってデータが取得できる!

つまり、データが取得できれば Munin でグラフ化したら楽じゃね?

という事で Munin プラグインを書いてみました(イマココ)。

画面イメージは、こんな感じ。リアルタイムなのはこちら

Munin を使うのは他の理由もあります。理由は3つ。一つは、自分にとって普段使い慣れている監視システムである事。もう1つ、Munin 経由で通知を出せること。そして、CloudWatch のデータ保存期間は2週間だということ。過去の傾向を知るためには、データを残しておく事は必要でしょう。

◆ EstimateCharge プラグイン

書いたプラグインは二種類です。合計費用だけをグラフ化する aws_EstimatedCharges と、サービス毎にグラフ化する aws_EstimatedServices です。前者は単純に請求費用を知るため。後者は、内訳を確認するためです。

動作条件としては、Munin が必要です。あとは、CloudWatch CLI が動作する Java 1.5 以上の環境(CloudWatch CLI の導入については、先日の投稿をご覧下さい)。

ファイルは GitHub で公開しています。

zembutsu/AWS-EstimateCharge
https://github.com/zembutsu/AWS-EstimateCharge

動作はシンプルです。まずはデータを取得するスクリプトを設置します。cron で定期的に CloudWatch CLI を走らせ、金額データをファイルに保管するものです。あとは、Munin プラグインが、補完したデータを参照するという仕組み。

データ取得スクリプトを分けているのは、単純にタイムアウト対策です。また、環境によってデータ取得のタイミング(cron の実行間隔)は異なると思うので。

以下、実際にaws_EstimatedServices を有効にする場合の手順です。

まず aws_EstimatedServices.sh を適当なパスにおいて、chmod +x などで実行属性をつけておきます。設置時のパスや環境変数は、環境に応じて書き換えてください。このままでは動きません。。

#!/bin/sh

DAT=/var/lib/munin/plugin-aws-cloudwatch/EstimatedCharges_services.dat

export AWS_CLOUDWATCH_HOME=/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1
export PATH=$PATH:/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1/bin
export EC2_REGION=us-east-1
export JAVA_HOME=/usr/local/jdk1.6/
export AWS_CREDENTIAL_FILE=/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1/credential

start=`date --iso-8601=seconds --date '6 hour ago 1 minutes ago'`
end=`date --iso-8601=seconds --date '1 minutes ago'`

echo -n > $DAT

for METRICS in AmazonEC2 AmazonRDS AmazonS3 AmazonRoute53 AmazonSimpleDB AmazonSNS AWSDataTransfer ; do
echo -n "${METRICS}.value " >> $DAT
/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1/bin/mon-get-stats \
EstimatedCharges \
--statistics "Maximum" \
--namespace "AWS/Billing" \
--dimensions "ServiceName=${METRICS},Currency=USD" \
--start-time $start --end-time $end | tail -1 | cut -f4 -d' ' >> $DAT
done

“DAT” がデータ出力先のファイルです。

# mkdir /var/lib/munin/plugin-aws-cloudwatch
# touch /var/lib/munin/plugin-aws-cloudwatch/EstimatedCharges_services.dat
# chown -R zem:munin /var/lib/munin/plugin-aws-cloudwatch/EstimatedCharges_services.dat
# chmod 755 /etc/munin/plugins/aws_EstimatedCharges

このように、ディレクトリやファイルの作成、パーミッションの設定をしておきます。

@j3tm0t0 さんからのヒント

※途中、CLI が反応なくて困っていたとき、忍者な @j3tm0t0 さんからヒントを戴きました。ありがとうございました! mon-get-stats を使うとき、–start-time と –end-time を指定しないと、正しく出ないことがあるようです。変数 $start と $end で、妙な時間の指定をしているのは、そのため。6時間分を指定しています。

あとは、スクリプトを /usr/local/bin/ に置く場合は

$ chmod 755 /usr/local/bin/aws_EstimatedServices.sh

パーミッションを指定します。それから、コマンドを実行してエラーが出なければ大丈夫です。

$ /usr/local/bin/aws_EstimatedServices.sh

ファイルも出力されているかどうか、あわせて確認します。

# cat /var/lib/munin/plugin-aws-cloudwatch/EstimatedCharges_services.dat
AmazonEC2.value 14.37
AmazonRDS.value 0.0
AmazonS3.value 0.03
AmazonRoute53.value 0.51
AmazonSimpleDB.value 0.0
AmazonSNS.value 0.0
AWSDataTransfer.value 0.02

次に cron の設定です。

$ crontab -e

*/15 * * * *    /usr/local/bin/aws_EstimatedServices.sh

このような感じで、エントリを追加しておきます。

その次は Munin プラグイン aws_EstimatedCharges の設置です。

# touch /etc/munin/plugins/aws_EstimatedCharges
# chmod 755 /etc/munin/plugins/aws_EstimatedCharges
# chown munin:munin /etc/munin/plugins/aws_EstimatedCharges

ファイルを作成後は、中身を流し込みます。

#!/bin/sh

# Plugin to monitor the AWS CloudWatch metrics "EstimatedCharges" by services
# MIT License
# Mar 20, 2012
# version 0.0.1 Masahito Zembutsu (@zembutsu)

if [ "$1" = "autoconf" ]; then
echo yes
exit 0
fi

if [ "$1" = "config" ]; then
echo 'graph_title AWS EstimatedCharges by services'
echo 'graph_args --base 1000 -l 0'
echo "graph_category AWS";
echo 'graph_vlabel USD'
echo 'graph_scale no'
echo 'graph_info EstimatedCharges by services'

FIRST=1;
for METRICS in AmazonEC2 AmazonRDS AmazonS3 AmazonRoute53 AmazonSimpleDB AmazonSNS AWSDataTransfer; do
echo "${METRICS}.label ${METRICS}"
echo "${METRICS}.info EstimatedCharges service ${METRICS}"
echo "${METRICS}.type GAUGE"
if [ $FIRST -eq 1 ] ; then
echo "${METRICS}.draw AREA"
export FIRST=0;
else
echo "${METRICS}.draw STACK"
fi
done

exit 0
fi

for METRICS in AmazonEC2 AmazonRDS AmazonS3 AmazonRoute53 AmazonSimpleDB AmazonSNS AWSDataTransfer; do
echo -n "${METRICS}.value "
grep ${METRICS} /var/lib/munin/plugin-aws-cloudwatch/EstimatedCharges_services.dat | cut -f2 -d' '
done

動作テストは、実際にプラグインを実行します。

# /etc/munin/plugins/aws_EstimatedServices
AmazonEC2.value 14.37
AmazonRDS.value 0.0
AmazonS3.value 0.03
AmazonRoute53.value 0.51
AmazonSimpleDB.value 0.0
AmazonSNS.value 0.0
AWSDataTransfer.value 0.02

このようにデータが表示されれば大丈夫です。

あとは、munin-node の再起動を行います。

# /etc/rc.d/init.d/munin-node restart
Stopping Munin Node agents:                                [  OK  ]
Starting Munin Node:                                       [  OK  ]

再起動後は munin-node を telnet で叩いて、直接データを fetch してみます。正常であれば、次のような結果がかえります。

$ telnet localhost 4949
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
Escape character is '^]'.
# munin node at sv.pocketstudio.jp
fetch aws_EstimatedServices
AmazonEC2.value 14.37
AmazonRDS.value 0.0
AmazonS3.value 0.03
AmazonRoute53.value 0.51
AmazonSimpleDB.value 0.0
AmazonSNS.value 0.0
AWSDataTransfer.value 0.02
.

あとは、Munin グラフの更新のタイミングで、データが反映されます。

個人的には「やっぱり Muniin は最高だぜ!! Munin( ^ω^)」…なので Munin を使いましたが、他の統合監視システム等々でも、同じような仕組みが出来ると思います。

それでは皆さん、素敵な AWS ライフを。

◆ 参照:

【AWS発表】 AWSクラウドの利用料金を監視・通知できるように – Amazon Web Services ブログ
http://aws.typepad.com/aws_japan/2012/05/monitor-estimated-charges-using-billing-alerts.html

Amazon CloudWatch Command Line Tool : Developer Tools : Amazon Web Services
http://aws.amazon.com/developertools/2534

AWS Billing Alerts を使った請求金額通知と、CLIを使った金額取得 | Pocketstudio.jp log3
http://pocketstudio.jp/log3/2012/05/19/enable-aws-billing-alerts/

zembutsu/AWS-EstimateCharge
https://github.com/zembutsu/AWS-EstimateCharge

ファイルも出力されているかどうか、あわせて確認します。
カテゴリー: AmazonWebServices, Munin | タグ: , , | コメントをどうぞ

AWS Billing Alerts を使った請求金額通知と、CLIを使った金額取得

Amazon Web Services の課金情報は、新しい Billing Alert 機能を使うことで、おおよその見積もりが出来るようになった模様。一通り有効にする方法、CloudWatchでメール通知する設定、そして、CLIを使ってコマンドラインでデータを取得するまでの流れをまとめました。

◆ Billing Alerts

AWS Blog にて、新たに “Billing Alerts”(請求通知)なる機能が搭載された事を知る。何でも、おおよその利用料金を見積もりしてくれるようだ。しかも料金の閾値を設定し、越えた場合にメールで通知することも出来るとのこと。ほほう。

【AWS発表】 AWSクラウドの利用料金を監視・通知できるように – Amazon Web Services ブログ
http://aws.typepad.com/aws_japan/2012/05/monitor-estimated-charges-using-billing-alerts.html

◆ Billing Alerts を有効にしてみる

"Enable Now"をクリック

有効にするには Account Activity にアクセス。「どこに Billing Alertsがあるんだろ?」と思って画面を見渡すと…【 Enable Now 】のリンクを発見。

早速クリックをするものの、何だかダイアログが表示されてしまう。

どうやら、”秘密の質問”的なものを設定しないと、見積もりが出来ない模様。引き続き、【 Update this information now 】をクリック。

質問と答えを埋めて、【変更を保存】

すると、AWS アカウントの個人情報ページが表示される。そのページの一番下のほうに、なにやら該当する項目を発見。”Configure Security Challenge Questions” の項目を3つ埋めて、更新する必要があるようだ。

“Question”で質問項目を選び、”Answer”に答えを記入。3つ分、しっかり埋めます。そして【変更を保存】。

クリックすると、”アカウントアクティビティ”の画面に戻ります。ここで再び【 Enable Now 】をクリックすると、有効になったと画面に表示される。

あとは、15分くらい待てば料金の見積もりが終わり、アラートが使える模様。

ちょっと一息、コーヒータイム( ´∀`)

席に戻ると、先ほどのアカウントアクティビティの画面に、課金見積もりの監視が有効になっっとメッセージが表示されてる。早速 Billiing Alerts を有効にすべく、【 Set your first billing alarm 】(はじめてのアラームを有効にする)をクリック。

閾値に達したらメールを送るという事と、Free Tier(10アラート、1000通のメールまで無償)の説明が出ている。アラームの作成【 Create Alarm 】をクリック

◆アラームの作成

次は、”Alarm details for AWS billing estimated charges” が表示される。ここでは、【 Create Alarm 】をクリック

長々と説明が出ているが、要は Free Tier が適用されるので、アラーム10個と、メール1,000通までは無償ですよという内容。

ここでアラームを作成することも可能だが、一旦「Close」をクリックして保留しても構わない。保留した場合は、Management Console 上の “CloudWatch” から、Metrics →”Billing” をクリックすることで、現状の確認やアラートの追加が可能になる。

"CloudWatch" -> "Metrics" -> "Billling" の画面。サービス毎にグラフ化が可能

ちなみに、Metrics のリージョンは”US East (N. Virginia)” ですが、ここでは全リージョン分が表示されています。今のところ、各リージョン毎のデータは出せないみたいなので、注意(FAQ参照)。

さて、特定の閾値を超えたら、メールを送りたい。もう一度アラートの設定に戻る。

アラームを作成するには、”CloudWatch” -> “Alarms” -> “Billing Alarms”をクリックする。

先ほどの画面と同じように、ダイアログが表示されるので、ここでは【 Create Alarms 】をクリックする。

画面をクリックすると、詳細入力のダイアログが出てくる。アラートを出すには、合計費用のほか、EC2やRDS毎やデータ転送量(Data Transfer)など、サービス毎・紐づけられているアカウント毎に設定することが出来る。

とりあえず、ここではトータル $15 にし、【 Create Alarm 】をクリックする。

正常に処理されると、上図のように表示される。

また、”With thease recipients”で指定したメールアドレスには、次のような確認メールが届く。本文をクリックしておくこと。

AWSから届く確認用のメール。"Confirm subscription"を押すと…

このように完了した旨が表示される。

◆ CLI を使って見積もり金額データを取得する

見積額のデータを参照するためには、CloudWatch 用の CLI を使う事が出来る。なお、この CLI を使うためには、Java 1.5 以上の環境が必要。

Amazon CloudWatch Command Line Tool : Developer Tools : Amazon Web Services
http://aws.amazon.com/developertools/2534

これをダウンロード・展開。

$ wget http://ec2-downloads.s3.amazonaws.com/CloudWatch-2010-08-01.zip
$ unzip CloudWatch-2010-08-01.zip
$ cd CloudWatch-1.0.12.1/

次は、環境変数を指定する。 JAVA_HOME と AWS_CLOUDWATH_HOME 等々で、それぞれのパスを明示(各々の環境にあわせること)

$ export JAVA_HOME=/usr/local/jdk1.6.0
$ export AWS_CLOUDWATCH_HOME=/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1
$ export PATH=$PATH:/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1/bin
$ export EC2_REGION=us-east-1

そして、AWS キーの指定(X.509 Certsを使う方法もある)。環境変数 AWS_CREDENTIAL_FILE の指定も忘れずに。

$ cp ./credential-file-path.template ./credential
$ chmod 600 ./credential
$ export AWS_CREDENTIAL_FILE=このcredentialファイルのパス
$ vi credential

AWSAccessKeyIdと、AWSSecretKeyを指定。ファイルの取り扱いには要注意。

※詳細は、付属の “README.TXT” を参照のこと。

コマンドの実行テスト。エラーが無ければ問題無し。

$ mon-cmd --help
Command Name                       Description
------------                       -----------
help
mon-delete-alarms                  Delete alarms
(snip)
version                            Prints the version of the CLI tool and the API.

 For help on a specific command, type '<commandname> --help'

次はbillingに関するmetricsを取得する。

$ mon-describe-alarms --headers
ALARM                                 STATE  ALARM_ACTIONS                             NAMESPACE    METRIC_NAME       PERIOD  STATISTIC  EVAL_PERIODS  COMPARISON            THRESHOLD
awsbilling-AWS-Service-Charges-total  OK     arn:aws:sns:us-eas...1177877630:NotifyMe  AWS/Billing  EstimatedCharges  21600   Maximum    1             GreaterThanThreshold  15.0

このように、先ほど設定したアラームの情報が表示される。

捕捉:CloudWatchのCLIについては、@mikeda さんの blog 記事が参考になります。

実際にデータを取得するには、mon-get-stats コマンドを使う。

$ mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "Currency=USD"
2012-05-19 07:31:00  13.88  None

これは、コマンドを実行した時点で、全ての合計推定金額が $13.88。EC2や、RDS等のデータを取得したい場合は、dimensions のオプションを変更する。利用可能なdimensionsを調べるには、mon-list-metrics コマンドで取得可能。

$ mon-list-metrics | grep Billing
EstimatedCharges                AWS/Billing  {ServiceName=AmazonEC2,Currency=USD}
EstimatedCharges                AWS/Billing  {ServiceName=AmazonRDS,Currency=USD}
EstimatedCharges                AWS/Billing  {LinkedAccount=xxxxx,Currency=USD}
EstimatedCharges                AWS/Billing  {ServiceName=AmazonS3,LinkedAccount=xxxxx,Currency=USD}
(snip)
EstimatedCharges                AWS/Billing  {ServiceName=AmazonRoute53,Currency=USD}
EstimatedCharges                AWS/Billing  {ServiceName=AWSDataTransfer,Currency=USD}
EstimatedCharges                AWS/Billing  {ServiceName=AmazonSimpleDB,Currency=USD}LinkedAccc

※”LiinkedAccount”は、アカウント毎にmetricsを取得可能。

EC2等、個別のリソース毎のデータを取得するには、次のようにコマンドを実行する。

mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AmazonEC2,Currency=USD"
mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AmazonRDS,Currency=USD"
mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AmazonS3,Currency=USD"
mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AmazonRoute53,Currency=USD"
mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AmazonSimpleDB,Currency=USD"
mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AmazonSNS,Currency=USD"
mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AWSDataTransfer,Currency=USD"

以上、実際にコマンドを実行すると、それぞれのサービス毎に料金がわかる。

$ mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AmazonEC2,Currency=USD"
2012-05-19 07:31:00  13.33  None
$ mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AmazonRDS,Currency=USD"
2012-05-19 07:31:00  0.0  None
$ mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AmazonS3,Currency=USD"
2012-05-19 07:31:00  0.03  None
$ mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AmazonRoute53,Currency=USD"
2012-05-19 07:31:00  0.51  None
$ mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AmazonSimpleDB,Currency=USD"
2012-05-19 07:31:00  0.0  None
$ mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AmazonSNS,Currency=USD"
2012-05-19 07:31:00  0.0  None
$ mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "ServiceName=AWSDataTransfer,Currency=USD"
2012-05-19 07:31:00  0.01  None

ここまで出来れば、Munin に取り込むだけ。

ところで、Munin を何故使うのか?CloudWatch はデータの保管期間が2週間であり、過去に遡って確認することができない。そこで、普段からサーバのリソースを監視している Munin でもって、確認や通知をできるようにする。

まず、事前検証。Munin のプラグインを作る前に、スクリプトレベルで EstimatedCharges が取得可能か確認する。スクリプトは次の通り。

#!/bin/sh

export AWS_CLOUDWATCH_HOME=/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1
export PATH=$PATH:/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1/bin
export EC2_REGION=us-east-1
export JAVA_HOME=/usr/local/jdk1.6/
export AWS_CREDENTIAL_FILE=/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1/credential

echo -n "EstimatedCharges.value "
/home/zem/develop/aws/cloudwatch/CloudWatch-1.0.12.1/bin/mon-get-stats EstimatedCharges --statistics "Maximum" --namespace "AWS/Billing" --dimensions "Currency=USD" | cut -f4 -d' '

実行結果がこちら。

$ sh check.sh
EstimatedCharges.value 13.88

あとは、プラグインを書けば、グラフ化出来るはず。今日はここまで。

続きはこちら。

AWS利用料金グラフ化Muninプラグインを書いてみた( ^ω^) | Pocketstudio.jp log3
http://pocketstudio.jp/log3/2012/05/21/aws-estimated-charge-munin-plugin/

◆ 参考:

Billing Alerts
https://aws-portal.amazon.com/gp/aws/developer/account?ie=UTF8&action=billing-alerts

Monitor Your Estimated Charges Using Amazon CloudWatch – Amazon CloudWatch
http://docs.amazonwebservices.com/AmazonCloudWatch/latest/DeveloperGuide/monitor_estimated_charges_with_cloudwatch.html

mon-get-stats Command – Amazon CloudWatch
http://docs.amazonwebservices.com/AmazonCloudWatch/latest/DeveloperGuide/cli-mon-get-stats.html

 

カテゴリー: AmazonWebServices | タグ: , , , | コメントをどうぞ

【メモ】SmokePingでlatency視覚化(番外) init スクリプト

メモの中のメモ。
Smokeping の起動・再起動・停止を行う init スクリプトを書きました。

http://pocketstudio.jp/pub/linux/smokeping/smokeping_init

こちらに置いてあります。

<セットアップ例>

$ wget http://pocketstudio.jp/pub/linux/smokeping/smokeping_init
# mv smokeping_init /etc/init.d/
# /sbin/chkconfig --add smokeping

<サーバboot時、Smokeping自動起動設定と確認>

# /sbin/chkconfig smokeping on
$ /sbin/chkconfig --list smokeping
smokeping       0:off   1:off   2:on    3:on    4:on    5:on    6:off

<smokeping 起動>

# /etc/init.d/smokeping start
Starting smokeping daemon:
### parsing dig output...OK
Note: logging to syslog as local0/info.
Daemonizing /opt/smokeping/bin/smokeping ...

<停止>

# /etc/init.d/smokeping stop
Stopping smokeping daemon:                                 [  OK  ]

 

start は改善の余地がありますが、目的は達成していると思うので、、今の所このままでいこうと思っています。

カテゴリー: Monitoring | コメントをどうぞ

【メモ】SmokePingでlatency視覚化(2) DNS&HTTP応答編

SmokePing◆今度はDNSとHTTPの測定に挑戦!

Smokeping は、latency の計測およびグラフ化に特化した、オープンソースの監視ツールです。今回の投稿は、先日の Smokeping 導入編の続き(前回記事:【メモ】SmokePingでlatency視覚化はじめました(1)導入編)。

サンプルも公開しました。実環境からデータを取得しています。次の URL をご覧下さい。

特定 URL ( http://pocketstudio.jp/ ) に対する HTTP レイテンシの計測状況 (現況はこちら)

◆プラグイン的な役割を持つ probe (プローブ)

Smokeping が測定できるのは PING (IMCP) だけではありません。Smokeping には、Probeというプラグインのような概念があります。probe ( プローブ) とは、探針の意味(詳しくは Wikipedia 参照ください)。

この probe は、標準で ICMP、DNS 、HTTP だけでなく、FTP や SSH、 LDAP、Radius 等々、様々な計測対象があります。これら probe 用のファイルは /opt/smokeping/lib/Smokeping/probes に格納されています。ファイルの内容は Perl 向けのモジュールです(ファイル名が xxx.pm)。

今回は、実際に使用シーンの多そうな DNS と HTTP に対する probe を試してみます。

◆ DNS と HTTP の probe は、どのような働きをするのか

DNS の probe は、内部で dig を実行し、その結果が処理されるまでの時間を取得します。HTTP の probe は複数あるのですが、今回試したのは curl をつかって HTTP サーバにアクセスした時の応答時間を計測したものです。

具体的な詳しい処理については、それぞれの probe の中をご覧下さい。比較的分かりやすい Perl のモジュールだと思います。

◆ probe  を有効にするには

実際に probe を使うためには、smokeping の設定ファイル ( /opt/smokeping/etc/config ) に、いくつか記述をする事になります。まずは probe ファイルを開いてください。以下、色の変わっているところが、追加点です。

まずは **** Probes ***  に DNS と Curl (HTTP) の記述を追加します。

*** Probes ***

+ FPing
binary = /usr/sbin/fping
packetsize = 1000

+ DNS
binary = /usr/bin/dig
lookup = pocketstudio.jp
pings = 5
step = 180

+ Curl
binary = /usr/bin/curl
step = 60
urlformat = http://%host%/

次に、*** Targets *** に監視対象を記述します。

*** Targets ***

probe = FPing

menu = Top
title = "Smokeping" Network Latency Grapher
(略)
++ DNS
probe = DNS
menu = DNS latency
title = Service latency (DNS)

+++ dns1
host = example.jp

+++ dns2
host = example.net

++ HTTP
probe = Curl
menu = HTTP latency
title = Service latency (HTTP)

+++ www
title = HTTP latency for http://example.jp/
host = www.example.jp

+++ netx
host = netx.example.jp

※ example.jp および example.net は、実際のドメインに置き換えてご利用ください。

以上の記述を行ったあと、smokepingデーモンの再起動を行うと、設定が有効になります。

DNS の監視は、 DNS サーバがダウンしていないかどうかの監視、HTTP の場合も Web サーバ派正常にサービス継続を行っていたかどうかの参考になると思います。

カテゴリー: Monitoring | タグ: , | コメントをどうぞ

【メモ】SmokePingでlatency視覚化はじめました(1)導入編

◆Smokeping を入れてみました。

SmokePing – About SmokePing
http://oss.oetiker.ch/smokeping/

Smokepingは、ネットワークのレイテンシ(遅延、という和訳が適切かどうか分かりませんが、そのように表現されることもあると思います)を視覚的に表示するためのツールです。オープンソースで公開されており、作者は MRTG や RRDtool でおなじみTobias Oetiker氏。

これが Smokeping の画面。特定ホストに対する PING の状況が視覚化されています。”Smoke”という名の通り、値の幅を視覚化できるのが、他のツールとの大きな違いです。

Smokepingキャプチャ画面

Smokeping には、次のような特長があります。

  • レイテンシの視覚化
  • 動的なグラフの展開可能
  • 幅広いレイテンシの視覚化を行うプラグイン(HTTPやDNSにも対応)
  • 高度にカスタマイズ可能なアラート機能

言語自体は Perl で記述されていて、公式サイトの説明では色々な事が出来るようです。

◆導入経緯

とあるネットワークで、不定期に遅延が発生している「らしい」とう事象。時たまアラートがあがることもあるのだが、見かけ上は何も問題が無い「らしい」所うっきょう(;´∀`) しかし、放っておくと、何かのトラブルに陥るかもしれないし、各種のアラーティングでは、閾値以下…。

という所、ググッて見つけたのが Smokeping 。これを使えば、結構、細かく ping の状況を視覚化出来るとサイトに書いてある。で、実際に試してみた結果がこちらです。今回は、実際に1分間隔で ping の状況をグラフ化する所まで、試してみました。

◆導入方法

使うためには、ウェブサーバが動いている鯖で、ソースからコンパイル&設定を行います。なお、以下手順(私の環境)は Red Hat Enterprise Linux 5 ですが、CentOS や Debian 等々、同じような方法でインストールできると思います。なお、インストール手順詳細は、オフィシャルのドキュメントが参考になります。

まずは、ソースの入手と展開です。

# cd /usr/local/src/
# wget http://oss.oetiker.ch/smokeping/pub/smokeping-2.6.8.tar.gz
# tar xvfz smokeping-2.6.8
# cd smokeping-2.6.8

次に、Perl のモジュールをセットアップします。

# ./setup/build-perl-modules.sh /opt/smokeping/thirdparty

もしかしたら、環境によっては Perl のモジュールはセットアップ不要かもしれません。

あとは、configure です。/opt/smokeping にインストールします。

# ./configure --prefix=/opt/smokeping
# gmake install

lsでディレクトリをひらくと、必要なファイル群が展開されていることが分かります。

# ll /opt/smokeping/
合計 24
drwxr-xr-x 2 root root 4096  4月 23 13:10 bin
drwxr-xr-x 3 root root 4096  4月 23 13:11 etc
drwxr-xr-x 3 root root 4096  4月 23 13:11 htdocs
drwxr-xr-x 3 root root 4096  4月 23 13:11 lib
drwxr-xr-x 3 root root 4096  4月 23 13:11 share
drwxr-xr-x 6 root root 4096  4月 23 13:08 thirdparty

次に、fping をセットアップします。Smokeping はfpingと連動するため、もし入っていなければセットアップします。EPEL のパッケージで公開されているので、セットアップは非常に簡単。

# yum install fping

これでokです。EPEL リポジトリの組み込み方は、こちらのページを参照ください。

【メモ】EPELリポジトリをRed Hat Enterprise Linuxで使うには | Pocketstudio.jp log3
http://pocketstudio.jp/log3/2012/04/09/how_to_use_epel_repository_on_rhel/

◆初期設定

インストールが終われば、あとは設定ファイルの設置、Web サーバから見えるようにする設定、そして smokeping デーモンの起動です。

まずはsmokepingの設定ファイルです。「/opt/smokeping/etc/config」に設定ファイルを置きます。/opt/smokeping/etc/config/example/ のサンプルや、サイトの例を参考に、自分の場合は、次のようにしました。(変更箇所が青字です)

その前に、サンプル用の設定ファイル(config.dist)をコピーし、必要情報を書き換えます。

# cd /opt/smokeping/etc
# cp config.dist config

設定ファイルを編集します。

# vi config

*** General ***

owner    = Masahito Zembutsu   # 管理者の名前。Smokepingトップページに出ます
contact  = zem@pocketstudio.jp  # 管理者のアドレス
mailhost = localhost
sendmail = /usr/sbin/sendmail
# NOTE: do not put the Image Cache below cgi-bin
# since all files under cgi-bin will be executed ... this is not
# good for images.
imgcache = /opt/smokeping/cache
imgurl   = cache
datadir  = /opt/smokeping/data
piddir  = /opt/smokeping/var
cgiurl   = http://example.jp/smokeping/smokeping.cgi # ブラウザ上からのURL
smokemail = /opt/smokeping/etc/smokemail.dist
tmail = /opt/smokeping/etc/tmail.dist
# specify this to get syslog logging
syslogfacility = local0
# each probe is now run in its own process
# disable this to revert to the old behaviour
# concurrentprobes = no

*** Alerts ***
to = zem@pocketstudio.jp # アラート用の通知先
from = zem@pocketstudio.jp # アラート用の From

+someloss
type = loss
# in percent
pattern = >0%,*12*,>0%,*12*,>0%
comment = loss 3 times  in a row

*** Database ***

#step     = 300
step     = 60  # 一分間隔
pings    = 20

# consfn mrhb steps total

AVERAGE  0.5   1  1008
AVERAGE  0.5  12  4320
 MIN  0.5  12  4320
 MAX  0.5  12  4320
AVERAGE  0.5 144   720
 MAX  0.5 144   720
 MIN  0.5 144   720

*** Presentation ***

template = /opt/smokeping/etc/basepage.html.dist

+ charts

menu = Charts
title = The most interesting destinations

++ stddev
sorter = StdDev(entries=>4)
title = Top Standard Deviation
menu = Std Deviation
format = Standard Deviation %f

++ max
sorter = Max(entries=>5)
title = Top Max Roundtrip Time
menu = by Max
format = Max Roundtrip Time %f seconds

++ loss
sorter = Loss(entries=>5)
title = Top Packet Loss
menu = Loss
format = Packets Lost %f

++ median
sorter = Median(entries=>5)
title = Top Median Roundtrip Time
menu = by Median
format = Median RTT %f seconds

+ overview

width = 600
height = 50
range = 10h

+ detail

width = 600
height = 200
unison_tolerance = 2

"Last 3 Hours"    3h
"Last 30 Hours"   30h
"Last 10 Days"    10d
"Last 400 Days"   400d

#+ hierarchies
#++ owner
#title = Host Owner
#++ location
#title = Location

*** Probes ***

+ FPing

binary = /usr/sbin/fping

*** Slaves ***
secrets=/opt/smokeping/etc/smokeping_secrets.dist
+boomer
display_name=boomer
color=0000ff

+slave2
display_name=another
color=00ff00

*** Targets ***

probe = FPing

menu = Top
title = Network Latency Grapher
remark = Welcome to this SmokePing website.

+ mysite1
menu = Site 1
title = Hosts in Site 1

++ node1  # 以下ping対象ノード 環境に合わせ書き換えてください
host = node1.pocketstudio.net
++ node2
host = node2.pocketstudio.net
++ node3
host = node3.pocketstudio.net

ほとんどデフォルトのままですが、監視の時間間隔をデフォルトの300秒(5分)から60秒(1分)に変えています。これは、より細かなネットワークの情報が欲しかったからです。

設定ファイルの次は、Web インターフェース(Webから見えるところ)を設定します。/opt/smokeping/htdocs がウェブから見えるべき場所です。とある環境では、そのままドキュメントルート直下におきました。

# ln -s /opt/smokeping/htdocs/ /var/www/html/smokeping
# mv /var/www/html/smokeping/smokeping.fcgi.dist /var/www/html/smokeping/smokeping.cgi
# chmod 755 /var/www/html/smokeping/smokeping.cgi

※fcgi環境が入っていないとエラーになるかもしれません。その場合は、必要なモジュール・パッケージをインストールください。

※自分は、この直後ハマりました。なぜか画面は次のようなエラーが。

Software error:

ERROR: /opt/smokeping/etc/config, line 10: Directory '/opt/smokeping/cache' does not exist

For help, please send mail to the webmaster (root@xxxx, giving this error message and the time and date of the error.

原因は、見ての通り、「/opt/smokeping/cache」ディレクトリが無いよとの事。そういえば config ファイルで指定したディレクトリを作成していませんでした。ディレクトリ作成後も、エラーが表示されます。

ERROR: /opt/smokeping/etc/config, line 111: File '/opt/smokeping/etc/smokeping_secrets.dist' is world-readable or writable, refusing it

まだ足りないところがありました。最終的に、次のように対処。

# mkdir /opt/smokeping/cache
# mkdir /opt/smokeping/data
# mkdir /opt/smokeping/var
# chmod 640 ./smokeping_secrets.dist
# chown -R apache.apache /opt/smokeping/cache/ /opt/smokeping/data/ /opt/smokeping/var
# ln -s /opt/smokeping/cache /var/www/html/smokeping

※ chown の所有者およびグループが apache になっていますが(Red Hat のデフォルト設定)、Web サーバが動作するユーザ権限に書き換えてください。

最後に smokeping デーモンの起動です。

/opt/smokeping/bin/smokeping --config=/opt/smokeping/etc/config --logfile=smoke.log

正常に起動すると 、次のようにデーモンが立ち上がっているのが見えると思います。

# ps ax | grep smoke
18938 pts/0    S+     0:00 grep smoke
28517 ?        Ss     0:00 /opt/smokeping/bin/smokeping [FPing]

ちなみに、/var/log/messages にも、起動時の記録が残ります。もし正常動作しない時は、ログのチェックが有効でしょう。

Apr 23 14:20:08 sv smokeping[28434]: Starting syslog logging
Apr 23 14:20:08 sv smokeping[28517]: Smokeping version 2.006008 successfully launched.
Apr 23 14:20:08 sv smokeping[28517]: Not entering multiprocess mode for just a single probe.

あとは、しばらく待てば、グラフがアップデートされます。

ブラウザから http://URL/smokeping/smokeping.cgi にアクセスすると、画像が見えます。

SmokePing でホスト毎のグラフが表示される

この画面を更にクリックすると、特定のホストに関するグラフが拡大できます。

直近の3時間、30時間、10日分のグラフが表示

なお、グラフの上をクリック&ドラッグすると、その区間だけ拡大表示することもできます。

マウスで視点をクリックし、終点までドラッグすると…

このように、任意の区間をズーム可能です

今の所まだPingしか試していませんが、色々応用が利きそうです。特に、HTTPの応答時間の監視や、DNSサーバの応答時間測定、その他なんらかのパラメータをグラフ化したい時には役立つのじゃ無いでしょうか( ´∀`)

Reference:

先駆者のみなさん(ググッたら結構ありますね):

 

 

カテゴリー: Monitoring | タグ: , | コメントをどうぞ