Skip to content

Commit 1109d4c

Browse files
committed
feat(metrics): add time-series storage and querying capabilities
- Introduced MetricQueryProvider and TimeSeriesQueryProvider interfaces for efficient metric querying. - Implemented time-series storage in the collector for historical metric data. - Enhanced collector methods to support querying metric names, values, and counts without full map allocation. - Updated HTTPCollector to rebuild metrics map efficiently and calculate derived metrics directly into the result map. - Added new methods in the registry for lightweight metric queries. - Improved context value sharing in middleware to reduce allocations. - Enhanced OpenAPI schema handling for generic types, ensuring compatibility with OpenAPI naming conventions. - Added tests for new functionality in generic type name cleaning and type parameter cleaning. - Introduced route-level configurations for operation IDs, deprecation status, and timeouts. - Implemented write deadlines for Server-Sent Events to manage client connection timeouts. - Updated startup banner to include Pprof path if configured.
1 parent 2b0dbe7 commit 1109d4c

File tree

216 files changed

+2577
-49985
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

216 files changed

+2577
-49985
lines changed

app.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ type AppConfig struct {
6666
MetricsConfig MetricsConfig
6767
HealthConfig HealthConfig
6868

69+
// Profiling
70+
EnablePprof bool // Enable pprof profiling endpoints at /_/debug/pprof (default: false)
71+
PprofPrefix string // URL prefix for pprof endpoints (default: "/_/debug/pprof")
72+
6973
ErrorHandler ErrorHandler
7074

7175
// Server
@@ -331,6 +335,22 @@ func WithDisableMigrations() AppOption {
331335
return func(c *AppConfig) { c.DisableMigrations = true }
332336
}
333337

338+
// WithPprof enables pprof profiling endpoints.
339+
// Endpoints are registered at /_/debug/pprof by default.
340+
// Only enable in development or staging — never in production.
341+
func WithPprof() AppOption {
342+
return func(c *AppConfig) { c.EnablePprof = true }
343+
}
344+
345+
// WithPprofPrefix sets a custom URL prefix for pprof endpoints.
346+
// Implies WithPprof(). Default is "/_/debug/pprof".
347+
func WithPprofPrefix(prefix string) AppOption {
348+
return func(c *AppConfig) {
349+
c.EnablePprof = true
350+
c.PprofPrefix = prefix
351+
}
352+
}
353+
334354
// NewApp creates a new Forge application.
335355
func NewApp(config AppConfig) App {
336356
return newApp(config)

app_impl.go

Lines changed: 89 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ import (
55
"fmt"
66
"maps"
77
"net/http"
8+
nethttppprof "net/http/pprof"
89
"os"
910
"os/signal"
1011
"path/filepath"
1112
"runtime"
13+
"strings"
1214
"sync"
1315
"syscall"
1416
"time"
@@ -580,17 +582,24 @@ func (a *app) Start(ctx context.Context) error {
580582

581583
a.logger.Debug("DI container finalized")
582584

583-
// Apply HTTP metrics middleware if enabled
584-
// This must happen after container.Start() which initializes the HTTP collector
585-
a.applyHTTPMetricsMiddleware()
586-
587-
// Set container reference for health manager
585+
// Start health manager explicitly after container is ready so that
586+
// auto-discovery can see all registered services. The health manager
587+
// is NOT started by container.Start() because it is registered lazily
588+
// (no WithEager), so we must start it here with the container set.
588589
if healthMgr, ok := a.healthManager.(*healthinternal.ManagerImpl); ok {
589-
a.logger.Debug("setting container reference for health manager")
590590
healthMgr.SetContainer(a.container)
591-
a.logger.Debug("container reference set")
591+
592+
if !healthMgr.IsStarted() {
593+
if err := healthMgr.Start(ctx); err != nil {
594+
return fmt.Errorf("failed to start health manager: %w", err)
595+
}
596+
}
592597
}
593598

599+
// Apply HTTP metrics middleware if enabled
600+
// This must happen after container.Start() which initializes the HTTP collector
601+
a.applyHTTPMetricsMiddleware()
602+
594603
// Reload configs from ConfigManager (hot-reload support)
595604
a.logger.Debug("reloading configs from ConfigManager")
596605

@@ -673,13 +682,18 @@ func (a *app) Run() error {
673682
return fmt.Errorf("failed to start app: %w", err)
674683
}
675684

676-
// Create HTTP server
685+
// Create HTTP server.
686+
// WriteTimeout is set to 0 (disabled) because SSE, WebSocket, and gRPC
687+
// streaming handlers need indefinite write durations. A server-wide
688+
// WriteTimeout kills ALL long-lived connections after the deadline,
689+
// making streaming impossible. Regular REST handlers are protected by
690+
// per-route timeouts applied at the router level instead.
677691
a.httpServer = &http.Server{
678692
Addr: a.config.HTTPAddress,
679693
Handler: a.router,
680694
ReadTimeout: a.config.HTTPTimeout,
681695
ReadHeaderTimeout: 10 * time.Second,
682-
WriteTimeout: a.config.HTTPTimeout,
696+
WriteTimeout: 0, // disabled — streaming requires indefinite writes
683697
IdleTimeout: a.config.HTTPTimeout * 2,
684698
}
685699

@@ -781,6 +795,14 @@ func (a *app) printStartupBanner() {
781795
bannerCfg.MetricsPath = "/_/metrics"
782796
}
783797

798+
if a.config.EnablePprof {
799+
prefix := a.config.PprofPrefix
800+
if prefix == "" {
801+
prefix = "/_/debug/pprof"
802+
}
803+
bannerCfg.PprofPath = prefix
804+
}
805+
784806
// Print the banner
785807
shared.PrintStartupBanner(bannerCfg)
786808
}
@@ -819,6 +841,64 @@ func (a *app) setupObservabilityEndpoints() error {
819841
}
820842
}
821843

844+
// Setup pprof profiling endpoints if enabled
845+
if a.config.EnablePprof {
846+
if err := a.setupPprofEndpoints(); err != nil {
847+
return fmt.Errorf("failed to register pprof endpoints: %w", err)
848+
}
849+
}
850+
851+
return nil
852+
}
853+
854+
// setupPprofEndpoints registers net/http/pprof handlers on the router
855+
// and a styled index page for browsing profiles.
856+
func (a *app) setupPprofEndpoints() error {
857+
prefix := a.config.PprofPrefix
858+
if prefix == "" {
859+
prefix = "/_/debug/pprof"
860+
}
861+
862+
prefix = strings.TrimRight(prefix, "/")
863+
864+
// Dispatch table for specific pprof handlers.
865+
specific := map[string]http.HandlerFunc{
866+
"/cmdline": nethttppprof.Cmdline,
867+
"/profile": nethttppprof.Profile,
868+
"/symbol": nethttppprof.Symbol,
869+
"/trace": nethttppprof.Trace,
870+
}
871+
872+
// Single wildcard route handles everything: index page, specific
873+
// handlers, and named profiles (heap, goroutine, etc.).
874+
if err := a.router.Handle(prefix+"/*", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
875+
// Strip prefix to get the sub-path (e.g. "/heap", "/profile", "").
876+
sub := strings.TrimPrefix(r.URL.Path, prefix)
877+
878+
// Index page: empty path or just "/".
879+
if sub == "" || sub == "/" {
880+
pprofIndexPage(w, r, prefix)
881+
return
882+
}
883+
884+
// Specific handlers (cmdline, profile, symbol, trace).
885+
if h, ok := specific[sub]; ok {
886+
h.ServeHTTP(w, r)
887+
return
888+
}
889+
890+
// Everything else: named profiles via pprof.Index (heap, goroutine, allocs, etc.).
891+
// pprof.Index expects the profile name at the end of the URL path after "/debug/pprof/".
892+
r.URL.Path = "/debug/pprof" + sub
893+
nethttppprof.Index(w, r)
894+
})); err != nil {
895+
return err
896+
}
897+
898+
a.logger.Info("pprof profiling endpoints enabled",
899+
F("prefix", prefix),
900+
)
901+
822902
return nil
823903
}
824904

