最近、サーバー監視に Mackerel(マカレル): 新世代のサーバ管理・監視サービス を使い始めました。
閾値の監視や、Webhook 等便利なのですが、無料版だとデータの保持期限が1日で、1週間、1ヶ月等の長めの期間でのデータを保持してもらうためには有料版を使う必要があります。
もう少し長めの期間のデータを記録したかったので、何か実現方法はないか調べたところ、Google Analytics に 指標を記録する例がありました。
How to use Google Analytics to Monitor Your Servers (or anything else!) | mojocode.com
同じことを Bash ではなくて、Python で サーバー指標を 記録して Google Analytics に送付できるか試してみたので、実施した結果を記載します。
- 何故 Google Analytics に記録するか?
- データの記録方法
2.1. 記録する指標について
2.2. 使い方
2.3. 使用環境
2.4. Google Analytics の設定
2.5. 依存ライブラリのインストール
2.6. sysstat の インストール、記録間隔を1分にする
2.7. スケジュール設定 - データ可視化
3.1. loadavg1 を取得する
3.2. Google スプレッドシート で可視化
3.3. Google Data Portal での可視化 - 実施後の感想
- 参考
1. 何故 Google Analytics に記録するか?
Google Analytics に記録したい理由を以下に記載します。
-
Server に保持すると、ディスク容量を消費する
Server 側で保持することもできますが、VPS 1台でブログは運用しています。
ディクス容量を消費するのでこれは避けたかったです。 -
基本的に無料で使える
Google Analytics であればデータは1年半保持され、月1千万イベントまで無料で使えます。
1年半保時されれば、週、月単位での変化が把握できます。これを無料で実現できるのはメリットかなと思いました。 -
デフォルトでグラフを描画できる機能がある
本来の使い方ではないかもしれませんが、記録したデータを可視化するための機能があります。
データの設定方法によっては何もしなくても可視化してくれるかもしれませんが、そこまで考えなくてもカスタムレポート、Google Data Portal 等で柔軟な可視化が行えます。1
2. データの記録方法
作成したスクリプトを、kemsakurai/server-metrics-2-ga: The python tool to record server metrics in Google Analytics に UP しました。
以下に 記録される指標、スクリプトの使い方を記載します。
2.1. 記録する指標について
以下の指標を、Google Analytics のイベントとして記録します。
記録する指標 | Event Category | Event Action | Event Label | Event Value |
---|---|---|---|---|
loadavg1 | loadavg | loadavg1 | 計測値 | 0 |
loadavg5 | loadavg | loadavg5 | 計測値 | 0 |
loadavg15 | loadavg | loadavg15 | 計測値 | 0 |
cpu user | cpu-xx | user | 計測値 | 0 |
cpu system | cpu-xx | system | 計測値 | 0 |
cpu iowait | cpu-xx | iowait | 計測値 | 0 |
memory total | memory | total | 計測値 (MB) | 0 |
memory used | memory | used | 計測値 (MB) | 0 |
memory available | memory | available | 計測値 (MB) | 0 |
swap total | swap | total | 計測値 (MB) | 0 |
swap used | swap | used | 計測値 (MB) | 0 |
swap available | swap | available | 計測値 (MB) | 0 |
io rtps | io | rtps | 計測値 | 0 |
io wtps | io | wtps | 計測値 | 0 |
disk total size | filesystem-xx | total | 計測値(MB) | 0 |
disk used size | filesystem-xx | used | 計測値(MB) | 0 |
network rxkB | network-xxx | rxkB | 計測値 | 0 |
network txkB | network-xxx | txkB | 計測値 | 0 |
-
補足
-
xxx
、xx
の記載について
filesystem 等は環境により、device 数が変わります。
デバイスごとに複数回記録送信されます。 -
計測値
について
計測値 には 記録した数値が設定されます。 -
Event Value について
全て 0 を設定しています。整数の値のみ設定可能で、設定可能な指標もありますが、少数項目で設定できない場合もあるため、一律 0 で -
Timestamp をカスタムディメンションとして記録
イベント送信時にカスタムディメンション 1 に Timestamp を記録します。
-
2.2. 使い方
以下、スクリプトの使い方について記載します。
2.3. 使用環境
以下の環境で動作確認、稼働しています。
-
OS
cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)
-
Python のバージョン
python3.6 -V Python 3.6.4
2.4. Google Analytics の設定
以下、Google Analytics の設定を行います。
-
サーバーのメトリクス記録用のプロパティを作成する。
Pageview 等を記録しているプロパティでも記録できますが、それなりのデータ量になります。
別途、新規でプロパティを作成しサーバーのメトリクスのみ記録するようにするのをお薦めします。
いか、アナリティクスヘルプのプロパティの追加手順になります。
プロパティを設定する - アナリティクス ヘルプ -
カスタムディメンションの追加
以下、Timestamp 設定用のカスタムディメンションを追加します。
カスタムディメンションの Index 番号は 1です。
2.5. 依存ライブラリのインストール
以下のライブラリに依存します。
* giampaolo/psutil: Cross-platform lib for process and system monitoring in Python
Python で、サーバーのメトリクスを取得できるライブラリです。
スクリプト内でのデータの取得は、psutil
、os
のモジュールで取得可能はデータは取得し、取得できない指標は、subprocess
で直接 Linux コマンドを実行して取得しています。各メトリクスの取得方法はPython で サーバメトリクス を取得する | Monotalk でまとめました。よろしければご確認ください。
-
mirumee/google-measurement-protocol: A Python implementation of Google Analytics Measurement Protocol
Measurement Protocol を簡単に送信するするためのライブラリです。カスタム速度、例外等のエラーの送付はできません。今回はイベントの送付を行いたかったので使用しました。 -
pip でインストール
いか、コマンドでインストールできます。
pip install psutil pip install google_measurement_protocol
2.6. sysstat の インストール、記録間隔を1分にする
yum で sysstat をインストールし、記録間隔を1分にします。
インストールは以下の記事が参考になりました。
sarインストール&設定手順 - Qiita
インストール後に、以下のように /etc/cron.d/sysstat
を編集します。
- /etc/cron.d/sysstat
# Run system activity accounting tool every 1 minutes */1 * * * * root /usr/lib64/sa/sa1 1 1 # Run system activity accounting tool every 10 minutes #*/10 * * * * root /usr/lib64/sa/sa1 1 1 # 0 * * * * root /usr/lib64/sa/sa1 600 6 & # Generate a daily summary of process accounting at 23:53 53 23 * * * root /usr/lib64/sa/sa2 -A
スクリプト内では、sadf
というコマンドを実行していますが、これは sysstat
に付属しており、sysstat
をインストールすると使用可能になります。
2.7. スケジュール設定
サーバーにスクリプト配置後、cron で動かす場合は以下のように記載します。
*/1 * * * * /bin/python3.6 /scripts/server_metrics_2_ga.py -p UA-xxxxxxxx
標準エラーも含めてログに書き出す場合は以下のように記載します。
*/1 * * * * /bin/python3.6 /scripts/server_metrics_2_ga.py -p UA-xxxxxxxx &>> /var/log/server_metrics_2_ga.log
UA-xxxxxxxx
には Google Analytics のプロパティID を指定してください。 python3.6 server_metrics_2_ga.py -p UA-xxxxxxxx
3. データ可視化
Google Analytics - Google スプレッドシート アドオン を使ってデータを取得します。
全てのデータ取得設定は記載していませんが、同じ要領で設定が可能です。
3.1. loadavg1 を取得する
loadavg1 の設定例を記載します。
Google Analytics アドオンで Create Report 実行後に作成される Report Configuration
シートに以下の内容を入力します。
- View ID
Google Analytics の View ID を指定します。 - Report Name
シート名になります。loadavg1
にします。 - Start Date
1ヶ月分のデータを取得したいので、30daysAgo
にします。 - End Date
当日を示すtoday
を入力します。 - Metrics
ga:eventValue
を指定します。値は使用しないですが、必須で指定する必要があるためです。 - Dimensions
ga:eventLabel,ga:dimension1
を指定します。dimension1 には Timestamp が設定されている想定です。 - Order
Timestamp でソートした状態にしたいので、ga:dimension1
を指定します。 - Filters
絞り込み条件です。ga:eventCategory==loadavg;ga:eventAction==loadavg1
を指定します。 - Segments
未設定です。 -
Limit
50000件を指定します。取得可能な最大値です。 -
設定イメージ
以下のようになります。
3.2. Google スプレッドシート で可視化
時間感覚の短いデータを記録するのは Google スプレッドシート の グラフ機能の方が見やすいかと思います。
3日分のloadavg1 を可視化すると以下のように描画されました。
3.3. Google Data Portal での可視化
Google Data Portal で 同じ期間の可視化を行うと以下のようになります。
Google Data Portal だと、日付単位で平均計算できるのがメリットで、このグラフで長めの期間でのサーバー指標の傾向を把握できます。
期間選択では日付以下の単位での絞り込み、可視化ができないのでそこは、スプレッドシートのグラフ描画機能を使うことになります。
4. 実施後の感想
実施後、以下感想を持ちました。
-
可視化が面倒
Google Data Portal で描画しましたが、データソース を Google Analytics AddOn を使ってスプレッドシートに抽出し 作るので手間です。
取得したデータを加工して1つのデータソースにする、もしくは、そもそも イベントではなく カスタム指標で設定すればまとめて取得が可能になります。 -
アラート機能
Google Analytics の カスタムアラート機能の組合わせができると、リアルタイム性はないですが急激な変化を検知してくれるので良いかなと思います。
これも、カスタム指標として設定した方が使いやすいかと思います。 -
取得するデータ量の問題
1分おきのサーバー指標取得だと、1日 1440 回記録されます。 Google Analytics Addon の データ取得件数が 50000 件なので 34 日分しか取得できません。
これより長い期間を保持する場合は、Addon だけでは無理で データ保持の仕組みを構築する必要があります。
5. 参考
以下、参考にした記事へのリンクです。
- CentOS 7 : SysStat インストールと設定 : Server World
- [How to use Google Analytics to Monitor Your Servers (or anything else!) | mojocode.com]
実際に試してみて、カスタム指標で記録すべきかもと思いました。カスタム指標は、整数、通貨(少数)、時間 が選択でき、サーバー指標だと通貨(少数)かとは思われるのですが、これでいい感じでになるかはやはり試してみないとわからないので、後日試してみようかと思います。
以上です。
-
作成したスクリプトのデータ設定方法だと、Google Analytics 上ではいい感じに可視化ができませんでした。指標と、ディメンションを意識したデータ設定が必要になります。 ↩
コメント