diff --git a/pkg/ext-proc/backend/vllm/metrics.go b/pkg/ext-proc/backend/vllm/metrics.go index 4785e484..3032ae4d 100644 --- a/pkg/ext-proc/backend/vllm/metrics.go +++ b/pkg/ext-proc/backend/vllm/metrics.go @@ -45,7 +45,7 @@ func (p *PodMetricsClientImpl) FetchMetrics( // Currently the metrics endpoint is hard-coded, which works with vLLM. // TODO(https://github.com/kubernetes-sigs/gateway-api-inference-extension/issues/16): Consume this from InferencePool config. - url := fmt.Sprintf("http://%s/metrics", existing.Address) + url := existing.BuildScrapeEndpoint() req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { loggerDefault.Error(err, "Failed create HTTP request", "method", http.MethodGet, "url", url) diff --git a/pkg/ext-proc/controller/pod_reconciler_test.go b/pkg/ext-proc/controller/pod_reconciler_test.go index b146745a..a8d515c6 100644 --- a/pkg/ext-proc/controller/pod_reconciler_test.go +++ b/pkg/ext-proc/controller/pod_reconciler_test.go @@ -20,10 +20,10 @@ import ( ) var ( - basePod1 = &datastore.PodMetrics{Pod: datastore.Pod{NamespacedName: types.NamespacedName{Name: "pod1"}, Address: "address-1"}} - basePod2 = &datastore.PodMetrics{Pod: datastore.Pod{NamespacedName: types.NamespacedName{Name: "pod2"}, Address: "address-2"}} - basePod3 = &datastore.PodMetrics{Pod: datastore.Pod{NamespacedName: types.NamespacedName{Name: "pod3"}, Address: "address-3"}} - basePod11 = &datastore.PodMetrics{Pod: datastore.Pod{NamespacedName: types.NamespacedName{Name: "pod1"}, Address: "address-11"}} + basePod1 = &datastore.PodMetrics{Pod: datastore.Pod{NamespacedName: types.NamespacedName{Name: "pod1"}, Address: "address-1", ScrapePath: "/metrics", ScrapePort: 8000}} + basePod2 = &datastore.PodMetrics{Pod: datastore.Pod{NamespacedName: types.NamespacedName{Name: "pod2"}, Address: "address-2", ScrapePath: "/metrics", ScrapePort: 8000}} + basePod3 = &datastore.PodMetrics{Pod: datastore.Pod{NamespacedName: types.NamespacedName{Name: "pod3"}, Address: "address-3", ScrapePath: "/metrics", ScrapePort: 8000}} + basePod11 = &datastore.PodMetrics{Pod: datastore.Pod{NamespacedName: types.NamespacedName{Name: "pod1"}, Address: "address-11", ScrapePath: "/metrics", ScrapePort: 8000}} ) func TestUpdateDatastore_PodReconciler(t *testing.T) { @@ -262,7 +262,7 @@ func TestUpdateDatastore_PodReconciler(t *testing.T) { func populateMap(pods ...*datastore.PodMetrics) *sync.Map { newMap := &sync.Map{} for _, pod := range pods { - newMap.Store(pod.NamespacedName, &datastore.PodMetrics{Pod: datastore.Pod{NamespacedName: pod.NamespacedName, Address: pod.Address}}) + newMap.Store(pod.NamespacedName, &datastore.PodMetrics{Pod: datastore.Pod{NamespacedName: pod.NamespacedName, Address: pod.Address, ScrapePort: pod.ScrapePort, ScrapePath: pod.ScrapePath}}) } return newMap } diff --git a/pkg/ext-proc/datastore/datastore.go b/pkg/ext-proc/datastore/datastore.go index f85f9014..224239b7 100644 --- a/pkg/ext-proc/datastore/datastore.go +++ b/pkg/ext-proc/datastore/datastore.go @@ -166,13 +166,16 @@ func (ds *datastore) PodDelete(namespacedName types.NamespacedName) { } func (ds *datastore) PodUpdateOrAddIfNotExist(pod *corev1.Pod) bool { + pool, _ := ds.PoolGet() new := &PodMetrics{ Pod: Pod{ NamespacedName: types.NamespacedName{ Name: pod.Name, Namespace: pod.Namespace, }, - Address: pod.Status.PodIP, + Address: pod.Status.PodIP, + ScrapePath: "/metrics", + ScrapePort: pool.Spec.TargetPortNumber, }, Metrics: Metrics{ ActiveModels: make(map[string]int), diff --git a/pkg/ext-proc/datastore/types.go b/pkg/ext-proc/datastore/types.go index 221c6630..845f8d1a 100644 --- a/pkg/ext-proc/datastore/types.go +++ b/pkg/ext-proc/datastore/types.go @@ -10,6 +10,10 @@ import ( type Pod struct { NamespacedName types.NamespacedName Address string + + // metrics scrape options + ScrapePort int32 + ScrapePath string } type Metrics struct { @@ -41,6 +45,8 @@ func (pm *PodMetrics) Clone() *PodMetrics { Pod: Pod{ NamespacedName: pm.NamespacedName, Address: pm.Address, + ScrapePort: pm.ScrapePort, + ScrapePath: pm.ScrapePath, }, Metrics: Metrics{ ActiveModels: cm, @@ -52,3 +58,7 @@ func (pm *PodMetrics) Clone() *PodMetrics { } return clone } + +func (pm *PodMetrics) BuildScrapeEndpoint() string { + return fmt.Sprintf("http://%s:%d%s", pm.Address, pm.ScrapePort, pm.ScrapePath) +}