Skip to content

Commit

Permalink
extract tools module #1774
Browse files Browse the repository at this point in the history
redesign NetworkAvailabilityChecker.
  • Loading branch information
koo-taejin committed May 18, 2016
1 parent f58f92e commit 0364e51
Show file tree
Hide file tree
Showing 8 changed files with 352 additions and 72 deletions.
2 changes: 1 addition & 1 deletion agent/src/assembly/distribution.xml
Expand Up @@ -15,7 +15,7 @@
<outputDirectory></outputDirectory>
</fileSet>
<fileSet>
<directory>${basedir}/src/main/script</directory>
<directory>${basedir.parent}/tools/src/main/script</directory>
<outputDirectory>script</outputDirectory>
</fileSet>
</fileSets>
Expand Down
5 changes: 0 additions & 5 deletions tools/pom.xml
Expand Up @@ -12,11 +12,6 @@
<packaging>jar</packaging>

<dependencies>
<dependency>
<groupId>com.navercorp.pinpoint</groupId>
<artifactId>pinpoint-commons</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.navercorp.pinpoint</groupId>
<artifactId>pinpoint-profiler</artifactId>
Expand Down
Expand Up @@ -18,16 +18,18 @@

import com.navercorp.pinpoint.bootstrap.config.DefaultProfilerConfig;
import com.navercorp.pinpoint.bootstrap.config.ProfilerConfig;
import com.navercorp.pinpoint.profiler.sender.DataSender;
import com.navercorp.pinpoint.profiler.sender.TcpDataSender;
import com.navercorp.pinpoint.profiler.sender.UdpDataSender;
import com.navercorp.pinpoint.rpc.client.PinpointClient;
import com.navercorp.pinpoint.rpc.client.PinpointClientFactory;
import com.navercorp.pinpoint.rpc.util.ClientFactoryUtils;
import com.navercorp.pinpoint.thrift.io.HeaderTBaseSerializer;
import com.navercorp.pinpoint.thrift.io.HeaderTBaseSerializerFactory;
import com.navercorp.pinpoint.thrift.io.NetworkAvailabilityCheckPacket;
import com.navercorp.pinpoint.tools.network.NetworkChecker;
import com.navercorp.pinpoint.tools.network.TCPChecker;
import com.navercorp.pinpoint.tools.network.UDPChecker;
import org.apache.thrift.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collections;
import java.io.IOException;
import java.util.Arrays;

