Skip to content

Commit dc992d3

Browse files
hperlory-bot
authored andcommitted
fix: correctly handle HTTP route patterns in metrics
GitOrigin-RevId: 534f4347eb820a3c51357b9d8defcefecd9845dd
1 parent ee39bdb commit dc992d3

36 files changed

+200
-134
lines changed

cmd/courier/watch.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ func ServeMetrics(ctx context.Context, r driver.Registry, port int) error {
6363

6464
router.Handle(prometheusx.MetricsPrometheusPath, promhttp.Handler())
6565
n.Use(reqlog.NewMiddlewareFromLogger(l, "admin#"+cfg.BaseURL.String()))
66-
n.Use(r.PrometheusManager())
6766

6867
n.UseHandler(router)
6968

cmd/daemon/serve.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,7 @@ func servePublic(ctx context.Context, r *driver.RegistryDefault, cmd *cobra.Comm
6868
n.Use(x.HTTPLoaderContextMiddleware(r))
6969
n.Use(sqa(ctx, cmd, r))
7070

71-
n.Use(r.PrometheusManager())
72-
73-
router := x.NewRouterPublic()
71+
router := x.NewRouterPublic(r)
7472
csrf := nosurfx.NewCSRFHandler(router, r)
7573

7674
// we need to always load the CORS middleware even if it is disabled, to allow hot-enabling CORS
@@ -158,9 +156,8 @@ func serveAdmin(ctx context.Context, r *driver.RegistryDefault, cmd *cobra.Comma
158156
n.UseFunc(x.RedirectAdminMiddleware)
159157
n.Use(x.HTTPLoaderContextMiddleware(r))
160158
n.Use(sqa(ctx, cmd, r))
161-
n.Use(r.PrometheusManager())
162159

163-
router := x.NewRouterAdmin()
160+
router := x.NewRouterAdmin(r)
164161
r.RegisterAdminRoutes(ctx, router)
165162

166163
n.UseHandler(http.MaxBytesHandler(router, 5*1024*1024 /* 5 MB */))

driver/config/handler_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func (c *configProvider) Config() *config.Config {
2828
func TestNewConfigHashHandler(t *testing.T) {
2929
ctx := context.Background()
3030
cfg := internal.NewConfigurationWithDefaults(t)
31-
router := x.NewRouterPublic()
31+
router := x.NewTestRouterPublic(t)
3232
config.NewConfigHashHandler(&configProvider{cfg: cfg}, router)
3333
ts := contextx.NewConfigurableTestServer(router)
3434
t.Cleanup(ts.Close)

driver/registry_default.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ import (
6464
"github.com/ory/x/otelx"
6565
otelsql "github.com/ory/x/otelx/sql"
6666
"github.com/ory/x/popx"
67-
prometheus "github.com/ory/x/prometheusx"
67+
"github.com/ory/x/prometheusx"
6868
"github.com/ory/x/servicelocatorx"
6969
"github.com/ory/x/sqlcon"
7070
)
@@ -83,10 +83,10 @@ type RegistryDefault struct {
8383

8484
nosurf nosurf.Handler
8585
trc *otelx.Tracer
86-
pmm *prometheus.MetricsManager
86+
pmm *prometheusx.MetricsManager
8787
writer herodot.Writer
8888
healthxHandler *healthx.Handler
89-
metricsHandler *prometheus.Handler
89+
metricsHandler *prometheusx.Handler
9090

9191
persister persistence.Persister
9292
migrationStatus popx.MigrationStatuses
@@ -287,9 +287,9 @@ func (m *RegistryDefault) HealthHandler(_ context.Context) *healthx.Handler {
287287
return m.healthxHandler
288288
}
289289

290-
func (m *RegistryDefault) MetricsHandler() *prometheus.Handler {
290+
func (m *RegistryDefault) MetricsHandler() *prometheusx.Handler {
291291
if m.metricsHandler == nil {
292-
m.metricsHandler = prometheus.NewHandler(m.Writer(), config.Version)
292+
m.metricsHandler = prometheusx.NewHandler(m.Writer(), config.Version)
293293
}
294294

295295
return m.metricsHandler
@@ -835,11 +835,11 @@ func (m *RegistryDefault) IdentityManager() *identity.Manager {
835835
return m.identityManager
836836
}
837837

838-
func (m *RegistryDefault) PrometheusManager() *prometheus.MetricsManager {
838+
func (m *RegistryDefault) PrometheusManager() *prometheusx.MetricsManager {
839839
m.rwl.Lock()
840840
defer m.rwl.Unlock()
841841
if m.pmm == nil {
842-
m.pmm = prometheus.NewMetricsManagerWithPrefix("kratos", prometheus.HTTPMetrics, m.buildVersion, m.buildHash, m.buildDate)
842+
m.pmm = prometheusx.NewMetricsManagerWithPrefix("kratos", prometheusx.HTTPMetrics, m.buildVersion, m.buildHash, m.buildDate)
843843
}
844844
return m.pmm
845845
}

driver/registry_default_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ package driver_test
66
import (
77
"context"
88
"fmt"
9+
"io"
10+
"net/http"
911
"testing"
1012

1113
"github.com/stretchr/testify/assert"
1214
"github.com/stretchr/testify/require"
1315

16+
"github.com/ory/kratos/internal/testhelpers"
1417
"github.com/ory/x/configx"
1518
"github.com/ory/x/contextx"
1619
"github.com/ory/x/logrusx"
@@ -960,3 +963,26 @@ func TestGetActiveVerificationStrategy(t *testing.T) {
960963
}
961964
})
962965
}
966+
967+
func TestMetricsRouterPaths(t *testing.T) {
968+
t.Parallel()
969+
_, reg := internal.NewVeryFastRegistryWithoutDB(t)
970+
publicTS, adminTS := testhelpers.NewKratosServerWithCSRF(t, reg)
971+
972+
// Make some requests that should be recorded in the metrics
973+
req, _ := http.NewRequest(http.MethodDelete, publicTS.URL+"/sessions/session-id", nil)
974+
_, err := publicTS.Client().Do(req)
975+
require.NoError(t, err)
976+
_, err = adminTS.Client().Get(adminTS.URL + "/admin/identities/some-id/sessions")
977+
require.NoError(t, err)
978+
979+
res, err := adminTS.Client().Get(adminTS.URL + "/admin/metrics/prometheus")
980+
require.NoError(t, err)
981+
require.EqualValues(t, http.StatusOK, res.StatusCode)
982+
respBody, err := io.ReadAll(res.Body)
983+
body := string(respBody)
984+
985+
require.NoError(t, err)
986+
assert.Contains(t, body, `endpoint="DELETE /sessions/{param}"`, body)
987+
assert.Contains(t, body, `endpoint="GET /admin/identities/{param}/sessions"`, body)
988+
}

internal/registrationhelpers/helpers.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ import (
3838

3939
func setupServer(t *testing.T, reg *driver.RegistryDefault) *httptest.Server {
4040
conf := reg.Config()
41-
router := x.NewRouterPublic()
42-
admin := x.NewRouterAdmin()
41+
router := x.NewRouterPublic(reg)
42+
admin := x.NewRouterAdmin(reg)
4343

4444
publicTS, _ := testhelpers.NewKratosServerWithRouters(t, reg, router, admin)
4545
redirTS := testhelpers.NewRedirSessionEchoTS(t, reg)

internal/testhelpers/selfservice_settings.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ func NewSettingsLoginAcceptAPIServer(t *testing.T, publicClient *kratos.APIClien
176176

177177
func NewSettingsAPIServer(t *testing.T, reg *driver.RegistryDefault, ids map[string]*identity.Identity) (*httptest.Server, *httptest.Server, map[string]*http.Client) {
178178
ctx := context.Background()
179-
public, admin := x.NewRouterPublic(), x.NewRouterAdmin()
179+
public, admin := x.NewRouterPublic(reg), x.NewRouterAdmin(reg)
180180
reg.SettingsHandler().RegisterAdminRoutes(admin)
181181

182182
n := negroni.Classic()

internal/testhelpers/server.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
)
2121

2222
func NewKratosServer(t *testing.T, reg driver.Registry) (public, admin *httptest.Server) {
23-
return NewKratosServerWithRouters(t, reg, x.NewRouterPublic(), x.NewRouterAdmin())
23+
return NewKratosServerWithRouters(t, reg, x.NewRouterPublic(reg), x.NewRouterAdmin(reg))
2424
}
2525

2626
func NewKratosServerWithCSRF(t *testing.T, reg driver.Registry) (public, admin *httptest.Server) {
@@ -29,15 +29,18 @@ func NewKratosServerWithCSRF(t *testing.T, reg driver.Registry) (public, admin *
2929
}
3030

3131
func NewKratosServerWithCSRFAndRouters(t *testing.T, reg driver.Registry) (public, admin *httptest.Server, rp *x.RouterPublic, ra *x.RouterAdmin) {
32-
rp, ra = x.NewRouterPublic(), x.NewRouterAdmin()
32+
rp, ra = x.NewRouterPublic(reg), x.NewRouterAdmin(reg)
3333
csrfHandler := nosurfx.NewTestCSRFHandler(rp, reg)
3434
reg.WithCSRFHandler(csrfHandler)
35+
3536
ran := negroni.New()
3637
ran.UseFunc(x.RedirectAdminMiddleware)
3738
ran.UseHandler(ra)
39+
3840
rpn := negroni.New()
3941
rpn.UseFunc(x.HTTPLoaderContextMiddleware(reg))
4042
rpn.UseHandler(rp)
43+
4144
public = httptest.NewServer(nosurfx.NewTestCSRFHandler(rpn, reg))
4245
admin = httptest.NewServer(ran)
4346
ctx := context.Background()
@@ -82,9 +85,9 @@ func InitKratosServers(t *testing.T, reg driver.Registry, public, admin *httptes
8285
reg.RegisterRoutes(context.Background(), public.Config.Handler.(*x.RouterPublic), admin.Config.Handler.(*x.RouterAdmin))
8386
}
8487

85-
func NewKratosServers(t *testing.T) (public, admin *httptest.Server) {
86-
public = httptest.NewServer(x.NewRouterPublic())
87-
admin = httptest.NewServer(x.NewRouterAdmin())
88+
func NewKratosServers(t *testing.T, reg driver.Registry) (public, admin *httptest.Server) {
89+
public = httptest.NewServer(x.NewRouterPublic(reg))
90+
admin = httptest.NewServer(x.NewRouterAdmin(reg))
8891

8992
public.URL = strings.Replace(public.URL, "127.0.0.1", "localhost", -1)
9093
t.Cleanup(public.Close)

schema/handler_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import (
3030
func TestHandler(t *testing.T) {
3131
ctx := context.Background()
3232
conf, reg := internal.NewFastRegistryWithMocks(t)
33-
router := x.NewRouterPublic()
33+
router := x.NewTestRouterPublic(t)
3434
reg.SchemaHandler().RegisterPublicRoutes(router)
3535
ts := httptest.NewServer(router)
3636
defer ts.Close()

selfservice/errorx/handler_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func TestHandler(t *testing.T) {
3434
h := errorx.NewHandler(reg)
3535

3636
t.Run("case=public authorization", func(t *testing.T) {
37-
router := x.NewRouterPublic()
37+
router := x.NewTestRouterPublic(t)
3838
ns := nosurfx.NewTestCSRFHandler(router, reg)
3939

4040
h.RegisterPublicRoutes(router)
@@ -74,7 +74,7 @@ func TestHandler(t *testing.T) {
7474
})
7575

7676
t.Run("case=stubs", func(t *testing.T) {
77-
router := x.NewRouterPublic()
77+
router := x.NewTestRouterPublic(t)
7878
h.RegisterPublicRoutes(router)
7979
ts := httptest.NewServer(router)
8080
defer ts.Close()
@@ -90,7 +90,7 @@ func TestHandler(t *testing.T) {
9090
})
9191

9292
t.Run("case=errors types", func(t *testing.T) {
93-
router := x.NewRouterPublic()
93+
router := x.NewTestRouterPublic(t)
9494
h.RegisterPublicRoutes(router)
9595
ts := httptest.NewServer(router)
9696
defer ts.Close()

0 commit comments

Comments
 (0)