skippy-server 0.76.1

Embedded Skippy staged runtime server
use serde_json::json;
use skippy_protocol::{StageConfig, binary::StageWireMessage};

use crate::{
    kv_integration::{KvStageIntegration, ResidentActivationRecord},
    telemetry::Telemetry,
};

use super::binary_kv::{BinaryKvRecordResult, binary_message_kv_attrs};

pub(super) fn add_binary_activation_records(
    result: &mut BinaryKvRecordResult,
    config: &StageConfig,
    kv: &KvStageIntegration,
    telemetry: &Telemetry,
    session_id: &str,
    message: &StageWireMessage,
    records: &[ResidentActivationRecord],
) {
    for record in records {
        accumulate_record(result, record);
        let mut attrs =
            binary_message_kv_attrs(config, kv, session_id, message, record.token_count);
        attrs.insert("skippy.kv.decision".to_string(), json!("activation_record"));
        attrs.insert(
            "skippy.activation_cache.payload_bytes".to_string(),
            json!(record.payload_bytes),
        );
        attrs.insert(
            "skippy.activation_cache.entries".to_string(),
            json!(record.entries),
        );
        attrs.insert(
            "skippy.activation_cache.resident_bytes".to_string(),
            json!(record.resident_bytes),
        );
        telemetry.emit("stage.binary_kv_record_decision", attrs);
    }
}

fn accumulate_record(result: &mut BinaryKvRecordResult, record: &ResidentActivationRecord) {
    result.recorded_activations = result.recorded_activations.saturating_add(1);
    result.recorded_activation_bytes = result
        .recorded_activation_bytes
        .saturating_add(record.payload_bytes as u64);
    result.evicted_activation_entries = result
        .evicted_activation_entries
        .saturating_add(record.evicted_entries);
    result.evicted_activation_bytes = result
        .evicted_activation_bytes
        .saturating_add(record.evicted_bytes);
}

#[cfg(test)]
mod tests {
    use super::*;

    fn activation_record(token_count: usize, payload_bytes: usize) -> ResidentActivationRecord {
        ResidentActivationRecord {
            page_id: format!("page-{token_count}"),
            token_count,
            payload_bytes,
            evicted_entries: 1,
            evicted_bytes: 4,
            entries: 2,
            resident_bytes: 16,
        }
    }

    #[test]
    fn binary_activation_stats_include_each_record_identity() {
        let mut result = BinaryKvRecordResult::default();

        accumulate_record(&mut result, &activation_record(2214, 8_856));
        accumulate_record(&mut result, &activation_record(2176, 8_704));

        assert_eq!(result.recorded_activations, 2);
        assert_eq!(result.recorded_activation_bytes, 17_560);
        assert_eq!(result.evicted_activation_entries, 2);
        assert_eq!(result.evicted_activation_bytes, 8);
    }
}