/**
*
Expand All @@ -46,80 +48,68 @@ public static void main(String[] args) {

String configPath = args[0];

DataSender udpStatSender = null;
DataSender udpSpanSender = null;
DataSender tcpSender = null;
ProfilerConfig profilerConfig = null;
try {
profilerConfig = DefaultProfilerConfig.load(configPath);
} catch (IOException e) {
e.printStackTrace();
return;
}

PinpointClientFactory clientFactory = null;
PinpointClient client = null;
try {
ProfilerConfig profilerConfig = DefaultProfilerConfig.load(configPath);
checkUDPStat(profilerConfig);
} catch (Exception e) {
e.printStackTrace();
}

String collectorStatIp = profilerConfig.getCollectorStatServerIp();
int collectorStatPort = profilerConfig.getCollectorStatServerPort();
udpStatSender = new UdpDataSender(collectorStatIp, collectorStatPort, "UDP-STAT", 10);
try {
checkUDPSpan(profilerConfig);
} catch (Exception e) {
e.printStackTrace();
}

String collectorSpanIp = profilerConfig.getCollectorSpanServerIp();
int collectorSpanPort = profilerConfig.getCollectorSpanServerPort();
udpSpanSender = new UdpDataSender(collectorSpanIp, collectorSpanPort, "UDP-SPAN", 10);
try {
checkTCP(profilerConfig);
} catch (Exception e) {
e.printStackTrace();
}
}

String collectorTcpIp = profilerConfig.getCollectorTcpServerIp();
int collectorTcpPort = profilerConfig.getCollectorTcpServerPort();
clientFactory = createPinpointClientFactory();
client = ClientFactoryUtils.createPinpointClient(collectorTcpIp, collectorTcpPort, clientFactory);
private static void checkUDPStat(ProfilerConfig profilerConfig) throws Exception {
String ip = profilerConfig.getCollectorStatServerIp();
int port = profilerConfig.getCollectorStatServerPort();

tcpSender = new TcpDataSender(client);
NetworkChecker checker = new UDPChecker("UDP-STAT", ip, port);
checker.check(getNetworkCheckPayload(), getNetworkCheckResponsePayload());
}

boolean udpSenderResult = udpStatSender.isNetworkAvailable();
boolean udpSpanSenderResult = udpSpanSender.isNetworkAvailable();
boolean tcpSenderResult = tcpSender.isNetworkAvailable();

StringBuilder buffer = new StringBuilder();
buffer.append("\nTEST RESULT\n");
write(buffer, "UDP-STAT://", collectorStatIp, collectorStatPort, udpSenderResult);
write(buffer, "UDP-SPAN://", collectorSpanIp, collectorSpanPort, udpSpanSenderResult);
write(buffer, "TCP://", collectorTcpIp, collectorTcpPort, tcpSenderResult);
private static void checkUDPSpan(ProfilerConfig profilerConfig) throws Exception {
String ip = profilerConfig.getCollectorSpanServerIp();
int port = profilerConfig.getCollectorSpanServerPort();

System.out.println(buffer.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
closeDataSender(udpStatSender);
closeDataSender(udpSpanSender);
closeDataSender(tcpSender);
System.out.println("END.");

if (client != null) {
client.close();
}
if (clientFactory != null) {
clientFactory.release();
}
}
NetworkChecker checker = new UDPChecker("UDP-SPAN", ip, port);
checker.check(getNetworkCheckPayload(), getNetworkCheckResponsePayload());
}

private static void write(StringBuilder buffer, String protocol, String collectorStatIp, int collectorStatPort, boolean udpSenderResult) {
buffer.append(protocol);
buffer.append(collectorStatIp);
buffer.append(":");
buffer.append(collectorStatPort);
buffer.append("=");
buffer.append((udpSenderResult) ? "OK" : "FAILED");
buffer.append("\n");
private static void checkTCP(ProfilerConfig profilerConfig) throws Exception {
String ip = profilerConfig.getCollectorTcpServerIp();
int port = profilerConfig.getCollectorTcpServerPort();

NetworkChecker checker = new TCPChecker("TCP", ip, port);
checker.check();
}

private static void closeDataSender(DataSender dataSender) {
if (dataSender != null) {
dataSender.stop();
}
private static byte[] getNetworkCheckPayload() throws TException {
HeaderTBaseSerializer serializer = new HeaderTBaseSerializerFactory(false, 65535, false).createSerializer();
byte[] payload = serializer.serialize(new NetworkAvailabilityCheckPacket());
int size = serializer.getInterBufferSize();

return Arrays.copyOf(payload, size);
}

private static PinpointClientFactory createPinpointClientFactory() {
PinpointClientFactory pinpointClientFactory = new PinpointClientFactory();
pinpointClientFactory.setTimeoutMillis(1000 * 5);
pinpointClientFactory.setProperties(Collections.<String, Object>emptyMap());

return pinpointClientFactory;
private static byte[] getNetworkCheckResponsePayload() {
return Arrays.copyOf(NetworkAvailabilityCheckPacket.DATA_OK, NetworkAvailabilityCheckPacket.DATA_OK.length);
}

}
@@ -0,0 +1,88 @@
package com.navercorp.pinpoint.tools.network;

import com.navercorp.pinpoint.tools.utils.HostResolver;

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.List;

/**
* @author Taejin Koo
*/
public abstract class AbstractNetworkChecker implements NetworkChecker {

private static final String WHITE_SPACE = " "; // 4space
private static final String LINE_SEPARATOR = "\r\n";

private final String testName;

private final InetSocketAddress hostAddress;
private final List<InetSocketAddress> ipAddressList;

public AbstractNetworkChecker(String testName, InetSocketAddress hostAddress) throws UnknownHostException {
this.testName = testName;
this.hostAddress = hostAddress;
this.ipAddressList = HostResolver.getIPList(hostAddress);
}

protected abstract boolean check(InetSocketAddress address) throws IOException;

protected abstract boolean check(InetSocketAddress address, byte[] requestData, byte[] expectedResponseData) throws IOException;

@Override
public void check() throws IOException {
StringBuilder report = new StringBuilder(32);

String hostName = getHostName(hostAddress);
report.append(testName).append(":// ").append(hostName).append(LINE_SEPARATOR);

for (InetSocketAddress ipAddress : ipAddressList) {
boolean check = check(ipAddress);
report.append(createReport(ipAddress, check));
}

System.out.println(report.toString());

}

@Override
public void check(byte[] requestData, byte[] expectedResponseData) throws IOException {
StringBuilder report = new StringBuilder(32);

String hostName = getHostName(hostAddress);
report.append(testName).append(":// ").append(hostName).append(LINE_SEPARATOR);

for (InetSocketAddress ipAddress : ipAddressList) {
boolean check = check(ipAddress, requestData, expectedResponseData);
report.append(createReport(ipAddress, check));
}

System.out.println(report.toString());
}

private String getHostName(InetSocketAddress hostAddress) {
String hostName = hostAddress.getHostName();
return hostName;
}

private String createReport(InetSocketAddress socketAddress, boolean check) {
String ip = getIp(socketAddress, socketAddress.getHostName());
int port = socketAddress.getPort();

StringBuilder report = new StringBuilder();
report.append(WHITE_SPACE).append("=> ").append(ip).append(":").append(port);
report.append(" [").append(check ? "SUCCESS" : "FAIL").append("]").append(LINE_SEPARATOR);
return report.toString();
}

protected String getIp(InetSocketAddress socketAddress, String defaultValue) {
InetAddress address = socketAddress.getAddress();
if (address != null) {
return address.getHostAddress();
}
return defaultValue;
}

}
@@ -0,0 +1,14 @@
package com.navercorp.pinpoint.tools.network;

