@@ -32,7 +32,15 @@ import (
3232
3333const MetricsDataSourceType = "metrics-data-source"
3434
35- // Data source configuration parameters
35+ // Default values for the metrics data source configuration.
36+ const (
37+ defaultMetricsScheme = "http"
38+ defaultMetricsPath = "/metrics"
39+ defaultMetricsInsecureSkipVerify = true
40+ )
41+
42+ // metricsDatasourceParams holds the configuration parameters for the metrics data source plugin.
43+ // These values can be specified in the EndpointPickerConfig under the plugin's `parameters` field.
3644type metricsDatasourceParams struct {
3745 // Scheme defines the protocol scheme used in metrics retrieval (e.g., "http").
3846 Scheme string `json:"scheme"`
@@ -60,68 +68,75 @@ func MetricsDataSourceFactory(name string, parameters json.RawMessage, handle fw
6068 name , parseMetrics , PrometheusMetricType )
6169}
6270
63- // Names of CLI flags in main
64- //
65- // TODO:
71+ // These flags are registered in options.go (server package) and marked as deprecated there.
72+ // They are kept for one release cycle to give users time to migrate their configuration
73+ // to the EndpointPickerConfig `parameters` field (metricsDatasourceParams).
74+ // They will be removed in a future release.
6675//
67- // 1. Consider having a cli package with all flag names and constants?
68- // Can't use values from runserver as this creates an import cycle with datalayer.
69- // Given that relevant issues/PRs have been closed so may be able to remove the cycle?
70- // Comment from runserver package (regarding TestPodMetricsClient *backendmetrics.FakePodMetricsClient)
71- // This should only be used in tests. We won't need this once we do not inject metrics in the tests.
72- // TODO:(https://github.com/kubernetes-sigs/gateway-api-inference-extension/issues/432) Cleanup
73- //
74- // 2. Deprecation notice on these flags being moved to the configuration file
76+ // TODO: Remove these constants and defaultDataSourceConfigParams() once the deprecated flags
77+ // are removed from options.go.
78+ // Note: these flag names are duplicated here (rather than imported from the server package)
79+ // to avoid an import cycle between the datalayer plugin and the server/runserver packages.
7580const (
7681 modelServerMetricsPathFlag = "model-server-metrics-path"
7782 modelServerMetricsSchemeFlag = "model-server-metrics-scheme"
7883 modelServerMetricsInsecureSkipVerifyFlag = "model-server-metrics-https-insecure-skip-verify"
7984)
8085
81- // return the default configuration state. The defaults are populated from
82- // existing command line flags.
86+ // DataSource parameters values - Priority (lowest → highest):
87+ // 1. Built-in defaults (defaultMetricsScheme / defaultMetricsPath / defaultMetricsInsecureSkipVerify)
88+ // 2. Deprecated CLI flag value (when the flag is registered and has been set by the operator)
89+ // 3. Explicit plugin `parameters` in EndpointPickerConfig
8390func defaultDataSourceConfigParams () (* metricsDatasourceParams , error ) {
84- cfg := & metricsDatasourceParams {}
91+ cfg := & metricsDatasourceParams {
92+ Scheme : defaultMetricsScheme ,
93+ Path : defaultMetricsPath ,
94+ InsecureSkipVerify : defaultMetricsInsecureSkipVerify ,
95+ }
8596
86- scheme , err := fromStringFlag (modelServerMetricsSchemeFlag )
87- if err != nil {
88- return nil , err
97+ if scheme , ok := fromStringFlag (modelServerMetricsSchemeFlag ); ok {
98+ cfg .Scheme = scheme
8999 }
90- cfg .Scheme = scheme
91100
92- path , err := fromStringFlag (modelServerMetricsPathFlag )
93- if err != nil {
94- return nil , err
101+ if path , ok := fromStringFlag (modelServerMetricsPathFlag ); ok {
102+ cfg .Path = path
95103 }
96- cfg .Path = path
97104
98- insecure , err := fromBoolFlag (modelServerMetricsInsecureSkipVerifyFlag )
99- if err != nil {
105+ if insecure , ok , err := fromBoolFlag (modelServerMetricsInsecureSkipVerifyFlag ); err != nil {
100106 return nil , err
107+ } else if ok {
108+ cfg .InsecureSkipVerify = insecure
101109 }
102- cfg .InsecureSkipVerify = insecure
103110
104111 return cfg , nil
105112}
106113
107- func fromStringFlag (name string ) (string , error ) {
114+ // fromStringFlag returns the value of a registered pflag string flag.
115+ // The second return value is false when the flag is not registered; no error is returned in that case.
116+ func fromStringFlag (name string ) (string , bool ) {
108117 f := pflag .Lookup (name )
109- if f == nil {
110- return "" , fmt . Errorf ( "flag not found: %s" , name )
118+ if f == nil || ! f . Changed {
119+ return "" , false
111120 }
112- return f .Value .String (), nil
121+ return f .Value .String (), true
113122}
114123
115- func fromBoolFlag (name string ) (bool , error ) {
124+ // fromBoolFlag returns the value of a registered pflag bool flag.
125+ // The second return value is false when the flag is not registered; no error is returned in that case.
126+ // An error is returned only when the flag exists but its value cannot be parsed as a bool.
127+ func fromBoolFlag (name string ) (bool , bool , error ) {
116128 f := pflag .Lookup (name )
117129 if f == nil {
118- return false , fmt .Errorf ("flag not found: %s" , name )
130+ return false , false , nil
131+ }
132+ if ! f .Changed {
133+ return false , false , nil // user did NOT provide it
119134 }
120135 b , err := strconv .ParseBool (f .Value .String ())
121136 if err != nil {
122- return false , fmt .Errorf ("invalid bool flag %q: %w" , name , err )
137+ return false , false , fmt .Errorf ("invalid bool flag %q: %w" , name , err )
123138 }
124- return b , nil
139+ return b , true , nil
125140}
126141
127142func parseMetrics (data io.Reader ) (any , error ) {
0 commit comments