ZabbixからCloudWatchメトリクスを取得する方法について
お世話になっております。
Zabbix serverから外部スクリプト機能を活用して、AWS CloudWatchメトリクスを取得したいと考えております。
以下クラメソさんのサイトのスクリプトを基に当該機能を実装したのですが、Zabbixコンソール上ではメトリクスの取得ができません。
監視アイテムのステータスはエラーもなく、有効になっております。
Zabbix server上のコマンドプロンプトから以下スクリプトを実行した場合は、取得できています。
<コマンド> # sudo -u zabbix ./cloudwatch.sh -n AWS/RDS -d Name=DBInstanceIdentifier,Value=zabixdb -m CPUUtilization -s Average
<戻り値> # 4.0
Zabbix serverへ取得した値が送れていないようなのですが、原因が分からず。
何かご指摘頂けないでしょうか。
<監視アイテムの設定>
◦名前:CPU使用率
◦タイプ:外部チェック
◦キー:cloudwatch.sh["-n AWS/RDS","-d Name=DBInstanceIdentifier,Value=zabbixdb","-m CPUUtilization","-s Average"]
◦データ型:数値(浮動小数)
◦単位:%
◦更新間隔(秒):60
なお実装は以下のサイトの通りに実装しております。
<スクリプトのコード>
https://dev.classmethod.jp/cloud/aws/aws-shellscript-summary/#toc-2
https://dev.classmethod.jp/cloud/aws/zabbix-with-cloudwatch/
kasugai - 投稿数: 72
環境が無いので試せていませんが、一旦cloudwatch.shを少し修正して、スクリプトの開始時に「date」コマンドの結果をファイルに出力させて、実行している「aws cloudwatch get-metric-statistics」の結果もファイルに出力するようにして、zabbixが実行したときに想定した結果が返ってきているかを確認するのはいかがでしょうか。
なおファイルに出力する際、awsコマンドはsortやtailは行わないでそのまま出力させた方が分かりやすいと思います。
hon-chan - 投稿数: 33
kasugaiさん
ありがとうございます。
一度、ファイル出力させて、監視アイテムから実行がちゃんと出来ているか確認してみます。
アドバイスありがとうございました。
hon-chan - 投稿数: 33
kasugaiさん
監視アイテムにメトリクス取得スクリプトを引数とともに指定して、ファイル出力させてみました。
結果として、監視アイテムからスクリプトが実行されている事は確認できました。
出力結果は以下の通りです。Zabbixコンソール上で取得結果が表示されないのは、出力形式などがよくないのでしょうか?
併せてスクリプトと監視アイテムの設定内容も以下に記載致します。
=< kekka,txtファイル出力結果 >=============================
CPUUtilization
DATAPOINTS 1.0 2019-10-17T05:46:00Z Percent
====================================================
=<スクリプト内容>================================
#!/bin/sh
date >> /usr/lib/zabbix/externalscripts/date.txt
while getopts n:r:d:m:s: OPT
do
case ${OPT} in
n) NAMESPACE=${OPTARG} ;;
d) DIMENSIONS=${OPTARG} ;;
m) METRIC=${OPTARG} ;;
s) STATISTICS=${OPTARG} ;;
*) exit 1 ;;
esac
done
sudo /root/.local/bin/aws cloudwatch get-metric-statistics --region ap-northeast-1 --output text >>/usr/lib/zabbix/externalscripts/kekka.txt \
--namespace ${NAMESPACE} \
--dimensions ${DIMENSIONS} \
--metric-name ${METRIC} \
--statistics ${STATISTICS} \
--start-time `date -u -d '5 minutes ago' +%Y-%m-%dT%TZ` \
--end-time `date -u +%Y-%m-%dT%TZ` \
--period 300 | sort -k 3,3 | tail -n 1 | awk '{print $2}'
====================================================
=<監視アイテムの設定>=================================
◦名前:CPU使用率
◦タイプ:外部チェック
◦キー:cloudwatch.sh["-n AWS/RDS","-d Name=DBInstanceIdentifier,Value=zabbixdb","-m CPUUtilization","-s Average"]
◦データ型:テキスト ※数値(浮動小数)にするとエラー「Value "" of type "string" is not suitable for value type "Numeric (float)"」となる
◦単位:%
◦更新間隔(秒):60
====================================================
kasugai - 投稿数: 72
zabbixのアイテムに登録して動作した時には値が取れているのですね。
そうすると権限が足りないとか、コマンドのパスが通っていないとかではなさそうですね。
私のところでZabbix2.2環境となりますが、同じようなスクリプトを動かしましたが、データ型:数値(浮動小数)で値が取得されていました。
※awsコマンドはsudo 使っていないのと、profileオプションを入れているくらいの違いです。
※ちなみに、以下のようにzabbixユーザになった後にスクリプトを実行した場合、値が取得できるのでしょうか。
# su - zabbix --shell=/bin/bash
$ cd /usr/lib/zabbix/externalscripts/
$ ./cloudwatch.sh "-n AWS/RDS" "-d Name=DBInstanceIdentifier,Value=zabbixdb" "-m CPUUtilization" "-s Average"
また、AWS側についてはあまり詳しくありませんが、
スクリプトからファイルに出力している処理を戻して、
start-timeの「5 minutes ago」を「10 minutes ago」とかに変更してみるとどうでしょうか。
cloudwatchのデータが5分間隔で登録されると思うので、
スクリプト実行のタイミングで、たまたまcloudwatchのデータがまだ登録されていないとかそういうのが無いか気にしています。
自分の環境でテストしたスクリプト内容
===ここから===
#!/bin/sh
while getopts n:r:d:m:s: OPT
do
case ${OPT} in
n) NAMESPACE=${OPTARG} ;;
d) DIMENSIONS=${OPTARG} ;;
m) METRIC=${OPTARG} ;;
s) STATISTICS=${OPTARG} ;;
*) exit 1 ;;
esac
done
aws --profile pf01 cloudwatch get-metric-statistics --region ap-northeast-1 --output text\
--namespace ${NAMESPACE} \
--dimensions ${DIMENSIONS} \
--metric-name ${METRIC} \
--statistics ${STATISTICS} \
--start-time `date -u -d '5 minutes ago' +%Y-%m-%dT%TZ` \
--end-time `date -u +%Y-%m-%dT%TZ` \
--period 300 | sort -k 3,3 | tail -n 1 | awk '{print $2}'
===ここまで===
hon-chan - 投稿数: 33
kasugaiさん
ご回答頂きありがとうございます。
以下の箇所でテキストファイルへ出力結果をリダイレクトしてしまっていた為、NullをZabbixへ返していたようです。
> sudo /root/.local/bin/aws cloudwatch get-metric-statistics --region ap-northeast-1 --output text >>/usr/lib/zabbix/externalscripts/kekka.txt \
その為、エラー「Value "" of type "string" is not suitable for value type "Numeric (float)"」となっていた模様です。
テキストファイルへの出力を削除した結果、Zabbixコンソール上で取得結果が表示されました!
どうもありがとうございました!