2017年1月4日水曜日

LibreOffice(calc)マクロとTeraTermマクロで sar のリソース情報を集める


sar のリソース情報は sadf コマンドで TSV 形式で出力できます。
さらに、下記URLで紹介されている整形スクリプト(sadf2matrix)を使用すると、エクセルに取り込みやすい形式に整形できるようです。
そこで、
WindowsPCから、複数サーバ(CentOS6)にアクセスして sar のリソース情報(CPU使用率とか)を収集し、LibreOffice(calc)に読み込む作業を自動化できるか試してみました。

sar の収集は、TeraTermマクロで実施します。


1. 整形スクリプトの保存


上記で紹介した整形スクリプト(sadf2matrix)をWindowsPCに保存します。
整形スクリプトは、TeraTermマクロでCentOSサーバに送信して実行するので、CentOSの環境に合わせて、文字コードはUTF-8、改行コードは LF にします。

保存先は以下とします。
C:\workspace\LibreOfficeマクロ\sadf2matrix

2. TeraTermマクロの用意


TeraTermmマクロの仕様は以下のとおり。
  • 引数で指示されたサーバにログインする
  • sadf2matrix を送信する
  • cpu / memory / network / disk のリソース情報をTSVファイルに保存する
  • WindowsPCにTSVファイルを下記DIRにダウンロードする
    C:\workspace\LibreOfficeマクロ\sar
引数として、以下を渡します。
  1. IPアドレス
  2. sarファイルPATH
  3. 開始時刻(HH:MI:SS)
  4. 終了時刻(HH:MI:SS)
ソースコードは以下のとおり。
;
; sarデータ 収集
;
; <引数>
; params[2] : IPアドレス
; params[3] : sar ファイル
; params[4] : 開始時刻
; params[5] : 終了時刻
;
; <注意>
; サーバ側に下記パッケージがインストール済みであること
;  - openssh-clients

; 引数
ip = params[2]
dst_sar_file = params[3]
start_time = params[4]
end_time = params[5]

; SSH接続アカウント情報
remote_prompt = '#'
remote_user = 'root'
remote_pass = 'p@ssw0rd'

;
src_base_dir = 'C:\workspace\LibreOfficeマクロ'
dst_base_dir = '/tmp'
sprintf2 src_sadf2matrix '%s\sadf2matrix' src_base_dir
sprintf2 dst_sadf2matrix '%s/sadf2matrix' dst_base_dir

; ログイン
sprintf2 conbuf '%s /ssh /auth=password /user=%s /passwd=%s' ip remote_user remote_pass
connect conbuf
if result != 2 then
    messagebox 'teraterm macro could not connect to this Server.' 'Error'
    end 
endif

; ログイン待ち
timeout = 3
wait remote_prompt
if result == 0 then 
    disconnect 0 
    end 
endif

; ログファイル
getspecialfolder log_path 'Desktop'
getdate log_name '\&h_%Y%m%d_%H%M%S.log'
strconcat log_path log_name
logopen log_path 0 1

; 接続先情報
sendln 'date ; uname -n ; whoami'
wait remote_prompt

; sadf2matrix ファイルPUT
scpsend src_sadf2matrix dst_sadf2matrix
mpause 1000

;
strsplit start_time ':' 3
strjoin st ""

; cpu / load
sprintf2 cmdbuf1 'sadf -s "%s" -e "%s" -- -q -u -P ALL %s' start_time end_time dst_sar_file
sprintf2 cmdbuf2 '%s | bash %s -t "%H:%M:%S" > %s/sadf2matrix_%s_%s_cpu.tsv' cmdbuf1 dst_sadf2matrix dst_base_dir ip st
sendln cmdbuf2
wait remote_prompt

; memory / swap
sprintf2 cmdbuf1 'sadf -s "%s" -e "%s" -- -r -W %s' start_time end_time dst_sar_file
sprintf2 cmdbuf2 '%s | bash %s -t "%H:%M:%S" > %s/sadf2matrix_%s_%s_memory.tsv' cmdbuf1 dst_sadf2matrix dst_base_dir ip st
sendln cmdbuf2
wait remote_prompt

; network
sprintf2 cmdbuf1 'sadf -s "%s" -e "%s" -- -n DEV %s' start_time end_time dst_sar_file
sprintf2 cmdbuf2 '%s | bash %s -t "%H:%M:%S" > %s/sadf2matrix_%s_%s_network.tsv' cmdbuf1 dst_sadf2matrix dst_base_dir ip st
sendln cmdbuf2
wait remote_prompt

; io
sprintf2 cmdbuf1 'sadf -s "%s" -e "%s" -- -b %s' start_time end_time dst_sar_file
sprintf2 cmdbuf2 '%s | bash %s -t "%H:%M:%S" > %s/sadf2matrix_%s_%s_disk.tsv' cmdbuf1 dst_sadf2matrix dst_base_dir ip st
sendln cmdbuf2
wait remote_prompt

