Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -64,5 +64,22 @@ public static void main(String[] args) throws IOException, ApiException {
System.out.println();
}
}

for (PodMetrics item : metrics.getPodMetrics("default", "foo=bar").getItems()) {
System.out.println(item.getMetadata().getName());
System.out.println("------------------------------");
if (item.getContainers() == null) {
continue;
}
for (ContainerMetrics container : item.getContainers()) {
System.out.println(container.getName());
System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
for (String key : container.getUsage().keySet()) {
System.out.println("\t" + key);
System.out.println("\t" + container.getUsage().get(key));
}
System.out.println();
}
}
}
}
41 changes: 35 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,17 @@
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.KubernetesApiResponse;
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 +70,37 @@ 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 KubernetesApiResponse<PodMetricsList> response;
if (labelSelector == null || labelSelector.trim().isEmpty()) {
response = metricsClient.list(namespace);
} else {
final ListOptions listOptions = new ListOptions();
listOptions.setLabelSelector(labelSelector);
response = metricsClient.list(namespace, listOptions);
}

return response.throwsApiException().getObject();
}
}
17 changes: 3 additions & 14 deletions util/src/test/java/io/kubernetes/client/MetricsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@

import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
import static org.junit.jupiter.api.Assertions.assertThrows;

import com.github.tomakehurst.wiremock.junit5.WireMockExtension;
import io.kubernetes.client.openapi.ApiClient;
Expand Down Expand Up @@ -49,12 +48,7 @@ void getPodMetricsThrowsAPIExceptionWhenServerReturnsError() {
.withStatus(503)
.withHeader("Content-Type", "text/plain")
.withBody("Service Unavailable")));
try {
metrics.getPodMetrics(namespace);
failBecauseExceptionWasNotThrown(ApiException.class);
} catch (ApiException ex) {
assertThat(ex.getCode()).isEqualTo(503);
}
assertThrows(ApiException.class, () -> metrics.getPodMetrics(namespace));
}

@Test
Expand All @@ -67,11 +61,6 @@ void getNodeMetricsThrowsAPIExceptionWhenServerReturnsError() {
.withStatus(503)
.withHeader("Content-Type", "text/plain")
.withBody("Service Unavailable")));
try {
metrics.getNodeMetrics();
failBecauseExceptionWasNotThrown(ApiException.class);
} catch (ApiException ex) {
assertThat(ex.getCode()).isEqualTo(503);
}
assertThrows(ApiException.class, metrics::getNodeMetrics);
}
}