func main() {
        // Tu należy wstawić kod inicjowania aplikacji
        httpServer := app.NewHTTPServer()

        // Kanał ma nasłuchiwać sygnału przerwania lub zakończenia z systemu operacyjnego

        // Używa kanału buforowanego, ponieważ wymaga tego pakiet sygnału
        shutdown := make(chan os.Signal, 1)
        signal.Notify(shutdown, os.Interrupt, syscall.SIGTERM)

        // Uruchamia aplikację i nasłuchuje błędów
        errors := make(chan error, 1)
        go httpServer.ListenAndServe(errors)

        // Blokuje metodę main i czeka na zamknięcie
        select {
        case err := <-errors:
                log.Fatalf("błąd serwera http: %v", err)

        case <-shutdown:
        log.Printf("zamykanie serwera http")
                httpServer.Shutdown()
        }
}

---

package main

import (
        "log"

        jaeger "github.com/uber/jaeger-client-go"
        "github.com/uber/jaeger-client-go/config"
        "github.com/uber/jaeger-lib/metrics/prometheus"
)

func main() {
  // Tu kod inicjowania aplikacji

  metricsFactory := prometheus.New()

  cfg := config.Configuration{}
  tracer, closer, err := cfg.NewTracer(
    config.Metrics(metricsFactory),
    config.Logger(jaeger.StdLogger),
  )
  if err != nil {
    log.Fatalf("błąd inicjowania procesu śledzenia: %v", err)
  }

  defer closer.Close()

  // Kontynuowanie wykonywania main()
}

---

package main

import (
        "github.com/opentracing/opentracing-go"
        "github.com/opentracing/opentracing-go/ext"
        "net/http"
)

func (s server) handleListPayments(w http.ResponseWriter, req *http.Request) {
        spanCtx, err := s.tracer.Extract(
                opentracing.HTTPHeaders,
                opentracing.HTTPHeadersCarrier(req.Header),
        )
        if err != nil {
                // Obsługa błędu
        }

        span := opentracing.StartSpan(
                "listPayments",
                ext.RPCServerOption(spanCtx),
        )
        defer span.Finish()
}

---

func listPayments(ctx context.Context) ([]Payment, error) {
  span, ctx := opentracing.StartSpanFromContext(ctx, "listPayments")
  defer span.Finish()

  // Uruchamianie zapytania SQL-a
}

---

import (
    "github.com/opentracing/opentracing-go"
        "github.com/opentracing/opentracing-go/ext"

          "net/http"
)

// Tworzy żądanie HTTP
req, err := http.NewRequest("GET", serviceURL, nil)
if err != nil {
  // Obsługa błędu
}

// Wstrzykuje kontekst w nagłówki HTTP żądania
ext.SpanKindRPCClient.Set(span)
ext.HTTPUrl.Set(span, url)
ext.HTTPMethod.Set(span, "GET")
span.Tracer().Inject(
  span.Context(),
  opentracing.HTTPHeaders,
  opentracing.HTTPHeadersCarrier(req.Header),
)

// Wysyła żądanie
resp, err := http.DefaultClient.Do(req)
