namespace ZB.MOM.WW.CBDD.Core.Compression; /// /// Thread-safe counters for compression/decompression lifecycle events. /// public sealed class CompressionTelemetry { private long _checksumFailureCount; private long _compressedDocumentCount; private long _compressionAttempts; private long _compressionCpuTicks; private long _compressionFailures; private long _compressionInputBytes; private long _compressionOutputBytes; private long _compressionSkippedInsufficientSavings; private long _compressionSkippedTooSmall; private long _compressionSuccesses; private long _decompressionAttempts; private long _decompressionCpuTicks; private long _decompressionFailures; private long _decompressionOutputBytes; private long _decompressionSuccesses; private long _safetyLimitRejectionCount; /// /// Gets the number of attempted compression operations. /// public long CompressionAttempts => Interlocked.Read(ref _compressionAttempts); /// /// Gets the number of successful compression operations. /// public long CompressionSuccesses => Interlocked.Read(ref _compressionSuccesses); /// /// Gets the number of failed compression operations. /// public long CompressionFailures => Interlocked.Read(ref _compressionFailures); /// /// Gets the number of compression attempts skipped because payloads were too small. /// public long CompressionSkippedTooSmall => Interlocked.Read(ref _compressionSkippedTooSmall); /// /// Gets the number of compression attempts skipped due to insufficient savings. /// public long CompressionSkippedInsufficientSavings => Interlocked.Read(ref _compressionSkippedInsufficientSavings); /// /// Gets the number of attempted decompression operations. /// public long DecompressionAttempts => Interlocked.Read(ref _decompressionAttempts); /// /// Gets the number of successful decompression operations. /// public long DecompressionSuccesses => Interlocked.Read(ref _decompressionSuccesses); /// /// Gets the number of failed decompression operations. /// public long DecompressionFailures => Interlocked.Read(ref _decompressionFailures); /// /// Gets the total input bytes observed by compression attempts. /// public long CompressionInputBytes => Interlocked.Read(ref _compressionInputBytes); /// /// Gets the total output bytes produced by successful compression attempts. /// public long CompressionOutputBytes => Interlocked.Read(ref _compressionOutputBytes); /// /// Gets the total output bytes produced by successful decompression attempts. /// public long DecompressionOutputBytes => Interlocked.Read(ref _decompressionOutputBytes); /// /// Gets the number of documents stored in compressed form. /// public long CompressedDocumentCount => Interlocked.Read(ref _compressedDocumentCount); /// /// Gets the total CPU ticks spent on compression. /// public long CompressionCpuTicks => Interlocked.Read(ref _compressionCpuTicks); /// /// Gets the total CPU ticks spent on decompression. /// public long DecompressionCpuTicks => Interlocked.Read(ref _decompressionCpuTicks); /// /// Gets the number of checksum validation failures. /// public long ChecksumFailureCount => Interlocked.Read(ref _checksumFailureCount); /// /// Gets the number of decompression safety-limit rejections. /// public long SafetyLimitRejectionCount => Interlocked.Read(ref _safetyLimitRejectionCount); /// /// Records a compression attempt and its input byte size. /// /// The number of input bytes provided to compression. public void RecordCompressionAttempt(int inputBytes) { Interlocked.Increment(ref _compressionAttempts); Interlocked.Add(ref _compressionInputBytes, inputBytes); } /// /// Records a successful compression operation. /// /// The number of compressed bytes produced. public void RecordCompressionSuccess(int outputBytes) { Interlocked.Increment(ref _compressionSuccesses); Interlocked.Increment(ref _compressedDocumentCount); Interlocked.Add(ref _compressionOutputBytes, outputBytes); } /// /// Records a failed compression operation. /// public void RecordCompressionFailure() { Interlocked.Increment(ref _compressionFailures); } /// /// Records that compression was skipped because the payload was too small. /// public void RecordCompressionSkippedTooSmall() { Interlocked.Increment(ref _compressionSkippedTooSmall); } /// /// Records that compression was skipped due to insufficient expected savings. /// public void RecordCompressionSkippedInsufficientSavings() { Interlocked.Increment(ref _compressionSkippedInsufficientSavings); } /// /// Records a decompression attempt. /// public void RecordDecompressionAttempt() { Interlocked.Increment(ref _decompressionAttempts); } /// /// Adds CPU ticks spent performing compression. /// /// The CPU ticks to add. public void RecordCompressionCpuTicks(long ticks) { Interlocked.Add(ref _compressionCpuTicks, ticks); } /// /// Adds CPU ticks spent performing decompression. /// /// The CPU ticks to add. public void RecordDecompressionCpuTicks(long ticks) { Interlocked.Add(ref _decompressionCpuTicks, ticks); } /// /// Records a checksum validation failure. /// public void RecordChecksumFailure() { Interlocked.Increment(ref _checksumFailureCount); } /// /// Records a decompression rejection due to safety limits. /// public void RecordSafetyLimitRejection() { Interlocked.Increment(ref _safetyLimitRejectionCount); } /// /// Records a successful decompression operation. /// /// The number of decompressed bytes produced. public void RecordDecompressionSuccess(int outputBytes) { Interlocked.Increment(ref _decompressionSuccesses); Interlocked.Add(ref _decompressionOutputBytes, outputBytes); } /// /// Records a failed decompression operation. /// public void RecordDecompressionFailure() { Interlocked.Increment(ref _decompressionFailures); } /// /// Returns a point-in-time snapshot of compression telemetry. /// /// The aggregated compression statistics. public CompressionStats GetSnapshot() { return new CompressionStats { CompressedDocumentCount = CompressedDocumentCount, BytesBeforeCompression = CompressionInputBytes, BytesAfterCompression = CompressionOutputBytes, CompressionCpuTicks = CompressionCpuTicks, DecompressionCpuTicks = DecompressionCpuTicks, CompressionFailureCount = CompressionFailures, ChecksumFailureCount = ChecksumFailureCount, SafetyLimitRejectionCount = SafetyLimitRejectionCount }; } }