Skip to content

Commit 0cc80f6

Browse files
authored
HDDS-9438. Improve ProtocolMessageMetrics (apache#9600)
1 parent de16b27 commit 0cc80f6

File tree

17 files changed

+70
-90
lines changed

17 files changed

+70
-90
lines changed

hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@
7878
import org.apache.hadoop.ozone.container.ozoneimpl.DataScanResult;
7979
import org.apache.hadoop.util.Time;
8080
import org.apache.ratis.statemachine.StateMachine;
81-
import org.apache.ratis.thirdparty.com.google.protobuf.ProtocolMessageEnum;
8281
import org.apache.ratis.thirdparty.io.grpc.stub.StreamObserver;
8382
import org.apache.ratis.util.UncheckedAutoCloseable;
8483
import org.slf4j.Logger;
@@ -110,9 +109,9 @@ public class HddsDispatcher implements ContainerDispatcher, Auditor {
110109
private final ContainerSet containerSet;
111110
private final StateContext context;
112111
private final float containerCloseThreshold;
113-
private final ProtocolMessageMetrics<ProtocolMessageEnum> protocolMetrics;
112+
private final ProtocolMessageMetrics<Type> protocolMetrics;
114113
private OzoneProtocolMessageDispatcher<ContainerCommandRequestProto,
115-
ContainerCommandResponseProto, ProtocolMessageEnum> dispatcher;
114+
ContainerCommandResponseProto, Type> dispatcher;
116115
private String clusterId;
117116
private ContainerMetrics metrics;
118117
private final TokenVerifier tokenVerifier;
@@ -142,7 +141,7 @@ public HddsDispatcher(ConfigurationSource config, ContainerSet contSet,
142141
new ProtocolMessageMetrics<>(
143142
"HddsDispatcher",
144143
"HDDS dispatcher metrics",
145-
Type.values());
144+
Type.class);
146145

147146
this.dispatcher =
148147
new OzoneProtocolMessageDispatcher<>("DatanodeClient",

hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/protocolPB/StorageContainerDatanodeProtocolServerSideTranslatorPB.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import static org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.INITIAL_VERSION;
2121
import static org.apache.hadoop.ozone.container.upgrade.UpgradeUtils.toLayoutVersionProto;
2222

23-
import com.google.protobuf.ProtocolMessageEnum;
2423
import com.google.protobuf.RpcController;
2524
import com.google.protobuf.ServiceException;
2625
import java.io.IOException;
@@ -54,11 +53,11 @@ public class StorageContainerDatanodeProtocolServerSideTranslatorPB
5453

5554
private final StorageContainerDatanodeProtocol impl;
5655
private final OzoneProtocolMessageDispatcher<SCMDatanodeRequest,
57-
SCMDatanodeResponse, ProtocolMessageEnum> dispatcher;
56+
SCMDatanodeResponse, Type> dispatcher;
5857

5958
public StorageContainerDatanodeProtocolServerSideTranslatorPB(
6059
StorageContainerDatanodeProtocol impl,
61-
ProtocolMessageMetrics<ProtocolMessageEnum> protocolMessageMetrics) {
60+
ProtocolMessageMetrics<Type> protocolMessageMetrics) {
6261
this.impl = impl;
6362
dispatcher =
6463
new OzoneProtocolMessageDispatcher<>("SCMDatanodeProtocol",

hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/OzoneProtocolMessageDispatcher.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
* It logs the message type/content on DEBUG/TRACING log for insight and create
3535
* a new span based on the tracing information.
3636
*/
37-
public class OzoneProtocolMessageDispatcher<REQUEST, RESPONSE, TYPE> {
37+
public class OzoneProtocolMessageDispatcher<REQUEST, RESPONSE, TYPE extends Enum<TYPE>> {
3838

3939
private final String serviceName;
4040

hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/ProtocolMessageMetrics.java

Lines changed: 40 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717

1818
package org.apache.hadoop.hdds.utils;
1919

20+
import java.util.Collections;
21+
import java.util.EnumMap;
2022
import java.util.Map;
21-
import java.util.concurrent.ConcurrentHashMap;
2223
import java.util.concurrent.atomic.AtomicInteger;
2324
import java.util.concurrent.atomic.AtomicLong;
2425
import org.apache.hadoop.metrics2.MetricsCollector;
2526
import org.apache.hadoop.metrics2.MetricsInfo;
26-
import org.apache.hadoop.metrics2.MetricsRecordBuilder;
2727
import org.apache.hadoop.metrics2.MetricsSource;
2828
import org.apache.hadoop.metrics2.MetricsTag;
2929
import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
@@ -34,47 +34,48 @@
3434
/**
3535
* Metrics to count all the subtypes of a specific message.
3636
*/
37-
public class ProtocolMessageMetrics<KEY> implements MetricsSource {
37+
public class ProtocolMessageMetrics<KEY extends Enum<KEY>> implements MetricsSource {
3838

3939
private final String name;
4040

4141
private final String description;
4242

43-
private final Map<KEY, AtomicLong> counters =
44-
new ConcurrentHashMap<>();
45-
46-
private final Map<KEY, AtomicLong> elapsedTimes =
47-
new ConcurrentHashMap<>();
43+
private final Map<KEY, Stats> stats;
4844

4945
private final AtomicInteger concurrency = new AtomicInteger(0);
5046

51-
public static <KEY> ProtocolMessageMetrics<KEY> create(String name,
52-
String description, KEY[] types) {
53-
return new ProtocolMessageMetrics<KEY>(name, description, types);
47+
private static final MetricsInfo TYPE_TAG_INFO = Interns.info("type", "Message type");
48+
private static final MetricsInfo COUNTER_INFO = Interns.info("counter", "Number of distinct calls");
49+
private static final MetricsInfo TIME_INFO = Interns.info("time", "Sum of the duration of the calls");
50+
private static final MetricsInfo CONCURRENCY_INFO = Interns.info("concurrency",
51+
"Number of requests processed concurrently");
52+
53+
public static <KEY extends Enum<KEY>> ProtocolMessageMetrics<KEY> create(String name,
54+
String description, Class<KEY> enumClass) {
55+
return new ProtocolMessageMetrics<>(name, description, enumClass);
5456
}
5557

5658
public ProtocolMessageMetrics(String name, String description,
57-
KEY[] values) {
59+
Class<KEY> enumClass) {
5860
this.name = name;
5961
this.description = description;
60-
for (KEY value : values) {
61-
counters.put(value, new AtomicLong(0));
62-
elapsedTimes.put(value, new AtomicLong(0));
62+
final EnumMap<KEY, Stats> map = new EnumMap<>(enumClass);
63+
for (KEY value : enumClass.getEnumConstants()) {
64+
map.put(value, new Stats());
6365
}
66+
this.stats = Collections.unmodifiableMap(map);
6467
}
6568

6669
public void increment(KEY key, long duration) {
67-
counters.get(key).incrementAndGet();
68-
elapsedTimes.get(key).addAndGet(duration);
70+
stats.get(key).add(duration);
6971
}
7072

7173
public UncheckedAutoCloseable measure(KEY key) {
7274
final long startTime = Time.monotonicNow();
7375
concurrency.incrementAndGet();
7476
return () -> {
7577
concurrency.decrementAndGet();
76-
counters.get(key).incrementAndGet();
77-
elapsedTimes.get(key).addAndGet(Time.monotonicNow() - startTime);
78+
stats.get(key).add(Time.monotonicNow() - startTime);
7879
};
7980
}
8081

@@ -89,44 +90,36 @@ public void unregister() {
8990

9091
@Override
9192
public void getMetrics(MetricsCollector collector, boolean all) {
92-
counters.forEach((key, value) -> {
93-
MetricsRecordBuilder builder =
94-
collector.addRecord(name);
95-
builder.add(
96-
new MetricsTag(Interns.info("type", "Message type"), key.toString()));
97-
builder.addCounter(new MetricName("counter", "Number of distinct calls"),
98-
value.longValue());
99-
builder.addCounter(
100-
new MetricName("time", "Sum of the duration of the calls"),
101-
elapsedTimes.get(key).longValue());
102-
builder.endRecord();
103-
93+
stats.forEach((key, stat) -> {
94+
collector.addRecord(name)
95+
.add(new MetricsTag(TYPE_TAG_INFO, key.toString()))
96+
.addCounter(COUNTER_INFO, stat.counter())
97+
.addCounter(TIME_INFO, stat.time())
98+
.endRecord();
10499
});
105-
MetricsRecordBuilder builder = collector.addRecord(name);
106-
builder.addCounter(new MetricName("concurrency",
107-
"Number of requests processed concurrently"), concurrency.get());
100+
collector.addRecord(name)
101+
.addCounter(CONCURRENCY_INFO, concurrency.get())
102+
.endRecord();
108103
}
109104

110105
/**
111-
* Simple metrics info implementation.
106+
* Holds counters for a single message type.
112107
*/
113-
public static class MetricName implements MetricsInfo {
114-
private final String name;
115-
private final String description;
108+
private static final class Stats {
109+
private final AtomicLong counter = new AtomicLong(0);
110+
private final AtomicLong time = new AtomicLong(0);
116111

117-
public MetricName(String name, String description) {
118-
this.name = name;
119-
this.description = description;
112+
void add(long duration) {
113+
counter.incrementAndGet();
114+
time.addAndGet(duration);
120115
}
121116

122-
@Override
123-
public String name() {
124-
return name;
117+
long counter() {
118+
return counter.get();
125119
}
126120

127-
@Override
128-
public String description() {
129-
return description;
121+
long time() {
122+
return time.get();
130123
}
131124
}
132125
}

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SCMSecurityProtocolServerSideTranslatorPB.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
package org.apache.hadoop.hdds.scm.protocol;
1919

20-
import com.google.protobuf.ProtocolMessageEnum;
2120
import com.google.protobuf.RpcController;
2221
import com.google.protobuf.ServiceException;
2322
import java.io.IOException;
@@ -63,7 +62,7 @@ public class SCMSecurityProtocolServerSideTranslatorPB
6362
private static final String ROLE_TYPE = "SCM";
6463

6564
private OzoneProtocolMessageDispatcher<SCMSecurityRequest,
66-
SCMSecurityResponse, ProtocolMessageEnum>
65+
SCMSecurityResponse, SCMSecurityProtocolProtos.Type>
6766
dispatcher;
6867

6968
public SCMSecurityProtocolServerSideTranslatorPB(SCMSecurityProtocol impl,

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
package org.apache.hadoop.hdds.scm.protocol;
1919

20-
import com.google.protobuf.ProtocolMessageEnum;
2120
import com.google.protobuf.RpcController;
2221
import com.google.protobuf.ServiceException;
2322
import java.io.IOException;
@@ -76,7 +75,7 @@ public final class ScmBlockLocationProtocolServerSideTranslatorPB
7675
.getLogger(ScmBlockLocationProtocolServerSideTranslatorPB.class);
7776

7877
private final OzoneProtocolMessageDispatcher<SCMBlockLocationRequest,
79-
SCMBlockLocationResponse, ProtocolMessageEnum>
78+
SCMBlockLocationResponse, ScmBlockLocationProtocolProtos.Type>
8079
dispatcher;
8180

8281
/**
@@ -87,7 +86,7 @@ public final class ScmBlockLocationProtocolServerSideTranslatorPB
8786
public ScmBlockLocationProtocolServerSideTranslatorPB(
8887
ScmBlockLocationProtocol impl,
8988
StorageContainerManager scm,
90-
ProtocolMessageMetrics<ProtocolMessageEnum> metrics)
89+
ProtocolMessageMetrics<ScmBlockLocationProtocolProtos.Type> metrics)
9190
throws IOException {
9291
this.impl = impl;
9392
this.scm = scm;

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SecretKeyProtocolServerSideTranslatorPB.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717

1818
package org.apache.hadoop.hdds.scm.protocol;
1919

20-
import com.google.protobuf.ProtocolMessageEnum;
2120
import com.google.protobuf.RpcController;
2221
import com.google.protobuf.ServiceException;
2322
import java.io.IOException;
2423
import java.util.UUID;
2524
import org.apache.hadoop.hdds.protocol.SecretKeyProtocolScm;
25+
import org.apache.hadoop.hdds.protocol.proto.SCMSecretKeyProtocolProtos;
2626
import org.apache.hadoop.hdds.protocol.proto.SCMSecretKeyProtocolProtos.SCMGetCheckAndRotateResponse;
2727
import org.apache.hadoop.hdds.protocol.proto.SCMSecretKeyProtocolProtos.SCMGetCurrentSecretKeyResponse;
2828
import org.apache.hadoop.hdds.protocol.proto.SCMSecretKeyProtocolProtos.SCMGetSecretKeyRequest;
@@ -58,7 +58,7 @@ public class SecretKeyProtocolServerSideTranslatorPB
5858
private static final String ROLE_TYPE = "SCM";
5959

6060
private OzoneProtocolMessageDispatcher<SCMSecretKeyRequest,
61-
SCMSecretKeyResponse, ProtocolMessageEnum> dispatcher;
61+
SCMSecretKeyResponse, SCMSecretKeyProtocolProtos.Type> dispatcher;
6262

6363
public SecretKeyProtocolServerSideTranslatorPB(SecretKeyProtocolScm impl,
6464
StorageContainerManager storageContainerManager,

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import static org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.Type.ListPipelines;
3131
import static org.apache.hadoop.hdds.scm.protocol.StorageContainerLocationProtocol.ADMIN_COMMAND_TYPE;
3232

33-
import com.google.protobuf.ProtocolMessageEnum;
3433
import com.google.protobuf.RpcController;
3534
import com.google.protobuf.ServiceException;
3635
import java.io.IOException;
@@ -185,7 +184,7 @@ public final class StorageContainerLocationProtocolServerSideTranslatorPB
185184
private static final String ROLE_TYPE = "SCM";
186185

187186
private OzoneProtocolMessageDispatcher<ScmContainerLocationRequest,
188-
ScmContainerLocationResponse, ProtocolMessageEnum>
187+
ScmContainerLocationResponse, StorageContainerLocationProtocolProtos.Type>
189188
dispatcher;
190189

191190
/**
@@ -198,7 +197,7 @@ public final class StorageContainerLocationProtocolServerSideTranslatorPB
198197
public StorageContainerLocationProtocolServerSideTranslatorPB(
199198
StorageContainerLocationProtocol impl,
200199
StorageContainerManager scm,
201-
ProtocolMessageMetrics<ProtocolMessageEnum> protocolMetrics)
200+
ProtocolMessageMetrics<StorageContainerLocationProtocolProtos.Type> protocolMetrics)
202201
throws IOException {
203202
this.impl = impl;
204203
this.scm = scm;

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMBlockProtocolServer.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333

3434
import com.google.common.collect.Maps;
3535
import com.google.protobuf.BlockingService;
36-
import com.google.protobuf.ProtocolMessageEnum;
3736
import java.io.IOException;
3837
import java.net.InetSocketAddress;
3938
import java.util.ArrayList;
@@ -99,7 +98,7 @@ public class SCMBlockProtocolServer implements
9998
private final StorageContainerManager scm;
10099
private final RPC.Server blockRpcServer;
101100
private final InetSocketAddress blockRpcAddress;
102-
private final ProtocolMessageMetrics<ProtocolMessageEnum>
101+
private final ProtocolMessageMetrics<ScmBlockLocationProtocolProtos.Type>
103102
protocolMessageMetrics;
104103
private final SCMPerformanceMetrics perfMetrics;
105104

@@ -123,7 +122,7 @@ public SCMBlockProtocolServer(OzoneConfiguration conf,
123122
ProtocolMessageMetrics.create(
124123
"ScmBlockLocationProtocol",
125124
"SCM Block location protocol counters",
126-
ScmBlockLocationProtocolProtos.Type.values());
125+
ScmBlockLocationProtocolProtos.Type.class);
127126

128127
// SCM Block Service RPC.
129128
BlockingService blockProtoPbService =

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import com.google.common.base.Strings;
3535
import com.google.common.collect.Maps;
3636
import com.google.protobuf.BlockingService;
37-
import com.google.protobuf.ProtocolMessageEnum;
3837
import jakarta.annotation.Nullable;
3938
import java.io.IOException;
4039
import java.net.InetSocketAddress;
@@ -140,7 +139,7 @@ public class SCMClientProtocolServer implements
140139
private final InetSocketAddress clientRpcAddress;
141140
private final StorageContainerManager scm;
142141
private final OzoneConfiguration config;
143-
private final ProtocolMessageMetrics<ProtocolMessageEnum> protocolMetrics;
142+
private final ProtocolMessageMetrics<StorageContainerLocationProtocolProtos.Type> protocolMetrics;
144143

145144
public SCMClientProtocolServer(OzoneConfiguration conf,
146145
StorageContainerManager scm,
@@ -158,7 +157,7 @@ public SCMClientProtocolServer(OzoneConfiguration conf,
158157
protocolMetrics = ProtocolMessageMetrics
159158
.create("ScmContainerLocationProtocol",
160159
"SCM ContainerLocation protocol metrics",
161-
StorageContainerLocationProtocolProtos.Type.values());
160+
StorageContainerLocationProtocolProtos.Type.class);
162161

163162
// SCM Container Service RPC
164163
BlockingService storageProtoPbService =

0 commit comments

Comments
 (0)