Skip to content

Commit 0b91682

Browse files
committed
Monitor is optional; improved example
1 parent 34f0ee1 commit 0b91682

8 files changed

Lines changed: 135 additions & 50 deletions

File tree

chaos-runner/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ You can get this jar in 2 ways.
3838
| `--random` | Take the servers down randomly. Default is Round Robin. | Round Robin |
3939
| `--port` | The starting server port. | 4222 |
4040
| `--listen` | The starting listen port for clusters. | 4232 |
41-
| `--monitor` | The starting monitor port. | 4282 |
41+
| `--monitor` | The starting monitor port. use 0 for no monitor | 4282 |
4242

4343
#### Regarding ports
4444
Given any starting port, the system automatically figures the ports for the other nodes.
@@ -86,7 +86,7 @@ This assumes you've installed graalvm. You may need to specify the ful path to t
8686
(or your platform equivalent) if not already in your path.
8787

8888
```
89-
> native-image.cmd -cp <Path-To>\chaos-runner-0.0.2-uber.jar io.synadia.chaos.ChaosRunner chaos-runner
89+
> native-image.cmd --install-exit-handlers -cp <Path-To>\chaos-runner-0.0.2-uber.jar io.synadia.chaos.ChaosRunner chaos-runner
9090
> .\chaos-runner.exe --servers 1 --delay 4000 --initial 10000
9191
```
9292

chaos-runner/build.gradle

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,20 @@ tasks.register ('uberJar', Jar) {
140140
exclude 'META-INF/*.RSA','META-INF/*.SF','META-INF/*.DSA','**/examples**','placeholder.*'
141141
}
142142

143+
tasks.register ('examplesUberJar', Jar) {
144+
archiveClassifier.set('examplesUber')
145+
from sourceSets.main.output
146+
dependsOn configurations.runtimeClasspath
147+
from {
148+
configurations.runtimeClasspath
149+
.findAll {
150+
it.name.contains('jnats') || it.name.contains('nats-server-runner') // examples needs jnats too
151+
}
152+
.collect { zipTree(it) }
153+
}
154+
exclude 'META-INF/*.RSA','META-INF/*.SF','META-INF/*.DSA','placeholder.*'
155+
}
156+
143157
jacoco {
144158
toolVersion = "0.8.6"
145159
}

chaos-runner/make.bat

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
call gradle clean uberJar examplesUberJar
2+
native-image.cmd --install-exit-handlers -cp build\libs\chaos-runner-0.0.3-SNAPSHOT-uber.jar io.synadia.chaos.ChaosRunner chaos-runner

chaos-runner/src/examples/java/io/synadia/examples/ChaosConnectionListener.java

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,47 @@
66
import io.nats.client.Connection;
77
import io.nats.client.ConnectionListener;
88

9+
import java.util.concurrent.atomic.AtomicInteger;
10+
911
import static io.synadia.chaos.ChaosUtils.report;
1012

1113
public class ChaosConnectionListener implements ConnectionListener {
12-
private final String reportLabel;
14+
private static String message(Events event) {
15+
switch (event) {
16+
case CONNECTED: return "Connected";
17+
case CLOSED: return "Closed";
18+
case DISCONNECTED: return "Disconnected";
19+
case RECONNECTED: return "Re-Connected";
20+
case RESUBSCRIBED: return "Subscriptions Re-Established";
21+
case DISCOVERED_SERVERS: return "Servers Discovered";
22+
case LAME_DUCK: return "Entering lame duck mode";
23+
}
24+
return "";
25+
};
26+
27+
private final String connectionName;
28+
private final AtomicInteger currentPort;
1329

1430
public ChaosConnectionListener(String connectionName) {
15-
this.reportLabel = "CL/" + connectionName;
31+
this.connectionName = connectionName;
32+
currentPort = new AtomicInteger(0);
1633
}
1734

1835
@Override
1936
public void connectionEvent(Connection conn, Events type) {
20-
report(reportLabel, type);
37+
int cur;
38+
if (type == Events.CONNECTED) {
39+
cur = conn.getServerInfo().getPort();
40+
currentPort.set(cur);
41+
}
42+
else {
43+
cur = currentPort.get();
44+
}
45+
if (cur == 0) {
46+
report("CL", connectionName, message(type));
47+
}
48+
else {
49+
report("CL", connectionName, message(type), "Port: " + cur);
50+
}
2151
}
2252
}

