Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions bd-log-matcher/src/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,7 @@
//! ]);
//! ```

use base_log_matcher::int_value_match::Int_value_match_type;
use base_log_matcher::string_value_match::String_value_match_type;
use base_log_matcher::{IsSetMatch, Operator, tag_match};
use base_log_matcher::tag_match;
use bd_proto::protos::log_matcher::log_matcher::LogMatcher;
use bd_proto::protos::log_matcher::log_matcher::log_matcher::{
BaseLogMatcher,
Expand All @@ -32,8 +30,12 @@ use bd_proto::protos::log_matcher::log_matcher::log_matcher::{
base_log_matcher,
};
use bd_proto::protos::logging::payload::LogType;
use bd_proto::protos::value_matcher::value_matcher;
use tag_match::Value_match;
use tag_match::Value_match::IntValueMatch;
use value_matcher::int_value_match::Int_value_match_type;
use value_matcher::string_value_match::String_value_match_type;
use value_matcher::{IsSetMatch, Operator};

/// Creates a matcher that matches if all of the provided matchers match (logical AND).
///
Expand Down Expand Up @@ -199,7 +201,7 @@ pub fn log_level_equals(level: i32) -> LogMatcher {
matcher: Some(Matcher::BaseMatcher(BaseLogMatcher {
match_type: Some(TagMatch(base_log_matcher::TagMatch {
tag_key: "log_level".to_string(),
value_match: Some(IntValueMatch(base_log_matcher::IntValueMatch {
value_match: Some(IntValueMatch(value_matcher::IntValueMatch {
operator: Operator::OPERATOR_EQUALS.into(),
int_value_match_type: Some(Int_value_match_type::MatchValue(level)),
..Default::default()
Expand Down Expand Up @@ -227,7 +229,7 @@ pub fn log_type_equals(log_type: LogType) -> LogMatcher {
matcher: Some(Matcher::BaseMatcher(BaseLogMatcher {
match_type: Some(TagMatch(base_log_matcher::TagMatch {
tag_key: "log_type".to_string(),
value_match: Some(IntValueMatch(base_log_matcher::IntValueMatch {
value_match: Some(IntValueMatch(value_matcher::IntValueMatch {
operator: Operator::OPERATOR_EQUALS.into(),
int_value_match_type: Some(Int_value_match_type::MatchValue(log_type as i32)),
..Default::default()
Expand Down Expand Up @@ -276,7 +278,7 @@ fn log_field_matcher(field: &str, value: &str, operator: Operator) -> LogMatcher
match_type: Some(TagMatch(base_log_matcher::TagMatch {
tag_key: field.to_string(),
value_match: Some(Value_match::StringValueMatch(
base_log_matcher::StringValueMatch {
value_matcher::StringValueMatch {
operator: operator.into(),
string_value_match_type: Some(String_value_match_type::MatchValue(value.to_string())),
..Default::default()
Expand All @@ -293,9 +295,9 @@ fn log_field_matcher(field: &str, value: &str, operator: Operator) -> LogMatcher
/// Creates a log field matcher that matches when a field is equal to the provided double value.
#[must_use]
fn log_field_double_matcher(key: &str, value: f64, operator: Operator) -> LogMatcher {
use base_log_matcher::DoubleValueMatch;
use base_log_matcher::Match_type::TagMatch;
use base_log_matcher::double_value_match::Double_value_match_type;
use value_matcher::DoubleValueMatch;
use value_matcher::double_value_match::Double_value_match_type;

LogMatcher {
matcher: Some(Matcher::BaseMatcher(BaseLogMatcher {
Expand All @@ -322,7 +324,7 @@ fn make_log_message_matcher(value: &str, operator: Operator) -> LogMatcher {
matcher: Some(Matcher::BaseMatcher(BaseLogMatcher {
match_type: Some(MessageMatch(base_log_matcher::MessageMatch {
string_value_match: protobuf::MessageField::from_option(Some(
base_log_matcher::StringValueMatch {
value_matcher::StringValueMatch {
operator: operator.into(),
string_value_match_type: Some(String_value_match_type::MatchValue(value.to_string())),
..Default::default()
Expand All @@ -345,7 +347,7 @@ fn make_log_tag_matcher(name: &str, value: &str) -> LogMatcher {
match_type: Some(TagMatch(base_log_matcher::TagMatch {
tag_key: name.to_string(),
value_match: Some(Value_match::StringValueMatch(
base_log_matcher::StringValueMatch {
value_matcher::StringValueMatch {
operator: Operator::OPERATOR_EQUALS.into(),
string_value_match_type: Some(String_value_match_type::MatchValue(value.to_string())),
..Default::default()
Expand Down
119 changes: 87 additions & 32 deletions bd-log-matcher/src/matcher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ mod legacy_matcher_test;

use crate::version;
use anyhow::{Result, anyhow};
use base_log_matcher::Match_type::{FeatureFlagMatch, MessageMatch, TagMatch};
use base_log_matcher::Operator;
use base_log_matcher::Match_type::{MessageMatch, StateMatch, TagMatch};
use base_log_matcher::tag_match::Value_match::{
DoubleValueMatch,
IntValueMatch,
Expand All @@ -37,14 +36,17 @@ use bd_proto::protos::config::v1::config::{
};
use bd_proto::protos::log_matcher::log_matcher;
use bd_proto::protos::logging::payload::LogType;
use log_matcher::LogMatcher;
use log_matcher::log_matcher::base_log_matcher::double_value_match::Double_value_match_type;
use log_matcher::log_matcher::base_log_matcher::int_value_match::Int_value_match_type;
use log_matcher::log_matcher::base_log_matcher::string_value_match::String_value_match_type;
use log_matcher::log_matcher::base_log_matcher::{
use bd_proto::protos::state::scope::StateScope;
use bd_proto::protos::value_matcher::value_matcher::double_value_match::Double_value_match_type;
use bd_proto::protos::value_matcher::value_matcher::int_value_match::Int_value_match_type;
use bd_proto::protos::value_matcher::value_matcher::string_value_match::String_value_match_type;
use bd_proto::protos::value_matcher::value_matcher::{
IntValueMatch as IntValueMatch_type,
Operator,
StringValueMatch as StringValueMatch_type,
};
use bd_state::Scope;
use log_matcher::LogMatcher;
use log_matcher::log_matcher::{BaseLogMatcher, Matcher, base_log_matcher};
use regex::Regex;
use std::borrow::Cow;
Expand Down Expand Up @@ -429,12 +431,12 @@ impl StringMatch {
}
}

/// Represents either the log message or the field key-value to match against.
/// Represents either the input type to match against.
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum InputType {
Message,
Field(String),
FeatureFlag(String),
State(Scope, String),
}

impl InputType {
Expand All @@ -447,9 +449,7 @@ impl InputType {
match self {
Self::Message => message.as_str().map(Cow::Borrowed),
Self::Field(field_key) => fields.field_value(field_key),
Self::FeatureFlag(flag_key) => state
.get(bd_state::Scope::FeatureFlag, flag_key)
.map(Cow::Borrowed),
Self::State(scope, flag_key) => state.get(*scope, flag_key).map(Cow::Borrowed),
}
}
}
Expand Down Expand Up @@ -598,26 +598,81 @@ impl Leaf {
transform_string_value_match(&message_match.string_value_match),
)?,
),
FeatureFlagMatch(feature_flag_match) => match feature_flag_match
.value_match
.as_ref()
.ok_or_else(|| anyhow!("missing feature_flag_match value_match"))?
{
base_log_matcher::feature_flag_match::Value_match::StringValueMatch(
string_value_match,
) => Self::StringValue(
InputType::FeatureFlag(feature_flag_match.flag_name.clone()),
StringMatch::new(
string_value_match
.operator
.enum_value()
.map_err(|_| anyhow!("unknown field or enum"))?,
transform_string_value_match(string_value_match),
)?,
),
base_log_matcher::feature_flag_match::Value_match::IsSetMatch(_) => {
Self::IsSetValue(InputType::FeatureFlag(feature_flag_match.flag_name.clone()))
},
StateMatch(state_match) => {
let state_key = state_match.state_key.clone();
let scope = match state_match.scope.enum_value_or_default() {
StateScope::FEATURE_FLAG => Scope::FeatureFlag,
StateScope::GLOBAL_STATE => Scope::GlobalState,
StateScope::UNSPECIFIED => {
// For now, we only support feature flags. Other scopes would need additional
// handling.
// We'll need to config version guard any new scopes.
return Err(anyhow!("Unsupported state scope"));
},
};

let input_type = InputType::State(scope, state_key);

// Handle the value match
match state_match
.state_value_match
.as_ref()
.ok_or_else(|| anyhow!("missing state_value_match"))?
.value_match
.as_ref()
.ok_or_else(|| anyhow!("missing state value_match"))?
{
bd_proto::protos::state::matcher::state_value_match::Value_match::StringValueMatch(
string_value_match,
) => Self::StringValue(
input_type,
StringMatch::new(
string_value_match
.operator
.enum_value()
.map_err(|_| anyhow!("unknown field or enum"))?,
transform_string_value_match(string_value_match),
)?,
),
bd_proto::protos::state::matcher::state_value_match::Value_match::IsSetMatch(_) => {
Self::IsSetValue(input_type)
},
bd_proto::protos::state::matcher::state_value_match::Value_match::IntValueMatch(
int_value_match,
) => Self::IntValue(
input_type,
IntMatch::new(
int_value_match
.operator
.enum_value()
.map_err(|_| anyhow!("unknown field or enum"))?,
transform_int_value_match(int_value_match),
)?,
),
bd_proto::protos::state::matcher::state_value_match::Value_match::DoubleValueMatch(
double_value_match,
) => Self::DoubleValue(
input_type,
DoubleMatch::new(
double_value_match
.operator
.enum_value()
.map_err(|_| anyhow!("unknown field or enum"))?,
match double_value_match
.double_value_match_type
.as_ref()
.unwrap_or(&Double_value_match_type::MatchValue(0.0))
{
Double_value_match_type::MatchValue(d) => {
ValueOrSavedFieldId::Value(NanEqualFloat(*d))
},
Double_value_match_type::SaveFieldId(s) => {
ValueOrSavedFieldId::SaveFieldId(s.clone())
},
},
)?,
),
}
},
TagMatch(tag_match) => match tag_match
.value_match
Expand Down
Loading
Loading