diff --git a/main.go b/main.go index f531529..60d2fcf 100644 --- a/main.go +++ b/main.go @@ -25,6 +25,10 @@ const dateFormat = "2006-01-02T15:04:05.999999Z07:00" const outDateFormat = "2006-01-02T15:04:05" const outDateFormatNoSeconds = "2006-01-02T15:04" +var ( + seenHosts []string +) + func ParseLogLine(line []byte) (*LogLine, error) { sl := bytes.Split(line, []byte(" ")) @@ -108,7 +112,8 @@ func main() { _, ltm, _ := lastTime.Clock() if llm != ltm { - processBuckets(ab) + + processBuckets(lastTime, ab) ab = map[string]*Bucket{} lastTime = lastTime.Add(time.Minute) @@ -129,31 +134,41 @@ func main() { ab[ll.Host] = b } - processBuckets(ab) -} - -// sees if the minute and hour field of a == the minute and hour field of b -func cmpTime(a, b time.Time) bool { - _, am, _ := a.Clock() - _, bm, _ := b.Clock() - - return am == bm + processBuckets(lastTime, ab) } func toMS(dur time.Duration) int64 { return dur.Nanoseconds() / 1000000 } -func processBuckets(set map[string]*Bucket) { - hosts := []string{} - for host, _ := range set { - hosts = append(hosts, host) +func contains(host string) bool { + for _, val := range seenHosts { + if val == host { + return true + } } - sort.Sort(sort.StringSlice(hosts)) + return false +} + +func processBuckets(lt time.Time, set map[string]*Bucket) { + log.Printf("printing buckets for %s", lt.Format(outDateFormatNoSeconds)) + for host, _ := range set { + if !contains(host) { + seenHosts = append(seenHosts, host) + } + } + + sort.Sort(sort.StringSlice(seenHosts)) + + for _, host := range seenHosts { + bucket, ok := set[host] + + if !ok { + fmt.Printf("%s,%s,0,0,0,0\n", lt.Format(outDateFormat), host) + return + } - for _, host := range hosts { - bucket := set[host] var longest time.Duration var shortest time.Duration var total time.Duration diff --git a/main_test.go b/main_test.go index 555a08c..8c5adc1 100644 --- a/main_test.go +++ b/main_test.go @@ -2,7 +2,6 @@ package main import ( "testing" - "time" "github.com/kr/pretty" ) @@ -26,12 +25,3 @@ func TestParseLogLine(t *testing.T) { t.Fatal("invalid host") } } - -func TestCmpTime(t *testing.T) { - now := time.Date(2016, time.January, 1, 13, 37, 0, 0, time.UTC) - then := now.Add(5 * time.Minute) - - if cmpTime(then, now) { - t.Fatal("cmpTime error") - } -}