Skip to content

Commit a3456fa

Browse files
committed
feat: migrate epp metric server
Signed-off-by: nayihz <[email protected]>
1 parent 1f62b02 commit a3456fa

16 files changed

+220
-267
lines changed

cmd/epp/main.go

Lines changed: 15 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -19,30 +19,25 @@ package main
1919
import (
2020
"flag"
2121
"fmt"
22-
"net"
23-
"net/http"
2422
"os"
25-
"strconv"
2623

2724
"github.com/go-logr/logr"
28-
"github.com/prometheus/client_golang/prometheus/promhttp"
2925
uberzap "go.uber.org/zap"
3026
"go.uber.org/zap/zapcore"
3127
"google.golang.org/grpc"
3228
healthPb "google.golang.org/grpc/health/grpc_health_v1"
3329
"k8s.io/apimachinery/pkg/types"
34-
"k8s.io/client-go/rest"
35-
"k8s.io/component-base/metrics/legacyregistry"
3630
ctrl "sigs.k8s.io/controller-runtime"
3731
"sigs.k8s.io/controller-runtime/pkg/log"
3832
"sigs.k8s.io/controller-runtime/pkg/log/zap"
3933
"sigs.k8s.io/controller-runtime/pkg/manager"
4034
"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
35+
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
36+
4137
"sigs.k8s.io/gateway-api-inference-extension/internal/runnable"
4238
backendmetrics "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics"
4339
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datastore"
4440
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/metrics"
45-
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/metrics/collectors"
4641
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/scheduling"
4742
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/scheduling/plugins"
4843
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/scheduling/plugins/filter"
@@ -54,10 +49,6 @@ import (
5449
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/logging"
5550
)
5651

57-
const (
58-
defaultMetricsEndpoint = "/metrics"
59-
)
60-
6152
var (
6253
grpcPort = flag.Int(
6354
"grpcPort",
@@ -67,8 +58,7 @@ var (
6758
"grpcHealthPort",
6859
9003,
6960
"The port used for gRPC liveness and readiness probes")
70-
metricsPort = flag.Int(
71-
"metricsPort", 9090, "The metrics port")
61+
metricsAddr = flag.String("metrics-bind-address", ":9090", "The address the metric endpoint binds to.")
7262
destinationEndpointHintKey = flag.String(
7363
"destinationEndpointHintKey",
7464
runserver.DefaultDestinationEndpointHintKey,
@@ -168,7 +158,18 @@ func run() error {
168158
Name: *poolName,
169159
Namespace: *poolNamespace,
170160
}
171-
mgr, err := runserver.NewDefaultManager(poolNamespacedName, cfg)
161+
metrics.Register()
162+
// Register metrics handler.
163+
// Metrics endpoint is enabled in 'config/default/kustomization.yaml'. The Metrics options configure the server.
164+
// More info:
165+
// - https://pkg.go.dev/sigs.k8s.io/[email protected]/pkg/metrics/server
166+
// - https://book.kubebuilder.io/reference/metrics.html
167+
metricsServerOptions := metricsserver.Options{
168+
BindAddress: *metricsAddr,
169+
FilterProvider: filters.WithAuthenticationAndAuthorization,
170+
}
171+
172+
mgr, err := runserver.NewDefaultManager(poolNamespacedName, cfg, metricsServerOptions)
172173
if err != nil {
173174
setupLog.Error(err, "Failed to create controller manager")
174175
return err
@@ -242,11 +243,6 @@ func run() error {
242243
return err
243244
}
244245

245-
// Register metrics handler.
246-
if err := registerMetricsHandler(mgr, *metricsPort, cfg, datastore); err != nil {
247-
return err
248-
}
249-
250246
// Start the manager. This blocks until a signal is received.
251247
setupLog.Info("Controller manager starting")
252248
if err := mgr.Start(ctx); err != nil {
@@ -290,62 +286,6 @@ func registerHealthServer(mgr manager.Manager, logger logr.Logger, ds datastore.
290286
return nil
291287
}
292288

293-
// registerMetricsHandler adds the metrics HTTP handler as a Runnable to the given manager.
294-
func registerMetricsHandler(mgr manager.Manager, port int, cfg *rest.Config, ds datastore.Datastore) error {
295-
metrics.Register()
296-
legacyregistry.CustomMustRegister(collectors.NewInferencePoolMetricsCollector(ds))
297-
298-
metrics.RecordInferenceExtensionInfo()
299-
300-
// Init HTTP server.
301-
h, err := metricsHandlerWithAuthenticationAndAuthorization(cfg)
302-
if err != nil {
303-
return err
304-
}
305-
306-
mux := http.NewServeMux()
307-
mux.Handle(defaultMetricsEndpoint, h)
308-
309-
srv := &http.Server{
310-
Addr: net.JoinHostPort("", strconv.Itoa(port)),
311-
Handler: mux,
312-
}
313-
314-
if err := mgr.Add(&manager.Server{
315-
Name: "metrics",
316-
Server: srv,
317-
}); err != nil {
318-
setupLog.Error(err, "Failed to register metrics HTTP handler")
319-
return err
320-
}
321-
return nil
322-
}
323-
324-
func metricsHandlerWithAuthenticationAndAuthorization(cfg *rest.Config) (http.Handler, error) {
325-
h := promhttp.HandlerFor(
326-
legacyregistry.DefaultGatherer,
327-
promhttp.HandlerOpts{},
328-
)
329-
httpClient, err := rest.HTTPClientFor(cfg)
330-
if err != nil {
331-
setupLog.Error(err, "Failed to create http client for metrics auth")
332-
return nil, err
333-
}
334-
335-
filter, err := filters.WithAuthenticationAndAuthorization(cfg, httpClient)
336-
if err != nil {
337-
setupLog.Error(err, "Failed to create metrics filter for auth")
338-
return nil, err
339-
}
340-
metricsLogger := ctrl.Log.WithName("metrics").WithValues("path", defaultMetricsEndpoint)
341-
metricsAuthHandler, err := filter(metricsLogger, h)
342-
if err != nil {
343-
setupLog.Error(err, "Failed to create metrics auth handler")
344-
return nil, err
345-
}
346-
return metricsAuthHandler, nil
347-
}
348-
349289
func validateFlags() error {
350290
if *poolName == "" {
351291
return fmt.Errorf("required %q flag not set", "poolName")

0 commit comments

Comments
 (0)