From 1143918a364312272c8ceacdf9295294851bd088 Mon Sep 17 00:00:00 2001 From: sumitagrawl Date: Fri, 2 Dec 2022 19:51:57 +0530 Subject: [PATCH 1/3] HDDS-7464. Container Report at SCM is not coming separately for ICR and FCR in prometheus endpoint --- .../hadoop/hdds/metrics/MetricsUtil.java | 100 ++++++++++++++++++ .../hadoop/hdds/metrics/package-info.java | 22 ++++ .../FixedThreadPoolWithAffinityExecutor.java | 7 +- .../server/events/SingleThreadExecutor.java | 5 +- 4 files changed, 128 insertions(+), 6 deletions(-) create mode 100644 hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/MetricsUtil.java create mode 100644 hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/package-info.java diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/MetricsUtil.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/MetricsUtil.java new file mode 100644 index 000000000000..75202157f9fd --- /dev/null +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/MetricsUtil.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hdds.metrics; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Map; +import org.apache.hadoop.metrics2.annotation.Metrics; +import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Metrics util for metrics. + */ +public final class MetricsUtil { + private static final String ANNOTATIONS = "annotations"; + private static final String ANNOTATION_DATA = "annotationData"; + private static final Class ANNOTATION_TO_ALTER + = Metrics.class; + + private static final Logger LOG = + LoggerFactory.getLogger(MetricsUtil.class); + + private MetricsUtil() { + } + + /** + * register metric with changing class annotation for metrics. + * + * @param source source to register + * @param name name of metric + * @param desc description of metric + * @param context context of metric + * @param source type + */ + public static void registerDynamic( + T source, String name, String desc, String context) { + updateAnnotation(source.getClass(), name, desc, context); + DefaultMetricsSystem.instance().register(name, desc, source); + } + + private static void updateAnnotation( + Class clz, String name, String desc, String context) { + try { + Annotation annotationValue = new Metrics() { + + @Override + public Class annotationType() { + return ANNOTATION_TO_ALTER; + } + + @Override + public String name() { + return name; + } + + @Override + public String about() { + return desc; + } + + @Override + public String context() { + return context; + } + }; + + Method method = clz.getClass().getDeclaredMethod( + ANNOTATION_DATA, null); + method.setAccessible(true); + Object annotationData = method.invoke(clz); + Field annotations = annotationData.getClass() + .getDeclaredField(ANNOTATIONS); + annotations.setAccessible(true); + Map, Annotation> map = + (Map, Annotation>) annotations + .get(annotationData); + map.put(ANNOTATION_TO_ALTER, annotationValue); + } catch (Exception e) { + LOG.error("Update Metrics annotation failed. ", e); + } + } +} diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/package-info.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/package-info.java new file mode 100644 index 000000000000..830c78cf7209 --- /dev/null +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/package-info.java @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * metrics registeration util. + */ +package org.apache.hadoop.hdds.metrics; diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/FixedThreadPoolWithAffinityExecutor.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/FixedThreadPoolWithAffinityExecutor.java index 4949195cddb1..b07f96bc4ef9 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/FixedThreadPoolWithAffinityExecutor.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/FixedThreadPoolWithAffinityExecutor.java @@ -18,6 +18,7 @@ package org.apache.hadoop.hdds.server.events; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.apache.hadoop.hdds.metrics.MetricsUtil; import org.apache.hadoop.metrics2.annotation.Metric; import org.apache.hadoop.metrics2.annotation.Metrics; import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; @@ -126,10 +127,8 @@ public FixedThreadPoolWithAffinityExecutor( ++i; } - DefaultMetricsSystem.instance() - .register(EVENT_QUEUE + name, - "Event Executor metrics ", - this); + MetricsUtil.registerDynamic(this, EVENT_QUEUE + name, + "Event Executor metrics ", "EventQueue"); } public void setQueueWaitThreshold(long queueWaitThreshold) { diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/SingleThreadExecutor.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/SingleThreadExecutor.java index 09be9cfd5fdd..79615a8f4d00 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/SingleThreadExecutor.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/SingleThreadExecutor.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hdds.server.events; +import org.apache.hadoop.hdds.metrics.MetricsUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,8 +65,8 @@ public class SingleThreadExecutor

implements EventExecutor

{ */ public SingleThreadExecutor(String name) { this.name = name; - DefaultMetricsSystem.instance() - .register(EVENT_QUEUE + name, "Event Executor metrics ", this); + MetricsUtil.registerDynamic(this, EVENT_QUEUE + name, + "Event Executor metrics ", "EventQueue"); executor = Executors.newSingleThreadExecutor( runnable -> { From 9e83080c53d1d7fb9b0d7004e57473afe07371f6 Mon Sep 17 00:00:00 2001 From: sumitagrawl Date: Fri, 2 Dec 2022 20:25:53 +0530 Subject: [PATCH 2/3] HDDS-7464. Container Report at SCM is not coming separately for ICR and FCR in prometheus endpoint --- .../apache/hadoop/hdds/server/events/SingleThreadExecutor.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/SingleThreadExecutor.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/SingleThreadExecutor.java index 79615a8f4d00..f9745f9a1bc2 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/SingleThreadExecutor.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/SingleThreadExecutor.java @@ -26,7 +26,6 @@ import org.apache.hadoop.metrics2.annotation.Metric; import org.apache.hadoop.metrics2.annotation.Metrics; -import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; import org.apache.hadoop.metrics2.lib.MutableCounterLong; /** From 9accf072384ca8ad78b4f4314fa9c8074c6fc010 Mon Sep 17 00:00:00 2001 From: sumitagrawl Date: Tue, 6 Dec 2022 09:46:41 +0530 Subject: [PATCH 3/3] HDDS-7464. Container Report at SCM is not coming separately for ICR and FCR in prometheus endpoint --- .../hadoop/hdds/metrics/package-info.java | 22 ------------------- .../FixedThreadPoolWithAffinityExecutor.java | 2 +- .../server/events/SingleThreadExecutor.java | 2 +- .../hdds/{metrics => utils}/MetricsUtil.java | 2 +- 4 files changed, 3 insertions(+), 25 deletions(-) delete mode 100644 hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/package-info.java rename hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/{metrics => utils}/MetricsUtil.java (98%) diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/package-info.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/package-info.java deleted file mode 100644 index 830c78cf7209..000000000000 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/package-info.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * metrics registeration util. - */ -package org.apache.hadoop.hdds.metrics; diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/FixedThreadPoolWithAffinityExecutor.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/FixedThreadPoolWithAffinityExecutor.java index b07f96bc4ef9..f53bce533dff 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/FixedThreadPoolWithAffinityExecutor.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/FixedThreadPoolWithAffinityExecutor.java @@ -18,7 +18,7 @@ package org.apache.hadoop.hdds.server.events; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import org.apache.hadoop.hdds.metrics.MetricsUtil; +import org.apache.hadoop.hdds.utils.MetricsUtil; import org.apache.hadoop.metrics2.annotation.Metric; import org.apache.hadoop.metrics2.annotation.Metrics; import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/SingleThreadExecutor.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/SingleThreadExecutor.java index f9745f9a1bc2..bc8f7425b656 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/SingleThreadExecutor.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/events/SingleThreadExecutor.java @@ -17,7 +17,7 @@ */ package org.apache.hadoop.hdds.server.events; -import org.apache.hadoop.hdds.metrics.MetricsUtil; +import org.apache.hadoop.hdds.utils.MetricsUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/MetricsUtil.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/MetricsUtil.java similarity index 98% rename from hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/MetricsUtil.java rename to hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/MetricsUtil.java index 75202157f9fd..0850bea1eaa6 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/metrics/MetricsUtil.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/MetricsUtil.java @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.hadoop.hdds.metrics; +package org.apache.hadoop.hdds.utils; import java.lang.annotation.Annotation; import java.lang.reflect.Field;