import java.io.IOException;

/**
* @author Taejin Koo
*/
public interface NetworkChecker {

void check() throws IOException;

void check(byte[] requestData, byte[] expectedResponseData) throws IOException;

}
@@ -0,0 +1,83 @@
package com.navercorp.pinpoint.tools.network;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Arrays;

/**
* @author Taejin Koo
*/
public class TCPChecker extends AbstractNetworkChecker {

public TCPChecker(String testName, String hostName, int port) throws UnknownHostException {
this(testName, new InetSocketAddress(hostName, port));
}

public TCPChecker(String testName, InetSocketAddress hostAddress) throws UnknownHostException {
super(testName, hostAddress);
}


@Override
protected boolean check(InetSocketAddress address) throws IOException {
Socket socket = null;
try {
socket = createSocket(address);
return socket.isConnected();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
socket.close();
}
}
return false;
}

@Override
protected boolean check(InetSocketAddress address, byte[] requestData, byte[] expectedResponseData) throws IOException {
Socket socket = null;
try {
socket = createSocket(address);

write(socket, requestData);
byte[] responseData = read(socket, 100);

return Arrays.equals(expectedResponseData, responseData);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
socket.close();
}
}
return false;
}

private Socket createSocket(InetSocketAddress socketAddress) throws IOException {
Socket socket = new Socket();
socket.connect(socketAddress);
socket.setSoTimeout(3000);
return socket;
}

private void write(Socket socket, byte[] requestData) throws IOException {
OutputStream outputStream = socket.getOutputStream();
outputStream.write(requestData);
outputStream.flush();
}

private byte[] read(Socket socket, int readSize) throws IOException {
byte[] buf = new byte[readSize];

InputStream inputStream = socket.getInputStream();
inputStream.read(buf);

return buf;
}

}

0 comments on commit 0364e51

Please sign in to comment.