Add tracing
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
@@ -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{
|
||||
|
Reference in New Issue
Block a user