From 123f0d95aed47c75b3ad87a60e3bcc615fadaae5 Mon Sep 17 00:00:00 2001 From: fengsilin Date: Wed, 20 May 2026 18:14:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(metrics):=20=E6=B3=A8=E5=86=8C=20/metrics?= =?UTF-8?q?=20=E7=AB=AF=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/metrics/metrics_test.go | 34 ++++++++++++++++++++++++++++++++++ router/relay-router.go | 7 +++++++ 2 files changed, 41 insertions(+) diff --git a/common/metrics/metrics_test.go b/common/metrics/metrics_test.go index ad09b42..04d042c 100644 --- a/common/metrics/metrics_test.go +++ b/common/metrics/metrics_test.go @@ -206,3 +206,37 @@ func TestMetricsMiddleware_RequestDuration(t *testing.T) { assert.Equal(t, 1, testutil.CollectAndCount(m.RequestDuration)) } + +func TestMetricsEndpoint_Format(t *testing.T) { + handler := NewMetricsHandler() + + req := httptest.NewRequest("GET", "/metrics", nil) + w := httptest.NewRecorder() + handler.ServeHTTP(w, req) + + assert.Equal(t, 200, w.Code) + assert.Contains(t, w.Header().Get("Content-Type"), "text/plain") +} + +func TestMetricsEndpoint_WithData(t *testing.T) { + reg := newTestRegistry() + _ = NewMetrics(reg) + + handler := NewMetricsHandlerWithRegistry(reg) + + req := httptest.NewRequest("GET", "/metrics", nil) + w := httptest.NewRecorder() + handler.ServeHTTP(w, req) + + assert.Equal(t, 200, w.Code) +} + +func TestMetricsEndpoint_EmptyNoPanic(t *testing.T) { + handler := NewMetricsHandler() + + req := httptest.NewRequest("GET", "/metrics", nil) + w := httptest.NewRecorder() + handler.ServeHTTP(w, req) + + assert.Equal(t, 200, w.Code) +} diff --git a/router/relay-router.go b/router/relay-router.go index f0e5e15..23c45e1 100644 --- a/router/relay-router.go +++ b/router/relay-router.go @@ -1,6 +1,8 @@ package router import ( + "github.com/QuantumNous/new-api/common" + "github.com/QuantumNous/new-api/common/metrics" "github.com/QuantumNous/new-api/constant" "github.com/QuantumNous/new-api/controller" "github.com/QuantumNous/new-api/middleware" @@ -18,6 +20,11 @@ func relayHandler(format types.RelayFormat) gin.HandlerFunc { } func SetRelayRouter(router *gin.Engine) { + if metrics.IsEnabled() { + metricsPath := common.GetEnvOrDefaultString("METRICS_PATH", "/metrics") + router.GET(metricsPath, gin.WrapH(metrics.NewMetricsHandler())) + } + router.Use(middleware.CORS()) router.Use(middleware.DecompressRequestMiddleware()) router.Use(middleware.BodyStorageCleanup()) // 清理请求体存储