func TestDumpAll(t *testing.T) { htraceBld := &MiniHTracedBuilder{Name: "TestDumpAll", DataDirs: make([]string, 2), WrittenSpans: common.NewSemaphore(0), Cnf: map[string]string{ conf.HTRACE_LOG_LEVEL: "INFO", }, } ht, err := htraceBld.Build() if err != nil { t.Fatalf("failed to create datastore: %s", err.Error()) } defer ht.Close() var hcl *htrace.Client hcl, err = htrace.NewClient(ht.ClientConf(), nil) if err != nil { t.Fatalf("failed to create client: %s", err.Error()) } defer hcl.Close() NUM_TEST_SPANS := 100 allSpans := createRandomTestSpans(NUM_TEST_SPANS) sort.Sort(allSpans) err = hcl.WriteSpans(allSpans) if err != nil { t.Fatalf("WriteSpans failed: %s\n", err.Error()) } ht.Store.WrittenSpans.Waits(int64(NUM_TEST_SPANS)) out := make(chan *common.Span, NUM_TEST_SPANS) var dumpErr error go func() { dumpErr = hcl.DumpAll(3, out) }() var numSpans int nextLogTime := time.Now().Add(time.Millisecond * 5) for { span, channelOpen := <-out if !channelOpen { break } common.ExpectSpansEqual(t, allSpans[numSpans], span) numSpans++ if testing.Verbose() { now := time.Now() if !now.Before(nextLogTime) { nextLogTime = now nextLogTime = nextLogTime.Add(time.Millisecond * 5) fmt.Printf("read back %d span(s)...\n", numSpans) } } } if numSpans != len(allSpans) { t.Fatalf("expected to read %d spans... but only read %d\n", len(allSpans), numSpans) } if dumpErr != nil { t.Fatalf("got dump error %s\n", dumpErr.Error()) } }
// Dump all spans from the htraced daemon. func doDumpAll(hcl *htrace.Client, outPath string, lim int) error { file, err := CreateOutputFile(outPath) if err != nil { return err } w := bufio.NewWriter(file) defer func() { if file != nil { w.Flush() file.Close() } }() out := make(chan *common.Span, 50) var dumpErr error go func() { dumpErr = hcl.DumpAll(lim, out) }() var numSpans int64 nextLogTime := time.Now().Add(time.Second * 5) for { span, channelOpen := <-out if !channelOpen { break } if err == nil { _, err = fmt.Fprintf(w, "%s\n", span.ToJson()) } if *verbose { numSpans++ now := time.Now() if !now.Before(nextLogTime) { nextLogTime = now.Add(time.Second * 5) fmt.Printf("received %d span(s)...\n", numSpans) } } } if err != nil { return errors.New(fmt.Sprintf("Write error %s", err.Error())) } if dumpErr != nil { return errors.New(fmt.Sprintf("Dump error %s", dumpErr.Error())) } err = w.Flush() if err != nil { return err } err = file.Close() file = nil if err != nil { return err } return nil }