Feat: add telemetry
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -4,3 +4,4 @@ gralias | ||||
| store.json | ||||
| config.toml | ||||
| gralias.db | ||||
| traces.log | ||||
|   | ||||
							
								
								
									
										7
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| version: '3.8' | ||||
| services: | ||||
|   jaeger: | ||||
|     image: jaegertracing/all-in-one:latest | ||||
|     ports: | ||||
|       - "6831:6831/udp" | ||||
|       - "16686:16686" | ||||
							
								
								
									
										13
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								go.mod
									
									
									
									
									
								
							| @@ -12,6 +12,19 @@ require ( | ||||
|  | ||||
| require ( | ||||
| 	github.com/davecgh/go-spew v1.1.1 // indirect | ||||
| 	github.com/felixge/httpsnoop v1.0.4 // indirect | ||||
| 	github.com/go-logr/logr v1.4.3 // indirect | ||||
| 	github.com/go-logr/stdr v1.2.2 // indirect | ||||
| 	github.com/google/uuid v1.6.0 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.0 // indirect | ||||
| 	go.opentelemetry.io/auto/sdk v1.1.0 // indirect | ||||
| 	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect | ||||
| 	go.opentelemetry.io/otel v1.37.0 // indirect | ||||
| 	go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect | ||||
| 	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 // indirect | ||||
| 	go.opentelemetry.io/otel/metric v1.37.0 // indirect | ||||
| 	go.opentelemetry.io/otel/sdk v1.37.0 // indirect | ||||
| 	go.opentelemetry.io/otel/trace v1.37.0 // indirect | ||||
| 	golang.org/x/sys v0.33.0 // indirect | ||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||
| ) | ||||
|   | ||||
							
								
								
									
										27
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								go.sum
									
									
									
									
									
								
							| @@ -4,8 +4,17 @@ github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg | ||||
| github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= | ||||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= | ||||
| github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= | ||||
| github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= | ||||
| github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= | ||||
| github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= | ||||
| github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= | ||||
| github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= | ||||
| github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= | ||||
| github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | ||||
| github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= | ||||
| github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= | ||||
| github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= | ||||
| @@ -19,6 +28,24 @@ github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= | ||||
| github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= | ||||
| github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= | ||||
| github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||||
| go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= | ||||
| go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= | ||||
| go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= | ||||
| go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= | ||||
| go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= | ||||
| go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= | ||||
| go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= | ||||
| go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= | ||||
| go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 h1:SNhVp/9q4Go/XHBkQ1/d5u9P/U+L1yaGPoi0x+mStaI= | ||||
| go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0/go.mod h1:tx8OOlGH6R4kLV67YaYO44GFXloEjGPZuMjEkaaqIp4= | ||||
| go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= | ||||
| go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= | ||||
| go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= | ||||
| go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= | ||||
| go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= | ||||
| go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= | ||||
| golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= | ||||
| golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | ||||
|   | ||||
							
								
								
									
										8
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								main.go
									
									
									
									
									
								
							| @@ -6,6 +6,7 @@ import ( | ||||
| 	"gralias/crons" | ||||
| 	"gralias/handlers" | ||||
| 	"gralias/repos" | ||||
| 	"gralias/telemetry" | ||||
| 	"log/slog" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| @@ -56,8 +57,11 @@ func getContentType(path string) string { | ||||
|  | ||||
| func ListenToRequests(port string) *http.Server { | ||||
| 	mux := http.NewServeMux() | ||||
| 	var handler http.Handler = mux | ||||
| 	handler = handlers.LogRequests(handlers.GetSession(handler)) | ||||
| 	handler = telemetry.OtelMiddleware(handler) | ||||
| 	server := &http.Server{ | ||||
| 		Handler: handlers.LogRequests(handlers.GetSession(mux)), | ||||
| 		Handler: handler, | ||||
| 		Addr:    ":" + port, | ||||
| 		// ReadTimeout:  time.Second * 5, // does this timeout conflict with sse connection? | ||||
| 		WriteTimeout: 0, // sse streaming | ||||
| @@ -96,6 +100,8 @@ func ListenToRequests(port string) *http.Server { | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	shutdown := telemetry.InitTracer() | ||||
| 	defer shutdown() | ||||
| 	// Setup graceful shutdown | ||||
| 	stop := make(chan os.Signal, 1) | ||||
| 	signal.Notify(stop, os.Interrupt, syscall.SIGTERM) | ||||
|   | ||||
							
								
								
									
										59
									
								
								telemetry/telemetry.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								telemetry/telemetry.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| package telemetry | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
|  | ||||
| 	"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" | ||||
| 	"go.opentelemetry.io/otel" | ||||
| 	"go.opentelemetry.io/otel/exporters/jaeger" | ||||
| 	"go.opentelemetry.io/otel/sdk/resource" | ||||
| 	sdktrace "go.opentelemetry.io/otel/sdk/trace" | ||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.21.0" | ||||
| ) | ||||
|  | ||||
| // newJaegerExporter creates a new Jaeger exporter. | ||||
| func newJaegerExporter() (sdktrace.SpanExporter, error) { | ||||
| 	return jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint("http://localhost:14268/api/traces"))) | ||||
| } | ||||
|  | ||||
| // NewTracerProvider creates a new tracer provider. | ||||
| func NewTracerProvider(exp sdktrace.SpanExporter) *sdktrace.TracerProvider { | ||||
| 	res := resource.NewWithAttributes( | ||||
| 		semconv.SchemaURL, | ||||
| 		semconv.ServiceName("gralias"), | ||||
| 		semconv.ServiceVersion("v0.1.0"), | ||||
| 	) | ||||
|  | ||||
| 	tracerProvider := sdktrace.NewTracerProvider( | ||||
| 		sdktrace.WithSampler(sdktrace.AlwaysSample()), | ||||
| 		sdktrace.WithResource(res), | ||||
| 		sdktrace.WithBatcher(exp), | ||||
| 	) | ||||
| 	return tracerProvider | ||||
| } | ||||
|  | ||||
| // OtelMiddleware wraps the provided http.Handler with OpenTelemetry tracing. | ||||
| func OtelMiddleware(handler http.Handler) http.Handler { | ||||
| 	return otelhttp.NewHandler(handler, "http.server") | ||||
| } | ||||
|  | ||||
| func InitTracer() func() { | ||||
| 	exp, err := newJaegerExporter() | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("failed to create exporter: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	tp := NewTracerProvider(exp) | ||||
| 	otel.SetTracerProvider(tp) | ||||
|  | ||||
| 	return func() { | ||||
| 		if err := tp.Shutdown(context.Background()); err != nil { | ||||
| 			log.Printf("Error shutting down tracer provider: %v", err) | ||||
| 		} | ||||
| 		if err := exp.Shutdown(context.Background()); err != nil { | ||||
| 			log.Printf("Error shutting down exporter: %v", err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder