最近、サーバー監視に 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 に送付できるか試してみたので、実施した結果を記載します。

  1. 何故 Google Analytics に記録するか?
  2. データの記録方法
    2.1. 記録する指標について
    2.2. 使い
    2.3. 使用環境
    2.4. Google Analytics の設定
    2.5. 依存ライブラリのインストール
    2.6. sysstat の インストール、記録間隔を1分にする
    2.7. スケジュール設定
  3. データ可視化
    3.1. loadavg1 を取得する
    3.2. Google スプレッドシート で可視化
    3.3. Google Data Portal での可視化
  4. 実施後の感想
  5. 参考


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 CategoryEvent ActionEvent LabelEvent Value
loadavg1loadavgloadavg1計測値0
loadavg5loadavgloadavg5計測値0
loadavg15loadavgloadavg15計測値0
cpu usercpu-xxuser計測値0
cpu systemcpu-xxsystem計測値0
cpu iowaitcpu-xxiowait計測値0
memory totalmemorytotal計測値 (MB)0
memory usedmemoryused計測値 (MB)0
memory availablememoryavailable計測値 (MB)0
swap totalswaptotal計測値 (MB)0
swap usedswapused計測値 (MB)0
swap availableswapavailable計測値 (MB)0
io rtpsiortps計測値0
io wtpsiowtps計測値0
disk total sizefilesystem-xxtotal計測値(MB)0
disk used sizefilesystem-xxused計測値(MB)0
network rxkBnetwork-xxxrxkB計測値0
network txkBnetwork-xxxtxkB計測値0
  • 補足

    • xxxxx記載について
      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です。
    2019-01-25 23.28.19.png - Google ドライブ

2.5. 依存ライブラリのインストール

以下のライブラリに依存します。
* giampaolo/psutil: Cross-platform lib for process and system monitoring in Python
Python で、サーバーのメトリクスを取得できるライブラリです。
スクリプト内でのデータの取得は、psutilosモジュールで取得可能はデータは取得し、取得できない指標は、subprocess直接 Linux コマンドを実行して取得しています。各メトリクスの取得方法はPython で サーバメトリクス を取得する | Monotalk でまとめました。よろしければご確認ください。

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    
上記だと、エラー時に Mail 送信の対象になります。
標準エラーも含めてログに書き出す場合は以下のように記載します。
 */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件を指定します。取得可能な最大値です。

  • 設定イメージ
    以下のようになります。
    2019-01-26 1.39.56.png - Google ドライブ

3.2. Google スプレッドシート で可視化

時間感覚の短いデータを記録するのは Google スプレッドシート の グラフ機能の方が見やすいかと思います。
3日分のloadavg1 を可視化すると以下のように描画されました。
2019-01-26 1.47.36.png - Google ドライブ

3.3. Google Data Portal での可視化

Google Data Portal で 同じ期間の可視化を行うと以下のようになります。
Google Data Portal だと、日付単位で平均計算できるのがメリットで、このグラフで長めの期間でのサーバー指標の傾向を把握できます。
期間選択では日付以下の単位での絞り込み、可視化ができないのでそこは、スプレッドシートのグラフ描画機能を使うことになります。
2019-01-26 2.23.47.png - Google ドライブ


4. 実施後の感想

実施後、以下感想を持ちました。

  • 可視化が面倒
    Google Data Portal で描画しましたが、データソース を Google Analytics AddOn を使ってスプレッドシートに抽出し 作るので手間です。
    取得したデータを加工して1つのデータソースにする、もしくは、そもそも イベントではなく カスタム指標で設定すればまとめて取得が可能になります。

  • アラート機能
    Google Analytics の カスタムアラート機能の組合わせができると、リアルタイム性はないですが急激な変化を検知してくれるので良いかなと思います。
    これも、カスタム指標として設定した方が使いやすいかと思います。

  • 取得するデータ量の問題
    1分おきのサーバー指標取得だと、1日 1440 回記録されます。 Google Analytics Addon の データ取得件数が 50000 件なので 34 日分しか取得できません。
    これより長い期間を保持する場合は、Addon だけでは無理で データ保持の仕組みを構築する必要があります。


5. 参考

以下、参考にした記事へのリンクです。

実際に試してみて、カスタム指標で記録すべきかもと思いました。カスタム指標は、整数、通貨(少数)、時間 が選択でき、サーバー指標だと通貨(少数)かとは思われるのですが、これでいい感じでになるかはやはり試してみないとわからないので、後日試してみようかと思います。
以上です。


  1. 作成したスクリプトのデータ設定方法だと、Google Analytics 上ではいい感じに可視化ができませんでした。指標と、ディメンションを意識したデータ設定が必要になります。 

コメント

カテゴリー