; ファイルGET
sprintf2 src "%s\sar\%s_%s_cpu.tsv" src_base_dir ip st
sprintf2 dst "%s/sadf2matrix_%s_%s_cpu.tsv" dst_base_dir ip st
scprecv dst src
mpause 1000

sprintf2 src "%s\sar\%s_%s_memory.tsv" src_base_dir ip st
sprintf2 dst "%s/sadf2matrix_%s_%s_memory.tsv" dst_base_dir ip st
scprecv dst src
mpause 1000

sprintf2 src "%s\sar\%s_%s_network.tsv" src_base_dir ip st
sprintf2 dst "%s/sadf2matrix_%s_%s_network.tsv" dst_base_dir ip st
scprecv dst src
mpause 1000

sprintf2 src "%s\sar\%s_%s_disk.tsv" src_base_dir ip st
sprintf2 dst "%s/sadf2matrix_%s_%s_disk.tsv" dst_base_dir ip st
scprecv dst src
mpause 1000

; 掃除
sprintf2 cmdbuf 'rm -f %s/sadf2matrix*' dst_base_dir
sendln cmdbuf
wait remote_prompt

; ログアウト
sendln 'exit'

end

ソースコードの保存先は以下とします。
C:\workspace\LibreOfficeマクロ\sar_collector.ttl

3. LibreOffice(calc)Pythonマクロの用意


Pythonマクロの仕様は以下のとおり
  • アクティブなシートから、IPアドレス、sarファイル、開始時刻、終了時刻の読み込む
  • TeraTermマクロを実行する
  • 下記DIRに格納されたTSVファイル名を取得する
    C:\workspace\LibreOfficeマクロ\sar
  • 以下をTSVファイルの数だけ繰り返す
    ・ 一番右側にシートを追加する
    ・ 追加シートにTSVファイルを読み込む

ソースコードは以下のとおり
#coding:Shift_JIS

import os
import csv

#
def tsvImport(*args):

    doc = XSCRIPTCONTEXT.getDocument()
    sheets = doc.getSheets()

    # アクティブシートのリストを入力して、TTマクロを実行する
    sheet = doc.CurrentController.ActiveSheet
    cellrange = sheet.getCellRangeByName("A1")
    cursor = sheet.createCursorByRange(cellrange)
    cursor.gotoEndOfUsedArea(True)
    end_row = cursor.Rows.Count

    for i in range(end_row):
      if i > 0:
        ip = sheet.getCellByPosition(0,i).String
        file = sheet.getCellByPosition(1,i).String
        start_time = sheet.getCellByPosition(2,i).String
        end_time = sheet.getCellByPosition(3,i).String
        ttl = r"c:\workspace\teraterm-4.93\ttpmacro /v c:\workspace\LibreOfficeマクロ\sar_collector.ttl"
        cmd = '%s %s %s %s %s' % (ttl,ip,file,start_time,end_time)
        #sheet.getCellByPosition(5,i).String = cmd
        os.system(cmd)

    # 新規シートを追加して TSV ファイルを入力する
    files = os.listdir(r"C:\workspace\LibreOfficeマクロ\sar")
    for tsv_file in files:

      n_sheets = sheets.Count
      sheet_name = tsv_file.replace(".tsv","")
      sheets.insertNewByName(sheet_name, n_sheets)
      sheet = doc.getSheets().getByName(sheet_name)

      fpath = r"C:\workspace\LibreOfficeマクロ\sar" + "\\"+ tsv_file
      with open(fpath, 'r') as f:
        rows = csv.reader(f, delimiter='\t')
        n_row = 0
        for row in rows:
          n_col = 0
          for col in row:
            sheet.getCellByPosition(n_col,n_row).String = col
            n_col = n_col + 1
          n_row = n_row + 1

ソースコードの保存先は以下とします。
C:\Users\<ユーザ>\AppData\Roaming\LibreOffice\4\user\Scripts\python\TsvImport.py

4.実行


4.1. sar でリソース情報の取得

負荷テストでの情報収集を想定して、まず、各サーバ上で sar コマンドを実行し、1秒間隔でデータを蓄積します。
下記の例では、1秒間隔で5分間データを収集し、/tmp/<ホスト名>.sar に保存します。
# sar -o /tmp/`uname -n`.sar 1 300 > /dev/null &
途中で停止したい場合は pgrep 'sar' などで pid を探して KILL します。

4.2. LibreOffice(calc)に収集先サーバのリストを記載

下図のようにリストを作成。
この例では、2台のサーバから sar の情報を収集します。



4.3.Pythonマクロを実行

[ツール] > [マクロ] > [マクロの実行] を選択して、TsvImport を実行します。



実行中は、下図のように表示されます。
DOS窓とTeraTermのウィンドウが表示されます。



実行が終了すると、下図のようにシートが追加され、sar の情報を読み込まれています。
1台につき4枚のシート(CPU/Memory/Network/DISK)が追加されるので、
この例では、2台分で計8枚のシートが追加されます。



4.4.グラフの作成

上記で作成したシートのデータを元に、手作業でグラフを作成したり性能分析に利用できます。