Skip to content

Commit 4f5f46e

Browse files
elekanuengineer
authored andcommitted
HDDS-1935. Improve the visibility with Ozone Insight tool (#1255)
1 parent 7b3fa4f commit 4f5f46e

File tree

45 files changed

+2431
-181
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+2431
-181
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
package org.apache.hadoop.ozone.protocolPB;
19+
20+
import java.util.Map;
21+
import java.util.concurrent.ConcurrentHashMap;
22+
import java.util.concurrent.atomic.AtomicLong;
23+
24+
import org.apache.hadoop.metrics2.MetricsCollector;
25+
import org.apache.hadoop.metrics2.MetricsInfo;
26+
import org.apache.hadoop.metrics2.MetricsRecordBuilder;
27+
import org.apache.hadoop.metrics2.MetricsSource;
28+
import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
29+
30+
import com.google.protobuf.ProtocolMessageEnum;
31+
32+
/**
33+
* Metrics to count all the subtypes of a specific message.
34+
*/
35+
public class ProtocolMessageMetrics implements MetricsSource {
36+
37+
private String name;
38+
39+
private String description;
40+
41+
private Map<ProtocolMessageEnum, AtomicLong> counters =
42+
new ConcurrentHashMap<>();
43+
44+
public static ProtocolMessageMetrics create(String name,
45+
String description, ProtocolMessageEnum[] types) {
46+
ProtocolMessageMetrics protocolMessageMetrics =
47+
new ProtocolMessageMetrics(name, description,
48+
types);
49+
return protocolMessageMetrics;
50+
}
51+
52+
public ProtocolMessageMetrics(String name, String description,
53+
ProtocolMessageEnum[] values) {
54+
this.name = name;
55+
this.description = description;
56+
for (ProtocolMessageEnum value : values) {
57+
counters.put(value, new AtomicLong(0));
58+
}
59+
}
60+
61+
public void increment(ProtocolMessageEnum key) {
62+
counters.get(key).incrementAndGet();
63+
}
64+
65+
public void register() {
66+
DefaultMetricsSystem.instance()
67+
.register(name, description, this);
68+
}
69+
70+
public void unregister() {
71+
DefaultMetricsSystem.instance().unregisterSource(name);
72+
}
73+
74+
@Override
75+
public void getMetrics(MetricsCollector collector, boolean all) {
76+
MetricsRecordBuilder builder = collector.addRecord(name);
77+
counters.forEach((key, value) -> {
78+
builder.addCounter(new MetricName(key.toString(), ""), value.longValue());
79+
});
80+
builder.endRecord();
81+
}
82+
83+
/**
84+
* Simple metrics info implementation.
85+
*/
86+
public static class MetricName implements MetricsInfo {
87+
private String name;
88+
private String description;
89+
90+
public MetricName(String name, String description) {
91+
this.name = name;
92+
this.description = description;
93+
}
94+
95+
@Override
96+
public String name() {
97+
return name;
98+
}
99+
100+
@Override
101+
public String description() {
102+
return description;
103+
}
104+
}
105+
}

hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/protocolPB/ScmBlockLocationProtocolServerSideTranslatorPB.java

Lines changed: 69 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,25 @@
1717
*/
1818
package org.apache.hadoop.ozone.protocolPB;
1919

20-
import com.google.protobuf.RpcController;
21-
import com.google.protobuf.ServiceException;
22-
import io.opentracing.Scope;
20+
import java.io.IOException;
21+
import java.util.List;
22+
import java.util.stream.Collectors;
2323

2424
import org.apache.hadoop.classification.InterfaceAudience;
25-
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos;
2625
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
27-
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos
28-
.AllocateBlockResponse;
26+
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
27+
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos;
28+
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos.AllocateBlockResponse;
29+
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos.AllocateScmBlockRequestProto;
30+
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos.AllocateScmBlockResponseProto;
31+
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos.DeleteKeyBlocksResultProto;
32+
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos.DeleteScmKeyBlocksRequestProto;
33+
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos.DeleteScmKeyBlocksResponseProto;
34+
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos.SCMBlockLocationRequest;
35+
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos.SCMBlockLocationResponse;
36+
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos.SortDatanodesRequestProto;
37+
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos.SortDatanodesResponseProto;
38+
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos.Status;
2939
import org.apache.hadoop.hdds.scm.ScmInfo;
3040
import org.apache.hadoop.hdds.scm.container.common.helpers.AllocatedBlock;
3141
import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
@@ -34,34 +44,15 @@
3444
import org.apache.hadoop.hdds.scm.protocol.StorageContainerLocationProtocol;
3545
import org.apache.hadoop.hdds.scm.protocolPB.ScmBlockLocationProtocolPB;
3646
import org.apache.hadoop.hdds.scm.protocolPB.StorageContainerLocationProtocolPB;
37-
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
38-
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos
39-
.AllocateScmBlockRequestProto;
40-
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos
41-
.AllocateScmBlockResponseProto;
42-
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos
43-
.DeleteKeyBlocksResultProto;
44-
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos
45-
.DeleteScmKeyBlocksRequestProto;
46-
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos
47-
.DeleteScmKeyBlocksResponseProto;
48-
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos
49-
.SCMBlockLocationResponse;
50-
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos
51-
.SCMBlockLocationRequest;
52-
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos
53-
.Status;
54-
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos
55-
.SortDatanodesRequestProto;
56-
import org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos
57-
.SortDatanodesResponseProto;
5847
import org.apache.hadoop.hdds.tracing.TracingUtil;
5948
import org.apache.hadoop.ozone.common.BlockGroup;
6049
import org.apache.hadoop.ozone.common.DeleteBlockGroupResult;
6150

62-
import java.io.IOException;
63-
import java.util.List;
64-
import java.util.stream.Collectors;
51+
import com.google.protobuf.RpcController;
52+
import com.google.protobuf.ServiceException;
53+
import io.opentracing.Scope;
54+
import org.slf4j.Logger;
55+
import org.slf4j.LoggerFactory;
6556

6657
/**
6758
* This class is the server-side translator that forwards requests received on
@@ -74,14 +65,22 @@ public final class ScmBlockLocationProtocolServerSideTranslatorPB
7465

7566
private final ScmBlockLocationProtocol impl;
7667

68+
private static final Logger LOG = LoggerFactory
69+
.getLogger(ScmBlockLocationProtocolServerSideTranslatorPB.class);
70+
71+
private final ProtocolMessageMetrics
72+
protocolMessageMetrics;
73+
7774
/**
7875
* Creates a new ScmBlockLocationProtocolServerSideTranslatorPB.
7976
*
8077
* @param impl {@link ScmBlockLocationProtocol} server implementation
8178
*/
8279
public ScmBlockLocationProtocolServerSideTranslatorPB(
83-
ScmBlockLocationProtocol impl) throws IOException {
80+
ScmBlockLocationProtocol impl,
81+
ProtocolMessageMetrics metrics) throws IOException {
8482
this.impl = impl;
83+
this.protocolMessageMetrics = metrics;
8584
}
8685

8786
private SCMBlockLocationResponse.Builder createSCMBlockResponse(
@@ -97,15 +96,45 @@ public SCMBlockLocationResponse send(RpcController controller,
9796
SCMBlockLocationRequest request) throws ServiceException {
9897
String traceId = request.getTraceID();
9998

99+
if (LOG.isTraceEnabled()) {
100+
LOG.trace("BlockLocationProtocol {} request is received: <json>{}</json>",
101+
request.getCmdType().toString(),
102+
request.toString().replaceAll("\n", "\\\\n"));
103+
104+
} else if (LOG.isDebugEnabled()) {
105+
LOG.debug("BlockLocationProtocol {} request is received",
106+
request.getCmdType().toString());
107+
}
108+
109+
protocolMessageMetrics.increment(request.getCmdType());
110+
111+
try (Scope scope = TracingUtil
112+
.importAndCreateScope(
113+
"ScmBlockLocationProtocol." + request.getCmdType(),
114+
request.getTraceID())) {
115+
SCMBlockLocationResponse response =
116+
processMessage(request, traceId);
117+
118+
if (LOG.isTraceEnabled()) {
119+
LOG.trace(
120+
"BlockLocationProtocol {} request is processed. Response: "
121+
+ "<json>{}</json>",
122+
request.getCmdType().toString(),
123+
response.toString().replaceAll("\n", "\\\\n"));
124+
}
125+
return response;
126+
}
127+
}
128+
129+
private SCMBlockLocationResponse processMessage(
130+
SCMBlockLocationRequest request, String traceId) throws ServiceException {
100131
SCMBlockLocationResponse.Builder response = createSCMBlockResponse(
101132
request.getCmdType(),
102133
traceId);
103134
response.setSuccess(true);
104135
response.setStatus(Status.OK);
105136

106-
try(Scope scope = TracingUtil
107-
.importAndCreateScope("ScmBlockLocationProtocol."+request.getCmdType(),
108-
request.getTraceID())) {
137+
try {
109138
switch (request.getCmdType()) {
110139
case AllocateScmBlock:
111140
response.setAllocateScmBlockResponse(
@@ -125,7 +154,7 @@ public SCMBlockLocationResponse send(RpcController controller,
125154
break;
126155
default:
127156
// Should never happen
128-
throw new IOException("Unknown Operation "+request.getCmdType()+
157+
throw new IOException("Unknown Operation " + request.getCmdType() +
129158
" in ScmBlockLocationProtocol");
130159
}
131160
} catch (IOException e) {
@@ -135,6 +164,7 @@ public SCMBlockLocationResponse send(RpcController controller,
135164
response.setMessage(e.getMessage());
136165
}
137166
}
167+
138168
return response.build();
139169
}
140170

@@ -182,12 +212,12 @@ public DeleteScmKeyBlocksResponseProto deleteScmKeyBlocks(
182212
.map(BlockGroup::getFromProto).collect(Collectors.toList());
183213
final List<DeleteBlockGroupResult> results =
184214
impl.deleteKeyBlocks(infoList);
185-
for (DeleteBlockGroupResult result: results) {
215+
for (DeleteBlockGroupResult result : results) {
186216
DeleteKeyBlocksResultProto.Builder deleteResult =
187217
DeleteKeyBlocksResultProto
188-
.newBuilder()
189-
.setObjectKey(result.getObjectKey())
190-
.addAllBlockResults(result.getBlockResultProtoList());
218+
.newBuilder()
219+
.setObjectKey(result.getObjectKey())
220+
.addAllBlockResults(result.getBlockResultProtoList());
191221
resp.addResults(deleteResult.build());
192222
}
193223
return resp.build();

hadoop-hdds/common/src/main/resources/ozone-default.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@
331331

332332
<property>
333333
<name>hdds.prometheus.endpoint.enabled</name>
334-
<value>false</value>
334+
<value>true</value>
335335
<tag>OZONE, MANAGEMENT</tag>
336336
<description>Enable prometheus compatible metric page on the HTTP
337337
servers.

hadoop-hdds/config/src/main/java/org/apache/hadoop/hdds/conf/ConfigFileGenerator.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,21 +93,21 @@ public boolean process(Set<? extends TypeElement> annotations,
9393
}
9494

9595
}
96-
FileObject resource = filer
97-
.createResource(StandardLocation.CLASS_OUTPUT, "",
98-
OUTPUT_FILE_NAME);
96+
}
97+
FileObject resource = filer
98+
.createResource(StandardLocation.CLASS_OUTPUT, "",
99+
OUTPUT_FILE_NAME);
99100

100-
try (Writer writer = new OutputStreamWriter(
101-
resource.openOutputStream(), StandardCharsets.UTF_8)) {
102-
appender.write(writer);
103-
}
101+
try (Writer writer = new OutputStreamWriter(
102+
resource.openOutputStream(), StandardCharsets.UTF_8)) {
103+
appender.write(writer);
104104
}
105+
105106
} catch (IOException e) {
106107
processingEnv.getMessager().printMessage(Kind.ERROR,
107108
"Can't generate the config file from annotation: " + e.getMessage());
108109
}
109110
return false;
110111
}
111112

112-
113113
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.apache.hadoop.http.HttpServer2;
2727
import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
2828
import org.apache.hadoop.net.NetUtils;
29+
2930
import org.eclipse.jetty.webapp.WebAppContext;
3031
import org.slf4j.Logger;
3132
import org.slf4j.LoggerFactory;
@@ -92,8 +93,9 @@ public BaseHttpServer(Configuration conf, String name) throws IOException {
9293
httpServer = builder.build();
9394
httpServer.addServlet("conf", "/conf", HddsConfServlet.class);
9495

96+
httpServer.addServlet("logstream", "/logstream", LogStreamServlet.class);
9597
prometheusSupport =
96-
conf.getBoolean(HddsConfigKeys.HDDS_PROMETHEUS_ENABLED, false);
98+
conf.getBoolean(HddsConfigKeys.HDDS_PROMETHEUS_ENABLED, true);
9799

98100
profilerSupport =
99101
conf.getBoolean(HddsConfigKeys.HDDS_PROFILER_ENABLED, false);

0 commit comments

Comments
 (0)