chaos-runner/src/examples/java/io/synadia/examples/ChaosErrorListener.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,20 @@
1313
import static io.synadia.chaos.ChaosUtils.report;
1414

1515
public class ChaosErrorListener extends ErrorListenerConsoleImpl {
16-
private final String reportLabel;
16+
private final String connectionName;
1717

1818
public ChaosErrorListener(String connectionName) {
19-
this.reportLabel = "EL/" + connectionName;
19+
this.connectionName = connectionName;
2020
}
2121

2222
@Override
2323
public void errorOccurred(Connection conn, String error) {
24-
report(reportLabel, supplyMessage("[SEVERE] errorOccurred", conn, null, null, "Error: ", error));
24+
report("EL", connectionName, "Error", error);
2525
}
2626

2727
@Override
2828
public void exceptionOccurred(Connection conn, Exception exp) {
29-
report(reportLabel, supplyMessage("[SEVERE] exceptionOccurred", conn, null, null, "Exception: ", exp));
29+
report("EL", connectionName, "Exception", exp);
3030
}
3131

3232
@Override
@@ -39,7 +39,7 @@ public void messageDiscarded(Connection conn, Message msg) {
3939

4040
@Override
4141
public void heartbeatAlarm(Connection conn, JetStreamSubscription sub, long lastStreamSequence, long lastConsumerSequence) {
42-
report(reportLabel, supplyMessage("[SEVERE] heartbeatAlarm", conn, null, sub, "lastStreamSequence: ", lastStreamSequence, "lastConsumerSequence: ", lastConsumerSequence));
42+
report("EL", connectionName, "Heartbeat Alarm", "Last Stream Sequence: " + lastStreamSequence, "Last Consumer Sequence: " + lastConsumerSequence);
4343
}
4444

4545
@Override
@@ -60,5 +60,6 @@ public void flowControlProcessed(Connection conn, JetStreamSubscription sub, Str
6060

6161
@Override
6262
public void socketWriteTimeout(Connection conn) {
63+
report("EL", connectionName, "Socket Write Timeout");
6364
}
6465
}

chaos-runner/src/examples/java/io/synadia/examples/ChaosRunnerExample.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import io.nats.client.Connection;
77
import io.nats.client.Nats;
88
import io.nats.client.Options;
9-
import io.nats.client.api.ServerInfo;
109
import io.synadia.chaos.ChaosArguments;
1110
import io.synadia.chaos.ChaosRunner;
1211

@@ -21,22 +20,26 @@
2120
import static io.synadia.chaos.ChaosUtils.report;
2221

2322
public class ChaosRunnerExample {
24-
private static final int NUM_CONNECTIONS = 2;
25-
26-
private static final int SERVER_COUNT = 5; // 1, 3, 5
23+
private static final int SERVER_COUNT = 3; // 1, 3, 5
2724
private static final long DELAY = 5000; // the delay to bring a server down
2825
private static final long INITIAL_DELAY = 10000; // the delay to bring a server down the first time
2926
private static final long DOWN_TIME = 5000; // how long before bringing the server up
3027
private static final int HEALTH_CHECK_DELAY = 3000;
3128

29+
private static final int NUM_CONNECTIONS = 5;
30+
3231
public static void main(String[] args) throws Exception {
3332
ChaosArguments arguments = new ChaosArguments()
3433
.servers(SERVER_COUNT)
34+
.workDirectory("C:\\temp\\chaos-runner")
3535
.serverNamePrefix("cr-example-server")
3636
.clusterName("cr-example-cluster")
3737
.delay(DELAY)
3838
.initialDelay(INITIAL_DELAY)
39-
.downTime(DOWN_TIME);
39+
.downTime(DOWN_TIME)
40+
// this is done last so anything on the command line
41+
// is used over the hard coded items.
42+
.args(args);
4043

4144
ChaosRunner runner = ChaosRunner.start(arguments);
4245

@@ -49,30 +52,33 @@ public static void main(String[] args) throws Exception {
4952
report(" ", url);
5053
}
5154

55+
@SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
5256
List<Connection> connections = new ArrayList<>(urls.length);
5357
for (int i = 0; i < NUM_CONNECTIONS; i++) {
54-
String cn = "CONN/" + i;
58+
String connectionName = "Conn" + (i + 1);
5559
Options options = Options.builder().servers(urls)
56-
.connectionListener(new ChaosConnectionListener(cn))
57-
.errorListener(new ChaosErrorListener(cn))
60+
.connectionListener(new ChaosConnectionListener(connectionName))
61+
.errorListener(new ChaosErrorListener(connectionName))
5862
.build();
5963

6064
Connection connection = Nats.connect(options);
6165
connections.add(connection);
62-
ServerInfo si = connection.getServerInfo();
63-
report("Initial connection", cn, si.getPort(), si.getCluster());
6466
}
6567

6668
int[] ports = runner.getConnectionPorts();
6769
int[] monitorPorts = runner.getMonitorPorts();
70+
boolean hasMonitor = monitorPorts[0] > 0;
6871

72+
String[] reports = new String[ports.length];
6973
while (true) {
7074
Thread.sleep(HEALTH_CHECK_DELAY);
71-
report("HealthZ");
72-
for (int i = 0; i < monitorPorts.length; i++) {
73-
int port = ports[i];
74-
int mport = monitorPorts[i];
75-
report(" ", port + "/" + mport, readHealthz(mport));
75+
if (hasMonitor) {
76+
report("HealthZ");
77+
for (int i = 0; i < monitorPorts.length; i++) {
78+
int port = ports[i];
79+
int mport = monitorPorts[i];
80+
report(" ", port + "/" + mport, readHealthz(mport));
81+
}
7682
}
7783
}
7884
}

chaos-runner/src/main/java/io/synadia/chaos/ChaosRunner.java

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,21 @@ public int[] getConnectionPorts() {
6161
return ports;
6262
}
6363

64+
public int[] getListenPorts() {
65+
int[] lports = new int[servers];
66+
for (int ix = 0; ix < servers; ix++) {
67+
lports[ix] = clusterInserts.get(ix).node.listen;
68+
}
69+
return lports;
70+
}
71+
6472
public int[] getMonitorPorts() {
65-
int[] ports = new int[servers];
73+
int[] mports = new int[servers];
6674
for (int ix = 0; ix < servers; ix++) {
67-
ports[ix] = clusterInserts.get(ix).node.monitor;
75+
Integer mport = clusterInserts.get(ix).node.monitor;
76+
mports[ix] = mport == null ? 0 : mport;
6877
}
69-
return ports;
78+
return mports;
7079
}
7180

7281
public String[] getConnectionUrls() {
@@ -186,25 +195,25 @@ else if (!a.workDirectory.toFile().exists()) {
186195
if (servers == 1) {
187196
List<String> inserts = new ArrayList<>();
188197
ClusterNode cn;
189-
if (jsStoreDirBase == null) {
190-
cn = null;
198+
Path jsStorePath = Paths.get(jsStoreDirBase.toString(), "" + port);
199+
cn = ClusterNode.builder()
200+
.port(port)
201+
.listen(listen)
202+
.monitor(monitor < 1 ? null : monitor)
203+
.jsStoreDir(jsStorePath)
204+
.build();
205+
206+
if (monitor > 0) {
207+
inserts.add("http: " + monitor);
191208
}
192-
else {
193-
Path jsStorePath = Paths.get(jsStoreDirBase.toString(), "" + port);
194-
cn = ClusterNode.builder()
195-
.port(port)
196-
.monitor(monitor)
197-
.jsStoreDir(jsStorePath)
198-
.build();
199-
209+
if (js) {
200210
String storeDir = jsStorePath.toString();
201211
if (File.separatorChar == '\\') {
202212
storeDir = storeDir.replace("\\", "\\\\").replace("/", "\\\\");
203213
}
204214
else {
205215
storeDir = storeDir.replace("\\", "/");
206216
}
207-
inserts.add("http: " + monitor);
208217
inserts.add("jetstream {");
209218
inserts.add(" store_dir=" + storeDir);
210219
inserts.add("}");
@@ -215,7 +224,7 @@ else if (!a.workDirectory.toFile().exists()) {
215224
clusterInserts.add(new ClusterInsert(cn, inserts.toArray(new String[0])));
216225
}
217226
else {
218-
List<ClusterNode> cns = createNodes(servers, clusterName, serverNamePrefix, jsStoreDirBase, DEFAULT_HOST, port, listen, monitor);
227+
List<ClusterNode> cns = createNodes(servers, clusterName, serverNamePrefix, jsStoreDirBase, DEFAULT_HOST, port, listen, monitor < 1 ? null : monitor);
219228
clusterInserts = createClusterInserts(cns);
220229
}
221230

chaos-runner/src/main/java/io/synadia/chaos/ChaosUtils.java

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,44 @@ public static String toString(ChaosRunner r) {
1212
public static String toString(ChaosRunner r, String sep, String prefix, String indent, String outdent) {
1313
String spi = sep + prefix + indent;
1414
StringBuilder sb = new StringBuilder(prefix).append("Chaos Runner:");
15-
sb.append(spi).append("servers=").append(r.servers).append(outdent)
16-
.append(spi).append("js=").append(r.js).append(outdent);
17-
if (r.servers > 1) {
18-
sb.append(spi).append("clusterName=").append(r.clusterName).append(outdent)
19-
.append(spi).append("serverNamePrefix=").append(r.serverNamePrefix).append(outdent);
15+
sb.append(spi).append("servers=").append(r.servers).append(outdent);
16+
if (r.servers == 1) {
17+
sb.append(spi).append("serverName=").append(r.serverNamePrefix).append(outdent);
18+
sb.append(spi).append("port=").append(r.port).append(outdent);
19+
sb.append(spi).append("listen=").append(r.listen).append(outdent);
20+
sb.append(spi).append("monitor=").append(r.monitor).append(outdent);
21+
sb.append(spi).append("url=").append(r.getConnectionUrls()[0]).append(outdent);
2022
}
21-
sb.append(spi).append("jsStoreDirBase=").append(r.jsStoreDirBase).append(outdent)
22-
.append(spi).append("initialDelay=").append(r.initialDelay).append(outdent)
23-
.append(spi).append("delay=").append(r.delay).append(outdent)
24-
.append(spi).append("downTime=").append(r.downTime).append(outdent)
25-
.append(spi).append("random=").append(r.random);
23+
else {
24+
sb.append(spi).append("clusterName=").append(r.clusterName).append(outdent);
25+
sb.append(spi).append("serverNamePrefix=").append(r.serverNamePrefix).append(outdent);
26+
sb.append(spi).append("ports=").append(stringify(r.getConnectionPorts())).append(outdent);
27+
sb.append(spi).append("listen=").append(stringify(r.getListenPorts())).append(outdent);
28+
sb.append(spi).append("monitor=").append(stringify(r.getMonitorPorts())).append(outdent);
29+
}
30+
sb.append(spi).append("js=").append(r.js).append(outdent);
31+
if (r.js) {
32+
sb.append(spi).append("jsStoreDirBase=").append(r.jsStoreDirBase).append(outdent);
33+
}
34+
sb.append(spi).append("initialDelay=").append(r.initialDelay).append(outdent);
35+
sb.append(spi).append("delay=").append(r.delay).append(outdent);
36+
sb.append(spi).append("downTime=").append(r.downTime).append(outdent);
37+
sb.append(spi).append("random=").append(r.random);
2638

2739
return sb.toString();
2840
}
2941

42+
private static StringBuilder stringify(int[] ints) {
43+
StringBuilder sb = new StringBuilder();
44+
for (int j = 0, intsLength = ints.length; j < intsLength; j++) {
45+
if (j > 0) {
46+
sb.append(',');
47+
}
48+
sb.append(ints[j]);
49+
}
50+
return sb;
51+
}
52+
3053
public static void report(String label, Object... parts) {
3154
String prefix = "[" + System.currentTimeMillis() + "] " + label;
3255
StringBuilder sb = new StringBuilder(prefix);

0 commit comments

Comments
 (0)