~ To be, or not to be, or to think about it tomorrow. ~ null-i.net |
Linux/sarをグラフ化その4(Excelで読み込む | |
マクロ苦手ですけど、必要に迫られて作ったことがあります(2018-03-16) どうやら、うちのサイトに ・・・とはいえ、むかしの話なので内容は覚えておらず、 sarでログを取る†まずは sar の -o オプションでログを拾っておきましょう。 ログをshellで CSV にする†ログをsar -f で読み込んで、 #!/bin/sh export LANG=C # # sar -o で取得したログをCSVにする例 # 必要に応じて変更&バグ修正 (^^; して使ってください # # この例はLinux(CentOS) で作成したので、必要に応じて、 # awk を gawk にしたり、egrep を grep -e にしたり環境に合わせて下さい # # 出力ファイルは、別途掲載している(予定)のマクロと連動するので # ファイル名を変える際は、マクロの方も変更して使ってください # #--- ここの変数を設定する ------------ SAR_INPUT=./sar_log # sar -o で出力したログ SAR_DATE=`date +%y%m%d` # ログの出力日付 # sarデータからログ開始時刻を取得します SAR_TIME=`sar -f $SAR_INPUT |\ awk '{ if($1~/[0-9:]+/){ gsub(":", "", $1); print $1; exit;} } '` SAR_OUTPUT_DIR=./$SAR_DATE # 出力先ディレクトリ SAR_OUTPUT_COMMENT="one_fine_day" # コメント欄(スペース不可) #--- ここの変数を設定(ここまで) ----- get_output_path(){ # sarYYMMDD-HHMMSS-type-comment.csv printf ${SAR_OUTPUT_DIR}/sar${SAR_DATE}-${SAR_TIME}-$1-${SAR_OUTPUT_COMMENT}.csv } if [ ! -d $SAR_OUTPUT_DIR ]; then mkdir $SAR_OUTPUT_DIR; fi # # CPU summary (sar -u) # 00:00:01 CPU %user %nice %system %iowait %steal %idle # 00:10:01 all 0.08 0.00 0.06 0.02 0.17 99.68 # 00:20:01 all 0.07 0.00 0.06 0.02 0.18 99.67 # output_file=`get_output_path CpuSummary` sar -f $SAR_INPUT -u |\ egrep -vi '^$|average|Linux|CPU' |\ awk ' BEGIN{ printf("%s,%s,%s,%s,%s,%s,%s\n", "time", "total", "user", "nice", "sys", "io", "steal"); } { if( $2 ~ /all/){ printf("%s,%0.2f,%0.2f,%0.2f,%0.2f,%0.2f,%0.2f\n", $1, 100-$8, $3, $4, $5, $6, $7); } } ' \ > $output_file # # CPU per-processor (sar -P ALL) # *** if 1 only, you don't need this log. *** # # 00:00:01 CPU %user %nice %system %iowait %steal %idle # 00:10:01 all 0.08 0.00 0.06 0.02 0.17 99.68 # 00:10:01 0 0.07 0.00 0.07 0.01 0.09 99.76 # 00:10:01 1 0.08 0.00 0.04 0.04 0.25 99.59 # output_file=`get_output_path CpuAll` sar -f $SAR_INPUT -P ALL |\ egrep -vi '^$|average|Linux|CPU' |\ awk ' BEGIN{ last_time = "-"; count = 0; } { if($1 != last_time){ if(last_time == "-"){ last_time=$1; } else { if(count <= 0){ # 初回はヘッダ行を出力する printf("time"); for(i in cpu){ printf(",cpu-%d", i); } printf("\n"); } printf("%s", last_time); for(i in cpu){ printf(",%0.2f", 100-value[i]); delete velue[i] } printf("\n"); count++ } last_time = $1; } if( $2 !~ /all/){ if(count <= 0){ # 初回はCPUデータの行数を記録する cpu[$2] = $2 } value[$2] = $8; } } END{ printf("%s", last_time); for(i in cpu){ printf(",%0.2f", 100-value[i]); } printf("\n"); } ' \ > $output_file sarの出力はログの内容によって異なるので、 Excelで読み込む†上記のShellで出力したCSVをディレクトリごと持ってきたら、 ' indexシート以外を全削除して、 ' 指定フォルダのCSVを全て読み込んで、 ' グラフを描画します ' ' index という名前のシートを作って ' 「Run」を呼ぶボタンとかを置いて使ってください Sub Run() DeleteAllSheets ReadAllCsv makeLink Sheets("index").Activate End Sub Sub DeleteAllSheets() ' "index" という目次用シートを除いて、すべてのシートを削除します Dim is_index As Boolean is_index = False For Each s In ThisWorkbook.Sheets If s.Name = "index" Then is_index = True End If Next If is_index Then Worksheets("index").Cells.Clear Else Worksheets.Add ActiveSheet.Name = "index" End If Application.DisplayAlerts = False For Each s In ThisWorkbook.Sheets If s.Name <> "index" Then s.Delete End If Next Application.DisplayAlerts = True End Sub Sub ReadAllCsv() ' 指定フォルダにある、すべてのCSVファイルを読み込みます Dim path As String, buf As String With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub End If path = .SelectedItems(1) End With buf = dir(path & "\*.csv") Do While buf <> "" Call OpenCsv(path, buf) buf = dir() Loop End Sub Sub OpenCsv(dir As String, file As String) ' CSVファイルを開いて、グラフを作成します Workbooks.Open dir & "\" & file ActiveSheet.Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) ' file から情報を拾う ' 書式は「sarYYMMDD-HHMMSS-データ種類-コメント.csv」を前提としています Dim val As Variant val = Split(file, "-") Dim c_time As String, c_type As String c_time = val(1) c_type = val(2) ' シート名を変更(半角で31文字までが上限?) ActiveSheet.Name = c_time & "-" & c_type ' グラフを作成 Call MakeNewChart(ActiveSheet.Name, c_time, c_type) End Sub Sub MakeNewChart(s_name As String, s_time As String, s_type As String) ' グラフを作ります ActiveSheet.Shapes.AddChart2(227, xlLine).Select ActiveChart.SetSourceData Source:=Sheets(s_name).Range("A1").CurrentRegion ActiveChart.Location Where:=xlLocationAsNewSheet ActiveChart.Name = "グラフ" & s_name ActiveChart.ChartTitle.Text = s_type ' タイプ毎にグラフの描画方法を変えます If s_type = "CpuSummary" Or s_type = "CpuAll" Then ' 使用率グラフの場合は、範囲を0~100で固定する ActiveChart.Axes(xlValue).MaximumScale = 100 ActiveChart.Axes(xlValue).MinimumScale = 0 End If End Sub Sub makeLink() ' CSV表の一覧と、そのリンクをつくります ' グラフへのリンクは作れないので、何か別の方法で対応しましょう ' 開始位置は、よしなに ' マクロの開始ボタンとか置くと思ったので、5行目から開始にしました Sheets("index").Select Range("A5").Select For Each s In ThisWorkbook.Worksheets If s.Name <> "index" Then ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", _ SubAddress:="'" & s.Name & "'!A1", _ TextToDisplay:="'" & s.Name & "'" Selection.Offset(1, 0).Select End If Next End Sub 先ほどのCSVログの作成以上に、 いかがでしょうか・・・ |
|