This is an automated email from the ASF dual-hosted git repository.
gyfora pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/flink-kubernetes-operator.git
The following commit(s) were added to refs/heads/main by this push:
new f1387f72 [FLINK-29619] Remove redundant MeterView updater thread from
KubernetesClientMetrics
f1387f72 is described below
commit f1387f723da3f274bcb3268d401d91042064255d
Author: Matyas Orhidi <[email protected]>
AuthorDate: Thu Oct 13 09:36:17 2022 +0200
[FLINK-29619] Remove redundant MeterView updater thread from
KubernetesClientMetrics
---
.../operator/metrics/KubernetesClientMetrics.java | 11 --
.../metrics/KubernetesClientMetricsTest.java | 184 +++++++++++++++------
.../operator/metrics/TestingMetricListener.java | 22 ++-
3 files changed, 152 insertions(+), 65 deletions(-)
diff --git
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/metrics/KubernetesClientMetrics.java
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/metrics/KubernetesClientMetrics.java
index fe582260..1dc6d3d1 100644
---
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/metrics/KubernetesClientMetrics.java
+++
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/metrics/KubernetesClientMetrics.java
@@ -32,8 +32,6 @@ import okhttp3.Response;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
/** Kubernetes client metrics. */
public class KubernetesClientMetrics implements Interceptor {
@@ -90,9 +88,6 @@ public class KubernetesClientMetrics implements Interceptor {
this.responseLatency =
responseMetricGroup.histogram(
HISTO,
OperatorMetricUtils.createHistogram(flinkOperatorConfiguration));
-
- Executors.newSingleThreadScheduledExecutor()
- .scheduleAtFixedRate(this::updateMeters, 0, 1,
TimeUnit.SECONDS);
}
@Override
@@ -140,10 +135,4 @@ public class KubernetesClientMetrics implements
Interceptor {
OperatorMetricUtils.synchronizedCounter(
responseMetricGroup.addGroup(key).counter(COUNTER)));
}
-
- private void updateMeters() {
- this.requestRateMeter.update();
- this.requestFailedRateMeter.update();
- this.responseRateMeter.update();
- }
}
diff --git
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/metrics/KubernetesClientMetricsTest.java
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/metrics/KubernetesClientMetricsTest.java
index 70ef11d9..9a87f699 100644
---
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/metrics/KubernetesClientMetricsTest.java
+++
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/metrics/KubernetesClientMetricsTest.java
@@ -22,9 +22,7 @@ import org.apache.flink.configuration.Configuration;
import org.apache.flink.kubernetes.operator.TestUtils;
import org.apache.flink.kubernetes.operator.config.FlinkConfigManager;
import org.apache.flink.kubernetes.operator.utils.KubernetesClientUtils;
-import org.apache.flink.metrics.testutils.MetricListener;
-import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientException;
import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient;
import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer;
@@ -53,7 +51,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
@TestMethodOrder(OrderAnnotation.class)
public class KubernetesClientMetricsTest {
private KubernetesMockServer mockServer;
- private final MetricListener listener = new MetricListener();
private static final String REQUEST_COUNTER_ID =
String.join(".", KUBE_CLIENT_GROUP, HTTP_REQUEST_GROUP, COUNTER);
@@ -83,65 +80,154 @@ public class KubernetesClientMetricsTest {
@Test
@Order(1)
public void testMetricsDisabled() {
+ var configuration = new Configuration();
+ configuration.set(
+
KubernetesOperatorMetricOptions.OPERATOR_KUBERNETES_CLIENT_METRICS_ENABLED,
false);
+ var flinkConfigManager = new FlinkConfigManager(configuration);
+ var listener = new
TestingMetricListener(flinkConfigManager.getDefaultConfig());
+ var kubernetesClient =
+ KubernetesClientUtils.getKubernetesClient(
+ flinkConfigManager.getOperatorConfiguration(),
+ listener.getMetricGroup(),
+ mockServer.createClient().getConfiguration());
+
var deployment = TestUtils.buildApplicationCluster();
- KubernetesClient noMetricsClient = getKubernetesClient(false);
- noMetricsClient.resource(deployment).get();
- assertFalse(listener.getCounter(REQUEST_COUNTER_ID).isPresent());
- assertFalse(listener.getMeter(REQUEST_METER_ID).isPresent());
-
assertFalse(listener.getCounter(REQUEST_FAILED_COUNTER_ID).isPresent());
- assertFalse(listener.getMeter(REQUEST_FAILED_METER_ID).isPresent());
- assertFalse(listener.getCounter(RESPONSE_COUNTER_ID).isPresent());
- assertFalse(listener.getMeter(RESPONSE_METER_ID).isPresent());
- assertFalse(listener.getHistogram(RESPONSE_LATENCY_ID).isPresent());
- assertFalse(listener.getHistogram(RESPONSE_LATENCY_ID).isPresent());
+ kubernetesClient.resource(deployment).get();
+
assertFalse(listener.getCounter(listener.getMetricId(REQUEST_COUNTER_ID)).isPresent());
+
assertFalse(listener.getMeter(listener.getMetricId(REQUEST_METER_ID)).isPresent());
+ assertFalse(
+
listener.getCounter(listener.getMetricId(REQUEST_FAILED_COUNTER_ID)).isPresent());
+
assertFalse(listener.getMeter(listener.getMetricId(REQUEST_FAILED_METER_ID)).isPresent());
+
assertFalse(listener.getCounter(listener.getMetricId(RESPONSE_COUNTER_ID)).isPresent());
+
assertFalse(listener.getMeter(listener.getMetricId(RESPONSE_METER_ID)).isPresent());
+
assertFalse(listener.getHistogram(listener.getMetricId(RESPONSE_LATENCY_ID)).isPresent());
+
assertFalse(listener.getHistogram(listener.getMetricId(RESPONSE_LATENCY_ID)).isPresent());
}
@Test
@Order(2)
public void testMetricsEnabled() {
- KubernetesClient kubernetesClient = getKubernetesClient(true);
+ var flinkConfigManager = new FlinkConfigManager(new Configuration());
+ var listener = new
TestingMetricListener(flinkConfigManager.getDefaultConfig());
+ var kubernetesClient =
+ KubernetesClientUtils.getKubernetesClient(
+ flinkConfigManager.getOperatorConfiguration(),
+ listener.getMetricGroup(),
+ mockServer.createClient().getConfiguration());
+
var deployment = TestUtils.buildApplicationCluster();
- assertEquals(0,
listener.getCounter(REQUEST_COUNTER_ID).get().getCount());
- assertEquals(0.0, listener.getMeter(REQUEST_METER_ID).get().getRate());
- assertEquals(0,
listener.getCounter(REQUEST_FAILED_COUNTER_ID).get().getCount());
- assertEquals(0.0,
listener.getMeter(REQUEST_FAILED_METER_ID).get().getRate());
- assertEquals(0,
listener.getCounter(RESPONSE_COUNTER_ID).get().getCount());
- assertEquals(0.0,
listener.getMeter(RESPONSE_METER_ID).get().getRate());
- assertEquals(0,
listener.getHistogram(RESPONSE_LATENCY_ID).get().getStatistics().getMin());
- assertEquals(0,
listener.getHistogram(RESPONSE_LATENCY_ID).get().getStatistics().getMax());
+ assertEquals(
+ 0,
listener.getCounter(listener.getMetricId(REQUEST_COUNTER_ID)).get().getCount());
+ assertEquals(
+ 0.0,
listener.getMeter(listener.getMetricId(REQUEST_METER_ID)).get().getRate());
+ assertEquals(
+ 0,
+
listener.getCounter(listener.getMetricId(REQUEST_FAILED_COUNTER_ID))
+ .get()
+ .getCount());
+ assertEquals(
+ 0.0,
+
listener.getMeter(listener.getMetricId(REQUEST_FAILED_METER_ID)).get().getRate());
+ assertEquals(
+ 0,
listener.getCounter(listener.getMetricId(RESPONSE_COUNTER_ID)).get().getCount());
+ assertEquals(
+ 0.0,
listener.getMeter(listener.getMetricId(RESPONSE_METER_ID)).get().getRate());
+ assertEquals(
+ 0,
+
listener.getHistogram(listener.getMetricId(RESPONSE_LATENCY_ID))
+ .get()
+ .getStatistics()
+ .getMin());
+ assertEquals(
+ 0,
+
listener.getHistogram(listener.getMetricId(RESPONSE_LATENCY_ID))
+ .get()
+ .getStatistics()
+ .getMax());
kubernetesClient.resource(deployment).createOrReplace();
- assertEquals(1,
listener.getCounter(REQUEST_COUNTER_ID).get().getCount());
- assertEquals(1,
listener.getCounter(REQUEST_POST_COUNTER_ID).get().getCount());
- assertEquals(1,
listener.getCounter(RESPONSE_COUNTER_ID).get().getCount());
- assertEquals(1,
listener.getCounter(RESPONSE_200_COUNTER_ID).get().getCount());
-
assertTrue(listener.getHistogram(RESPONSE_LATENCY_ID).get().getStatistics().getMin()
> 0);
-
assertTrue(listener.getHistogram(RESPONSE_LATENCY_ID).get().getStatistics().getMax()
> 0);
+ assertEquals(
+ 1,
listener.getCounter(listener.getMetricId(REQUEST_COUNTER_ID)).get().getCount());
+ assertEquals(
+ 1,
+
listener.getCounter(listener.getMetricId(REQUEST_POST_COUNTER_ID))
+ .get()
+ .getCount());
+ assertEquals(
+ 1,
listener.getCounter(listener.getMetricId(RESPONSE_COUNTER_ID)).get().getCount());
+ assertEquals(
+ 1,
+
listener.getCounter(listener.getMetricId(RESPONSE_200_COUNTER_ID))
+ .get()
+ .getCount());
+ assertTrue(
+
listener.getHistogram(listener.getMetricId(RESPONSE_LATENCY_ID))
+ .get()
+ .getStatistics()
+ .getMin()
+ > 0);
+ assertTrue(
+
listener.getHistogram(listener.getMetricId(RESPONSE_LATENCY_ID))
+ .get()
+ .getStatistics()
+ .getMax()
+ > 0);
kubernetesClient.resource(deployment).delete();
- assertEquals(1,
listener.getCounter(REQUEST_DELETE_COUNTER_ID).get().getCount());
+ assertEquals(
+ 1,
+
listener.getCounter(listener.getMetricId(REQUEST_DELETE_COUNTER_ID))
+ .get()
+ .getCount());
kubernetesClient.resource(deployment).delete();
- assertEquals(2,
listener.getCounter(REQUEST_DELETE_COUNTER_ID).get().getCount());
- assertEquals(1,
listener.getCounter(RESPONSE_404_COUNTER_ID).get().getCount());
+ assertEquals(
+ 2,
+
listener.getCounter(listener.getMetricId(REQUEST_DELETE_COUNTER_ID))
+ .get()
+ .getCount());
+ assertEquals(
+ 1,
+
listener.getCounter(listener.getMetricId(RESPONSE_404_COUNTER_ID))
+ .get()
+ .getCount());
Awaitility.await()
.atMost(1, TimeUnit.MINUTES)
.until(
() -> {
kubernetesClient.resource(deployment).createOrReplace();
- return
listener.getMeter(REQUEST_METER_ID).get().getRate() > 0.1
- &&
listener.getMeter(RESPONSE_METER_ID).get().getRate() > 0.1;
+ return
listener.getMeter(listener.getMetricId(REQUEST_METER_ID))
+ .get()
+ .getRate()
+ > 0.01
+ &&
listener.getMeter(listener.getMetricId(RESPONSE_METER_ID))
+ .get()
+ .getRate()
+ > 0.01;
});
}
@Test
@Order(3)
public void testAPIServerIsDown() {
+ var flinkConfigManager = new FlinkConfigManager(new Configuration());
+ var listener = new
TestingMetricListener(flinkConfigManager.getDefaultConfig());
+ var kubernetesClient =
+ KubernetesClientUtils.getKubernetesClient(
+ flinkConfigManager.getOperatorConfiguration(),
+ listener.getMetricGroup(),
+ mockServer.createClient().getConfiguration());
+
var deployment = TestUtils.buildApplicationCluster();
- KubernetesClient kubernetesClient = getKubernetesClient(true);
mockServer.shutdown();
- assertEquals(0,
listener.getCounter(REQUEST_FAILED_COUNTER_ID).get().getCount());
- assertEquals(0.0,
listener.getMeter(REQUEST_FAILED_METER_ID).get().getRate());
+ assertEquals(
+ 0,
+
listener.getCounter(listener.getMetricId(REQUEST_FAILED_COUNTER_ID))
+ .get()
+ .getCount());
+ assertEquals(
+ 0.0,
+
listener.getMeter(listener.getMetricId(REQUEST_FAILED_METER_ID)).get().getRate());
Awaitility.await()
.atMost(1, TimeUnit.MINUTES)
.until(
@@ -149,22 +235,18 @@ public class KubernetesClientMetricsTest {
assertThrows(
KubernetesClientException.class,
() ->
kubernetesClient.resource(deployment).createOrReplace());
- return
listener.getCounter(REQUEST_FAILED_COUNTER_ID).get().getCount()
+ return listener.getCounter(
+
listener.getMetricId(
+
REQUEST_FAILED_COUNTER_ID))
+ .get()
+ .getCount()
> 0
- &&
listener.getMeter(REQUEST_FAILED_METER_ID).get().getRate()
- > 0.1;
+ && listener.getMeter(
+
listener.getMetricId(
+
REQUEST_FAILED_METER_ID))
+ .get()
+ .getRate()
+ > 0.01;
});
}
-
- private KubernetesClient getKubernetesClient(boolean enableMetrics) {
- var configuration = new Configuration();
- configuration.setBoolean(
-
KubernetesOperatorMetricOptions.OPERATOR_KUBERNETES_CLIENT_METRICS_ENABLED,
- enableMetrics);
- var configManager = new FlinkConfigManager(configuration);
- return KubernetesClientUtils.getKubernetesClient(
- configManager.getOperatorConfiguration(),
- listener.getMetricGroup(),
- mockServer.createClient().getConfiguration());
- }
}
diff --git
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/metrics/TestingMetricListener.java
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/metrics/TestingMetricListener.java
index 3ce5f21b..40c72efe 100644
---
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/metrics/TestingMetricListener.java
+++
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/metrics/TestingMetricListener.java
@@ -24,30 +24,46 @@ import org.apache.flink.metrics.Gauge;
import org.apache.flink.metrics.Histogram;
import org.apache.flink.metrics.Meter;
import org.apache.flink.metrics.Metric;
+import org.apache.flink.metrics.View;
+import org.apache.flink.runtime.metrics.ViewUpdater;
import org.apache.flink.runtime.metrics.util.TestingMetricRegistry;
+import org.apache.flink.util.concurrent.ExecutorThreadFactory;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
/** Utility class for metrics testing. */
public class TestingMetricListener {
-
public static final String DELIMITER = ".";
- private final KubernetesOperatorMetricGroup metricGroup;
- private final Map<String, Metric> metrics = new HashMap();
private static final String NAMESPACE = "test-op-ns";
private static final String NAME = "test-op-name";
private static final String HOST = "test-op-host";
+ private final KubernetesOperatorMetricGroup metricGroup;
+ private final Map<String, Metric> metrics = new HashMap();
+ private final ScheduledExecutorService executor;
private Configuration configuration;
+ private ViewUpdater viewUpdater;
public TestingMetricListener(Configuration configuration) {
+ this.executor =
+ Executors.newSingleThreadScheduledExecutor(
+ new
ExecutorThreadFactory("Flink-TestingMetricRegistry"));
+
TestingMetricRegistry registry =
TestingMetricRegistry.builder()
.setDelimiter(DELIMITER.charAt(0))
.setRegisterConsumer(
(metric, name, group) -> {
this.metrics.put(group.getMetricIdentifier(name), metric);
+ if (metric instanceof View) {
+ if (viewUpdater == null) {
+ viewUpdater = new
ViewUpdater(executor);
+ }
+ viewUpdater.notifyOfAddedView((View)
metric);
+ }
})
.build();
this.metricGroup =