Add some tracing to service

This commit is contained in:
2023-10-23 21:25:13 +02:00
parent ba2f3876c6
commit f1d345533a
5 changed files with 119 additions and 1 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 *UserServer) MiddlewareLogging(next http.Handler) http.Handler {
@@ -24,3 +26,11 @@ func (s *UserServer) MiddlewareLogging(next http.Handler) http.Handler {
}
return http.HandlerFunc(fn)
}
func (s *UserServer) 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

@@ -2,11 +2,13 @@ package server
import (
"bytes"
"context"
"encoding/json"
"fmt"
"log/slog"
"net/http"
"os"
"time"
"git.t-juice.club/microfilm/auth"
"git.t-juice.club/microfilm/auth/authmw"
@@ -15,6 +17,12 @@ import (
"github.com/go-chi/chi/v5"
"github.com/google/uuid"
"github.com/nats-io/nats.go"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
)
type UserServer struct {
@@ -28,6 +36,13 @@ type UserServer struct {
func NewServer(config *Config) (*UserServer, error) {
r := chi.NewRouter()
srv := &UserServer{}
tp, err := tracerProvider("jaeger:4318")
if err != nil {
return nil, err
}
otel.SetTracerProvider(tp)
srv.config = config
srv.Logger = slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
@@ -35,6 +50,7 @@ func NewServer(config *Config) (*UserServer, error) {
}))
r.Use(srv.MiddlewareLogging)
r.Use(srv.MiddlewareTracing)
verifyAdmin := authmw.VerifyToken("http://mf-auth:8082", []string{auth.RoleAdmin})
@@ -71,6 +87,26 @@ func NewServer(config *Config) (*UserServer, error) {
return srv, nil
}
func tracerProvider(url string) (*sdktrace.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-users"),
semconv.ServiceVersion(users.Version),
)
tp := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exp, sdktrace.WithBatchTimeout(time.Second)),
sdktrace.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)