Skip to content

feat: add label selector to metrics call #3999

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 21 additions & 5 deletions util/src/main/java/io/kubernetes/client/Metrics.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,11 @@
import io.kubernetes.client.openapi.ApiException;
import io.kubernetes.client.openapi.Configuration;
import io.kubernetes.client.util.generic.GenericKubernetesApi;
import io.kubernetes.client.util.generic.options.ListOptions;

public class Metrics {
private static final String API_GROUP = "metrics.k8s.io";
private static final String API_VERSION = "v1beta1";
private ApiClient apiClient;

/** Simple Metrics API constructor, uses default configuration */
Expand Down Expand Up @@ -61,17 +64,30 @@ public NodeMetricsList getNodeMetrics() throws ApiException {
new GenericKubernetesApi<>(
NodeMetrics.class,
NodeMetricsList.class,
"metrics.k8s.io",
"v1beta1",
Metrics.API_GROUP,
Metrics.API_VERSION,
"nodes",
apiClient);
return metricsClient.list().throwsApiException().getObject();
}

public PodMetricsList getPodMetrics(String namespace) throws ApiException {
return getPodMetrics(namespace, null);
}

/**
* Obtain Pod Metrics in the given Namespace with an optional label selector.
* @param namespace The Namespace to look in.
* @param labelSelector The label selector, optional. Use comma-delimited for multiple labels.
* @return PodMetricList, never null.
* @throws ApiException If the ApiClient cannot complete the request.
*/
public PodMetricsList getPodMetrics(String namespace, String labelSelector) throws ApiException {
GenericKubernetesApi<PodMetrics, PodMetricsList> metricsClient =
new GenericKubernetesApi<>(
PodMetrics.class, PodMetricsList.class, "metrics.k8s.io", "v1beta1", "pods", apiClient);
return metricsClient.list(namespace).throwsApiException().getObject();
new GenericKubernetesApi<>(
PodMetrics.class, PodMetricsList.class, Metrics.API_GROUP, Metrics.API_VERSION, "pods", apiClient);
final ListOptions listOptions = new ListOptions();
listOptions.setLabelSelector(labelSelector);
return metricsClient.list(namespace, listOptions).throwsApiException().getObject();
}
}
19 changes: 19 additions & 0 deletions util/src/test/java/io/kubernetes/client/MetricsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,25 @@ void getPodMetricsThrowsAPIExceptionWhenServerReturnsError() {
}
}

@Test
void getPodMetricsWithLabelSelectorThrowsAPIExceptionWhenServerReturnsError() {
String namespace = "default";
Metrics metrics = new Metrics(client);
apiServer.stubFor(
get(urlPathMatching("^/apis/metrics.k8s.io/v1beta1/namespaces/" + namespace + "/pods.*"))
.willReturn(
aResponse()
.withStatus(503)
.withHeader("Content-Type", "text/plain")
.withBody("Service Unavailable")));
try {
metrics.getPodMetrics(namespace, "foo=bar");
failBecauseExceptionWasNotThrown(ApiException.class);
} catch (ApiException ex) {
assertThat(ex.getCode()).isEqualTo(503);
}
}

@Test
void getNodeMetricsThrowsAPIExceptionWhenServerReturnsError() {
Metrics metrics = new Metrics(client);
Expand Down