Skip to content

Commit 23553ed

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

16 files changed

+155
-228
lines changed

cmd/epp/main.go

+15-67
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,20 @@ 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/zap"
3832
"sigs.k8s.io/controller-runtime/pkg/manager"
3933
"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
34+
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
35+
4036
"sigs.k8s.io/gateway-api-inference-extension/internal/runnable"
4137
backendmetrics "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/backend/metrics"
4238
"sigs.k8s.io/gateway-api-inference-extension/pkg/epp/datastore"
@@ -58,8 +54,7 @@ var (
5854
"grpcHealthPort",
5955
9003,
6056
"The port used for gRPC liveness and readiness probes")
61-
metricsPort = flag.Int(
62-
"metricsPort", 9090, "The metrics port")
57+
metricsAddr = flag.String("metrics-bind-address", ":8080", "The address the metric endpoint binds to.")
6358
destinationEndpointHintKey = flag.String(
6459
"destinationEndpointHintKey",
6560
runserver.DefaultDestinationEndpointHintKey,
@@ -145,7 +140,18 @@ func run() error {
145140
Name: *poolName,
146141
Namespace: *poolNamespace,
147142
}
148-
mgr, err := runserver.NewDefaultManager(poolNamespacedName, cfg)
143+
metrics.Register()
144+
// Register metrics handler.
145+
// Metrics endpoint is enabled in 'config/default/kustomization.yaml'. The Metrics options configure the server.
146+
// More info:
147+
// - https://pkg.go.dev/sigs.k8s.io/[email protected]/pkg/metrics/server
148+
// - https://book.kubebuilder.io/reference/metrics.html
149+
metricsServerOptions := metricsserver.Options{
150+
BindAddress: *metricsAddr,
151+
FilterProvider: filters.WithAuthenticationAndAuthorization,
152+
}
153+
154+
mgr, err := runserver.NewDefaultManager(poolNamespacedName, cfg, metricsServerOptions)
149155
if err != nil {
150156
setupLog.Error(err, "Failed to create controller manager")
151157
return err
@@ -195,11 +201,6 @@ func run() error {
195201
return err
196202
}
197203

198-
// Register metrics handler.
199-
if err := registerMetricsHandler(mgr, *metricsPort, cfg); err != nil {
200-
return err
201-
}
202-
203204
// Start the manager. This blocks until a signal is received.
204205
setupLog.Info("Controller manager starting")
205206
if err := mgr.Start(ctx); err != nil {
@@ -243,59 +244,6 @@ func registerHealthServer(mgr manager.Manager, logger logr.Logger, ds datastore.
243244
return nil
244245
}
245246

246-
// registerMetricsHandler adds the metrics HTTP handler as a Runnable to the given manager.
247-
func registerMetricsHandler(mgr manager.Manager, port int, cfg *rest.Config) error {
248-
metrics.Register()
249-
250-
// Init HTTP server.
251-
h, err := metricsHandlerWithAuthenticationAndAuthorization(cfg)
252-
if err != nil {
253-
return err
254-
}
255-
256-
mux := http.NewServeMux()
257-
mux.Handle(defaultMetricsEndpoint, h)
258-
259-
srv := &http.Server{
260-
Addr: net.JoinHostPort("", strconv.Itoa(port)),
261-
Handler: mux,
262-
}
263-
264-
if err := mgr.Add(&manager.Server{
265-
Name: "metrics",
266-
Server: srv,
267-
}); err != nil {
268-
setupLog.Error(err, "Failed to register metrics HTTP handler")
269-
return err
270-
}
271-
return nil
272-
}
273-
274-
func metricsHandlerWithAuthenticationAndAuthorization(cfg *rest.Config) (http.Handler, error) {
275-
h := promhttp.HandlerFor(
276-
legacyregistry.DefaultGatherer,
277-
promhttp.HandlerOpts{},
278-
)
279-
httpClient, err := rest.HTTPClientFor(cfg)
280-
if err != nil {
281-
setupLog.Error(err, "Failed to create http client for metrics auth")
282-
return nil, err
283-
}
284-
285-
filter, err := filters.WithAuthenticationAndAuthorization(cfg, httpClient)
286-
if err != nil {
287-
setupLog.Error(err, "Failed to create metrics filter for auth")
288-
return nil, err
289-
}
290-
metricsLogger := ctrl.Log.WithName("metrics").WithValues("path", defaultMetricsEndpoint)
291-
metricsAuthHandler, err := filter(metricsLogger, h)
292-
if err != nil {
293-
setupLog.Error(err, "Failed to create metrics auth handler")
294-
return nil, err
295-
}
296-
return metricsAuthHandler, nil
297-
}
298-
299247
func validateFlags() error {
300248
if *poolName == "" {
301249
return fmt.Errorf("required %q flag not set", "poolName")

0 commit comments

Comments
 (0)