mirror of
https://github.com/fatedier/frp.git
synced 2026-10-20 21:03:27 +08:00
feat: add metricsServer for health checks, metrics and pprof (#5578)
Add a separate HTTP listener for observability, configured through metricsServer in both frps and frpc. It serves /healthz and, when pprofEnable is set, the pprof handlers except /debug/pprof/cmdline. It never serves the dashboard, static assets or the admin API, and it does not touch the global assets filesystem. frps also serves /metrics on this listener with both runtime and business metrics, enabled by metricsServer.port alone. The in-memory collector still starts only with the dashboard, and the Prometheus collector starts either with metricsServer or with enablePrometheus plus webServer, so a configuration that collected nothing before still collects nothing. The /healthz, /metrics and pprof endpoints on webServer, and enablePrometheus, keep working but are deprecated and log a hint at startup. frpc does not serve /metrics yet.
This commit is contained in:
@@ -276,6 +276,50 @@ func TestServiceRunAfterEarlyShutdown(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestMetricsCollectors(t *testing.T) {
|
||||
for _, tc := range []struct {
|
||||
name string
|
||||
webPort, metricsPort int
|
||||
enablePrometheus bool
|
||||
wantMem, wantPrometheus bool
|
||||
}{
|
||||
{name: "nothing enabled"},
|
||||
{name: "web server only", webPort: 7500, wantMem: true},
|
||||
{
|
||||
name: "web server with enablePrometheus", webPort: 7500, enablePrometheus: true,
|
||||
wantMem: true, wantPrometheus: true,
|
||||
},
|
||||
{
|
||||
// enablePrometheus alone has no endpoint to serve metrics from, so the
|
||||
// Prometheus collector must stay off, as it did before metricsServer.
|
||||
name: "enablePrometheus without listeners", enablePrometheus: true,
|
||||
},
|
||||
{
|
||||
// The in-memory collector only backs the dashboard API.
|
||||
name: "metrics server only", metricsPort: 7501, wantPrometheus: true,
|
||||
},
|
||||
{
|
||||
name: "both servers", webPort: 7500, metricsPort: 7501,
|
||||
wantMem: true, wantPrometheus: true,
|
||||
},
|
||||
{
|
||||
name: "both servers with enablePrometheus", webPort: 7500, metricsPort: 7501, enablePrometheus: true,
|
||||
wantMem: true, wantPrometheus: true,
|
||||
},
|
||||
} {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
cfg := &v1.ServerConfig{
|
||||
WebServer: v1.WebServerConfig{Port: tc.webPort},
|
||||
MetricsServer: v1.MetricsServerConfig{Port: tc.metricsPort},
|
||||
EnablePrometheus: tc.enablePrometheus,
|
||||
}
|
||||
mem, prometheus := metricsCollectors(cfg)
|
||||
require.Equal(t, tc.wantMem, mem, "EnableMem")
|
||||
require.Equal(t, tc.wantPrometheus, prometheus, "EnablePrometheus")
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestServiceCloseMarksClosedBeforeCleanup(t *testing.T) {
|
||||
svr, listener, addresses := newLifecycleTestService(t, false)
|
||||
listener.closeEntered, listener.closeResume = make(chan struct{}), make(chan struct{})
|
||||
|
||||
Reference in New Issue
Block a user