Skip to content

Commit 47b48e5

Browse files
hotcodemachaHarshitGupta11
authored andcommitted
HADOOP-18363. Fix bug preventing hadoop-metrics2 from emitting metrics to > 1 Ganglia servers (apache#4627)
* HADOOP-18363. Fix bug preventing hadoop-metrics2 from emitting metrics to > 1 Ganglia servers
1 parent 53ab2b7 commit 47b48e5

File tree

2 files changed

+67
-49
lines changed

2 files changed

+67
-49
lines changed

hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/sink/ganglia/AbstractGangliaSink.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.io.IOException;
2222
import java.net.*;
2323
import java.nio.charset.StandardCharsets;
24+
import java.util.ArrayList;
2425
import java.util.HashMap;
2526
import java.util.List;
2627
import java.util.Map;
@@ -78,6 +79,10 @@ public abstract class AbstractGangliaSink implements MetricsSink {
7879
private int offset;
7980
private boolean supportSparseMetrics = SUPPORT_SPARSE_METRICS_DEFAULT;
8081

82+
public List<? extends SocketAddress> getMetricsServers() {
83+
return metricsServers;
84+
}
85+
8186
/**
8287
* Used for visiting Metrics
8388
*/
@@ -133,8 +138,11 @@ public void init(SubsetConfiguration conf) {
133138
}
134139

135140
// load the gannglia servers from properties
136-
metricsServers = Servers.parse(conf.getString(SERVERS_PROPERTY),
137-
DEFAULT_PORT);
141+
List<String> serversFromConf =
142+
conf.getList(String.class, SERVERS_PROPERTY, new ArrayList<String>());
143+
metricsServers =
144+
Servers.parse(serversFromConf.size() > 0 ? String.join(",", serversFromConf) : null,
145+
DEFAULT_PORT);
138146
multicastEnabled = conf.getBoolean(MULTICAST_ENABLED_PROPERTY,
139147
DEFAULT_MULTICAST_ENABLED);
140148
multicastTtl = conf.getInt(MULTICAST_TTL_PROPERTY, DEFAULT_MULTICAST_TTL);

hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/sink/ganglia/TestGangliaSink.java

Lines changed: 57 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
* to you under the Apache License, Version 2.0 (the
77
* "License"); you may not use this file except in compliance
88
* with the License. You may obtain a copy of the License at
9-
*
10-
* http://www.apache.org/licenses/LICENSE-2.0
11-
*
9+
* <p>
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
* <p>
1212
* Unless required by applicable law or agreed to in writing, software
1313
* distributed under the License is distributed on an "AS IS" BASIS,
1414
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,6 +20,7 @@
2020

2121
import org.apache.commons.configuration2.SubsetConfiguration;
2222
import org.apache.hadoop.metrics2.impl.ConfigBuilder;
23+
2324
import org.junit.Test;
2425

2526
import java.net.DatagramSocket;
@@ -30,52 +31,61 @@
3031
import static org.junit.Assert.assertTrue;
3132

3233
public class TestGangliaSink {
33-
@Test
34-
public void testShouldCreateDatagramSocketByDefault() throws Exception {
35-
SubsetConfiguration conf = new ConfigBuilder()
36-
.subset("test.sink.ganglia");
34+
@Test
35+
public void testShouldCreateDatagramSocketByDefault() throws Exception {
36+
SubsetConfiguration conf = new ConfigBuilder().subset("test.sink.ganglia");
37+
38+
GangliaSink30 gangliaSink = new GangliaSink30();
39+
gangliaSink.init(conf);
40+
DatagramSocket socket = gangliaSink.getDatagramSocket();
41+
assertFalse("Did not create DatagramSocket",
42+
socket == null || socket instanceof MulticastSocket);
43+
}
3744

38-
GangliaSink30 gangliaSink = new GangliaSink30();
39-
gangliaSink.init(conf);
40-
DatagramSocket socket = gangliaSink.getDatagramSocket();
41-
assertFalse("Did not create DatagramSocket", socket == null || socket instanceof MulticastSocket);
42-
}
45+
@Test
46+
public void testShouldCreateDatagramSocketIfMulticastIsDisabled() throws Exception {
47+
SubsetConfiguration conf =
48+
new ConfigBuilder().add("test.sink.ganglia.multicast", false).subset("test.sink.ganglia");
49+
GangliaSink30 gangliaSink = new GangliaSink30();
50+
gangliaSink.init(conf);
51+
DatagramSocket socket = gangliaSink.getDatagramSocket();
52+
assertFalse("Did not create DatagramSocket",
53+
socket == null || socket instanceof MulticastSocket);
54+
}
4355

44-
@Test
45-
public void testShouldCreateDatagramSocketIfMulticastIsDisabled() throws Exception {
46-
SubsetConfiguration conf = new ConfigBuilder()
47-
.add("test.sink.ganglia.multicast", false)
48-
.subset("test.sink.ganglia");
49-
GangliaSink30 gangliaSink = new GangliaSink30();
50-
gangliaSink.init(conf);
51-
DatagramSocket socket = gangliaSink.getDatagramSocket();
52-
assertFalse("Did not create DatagramSocket", socket == null || socket instanceof MulticastSocket);
53-
}
56+
@Test
57+
public void testShouldCreateMulticastSocket() throws Exception {
58+
SubsetConfiguration conf =
59+
new ConfigBuilder().add("test.sink.ganglia.multicast", true).subset("test.sink.ganglia");
60+
GangliaSink30 gangliaSink = new GangliaSink30();
61+
gangliaSink.init(conf);
62+
DatagramSocket socket = gangliaSink.getDatagramSocket();
63+
assertTrue("Did not create MulticastSocket",
64+
socket != null && socket instanceof MulticastSocket);
65+
int ttl = ((MulticastSocket) socket).getTimeToLive();
66+
assertEquals("Did not set default TTL", 1, ttl);
67+
}
5468

55-
@Test
56-
public void testShouldCreateMulticastSocket() throws Exception {
57-
SubsetConfiguration conf = new ConfigBuilder()
58-
.add("test.sink.ganglia.multicast", true)
59-
.subset("test.sink.ganglia");
60-
GangliaSink30 gangliaSink = new GangliaSink30();
61-
gangliaSink.init(conf);
62-
DatagramSocket socket = gangliaSink.getDatagramSocket();
63-
assertTrue("Did not create MulticastSocket", socket != null && socket instanceof MulticastSocket);
64-
int ttl = ((MulticastSocket) socket).getTimeToLive();
65-
assertEquals("Did not set default TTL", 1, ttl);
66-
}
69+
@Test
70+
public void testShouldSetMulticastSocketTtl() throws Exception {
71+
SubsetConfiguration conf = new ConfigBuilder().add("test.sink.ganglia.multicast", true)
72+
.add("test.sink.ganglia.multicast.ttl", 3).subset("test.sink.ganglia");
73+
GangliaSink30 gangliaSink = new GangliaSink30();
74+
gangliaSink.init(conf);
75+
DatagramSocket socket = gangliaSink.getDatagramSocket();
76+
assertTrue("Did not create MulticastSocket",
77+
socket != null && socket instanceof MulticastSocket);
78+
int ttl = ((MulticastSocket) socket).getTimeToLive();
79+
assertEquals("Did not set TTL", 3, ttl);
80+
}
6781

68-
@Test
69-
public void testShouldSetMulticastSocketTtl() throws Exception {
70-
SubsetConfiguration conf = new ConfigBuilder()
71-
.add("test.sink.ganglia.multicast", true)
72-
.add("test.sink.ganglia.multicast.ttl", 3)
73-
.subset("test.sink.ganglia");
74-
GangliaSink30 gangliaSink = new GangliaSink30();
75-
gangliaSink.init(conf);
76-
DatagramSocket socket = gangliaSink.getDatagramSocket();
77-
assertTrue("Did not create MulticastSocket", socket != null && socket instanceof MulticastSocket);
78-
int ttl = ((MulticastSocket) socket).getTimeToLive();
79-
assertEquals("Did not set TTL", 3, ttl);
80-
}
82+
@Test
83+
public void testMultipleMetricsServers() {
84+
SubsetConfiguration conf =
85+
new ConfigBuilder().add("test.sink.ganglia.servers", "server1,server2")
86+
.subset("test.sink.ganglia");
87+
GangliaSink30 gangliaSink = new GangliaSink30();
88+
gangliaSink.init(conf);
89+
assertEquals(2, gangliaSink.getMetricsServers().size());
90+
}
8191
}

0 commit comments

Comments
 (0)