package com.ldbc.driver.runtime.metrics;
import com.ldbc.driver.runtime.metrics.sbe.MessageHeader;
import com.ldbc.driver.runtime.metrics.sbe.MetricsEvent;
import com.lmax.disruptor.EventFactory;
import uk.co.real_logic.sbe.codec.java.DirectBuffer;
import java.nio.ByteBuffer;
public class DisruptorSbeMetricsEvent {
// Simple Binary Encoding related
static final int MESSAGE_HEADER_SIZE;
static final int ACTING_BLOCK_LENGTH;
static final int SCHEMA_ID;
static final int ACTING_VERSION;
static final short MESSAGE_TEMPLATE_VERSION = 0;
// Event Type Codes
// * Submit operation result for its metrics to be collected
static final byte SUBMIT_OPERATION_RESULT = 1;
// * Request metrics summary
static final byte GET_WORKLOAD_STATUS = 2;
// * Request complete workload results
static final byte GET_WORKLOAD_RESULTS = 3;
static {
MetricsEvent metricsEvent = new MetricsEvent();
MessageHeader messageHeader = new MessageHeader();
DirectBuffer directBuffer = new DisruptorSbeMetricsEvent.MetricsCollectionEventFactory().newInstance();
messageHeader.wrap(directBuffer, 0, MESSAGE_TEMPLATE_VERSION)
.blockLength(metricsEvent.sbeBlockLength())
.templateId(metricsEvent.sbeTemplateId())
.schemaId(metricsEvent.sbeSchemaId())
.version(metricsEvent.sbeSchemaVersion());
MESSAGE_HEADER_SIZE = messageHeader.size();
ACTING_BLOCK_LENGTH = messageHeader.blockLength();
SCHEMA_ID = messageHeader.schemaId();
ACTING_VERSION = messageHeader.version();
}
public static class MetricsCollectionEventFactory implements EventFactory<DirectBuffer> {
private final MetricsEvent metricsEvent = new MetricsEvent();
private final MessageHeader messageHeader = new MessageHeader();
@Override
public DirectBuffer newInstance() {
final ByteBuffer byteBuffer = ByteBuffer.allocateDirect(64);
DirectBuffer directBuffer = new DirectBuffer(byteBuffer);
messageHeader.wrap(directBuffer, 0, MESSAGE_TEMPLATE_VERSION)
.blockLength(metricsEvent.sbeBlockLength())
.templateId(metricsEvent.sbeTemplateId())
.schemaId(metricsEvent.sbeSchemaId())
.version(metricsEvent.sbeSchemaVersion());
return directBuffer;
}
}
public static String toString(DirectBuffer event) {
final MetricsEvent metricsEvent = new MetricsEvent();
metricsEvent.wrapForDecode(event, MESSAGE_HEADER_SIZE, ACTING_BLOCK_LENGTH, ACTING_VERSION);
return "METRICS_EVENT.eventType(){" +
"eventType=" + metricsEvent.eventType() +
", operationType=" + metricsEvent.operationType() +
", scheduledStartTimeAsMilli=" + metricsEvent.scheduledStartTimeAsMilli() +
", actualStartTimeAsMilli=" + metricsEvent.actualStartTimeAsMilli() +
", runDurationAsNano=" + metricsEvent.runDurationAsNano() +
", resultCode=" + metricsEvent.resultCode() +
", originalStartTime=" + metricsEvent.originalStartTime() +
'}';
}
}