From 4bdddf72e98d7d5c4d2bb9da136bf53b87f96920 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Thu, 25 Jan 2024 14:46:43 +0800 Subject: [PATCH] :sparkles: Capture traces --- pkg/hypertext/proxies.go | 26 ++++++++++++++++++++++++-- pkg/navi/config.go | 2 ++ pkg/navi/metrics.go | 25 +++++++++++++++++++++++++ pkg/navi/route.go | 3 ++- pkg/sideload/metrics.go | 10 ++++++++++ pkg/sideload/server.go | 1 + settings.toml | 6 +++++- 7 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 pkg/navi/metrics.go create mode 100644 pkg/sideload/metrics.go diff --git a/pkg/hypertext/proxies.go b/pkg/hypertext/proxies.go index 5d4da68..962b792 100644 --- a/pkg/hypertext/proxies.go +++ b/pkg/hypertext/proxies.go @@ -1,6 +1,7 @@ package hypertext import ( + "github.com/spf13/viper" "math/rand" "regexp" @@ -82,7 +83,7 @@ func UseProxies(app *fiber.App) { // Passing all the rules means the site is what we are looking for. // Let us respond to our client! - return makeResponse(ctx, &dest) + return makeResponse(ctx, region, &location, &dest) } } @@ -93,7 +94,7 @@ func UseProxies(app *fiber.App) { }) } -func makeResponse(ctx *fiber.Ctx, dest *navi.Destination) error { +func makeResponse(ctx *fiber.Ctx, region *navi.Region, location *navi.Location, dest *navi.Destination) error { // Modify request for _, transformer := range dest.Transformers { if err := transformer.TransformRequest(ctx); err != nil { @@ -111,5 +112,26 @@ func makeResponse(ctx *fiber.Ctx, dest *navi.Destination) error { } } + // Collect trace + if viper.GetBool("telemetry.capture_traces") { + var message string + if err != nil { + message = err.Error() + } + + go navi.R.AddTrace(navi.RoadTrace{ + Region: region.ID, + Location: location.ID, + Destination: dest.ID, + Uri: ctx.OriginalURL(), + IpAddress: ctx.IP(), + UserAgent: ctx.Get(fiber.HeaderUserAgent), + Error: navi.RoadTraceError{ + IsNull: err == nil, + Message: message, + }, + }) + } + return err } diff --git a/pkg/navi/config.go b/pkg/navi/config.go index 99d8032..277b991 100644 --- a/pkg/navi/config.go +++ b/pkg/navi/config.go @@ -1,6 +1,7 @@ package navi import ( + "github.com/spf13/viper" "io" "os" "path/filepath" @@ -13,6 +14,7 @@ var R *RoadApp func ReadInConfig(root string) error { instance := &RoadApp{ Regions: make([]*Region, 0), + Traces: make([]RoadTrace, 0, viper.GetInt("performance.traces_limit")), } if err := filepath.Walk(root, func(fp string, info os.FileInfo, _ error) error { diff --git a/pkg/navi/metrics.go b/pkg/navi/metrics.go new file mode 100644 index 0000000..550c2c7 --- /dev/null +++ b/pkg/navi/metrics.go @@ -0,0 +1,25 @@ +package navi + +import "github.com/spf13/viper" + +type RoadTrace struct { + Region string `json:"region"` + Location string `json:"location"` + Destination string `json:"destination"` + Uri string `json:"uri"` + IpAddress string `json:"ip_address"` + UserAgent string `json:"user_agent"` + Error RoadTraceError `json:"error"` +} + +type RoadTraceError struct { + IsNull bool `json:"is_null"` + Message string `json:"message"` +} + +func (v *RoadApp) AddTrace(trace RoadTrace) { + v.Traces = append(v.Traces, trace) + if len(v.Traces) > viper.GetInt("performance.traces_limit") { + v.Traces = v.Traces[1:] + } +} diff --git a/pkg/navi/route.go b/pkg/navi/route.go index cfc16ed..4f3cc32 100644 --- a/pkg/navi/route.go +++ b/pkg/navi/route.go @@ -7,7 +7,8 @@ import ( ) type RoadApp struct { - Regions []*Region `json:"regions"` + Regions []*Region `json:"regions"` + Traces []RoadTrace `json:"traces"` } func (v *RoadApp) Forward(ctx *fiber.Ctx, dest *Destination) error { diff --git a/pkg/sideload/metrics.go b/pkg/sideload/metrics.go new file mode 100644 index 0000000..25d42ba --- /dev/null +++ b/pkg/sideload/metrics.go @@ -0,0 +1,10 @@ +package sideload + +import ( + "code.smartsheep.studio/goatworks/roadsign/pkg/navi" + "github.com/gofiber/fiber/v2" +) + +func getTraces(c *fiber.Ctx) error { + return c.JSON(navi.R.Traces) +} \ No newline at end of file diff --git a/pkg/sideload/server.go b/pkg/sideload/server.go index fba1984..8ecaca6 100644 --- a/pkg/sideload/server.go +++ b/pkg/sideload/server.go @@ -53,6 +53,7 @@ func InitSideload() *fiber.App { cgi := app.Group("/cgi").Name("CGI") { cgi.Get("/metadata", getMetadata) + cgi.Get("/traces", getTraces) cgi.Get("/statistics", getStatistics) cgi.Get("/sites", getRegions) cgi.Get("/sites/cfg/:id", getRegionConfig) diff --git a/settings.toml b/settings.toml index 272915d..f1f5fda 100644 --- a/settings.toml +++ b/settings.toml @@ -21,8 +21,12 @@ max_qps = -1 [paths] configs = "./config" -[performance] +[telemetry] request_logging = true +capture_traces = true + +[performance] +traces_limit = 256 network_timeout = 3_000 prefork = false