pub struct SchemaLearnerConfig {
pub max_schemas: usize,
pub min_samples_for_validation: u32,
pub max_nesting_depth: usize,
pub max_fields_per_schema: usize,
pub string_length_tolerance: f64,
pub number_value_tolerance: f64,
pub required_field_threshold: f64,
}Expand description
Configuration for the schema learner.
§Security Considerations
The tolerance values (string_length_tolerance and number_value_tolerance) directly
impact the security posture of schema validation. These multipliers determine how much
deviation from learned baselines is permitted before a request is flagged as anomalous.
§Tolerance Trade-offs
- Lower values (1.0-1.5): Stricter validation, higher security, but may cause false positives if legitimate traffic has natural variance.
- Higher values (2.0+): More permissive, fewer false positives, but allows attackers more room to inject oversized payloads or extreme values.
§Recommendations
- Start with default tolerance (1.5) and monitor for false positives
- For high-security APIs: consider 1.2-1.3
- For APIs with high variance: consider 1.5-2.0
- Never set below 1.0 (would reject valid baseline data)
§Example
use synapse_pingora::profiler::SchemaLearnerConfig;
// Stricter configuration for sensitive APIs
let config = SchemaLearnerConfig {
string_length_tolerance: 1.3, // 30% buffer above learned max
number_value_tolerance: 1.25, // 25% buffer above learned max
..Default::default()
};
// Validate config before use
config.validate().expect("Invalid configuration");Fields§
§max_schemas: usizeMaximum number of endpoint schemas to track.
When this limit is reached, the least recently used (LRU) schema is evicted.
min_samples_for_validation: u32Minimum samples required before validation is active.
Until an endpoint has been observed this many times, validation will not flag anomalies. This prevents false positives during the initial learning phase.
max_nesting_depth: usizeMaximum depth for nested object learning.
Prevents excessive memory usage from deeply nested JSON structures.
max_fields_per_schema: usizeMaximum fields per schema (memory protection).
Limits the number of fields tracked per endpoint to prevent memory exhaustion from APIs with dynamic or unbounded field sets.
string_length_tolerance: f64String length tolerance multiplier for validation.
When validating string fields, the maximum allowed length is:
learned_max_length * string_length_tolerance
§Security Impact
- Lower values (1.0-1.3): Catches buffer overflow attempts more aggressively but may flag legitimate variance as anomalous.
- Higher values (1.5-2.0): More permissive, reducing false positives but allowing larger payloads that could exploit vulnerabilities.
Default: 1.5 (50% buffer above learned maximum)
§Constraints
Must be >= 1.0. Values below 1.0 would reject strings that were seen in the baseline training data, causing immediate false positives.
number_value_tolerance: f64Number value tolerance multiplier for validation.
When validating numeric fields:
- Maximum allowed:
learned_max * number_value_tolerance - Minimum allowed:
learned_min / number_value_tolerance
§Security Impact
- Lower values (1.0-1.3): Catches integer overflow attempts and extreme value injection more aggressively.
- Higher values (1.5-2.0): More permissive for APIs with high numeric variance.
Default: 1.5 (50% buffer on max values, 33% reduction on min values)
§Constraints
Must be >= 1.0. Values below 1.0 would reject values that were seen in the baseline training data, causing immediate false positives.
required_field_threshold: f64Required field threshold (fields seen in > threshold% of requests).
Fields that appear in more than this percentage of observed requests are considered “required” and their absence will trigger a MissingField violation.
Default: 0.9 (90% - fields must appear in 90% of samples to be required)
Implementations§
Source§impl SchemaLearnerConfig
impl SchemaLearnerConfig
Sourcepub fn validate(&self) -> Result<(), ConfigValidationError>
pub fn validate(&self) -> Result<(), ConfigValidationError>
Validates the configuration, ensuring all values are within acceptable ranges.
§Errors
Returns ConfigValidationError if:
string_length_tolerance< 1.0number_value_tolerance< 1.0required_field_thresholdis not in range [0.0, 1.0]
§Example
use synapse_pingora::profiler::SchemaLearnerConfig;
let config = SchemaLearnerConfig {
string_length_tolerance: 0.5, // Invalid!
..Default::default()
};
assert!(config.validate().is_err());Trait Implementations§
Source§impl Clone for SchemaLearnerConfig
impl Clone for SchemaLearnerConfig
Source§fn clone(&self) -> SchemaLearnerConfig
fn clone(&self) -> SchemaLearnerConfig
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for SchemaLearnerConfig
impl Debug for SchemaLearnerConfig
Source§impl Default for SchemaLearnerConfig
impl Default for SchemaLearnerConfig
Source§impl<'de> Deserialize<'de> for SchemaLearnerConfig
impl<'de> Deserialize<'de> for SchemaLearnerConfig
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for SchemaLearnerConfig
impl RefUnwindSafe for SchemaLearnerConfig
impl Send for SchemaLearnerConfig
impl Sync for SchemaLearnerConfig
impl Unpin for SchemaLearnerConfig
impl UnsafeUnpin for SchemaLearnerConfig
impl UnwindSafe for SchemaLearnerConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more