Make elapsed-since-last an explicit param extractor, not a Duration-kind special case (ticket 038)
Previously a Value-role param with kind: Duration silently meant "elapsed time since the previous same-labeled event" instead of parsed text — the same MetricPrimitiveKind::Duration variant meant two unrelated things depending on which list (label_params vs value_param) referenced it. Add ParamDeclaration::elapsed_since_last, a third extraction source alongside capture_group/json_field_path: when set, the param is computed (via a new resolve_param_value, used uniformly for label_params and value_param) rather than text-extracted, and declare_param validates it's paired with kind: Duration. apply_metric_to_log no longer branches on (role, kind) — it dispatches purely on what each resolved param declares. Migrate existing profiles: migrate_duration_value_params converts any Duration-kind param referenced as a metric's value_param into the new extractor, and resolve_or_create_legacy_param (ticket 037's pre-existing migration) now carries the same meaning forward for pre-037 inline Value-role Duration matchers. Params.tsx offers "Elapsed since previous event" as its own Extraction option (hides the now-irrelevant message-match-regex/capture-group fields and forces kind to duration); Metrics.tsx labels such params accordingly wherever they're listed as label/value param choices. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XFUNZwCvz3kcod3352ZR2o
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
375aa38ef8
commit
5e30e02a78
+16
-1
@@ -22,6 +22,17 @@ pub struct ParamDeclaration {
|
||||
#[serde(default)]
|
||||
pub json_field_path: Option<String>,
|
||||
pub kind: MetricPrimitiveKind,
|
||||
/// A third extraction source, alongside `capture_group`/`json_field_path`: when set, this
|
||||
/// param's value is never parsed from text at all — it's computed as elapsed time since the
|
||||
/// previous event that produced the same label set (ticket 038). Takes precedence over
|
||||
/// `json_field_path`/`capture_group` when set, and `message_match_regex`/`capture_group`/
|
||||
/// `json_field_path` are simply unused in that case (`declare_param` doesn't validate them for
|
||||
/// this shape). Only meaningful paired with `kind == Duration`, since elapsed time is the only
|
||||
/// primitive this computation can produce — `declare_param` enforces that pairing.
|
||||
/// `#[serde(default)]` so params declared before this field existed keep parsing as plain
|
||||
/// regex/JSON-field extraction.
|
||||
#[serde(default)]
|
||||
pub elapsed_since_last: bool,
|
||||
}
|
||||
|
||||
/// Reads a value out of a JSON object by dot-separated field path (e.g. `"foo.bar"`), for
|
||||
@@ -56,7 +67,11 @@ pub enum MetricPrimitiveKind {
|
||||
String,
|
||||
Number,
|
||||
Timestamp,
|
||||
/// On a metric's Value param this is derived as elapsed time since the previous event (not parsed from text); otherwise it's a literal i64 millisecond count.
|
||||
/// A literal i64 millisecond count. Note this is unrelated to
|
||||
/// `ParamDeclaration::elapsed_since_last`, which is a separate, independent extraction source —
|
||||
/// a param using that source always parses/produces `Duration`, but not every `Duration`-kind
|
||||
/// param is computed that way (one can also just parse a literal duration out of captured text,
|
||||
/// like any other kind).
|
||||
Duration,
|
||||
/// A standalone param declared with this kind doesn't require (or use) a capture group: its value is
|
||||
/// simply whether `message_match_regex` matches the line, case-insensitively or per the regex's own
|
||||
|
||||
Reference in New Issue
Block a user