[
https://issues.apache.org/jira/browse/FLINK-10857?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16687925#comment-16687925
]
ASF GitHub Bot commented on FLINK-10857:
----------------------------------------
zentol closed pull request #7095: [FLINK-10857][metrics] Cache logical scopes
separately for each reporter
URL: https://github.com/apache/flink/pull/7095
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git
a/flink-runtime/src/main/java/org/apache/flink/runtime/metrics/groups/AbstractMetricGroup.java
b/flink-runtime/src/main/java/org/apache/flink/runtime/metrics/groups/AbstractMetricGroup.java
index 909915f216e..4400b14a10d 100644
---
a/flink-runtime/src/main/java/org/apache/flink/runtime/metrics/groups/AbstractMetricGroup.java
+++
b/flink-runtime/src/main/java/org/apache/flink/runtime/metrics/groups/AbstractMetricGroup.java
@@ -90,9 +90,9 @@
* For example: "host-7.taskmanager-2.window_word_count.my-mapper" */
private final String[] scopeStrings;
- /** The logical metrics scope represented by this group, as a
concatenated string, lazily computed.
+ /** The logical metrics scope represented by this group for each
reporter, as a concatenated string, lazily computed.
* For example: "taskmanager.job.task" */
- private String logicalScopeString;
+ private String[] logicalScopeStrings;
/** The metrics query service scope represented by this group, lazily
computed. */
protected QueryScopeInfo queryServiceScopeInfo;
@@ -107,6 +107,7 @@ public AbstractMetricGroup(MetricRegistry registry,
String[] scope, A parent) {
this.scopeComponents = checkNotNull(scope);
this.parent = parent;
this.scopeStrings = new String[registry.getNumberReporters()];
+ this.logicalScopeStrings = new
String[registry.getNumberReporters()];
}
public Map<String, String> getAllVariables() {
@@ -152,14 +153,34 @@ public String getLogicalScope(CharacterFilter filter) {
* @return logical scope
*/
public String getLogicalScope(CharacterFilter filter, char delimiter) {
- if (logicalScopeString == null) {
- if (parent == null) {
- logicalScopeString = getGroupName(filter);
- } else {
- logicalScopeString =
parent.getLogicalScope(filter, delimiter) + delimiter + getGroupName(filter);
+ return getLogicalScope(filter, delimiter, -1);
+ }
+
+ /**
+ * Returns the logical scope of this group, for example
+ * {@code "taskmanager.job.task"}.
+ *
+ * @param filter character filter which is applied to the scope
components
+ * @param delimiter delimiter to use for concatenating scope components
+ * @param reporterIndex index of the reporter
+ * @return logical scope
+ */
+ String getLogicalScope(CharacterFilter filter, char delimiter, int
reporterIndex) {
+ if (logicalScopeStrings.length == 0 || (reporterIndex < 0 ||
reporterIndex >= logicalScopeStrings.length)) {
+ return createLogicalScope(filter, delimiter);
+ } else {
+ if (logicalScopeStrings[reporterIndex] == null) {
+ logicalScopeStrings[reporterIndex] =
createLogicalScope(filter, delimiter);
}
+ return logicalScopeStrings[reporterIndex];
}
- return logicalScopeString;
+ }
+
+ private String createLogicalScope(CharacterFilter filter, char
delimiter) {
+ final String groupName = getGroupName(filter);
+ return parent == null
+ ? groupName
+ : parent.getLogicalScope(filter, delimiter) + delimiter
+ groupName;
}
/**
diff --git
a/flink-runtime/src/main/java/org/apache/flink/runtime/metrics/groups/FrontMetricGroup.java
b/flink-runtime/src/main/java/org/apache/flink/runtime/metrics/groups/FrontMetricGroup.java
index 63842fef9d6..64397d33db6 100644
---
a/flink-runtime/src/main/java/org/apache/flink/runtime/metrics/groups/FrontMetricGroup.java
+++
b/flink-runtime/src/main/java/org/apache/flink/runtime/metrics/groups/FrontMetricGroup.java
@@ -52,6 +52,6 @@ public String getLogicalScope(CharacterFilter filter) {
}
public String getLogicalScope(CharacterFilter filter, char delimiter) {
- return parentMetricGroup.getLogicalScope(filter, delimiter);
+ return parentMetricGroup.getLogicalScope(filter, delimiter,
this.reporterIndex);
}
}
diff --git
a/flink-runtime/src/test/java/org/apache/flink/runtime/metrics/groups/AbstractMetricGroupTest.java
b/flink-runtime/src/test/java/org/apache/flink/runtime/metrics/groups/AbstractMetricGroupTest.java
index f8ed3c6a6d8..f3f8b42b851 100644
---
a/flink-runtime/src/test/java/org/apache/flink/runtime/metrics/groups/AbstractMetricGroupTest.java
+++
b/flink-runtime/src/test/java/org/apache/flink/runtime/metrics/groups/AbstractMetricGroupTest.java
@@ -105,6 +105,30 @@ public void testScopeCachingForMultipleReporters() throws
Exception {
}
}
+ @Test
+ public void testLogicalScopeCachingForMultipleReporters() throws
Exception {
+ Configuration config = new Configuration();
+ config.setString(ConfigConstants.METRICS_REPORTER_PREFIX +
"test1." + ConfigConstants.METRICS_REPORTER_CLASS_SUFFIX,
LogicalScopeReporter1.class.getName());
+ config.setString(ConfigConstants.METRICS_REPORTER_PREFIX +
"test2." + ConfigConstants.METRICS_REPORTER_CLASS_SUFFIX,
LogicalScopeReporter2.class.getName());
+
+ MetricRegistryImpl testRegistry = new
MetricRegistryImpl(MetricRegistryConfiguration.fromConfiguration(config));
+ try {
+ MetricGroup tmGroup = new
TaskManagerMetricGroup(testRegistry, "host", "id")
+ .addGroup("B")
+ .addGroup("C");
+ tmGroup.counter("1");
+ assertEquals("Reporters were not properly
instantiated", 2, testRegistry.getReporters().size());
+ for (MetricReporter reporter :
testRegistry.getReporters()) {
+ ScopeCheckingTestReporter typedReporter =
(ScopeCheckingTestReporter) reporter;
+ if (typedReporter.failureCause != null) {
+ throw typedReporter.failureCause;
+ }
+ }
+ } finally {
+ testRegistry.shutdown().get();
+ }
+ }
+
private abstract static class ScopeCheckingTestReporter extends
TestReporter {
protected Exception failureCause;
@@ -175,6 +199,38 @@ public String filterCharacters(String input) {
}
}
+ /**
+ * Reporter that verifies the logical-scope caching behavior.
+ */
+ public static final class LogicalScopeReporter1 extends
ScopeCheckingTestReporter {
+ @Override
+ public String filterCharacters(String input) {
+ return FILTER_B.filterCharacters(input);
+ }
+
+ @Override
+ public void checkScopes(Metric metric, String metricName,
MetricGroup group) {
+ final String logicalScope =
((FrontMetricGroup<AbstractMetricGroup<?>>) group).getLogicalScope(this, '-');
+ assertEquals("taskmanager-X-C", logicalScope);
+ }
+ }
+
+ /**
+ * Reporter that verifies the logical-scope caching behavior.
+ */
+ public static final class LogicalScopeReporter2 extends
ScopeCheckingTestReporter {
+ @Override
+ public String filterCharacters(String input) {
+ return FILTER_C.filterCharacters(input);
+ }
+
+ @Override
+ public void checkScopes(Metric metric, String metricName,
MetricGroup group) {
+ final String logicalScope =
((FrontMetricGroup<AbstractMetricGroup<?>>) group).getLogicalScope(this, ',');
+ assertEquals("taskmanager,B,X", logicalScope);
+ }
+ }
+
@Test
public void testScopeGenerationWithoutReporters() throws Exception {
Configuration config = new Configuration();
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> Conflict between JMX and Prometheus Metrics reporter
> ----------------------------------------------------
>
> Key: FLINK-10857
> URL: https://issues.apache.org/jira/browse/FLINK-10857
> Project: Flink
> Issue Type: Bug
> Components: Metrics
> Affects Versions: 1.5.5, 1.6.2, 1.7.0
> Reporter: Truong Duc Kien
> Assignee: Chesnay Schepler
> Priority: Major
> Labels: pull-request-available
>
> When registering both JMX and Prometheus metrics reporter, the Prometheus
> reporter will fail with many exceptions, such as.
>
> {code:java}
> o.a.f.r.m.MetricRegistryImpl Error while registering metric.
> java.lang.IllegalArgumentException: Invalid metric name:
> flink_jobmanager.Status.JVM.Memory.Mapped_Count
> at
> org.apache.flink.shaded.io.prometheus.client.Collector.checkMetricName(Collector.java:182)
> at
> org.apache.flink.shaded.io.prometheus.client.SimpleCollector.<init>(SimpleCollector.java:164)
> at
> org.apache.flink.shaded.io.prometheus.client.Gauge.<init>(Gauge.java:68)
> at
> org.apache.flink.shaded.io.prometheus.client.Gauge$Builder.create(Gauge.java:74)
> at
> org.apache.flink.metrics.prometheus.AbstractPrometheusReporter.createCollector(AbstractPrometheusReporter.java:130)
> at
> org.apache.flink.metrics.prometheus.AbstractPrometheusReporter.notifyOfAddedMetric(AbstractPrometheusReporter.java:106)
> at
> org.apache.flink.runtime.metrics.MetricRegistryImpl.register(MetricRegistryImpl.java:329)
> at
> org.apache.flink.runtime.metrics.groups.AbstractMetricGroup.addMetric(AbstractMetricGroup.java:379)
> at
> org.apache.flink.runtime.metrics.groups.AbstractMetricGroup.gauge(AbstractMetricGroup.java:323)
> at
> org.apache.flink.runtime.metrics.util.MetricUtils.instantiateMemoryMetrics(MetricUtils.java:231)
> at
> org.apache.flink.runtime.metrics.util.MetricUtils.instantiateStatusMetrics(MetricUtils.java:100)
> at
> org.apache.flink.runtime.metrics.util.MetricUtils.instantiateJobManagerMetricGroup(MetricUtils.java:68)
> at
> org.apache.flink.runtime.entrypoint.ClusterEntrypoint.startClusterComponents(ClusterEntrypoint.java:342)
> at
> org.apache.flink.runtime.entrypoint.ClusterEntrypoint.runCluster(ClusterEntrypoint.java:233)
> at
> org.apache.flink.runtime.entrypoint.ClusterEntrypoint.lambda$startCluster$0(ClusterEntrypoint.java:191)
> at java.security.AccessController.doPrivileged(Native Method)
> at javax.security.auth.Subject.doAs(Subject.java:422)
> at
> org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1869)
> at
> org.apache.flink.runtime.security.HadoopSecurityContext.runSecured(HadoopSecurityContext.java:41)
> at
> org.apache.flink.runtime.entrypoint.ClusterEntrypoint.startCluster(ClusterEntrypoint.java:190)
> at
> org.apache.flink.yarn.entrypoint.YarnJobClusterEntrypoint.main(YarnJobClusterEntrypoint.java:176)
> {code}
>
> This is a small program to reproduce the problem:
> [https://github.com/dikei/flink-metrics-conflict-test]
>
> I
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)