♻️ RoadSign v2 #6
@ -1,6 +1,7 @@
|
|||||||
package hypertext
|
package hypertext
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/spf13/viper"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
|
||||||
@ -82,7 +83,7 @@ func UseProxies(app *fiber.App) {
|
|||||||
|
|
||||||
// Passing all the rules means the site is what we are looking for.
|
// Passing all the rules means the site is what we are looking for.
|
||||||
// Let us respond to our client!
|
// 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
|
// Modify request
|
||||||
for _, transformer := range dest.Transformers {
|
for _, transformer := range dest.Transformers {
|
||||||
if err := transformer.TransformRequest(ctx); err != nil {
|
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
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package navi
|
package navi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/spf13/viper"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -13,6 +14,7 @@ var R *RoadApp
|
|||||||
func ReadInConfig(root string) error {
|
func ReadInConfig(root string) error {
|
||||||
instance := &RoadApp{
|
instance := &RoadApp{
|
||||||
Regions: make([]*Region, 0),
|
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 {
|
if err := filepath.Walk(root, func(fp string, info os.FileInfo, _ error) error {
|
||||||
|
25
pkg/navi/metrics.go
Normal file
25
pkg/navi/metrics.go
Normal file
@ -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:]
|
||||||
|
}
|
||||||
|
}
|
@ -8,6 +8,7 @@ import (
|
|||||||
|
|
||||||
type RoadApp struct {
|
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 {
|
func (v *RoadApp) Forward(ctx *fiber.Ctx, dest *Destination) error {
|
||||||
|
10
pkg/sideload/metrics.go
Normal file
10
pkg/sideload/metrics.go
Normal file
@ -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)
|
||||||
|
}
|
@ -53,6 +53,7 @@ func InitSideload() *fiber.App {
|
|||||||
cgi := app.Group("/cgi").Name("CGI")
|
cgi := app.Group("/cgi").Name("CGI")
|
||||||
{
|
{
|
||||||
cgi.Get("/metadata", getMetadata)
|
cgi.Get("/metadata", getMetadata)
|
||||||
|
cgi.Get("/traces", getTraces)
|
||||||
cgi.Get("/statistics", getStatistics)
|
cgi.Get("/statistics", getStatistics)
|
||||||
cgi.Get("/sites", getRegions)
|
cgi.Get("/sites", getRegions)
|
||||||
cgi.Get("/sites/cfg/:id", getRegionConfig)
|
cgi.Get("/sites/cfg/:id", getRegionConfig)
|
||||||
|
@ -21,8 +21,12 @@ max_qps = -1
|
|||||||
[paths]
|
[paths]
|
||||||
configs = "./config"
|
configs = "./config"
|
||||||
|
|
||||||
[performance]
|
[telemetry]
|
||||||
request_logging = true
|
request_logging = true
|
||||||
|
capture_traces = true
|
||||||
|
|
||||||
|
[performance]
|
||||||
|
traces_limit = 256
|
||||||
network_timeout = 3_000
|
network_timeout = 3_000
|
||||||
prefork = false
|
prefork = false
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user