2014-03-26 89 views
4

我有一個應用程序,每次寫入日誌時都會寫出日誌。日期和時間信息是指該功能的結束時間。通過使用執行時間,我們計算請求開始的時間。生成線程利用摘要

以下是日誌目前的樣子:

year | month | day | hour | minute | seconds | Thread | UserName   | ExecTime 
2014 | 3  | 26 | 8 | 57  | 300  | 1  | file_download  | 33.86 
2014 | 3  | 26 | 8 | 57  | 45  | 1  | file_upload  | 0.359 
2014 | 3  | 26 | 8 | 57  | 55  | 1  | folder_browse  | 0.234 
2014 | 3  | 26 | 8 | 58  | 11  | 1  | sending_email  | 0.14 
2014 | 3  | 26 | 8 | 58  | 20  | 1  | browsing_favorites | 0.985 
2014 | 3  | 26 | 8 | 58  | 29  | 1  | file_download  | 0.266 
2014 | 3  | 26 | 8 | 58  | 33  | 1  | file_upload  | 0.296 
2014 | 3  | 26 | 8 | 58  | 37  | 1  | file_zip   | 0.25 
2014 | 3  | 26 | 8 | 58  | 41  | 1  | view_properties | 0.0 
2014 | 3  | 26 | 8 | 58  | 46  | 1  | file_download  | 0.187 

說明目的

作爲一個請求可能跨越幾個幾分鐘甚至幾小時就變得難以計算在每個線程的利用率一分鐘一分鐘。下面的輸出說明我後輸出:

Thread | month | day | hour | minute | % Busy 
1  | 3  | 26 | 8 | 57  | 0.5 
2  | 3  | 26 | 8 | 57  | 0.1 
3  | 3  | 26 | 8 | 57  | 0.9 

說明目的

例如,如果請求開始在12時三十分30秒執行,並在十二時三十二分30秒結束上表看起來像:

Thread | month | day | hour | minute | % Busy 
1  | 3  | 26 | 12 | 29  | 0 
1  | 3  | 26 | 12 | 30  | 0.5 
1  | 3  | 26 | 12 | 31  | 1 
1  | 3  | 26 | 12 | 32  | 0.5 
1  | 3  | 26 | 12 | 33  | 0 

說明目的

輸出中的分鐘數將是可以在日誌中找到的第一個請求和最後一個請求之間的分鐘數。

UPDATE

下面是從@TessellatingHeckler請求所採取的澄清摘要:用於開始/結束部分分鐘計算的利用率分數

  1. 計算開始時間
  2. 在100%忙碌時計數分鐘數
  3. 在每分鐘內添加多個請求/開始結束重疊。
  4. 填寫缺少分鐘爲0%繁忙。
  5. 出示每個線程的列表,從第一項到最後一項的計算的開始,顯示到分鐘和%繁忙的日期時間

我知道這很難,但我只需要一個方法,將翻譯以及代碼。我很高興使用Perl,PowerShell或Java。

謝謝

+1

我沒有得到你想要的。您的示例輸出顯示線程1,在8:57,0.5%繁忙。然而,輸入顯示它在8:57:32有ExecTime 33秒。爲什麼不是那一分鐘〜50%忙?或者在輸入範圍內的兩分鐘內有25%的忙?從8:57:32,33秒ExecTime通過一分鐘的邊界(從前一分鐘或下一分鐘)進行分析,你如何解釋這一點?然而,如果你想要的是每分鐘繁忙的百分比,那麼你所做的只是拋開秒數,計算時間/ 60,這不是一個統計計算的很大一部分。 – TessellatingHeckler

+0

@TessellatingHeckler對不起,該代碼僅用於說明目的,數學上不正確。我應該指出的。我會在我的問題中糾正這一點。 – Bruno

+0

是我的理解權嗎?請求結束後,寫入日誌條目(結束時間,線程編號,持續時間)。您需要:1)計算開始時間,2)開始/結束部分分鐘,計算繁忙分數。 3)在100%忙碌時計數分鐘數,4)在每分鐘內添加多個請求/開始結束重疊。 5)填寫缺少的分鐘爲0%繁忙。 5)從計算出的第一個條目開始到最後一個條目,顯示每個線程的列表,顯示日期時間到分鐘和繁忙百分比。 – TessellatingHeckler

回答

1

下面的東西會爲你做大部分的工作。你必須弄清楚什麼忙你自己的實際含義,但:

use List::Util qw(sum); 

use strict; 
use warnings; 

<DATA>; # Skip Header 

my %thread; 
while (<DATA>) { 
    chomp; 
    my @data = split /\s*\|\s*/; 
    push @{$thread{$data[6]}}, \@data; 
} 

print "Thread | month | day | hour | minute | ExecTime\n"; 
for my $id (sort {$a <=> $b} keys %thread) { 
    my $time = sum map {$_->[7]} @{$thread{$id}}; 
    printf "%-6s | %-5s | %-3s | %-4s | %-6s | %.03f\n", $id, @{$thread{$id}[0]}[1,2,3,4], $time; 
} 

__DATA__ 
year | month | day | hour | minute | seconds | Thread | ExecTime (seconds) 
2014 | 3  | 26 | 8 | 57  | 32  | 1  | 33.86 
2014 | 3  | 26 | 8 | 57  | 45  | 2  | 0.359 
2014 | 3  | 26 | 8 | 57  | 55  | 3  | 0.234 
2014 | 3  | 26 | 8 | 58  | 11  | 1  | 0.14 
2014 | 3  | 26 | 8 | 58  | 20  | 2  | 0.985 
2014 | 3  | 26 | 8 | 58  | 29  | 3  | 0.266 
2014 | 3  | 26 | 8 | 58  | 33  | 3  | 0.296 
2014 | 3  | 26 | 8 | 58  | 37  | 1  | 0.25 
2014 | 3  | 26 | 8 | 58  | 41  | 2  | 0.0 
2014 | 3  | 26 | 8 | 58  | 46  | 1  | 0.187 

