Add tracing

This commit is contained in:
2023-10-23 21:20:18 +02:00
parent 9691fb7037
commit bc5c783494
4 changed files with 135 additions and 8 deletions

View File

@@ -1,10 +1,12 @@
package server
import (
"fmt"
"net/http"
"time"
"github.com/go-chi/chi/v5/middleware"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
)
func (s *Server) MiddlewareLogging(next http.Handler) http.Handler {
@@ -33,3 +35,12 @@ func (s *Server) MiddlewareLogging(next http.Handler) http.Handler {
}
return http.HandlerFunc(fn)
}
func (s *Server) MiddlewareTracing(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
h := otelhttp.NewHandler(next, fmt.Sprintf("%s %s", r.Method, r.URL.Path))
h.ServeHTTP(w, r)
}
return http.HandlerFunc(fn)
}

View File

@@ -1,12 +1,14 @@
package server
import (
"context"
"encoding/json"
"io"
"log/slog"
"net/http"
"net/url"
"strings"
"time"
"git.t-juice.club/microfilm/auth"
"git.t-juice.club/microfilm/auth/authmw"
@@ -14,6 +16,14 @@ import (
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/nats-io/nats.go"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
tracesdk "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
"go.opentelemetry.io/otel/trace"
)
type Service string
@@ -40,6 +50,7 @@ func NewServer(config *Config) (*Server, error) {
r := chi.NewRouter()
r.Use(middleware.RealIP)
r.Use(middleware.RequestID)
r.Use(srv.MiddlewareTracing)
r.Use(srv.MiddlewareLogging)
r.Get("/info", InfoHandler)
@@ -51,9 +62,35 @@ func NewServer(config *Config) (*Server, error) {
srv.Handler = r
srv.Addr = config.ListenAddr
tp, err := tracerProvider("jaeger:4318")
if err != nil {
return nil, err
}
otel.SetTracerProvider(tp)
return srv, nil
}
func tracerProvider(url string) (*tracesdk.TracerProvider, error) {
exp, err := otlptracehttp.New(context.Background(), otlptracehttp.WithEndpoint(url), otlptracehttp.WithInsecure())
if err != nil {
return nil, err
}
res := resource.NewWithAttributes(semconv.SchemaURL,
semconv.ServiceName("mf-proxy"),
semconv.ServiceVersion(proxy.Version),
)
tp := tracesdk.NewTracerProvider(
tracesdk.WithBatcher(exp, tracesdk.WithBatchTimeout(time.Second)),
tracesdk.WithResource(res),
)
otel.SetTracerProvider(tp)
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
return tp, nil
}
func InfoHandler(w http.ResponseWriter, r *http.Request) {
enc := json.NewEncoder(w)
@@ -73,11 +110,18 @@ func WriteError(w http.ResponseWriter, response proxy.ErrorResponse) {
func (s *Server) ProxyHandler(service Service) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
client := http.Client{}
ctx := r.Context()
client := http.Client{
Transport: otelhttp.NewTransport(http.DefaultTransport),
}
defer r.Body.Close()
newURL := s.convertURL(r.URL, service)
req, err := http.NewRequest(r.Method, newURL.String(), r.Body)
span := trace.SpanFromContext(ctx)
span.AddEvent("Do proxy forward")
req, err := http.NewRequestWithContext(ctx, r.Method, newURL.String(), r.Body)
if err != nil {
s.Logger.Warn("Failed to create forwarding request.", "error", err, "url", newURL)
WriteError(w, proxy.ErrorResponse{