Repository navigation
feat(otel-ci): add KServe control-plane metrics solution - #400
Merged
Merged
Conversation
Scrape the kserve-controller-manager from the cluster-scraper. The pod is found by its control-plane label, so a cluster without KServe has no target, and scraped through its kube-rbac-proxy on :8443 with the service-account token. Keeps controller_runtime_* and leader_election_*; client-go's workqueue_* and rest_client_* are dropped as for KEDA. Series are attributed to the controller pod and Deployment, without the scraper node's AZ.
7 of 8 tasks
miconeilaws
approved these changes
Oct 13, 2026
7 of 8 tasks
9 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds
otelContainerInsights.solutions.kserve.controlPlane: health metrics of the KServe operator (kserve-controller-manager), collected by the cluster-scraper and sent to CloudWatch over OTLP. On by default; on a cluster without KServe it discovers no target and does nothing.Part of the LLM model-serving solutions, alongside vLLM model-server metrics (#353) and Knative Serving metrics (#390). End-to-end tests: aws/amazon-cloudwatch-agent-test#779.
Architecture
The controller is a single cluster-wide component, so it is scraped once, by the cluster-scraper, like Karpenter and KEDA.
What is scraped
namespace(defaultkserve) with the labelcontrol-plane: kserve-controller-manager, selected by the API server. Only the container port 8443 of running pods is kept.127.0.0.1:8080, so the scrape goes through its kube-rbac-proxy on:8443:geton the non-resource URL/metrics, which the proxy checks with a SubjectAccessReviewcontroller_runtime_*(reconcile totals, errors and latency per controller, active workers, webhook request totals and latency) andleader_election_*.workqueue_*andrest_client_*, because the apiserver pipeline publishes those names under its own scope (as infilter/cw_k8s_ci_v0_keda_drop_non_keda)go_*,process_*and other runtime familiesPipeline
metrics/cw_k8s_ci_v0_kserve_controlplaneon the cluster-scraper, the same shape as Karpenter and KEDA:prometheus/cw_k8s_ci_v0_kserve_controlplane: discovery as above; target labelspod,namespace,node.filter/cw_k8s_ci_v0_scrape_metadata,filter/cw_k8s_ci_v0_kserve_controlplane_keep: keep list above.github.com/kserve/kserve,cloudwatch.pipeline = kserve-controlplane) and cluster name.groupbyattrs+transform/cw_k8s_ci_v0_kserve_controlplane_promote: one resource per controller pod, withk8s.pod.name,k8s.namespace.nameandk8s.node.name.k8sattributes/cw_k8s_ci_v0_pod,transform/cw_k8s_ci_v0_set_workload: Deploymentkserve-controller-manager.resourcedetection/cw_k8s_ci_v0_kserve_controlplane: cloud provider, platform, region and account only. AZ and host attributes are disabled because they would describe the node the cluster-scraper runs on, not the controller's.cloud.resource_id, attribute limit,batch, thenotlphttp/cw_k8s_ci_v0_cwotel(SigV4) to the CloudWatch OTLP endpoint.Configuration
KServe is a control plane only and is never in the request path. Request-level metrics for an InferenceService come from the model server (#353) and, in Serverless mode, from the Knative queue-proxy (#390).
Testing
tests/kserve_pipeline_shape.sh(make helm-kserve-shape, part ofmake all) renders the chart and checks, on the parsedotelConfig:make helm-lint helm-flag-matrix helm-yaml-injection helm-neuron-shapepass.test/otel/solutions/kservein test(otel): add vLLM, KServe and Knative solution integration tests aws/amazon-cloudwatch-agent-test#779 (KServe v0.20 on EKS). All 5 tests (32 subtests) pass. They cover:workqueue_*,rest_client_*,go_*orprocess_*from this pipelinePR Checklist
makechecks pass locallytest/otel/solutions/kserve)tests/kserve_pipeline_shape.sh)otelContainerInsights.solutions.kserve.controlPlanevalue, on by default