example/router.go (68 lines of code) (raw):

package main import ( "fmt" "io" "log" "net/http" "strconv" "time" "gitlab.com/gitlab-org/labkit/correlation" "gitlab.com/gitlab-org/labkit/tracing" tracingcorrelation "gitlab.com/gitlab-org/labkit/tracing/correlation" ) func main() { tracing.Initialize(tracing.WithServiceName("router")) tr := &http.Transport{ MaxIdleConns: 10, IdleConnTimeout: 30 * time.Second, DisableCompression: true, } client := &http.Client{ Transport: correlation.NewInstrumentedRoundTripper(tracing.NewRoundTripper(tr)), } // Listen and propagate traces http.Handle("/query", // Add the tracing middleware in correlation.InjectCorrelationID( tracing.Handler( tracingcorrelation.BaggageHandler( http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { query := r.URL.Query() ttlString := query.Get("ttl") var ttl int var err error if ttlString == "" { ttl = 1 } else { ttl, err = strconv.Atoi(ttlString) if err != nil { ttl = 1 } } ttl-- if ttl < 0 { fmt.Fprintf(w, "Hello") return } nextURL := fmt.Sprintf("http://localhost:8080/query?ttl=%d", ttl) req, err := http.NewRequest(http.MethodGet, nextURL, nil) if err != nil { w.WriteHeader(http.StatusInternalServerError) return } req = req.WithContext(r.Context()) resp, err := client.Do(req) if err != nil { w.WriteHeader(http.StatusInternalServerError) return } defer resp.Body.Close() _, err = io.Copy(w, resp.Body) if err != nil { w.WriteHeader(http.StatusInternalServerError) return } })), // Use this route identifier with the tracing middleware tracing.WithRouteIdentifier("/query"), ), correlation.WithPropagation())) log.Fatal(http.ListenAndServe(":8080", nil)) }