@Override protected long getRecordSpecificTimestamp(final IMonitoringRecord record) { return record.getLoggingTimestamp(); }
@Override public void serialize(final IMonitoringRecord record, final int id) throws IOException { this.requestBufferSpace(4 + 8 + record.getSize()); this.buffer.putInt(id); this.buffer.putLong(record.getLoggingTimestamp()); record.serialize(this.serializer); this.numOfEntries++; }
private StringBuilder appendSingleRecord(final IMonitoringRecord record, final StringBuilder builder) { builder.append(record.getClass().getName()); builder.append(';'); builder.append(record.getLoggingTimestamp()); builder.append(';'); builder.append(record.toString()); builder.append('\n'); return builder; }
private int encodeRecords(final Collection<IMonitoringRecord> records, final ByteBuffer buffer, final IRegistry<String> stringRegistry) { final int offsetBefore = buffer.position(); for (final IMonitoringRecord record : records) { // Since writeBytes does not contain the type name and the logging timestamp, // these two fields must be serialized separately final String typeName = record.getClass().getName(); final int typeNameId = stringRegistry.get(typeName); buffer.putInt(typeNameId); buffer.putLong(record.getLoggingTimestamp()); record.serialize(DefaultValueSerializer.create(buffer, stringRegistry)); } final int offsetAfter = buffer.position(); return (offsetAfter - offsetBefore); }
record.setLoggingTimestamp(records.getLong(2)); super.deliver(OUTPUT_PORT_NAME_RECORDS, record);
@SuppressWarnings("unchecked") @InputPort(name = StringBufferFilter.INPUT_PORT_NAME_EVENTS, description = "Receives incoming objects to be buffered and forwarded", eventTypes = { Object.class }) public final void inputEvent(final Object object) { if (object instanceof String) { super.deliver(StringBufferFilter.OUTPUT_PORT_NAME_RELAYED_EVENTS, this.kiekerHashMap.get((String) object)); } else if (object instanceof IMonitoringRecord) { final Object[] objects = ((IMonitoringRecord) object).toArray(); boolean stringBuffered = false; for (int i = 0; i < objects.length; i++) { if (objects[i] instanceof String) { objects[i] = this.kiekerHashMap.get((String) objects[i]); stringBuffered = true; } } if (stringBuffered) { try { final IMonitoringRecord newRecord = AbstractMonitoringRecord.createFromArray((Class<? extends IMonitoringRecord>) object.getClass(), objects); newRecord.setLoggingTimestamp(((IMonitoringRecord) object).getLoggingTimestamp()); super.deliver(StringBufferFilter.OUTPUT_PORT_NAME_RELAYED_EVENTS, newRecord); } catch (final MonitoringRecordException ex) { this.log.warn("Failed to recreate buffered monitoring record: " + object.toString(), ex); } } else { super.deliver(StringBufferFilter.OUTPUT_PORT_NAME_RELAYED_EVENTS, object); } } else { // simply forward the object super.deliver(StringBufferFilter.OUTPUT_PORT_NAME_RELAYED_EVENTS, object); } }
@Override public void writeMonitoringRecord(final IMonitoringRecord monitoringRecord) { monitoringRecord.registerStrings(this.registerStringsAdapter); final ByteBuffer recordBuffer = this.buffer; final int requiredBufferSize = SIZE_OF_ENVELOPE + 4 + 8 + monitoringRecord.getSize(); if (recordBuffer.capacity() < requiredBufferSize) { throw new IllegalStateException("Insufficient buffer capacity for string registry data"); } // register monitoringRecord class name final String recordClassName = monitoringRecord.getClass().getName(); this.writerRegistry.register(recordClassName); // Prepend envelope data recordBuffer.put(REGULAR_RECORD_ID); recordBuffer.putLong(this.writerRegistry.getId()); // serialized monitoringRecord recordBuffer.putInt(this.writerRegistry.getId(recordClassName)); recordBuffer.putLong(monitoringRecord.getLoggingTimestamp()); monitoringRecord.serialize(DefaultValueSerializer.create(recordBuffer, this.writeBytesAdapter)); this.publishBuffer(recordBuffer); }
record.initFromArray(AbstractMonitoringRecord.fromStringArrayToTypedArray(values, record.getValueTypes())); return record;
@Override public void writeMonitoringRecord(final IMonitoringRecord record) { this.printStream.println(record.getClass().getSimpleName() + ": " + record.toString()); }
types = (Class<?>[]) typesField.get(null); } else { types = clazz.newInstance().getValueTypes();
private List<IMonitoringRecord> decodeMonitoringRecords(final ByteBuffer buffer, final IRegistry<String> stringRegistry, final int endOffset) { final List<IMonitoringRecord> records = new ArrayList<IMonitoringRecord>(); int currentOffset = buffer.position(); final CachedRecordFactoryCatalog recordFactoryCatalog = this.cachedRecordFactoryCatalog; while (currentOffset < endOffset) { final int recordTypeId = buffer.getInt(); final String recordTypeName = stringRegistry.get(recordTypeId); final long loggingTimestamp = buffer.getLong(); final IRecordFactory<? extends IMonitoringRecord> recordFactory = recordFactoryCatalog.get(recordTypeName); final IMonitoringRecord record = recordFactory.create(DefaultValueDeserializer.create(buffer, stringRegistry)); record.setLoggingTimestamp(loggingTimestamp); records.add(record); currentOffset = buffer.position(); } // The record data must end exactly at the given end offset if (currentOffset != endOffset) { throw new InvalidFormatException("Invalid record data found, should have ended at offset " + endOffset + ", but ended at offset " + currentOffset + "."); } return records; }
private int encodeRecords(final Collection<IMonitoringRecord> records, final ByteBuffer buffer, final IWriterRegistry<String> writerRegistry) { final int offsetBefore = buffer.position(); for (final IMonitoringRecord record : records) { // Since writeBytes does not contain the type name and the logging timestamp, // these two fields must be serialized separately final String typeName = record.getClass().getName(); final int typeNameId = writerRegistry.getId(typeName); buffer.putInt(typeNameId); buffer.putLong(record.getLoggingTimestamp()); record.serialize(BinaryValueSerializer.create(buffer, writerRegistry)); } final int offsetAfter = buffer.position(); return (offsetAfter - offsetBefore); }
@Override public void writeMonitoringRecord(final IMonitoringRecord monitoringRecord) { final PooledFileChannel channel = this.fileWriterPool.getFileWriter(this.buffer); monitoringRecord.registerStrings(this.registerStringsAdapter); final ByteBuffer recordBuffer = this.buffer; if ((4 + 8 + monitoringRecord.getSize()) > recordBuffer.remaining()) { channel.flush(recordBuffer, LOG); } final String recordClassName = monitoringRecord.getClass().getName(); this.writerRegistry.register(recordClassName); recordBuffer.putInt(this.writerRegistry.getId(recordClassName)); recordBuffer.putLong(monitoringRecord.getLoggingTimestamp()); monitoringRecord.serialize(DefaultValueSerializer.create(recordBuffer, this.writeBytesAdapter)); if (this.flush) { channel.flush(recordBuffer, LOG); } }
@Override public void writeMonitoringRecord(final IMonitoringRecord record) { this.printStream.println(record.getClass().getSimpleName() + ": " + record.toString()); }
types = (Class<?>[]) typesField.get(null); } else { types = clazz.newInstance().getValueTypes();
/** * Provides an ordering of IMonitoringRecords by the loggingTimestamp. * Classes overriding the implementation should respect this ordering. (see #326) * * @param otherRecord * The record to be compared. * * @return -1 if this object is less than, +1 if it is greater than or 0 if it is equal to the specified record. */ @Override public int compareTo(final IMonitoringRecord otherRecord) { final long timedifference = this.loggingTimestamp - otherRecord.getLoggingTimestamp(); if (timedifference < 0L) { return -1; } else if (timedifference > 0L) { return 1; } else { // same timing // this should work except for rare hash collisions return this.hashCode() - otherRecord.hashCode(); } }
@Override public void writeMonitoringRecord(final IMonitoringRecord monitoringRecord) { final ByteBuffer buffer = this.recordBuffer; final int requiredBufferSize = 4 + 8 + monitoringRecord.getSize(); if (requiredBufferSize > buffer.remaining()) { WriterUtil.flushBuffer(buffer, this.monitoringRecordChannel, LOG); } final String recordClassName = monitoringRecord.getClass().getName(); this.serializer.putString(recordClassName); this.serializer.putLong(monitoringRecord.getLoggingTimestamp()); monitoringRecord.serialize(this.serializer); if (this.flush) { WriterUtil.flushBuffer(buffer, this.monitoringRecordChannel, LOG); } }
private void read(final ByteBuffer buffer) { final int clazzId = buffer.getInt(); final long loggingTimestamp = buffer.getLong(); try { // NOCS (Nested try-catch) // final IMonitoringRecord record = AbstractMonitoringRecord.createFromByteBuffer(clazzid, buffer, this.stringRegistry); final String recordClassName = this.stringRegistry.get(clazzId); final IRecordFactory<? extends IMonitoringRecord> recordFactory = this.cachedRecordFactoryCatalog.get(recordClassName); final IMonitoringRecord record = recordFactory.create(BinaryValueDeserializer.create(buffer, this.stringRegistry)); record.setLoggingTimestamp(loggingTimestamp); super.deliver(OUTPUT_PORT_NAME_RECORDS, record); } catch (final RecordInstantiationException ex) { this.logger.error("Failed to create record", ex); } }
@Override public void serialize(final IMonitoringRecord record, final int id) throws IOException { final String header = String.format("$%d;%d", id, record.getLoggingTimestamp()); this.buffer.put(header); record.serialize(this.serializer); this.buffer.put(LINE_SEPARATOR); this.buffer.flip(); try { while (this.buffer.hasRemaining()) { this.numOfBytes += this.outputChannel.write(this.charset.encode(this.buffer)); } this.numOfEntries++; this.buffer.clear(); if (this.flushLogFile) { this.serializedStream.flush(); } } catch (final IOException e) { LOGGER.error("Caught exception while writing to the channel.", e); WriterUtil.close(this.outputChannel, LOGGER); } }
private StringBuilder appendSingleRecord(final IMonitoringRecord record, final StringBuilder builder) { builder.append(record.getClass().getName()); builder.append(';'); builder.append(record.getLoggingTimestamp()); builder.append(';'); builder.append(record.toString()); builder.append('\n'); return builder; }