MetricPrimitiveKind gains Boolean, serialized as "boolean". A param declared with kind Boolean skips capture-group validation and, instead of being omitted when message_match_regex doesn't match, is present on every log line as true/false based purely on whether the regex matches (case-insensitively or per the regex's own flags). Params.tsx lets you pick boolean as a kind and disables the now-unused capture group input. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XFUNZwCvz3kcod3352ZR2o
73 lines
2.7 KiB
Rust
73 lines
2.7 KiB
Rust
use crate::metric_primitive::MetricPrimitive;
|
|
use crate::timestamp::Timestamp;
|
|
use serde::{Deserialize, Serialize};
|
|
use std::collections::BTreeMap;
|
|
|
|
#[allow(dead_code)]
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct RegexToMetricPrimitiveMatcher {
|
|
pub param_name: String,
|
|
pub capture_group: String,
|
|
pub kind: MetricPrimitiveKind,
|
|
/// Whether this param is a bucket label or its captured value (at most one Value-role param per metric); `#[serde(default)]` so profile files saved before this field existed still load as `Label`.
|
|
#[serde(default)]
|
|
pub role: ParamRole,
|
|
}
|
|
|
|
/// See [`RegexToMetricPrimitiveMatcher::role`].
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
|
|
#[serde(rename_all = "lowercase")]
|
|
pub enum ParamRole {
|
|
#[default]
|
|
Label,
|
|
Value,
|
|
}
|
|
|
|
/// `rename_all = "lowercase"` matches other `kind`-style enums, so JSON bodies use "string"/"number"/"timestamp".
|
|
#[allow(dead_code)]
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
|
|
#[serde(rename_all = "lowercase")]
|
|
pub enum MetricPrimitiveKind {
|
|
String,
|
|
Number,
|
|
Timestamp,
|
|
/// On a Value-role param this is derived as elapsed time since the previous event (not parsed from text); otherwise it's a literal i64 millisecond count.
|
|
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
|
|
/// flags — see `crate::engine::derive_log_params`. Unlike other kinds it's present as `true`/`false`
|
|
/// on every line rather than omitted when unmatched.
|
|
Boolean,
|
|
}
|
|
|
|
/// Value type paired with [`crate::index_key::IndexKey`] in the engine's primary index.
|
|
#[allow(dead_code)]
|
|
#[derive(Debug, Clone, Serialize)]
|
|
pub enum DataValue {
|
|
/// Paired with `IndexKey::IngestedLog`.
|
|
LogLiteral { text: String },
|
|
/// Paired with `IndexKey::ParamDeclaration`.
|
|
ParamDeclaration {
|
|
message_match_regex: String,
|
|
capture_group: String,
|
|
kind: MetricPrimitiveKind,
|
|
},
|
|
/// Paired with `IndexKey::MetricDeclaration`.
|
|
MetricDeclaration {
|
|
message_match_regex: String,
|
|
params: Vec<RegexToMetricPrimitiveMatcher>,
|
|
/// See `crate::engine::DeclareMetricRequest::matched_labels`.
|
|
matched_labels: Option<BTreeMap<String, String>>,
|
|
/// See `crate::engine::DeclareMetricRequest::unmatched_labels`.
|
|
unmatched_labels: Option<BTreeMap<String, String>>,
|
|
},
|
|
/// Paired with `IndexKey::Bucket`.
|
|
BucketValue {
|
|
values: Vec<(u64, Timestamp, MetricPrimitive)>,
|
|
},
|
|
/// Paired with `IndexKey::LastMetricEvent`.
|
|
LastEventTimestamp {
|
|
timestamp: Timestamp,
|
|
},
|
|
}
|