--- name: metrics_drift kind: function lang: go domain: datascience version: "1.0.0" purity: pure signature: "func MetricsDrift(historical []int64, current int64, percentile float64) (drift float64, baseline int64)" description: "Calcula la deriva relativa de una medicion actual respecto a una linea base historica. La linea base se obtiene como el percentil indicado del historico. drift = (current - baseline) / baseline. Retorna drift=0, baseline=0 si el historico esta vacio o la linea base es cero." tags: [metrics, drift, percentile, statistics, monitoring, baseline, pendiente-usar] uses_functions: [percentile_int64_go_datascience] uses_types: [] returns: [] returns_optional: false error_type: "" imports: [sort] tested: true tests: - "historico vacio retorna drift 0 baseline 0" - "baseline cero retorna drift 0 baseline 0" - "drift positivo cuando current supera baseline" - "drift negativo cuando current es menor que baseline" test_file_path: "functions/datascience/metrics_drift_test.go" file_path: "functions/datascience/metrics_drift.go" params: - name: historical desc: "Ventana de mediciones previas en la misma unidad que current (ms, bytes, etc.). No necesita estar ordenada." - name: current desc: "Medicion actual a comparar contra la linea base historica." - name: percentile desc: "Percentil para calcular la linea base: 0.5 = mediana, 0.95 = p95. Rango [0.0, 1.0]." output: "drift es la desviacion relativa como fraccion (0.47 = +47% por encima de la linea base, -0.5 = 50% por debajo). baseline es el valor del percentil sobre el historico." --- ## Ejemplo ```go historical := []int64{100, 120, 95, 110, 105} // ms de respuesta previos current := int64(200) // ms de la ejecucion actual drift, baseline := MetricsDrift(historical, current, 0.5) // baseline ≈ 105 (mediana) // drift ≈ 0.905 (+90.5% sobre la mediana) // Con p95 como referencia de "worst case normal" _, p95 := MetricsDrift(historical, current, 0.95) // p95 = 120 ``` ## Notas Funcion pura. El historico se ordena internamente (copia defensiva) antes de calcular el percentil con `Percentile` de `percentile_int64_go_datascience`. No muta el slice de entrada. El drift puede ser negativo (mejora) o positivo (degradacion). El caller decide el umbral de alarma (ej. `drift > 0.5` = degradacion mayor al 50%). Util para el agente `fn-analizador` para comparar `duration_ms` de la ejecucion actual contra el historico de `executions` en `operations.db`.