func sampleData(c appdash.Collector) error { const numTraces = 60 log.Printf("Adding sample data (%d traces)", numTraces) for i := appdash.ID(1); i <= numTraces; i++ { traceID := appdash.NewRootSpanID() traceRec := appdash.NewRecorder(traceID, c) traceRec.Name(fakeHosts[rand.Intn(len(fakeHosts))]) // A random length for the trace. length := time.Duration(rand.Intn(1000)) * time.Millisecond startTime := time.Now().Add(-time.Duration(rand.Intn(100)) * time.Minute) traceRec.Event(&sqltrace.SQLEvent{ ClientSend: startTime, ClientRecv: startTime.Add(length), SQL: "SELECT * FROM table_name;", Tag: fmt.Sprintf("fakeTag%d", rand.Intn(10)), }) // We'll split the trace into N (3-7) spans (i.e. "N operations") each with // a random duration of time adding up to the length of the trace. numSpans := rand.Intn(7-3) + 3 times := randomSplit(int(length/time.Millisecond), numSpans) lastSpanID := traceID for j := 1; j <= numSpans; j++ { // The parent span is the predecessor. spanID := appdash.NewSpanID(lastSpanID) rec := appdash.NewRecorder(spanID, c) rec.Name(fakeNames[(j+int(i))%len(fakeNames)]) if j%3 == 0 { rec.Log("hello") } if j%5 == 0 { rec.Msg("hi") } // Generate a span event. spanDuration := time.Duration(times[j-1]) * time.Millisecond rec.Event(&sqltrace.SQLEvent{ ClientSend: startTime, ClientRecv: startTime.Add(spanDuration), SQL: "SELECT * FROM table_name;", Tag: fmt.Sprintf("fakeTag%d", rand.Intn(10)), }) // Shift the start time forward. startTime = startTime.Add(spanDuration) // Check for any recorder errors. if errs := rec.Errors(); len(errs) > 0 { return fmt.Errorf("recorder errors: %v", errs) } lastSpanID = spanID } } return nil }
func getSpanID(h http.Header) (spanID *appdash.SpanID, fromHeader string, err error) { // Check for Span-ID. fromHeader = HeaderSpanID spanID, err = getSpanIDHeader(h, HeaderSpanID) if err != nil { return nil, fromHeader, err } // Check for Parent-Span-ID. if spanID == nil { fromHeader = HeaderParentSpanID spanID, err = getSpanIDHeader(h, HeaderParentSpanID) if err != nil { return nil, fromHeader, err } if spanID != nil { newSpanID := appdash.NewSpanID(*spanID) spanID = &newSpanID } } // Create a new root span ID. if spanID == nil { fromHeader = "" newSpanID := appdash.NewRootSpanID() spanID = &newSpanID } return spanID, fromHeader, nil }
func (w *appdashWrapper) Setup(name string) { w.rec = appdash.NewRecorder(appdash.NewRootSpanID(), w.coll) w.rec.Name(name) }
func handleRequest(w http.ResponseWriter, r *http.Request) { var result string span := appdash.NewRootSpanID() fmt.Println("span is ", span) collector := appdash.NewRemoteCollector(":3001") httpClient := &http.Client{ Transport: &httptrace.Transport{ Recorder: appdash.NewRecorder(span, collector), SetName: true, }, } //Service A resp, err := httpClient.Get("http://localhost:6601") if err != nil { log.Println("access serviceA err:", err) } else { log.Println("access serviceA ok") resp.Body.Close() result += "access serviceA ok\n" } //Service B resp, err = httpClient.Get("http://localhost:6602") if err != nil { log.Println("access serviceB err:", err) return } else { log.Println("access serviceB ok") resp.Body.Close() result += "access serviceB ok\n" } // SQL event traceRec := appdash.NewRecorder(span, collector) traceRec.Name("sqlevent example") // A random length for the trace. length := time.Duration(rand.Intn(1000)) * time.Millisecond StartTime := time.Now().Add(-time.Duration(rand.Intn(100)) * time.Minute) traceRec.Event(&sqltrace.SQLEvent{ ClientSend: StartTime, ClientRecv: StartTime.Add(length), SQL: "SELECT * FROM table_name;", Tag: fmt.Sprintf("fakeTag%d", rand.Intn(10)), }) result += "sql event ok\n" // self-customize event - MyEvent StartTime = time.Now().Add(-time.Duration(rand.Intn(100)) * time.Minute) traceRec.Event(&MyEvent{ Name: "MyEvent example", StartTime: StartTime, EndTime: StartTime.Add(length), }) result += "MyEvent ok\n" w.Write([]byte(result)) }