Voltdb-procedure¶
The emitter voltdb-procedure invokes VoltDB stored procedure. It employs at-least-once delivery guarantees.
For each event it will synchronously or asynchronously invoke stored procedure passing event data as arguments. When using
the Java API the argument to the sink is a VoltRequest object that contains:
- parameters: an array of Object-s that correspond to stored procedure arguments. For example, to invoke a
stored procedure that has public long run(long id, int anotherId, String someString) the Object[] should
contain Long, Integer and String or compatible types as defined in the VoltDB
documentation.
- procedureName: name of the stored procedure to run for this specific event.
A call that fails because the connection was lost, the call timed out, the response was lost, the server is
unavailable for a reason other than a pause, or the client could not send it is retried with exponential
backoff. The number of retries and the delays are set by the retry configuration nested within the client
configuration. A synchronous call (asyncCall: false) waits on the worker during the backoff. A call that
VoltDB rejects, or that fails in a way a delay cannot fix, is not retried.
The voltdb-procedure operator requires VoltDBResource to be configured either in yaml or in java, see examples.
// if resource is configured in yaml
voltStreamBuilder.configureResource("primary-cluster", VoltDBResourceConfigBuilder.class);
// or
voltStreamBuilder.configureResource("primary-cluster",
VoltDBResourceConfigBuilder.class,
new Consumer<VoltDBResourceConfigBuilder>() {
@Override
public void consume(VoltDBResourceConfigBuilder configurator) {
configurator
.addToServers("localhost", 12122)
.withClientBuilder(vcb -> builder -> {
builder.withMaxOutstandingTransactions(42000);
builder.withMaxTransactionsPerSecond(23);
builder.withRequestTimeout(Duration.ofSeconds(5));
builder.withAuthBuilder(authBuilder -> authBuilder
.withUsername("admin")
.withPassword("admin123"));
builder.withSslBuilder(sslBuilder -> sslBuilder
.withTrustStoreFile("c:/Users32/trust.me")
.withTrustStorePassword("got2have"));
builder.withRetryBuilder(retryBuilder -> retryBuilder
.withRetries(4)
.withBackoffDelay(Duration.ofSeconds(2))
.withMaxBackoffDelay(Duration.ofSeconds(11)));
})
}
});
voltStreamBuilder
.consumeFromSource(...)
.terminateWithEmitter(VoltProcedureEmitterConfig.<Event, EnhancedEvent>builder()
.withClientReferenceName("primary-cluster")
.withExceptionHandler(exceptionHandler)
.withRequestMapper(event -> new Object[] { event.id() })
.withComputeFunction((event, result) -> {
if (result != null && result.advanceRow()) {
return new EnhancedEvent(event.id(), result.getString("name"));
}
return null;
})
)
.emit(VoltProcedureTrigger.onEachResponse)
...
public record EnhancedEvent(int id, String name) {}
resources:
- name: primary-cluster
voltdb-client:
servers: localhost:12122
client:
maxOutstandingTransactions: 42000
maxTransactionsPerSecond: 23
requestTimeout: PT5S
auth:
username: admin
password: admin123
ssl:
trustStoreFile: c:/Users32/trust.me
trustStorePassword: got2have
retry:
retries: 4
backoffDelay: 2s
maxBackoffDelay: 11s
emitter:
voltdb-procedure:
voltClientResource: primary-cluster
requestMapper: "com.example.Event::toRequest"
computeFunction: "com.example.Event::toResult"
triggers:
- trigger: org.voltdb.stream.plugin.volt.api.VoltProcedureTrigger#onEachResponse
...
Java dependency management¶
Add this declaration to your dependency management system to access the configuration DSL for this plugin in Java.
<dependency>
<groupId>org.voltdb</groupId>
<artifactId>volt-stream-plugin-volt-api</artifactId>
<version>1.8.7</version>
</dependency>
implementation group: 'org.voltdb', name: 'volt-stream-plugin-volt-api', version: '1.8.7'
Properties¶
requestMapper¶
Maps the input event to a VoltProcedureRequest.
Java: .withRequestMapper(order -> VoltProcedureRequest.createWithParameters( "InsertOrder", order.id(), order.amount()))
YAML — the JS function may return a plain JS object matching VoltProcedureRequest's shape: requestMapper: | function process(order) { return { procedureName: "InsertOrder", parameters: [order.id, order.amount] }; }
If omitted, a default mapper accepts either a VoltProcedureRequest directly
or a Map with 'procedureName' and 'parameters' entries.
Type: object
computeFunction¶
The function computes result event for next operator in pipeline Required.
Type: object
asyncCall¶
Synchronously/asynchronously call to VoltDB. By default procedures are executed asynchronously.
Type: boolean
Default value: true
voltClientResource¶
Client resource reference to be used when connecting to VoltDb cluster Required.
Type: object
exceptionHandler¶
A custom exception handler enabling interception of all errors related to this processor.
Type: object
Available Triggers¶
org.voltdb.stream.api.pipeline.emitter.ExceptionTrigger.onError¶
When used, an emitter will create a sub stream of all events that were consumed.
org.voltdb.stream.plugin.volt.api.VoltProcedureTrigger.onEachResponse¶
Triggered on each response from VoltDB.
JSON Schema¶
You can validate or explore the configuration using its JSON Schema.
Metrics¶
Volt metrics¶
Metric enum: org.voltdb.stream.plugin.volt.metrics.VoltMetric
| Prometheus name | Type | Description |
|---|---|---|
voltsp_volt_affinity_reads_total |
counter |
Number of VoltDB affinity reads. |
voltsp_volt_affinity_writes_total |
counter |
Number of VoltDB affinity writes. |
voltsp_volt_procedure_bytes_read_bytes |
counter |
Number of bytes read by the VoltDB client. |
voltsp_volt_procedure_bytes_written_bytes |
counter |
Number of bytes written by the VoltDB client. |
voltsp_volt_procedure_invocation_aborts_total |
counter |
Number of VoltDB procedure invocation aborts. |
voltsp_volt_procedure_invocation_completed_total |
counter |
Number of completed VoltDB procedure invocations. |
voltsp_volt_procedure_invocation_errors_total |
counter |
Number of VoltDB procedure invocation errors. |
voltsp_volt_procedure_invocation_retry_total |
counter |
Number of VoltDB procedure invocation retries. |
voltsp_volt_procedure_invocation_timeouts_total |
counter |
Number of VoltDB procedure invocation timeouts. |
voltsp_volt_roundrobin_reads_total |
counter |
Number of VoltDB round-robin reads. |
voltsp_volt_roundrobin_writes_total |
counter |
Number of VoltDB round-robin writes. |
voltsp_volt_procedure_invocation_latency_seconds |
histogram |
VoltDB procedure invocation latency. |
voltsp_volt_sink_info |
info |
Metadata describing a VoltDB sink. |
Volt tags¶
Tag enum: org.voltdb.stream.plugin.volt.metrics.VoltTag
Metrics reported by this component may include these tags. Not every metric includes every tag; tags are present only when they are relevant to the measurement.
| Tag | Description |
|---|---|
connection_id |
VoltDB client connection id. |
partition_id |
VoltDB partition id. |
procedure_name |
VoltDB procedure name. |
table_name |
VoltDB table name. |
volt_batch_size |
Configured VoltDB batch size. |