Package org.agrona.concurrent.errors
Class DistinctErrorLog
java.lang.Object
org.agrona.concurrent.errors.DistinctErrorLog
Distinct record of error observations. Rather than grow a record indefinitely when many errors of the same type
are logged, this log takes the approach of only recording distinct errors of the same type and stack trace
and keeping a count and time of observation so that the record only grows with new distinct observations.
The provided AtomicBuffer
can wrap a memory-mapped file so logging can be out of process. This provides
the benefit that if a crash or lockup occurs then the log can be read externally without loss of data.
Note: This class is threadsafe to be used from multiple logging threads.
The error records are recorded to the memory mapped buffer in the following format.
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |R| Length | +-+-------------------------------------------------------------+ |R| Observation Count | +-+-------------------------------------------------------------+ |R| Last Observation Timestamp | | | +-+-------------------------------------------------------------+ |R| First Observation Timestamp | | | +---------------------------------------------------------------+ | Encoded Error ... ... | +---------------------------------------------------------------+
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static final class
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final AtomicBuffer
private final Charset
private final EpochClock
private DistinctErrorLog.DistinctObservation[]
static final int
Offset within a record at which the encoded exception field begins.static final int
Offset within a record at which the first observation timestamp field begins.private static final DistinctErrorLog.DistinctObservation
static final int
Offset within a record at which the last observation timestamp field begins.static final int
Offset within a record at which the length field begins.private int
static final int
Offset within a record at which the observation count field begins.static final int
Alignment to be applied for record beginning. -
Constructor Summary
ConstructorsConstructorDescriptionDistinctErrorLog
(AtomicBuffer buffer, EpochClock clock) Create a new error log that will be written to a providedAtomicBuffer
.DistinctErrorLog
(AtomicBuffer buffer, EpochClock clock, Charset charset) Create a new error log that will be written to a providedAtomicBuffer
. -
Method Summary
Modifier and TypeMethodDescriptionbuffer()
Buffer the error log is written to.charset()
Charset
used to encode errors.private static boolean
equals
(StackTraceElement[] lhsStackTrace, StackTraceElement[] rhsStackTrace) private static boolean
private static DistinctErrorLog.DistinctObservation
find
(DistinctErrorLog.DistinctObservation[] existingObservations, Throwable observation) newObservation
(long timestampMs, Throwable observation) private static DistinctErrorLog.DistinctObservation[]
prepend
(DistinctErrorLog.DistinctObservation[] observations, DistinctErrorLog.DistinctObservation observation) boolean
Record an observation of an error.
-
Field Details
-
LENGTH_OFFSET
public static final int LENGTH_OFFSETOffset within a record at which the length field begins.- See Also:
-
OBSERVATION_COUNT_OFFSET
public static final int OBSERVATION_COUNT_OFFSETOffset within a record at which the observation count field begins.- See Also:
-
LAST_OBSERVATION_TIMESTAMP_OFFSET
public static final int LAST_OBSERVATION_TIMESTAMP_OFFSETOffset within a record at which the last observation timestamp field begins.- See Also:
-
FIRST_OBSERVATION_TIMESTAMP_OFFSET
public static final int FIRST_OBSERVATION_TIMESTAMP_OFFSETOffset within a record at which the first observation timestamp field begins.- See Also:
-
ENCODED_ERROR_OFFSET
public static final int ENCODED_ERROR_OFFSETOffset within a record at which the encoded exception field begins.- See Also:
-
RECORD_ALIGNMENT
public static final int RECORD_ALIGNMENTAlignment to be applied for record beginning.- See Also:
-
INSUFFICIENT_SPACE
-
nextOffset
private int nextOffset -
clock
-
buffer
-
charset
-
distinctObservations
-
-
Constructor Details
-
DistinctErrorLog
Create a new error log that will be written to a providedAtomicBuffer
.The
Charset
with default toStandardCharsets.UTF_8
for encoding the exceptions.- Parameters:
buffer
- into which the observation records are recorded.clock
- to be used for time stamping records.
-
DistinctErrorLog
Create a new error log that will be written to a providedAtomicBuffer
.- Parameters:
buffer
- into which the observation records are recorded.clock
- to be used for time stamping records.charset
- for encoding the errors.
-
-
Method Details
-
buffer
Buffer the error log is written to.- Returns:
- buffer the error log is written to.
-
charset
Charset
used to encode errors.- Returns:
- the
Charset
used to encode errors.
-
record
Record an observation of an error. If it is the first observation of this error type for a stack trace then a new entry will be created. For subsequent observations of the same error type and stack trace a counter and time of last observation will be updated.- Parameters:
observation
- to be logged as an error observation.- Returns:
- true if successfully logged otherwise false if insufficient space remaining in the log.
-
find
private static DistinctErrorLog.DistinctObservation find(DistinctErrorLog.DistinctObservation[] existingObservations, Throwable observation) -
equals
-
equals
-
newObservation
private DistinctErrorLog.DistinctObservation newObservation(long timestampMs, Throwable observation) -
prepend
private static DistinctErrorLog.DistinctObservation[] prepend(DistinctErrorLog.DistinctObservation[] observations, DistinctErrorLog.DistinctObservation observation)
-