Skip to content
Open
33 changes: 27 additions & 6 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,16 @@
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;

import javax.annotation.Nullable;

public class Metrics {
private static final String API_GROUP = "metrics.k8s.io";
private static final String API_VERSION = "v1beta1";
private static final String PODS = "pods";
private static final String NODES = "nodes";

private ApiClient apiClient;

/** Simple Metrics API constructor, uses default configuration */
Expand Down Expand Up @@ -61,17 +69,30 @@ public NodeMetricsList getNodeMetrics() throws ApiException {
new GenericKubernetesApi<>(
NodeMetrics.class,
NodeMetricsList.class,
"metrics.k8s.io",
"v1beta1",
"nodes",
Metrics.API_GROUP,
Metrics.API_VERSION,
Metrics.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, @Nullable 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, Metrics.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
Loading