輸出:

Thread | month | day | hour | minute | ExecTime 
1  | 3  | 26 | 8 | 57  | 34.437 
2  | 3  | 26 | 8 | 57  | 1.344 
3  | 3  | 26 | 8 | 57  | 0.796 
+0

爲什麼在第57分鐘,你的輸出說線程1有34秒的ExecTime? – TessellatingHeckler

+0

@TessellatingHeckler結合線程值時,我選擇了最短的時間,就像他在他的例子中那樣。就這些。 – Miller

1

我不明白你的請求中的所有部分,但我給它一個鏡頭在PowerShell中。該腳本執行以下操作:

  • 估計每個行(列中指定的日期 - exectime(秒))的開始時間
  • 返回每分鐘線一條線(基於開始時間)
  • % Busy回報ExecTime/60秒,所以60秒執行時間將100%利用率
  • 返回0%繁忙的每分鐘不記錄在日誌中。

已知問題:

  • ExecTime不分成分鐘。 % Busy返回秒/ 60秒的開始時間分鐘。所以前例。停止8.57.32和34秒的操作,實際上在第56分鐘顯示爲56%的忙碌。爲了解決這個問題,我們必須在一個線程組中處理每個ExecTime,並且在散列表中每分鐘對所有ExecTime部分進行總結,直到處理完所有ExecTimes,然後基於每分鐘的exectime-sum創建結果散列表。

腳本:

$path = c:\test.txt 
$data = [System.IO.File]::ReadAllText($path).Replace(" ","") | ConvertFrom-Csv -Delimiter "|" 

$data | Group-Object Thread | % { 

    #Get start-time 
    $_.Group | % { $_ | Add-Member -MemberType NoteProperty -Name StartTime -Value ([datetime]("{0}/{1}/{2} {3}:{4}:{5}" -f $_.month, $_.day, $_.year, $_.hour, $_.minute, $_.seconds)).AddSeconds(-($_.ExecTime)) } 

    #Group by minute 
    $_.Group | Group-Object {$_.starttime.minute} | % { 
     #Report per minute 
     New-Object psobject -Property @{ 
      "Thread" = $_.Group[0].thread 
      "Month" = $_.Group[0].starttime.month 
      "Day" = $_.Group[0].starttime.day 
      "Hour" = $_.Group[0].starttime.hour 
      "Minute" = $_.Group[0].starttime.minute 
      "% Busy" = [math]::Round((($_.Group | Measure-Object -Property ExecTime -Sum).Sum/60 * 100),2) 
     } 
    } 

    #Create 0% record for missing minutes 
    $min = ($_.Group | Sort-Object StartTime)[0].StartTime 
    $max = ($_.Group | Sort-Object StartTime)[-1].StartTime 

    for($d = $min; $d -le $max; $d = $d.AddMinutes(1)) { 
     if(-not ($_.Group | ? { $_.StartTime.Minute -eq $d.Minute })) { 
      New-Object psobject -Property @{ 
       "Thread" = $_.Group[0].thread 
       "Month" = $d.Month 
       "Day" = $d.Day 
       "Hour" = $d.Hour 
       "Minute" = $d.Minute 
       "% Busy" = 0 
      } 
     } 
    } 


} | Sort-Object Day, Hour, Minute, Thread | Select-Object "Thread", "Month", "Day", "Hour", "Minute", "% Busy" 

的test.txt

year | month | day | hour | minute | seconds | Thread | ExecTime 
2014 | 3  | 26 | 8 | 57  | 32  | 1  | 33.86 
2014 | 3  | 26 | 8 | 57  | 45  | 2  | 0.359 
2014 | 3  | 26 | 8 | 57  | 55  | 3  | 0.234 
2014 | 3  | 26 | 8 | 58  | 11  | 1  | 0.14 
2014 | 3  | 26 | 8 | 58  | 20  | 2  | 0.985 
2014 | 3  | 26 | 8 | 58  | 29  | 3  | 0.266 
2014 | 3  | 26 | 8 | 58  | 33  | 3  | 0.296 
2014 | 3  | 26 | 8 | 58  | 37  | 1  | 0.25 
2014 | 3  | 26 | 8 | 58  | 41  | 2  | 0.0 
2014 | 3  | 26 | 8 | 58  | 46  | 1  | 0.187 
2014 | 3  | 26 | 9 | 00  | 5  | 1  | 0.0 
2014 | 3  | 26 | 9 | 00  | 8  | 1  | 0.187 

輸出:

Thread Month Day Hour Minute % Busy 
------ ----- --- ---- ------ ------ 
1   3 26 8  56 56,43 
1   3 26 8  57  0 
2   3 26 8  57 0,6 
3   3 26 8  57 0,39 
1   3 26 8  58 0,96 
2   3 26 8  58 1,64 
3   3 26 8  58 0,94 
1   3 26 8  59  0 
1   3 26 9  0 0,31 

我可能不會修復這個錯誤,所以覺得自由編輯回答修復錯誤或擴展它。這只是試圖讓球滾動。 :)

+0

剛剛與這個PowerShell混淆,不幸的是它表現不佳,即600,000行請求花費太長時間。 – Bruno