cmd/forge/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ require (
8989
github.com/xdg-go/scram v1.1.2 // indirect
9090
github.com/xdg-go/stringprep v1.0.4 // indirect
9191
github.com/xraph/confy v0.5.0 // indirect
92-
github.com/xraph/go-utils v1.1.0 // indirect
92+
github.com/xraph/go-utils v1.1.1 // indirect
9393
github.com/xraph/vessel v1.0.0 // indirect
9494
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
9595
go.mongodb.org/mongo-driver v1.17.4 // indirect

cmd/forge/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,8 @@ github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6
306306
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
307307
github.com/xraph/confy v0.5.0 h1:7dK3hx3MQKlNPK9mFSm07iyU05kUnx6um8d86/gyajg=
308308
github.com/xraph/confy v0.5.0/go.mod h1:/uhVfKibPR+kn7MI9LkVVekk84NP0sxsKZ9sFQoQ5Kc=
309-
github.com/xraph/go-utils v1.1.0 h1:bPO4C/mwm0I5ZZa3RxbwUqKhy3Vnxvm3s98vmX8CrjY=
310-
github.com/xraph/go-utils v1.1.0/go.mod h1:tZN4SuGy9otCo6dETp7Cvkgyiy0BvaJaZbTBv4Euvo4=
309+
github.com/xraph/go-utils v1.1.1 h1:k5TOQ1qhXLdEX8W5F60mSuPcFOPc8sBsnhmjx/Kpr5g=
310+
github.com/xraph/go-utils v1.1.1/go.mod h1:tZN4SuGy9otCo6dETp7Cvkgyiy0BvaJaZbTBv4Euvo4=
311311
github.com/xraph/vessel v1.0.0 h1:n2q30d0OGPENpFfmOUgEuS99Y+X6b6WTfzdOHiE4Ds0=
312312
github.com/xraph/vessel v1.0.0/go.mod h1:quT3UWDXZF0RLL34H3ijXP9kVnh2pdfnn0f2s3ezChA=
313313
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=

examples/cors_preflight/go.mod

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ require (
1010
github.com/BurntSushi/toml v1.6.0 // indirect
1111
github.com/armon/go-metrics v0.4.1 // indirect
1212
github.com/beorn7/perks v1.0.1 // indirect
13+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
1314
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
15+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
1416
github.com/dunglas/httpsfv v1.1.0 // indirect
1517
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
1618
github.com/fatih/color v1.18.0 // indirect
@@ -52,11 +54,12 @@ require (
5254
github.com/quic-go/qpack v0.6.0 // indirect
5355
github.com/quic-go/quic-go v0.59.0 // indirect
5456
github.com/quic-go/webtransport-go v0.10.0 // indirect
57+
github.com/redis/go-redis/v9 v9.14.1 // indirect
5558
github.com/spf13/pflag v1.0.9 // indirect
5659
github.com/uptrace/bunrouter v1.0.23 // indirect
5760
github.com/x448/float16 v0.8.4 // indirect
5861
github.com/xraph/confy v0.5.0 // indirect
59-
github.com/xraph/go-utils v1.1.0 // indirect
62+
github.com/xraph/go-utils v1.1.1 // indirect
6063
github.com/xraph/vessel v1.0.0 // indirect
6164
go.uber.org/multierr v1.11.0 // indirect
6265
go.uber.org/zap v1.27.1 // indirect

examples/cors_preflight/go.sum

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,22 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce
1818
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
1919
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
2020
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
21+
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
22+
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
23+
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
24+
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
2125
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
26+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
27+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
2228
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
2329
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
2430
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
2531
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2632
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2733
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
2834
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
35+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
36+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
2937
github.com/dunglas/httpsfv v1.1.0 h1:Jw76nAyKWKZKFrpMMcL76y35tOpYHqQPzHQiwDvpe54=
3038
github.com/dunglas/httpsfv v1.1.0/go.mod h1:zID2mqw9mFsnt7YC3vYQ9/cjq30q41W+1AnDwH8TiMg=
3139
github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU=
@@ -223,6 +231,8 @@ github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SA
223231
github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU=
224232
github.com/quic-go/webtransport-go v0.10.0 h1:LqXXPOXuETY5Xe8ITdGisBzTYmUOy5eSj+9n4hLTjHI=
225233
github.com/quic-go/webtransport-go v0.10.0/go.mod h1:LeGIXr5BQKE3UsynwVBeQrU1TPrbh73MGoC6jd+V7ow=
234+
github.com/redis/go-redis/v9 v9.14.1 h1:nDCrEiJmfOWhD76xlaw+HXT0c9hfNWeXgl0vIRYSDvQ=
235+
github.com/redis/go-redis/v9 v9.14.1/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
226236
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
227237
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
228238
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
@@ -256,8 +266,8 @@ github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
256266
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
257267
github.com/xraph/confy v0.5.0 h1:7dK3hx3MQKlNPK9mFSm07iyU05kUnx6um8d86/gyajg=
258268
github.com/xraph/confy v0.5.0/go.mod h1:/uhVfKibPR+kn7MI9LkVVekk84NP0sxsKZ9sFQoQ5Kc=
259-
github.com/xraph/go-utils v1.1.0 h1:bPO4C/mwm0I5ZZa3RxbwUqKhy3Vnxvm3s98vmX8CrjY=
260-
github.com/xraph/go-utils v1.1.0/go.mod h1:tZN4SuGy9otCo6dETp7Cvkgyiy0BvaJaZbTBv4Euvo4=
269+
github.com/xraph/go-utils v1.1.1 h1:k5TOQ1qhXLdEX8W5F60mSuPcFOPc8sBsnhmjx/Kpr5g=
270+
github.com/xraph/go-utils v1.1.1/go.mod h1:tZN4SuGy9otCo6dETp7Cvkgyiy0BvaJaZbTBv4Euvo4=
261271
github.com/xraph/vessel v1.0.0 h1:n2q30d0OGPENpFfmOUgEuS99Y+X6b6WTfzdOHiE4Ds0=
262272
github.com/xraph/vessel v1.0.0/go.mod h1:quT3UWDXZF0RLL34H3ijXP9kVnh2pdfnn0f2s3ezChA=
263273
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=

examples/di-patterns/go.mod

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ require (
1010
github.com/BurntSushi/toml v1.6.0 // indirect
1111
github.com/armon/go-metrics v0.4.1 // indirect
1212
github.com/beorn7/perks v1.0.1 // indirect
13+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
1314
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
15+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
1416
github.com/dunglas/httpsfv v1.1.0 // indirect
1517
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
1618
github.com/fatih/color v1.18.0 // indirect
@@ -52,11 +54,12 @@ require (
5254
github.com/quic-go/qpack v0.6.0 // indirect
5355
github.com/quic-go/quic-go v0.59.0 // indirect
5456
github.com/quic-go/webtransport-go v0.10.0 // indirect
57+
github.com/redis/go-redis/v9 v9.14.1 // indirect
5558
github.com/spf13/pflag v1.0.9 // indirect
5659
github.com/uptrace/bunrouter v1.0.23 // indirect
5760
github.com/x448/float16 v0.8.4 // indirect
5861
github.com/xraph/confy v0.5.0 // indirect
59-
github.com/xraph/go-utils v1.1.0 // indirect
62+
github.com/xraph/go-utils v1.1.1 // indirect
6063
github.com/xraph/vessel v1.0.0 // indirect
6164
go.uber.org/multierr v1.11.0 // indirect
6265
go.uber.org/zap v1.27.1 // indirect

examples/di-patterns/go.sum

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,22 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce
1818
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
1919
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
2020
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
21+
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
22+
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
23+
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
24+
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
2125
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
26+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
27+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
2228
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
2329
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
2430
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
2531
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2632
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2733
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
2834
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
35+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
36+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
2937
github.com/dunglas/httpsfv v1.1.0 h1:Jw76nAyKWKZKFrpMMcL76y35tOpYHqQPzHQiwDvpe54=
3038
github.com/dunglas/httpsfv v1.1.0/go.mod h1:zID2mqw9mFsnt7YC3vYQ9/cjq30q41W+1AnDwH8TiMg=
3139
github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU=
@@ -223,6 +231,8 @@ github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SA
223231
github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU=
224232
github.com/quic-go/webtransport-go v0.10.0 h1:LqXXPOXuETY5Xe8ITdGisBzTYmUOy5eSj+9n4hLTjHI=
225233
github.com/quic-go/webtransport-go v0.10.0/go.mod h1:LeGIXr5BQKE3UsynwVBeQrU1TPrbh73MGoC6jd+V7ow=
234+
github.com/redis/go-redis/v9 v9.14.1 h1:nDCrEiJmfOWhD76xlaw+HXT0c9hfNWeXgl0vIRYSDvQ=
235+
github.com/redis/go-redis/v9 v9.14.1/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
226236
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
227237
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
228238
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
@@ -256,8 +266,8 @@ github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
256266
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
257267
github.com/xraph/confy v0.5.0 h1:7dK3hx3MQKlNPK9mFSm07iyU05kUnx6um8d86/gyajg=
258268
github.com/xraph/confy v0.5.0/go.mod h1:/uhVfKibPR+kn7MI9LkVVekk84NP0sxsKZ9sFQoQ5Kc=
259-
github.com/xraph/go-utils v1.1.0 h1:bPO4C/mwm0I5ZZa3RxbwUqKhy3Vnxvm3s98vmX8CrjY=
260-
github.com/xraph/go-utils v1.1.0/go.mod h1:tZN4SuGy9otCo6dETp7Cvkgyiy0BvaJaZbTBv4Euvo4=
269+
github.com/xraph/go-utils v1.1.1 h1:k5TOQ1qhXLdEX8W5F60mSuPcFOPc8sBsnhmjx/Kpr5g=
270+
github.com/xraph/go-utils v1.1.1/go.mod h1:tZN4SuGy9otCo6dETp7Cvkgyiy0BvaJaZbTBv4Euvo4=
261271
github.com/xraph/vessel v1.0.0 h1:n2q30d0OGPENpFfmOUgEuS99Y+X6b6WTfzdOHiE4Ds0=
262272
github.com/xraph/vessel v1.0.0/go.mod h1:quT3UWDXZF0RLL34H3ijXP9kVnh2pdfnn0f2s3ezChA=
263273
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=

examples/farp-auto-detection/go.mod

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ require (
1616
github.com/armon/go-metrics v0.4.1 // indirect
1717
github.com/beorn7/perks v1.0.1 // indirect
1818
github.com/cenkalti/backoff v2.2.1+incompatible // indirect
19+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
1920
github.com/coreos/go-semver v0.3.0 // indirect
2021
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
2122
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
23+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
2224
github.com/dunglas/httpsfv v1.1.0 // indirect
2325
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
2426
github.com/fatih/color v1.18.0 // indirect
@@ -64,12 +66,14 @@ require (
6466
github.com/quic-go/qpack v0.6.0 // indirect
6567
github.com/quic-go/quic-go v0.59.0 // indirect
6668
github.com/quic-go/webtransport-go v0.10.0 // indirect
69+
github.com/redis/go-redis/v9 v9.14.1 // indirect
6770
github.com/spf13/pflag v1.0.9 // indirect
6871
github.com/uptrace/bunrouter v1.0.23 // indirect
6972
github.com/x448/float16 v0.8.4 // indirect
7073
github.com/xraph/confy v0.5.0 // indirect
71-
github.com/xraph/farp v1.0.2 // indirect
72-
github.com/xraph/go-utils v1.1.0 // indirect
74+
github.com/xraph/farp v1.3.0 // indirect
75+
github.com/xraph/farp/discovery v1.2.0 // indirect
76+
github.com/xraph/go-utils v1.1.1 // indirect
7377
github.com/xraph/vessel v1.0.0 // indirect
7478
go.etcd.io/etcd/api/v3 v3.5.17 // indirect
7579
go.etcd.io/etcd/client/pkg/v3 v3.5.17 // indirect

0 commit comments

Comments
 (0)