Skip to content

Commit 8a32daa

Browse files
committed
Support configuring metric, shared data, and shared queue handlers on the plugin.
Signed-off-by: Hiram Chirino <hiram@hiramchirino.com>
1 parent 17e3039 commit 8a32daa

File tree

15 files changed

+291
-124
lines changed

15 files changed

+291
-124
lines changed

proxy-wasm-java-host/src/main/java/io/roastedroot/proxywasm/ABI.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,18 +1598,18 @@ int proxyGetSharedData(
15981598
}
15991599

16001600
try {
1601-
if (value.data.length != 0) {
1602-
int addr = malloc(value.data.length);
1603-
putMemory(addr, value.data);
1601+
if (value.data().length != 0) {
1602+
int addr = malloc(value.data().length);
1603+
putMemory(addr, value.data());
16041604
putUint32(returnValueData, addr);
16051605
} else {
16061606
putUint32(returnValueData, 0);
16071607
}
1608-
putUint32(returnValueSize, value.data.length);
1608+
putUint32(returnValueSize, value.data().length);
16091609
} catch (WasmException e) {
16101610
throw new WasmException(WasmResult.INVALID_MEMORY_ACCESS);
16111611
}
1612-
putUint32(returnCas, value.cas);
1612+
putUint32(returnCas, value.cas());
16131613
return WasmResult.OK.getValue();
16141614

16151615
} catch (WasmException e) {

proxy-wasm-java-host/src/main/java/io/roastedroot/proxywasm/LogHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
public interface LogHandler {
44

5+
LogHandler DEFAULT = new LogHandler() {};
6+
57
default void log(LogLevel level, String message) throws WasmException {}
68

79
default LogLevel getLogLevel() throws WasmException {

proxy-wasm-java-host/src/main/java/io/roastedroot/proxywasm/MetricsHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
public interface MetricsHandler {
44

5+
MetricsHandler DEFAULT = new MetricsHandler() {};
6+
57
default int defineMetric(MetricType metricType, String name) throws WasmException {
68
throw new WasmException(WasmResult.UNIMPLEMENTED);
79
}
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
package io.roastedroot.proxywasm;
22

33
public class SharedData {
4-
public byte[] data;
5-
public int cas;
4+
private final byte[] data;
5+
private final int cas;
66

77
public SharedData(byte[] data, int cas) {
88
this.data = data;
99
this.cas = cas;
1010
}
11+
12+
public byte[] data() {
13+
return data;
14+
}
15+
16+
public int cas() {
17+
return cas;
18+
}
1119
}

proxy-wasm-java-host/src/main/java/io/roastedroot/proxywasm/SharedDataHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
public interface SharedDataHandler {
44

5+
SharedDataHandler DEFAULT = new SharedDataHandler() {};
6+
57
default SharedData getSharedData(String key) throws WasmException {
68
throw new WasmException(WasmResult.UNIMPLEMENTED);
79
}

proxy-wasm-java-host/src/main/java/io/roastedroot/proxywasm/SharedQueueHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
public interface SharedQueueHandler {
44

5+
SharedQueueHandler DEFAULT = new SharedQueueHandler() {};
6+
57
default int registerSharedQueue(QueueName name) throws WasmException {
68
throw new WasmException(WasmResult.UNIMPLEMENTED);
79
}

proxy-wasm-java-host/src/main/java/io/roastedroot/proxywasm/plugin/Logger.java

Lines changed: 0 additions & 10 deletions
This file was deleted.

proxy-wasm-java-host/src/main/java/io/roastedroot/proxywasm/plugin/Metric.java

Lines changed: 0 additions & 33 deletions
This file was deleted.

proxy-wasm-java-host/src/main/java/io/roastedroot/proxywasm/plugin/Plugin.java

Lines changed: 51 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,16 @@
1515
import io.roastedroot.proxywasm.ChainedHandler;
1616
import io.roastedroot.proxywasm.ForeignFunction;
1717
import io.roastedroot.proxywasm.Handler;
18+
import io.roastedroot.proxywasm.LogHandler;
1819
import io.roastedroot.proxywasm.LogLevel;
1920
import io.roastedroot.proxywasm.MetricType;
21+
import io.roastedroot.proxywasm.MetricsHandler;
2022
import io.roastedroot.proxywasm.ProxyMap;
2123
import io.roastedroot.proxywasm.ProxyWasm;
2224
import io.roastedroot.proxywasm.QueueName;
2325
import io.roastedroot.proxywasm.SharedData;
26+
import io.roastedroot.proxywasm.SharedDataHandler;
27+
import io.roastedroot.proxywasm.SharedQueueHandler;
2428
import io.roastedroot.proxywasm.StartException;
2529
import io.roastedroot.proxywasm.WasmException;
2630
import io.roastedroot.proxywasm.WasmResult;
@@ -41,6 +45,10 @@ public final class Plugin {
4145
private final boolean shared;
4246
private final String name;
4347

48+
private final MetricsHandler metricsHandler;
49+
private final SharedQueueHandler sharedQueueHandler;
50+
private final SharedDataHandler sharedDataHandler;
51+
4452
private Plugin(Builder builder, ProxyWasm proxyWasm) throws StartException {
4553
Objects.requireNonNull(proxyWasm);
4654
this.name = Objects.requireNonNullElse(builder.name, "default");
@@ -49,9 +57,16 @@ private Plugin(Builder builder, ProxyWasm proxyWasm) throws StartException {
4957
this.upstreams = builder.upstreams;
5058
this.strictUpstreams = builder.strictUpstreams;
5159
this.minTickPeriodMilliseconds = builder.minTickPeriodMilliseconds;
52-
this.logger = builder.logger;
5360
this.vmConfig = builder.vmConfig;
5461
this.pluginConfig = builder.pluginConfig;
62+
this.logger = Objects.requireNonNullElse(builder.logger, LogHandler.DEFAULT);
63+
;
64+
this.metricsHandler =
65+
Objects.requireNonNullElse(builder.metricsHandler, MetricsHandler.DEFAULT);
66+
this.sharedQueueHandler =
67+
Objects.requireNonNullElse(builder.sharedQueueHandler, SharedQueueHandler.DEFAULT);
68+
this.sharedDataHandler =
69+
Objects.requireNonNullElse(builder.sharedDataHandler, SharedDataHandler.DEFAULT);
5570

5671
this.wasm = proxyWasm;
5772
this.wasm.setPluginHandler(new HandlerImpl());
@@ -86,7 +101,7 @@ public void setServerAdaptor(ServerAdaptor serverAdaptor) {
86101
this.serverAdaptor = serverAdaptor;
87102
}
88103

89-
public Logger logger() {
104+
public LogHandler logger() {
90105
return logger;
91106
}
92107

@@ -121,9 +136,12 @@ public static class Builder implements Cloneable {
121136
private HashMap<String, String> upstreams;
122137
private boolean strictUpstreams;
123138
private int minTickPeriodMilliseconds;
124-
private Logger logger;
139+
private LogHandler logger;
125140
private byte[] vmConfig;
126141
private byte[] pluginConfig;
142+
private MetricsHandler metricsHandler;
143+
private SharedQueueHandler sharedQueueHandler;
144+
private SharedDataHandler sharedDataHandler;
127145

128146
public Plugin.Builder withName(String name) {
129147
this.name = name;
@@ -150,11 +168,26 @@ public Builder withMinTickPeriodMilliseconds(int minTickPeriodMilliseconds) {
150168
return this;
151169
}
152170

153-
public Builder withLogger(Logger logger) {
171+
public Builder withLogger(LogHandler logger) {
154172
this.logger = logger;
155173
return this;
156174
}
157175

176+
public Builder withMetricsHandler(MetricsHandler metricsHandler) {
177+
this.metricsHandler = metricsHandler;
178+
return this;
179+
}
180+
181+
public Builder withSharedQueueHandler(SharedQueueHandler sharedQueueHandler) {
182+
this.sharedQueueHandler = sharedQueueHandler;
183+
return this;
184+
}
185+
186+
public Builder withSharedDataHandler(SharedDataHandler sharedDataHandler) {
187+
this.sharedDataHandler = sharedDataHandler;
188+
return this;
189+
}
190+
158191
public Plugin.Builder withShared(boolean shared) {
159192
this.shared = shared;
160193
return this;
@@ -202,7 +235,7 @@ public Plugin build(ProxyWasm proxyWasm) throws StartException {
202235
}
203236
}
204237

205-
public Logger logger;
238+
public LogHandler logger;
206239
static final boolean DEBUG = "true".equals(System.getenv("DEBUG"));
207240
byte[] vmConfig;
208241
byte[] pluginConfig;
@@ -214,26 +247,9 @@ public Plugin build(ProxyWasm proxyWasm) throws StartException {
214247
private int tickPeriodMilliseconds;
215248
private Runnable cancelTick;
216249
HashMap<String, ForeignFunction> foreignFunctions;
217-
private final AtomicInteger lastMetricId = new AtomicInteger(0);
218-
private HashMap<Integer, io.roastedroot.proxywasm.plugin.Metric> metrics = new HashMap<>();
219-
private HashMap<String, io.roastedroot.proxywasm.plugin.Metric> metricsByName = new HashMap<>();
220250
private byte[] funcCallData = new byte[0];
221251
private final HashMap<List<String>, byte[]> properties = new HashMap<>();
222252

223-
public static class Metric {
224-
225-
public final int id;
226-
public final MetricType type;
227-
public final String name;
228-
public long value;
229-
230-
public Metric(int id, MetricType type, String name) {
231-
this.id = id;
232-
this.type = type;
233-
this.name = name;
234-
}
235-
}
236-
237253
class HandlerImpl extends ChainedHandler {
238254

239255
@Override
@@ -282,21 +298,12 @@ public WasmResult setProperty(List<String> path, byte[] value) {
282298

283299
@Override
284300
public void log(LogLevel level, String message) throws WasmException {
285-
Logger l = logger;
286-
if (l == null) {
287-
super.log(level, message);
288-
return;
289-
}
290-
l.log(level, message);
301+
logger.log(level, message);
291302
}
292303

293304
@Override
294305
public LogLevel getLogLevel() throws WasmException {
295-
Logger l = logger;
296-
if (l == null) {
297-
return super.getLogLevel();
298-
}
299-
return l.getLogLevel();
306+
return logger.getLogLevel();
300307
}
301308

302309
// //////////////////////////////////////////////////////////////////////
@@ -474,51 +481,27 @@ public int dispatchHttpCall(
474481

475482
@Override
476483
public int defineMetric(MetricType type, String name) throws WasmException {
477-
var id = lastMetricId.incrementAndGet();
478-
io.roastedroot.proxywasm.plugin.Metric value =
479-
new io.roastedroot.proxywasm.plugin.Metric(id, type, name);
480-
metrics.put(id, value);
481-
metricsByName.put(name, value);
482-
return id;
484+
return metricsHandler.defineMetric(type, name);
483485
}
484486

485487
@Override
486488
public long getMetric(int metricId) throws WasmException {
487-
var metric = metrics.get(metricId);
488-
if (metric == null) {
489-
throw new WasmException(WasmResult.NOT_FOUND);
490-
}
491-
return metric.value;
489+
return metricsHandler.getMetric(metricId);
492490
}
493491

494492
@Override
495493
public WasmResult incrementMetric(int metricId, long value) {
496-
var metric = metrics.get(metricId);
497-
if (metric == null) {
498-
return WasmResult.NOT_FOUND;
499-
}
500-
metric.value += value;
501-
return WasmResult.OK;
494+
return metricsHandler.incrementMetric(metricId, value);
502495
}
503496

504497
@Override
505498
public WasmResult recordMetric(int metricId, long value) {
506-
var metric = metrics.get(metricId);
507-
if (metric == null) {
508-
return WasmResult.NOT_FOUND;
509-
}
510-
metric.value = value;
511-
return WasmResult.OK;
499+
return metricsHandler.recordMetric(metricId, value);
512500
}
513501

514502
@Override
515503
public WasmResult removeMetric(int metricId) {
516-
io.roastedroot.proxywasm.plugin.Metric metric = metrics.remove(metricId);
517-
if (metric == null) {
518-
return WasmResult.NOT_FOUND;
519-
}
520-
metricsByName.remove(metric.name);
521-
return WasmResult.OK;
504+
return metricsHandler.removeMetric(metricId);
522505
}
523506

524507
// //////////////////////////////////////////////////////////////////////
@@ -539,12 +522,12 @@ public ForeignFunction getForeignFunction(String name) {
539522

540523
@Override
541524
public SharedData getSharedData(String key) throws WasmException {
542-
return next().getSharedData(key);
525+
return sharedDataHandler.getSharedData(key);
543526
}
544527

545528
@Override
546529
public WasmResult setSharedData(String key, byte[] value, int cas) {
547-
return next().setSharedData(key, value, cas);
530+
return sharedDataHandler.setSharedData(key, value, cas);
548531
}
549532

550533
// //////////////////////////////////////////////////////////////////////
@@ -553,22 +536,22 @@ public WasmResult setSharedData(String key, byte[] value, int cas) {
553536

554537
@Override
555538
public int registerSharedQueue(QueueName queueName) throws WasmException {
556-
return next().registerSharedQueue(queueName);
539+
return sharedQueueHandler.registerSharedQueue(queueName);
557540
}
558541

559542
@Override
560543
public int resolveSharedQueue(QueueName queueName) throws WasmException {
561-
return next().resolveSharedQueue(queueName);
544+
return sharedQueueHandler.resolveSharedQueue(queueName);
562545
}
563546

564547
@Override
565548
public byte[] dequeueSharedQueue(int queueId) throws WasmException {
566-
return next().dequeueSharedQueue(queueId);
549+
return sharedQueueHandler.dequeueSharedQueue(queueId);
567550
}
568551

569552
@Override
570553
public WasmResult enqueueSharedQueue(int queueId, byte[] value) {
571-
return next().enqueueSharedQueue(queueId, value);
554+
return sharedQueueHandler.enqueueSharedQueue(queueId, value);
572555
}
573556
}
574557
}

0 commit comments

Comments
 (0)