1package main
2
3import (
4	"fmt"
5	"io"
6	"log"
7	"net/http"
8	"strconv"
9	"time"
10
11	"gitlab.com/gitlab-org/labkit/correlation"
12	"gitlab.com/gitlab-org/labkit/tracing"
13	tracingcorrelation "gitlab.com/gitlab-org/labkit/tracing/correlation"
14)
15
16func main() {
17	tracing.Initialize(tracing.WithServiceName("router"))
18
19	tr := &http.Transport{
20		MaxIdleConns:       10,
21		IdleConnTimeout:    30 * time.Second,
22		DisableCompression: true,
23	}
24
25	client := &http.Client{
26		Transport: correlation.NewInstrumentedRoundTripper(tracing.NewRoundTripper(tr)),
27	}
28
29	// Listen and propagate traces
30	http.Handle("/query",
31		// Add the tracing middleware in
32		correlation.InjectCorrelationID(
33			tracing.Handler(
34				tracingcorrelation.BaggageHandler(
35
36					http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
37						query := r.URL.Query()
38						ttlString := query.Get("ttl")
39						var ttl int
40						var err error
41
42						if ttlString == "" {
43							ttl = 1
44						} else {
45							ttl, err = strconv.Atoi(ttlString)
46							if err != nil {
47								ttl = 1
48							}
49						}
50
51						ttl--
52						if ttl < 0 {
53							fmt.Fprintf(w, "Hello")
54							return
55						}
56
57						nextURL := fmt.Sprintf("http://localhost:8080/query?ttl=%d", ttl)
58						req, err := http.NewRequest(http.MethodGet, nextURL, nil)
59						if err != nil {
60							w.WriteHeader(500)
61							return
62						}
63
64						req = req.WithContext(r.Context())
65
66						resp, err := client.Do(req)
67						if err != nil {
68							w.WriteHeader(500)
69							return
70						}
71						defer resp.Body.Close()
72
73						_, err = io.Copy(w, resp.Body)
74						if err != nil {
75							w.WriteHeader(500)
76							return
77						}
78					})),
79				// Use this route identifier with the tracing middleware
80				tracing.WithRouteIdentifier("/query"),
81			),
82			correlation.WithPropagation()))
83
84	log.Fatal(http.ListenAndServe(":8080", nil))
85}
86