From 0398a9d28e13a39514483542c4ba92767ec4bf5b Mon Sep 17 00:00:00 2001 From: mdecimus <11444311+mdecimus@users.noreply.github.com> Date: Wed, 28 Jan 2026 18:59:00 +0100 Subject: [PATCH] Bootstrap from registry - part 5 --- Cargo.lock | 1 + crates/common/src/config/mailstore/scripts.rs | 18 - .../common/src/config/mailstore/spamfilter.rs | 2 +- crates/common/src/config/network.rs | 2 +- crates/common/src/config/telemetry.rs | 57 +- crates/common/src/enterprise/alerts.rs | 46 +- crates/common/src/enterprise/config.rs | 540 +- crates/common/src/enterprise/llm.rs | 37 +- crates/common/src/enterprise/mod.rs | 15 +- crates/common/src/expr/eval.rs | 41 +- crates/common/src/expr/functions/mod.rs | 12 + crates/common/src/expr/if_block.rs | 17 +- crates/common/src/expr/mod.rs | 3 +- crates/common/src/expr/tokenizer.rs | 14 +- crates/common/src/listener/acme/cache.rs | 28 +- crates/common/src/listener/acme/mod.rs | 24 +- crates/common/src/listener/blocked.rs | 2 +- crates/common/src/listener/tls.rs | 25 +- crates/common/src/manager/reload.rs | 5 +- crates/common/src/telemetry/metrics/otel.rs | 6 +- .../src/telemetry/metrics/prometheus.rs | 6 +- crates/common/src/telemetry/metrics/store.rs | 39 +- crates/common/src/telemetry/mod.rs | 2 +- crates/common/src/telemetry/tracers/otel.rs | 8 +- crates/common/src/telemetry/tracers/store.rs | 127 +- crates/registry/src/pickle.rs | 24 + crates/registry/src/schema/mod.rs | 4 +- crates/store/src/dispatch/registry.rs | 13 +- crates/trc/Cargo.toml | 1 + crates/trc/event-macro/src/lib.rs | 164 +- crates/trc/src/event/conv.rs | 2 +- crates/trc/src/event/description.rs | 1948 ---- crates/trc/src/event/enums.rs | 1224 +++ crates/trc/src/event/enums_impl.rs | 8329 +++++++++++++++++ crates/trc/src/event/level.rs | 550 +- crates/trc/src/event/metrics.rs | 235 - crates/trc/src/event/mod.rs | 126 +- crates/trc/src/ipc/channel.rs | 2 +- crates/trc/src/ipc/collector.rs | 33 +- crates/trc/src/ipc/metrics.rs | 331 +- crates/trc/src/ipc/subscriber.rs | 2 +- crates/trc/src/lib.rs | 921 +- crates/trc/src/macros.rs | 2 +- crates/trc/src/serializers/binary.rs | 1247 +-- crates/trc/src/serializers/json.rs | 46 +- crates/trc/src/serializers/text.rs | 82 +- crates/utils/src/config/utils.rs | 2 +- 47 files changed, 10171 insertions(+), 6194 deletions(-) delete mode 100644 crates/trc/src/event/description.rs create mode 100644 crates/trc/src/event/enums.rs create mode 100644 crates/trc/src/event/enums_impl.rs delete mode 100644 crates/trc/src/event/metrics.rs diff --git a/Cargo.lock b/Cargo.lock index 40d322ac..285c79f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8089,6 +8089,7 @@ dependencies = [ "base64 0.22.1", "compact_str", "event_macro", + "hashify", "mail-auth", "mail-parser", "parking_lot", diff --git a/crates/common/src/config/mailstore/scripts.rs b/crates/common/src/config/mailstore/scripts.rs index 84ca66ad..ee4d6912 100644 --- a/crates/common/src/config/mailstore/scripts.rs +++ b/crates/common/src/config/mailstore/scripts.rs @@ -188,24 +188,6 @@ impl Scripting { } } -impl Default for Scripting { - fn default() -> Self { - let script = SieveSystemInterpreter::default(); - - Scripting { - untrusted_compiler: Compiler::new(), - untrusted_runtime: Runtime::new(), - trusted_runtime: Runtime::new(), - from_addr: IfBlock::new_default(script.ctx_default_from_address()), - from_name: IfBlock::new_default(script.ctx_default_from_name()), - return_path: IfBlock::new_default(script.ctx_default_return_path()), - sign: IfBlock::new_default(script.ctx_dkim_sign_domain()), - untrusted_scripts: AHashMap::new(), - trusted_scripts: AHashMap::new(), - } - } -} - impl Clone for Scripting { fn clone(&self) -> Self { Self { diff --git a/crates/common/src/config/mailstore/spamfilter.rs b/crates/common/src/config/mailstore/spamfilter.rs index 08034e53..9528203e 100644 --- a/crates/common/src/config/mailstore/spamfilter.rs +++ b/crates/common/src/config/mailstore/spamfilter.rs @@ -462,7 +462,7 @@ impl ClassifierConfig { w_params = FtrlParameters::parse(&model.parameters); i_params = Some(FtrlParameters::parse(&model.indicator_parameters)); } - structs::SpamClassifierModel::None => return None, + structs::SpamClassifierModel::Disabled => return None, } ClassifierConfig { diff --git a/crates/common/src/config/network.rs b/crates/common/src/config/network.rs index 70ce2dd0..cc7516a3 100644 --- a/crates/common/src/config/network.rs +++ b/crates/common/src/config/network.rs @@ -402,7 +402,7 @@ impl AsnGeoLookupConfig { index_asn_name: asn.index_asn_name.map(|v| v as usize), index_country: asn.index_country.map(|v| v as usize), }), - Asn::None => None, + Asn::Disabled => None, } } } diff --git a/crates/common/src/config/telemetry.rs b/crates/common/src/config/telemetry.rs index 99a32fcf..c24a78b1 100644 --- a/crates/common/src/config/telemetry.rs +++ b/crates/common/src/config/telemetry.rs @@ -24,7 +24,7 @@ use registry::schema::{ structs::{self, EventTracingLevel, MetricsPrometheus, Tracer, WebHook}, }; use std::{collections::HashMap, sync::Arc, time::Duration}; -use trc::{EventType, Level, TelemetryEvent, ipc::subscriber::Interests}; +use trc::{EventType, Level, MetricType, TelemetryEvent, ipc::subscriber::Interests}; #[derive(Debug)] pub struct TelemetrySubscriber { @@ -148,11 +148,10 @@ impl Telemetry { // Parse metrics let metrics = bp.setting_infallible::().await; - let todo = "implement"; - apply_events(vec![], metrics.events_policy, |event_type| { - let todo = "use metrics"; - if event_type.is_metric() { - telemetry.metrics.set(event_type); + apply_metrics(metrics.metrics, metrics.metrics_policy, |metric_type| { + let event_id = metric_type.event_id(); + if event_id != usize::MAX { + telemetry.metrics.set(event_id); } }); @@ -165,11 +164,7 @@ impl Tracers { // Parse custom logging levels let mut custom_levels = AHashMap::new(); for level in bp.list_infallible::().await { - let todo = "implement"; - custom_levels.insert( - EventType::Acme(trc::AcmeEvent::AuthCompleted), - level.object.level.into(), - ); + custom_levels.insert(level.object.event, level.object.level.into()); } // Parse tracers @@ -408,8 +403,7 @@ impl Tracers { }; // Parse disabled events - let todo = "implement"; - apply_events(vec![], events_policy, |event_type| { + apply_events(events, events_policy, |event_type| { if exclude_event != Some(event_type) { let event_level = custom_levels .get(&event_type) @@ -502,8 +496,7 @@ impl Tracers { }; // Parse webhook events - let todo = "implement"; - apply_events(vec![], hook.events_policy, |event_type| { + apply_events(hook.events, hook.events_policy, |event_type| { if event_type != EventType::Telemetry(TelemetryEvent::WebhookError) { tracer.interests.set(event_type); global_interests.set(event_type); @@ -569,7 +562,7 @@ impl Metrics { .map(|secret| STANDARD.encode(format!("{user}:{secret}"))) }), }), - MetricsPrometheus::None => None, + MetricsPrometheus::Disabled => None, }, otel: match metrics.open_telemetry { structs::MetricsOtel::Http(otel) => { @@ -640,7 +633,7 @@ impl Metrics { } } } - structs::MetricsOtel::None => None, + structs::MetricsOtel::Disabled => None, }, log_path: bp .list_infallible::() @@ -664,10 +657,6 @@ fn apply_events( policy: EventPolicy, mut apply_fn: impl FnMut(EventType), ) { - let event_names = EventType::variants() - .into_iter() - .map(|e| (e, e.name())) - .collect::>(); let mut exclude_events = AHashSet::new(); for event_type in event_types { @@ -679,7 +668,31 @@ fn apply_events( } if policy != EventPolicy::Include { - for (event_type, _) in event_names.iter() { + for event_type in EventType::variants() { + if !exclude_events.contains(event_type) { + apply_fn(*event_type); + } + } + } +} + +fn apply_metrics( + event_types: impl IntoIterator, + policy: EventPolicy, + mut apply_fn: impl FnMut(MetricType), +) { + let mut exclude_events = AHashSet::new(); + + for event_type in event_types { + if policy == EventPolicy::Include { + apply_fn(event_type); + } else { + exclude_events.insert(event_type); + } + } + + if policy != EventPolicy::Include { + for event_type in MetricType::variants() { if !exclude_events.contains(event_type) { apply_fn(*event_type); } diff --git a/crates/common/src/enterprise/alerts.rs b/crates/common/src/enterprise/alerts.rs index 11f7ce86..de3d86fd 100644 --- a/crates/common/src/enterprise/alerts.rs +++ b/crates/common/src/enterprise/alerts.rs @@ -8,6 +8,9 @@ * */ +use super::{AlertContent, AlertContentToken, AlertMethod}; +use crate::Server; +use crate::expr::functions::EmptyResolver; use mail_builder::{ MessageBuilder, headers::{ @@ -15,15 +18,9 @@ use mail_builder::{ address::{Address, EmailAddress}, }, }; -use registry::schema::enums::ExpressionVariable; -use trc::{Collector, MetricType, TOTAL_EVENT_COUNT, TelemetryEvent}; - -use super::{AlertContent, AlertContentToken, AlertMethod}; -use crate::{ - Server, - expr::{Variable, functions::ResolveVariable}, -}; +use registry::schema::prelude::Property; use std::fmt::Write; +use trc::{Collector, TelemetryEvent}; #[derive(Debug, PartialEq, Eq)] pub struct AlertMessage { @@ -32,8 +29,6 @@ pub struct AlertMessage { pub body: Vec, } -struct CollectorResolver; - impl Server { pub async fn process_alerts(&self) -> Option> { let alerts = &self.core.enterprise.as_ref()?.metrics_alerts; @@ -44,7 +39,13 @@ impl Server { for alert in alerts { if !self - .eval_expr(&alert.condition, &CollectorResolver, &alert.id, 0) + .eval_expr( + &alert.condition, + &EmptyResolver, + alert.id, + Property::Condition, + 0, + ) .await .unwrap_or(false) { @@ -108,24 +109,6 @@ impl Server { } } -impl ResolveVariable for CollectorResolver { - fn resolve_variable(&self, variable: ExpressionVariable) -> Variable<'_> { - if (variable as usize) < TOTAL_EVENT_COUNT { - Variable::Integer(Collector::read_event_metric(variable as usize) as i64) - } else if let Some(metric_type) = - MetricType::from_code(variable as u64 - TOTAL_EVENT_COUNT as u64) - { - Variable::Float(Collector::read_metric(metric_type)) - } else { - Variable::Integer(0) - } - } - - fn resolve_global(&self, _: &str) -> Variable<'_> { - Variable::Integer(0) - } -} - impl AlertContent { pub fn build(&self) -> String { let mut buf = String::with_capacity(self.len()); @@ -148,16 +131,13 @@ impl AlertContentToken { AlertContentToken::Metric(metric_type) => { let _ = write!(buf, "{}", Collector::read_metric(*metric_type)); } - AlertContentToken::Event(event_type) => { - let _ = write!(buf, "{}", Collector::read_event_metric(event_type.id())); - } } } fn len(&self) -> usize { match self { AlertContentToken::Text(s) => s.len(), - AlertContentToken::Metric(_) | AlertContentToken::Event(_) => 10, + AlertContentToken::Metric(_) => 10, } } } diff --git a/crates/common/src/enterprise/config.rs b/crates/common/src/enterprise/config.rs index 423d6215..46661e63 100644 --- a/crates/common/src/enterprise/config.rs +++ b/crates/common/src/enterprise/config.rs @@ -12,39 +12,36 @@ use super::{ AlertContent, AlertContentToken, AlertMethod, Enterprise, MetricAlert, MetricStore, SpamFilterLlmConfig, TraceStore, Undelete, license::LicenseKey, llm::AiApiConfig, }; -use crate::expr::{Expression, tokenizer::TokenMap}; +use crate::{enterprise::llm::ApiType, manager::bootstrap::Bootstrap}; use ahash::AHashMap; -use directory::{Type, backend::internal::manage::ManageDirectory}; -use std::{sync::Arc, time::Duration}; -use store::{Store, Stores}; -use trc::{EventType, MetricType, TOTAL_EVENT_COUNT}; -use utils::{ - config::{ - Config, ConfigKey, - cron::SimpleCron, - utils::{AsKey, ParseValue}, +use registry::{ + schema::{ + enums::AiModelType, + prelude::{Object, Property}, + structs::{ + self, AiModel, Alert, CalendarAlarm, CalendarScheduling, DataRetention, SpamLlm, + TelemetryHistory, + }, }, - template::Template, + types::id::Id, }; +use std::sync::Arc; +use store::Store; +use trc::MetricType; +use utils::template::Template; impl Enterprise { - pub async fn parse( - bp: &mut Bootstrap, - config_manager: &ConfigManager, - stores: &Stores, - data: &Store, - ) -> Option { - let server_hostname = config - .value("server.hostname") - .or_else(|| config.value("lookup.default.hostname"))?; + pub async fn parse(bp: &mut Bootstrap) -> Option { + let server_hostname = bp.hostname().to_string(); let mut update_license = None; - let license_result = match ( - config.value("enterprise.license-key"), - config.value("enterprise.api-key"), - ) { + let mut enterprise = bp.setting_infallible::().await; + let license_result = match (&enterprise.license_key, &enterprise.api_key) { (Some(license_key), maybe_api_key) => { - match (LicenseKey::new(license_key, server_hostname), maybe_api_key) { + match ( + LicenseKey::new(license_key, &server_hostname), + maybe_api_key, + ) { (Ok(license), Some(api_key)) if license.is_near_expiration() => Ok(license .try_renew(api_key) .await @@ -54,7 +51,7 @@ impl Enterprise { }) .unwrap_or(license)), (Ok(license), None) => Ok(license), - (Err(_), Some(api_key)) => LicenseKey::invalid(server_hostname) + (Err(_), Some(api_key)) => LicenseKey::invalid(&server_hostname) .try_renew(api_key) .await .map(|result| { @@ -64,7 +61,7 @@ impl Enterprise { (maybe_license, _) => maybe_license, } } - (None, Some(api_key)) => LicenseKey::invalid(server_hostname) + (None, Some(api_key)) => LicenseKey::invalid(&server_hostname) .try_renew(api_key) .await .map(|result| { @@ -80,24 +77,17 @@ impl Enterprise { let license = match license_result { Ok(license) => license, Err(err) => { - config.new_build_warning("enterprise.license-key", err.to_string()); + bp.build_warning(Object::Enterprise.singleton(), err.to_string()); return None; } }; // Update the license if a new one was obtained if let Some(license) = update_license { - config - .keys - .insert("enterprise.license-key".to_string(), license.clone()); - if let Err(err) = config_manager - .set( - [ConfigKey { - key: "enterprise.license-key".to_string(), - value: license.to_string(), - }], - true, - ) + enterprise.license_key = Some(license); + if let Err(err) = bp + .registry + .put(Object::Enterprise.singleton(), &enterprise) .await { trc::error!( @@ -107,13 +97,10 @@ impl Enterprise { } } - match data - .count_principals(None, Type::Individual.into(), None) - .await - { + match bp.registry.count(Object::Account).await { Ok(total) if total > license.accounts as u64 => { - config.new_build_warning( - "enterprise.license-key", + bp.build_warning( + Object::Enterprise.singleton(), format!( "License key is valid but only allows {} accounts, found {}.", license.accounts, total @@ -122,108 +109,145 @@ impl Enterprise { return None; } Err(e) => { - if !matches!(data, Store::None) { - config.new_build_error("enterprise.license-key", e.to_string()); - } + trc::error!( + e.caused_by(trc::location!()) + .details("Failed to count total individual principals") + ); return None; } _ => (), } - let trace_store = if config - .property_or_default("tracing.history.enable", "false") - .unwrap_or(false) - { - if let Some(store) = config - .value("tracing.history.store") - .and_then(|name| stores.stores.get(name)) - .cloned() - { - TraceStore { - retention: config - .property_or_default::>("tracing.history.retention", "30d") - .unwrap_or(Some(Duration::from_secs(30 * 24 * 60 * 60))), - store, - } - .into() - } else { - None + let telemetry = bp.setting_infallible::().await; + let dr = bp.setting_infallible::().await; + let todo = "map stores"; + let trace_store = if telemetry.enable_tracing_history { + TraceStore { + retention: dr.hold_traces_for.map(|d| d.into_inner()), + store: Store::None, } + .into() } else { None }; - let metrics_store = if config - .property_or_default("metrics.history.enable", "false") - .unwrap_or(false) - { - if let Some(store) = config - .value("metrics.history.store") - .and_then(|name| stores.stores.get(name)) - .cloned() - { - MetricStore { - retention: config - .property_or_default::>("metrics.history.retention", "90d") - .unwrap_or(Some(Duration::from_secs(90 * 24 * 60 * 60))), - store, - interval: config - .property_or_default::("metrics.history.interval", "0 * *") - .unwrap_or_else(|| SimpleCron::parse_value("0 * *").unwrap()), - } - .into() - } else { - None + let metrics_store = if telemetry.enable_metric_history { + MetricStore { + retention: dr.hold_metrics_for.map(|d| d.into_inner()), + store: Store::None, + interval: telemetry.metrics_collection_interval.into(), } + .into() } else { None }; // Parse AI APIs let mut ai_apis = AHashMap::new(); - for id in config.sub_keys("enterprise.ai", ".url") { - if let Some(api) = AiApiConfig::parse(config, &id) { - ai_apis.insert(id, api.into()); - } + let mut ai_apis_ids = AHashMap::new(); + for api in bp.list_infallible::().await { + let id = api.id.clone(); + let api = api.object; + let api = Arc::new(AiApiConfig { + id: api.name, + api_type: match api.class { + AiModelType::Chat => ApiType::ChatCompletion, + AiModelType::Text => ApiType::TextCompletion, + }, + url: api.url, + headers: api + .http_auth + .build_headers(api.http_headers, "application/json".into()) + .map_err(|err| { + bp.build_error(id, format!("Unable to build HTTP headers: {}", err)) + }) + .unwrap_or_default(), + model: api.model, + timeout: api.timeout.into_inner(), + tls_allow_invalid_certs: api.allow_invalid_certs, + default_temperature: api.temperature, + }); + ai_apis.insert(api.id.clone(), api.clone()); + ai_apis_ids.insert(id, api); } // Build the enterprise configuration let mut enterprise = Enterprise { license, - undelete: config - .property_or_default::>("storage.undelete.retention", "false") - .unwrap_or_default() - .map(|retention| Undelete { retention }), - logo_url: config.value("enterprise.logo-url").map(|s| s.to_string()), + undelete: dr.hold_deleted_for.map(|retention| Undelete { + retention: retention.into_inner(), + }), + logo_url: enterprise.logo_url, trace_store, metrics_store, - metrics_alerts: parse_metric_alerts(bp), - spam_filter_llm: SpamFilterLlmConfig::parse(config, &ai_apis), + metrics_alerts: Default::default(), + spam_filter_llm: SpamFilterLlmConfig::parse(bp, &ai_apis_ids).await, ai_apis, template_calendar_alarm: None, template_scheduling_email: None, template_scheduling_web: None, }; + // Parse metric alerts + for alert in bp.list_infallible::().await { + let id = alert.id; + let alert = alert.object; + + if !alert.enable { + continue; + } + let condition = bp.compile_expr(id, &alert.ctx_condition()).default; + let mut method = Vec::with_capacity(1); + if let structs::AlertEmail::Enabled(alert) = alert.email_alert { + method.push(AlertMethod::Email { + from_name: alert.from_name, + from_addr: alert.from_address, + to: alert.to, + subject: AlertContent::new(&alert.subject), + body: AlertContent::new(&alert.body), + }); + } + if let structs::AlertEvent::Enabled(alert) = alert.event_alert { + method.push(AlertMethod::Event { + message: alert.event_message.as_deref().map(AlertContent::new), + }); + } + + enterprise.metrics_alerts.push(MetricAlert { + id, + condition, + method, + }); + } + // Parse templates - for (key, value) in [ + let sched = bp.setting_infallible::().await; + let alarm = bp.setting_infallible::().await; + + for (template, value, object, property) in [ ( - "calendar.alarms.template", + alarm.template, &mut enterprise.template_calendar_alarm, + Object::CalendarAlarm.singleton(), + Property::Template, ), ( - "calendar.scheduling.template.email", + sched.email_template, &mut enterprise.template_scheduling_email, + Object::CalendarScheduling.singleton(), + Property::EmailTemplate, ), ( - "calendar.scheduling.template.web", + sched.http_rsvp_template, &mut enterprise.template_scheduling_web, + Object::CalendarScheduling.singleton(), + Property::HttpRsvpTemplate, ), ] { - if let Some(template) = config.value(key) { - match Template::parse(template) { + if let Some(template) = template { + match Template::parse(&template) { Ok(template) => *value = Some(template), Err(err) => { - config.new_build_error(key, format!("Invalid template: {err}")); + bp.invalid_property(object, property, format!("Invalid template: {err}")); } } } @@ -234,249 +258,95 @@ impl Enterprise { } impl SpamFilterLlmConfig { - pub fn parse(bp: &mut Bootstrap, models: &AHashMap>) -> Option { - if !config - .property_or_default::("spam-filter.llm.enable", "false") - .unwrap_or_default() - { - return None; - } - let model = config.value_require_non_empty("spam-filter.llm.model")?; - let model = if let Some(model) = models.get(model) { - model.clone() - } else { - let message = format!("Model {model:?} not found in AI API configuration"); - config.new_build_error("spam-filter.llm.model", message); - return None; - }; - - let llm = SpamFilterLlmConfig { - model, - temperature: config - .property_or_default("spam-filter.llm.temperature", "0.5") - .unwrap_or(0.5), - prompt: config - .value_require_non_empty("spam-filter.llm.prompt")? - .to_string(), - separator: config - .value_require_non_empty("spam-filter.llm.separator") - .unwrap_or_default() - .chars() - .next() - .unwrap_or(','), - index_category: config - .property("spam-filter.llm.index.category") - .unwrap_or_default(), - index_confidence: config.property("spam-filter.llm.index.confidence"), - index_explanation: config.property("spam-filter.llm.index.explanation"), - categories: config - .values("spam-filter.llm.categories") - .map(|(_, v)| v.trim().to_uppercase()) - .collect(), - confidence: config - .values("spam-filter.llm.confidence") - .map(|(_, v)| v.trim().to_uppercase()) - .collect(), - }; - - if llm.categories.is_empty() { - config.new_build_error("spam-filter.llm.categories", "No categories defined"); - return None; - } - if llm.index_confidence.is_some() && llm.confidence.is_empty() { - config.new_build_error( - "spam-filter.llm.confidence", - "Confidence index is defined but no confidence values are provided", - ); - return None; - } - - llm.into() - } -} - -pub fn parse_metric_alerts(bp: &mut Bootstrap) -> Vec { - let mut alerts = Vec::new(); - - for metric_id in config.sub_keys("metrics.alerts", ".enable") { - if let Some(alert) = parse_metric_alert(config, metric_id) { - alerts.push(alert); - } - } - - alerts -} - -fn parse_metric_alert(bp: &mut Bootstrap, id: String) -> Option { - if !config.property_or_default::(("metrics.alerts", id.as_str(), "enable"), "false")? { - return None; - } - - let mut alert = MetricAlert { - condition: Expression::try_parse( - config, - ("metrics.alerts", id.as_str(), "condition"), - &TokenMap::default().with_variables_map( - EventType::variants() - .into_iter() - .map(|e| (sanitize_metric_name(e.name()), e.id() as u32)) - .chain(MetricType::variants().iter().map(|m| { - ( - sanitize_metric_name(m.name()), - m.code() as u32 + TOTAL_EVENT_COUNT as u32, - ) - })), - ), - )?, - method: Vec::new(), - id, - }; - let id_str = alert.id.as_str(); - - if config - .property_or_default::(("metrics.alerts", id_str, "notify.event.enable"), "false") - .unwrap_or_default() - { - alert.method.push(AlertMethod::Event { - message: parse_alert_content( - ("metrics.alerts", id_str, "notify.event.message"), - config, - ), - }); - } - - if config - .property_or_default::(("metrics.alerts", id_str, "notify.email.enable"), "false") - .unwrap_or_default() - { - let from_addr = config - .value_require(("metrics.alerts", id_str, "notify.email.from-addr"))? - .trim() - .to_string(); - let from_name = config - .value(("metrics.alerts", id_str, "notify.email.from-name")) - .map(|s| s.to_string()); - let to = config - .values(("metrics.alerts", id_str, "notify.email.to")) - .filter_map(|(_, s)| { - if s.contains('@') { - s.trim().to_string().into() - } else { - None - } - }) - .collect::>(); - let subject = - parse_alert_content(("metrics.alerts", id_str, "notify.email.subject"), config)?; - let body = parse_alert_content(("metrics.alerts", id_str, "notify.email.body"), config)?; - - if !from_addr.contains('@') { - config.new_build_error( - ("metrics.alerts", id_str, "notify.email.from-addr"), - "Invalid from email address", - ); - } - if to.is_empty() { - config.new_build_error( - ("metrics.alerts", id_str, "notify.email.to"), - "Missing recipient address(es)", - ); - } - if subject.0.is_empty() { - config.new_build_error( - ("metrics.alerts", id_str, "notify.email.subject"), - "Missing email subject", - ); - } - if body.0.is_empty() { - config.new_build_error( - ("metrics.alerts", id_str, "notify.email.body"), - "Missing email body", - ); - } - - alert.method.push(AlertMethod::Email { - from_name, - from_addr, - to, - subject, - body, - }); - } - - if alert.method.is_empty() { - config.new_build_error( - ("metrics.alerts", id_str), - "No notification method enabled for alert", - ); - } - - alert.into() -} - -fn parse_alert_content(key: impl AsKey, bp: &mut Bootstrap) -> Option { - let mut tokens = Vec::new(); - let mut value = config.value(key)?.chars().peekable(); - let mut buf = String::new(); - - while let Some(ch) = value.next() { - if ch == '%' && value.peek() == Some(&'{') { - value.next(); - - let mut var_name = String::new(); - let mut found_curly = false; - - for ch in value.by_ref() { - if ch == '}' { - found_curly = true; - break; - } - var_name.push(ch); + pub async fn parse( + bp: &mut Bootstrap, + models: &AHashMap>, + ) -> Option { + match bp.setting_infallible::().await { + SpamLlm::Enable(llm) => { + let Some(model) = models.get(&llm.model).cloned() else { + bp.build_error( + Object::SpamLlm.singleton(), + format!("Model {:?} not found in AI API configuration", llm.model), + ); + return None; + }; + Some(SpamFilterLlmConfig { + model, + temperature: llm.temperature, + prompt: llm.prompt, + separator: llm.separator.chars().next().unwrap_or(','), + index_category: llm.response_pos_category as usize, + index_confidence: llm.response_pos_confidence.map(|v| v as usize), + index_explanation: llm.response_pos_explanation.map(|v| v as usize), + categories: llm + .categories + .iter() + .map(|v| v.trim().to_uppercase()) + .collect(), + confidence: llm + .confidence + .iter() + .map(|v| v.trim().to_uppercase()) + .collect(), + }) } + SpamLlm::Disable => None, + } + } +} - if found_curly && value.peek() == Some(&'%') { +impl AlertContent { + fn new(value: &str) -> Self { + let mut tokens = Vec::new(); + let mut value = value.chars().peekable(); + let mut buf = String::new(); + + while let Some(ch) = value.next() { + if ch == '%' && value.peek() == Some(&'{') { value.next(); - if let Some(event_type) = EventType::try_parse(&var_name) - .map(AlertContentToken::Event) - .or_else(|| MetricType::try_parse(&var_name).map(AlertContentToken::Metric)) - { - if !buf.is_empty() { - tokens.push(AlertContentToken::Text(std::mem::take(&mut buf))); + + let mut var_name = String::new(); + let mut found_curly = false; + + for ch in value.by_ref() { + if ch == '}' { + found_curly = true; + break; + } + var_name.push(ch); + } + + if found_curly && value.peek() == Some(&'%') { + value.next(); + if let Some(event_type) = + MetricType::parse(&var_name).map(AlertContentToken::Metric) + { + if !buf.is_empty() { + tokens.push(AlertContentToken::Text(std::mem::take(&mut buf))); + } + tokens.push(event_type); + } else { + buf.push('%'); + buf.push('{'); + buf.push_str(&var_name); + buf.push('}'); + buf.push('%'); } - tokens.push(event_type); } else { buf.push('%'); buf.push('{'); buf.push_str(&var_name); - buf.push('}'); - buf.push('%'); } } else { - buf.push('%'); - buf.push('{'); - buf.push_str(&var_name); + buf.push(ch); } - } else { - buf.push(ch); } - } - if !buf.is_empty() { - tokens.push(AlertContentToken::Text(buf)); - } - - AlertContent(tokens).into() -} - -fn sanitize_metric_name(name: &str) -> String { - let mut result = String::with_capacity(name.len()); - for ch in name.chars() { - if ch.is_ascii_alphanumeric() { - result.push(ch); - } else { - result.push('_'); + if !buf.is_empty() { + tokens.push(AlertContentToken::Text(buf)); } - } - result + AlertContent(tokens) + } } diff --git a/crates/common/src/enterprise/llm.rs b/crates/common/src/enterprise/llm.rs index 509c81de..e2de01ff 100644 --- a/crates/common/src/enterprise/llm.rs +++ b/crates/common/src/enterprise/llm.rs @@ -8,10 +8,9 @@ * */ -use hyper::{HeaderMap, header::CONTENT_TYPE}; +use hyper::HeaderMap; use serde::{Deserialize, Serialize}; use std::time::Duration; -use utils::config::{Config, http::parse_http_headers}; #[derive(Clone, Debug)] pub struct AiApiConfig { @@ -198,38 +197,4 @@ impl AiApiConfig { )) } } - - pub fn parse(bp: &mut Bootstrap, id: &str) -> Option { - let url = config.value(("enterprise.ai", id, "url"))?.to_string(); - let api_type = match config.value(("enterprise.ai", id, "type"))? { - "chat" => ApiType::ChatCompletion, - "text" => ApiType::TextCompletion, - _ => { - config.new_build_error(("enterprise.ai", id, "type"), "Invalid API type"); - return None; - } - }; - - let mut headers = parse_http_headers(config, ("enterprise.ai", id)); - headers.insert(CONTENT_TYPE, "application/json".parse().unwrap()); - - Some(AiApiConfig { - id: id.to_string(), - api_type, - url, - headers, - model: config - .value_require(("enterprise.ai", id, "model"))? - .to_string(), - timeout: config - .property_or_default(("enterprise.ai", id, "timeout"), "2m") - .unwrap_or_else(|| Duration::from_secs(120)), - tls_allow_invalid_certs: config - .property_or_default(("enterprise.ai", id, "allow-invalid-certs"), "false") - .unwrap_or_default(), - default_temperature: config - .property_or_default(("enterprise.ai", id, "default-temperature"), "0.7") - .unwrap_or(0.7), - }) - } } diff --git a/crates/common/src/enterprise/mod.rs b/crates/common/src/enterprise/mod.rs index 68df4ff6..70f71535 100644 --- a/crates/common/src/enterprise/mod.rs +++ b/crates/common/src/enterprise/mod.rs @@ -14,6 +14,10 @@ pub mod license; pub mod llm; pub mod undelete; +use crate::{ + Core, Server, config::groupware::CalendarTemplateVariable, expr::Expression, + manager::webadmin::Resource, +}; use ahash::{AHashMap, AHashSet}; use directory::{ QueryParams, Type, @@ -22,16 +26,12 @@ use directory::{ use license::LicenseKey; use llm::AiApiConfig; use mail_parser::DateTime; +use registry::types::id::Id; use std::{sync::Arc, time::Duration}; use store::Store; -use trc::{AddContext, EventType, MetricType}; +use trc::{AddContext, MetricType}; use utils::{HttpLimitResponse, config::cron::SimpleCron, template::Template}; -use crate::{ - Core, Server, config::groupware::CalendarTemplateVariable, expr::Expression, - manager::webadmin::Resource, -}; - #[derive(Clone)] pub struct Enterprise { pub license: LicenseKey, @@ -80,7 +80,7 @@ pub struct MetricStore { #[derive(Clone, Debug)] pub struct MetricAlert { - pub id: String, + pub id: Id, pub condition: Expression, pub method: Vec, } @@ -106,7 +106,6 @@ pub struct AlertContent(pub Vec); pub enum AlertContentToken { Text(String), Metric(MetricType), - Event(EventType), } impl Core { diff --git a/crates/common/src/expr/eval.rs b/crates/common/src/expr/eval.rs index 70796d45..b83d8a29 100644 --- a/crates/common/src/expr/eval.rs +++ b/crates/common/src/expr/eval.rs @@ -13,9 +13,12 @@ use super::{ use crate::Server; use compact_str::{CompactString, ToCompactString, format_compact}; use hyper::StatusCode; -use registry::types::EnumType; +use registry::{ + schema::prelude::Property, + types::{EnumType, id::Id}, +}; use std::{cmp::Ordering, fmt::Display}; -use trc::{Collector, EvalEvent, MetricType, TOTAL_EVENT_COUNT}; +use trc::{Collector, EvalEvent}; impl Server { pub async fn eval_if<'x, R: TryFrom>, V: ResolveVariable>( @@ -28,7 +31,8 @@ impl Server { trc::event!( Eval(EvalEvent::Result), SpanId = session_id, - Id = if_block.property.as_str(), + Id = if_block.id.to_string(), + Key = if_block.property.as_str(), Result = "" ); @@ -49,7 +53,8 @@ impl Server { trc::event!( Eval(EvalEvent::Result), SpanId = session_id, - Id = if_block.property.as_str(), + Id = if_block.id.to_string(), + Key = if_block.property.as_str(), Result = format!("{result:?}"), ); @@ -59,7 +64,8 @@ impl Server { trc::event!( Eval(EvalEvent::Result), SpanId = session_id, - Id = if_block.property.as_str(), + Id = if_block.id.to_string(), + Key = if_block.property.as_str(), Result = "", ); @@ -71,7 +77,8 @@ impl Server { trc::event!( Eval(EvalEvent::Error), SpanId = session_id, - Id = if_block.property.as_str(), + Id = if_block.id.to_string(), + Key = if_block.property.as_str(), CausedBy = err, ); @@ -84,7 +91,8 @@ impl Server { &'x self, expr: &'x Expression, resolver: &'x V, - expr_id: &'static str, + obj_id: Id, + property: Property, session_id: u64, ) -> Option { if expr.is_empty() { @@ -105,7 +113,8 @@ impl Server { trc::event!( Eval(EvalEvent::Result), SpanId = session_id, - Id = expr_id, + Id = obj_id.to_string(), + Key = property.as_str(), Result = format!("{result:?}"), ); @@ -115,7 +124,8 @@ impl Server { trc::event!( Eval(EvalEvent::Error), SpanId = session_id, - Id = expr_id, + Id = obj_id.to_string(), + Key = property.as_str(), Details = "Failed to convert result", ); @@ -127,7 +137,8 @@ impl Server { trc::event!( Eval(EvalEvent::Error), SpanId = session_id, - Id = expr_id, + Id = obj_id.to_string(), + Key = property.as_str(), CausedBy = err, ); @@ -218,15 +229,7 @@ impl<'x, V: ResolveVariable> EvalContext<'x, V, Expression, &mut Vec stack.push(self.core.core.network.node_id.into()), SystemVariable::Metric(variable) => { - stack.push(if *variable < TOTAL_EVENT_COUNT { - Variable::Integer(Collector::read_event_metric(*variable) as i64) - } else if let Some(metric_type) = - MetricType::from_code(*variable as u64 - TOTAL_EVENT_COUNT as u64) - { - Variable::Float(Collector::read_metric(metric_type)) - } else { - Variable::Integer(0) - }); + stack.push(Variable::Float(Collector::read_metric(*variable))); } }, ExpressionItem::UnaryOperator(op) => { diff --git a/crates/common/src/expr/functions/mod.rs b/crates/common/src/expr/functions/mod.rs index 4f190ef2..9299dc3c 100644 --- a/crates/common/src/expr/functions/mod.rs +++ b/crates/common/src/expr/functions/mod.rs @@ -103,3 +103,15 @@ pub const ASYNC_FUNCTIONS: &[(&str, u32, u32)] = &[ ("dns_query", F_DNS_QUERY, 2), ("sql_query", F_SQL_QUERY, 3), ]; + +pub struct EmptyResolver; + +impl ResolveVariable for EmptyResolver { + fn resolve_variable(&self, _: ExpressionVariable) -> Variable<'_> { + Variable::Integer(0) + } + + fn resolve_global(&self, _: &str) -> Variable<'_> { + Variable::Integer(0) + } +} diff --git a/crates/common/src/expr/if_block.rs b/crates/common/src/expr/if_block.rs index c7d57ff1..f6d51fbd 100644 --- a/crates/common/src/expr/if_block.rs +++ b/crates/common/src/expr/if_block.rs @@ -30,17 +30,19 @@ pub struct IfThen { #[derive(Debug, Clone, PartialEq, Eq)] pub struct IfBlock { + pub id: Id, pub property: Property, pub if_then: Vec, pub default: Expression, } impl IfBlock { - pub fn new_default(expr_ctx: ExpressionContext<'_>) -> Self { + pub fn new_default(id: Id, expr_ctx: ExpressionContext<'_>) -> Self { let token_map = TokenMap::default(); if let Some(default) = &expr_ctx.default { Self { + id, property: expr_ctx.property, if_then: default .match_ @@ -53,12 +55,13 @@ impl IfBlock { default: Expression::parse(&token_map, &default.else_), } } else { - Self::empty(expr_ctx.property) + Self::empty(id, expr_ctx.property) } } - pub fn empty(property: Property) -> Self { + pub fn empty(id: Id, property: Property) -> Self { Self { + id, property, if_then: Default::default(), default: Expression { @@ -83,7 +86,7 @@ impl Expression { impl Bootstrap { pub fn compile_expr(&mut self, id: Id, expr_ctx: &ExpressionContext<'_>) -> IfBlock { if expr_ctx.expr.else_.is_empty() && expr_ctx.expr.match_.is_empty() { - return IfBlock::empty(expr_ctx.property); + return IfBlock::empty(id, expr_ctx.property); } if let Some(if_block) = self.try_compile_expr(id, expr_ctx, &expr_ctx.expr) { @@ -98,7 +101,7 @@ impl Bootstrap { self.try_compile_expr(id, expr_ctx, default) .expect("Valid default expression") } else { - IfBlock::empty(expr_ctx.property) + IfBlock::empty(id, expr_ctx.property) } } @@ -110,6 +113,7 @@ impl Bootstrap { ) -> Option { // Parse conditions let mut if_block = IfBlock { + id, property: expr_ctx.property, if_then: Vec::with_capacity(expr.match_.len()), default: Expression { @@ -203,8 +207,9 @@ impl Bootstrap { } impl IfBlock { - pub fn into_default(self, property: Property) -> IfBlock { + pub fn into_default(self, id: Id, property: Property) -> IfBlock { IfBlock { + id, property, if_then: Default::default(), default: self.default, diff --git a/crates/common/src/expr/mod.rs b/crates/common/src/expr/mod.rs index 27748c55..83c87220 100644 --- a/crates/common/src/expr/mod.rs +++ b/crates/common/src/expr/mod.rs @@ -13,6 +13,7 @@ use std::{ net::{IpAddr, Ipv4Addr, Ipv6Addr}, time::Duration, }; +use trc::MetricType; use utils::config::{Rate, utils::ParseValue}; pub mod eval; @@ -167,7 +168,7 @@ pub enum SystemVariable { Hostname, Domain, NodeId, - Metric(usize), + Metric(MetricType), } impl From for Variable<'_> { diff --git a/crates/common/src/expr/tokenizer.rs b/crates/common/src/expr/tokenizer.rs index 9db459bd..fc21f27e 100644 --- a/crates/common/src/expr/tokenizer.rs +++ b/crates/common/src/expr/tokenizer.rs @@ -12,7 +12,7 @@ use ahash::AHashSet; use regex::Regex; use registry::{schema::enums::ExpressionConstant, types::EnumType}; use std::{borrow::Cow, iter::Peekable, slice::Iter, time::Duration}; -use trc::{EventType, MetricType, TOTAL_EVENT_COUNT}; +use trc::MetricType; use utils::config::utils::ParseValue; pub struct Tokenizer<'x> { @@ -107,15 +107,9 @@ impl<'x> Tokenizer<'x> { b"metric" => { let stop_ch = self.find_char(b"\"'")?; let metric_str = self.parse_string(stop_ch)?; - let metric = EventType::try_parse(&metric_str) - .map(|e| e.id()) - .or_else(|| { - MetricType::try_parse(&metric_str) - .map(|m| m.code() as usize + TOTAL_EVENT_COUNT) - }) - .ok_or_else(|| { - format!("Invalid metric name {:?}", metric_str) - })?; + let metric = MetricType::parse(&metric_str).ok_or_else(|| { + format!("Invalid metric name {:?}", metric_str) + })?; self.has_alpha = false; self.buf.clear(); (Token::System(SystemVariable::Metric(metric)).into(), b'(') diff --git a/crates/common/src/listener/acme/cache.rs b/crates/common/src/listener/acme/cache.rs index 7e8e9334..c61e0b6b 100644 --- a/crates/common/src/listener/acme/cache.rs +++ b/crates/common/src/listener/acme/cache.rs @@ -65,7 +65,8 @@ impl Server { class: &str, items: &[String], ) -> trc::Result>> { - if let Some(content) = self + todo!() + /*if let Some(content) = self .core .storage .config @@ -83,7 +84,7 @@ impl Server { .map(Some) } else { Ok(None) - } + }*/ } async fn write( @@ -93,17 +94,18 @@ impl Server { items: &[String], contents: impl AsRef<[u8]>, ) -> trc::Result<()> { - self.core - .storage - .config - .set( - [ConfigKey { - key: self.build_key(provider, class, items), - value: URL_SAFE_NO_PAD.encode(contents.as_ref()), - }], - true, - ) - .await + todo!() + /*self.core + .storage + .config + .set( + [ConfigKey { + key: self.build_key(provider, class, items), + value: URL_SAFE_NO_PAD.encode(contents.as_ref()), + }], + true, + ) + .await*/ } fn build_key(&self, provider: &AcmeProvider, class: &str, _: &[String]) -> String { diff --git a/crates/common/src/listener/acme/mod.rs b/crates/common/src/listener/acme/mod.rs index 08a802f1..60efa14d 100644 --- a/crates/common/src/listener/acme/mod.rs +++ b/crates/common/src/listener/acme/mod.rs @@ -81,19 +81,23 @@ impl Server { } pub fn has_acme_tls_providers(&self) -> bool { - self.core - .acme - .providers - .values() - .any(|p| matches!(p.challenge, ChallengeSettings::TlsAlpn01)) + let todo = "fix"; + false + /*self.core + .acme + .providers + .values() + .any(|p| matches!(p.challenge, ChallengeSettings::TlsAlpn01))*/ } pub fn has_acme_http_providers(&self) -> bool { - self.core - .acme - .providers - .values() - .any(|p| matches!(p.challenge, ChallengeSettings::Http01)) + let todo = "fix"; + false + /*self.core + .acme + .providers + .values() + .any(|p| matches!(p.challenge, ChallengeSettings::Http01))*/ } } diff --git a/crates/common/src/listener/blocked.rs b/crates/common/src/listener/blocked.rs index 004f8f57..615ac3fd 100644 --- a/crates/common/src/listener/blocked.rs +++ b/crates/common/src/listener/blocked.rs @@ -12,7 +12,7 @@ use ahash::AHashSet; use std::{fmt::Debug, net::IpAddr}; use utils::{ config::{ - Config, ConfigKey, Rate, + ConfigKey, Rate, ipmask::{IpAddrMask, IpAddrOrMask}, utils::ParseValue, }, diff --git a/crates/common/src/listener/tls.rs b/crates/common/src/listener/tls.rs index d8df9f3b..e040fde2 100644 --- a/crates/common/src/listener/tls.rs +++ b/crates/common/src/listener/tls.rs @@ -4,32 +4,25 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ -use std::{ - cmp::Ordering, - fmt::{self, Formatter}, - sync::Arc, +use super::{ + ServerInstance, SessionStream, TcpAcceptor, TcpAcceptorResult, + acme::resolver::{IsTlsAlpnChallenge, build_acme_static_resolver}, }; - -use ahash::AHashMap; +use crate::{Inner, Server}; use rustls::{ SupportedProtocolVersion, server::{ClientHello, ResolvesServerCert}, sign::CertifiedKey, version::{TLS12, TLS13}, }; +use std::{ + cmp::Ordering, + fmt::{self, Formatter}, + sync::Arc, +}; use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt}; use tokio_rustls::{Accept, LazyConfigAcceptor}; -use crate::{Inner, Server}; - -use super::{ - ServerInstance, SessionStream, TcpAcceptor, TcpAcceptorResult, - acme::{ - AcmeProvider, - resolver::{IsTlsAlpnChallenge, build_acme_static_resolver}, - }, -}; - pub static TLS13_VERSION: &[&SupportedProtocolVersion] = &[&TLS13]; pub static TLS12_VERSION: &[&SupportedProtocolVersion] = &[&TLS12]; diff --git a/crates/common/src/manager/reload.rs b/crates/common/src/manager/reload.rs index 7fa35e0d..46044198 100644 --- a/crates/common/src/manager/reload.rs +++ b/crates/common/src/manager/reload.rs @@ -6,10 +6,7 @@ use crate::{ Core, Server, - config::{ - server::{Listeners, tls::parse_certificates}, - telemetry::Telemetry, - }, + config::{server::Listeners, telemetry::Telemetry}, listener::blocked::{BLOCKED_IP_KEY, BlockedIps}, }; use ahash::AHashMap; diff --git a/crates/common/src/telemetry/metrics/otel.rs b/crates/common/src/telemetry/metrics/otel.rs index dd8e0e40..80f42ab1 100644 --- a/crates/common/src/telemetry/metrics/otel.rs +++ b/crates/common/src/telemetry/metrics/otel.rs @@ -24,7 +24,7 @@ impl OtelMetrics { // Add counters for counter in Collector::collect_counters(is_enterprise) { metrics.push(Metric { - name: counter.id().name().into(), + name: counter.id().as_str().into(), description: counter.id().description().into(), unit: "events".into(), data: Box::new(Sum { @@ -44,7 +44,7 @@ impl OtelMetrics { // Add gauges for gauge in Collector::collect_gauges(is_enterprise) { metrics.push(Metric { - name: gauge.id().name().into(), + name: gauge.id().as_str().into(), description: gauge.id().description().into(), unit: gauge.id().unit().into(), data: Box::new(Gauge { @@ -62,7 +62,7 @@ impl OtelMetrics { // Add histograms for histogram in Collector::collect_histograms(is_enterprise) { metrics.push(Metric { - name: histogram.id().name().into(), + name: histogram.id().as_str().into(), description: histogram.id().description().into(), unit: histogram.id().unit().into(), data: Box::new(Histogram { diff --git a/crates/common/src/telemetry/metrics/prometheus.rs b/crates/common/src/telemetry/metrics/prometheus.rs index cdd52436..0989ebb7 100644 --- a/crates/common/src/telemetry/metrics/prometheus.rs +++ b/crates/common/src/telemetry/metrics/prometheus.rs @@ -29,7 +29,7 @@ impl Server { // Add counters for counter in Collector::collect_counters(is_enterprise) { let mut metric = MetricFamily::default(); - metric.set_name(metric_name(counter.id().name())); + metric.set_name(metric_name(counter.id().as_str())); metric.set_help(counter.id().description().into()); metric.set_field_type(MetricType::COUNTER); metric.set_metric(vec![new_counter(counter.value())]); @@ -39,7 +39,7 @@ impl Server { // Add gauges for gauge in Collector::collect_gauges(is_enterprise) { let mut metric = MetricFamily::default(); - metric.set_name(metric_name(gauge.id().name())); + metric.set_name(metric_name(gauge.id().as_str())); metric.set_help(gauge.id().description().into()); metric.set_field_type(MetricType::GAUGE); metric.set_metric(vec![new_gauge(gauge.get())]); @@ -49,7 +49,7 @@ impl Server { // Add histograms for histogram in Collector::collect_histograms(is_enterprise) { let mut metric = MetricFamily::default(); - metric.set_name(metric_name(histogram.id().name())); + metric.set_name(metric_name(histogram.id().as_str())); metric.set_help(histogram.id().description().into()); metric.set_field_type(MetricType::HISTOGRAM); metric.set_metric(vec![new_histogram(histogram)]); diff --git a/crates/common/src/telemetry/metrics/store.rs b/crates/common/src/telemetry/metrics/store.rs index cc8c3e7f..fdda3007 100644 --- a/crates/common/src/telemetry/metrics/store.rs +++ b/crates/common/src/telemetry/metrics/store.rs @@ -37,7 +37,7 @@ pub trait MetricsStore: Sync + Send { &self, from_timestamp: u64, to_timestamp: u64, - ) -> impl Future>>> + Send; + ) -> impl Future>>> + Send; fn purge_metrics(&self, period: Duration) -> impl Future> + Send; } @@ -116,7 +116,7 @@ impl MetricsStore for Store { EventType::IncomingReport(IncomingReportEvent::TlsReport), EventType::IncomingReport(IncomingReportEvent::TlsReportWithWarnings), ] { - let reading = Collector::read_event_metric(event.id()); + let reading = Collector::read_metric_counter(event.to_id() as usize); if reading > 0 { let history = history.events.entry(event).or_insert(0); let diff = reading - *history; @@ -124,7 +124,7 @@ impl MetricsStore for Store { batch.set( ValueClass::Telemetry(TelemetryClass::Metric { timestamp, - metric_id: (event.code() << 2) | TYPE_COUNTER, + metric_id: (event.to_id() << 2) as u64 | TYPE_COUNTER, node_id, }), KeySerializer::new(U32_LEN).write_leb128(diff).finalize(), @@ -142,7 +142,7 @@ impl MetricsStore for Store { batch.set( ValueClass::Telemetry(TelemetryClass::Metric { timestamp, - metric_id: (gauge_id.code() << 2) | TYPE_GAUGE, + metric_id: (gauge_id.to_id() << 2) as u64 | TYPE_GAUGE, node_id, }), KeySerializer::new(U32_LEN).write_leb128(value).finalize(), @@ -155,10 +155,10 @@ impl MetricsStore for Store { let histogram_id = histogram.id(); if matches!( histogram_id, - MetricType::MessageIngestionTime - | MetricType::MessageFtsIndexTime + MetricType::MessageIngestTime + | MetricType::MessageIngestIndexTime | MetricType::DeliveryTotalTime - | MetricType::DeliveryTime + | MetricType::DeliveryAttemptTime | MetricType::DnsLookupTime ) { let history = history.histograms.entry(histogram_id).or_default(); @@ -170,7 +170,7 @@ impl MetricsStore for Store { batch.set( ValueClass::Telemetry(TelemetryClass::Metric { timestamp, - metric_id: (histogram_id.code() << 2) | TYPE_HISTOGRAM, + metric_id: (histogram_id.to_id() << 2) as u64 | TYPE_HISTOGRAM, node_id, }), KeySerializer::new(U32_LEN) @@ -198,7 +198,7 @@ impl MetricsStore for Store { &self, from_timestamp: u64, to_timestamp: u64, - ) -> trc::Result>> { + ) -> trc::Result>> { let mut metrics = Vec::new(); self.iterate( IterateParams::new( @@ -221,9 +221,10 @@ impl MetricsStore for Store { .ok_or_else(|| trc::Error::corrupted_key(key, None, trc::location!()))?; match metric_type & 0x03 { TYPE_COUNTER => { - let id = EventType::from_code(metric_type >> 2).ok_or_else(|| { - trc::Error::corrupted_key(key, None, trc::location!()) - })?; + let id = + MetricType::from_id((metric_type >> 2) as u16).ok_or_else(|| { + trc::Error::corrupted_key(key, None, trc::location!()) + })?; let (value, _) = value.read_leb128::().ok_or_else(|| { trc::Error::corrupted_key(key, value.into(), trc::location!()) })?; @@ -234,9 +235,10 @@ impl MetricsStore for Store { }); } TYPE_HISTOGRAM => { - let id = MetricType::from_code(metric_type >> 2).ok_or_else(|| { - trc::Error::corrupted_key(key, None, trc::location!()) - })?; + let id = + MetricType::from_id((metric_type >> 2) as u16).ok_or_else(|| { + trc::Error::corrupted_key(key, None, trc::location!()) + })?; let (count, bytes_read) = value.read_leb128::().ok_or_else(|| { trc::Error::corrupted_key(key, value.into(), trc::location!()) })?; @@ -254,9 +256,10 @@ impl MetricsStore for Store { }); } TYPE_GAUGE => { - let id = MetricType::from_code(metric_type >> 2).ok_or_else(|| { - trc::Error::corrupted_key(key, None, trc::location!()) - })?; + let id = + MetricType::from_id((metric_type >> 2) as u16).ok_or_else(|| { + trc::Error::corrupted_key(key, None, trc::location!()) + })?; let (value, _) = value.read_leb128::().ok_or_else(|| { trc::Error::corrupted_key(key, value.into(), trc::location!()) })?; diff --git a/crates/common/src/telemetry/mod.rs b/crates/common/src/telemetry/mod.rs index 64c0348e..e1b75c89 100644 --- a/crates/common/src/telemetry/mod.rs +++ b/crates/common/src/telemetry/mod.rs @@ -75,7 +75,7 @@ impl Telemetry { let mut interests = trc::ipc::subscriber::Interests::default(); for event in trc::EventType::variants() { if level.is_contained(event.level()) { - interests.set(event); + interests.set(*event); } } diff --git a/crates/common/src/telemetry/tracers/otel.rs b/crates/common/src/telemetry/tracers/otel.rs index 47188f28..4b4ad8d1 100644 --- a/crates/common/src/telemetry/tracers/otel.rs +++ b/crates/common/src/telemetry/tracers/otel.rs @@ -153,7 +153,7 @@ where let event = event.as_ref(); opentelemetry::trace::Event::new( - event.inner.typ.name(), + event.inner.typ.as_str(), UNIX_EPOCH + Duration::from_secs(event.inner.timestamp), event.keys.iter().filter_map(build_key_value).collect(), 0, @@ -171,7 +171,7 @@ where ), dropped_attributes_count: 0, parent_span_id: 0.into(), - name: start_span.inner.typ.name().into(), + name: start_span.inner.typ.as_str().into(), start_time: UNIX_EPOCH + Duration::from_secs(start_span.inner.timestamp), end_time: UNIX_EPOCH + Duration::from_secs(end_span.inner.timestamp), attributes: start_span.keys.iter().filter_map(build_key_value).collect(), @@ -189,7 +189,7 @@ impl OtelTracer { use opentelemetry::logs::Logger; let mut record = self.log_provider.create_log_record(); - record.set_event_name(event.inner.typ.name()); + record.set_event_name(event.inner.typ.as_str()); record.set_severity_number(match event.inner.level { Level::Trace => Severity::Trace, Level::Debug => Severity::Debug, @@ -255,7 +255,7 @@ fn build_any_value(value: &trc::Value) -> AnyValue { trc::Value::Event(v) => AnyValue::Map(Box::new( [( Key::from_static_str("eventName"), - AnyValue::String(v.event_type().name().into()), + AnyValue::String(v.event_type().as_str().into()), )] .into_iter() .chain( diff --git a/crates/common/src/telemetry/tracers/store.rs b/crates/common/src/telemetry/tracers/store.rs index 3560c6ab..3c7e38c7 100644 --- a/crates/common/src/telemetry/tracers/store.rs +++ b/crates/common/src/telemetry/tracers/store.rs @@ -156,67 +156,70 @@ impl TracingStore for Store { impl StoreTracer { pub fn default_events() -> impl IntoIterator { - EventType::variants().into_iter().filter(|event| { - !event.is_raw_io() - && matches!( - event, - EventType::MessageIngest( - MessageIngestEvent::Ham - | MessageIngestEvent::Spam - | MessageIngestEvent::Duplicate - | MessageIngestEvent::Error - ) | EventType::Smtp(_) - | EventType::Delivery(_) - | EventType::MtaSts(_) - | EventType::TlsRpt(_) - | EventType::Dane(_) - | EventType::Iprev(_) - | EventType::Spf(_) - | EventType::Dmarc(_) - | EventType::Dkim(_) - | EventType::MailAuth(_) - | EventType::Queue( - QueueEvent::QueueMessage - | QueueEvent::QueueMessageAuthenticated - | QueueEvent::QueueReport - | QueueEvent::QueueDsn - | QueueEvent::QueueAutogenerated - | QueueEvent::Rescheduled - | QueueEvent::RateLimitExceeded - | QueueEvent::ConcurrencyLimitExceeded - | QueueEvent::QuotaExceeded - ) - | EventType::Limit(_) - | EventType::Tls(_) - | EventType::IncomingReport(_) - | EventType::OutgoingReport( - OutgoingReportEvent::SpfReport - | OutgoingReportEvent::SpfRateLimited - | OutgoingReportEvent::DkimReport - | OutgoingReportEvent::DkimRateLimited - | OutgoingReportEvent::DmarcReport - | OutgoingReportEvent::DmarcRateLimited - | OutgoingReportEvent::DmarcAggregateReport - | OutgoingReportEvent::TlsAggregate - | OutgoingReportEvent::HttpSubmission - | OutgoingReportEvent::UnauthorizedReportingAddress - | OutgoingReportEvent::ReportingAddressValidationError - | OutgoingReportEvent::NotFound - | OutgoingReportEvent::SubmissionError - | OutgoingReportEvent::NoRecipientsFound - ) - | EventType::Auth( - AuthEvent::Success - | AuthEvent::Failed - | AuthEvent::TooManyAttempts - | AuthEvent::Error - ) - | EventType::Sieve(_) - | EventType::Milter(_) - | EventType::MtaHook(_) - | EventType::Security(_) - ) - }) + EventType::variants() + .into_iter() + .filter(|event| { + !event.is_raw_io() + && matches!( + event, + EventType::MessageIngest( + MessageIngestEvent::Ham + | MessageIngestEvent::Spam + | MessageIngestEvent::Duplicate + | MessageIngestEvent::Error + ) | EventType::Smtp(_) + | EventType::Delivery(_) + | EventType::MtaSts(_) + | EventType::TlsRpt(_) + | EventType::Dane(_) + | EventType::Iprev(_) + | EventType::Spf(_) + | EventType::Dmarc(_) + | EventType::Dkim(_) + | EventType::MailAuth(_) + | EventType::Queue( + QueueEvent::QueueMessage + | QueueEvent::QueueMessageAuthenticated + | QueueEvent::QueueReport + | QueueEvent::QueueDsn + | QueueEvent::QueueAutogenerated + | QueueEvent::Rescheduled + | QueueEvent::RateLimitExceeded + | QueueEvent::ConcurrencyLimitExceeded + | QueueEvent::QuotaExceeded + ) + | EventType::Limit(_) + | EventType::Tls(_) + | EventType::IncomingReport(_) + | EventType::OutgoingReport( + OutgoingReportEvent::SpfReport + | OutgoingReportEvent::SpfRateLimited + | OutgoingReportEvent::DkimReport + | OutgoingReportEvent::DkimRateLimited + | OutgoingReportEvent::DmarcReport + | OutgoingReportEvent::DmarcRateLimited + | OutgoingReportEvent::DmarcAggregateReport + | OutgoingReportEvent::TlsAggregate + | OutgoingReportEvent::HttpSubmission + | OutgoingReportEvent::UnauthorizedReportingAddress + | OutgoingReportEvent::ReportingAddressValidationError + | OutgoingReportEvent::NotFound + | OutgoingReportEvent::SubmissionError + | OutgoingReportEvent::NoRecipientsFound + ) + | EventType::Auth( + AuthEvent::Success + | AuthEvent::Failed + | AuthEvent::TooManyAttempts + | AuthEvent::Error + ) + | EventType::Sieve(_) + | EventType::Milter(_) + | EventType::MtaHook(_) + | EventType::Security(_) + ) + }) + .copied() } } @@ -248,7 +251,7 @@ pub fn build_span_document( && (index_fields.is_empty() || index_fields.contains(&TracingSearchField::EventType.into())) { - document.index_unsigned(TracingSearchField::EventType, event.inner.typ.code()); + document.index_unsigned(TracingSearchField::EventType, event.inner.typ.to_id()); } for (key, value) in event.keys { diff --git a/crates/registry/src/pickle.rs b/crates/registry/src/pickle.rs index 8cdbf9c3..7efad4ff 100644 --- a/crates/registry/src/pickle.rs +++ b/crates/registry/src/pickle.rs @@ -202,3 +202,27 @@ where Some(map) } } + +impl Pickle for trc::EventType { + fn pickle(&self, out: &mut Vec) { + out.extend_from_slice(&self.to_id().to_le_bytes()); + } + + fn unpickle(stream: &mut PickledStream<'_>) -> Option { + let mut id_arr = [0u8; 2]; + id_arr.copy_from_slice(stream.read_bytes(2)?); + Self::from_id(u16::from_le_bytes(id_arr)) + } +} + +impl Pickle for trc::MetricType { + fn pickle(&self, out: &mut Vec) { + out.extend_from_slice(&self.to_id().to_le_bytes()); + } + + fn unpickle(stream: &mut PickledStream<'_>) -> Option { + let mut id_arr = [0u8; 2]; + id_arr.copy_from_slice(stream.read_bytes(2)?); + Self::from_id(u16::from_le_bytes(id_arr)) + } +} diff --git a/crates/registry/src/schema/mod.rs b/crates/registry/src/schema/mod.rs index b7845bc6..0d204254 100644 --- a/crates/registry/src/schema/mod.rs +++ b/crates/registry/src/schema/mod.rs @@ -60,7 +60,9 @@ impl HttpAuth { content_type: Option<&str>, ) -> Result { match self { - HttpAuth::None => build_http_headers(extra_headers, None, None, None, content_type), + HttpAuth::Unauthenticated => { + build_http_headers(extra_headers, None, None, None, content_type) + } HttpAuth::Basic(auth) => build_http_headers( extra_headers, auth.username.as_str().into(), diff --git a/crates/store/src/dispatch/registry.rs b/crates/store/src/dispatch/registry.rs index 874d2d8e..247a5e04 100644 --- a/crates/store/src/dispatch/registry.rs +++ b/crates/store/src/dispatch/registry.rs @@ -5,13 +5,20 @@ */ use crate::{RegistryStore, registry::RegistryObject}; -use registry::types::{ObjectType, id::Id}; +use registry::{ + schema::prelude::Object, + types::{ObjectType, id::Id}, +}; impl RegistryStore { pub async fn get(&self, id: Id) -> trc::Result> { todo!() } + pub async fn put(&self, id: Id, object: &T) -> trc::Result> { + todo!() + } + pub async fn list(&self) -> trc::Result>> { todo!() } @@ -19,4 +26,8 @@ impl RegistryStore { pub async fn delete(&self, id: Id) -> trc::Result<()> { todo!() } + + pub async fn count(&self, typ: Object) -> trc::Result { + todo!() + } } diff --git a/crates/trc/Cargo.toml b/crates/trc/Cargo.toml index 9eb4944b..226b4f00 100644 --- a/crates/trc/Cargo.toml +++ b/crates/trc/Cargo.toml @@ -17,6 +17,7 @@ tokio = { version = "1.47", features = ["net", "macros"] } ahash = "0.8.11" rkyv = { version = "0.8.10", features = ["little_endian"] } compact_str = "0.9.0" +hashify = "0.2.7" [features] test_mode = [] diff --git a/crates/trc/event-macro/src/lib.rs b/crates/trc/event-macro/src/lib.rs index dccd5475..2b12ba94 100644 --- a/crates/trc/event-macro/src/lib.rs +++ b/crates/trc/event-macro/src/lib.rs @@ -6,168 +6,10 @@ use proc_macro::TokenStream; use quote::quote; -use syn::{ - Data, DeriveInput, Expr, ExprPath, Fields, Ident, Token, parse::Parse, parse_macro_input, -}; +use syn::{Data, DeriveInput, Expr, ExprPath, Ident, Token, parse::Parse, parse_macro_input}; static mut GLOBAL_ID_COUNTER: usize = 0; -#[proc_macro_attribute] -pub fn event_type(_attr: TokenStream, item: TokenStream) -> TokenStream { - let input = parse_macro_input!(item as DeriveInput); - let name = &input.ident; - let name_str = name.to_string(); - let prefix = to_snake_case(name_str.strip_suffix("Event").unwrap_or(&name_str)); - - let enum_variants = match &input.data { - Data::Enum(data_enum) => &data_enum.variants, - _ => panic!("This macro only works with enums"), - }; - - let mut variant_ids = Vec::new(); - let mut variant_names = Vec::new(); - let mut event_names = Vec::new(); - - for variant in enum_variants { - unsafe { - variant_ids.push(GLOBAL_ID_COUNTER); - GLOBAL_ID_COUNTER += 1; - } - let variant_name = &variant.ident; - event_names.push(format!( - "{prefix}.{}", - to_snake_case(&variant_name.to_string()) - )); - variant_names.push(variant_name); - } - - let id_fn = quote! { - pub const fn id(&self) -> usize { - match self { - #(Self::#variant_names => #variant_ids,)* - } - } - }; - - let name_fn = quote! { - pub fn name(&self) -> &'static str { - match self { - #(Self::#variant_names => #event_names,)* - } - } - }; - - let parse_fn = quote! { - pub fn try_parse(name: &str) -> Option { - match name { - #(#event_names => Some(Self::#variant_names),)* - _ => None, - } - } - }; - - let variants_fn = quote! { - pub const fn variants() -> &'static [Self] { - &[ - #(#name::#variant_names,)* - ] - } - }; - - let expanded = quote! { - #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] - pub enum #name { - #(#variant_names),* - } - - impl #name { - #id_fn - #name_fn - #parse_fn - #variants_fn - } - }; - - TokenStream::from(expanded) -} - -#[proc_macro_attribute] -pub fn event_family(_attr: TokenStream, item: TokenStream) -> TokenStream { - let input = parse_macro_input!(item as DeriveInput); - let name = &input.ident; - - let variants = match &input.data { - Data::Enum(data_enum) => &data_enum.variants, - _ => panic!("EventType must be an enum"), - }; - - let variant_idents: Vec<_> = variants.iter().map(|v| &v.ident).collect(); - - let event_types: Vec<_> = variants - .iter() - .map(|v| match &v.fields { - Fields::Unnamed(fields) => &fields.unnamed[0], - _ => panic!("EventType variants must be unnamed and contain a single type"), - }) - .map(|f| &f.ty) - .collect(); - - let variant_names: Vec<_> = variant_idents - .iter() - .map(|ident| { - let name_str = ident.to_string(); - to_snake_case(name_str.strip_suffix("Event").unwrap_or(&name_str)) - }) - .collect(); - - let expanded = quote! { - pub enum #name { - #(#variant_idents(#event_types)),* - } - - impl #name { - pub const fn id(&self) -> usize { - match self { - #(#name::#variant_idents(e) => e.id()),* - } - } - - pub fn name(&self) -> &'static str { - match self { - #(#name::#variant_idents(e) => e.name()),* - } - } - - pub fn try_parse(name: &str) -> Option { - match name.trim().split_once('.')?.0 { - #( - #variant_names => <#event_types>::try_parse(&name).map(#name::#variant_idents), - )* - _ => None, - } - } - - pub const fn variants() -> [#name; crate::TOTAL_EVENT_COUNT] { - let mut variants = [crate::EventType::Eval(crate::EvalEvent::Error); crate::TOTAL_EVENT_COUNT]; - #( - { - let sub_variants = <#event_types>::variants(); - let mut i = 0; - while i < sub_variants.len() { - variants[sub_variants[i].id()] = #name::#variant_idents(sub_variants[i]); - i += 1; - } - - } - )* - variants - } - } - }; - - TokenStream::from(expanded) -} - #[proc_macro_attribute] pub fn key_names(_attr: TokenStream, item: TokenStream) -> TokenStream { let input = parse_macro_input!(item as DeriveInput); @@ -318,7 +160,7 @@ pub fn event(input: TokenStream) -> TokenStream { { quote! {{ const ET: trc::EventType = trc::EventType::#event(#param); - const ET_ID: usize = ET.id(); + const ET_ID: usize = ET.to_id() as usize; if trc::Collector::has_interest(ET_ID) { let keys = vec![#(#key_value_tokens),*]; if trc::Collector::is_metric(ET_ID) { @@ -332,7 +174,7 @@ pub fn event(input: TokenStream) -> TokenStream { } else { quote! {{ let et = trc::EventType::#event(#param); - let et_id = et.id(); + let et_id = et.to_id() as usize; if trc::Collector::has_interest(et_id) { let keys = vec![#(#key_value_tokens),*]; if trc::Collector::is_metric(et_id) { diff --git a/crates/trc/src/event/conv.rs b/crates/trc/src/event/conv.rs index 41aaba96..0cfad7a2 100644 --- a/crates/trc/src/event/conv.rs +++ b/crates/trc/src/event/conv.rs @@ -428,7 +428,7 @@ impl FromStr for EventType { type Err = (); fn from_str(s: &str) -> std::result::Result { - EventType::try_parse(s).ok_or(()) + EventType::parse(s).ok_or(()) } } diff --git a/crates/trc/src/event/description.rs b/crates/trc/src/event/description.rs deleted file mode 100644 index db538d86..00000000 --- a/crates/trc/src/event/description.rs +++ /dev/null @@ -1,1948 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2020 Stalwart Labs LLC - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL - */ - -use super::*; - -impl EventType { - pub fn description(&self) -> &'static str { - match self { - EventType::Store(event) => event.description(), - EventType::Jmap(event) => event.description(), - EventType::Imap(event) => event.description(), - EventType::ManageSieve(event) => event.description(), - EventType::Pop3(event) => event.description(), - EventType::Smtp(event) => event.description(), - EventType::Network(event) => event.description(), - EventType::Limit(event) => event.description(), - EventType::Manage(event) => event.description(), - EventType::Auth(event) => event.description(), - EventType::Config(event) => event.description(), - EventType::Resource(event) => event.description(), - EventType::Sieve(event) => event.description(), - EventType::Spam(event) => event.description(), - EventType::Server(event) => event.description(), - EventType::Purge(event) => event.description(), - EventType::Eval(event) => event.description(), - EventType::Acme(event) => event.description(), - EventType::Http(event) => event.description(), - EventType::Arc(event) => event.description(), - EventType::Dkim(event) => event.description(), - EventType::Dmarc(event) => event.description(), - EventType::Iprev(event) => event.description(), - EventType::Dane(event) => event.description(), - EventType::Spf(event) => event.description(), - EventType::MailAuth(event) => event.description(), - EventType::Tls(event) => event.description(), - EventType::PushSubscription(event) => event.description(), - EventType::Cluster(event) => event.description(), - EventType::Housekeeper(event) => event.description(), - EventType::TaskQueue(event) => event.description(), - EventType::Milter(event) => event.description(), - EventType::MtaHook(event) => event.description(), - EventType::Delivery(event) => event.description(), - EventType::Queue(event) => event.description(), - EventType::TlsRpt(event) => event.description(), - EventType::MtaSts(event) => event.description(), - EventType::IncomingReport(event) => event.description(), - EventType::OutgoingReport(event) => event.description(), - EventType::Telemetry(event) => event.description(), - EventType::MessageIngest(event) => event.description(), - EventType::Security(event) => event.description(), - EventType::Ai(event) => event.description(), - EventType::WebDav(event) => event.description(), - EventType::Calendar(event) => event.description(), - EventType::Dns(event) => event.description(), - } - } - - pub fn explain(&self) -> &'static str { - match self { - EventType::Store(event) => event.explain(), - EventType::Jmap(event) => event.explain(), - EventType::Imap(event) => event.explain(), - EventType::ManageSieve(event) => event.explain(), - EventType::Pop3(event) => event.explain(), - EventType::Smtp(event) => event.explain(), - EventType::Network(event) => event.explain(), - EventType::Limit(event) => event.explain(), - EventType::Manage(event) => event.explain(), - EventType::Auth(event) => event.explain(), - EventType::Config(event) => event.explain(), - EventType::Resource(event) => event.explain(), - EventType::Sieve(event) => event.explain(), - EventType::Spam(event) => event.explain(), - EventType::Server(event) => event.explain(), - EventType::Purge(event) => event.explain(), - EventType::Eval(event) => event.explain(), - EventType::Acme(event) => event.explain(), - EventType::Http(event) => event.explain(), - EventType::Arc(event) => event.explain(), - EventType::Dkim(event) => event.explain(), - EventType::Dmarc(event) => event.explain(), - EventType::Iprev(event) => event.explain(), - EventType::Dane(event) => event.explain(), - EventType::Spf(event) => event.explain(), - EventType::MailAuth(event) => event.explain(), - EventType::Tls(event) => event.explain(), - EventType::PushSubscription(event) => event.explain(), - EventType::Cluster(event) => event.explain(), - EventType::Housekeeper(event) => event.explain(), - EventType::TaskQueue(event) => event.explain(), - EventType::Milter(event) => event.explain(), - EventType::MtaHook(event) => event.explain(), - EventType::Delivery(event) => event.explain(), - EventType::Queue(event) => event.explain(), - EventType::TlsRpt(event) => event.explain(), - EventType::MtaSts(event) => event.explain(), - EventType::IncomingReport(event) => event.explain(), - EventType::OutgoingReport(event) => event.explain(), - EventType::Telemetry(event) => event.explain(), - EventType::MessageIngest(event) => event.explain(), - EventType::Security(event) => event.explain(), - EventType::Ai(event) => event.explain(), - EventType::WebDav(event) => event.explain(), - EventType::Calendar(event) => event.explain(), - EventType::Dns(event) => event.explain(), - } - } -} - -impl HttpEvent { - pub fn description(&self) -> &'static str { - match self { - HttpEvent::Error => "HTTP error occurred", - HttpEvent::RequestUrl => "HTTP request URL", - HttpEvent::RequestBody => "HTTP request body", - HttpEvent::ResponseBody => "HTTP response body", - HttpEvent::XForwardedMissing => "X-Forwarded-For header is missing", - HttpEvent::ConnectionStart => "HTTP connection started", - HttpEvent::ConnectionEnd => "HTTP connection ended", - } - } - - pub fn explain(&self) -> &'static str { - match self { - HttpEvent::Error => "An error occurred during an HTTP request", - HttpEvent::RequestUrl => "The URL of an HTTP request", - HttpEvent::RequestBody => "The body of an HTTP request", - HttpEvent::ResponseBody => "The body of an HTTP response", - HttpEvent::XForwardedMissing => "The X-Forwarded-For header is missing", - HttpEvent::ConnectionStart => "An HTTP connection was started", - HttpEvent::ConnectionEnd => "An HTTP connection was ended", - } - } -} - -impl ClusterEvent { - pub fn description(&self) -> &'static str { - match self { - ClusterEvent::SubscriberStart => "PubSub subscriber started", - ClusterEvent::SubscriberStop => "PubSub subscriber stopped", - ClusterEvent::SubscriberError => "PubSub subscriber error", - ClusterEvent::SubscriberDisconnected => "PubSub subscriber disconnected", - ClusterEvent::PublisherStart => "PubSub publisher started", - ClusterEvent::PublisherStop => "PubSub publisher stopped", - ClusterEvent::PublisherError => "PubSub publisher error", - ClusterEvent::MessageReceived => "PubSub message received", - ClusterEvent::MessageSkipped => "PubSub message skipped", - ClusterEvent::MessageInvalid => "Invalid PubSub message", - } - } - - pub fn explain(&self) -> &'static str { - match self { - ClusterEvent::SubscriberStart => "The PubSub subscriber has started", - ClusterEvent::SubscriberStop => "The PubSub subscriber has stopped", - ClusterEvent::SubscriberError => "An error occurred while subscribing to PubSub", - ClusterEvent::SubscriberDisconnected => "The PubSub subscriber has disconnected", - ClusterEvent::PublisherStart => "The PubSub publisher has started", - ClusterEvent::PublisherStop => "The PubSub publisher has stopped", - ClusterEvent::PublisherError => "An error occurred while publishing to PubSub", - ClusterEvent::MessageReceived => "A message was received from the PubSub server", - ClusterEvent::MessageSkipped => "A message originating from this node was skipped", - ClusterEvent::MessageInvalid => { - "An invalid message was received from the PubSub server" - } - } - } -} - -impl HousekeeperEvent { - pub fn description(&self) -> &'static str { - match self { - HousekeeperEvent::Start => "Housekeeper process started", - HousekeeperEvent::Stop => "Housekeeper process stopped", - HousekeeperEvent::Schedule => "Housekeeper task scheduled", - HousekeeperEvent::Run => "Housekeeper task run", - } - } - - pub fn explain(&self) -> &'static str { - match self { - HousekeeperEvent::Start => "The housekeeper process has started", - HousekeeperEvent::Stop => "The housekeeper process has stopped", - HousekeeperEvent::Schedule => "A housekeeper task has been scheduled", - HousekeeperEvent::Run => "A housekeeper task is running", - } - } -} - -impl TaskQueueEvent { - pub fn description(&self) -> &'static str { - match self { - TaskQueueEvent::TaskAcquired => "Task acquired from queue", - TaskQueueEvent::TaskLocked => "Task is locked by another process", - TaskQueueEvent::BlobNotFound => "Blob not found for task", - TaskQueueEvent::MetadataNotFound => "Metadata not found for task", - TaskQueueEvent::TaskIgnored => "Task ignored based on current server roles", - TaskQueueEvent::TaskFailed => "Task failed during processing", - } - } - - pub fn explain(&self) -> &'static str { - match self { - TaskQueueEvent::TaskAcquired => "A task has been acquired from the queue", - TaskQueueEvent::TaskLocked => "The task id is locked by another process", - TaskQueueEvent::BlobNotFound => "The requested blob was not found for task", - TaskQueueEvent::MetadataNotFound => "The metadata was not found for task", - TaskQueueEvent::TaskIgnored => "The task was ignored based on the current server roles", - TaskQueueEvent::TaskFailed => "The task failed during processing", - } - } -} - -impl ImapEvent { - pub fn description(&self) -> &'static str { - match self { - ImapEvent::GetAcl => "IMAP GET ACL command", - ImapEvent::SetAcl => "IMAP SET ACL command", - ImapEvent::MyRights => "IMAP MYRIGHTS command", - ImapEvent::ListRights => "IMAP LISTRIGHTS command", - ImapEvent::Append => "IMAP APPEND command", - ImapEvent::Capabilities => "IMAP CAPABILITIES command", - ImapEvent::Id => "IMAP ID command", - ImapEvent::Close => "IMAP CLOSE command", - ImapEvent::Copy => "IMAP COPY command", - ImapEvent::Move => "IMAP MOVE command", - ImapEvent::CreateMailbox => "IMAP CREATE mailbox command", - ImapEvent::DeleteMailbox => "IMAP DELETE mailbox command", - ImapEvent::RenameMailbox => "IMAP RENAME mailbox command", - ImapEvent::Enable => "IMAP ENABLE command", - ImapEvent::Expunge => "IMAP EXPUNGE command", - ImapEvent::Fetch => "IMAP FETCH command", - ImapEvent::IdleStart => "IMAP IDLE start", - ImapEvent::IdleStop => "IMAP IDLE stop", - ImapEvent::List => "IMAP LIST command", - ImapEvent::Lsub => "IMAP LSUB command", - ImapEvent::Logout => "IMAP LOGOUT command", - ImapEvent::Namespace => "IMAP NAMESPACE command", - ImapEvent::Noop => "IMAP NOOP command", - ImapEvent::Search => "IMAP SEARCH command", - ImapEvent::Sort => "IMAP SORT command", - ImapEvent::Select => "IMAP SELECT command", - ImapEvent::Status => "IMAP STATUS command", - ImapEvent::Store => "IMAP STORE command", - ImapEvent::Subscribe => "IMAP SUBSCRIBE command", - ImapEvent::Unsubscribe => "IMAP UNSUBSCRIBE command", - ImapEvent::Thread => "IMAP THREAD command", - ImapEvent::Error => "IMAP error occurred", - ImapEvent::RawInput => "Raw IMAP input received", - ImapEvent::RawOutput => "Raw IMAP output sent", - ImapEvent::ConnectionStart => "IMAP connection started", - ImapEvent::ConnectionEnd => "IMAP connection ended", - ImapEvent::GetQuota => "IMAP GETQUOTA command", - } - } - - pub fn explain(&self) -> &'static str { - match self { - ImapEvent::GetAcl => "Client requested mailbox ACL", - ImapEvent::SetAcl => "Client set mailbox ACL", - ImapEvent::MyRights => "Client requested mailbox rights", - ImapEvent::ListRights => "Client requested mailbox rights list", - ImapEvent::Append => "Client appended a message to a mailbox", - ImapEvent::Capabilities => "Client requested server capabilities", - ImapEvent::Id => "Client sent an ID command", - ImapEvent::Close => "Client closed a mailbox", - ImapEvent::Copy => "Client copied messages between mailboxes", - ImapEvent::Move => "Client moved messages between mailboxes", - ImapEvent::CreateMailbox => "Client created a mailbox", - ImapEvent::DeleteMailbox => "Client deleted a mailbox", - ImapEvent::RenameMailbox => "Client renamed a mailbox", - ImapEvent::Enable => "Client enabled an extension", - ImapEvent::Expunge => "Client expunged messages", - ImapEvent::Fetch => "Client fetched messages", - ImapEvent::IdleStart => "Client started IDLE", - ImapEvent::IdleStop => "Client stopped IDLE", - ImapEvent::List => "Client listed mailboxes", - ImapEvent::Lsub => "Client listed subscribed mailboxes", - ImapEvent::Logout => "Client logged out", - ImapEvent::Namespace => "Client requested namespace", - ImapEvent::Noop => "Client sent a NOOP command", - ImapEvent::Search => "Client searched for messages", - ImapEvent::Sort => "Client sorted messages", - ImapEvent::Select => "Client selected a mailbox", - ImapEvent::Status => "Client requested mailbox status", - ImapEvent::Store => "Client stored flags", - ImapEvent::Subscribe => "Client subscribed to a mailbox", - ImapEvent::Unsubscribe => "Client unsubscribed from a mailbox", - ImapEvent::Thread => "Client requested message threads", - ImapEvent::Error => "An error occurred during an IMAP command", - ImapEvent::RawInput => "Raw IMAP input received", - ImapEvent::RawOutput => "Raw IMAP output sent", - ImapEvent::ConnectionStart => "IMAP connection started", - ImapEvent::ConnectionEnd => "IMAP connection ended", - ImapEvent::GetQuota => "Client requested mailbox quota", - } - } -} - -impl Pop3Event { - pub fn description(&self) -> &'static str { - match self { - Pop3Event::Delete => "POP3 DELETE command", - Pop3Event::Reset => "POP3 RESET command", - Pop3Event::Quit => "POP3 QUIT command", - Pop3Event::Fetch => "POP3 FETCH command", - Pop3Event::List => "POP3 LIST command", - Pop3Event::ListMessage => "POP3 LIST specific message command", - Pop3Event::Uidl => "POP3 UIDL command", - Pop3Event::UidlMessage => "POP3 UIDL specific message command", - Pop3Event::Stat => "POP3 STAT command", - Pop3Event::Noop => "POP3 NOOP command", - Pop3Event::Capabilities => "POP3 CAPABILITIES command", - Pop3Event::StartTls => "POP3 STARTTLS command", - Pop3Event::Utf8 => "POP3 UTF8 command", - Pop3Event::Error => "POP3 error occurred", - Pop3Event::RawInput => "Raw POP3 input received", - Pop3Event::RawOutput => "Raw POP3 output sent", - Pop3Event::ConnectionStart => "POP3 connection started", - Pop3Event::ConnectionEnd => "POP3 connection ended", - } - } - - pub fn explain(&self) -> &'static str { - match self { - Pop3Event::Delete => "Client deleted a message", - Pop3Event::Reset => "Client reset the session", - Pop3Event::Quit => "Client quit the session", - Pop3Event::Fetch => "Client fetched a message", - Pop3Event::List => "Client listed messages", - Pop3Event::ListMessage => "Client listed a specific message", - Pop3Event::Uidl => "Client requested unique identifiers", - Pop3Event::UidlMessage => "Client requested a specific unique identifier", - Pop3Event::Stat => "Client requested mailbox status", - Pop3Event::Noop => "Client sent a NOOP command", - Pop3Event::Capabilities => "Client requested server capabilities", - Pop3Event::StartTls => "Client requested TLS", - Pop3Event::Utf8 => "Client requested UTF-8 support", - Pop3Event::Error => "An error occurred during a POP3 command", - Pop3Event::RawInput => "Raw POP3 input received", - Pop3Event::RawOutput => "Raw POP3 output sent", - Pop3Event::ConnectionStart => "POP3 connection started", - Pop3Event::ConnectionEnd => "POP3 connection ended", - } - } -} - -impl ManageSieveEvent { - pub fn description(&self) -> &'static str { - match self { - ManageSieveEvent::CreateScript => "ManageSieve CREATE script command", - ManageSieveEvent::UpdateScript => "ManageSieve UPDATE script command", - ManageSieveEvent::GetScript => "ManageSieve GET script command", - ManageSieveEvent::DeleteScript => "ManageSieve DELETE script command", - ManageSieveEvent::RenameScript => "ManageSieve RENAME script command", - ManageSieveEvent::CheckScript => "ManageSieve CHECK script command", - ManageSieveEvent::HaveSpace => "ManageSieve HAVESPACE command", - ManageSieveEvent::ListScripts => "ManageSieve LIST scripts command", - ManageSieveEvent::SetActive => "ManageSieve SET ACTIVE command", - ManageSieveEvent::Capabilities => "ManageSieve CAPABILITIES command", - ManageSieveEvent::StartTls => "ManageSieve STARTTLS command", - ManageSieveEvent::Unauthenticate => "ManageSieve UNAUTHENTICATE command", - ManageSieveEvent::Logout => "ManageSieve LOGOUT command", - ManageSieveEvent::Noop => "ManageSieve NOOP command", - ManageSieveEvent::Error => "ManageSieve error occurred", - ManageSieveEvent::RawInput => "Raw ManageSieve input received", - ManageSieveEvent::RawOutput => "Raw ManageSieve output sent", - ManageSieveEvent::ConnectionStart => "ManageSieve connection started", - ManageSieveEvent::ConnectionEnd => "ManageSieve connection ended", - } - } - - pub fn explain(&self) -> &'static str { - match self { - ManageSieveEvent::CreateScript => "Client created a script", - ManageSieveEvent::UpdateScript => "Client updated a script", - ManageSieveEvent::GetScript => "Client fetched a script", - ManageSieveEvent::DeleteScript => "Client deleted a script", - ManageSieveEvent::RenameScript => "Client renamed a script", - ManageSieveEvent::CheckScript => "Client checked a script", - ManageSieveEvent::HaveSpace => "Client checked for space", - ManageSieveEvent::ListScripts => "Client listed scripts", - ManageSieveEvent::SetActive => "Client set an active script", - ManageSieveEvent::Capabilities => "Client requested server capabilities", - ManageSieveEvent::StartTls => "Client requested TLS", - ManageSieveEvent::Unauthenticate => "Client unauthenticated", - ManageSieveEvent::Logout => "Client logged out", - ManageSieveEvent::Noop => "Client sent a NOOP command", - ManageSieveEvent::Error => "An error occurred during a ManageSieve command", - ManageSieveEvent::RawInput => "Raw ManageSieve input received", - ManageSieveEvent::RawOutput => "Raw ManageSieve output sent", - ManageSieveEvent::ConnectionStart => "ManageSieve connection started", - ManageSieveEvent::ConnectionEnd => "ManageSieve connection ended", - } - } -} - -impl SmtpEvent { - pub fn description(&self) -> &'static str { - match self { - SmtpEvent::Error => "SMTP error occurred", - SmtpEvent::IdNotFound => "Strategy not found", - SmtpEvent::ConcurrencyLimitExceeded => "Concurrency limit exceeded", - SmtpEvent::TransferLimitExceeded => "Transfer limit exceeded", - SmtpEvent::RateLimitExceeded => "Rate limit exceeded", - SmtpEvent::TimeLimitExceeded => "Time limit exceeded", - SmtpEvent::MissingAuthDirectory => "Missing auth directory", - SmtpEvent::MessageParseFailed => "Message parsing failed", - SmtpEvent::MessageTooLarge => "Message too large", - SmtpEvent::LoopDetected => "Mail loop detected", - SmtpEvent::DkimPass => "DKIM verification passed", - SmtpEvent::DkimFail => "DKIM verification failed", - SmtpEvent::ArcPass => "ARC verification passed", - SmtpEvent::ArcFail => "ARC verification failed", - SmtpEvent::SpfEhloPass => "SPF EHLO check passed", - SmtpEvent::SpfEhloFail => "SPF EHLO check failed", - SmtpEvent::SpfFromPass => "SPF From check passed", - SmtpEvent::SpfFromFail => "SPF From check failed", - SmtpEvent::DmarcPass => "DMARC check passed", - SmtpEvent::DmarcFail => "DMARC check failed", - SmtpEvent::IprevPass => "IPREV check passed", - SmtpEvent::IprevFail => "IPREV check failed", - SmtpEvent::TooManyMessages => "Too many messages", - SmtpEvent::Ehlo => "SMTP EHLO command", - SmtpEvent::InvalidEhlo => "Invalid EHLO command", - SmtpEvent::DidNotSayEhlo => "Client did not say EHLO", - SmtpEvent::EhloExpected => "EHLO command expected", - SmtpEvent::LhloExpected => "LHLO command expected", - SmtpEvent::MailFromUnauthenticated => "MAIL FROM without authentication", - SmtpEvent::MailFromUnauthorized => "MAIL FROM unauthorized", - SmtpEvent::MailFromRewritten => "MAIL FROM address rewritten", - SmtpEvent::MailFromMissing => "MAIL FROM address missing", - SmtpEvent::MailFromNotAllowed => "MAIL FROM not allowed", - SmtpEvent::MailFrom => "SMTP MAIL FROM command", - SmtpEvent::MultipleMailFrom => "Multiple MAIL FROM commands", - SmtpEvent::MailboxDoesNotExist => "Mailbox does not exist", - SmtpEvent::RelayNotAllowed => "Relay not allowed", - SmtpEvent::RcptTo => "SMTP RCPT TO command", - SmtpEvent::RcptToDuplicate => "Duplicate RCPT TO", - SmtpEvent::RcptToRewritten => "RCPT TO address rewritten", - SmtpEvent::RcptToMissing => "RCPT TO address missing", - SmtpEvent::RcptToGreylisted => "RCPT TO greylisted", - SmtpEvent::TooManyRecipients => "Too many recipients", - SmtpEvent::TooManyInvalidRcpt => "Too many invalid recipients", - SmtpEvent::RawInput => "Raw SMTP input received", - SmtpEvent::RawOutput => "Raw SMTP output sent", - SmtpEvent::MissingLocalHostname => "Missing local hostname", - SmtpEvent::Vrfy => "SMTP VRFY command", - SmtpEvent::VrfyNotFound => "VRFY address not found", - SmtpEvent::VrfyDisabled => "VRFY command disabled", - SmtpEvent::Expn => "SMTP EXPN command", - SmtpEvent::ExpnNotFound => "EXPN address not found", - SmtpEvent::ExpnDisabled => "EXPN command disabled", - SmtpEvent::RequireTlsDisabled => "REQUIRETLS extension disabled", - SmtpEvent::DeliverByDisabled => "DELIVERBY extension disabled", - SmtpEvent::DeliverByInvalid => "Invalid DELIVERBY parameter", - SmtpEvent::FutureReleaseDisabled => "FUTURE RELEASE extension disabled", - SmtpEvent::FutureReleaseInvalid => "Invalid FUTURE RELEASE parameter", - SmtpEvent::MtPriorityDisabled => "MT-PRIORITY extension disabled", - SmtpEvent::MtPriorityInvalid => "Invalid MT-PRIORITY parameter", - SmtpEvent::DsnDisabled => "DSN extension disabled", - SmtpEvent::AuthNotAllowed => "Authentication not allowed", - SmtpEvent::AuthMechanismNotSupported => "Auth mechanism not supported", - SmtpEvent::AuthExchangeTooLong => "Auth exchange too long", - SmtpEvent::AlreadyAuthenticated => "Already authenticated", - SmtpEvent::Noop => "SMTP NOOP command", - SmtpEvent::StartTls => "SMTP STARTTLS command", - SmtpEvent::StartTlsUnavailable => "STARTTLS unavailable", - SmtpEvent::StartTlsAlready => "TLS already active", - SmtpEvent::Rset => "SMTP RSET command", - SmtpEvent::Quit => "SMTP QUIT command", - SmtpEvent::Help => "SMTP HELP command", - SmtpEvent::CommandNotImplemented => "Command not implemented", - SmtpEvent::InvalidCommand => "Invalid command", - SmtpEvent::InvalidSenderAddress => "Invalid sender address", - SmtpEvent::InvalidRecipientAddress => "Invalid recipient address", - SmtpEvent::InvalidParameter => "Invalid parameter", - SmtpEvent::UnsupportedParameter => "Unsupported parameter", - SmtpEvent::SyntaxError => "Syntax error", - SmtpEvent::RequestTooLarge => "Request too large", - SmtpEvent::ConnectionStart => "SMTP connection started", - SmtpEvent::ConnectionEnd => "SMTP connection ended", - } - } - - pub fn explain(&self) -> &'static str { - match self { - SmtpEvent::Error => "An error occurred during an SMTP command", - SmtpEvent::IdNotFound => "The strategy ID was not found in the configuration", - SmtpEvent::ConcurrencyLimitExceeded => "The concurrency limit was exceeded", - SmtpEvent::TransferLimitExceeded => { - "The remote host transferred more data than allowed" - } - SmtpEvent::RateLimitExceeded => "The rate limit was exceeded", - SmtpEvent::TimeLimitExceeded => "The remote host kept the SMTP session open too long", - SmtpEvent::MissingAuthDirectory => "The auth directory was missing", - SmtpEvent::MessageParseFailed => "Failed to parse the message", - SmtpEvent::MessageTooLarge => "The message was rejected because it was too large", - SmtpEvent::LoopDetected => { - "A mail loop was detected, the message contains too many Received headers" - } - SmtpEvent::DkimPass => "Successful DKIM verification", - SmtpEvent::DkimFail => "Failed to verify DKIM signature", - SmtpEvent::ArcPass => "Successful ARC verification", - SmtpEvent::ArcFail => "Failed to verify ARC signature", - SmtpEvent::SpfEhloPass => "EHLO identity passed SPF check", - SmtpEvent::SpfEhloFail => "EHLO identity failed SPF check", - SmtpEvent::SpfFromPass => "MAIL FROM identity passed SPF check", - SmtpEvent::SpfFromFail => "MAIL FROM identity failed SPF check", - SmtpEvent::DmarcPass => "Successful DMARC verification", - SmtpEvent::DmarcFail => "Failed to verify DMARC policy", - SmtpEvent::IprevPass => "Reverse IP check passed", - SmtpEvent::IprevFail => "Reverse IP check failed", - SmtpEvent::TooManyMessages => { - "The remote server exceeded the number of messages allowed per session" - } - SmtpEvent::Ehlo => "The remote server sent an EHLO command", - SmtpEvent::InvalidEhlo => "The remote server sent an invalid EHLO command", - SmtpEvent::DidNotSayEhlo => "The remote server did not send EHLO command", - SmtpEvent::EhloExpected => { - "The remote server sent a LHLO command while EHLO was expected" - } - SmtpEvent::LhloExpected => { - "The remote server sent an EHLO command while LHLO was expected" - } - SmtpEvent::MailFromUnauthenticated => { - "The remote client did not authenticate before sending MAIL FROM" - } - SmtpEvent::MailFromUnauthorized => { - "The remote client is not authorized to send mail from the given address" - } - SmtpEvent::MailFromRewritten => "The envelope sender address was rewritten", - SmtpEvent::MailFromMissing => { - "The remote client issued an RCPT TO command before MAIL FROM" - } - SmtpEvent::MailFromNotAllowed => { - "The remote client is not allowed to send mail from this address" - } - SmtpEvent::MailFrom => "The remote client sent a MAIL FROM command", - SmtpEvent::MultipleMailFrom => "The remote client already sent a MAIL FROM command", - SmtpEvent::MailboxDoesNotExist => "The mailbox does not exist on the server", - SmtpEvent::RelayNotAllowed => "The server does not allow relaying", - SmtpEvent::RcptTo => "The remote client sent an RCPT TO command", - SmtpEvent::RcptToDuplicate => { - "The remote client already sent an RCPT TO command for this recipient" - } - SmtpEvent::RcptToRewritten => "The envelope recipient address was rewritten", - SmtpEvent::RcptToMissing => "The remote client issued a DATA command before RCPT TO", - SmtpEvent::RcptToGreylisted => "The recipient was greylisted", - SmtpEvent::TooManyRecipients => { - "The remote client exceeded the number of recipients allowed" - } - SmtpEvent::TooManyInvalidRcpt => { - "The remote client exceeded the number of invalid RCPT TO commands allowed" - } - SmtpEvent::RawInput => "Raw SMTP input received", - SmtpEvent::RawOutput => "Raw SMTP output sent", - SmtpEvent::MissingLocalHostname => "The local hostname is missing in the configuration", - SmtpEvent::Vrfy => "The remote client sent a VRFY command", - SmtpEvent::VrfyNotFound => { - "The remote client sent a VRFY command for an address that was not found" - } - SmtpEvent::VrfyDisabled => "The VRFY command is disabled", - SmtpEvent::Expn => "The remote client sent an EXPN command", - SmtpEvent::ExpnNotFound => { - "The remote client sent an EXPN command for an address that was not found" - } - SmtpEvent::ExpnDisabled => "The EXPN command is disabled", - SmtpEvent::RequireTlsDisabled => "The REQUIRETLS extension is disabled", - SmtpEvent::DeliverByDisabled => "The DELIVERBY extension is disabled", - SmtpEvent::DeliverByInvalid => "The DELIVERBY parameter is invalid", - SmtpEvent::FutureReleaseDisabled => "The FUTURE RELEASE extension is disabled", - SmtpEvent::FutureReleaseInvalid => "The FUTURE RELEASE parameter is invalid", - SmtpEvent::MtPriorityDisabled => "The MT-PRIORITY extension is disabled", - SmtpEvent::MtPriorityInvalid => "The MT-PRIORITY parameter is invalid", - SmtpEvent::DsnDisabled => "The DSN extension is disabled", - SmtpEvent::AuthNotAllowed => "Authentication is not allowed on this listener", - SmtpEvent::AuthMechanismNotSupported => { - "The requested authentication mechanism is not supported" - } - SmtpEvent::AuthExchangeTooLong => "The authentication exchange was too long", - SmtpEvent::AlreadyAuthenticated => "The client is already authenticated", - SmtpEvent::Noop => "The remote client sent a NOOP command", - SmtpEvent::StartTls => "The remote client requested a TLS connection", - SmtpEvent::StartTlsUnavailable => { - "The remote client requested a TLS connection but it is not available" - } - SmtpEvent::Rset => "The remote client sent a RSET command", - SmtpEvent::Quit => "The remote client sent a QUIT command", - SmtpEvent::Help => "The remote client sent a HELP command", - SmtpEvent::CommandNotImplemented => { - "The server does not implement the requested command" - } - SmtpEvent::InvalidCommand => "The remote client sent an invalid command", - SmtpEvent::InvalidSenderAddress => "The specified sender address is invalid", - SmtpEvent::InvalidRecipientAddress => "The specified recipient address is invalid", - SmtpEvent::InvalidParameter => "The command contained an invalid parameter", - SmtpEvent::UnsupportedParameter => "The command contained an unsupported parameter", - SmtpEvent::SyntaxError => "The command contained a syntax error", - SmtpEvent::RequestTooLarge => "The request was too large", - SmtpEvent::ConnectionStart => "A new SMTP connection was started", - SmtpEvent::ConnectionEnd => "The SMTP connection was ended", - SmtpEvent::StartTlsAlready => "TLS is already active", - } - } -} - -impl DeliveryEvent { - pub fn description(&self) -> &'static str { - match self { - DeliveryEvent::AttemptStart => "Delivery attempt started", - DeliveryEvent::AttemptEnd => "Delivery attempt ended", - DeliveryEvent::Completed => "Delivery completed", - DeliveryEvent::Failed => "Delivery failed", - DeliveryEvent::DomainDeliveryStart => "New delivery attempt for domain", - DeliveryEvent::MxLookup => "MX record lookup", - DeliveryEvent::MxLookupFailed => "MX record lookup failed", - DeliveryEvent::IpLookup => "IP address lookup", - DeliveryEvent::IpLookupFailed => "IP address lookup failed", - DeliveryEvent::NullMx => "Null MX record found", - DeliveryEvent::Connect => "Connecting to remote server", - DeliveryEvent::ConnectError => "Connection error", - DeliveryEvent::MissingOutboundHostname => "Missing outbound hostname in configuration", - DeliveryEvent::GreetingFailed => "SMTP greeting failed", - DeliveryEvent::Ehlo => "SMTP EHLO command", - DeliveryEvent::EhloRejected => "SMTP EHLO rejected", - DeliveryEvent::Auth => "SMTP authentication", - DeliveryEvent::AuthFailed => "SMTP authentication failed", - DeliveryEvent::MailFrom => "SMTP MAIL FROM command", - DeliveryEvent::MailFromRejected => "SMTP MAIL FROM rejected", - DeliveryEvent::Delivered => "Message delivered", - DeliveryEvent::RcptTo => "SMTP RCPT TO command", - DeliveryEvent::RcptToRejected => "SMTP RCPT TO rejected", - DeliveryEvent::RcptToFailed => "SMTP RCPT TO failed", - DeliveryEvent::MessageRejected => "Message rejected by remote server", - DeliveryEvent::StartTls => "SMTP STARTTLS command", - DeliveryEvent::StartTlsUnavailable => "STARTTLS unavailable", - DeliveryEvent::StartTlsError => "STARTTLS error", - DeliveryEvent::StartTlsDisabled => "STARTTLS disabled", - DeliveryEvent::ImplicitTlsError => "Implicit TLS error", - DeliveryEvent::ConcurrencyLimitExceeded => "Concurrency limit exceeded", - DeliveryEvent::RateLimitExceeded => "Rate limit exceeded", - DeliveryEvent::DoubleBounce => "Discarding message after double bounce", - DeliveryEvent::DsnSuccess => "DSN success notification", - DeliveryEvent::DsnTempFail => "DSN temporary failure notification", - DeliveryEvent::DsnPermFail => "DSN permanent failure notification", - DeliveryEvent::RawInput => "Raw SMTP input received", - DeliveryEvent::RawOutput => "Raw SMTP output sent", - } - } - - pub fn explain(&self) -> &'static str { - match self { - DeliveryEvent::AttemptStart => "A new delivery attempt for the message has started", - DeliveryEvent::AttemptEnd => "The delivery attempt has ended", - DeliveryEvent::Completed => "Delivery was completed for all recipients", - DeliveryEvent::Failed => "Message delivery failed due to a temporary error", - DeliveryEvent::DomainDeliveryStart => "A new delivery attempt for a domain has started", - DeliveryEvent::MxLookup => "Looking up MX records for the domain", - DeliveryEvent::MxLookupFailed => "Failed to look up MX records for the domain", - DeliveryEvent::IpLookup => "Looking up IP address for the domain", - DeliveryEvent::IpLookupFailed => "Failed to look up IP address for the domain", - DeliveryEvent::NullMx => "The domain has a null MX record, delivery is impossible", - DeliveryEvent::Connect => "Connecting to the remote server", - DeliveryEvent::ConnectError => "Error connecting to the remote server", - DeliveryEvent::MissingOutboundHostname => { - "The outbound hostname is missing in the configuration" - } - DeliveryEvent::GreetingFailed => { - "Failed to read the SMTP greeting from the remote server" - } - DeliveryEvent::Ehlo => "The EHLO command was sent to the remote server", - DeliveryEvent::EhloRejected => "The remote server rejected the EHLO command", - DeliveryEvent::Auth => "Authenticating with the remote server", - DeliveryEvent::AuthFailed => "Authentication with the remote server failed", - DeliveryEvent::MailFrom => "The MAIL FROM command was sent to the remote server", - DeliveryEvent::MailFromRejected => "The remote server rejected the MAIL FROM command", - DeliveryEvent::Delivered => "The message was delivered to the recipient", - DeliveryEvent::RcptTo => "The RCPT TO command was sent to the remote server", - DeliveryEvent::RcptToRejected => "The remote server rejected the RCPT TO command", - DeliveryEvent::RcptToFailed => { - "Failed to send the RCPT TO command to the remote server" - } - DeliveryEvent::MessageRejected => "The remote server rejected the message", - DeliveryEvent::StartTls => "Requesting a TLS connection with the remote server", - DeliveryEvent::StartTlsUnavailable => "The remote server does not support STARTTLS", - DeliveryEvent::StartTlsError => "It was not possible to establish a TLS connection", - DeliveryEvent::StartTlsDisabled => { - "STARTTLS has been disabled in the configuration for this host" - } - DeliveryEvent::ImplicitTlsError => "Error starting implicit TLS", - DeliveryEvent::ConcurrencyLimitExceeded => { - "The concurrency limit was exceeded for the remote host" - } - DeliveryEvent::RateLimitExceeded => "The rate limit was exceeded for the remote host", - DeliveryEvent::DoubleBounce => "The message was discarded after a double bounce", - DeliveryEvent::DsnSuccess => "A success delivery status notification was created", - DeliveryEvent::DsnTempFail => { - "A temporary failure delivery status notification was created" - } - DeliveryEvent::DsnPermFail => { - "A permanent failure delivery status notification was created" - } - DeliveryEvent::RawInput => "Raw SMTP input received", - DeliveryEvent::RawOutput => "Raw SMTP output sent", - } - } -} - -impl QueueEvent { - pub fn description(&self) -> &'static str { - match self { - QueueEvent::Rescheduled => "Message rescheduled for delivery", - QueueEvent::Locked => "Queue event is locked by another process", - QueueEvent::BlobNotFound => "Message blob not found", - QueueEvent::RateLimitExceeded => "Rate limit exceeded", - QueueEvent::ConcurrencyLimitExceeded => "Concurrency limit exceeded", - QueueEvent::QuotaExceeded => "Quota exceeded", - QueueEvent::QueueMessage => "Queued message for delivery", - QueueEvent::QueueMessageAuthenticated => "Queued message submission for delivery", - QueueEvent::QueueReport => "Queued report for delivery", - QueueEvent::QueueDsn => "Queued DSN for delivery", - QueueEvent::QueueAutogenerated => "Queued autogenerated message for delivery", - QueueEvent::BackPressure => "Queue backpressure detected", - } - } - - pub fn explain(&self) -> &'static str { - match self { - QueueEvent::Rescheduled => "The message was rescheduled for delivery", - QueueEvent::Locked => "The queue event is locked by another process", - QueueEvent::BlobNotFound => "The message blob was not found", - QueueEvent::RateLimitExceeded => "The queue rate limit was exceeded", - QueueEvent::ConcurrencyLimitExceeded => "The queue concurrency limit was exceeded", - QueueEvent::QuotaExceeded => "The queue quota was exceeded", - QueueEvent::QueueMessage => "A new message was queued for delivery", - QueueEvent::QueueMessageAuthenticated => { - "A new message was queued for delivery from an authenticated client" - } - QueueEvent::QueueReport => "A new report was queued for delivery", - QueueEvent::QueueDsn => "A delivery status notification was queued for delivery", - QueueEvent::QueueAutogenerated => "A system generated message was queued for delivery", - QueueEvent::BackPressure => { - "Queue congested, processing can't keep up with incoming message rate" - } - } - } -} - -impl IncomingReportEvent { - pub fn description(&self) -> &'static str { - match self { - IncomingReportEvent::DmarcReport => "DMARC report received", - IncomingReportEvent::DmarcReportWithWarnings => "DMARC report received with warnings", - IncomingReportEvent::TlsReport => "TLS report received", - IncomingReportEvent::TlsReportWithWarnings => "TLS report received with warnings", - IncomingReportEvent::AbuseReport => "Abuse report received", - IncomingReportEvent::AuthFailureReport => "Authentication failure report received", - IncomingReportEvent::FraudReport => "Fraud report received", - IncomingReportEvent::NotSpamReport => "Not spam report received", - IncomingReportEvent::VirusReport => "Virus report received", - IncomingReportEvent::OtherReport => "Other type of report received", - IncomingReportEvent::MessageParseFailed => "Failed to parse incoming report message", - IncomingReportEvent::DmarcParseFailed => "Failed to parse DMARC report", - IncomingReportEvent::TlsRpcParseFailed => "Failed to parse TLS RPC report", - IncomingReportEvent::ArfParseFailed => "Failed to parse ARF report", - IncomingReportEvent::DecompressError => "Error decompressing report", - } - } - - pub fn explain(&self) -> &'static str { - match self { - IncomingReportEvent::DmarcReport => "A DMARC report has been received", - IncomingReportEvent::DmarcReportWithWarnings => { - "A DMARC report with warnings has been received" - } - IncomingReportEvent::TlsReport => "A TLS report has been received", - IncomingReportEvent::TlsReportWithWarnings => { - "A TLS report with warnings has been received" - } - IncomingReportEvent::AbuseReport => "An abuse report has been received", - IncomingReportEvent::AuthFailureReport => { - "An authentication failure report has been received" - } - IncomingReportEvent::FraudReport => "A fraud report has been received", - IncomingReportEvent::NotSpamReport => "A not spam report has been received", - IncomingReportEvent::VirusReport => "A virus report has been received", - IncomingReportEvent::OtherReport => "An unknown type of report has been received", - IncomingReportEvent::MessageParseFailed => { - "Failed to parse the incoming report message" - } - IncomingReportEvent::DmarcParseFailed => "Failed to parse the DMARC report", - IncomingReportEvent::TlsRpcParseFailed => "Failed to parse the TLS RPC report", - IncomingReportEvent::ArfParseFailed => "Failed to parse the ARF report", - IncomingReportEvent::DecompressError => "Error decompressing the report", - } - } -} - -impl OutgoingReportEvent { - pub fn description(&self) -> &'static str { - match self { - OutgoingReportEvent::SpfReport => "SPF report sent", - OutgoingReportEvent::SpfRateLimited => "SPF report rate limited", - OutgoingReportEvent::DkimReport => "DKIM report sent", - OutgoingReportEvent::DkimRateLimited => "DKIM report rate limited", - OutgoingReportEvent::DmarcReport => "DMARC report sent", - OutgoingReportEvent::DmarcRateLimited => "DMARC report rate limited", - OutgoingReportEvent::DmarcAggregateReport => "DMARC aggregate is being prepared", - OutgoingReportEvent::TlsAggregate => "TLS aggregate report is being prepared", - OutgoingReportEvent::HttpSubmission => "Report submitted via HTTP", - OutgoingReportEvent::UnauthorizedReportingAddress => "Unauthorized reporting address", - OutgoingReportEvent::ReportingAddressValidationError => { - "Error validating reporting address" - } - OutgoingReportEvent::NotFound => "Report not found", - OutgoingReportEvent::SubmissionError => "Error submitting report", - OutgoingReportEvent::NoRecipientsFound => "No recipients found for report", - OutgoingReportEvent::Locked => "Report is locked by another process", - } - } - - pub fn explain(&self) -> &'static str { - match self { - OutgoingReportEvent::SpfReport => "An SPF report has been sent", - OutgoingReportEvent::SpfRateLimited => "The SPF report was rate limited", - OutgoingReportEvent::DkimReport => "A DKIM report has been sent", - OutgoingReportEvent::DkimRateLimited => "The DKIM report was rate limited", - OutgoingReportEvent::DmarcReport => "A DMARC report has been sent", - OutgoingReportEvent::DmarcRateLimited => "The DMARC report was rate limited", - OutgoingReportEvent::DmarcAggregateReport => "A DMARC aggregate report will be sent", - OutgoingReportEvent::TlsAggregate => "A TLS aggregate report will be sent", - OutgoingReportEvent::HttpSubmission => "The report was submitted via HTTP", - OutgoingReportEvent::UnauthorizedReportingAddress => { - "The reporting address is not authorized to send reports" - } - OutgoingReportEvent::ReportingAddressValidationError => { - "Error validating the reporting address" - } - OutgoingReportEvent::NotFound => "The report was not found", - OutgoingReportEvent::SubmissionError => "Error submitting the report", - OutgoingReportEvent::NoRecipientsFound => "No recipients found for the report", - OutgoingReportEvent::Locked => "The report is locked by another process", - } - } -} - -impl MtaStsEvent { - pub fn description(&self) -> &'static str { - match self { - MtaStsEvent::Authorized => "Host authorized by MTA-STS policy", - MtaStsEvent::NotAuthorized => "Host not authorized by MTA-STS policy", - MtaStsEvent::PolicyFetch => "Fetched MTA-STS policy", - MtaStsEvent::PolicyNotFound => "MTA-STS policy not found", - MtaStsEvent::PolicyFetchError => "Error fetching MTA-STS policy", - MtaStsEvent::InvalidPolicy => "Invalid MTA-STS policy", - } - } - - pub fn explain(&self) -> &'static str { - match self { - MtaStsEvent::Authorized => "The host is authorized by the MTA-STS policy", - MtaStsEvent::NotAuthorized => "The host is not authorized by the MTA-STS policy", - MtaStsEvent::PolicyFetch => "The MTA-STS policy has been fetched", - MtaStsEvent::PolicyNotFound => "An MTA-STS policy was not found", - MtaStsEvent::PolicyFetchError => "An error occurred while fetching the MTA-STS policy", - MtaStsEvent::InvalidPolicy => "The MTA-STS policy is invalid", - } - } -} - -impl TlsRptEvent { - pub fn description(&self) -> &'static str { - match self { - TlsRptEvent::RecordFetch => "Fetched TLS-RPT record", - TlsRptEvent::RecordFetchError => "Error fetching TLS-RPT record", - TlsRptEvent::RecordNotFound => "TLS-RPT record not found", - } - } - - pub fn explain(&self) -> &'static str { - match self { - TlsRptEvent::RecordFetch => "The TLS-RPT record has been fetched", - TlsRptEvent::RecordFetchError => "An error occurred while fetching the TLS-RPT record", - TlsRptEvent::RecordNotFound => "No TLS-RPT records were found", - } - } -} - -impl DaneEvent { - pub fn description(&self) -> &'static str { - match self { - DaneEvent::AuthenticationSuccess => "DANE authentication successful", - DaneEvent::AuthenticationFailure => "DANE authentication failed", - DaneEvent::NoCertificatesFound => "No certificates found for DANE", - DaneEvent::CertificateParseError => "Error parsing certificate for DANE", - DaneEvent::TlsaRecordMatch => "TLSA record match found", - DaneEvent::TlsaRecordFetch => "Fetching TLSA record", - DaneEvent::TlsaRecordFetchError => "Error fetching TLSA record", - DaneEvent::TlsaRecordNotFound => "TLSA record not found", - DaneEvent::TlsaRecordNotDnssecSigned => "TLSA record not DNSSEC signed", - DaneEvent::TlsaRecordInvalid => "Invalid TLSA record", - } - } - - pub fn explain(&self) -> &'static str { - match self { - DaneEvent::AuthenticationSuccess => "Successful DANE authentication", - DaneEvent::AuthenticationFailure => "Failed DANE authentication", - DaneEvent::NoCertificatesFound => "No certificates were found for DANE", - DaneEvent::CertificateParseError => "An error occurred while parsing the certificate", - DaneEvent::TlsaRecordMatch => "A TLSA record match was found", - DaneEvent::TlsaRecordFetch => "The TLSA record has been fetched", - DaneEvent::TlsaRecordFetchError => "An error occurred while fetching the TLSA record", - DaneEvent::TlsaRecordNotFound => "The TLSA record was not found", - DaneEvent::TlsaRecordNotDnssecSigned => "The TLSA record is not DNSSEC signed", - DaneEvent::TlsaRecordInvalid => "The TLSA record is invalid", - } - } -} - -impl MilterEvent { - pub fn description(&self) -> &'static str { - match self { - MilterEvent::Read => "Reading from Milter", - MilterEvent::Write => "Writing to Milter", - MilterEvent::ActionAccept => "Milter action: Accept", - MilterEvent::ActionDiscard => "Milter action: Discard", - MilterEvent::ActionReject => "Milter action: Reject", - MilterEvent::ActionTempFail => "Milter action: Temporary failure", - MilterEvent::ActionReplyCode => "Milter action: Reply code", - MilterEvent::ActionConnectionFailure => "Milter action: Connection failure", - MilterEvent::ActionShutdown => "Milter action: Shutdown", - MilterEvent::IoError => "Milter I/O error", - MilterEvent::FrameTooLarge => "Milter frame too large", - MilterEvent::FrameInvalid => "Invalid Milter frame", - MilterEvent::UnexpectedResponse => "Unexpected Milter response", - MilterEvent::Timeout => "Milter timeout", - MilterEvent::TlsInvalidName => "Invalid TLS name for Milter", - MilterEvent::Disconnected => "Milter disconnected", - MilterEvent::ParseError => "Milter parse error", - } - } - - pub fn explain(&self) -> &'static str { - match self { - MilterEvent::Read => "Reading from the Milter", - MilterEvent::Write => "Writing to the Milter", - MilterEvent::ActionAccept => "The Milter requested to accept the message", - MilterEvent::ActionDiscard => "The Milter requested to discard the message", - MilterEvent::ActionReject => "The Milter requested to reject the message", - MilterEvent::ActionTempFail => "The Milter requested to temporarily fail the message", - MilterEvent::ActionReplyCode => "The Milter requested a reply code", - MilterEvent::ActionConnectionFailure => "The Milter requested a connection failure", - MilterEvent::ActionShutdown => "The Milter requested a shutdown", - MilterEvent::IoError => "An I/O error occurred with the Milter", - MilterEvent::FrameTooLarge => "The Milter frame was too large", - MilterEvent::FrameInvalid => "The Milter frame was invalid", - MilterEvent::UnexpectedResponse => { - "An unexpected response was received from the Milter" - } - MilterEvent::Timeout => "A timeout occurred with the Milter", - MilterEvent::TlsInvalidName => "The Milter TLS name is invalid", - MilterEvent::Disconnected => "The Milter disconnected", - MilterEvent::ParseError => "An error occurred while parsing the Milter response", - } - } -} - -impl MtaHookEvent { - pub fn description(&self) -> &'static str { - match self { - MtaHookEvent::ActionAccept => "MTA hook action: Accept", - MtaHookEvent::ActionDiscard => "MTA hook action: Discard", - MtaHookEvent::ActionReject => "MTA hook action: Reject", - MtaHookEvent::ActionQuarantine => "MTA hook action: Quarantine", - MtaHookEvent::Error => "MTA hook error", - } - } - - pub fn explain(&self) -> &'static str { - match self { - MtaHookEvent::ActionAccept => "The MTA hook requested to accept the message", - MtaHookEvent::ActionDiscard => "The MTA hook requested to discard the message", - MtaHookEvent::ActionReject => "The MTA hook requested to reject the message", - MtaHookEvent::ActionQuarantine => "The MTA hook requested to quarantine the message", - MtaHookEvent::Error => "An error occurred with the MTA hook", - } - } -} - -impl PushSubscriptionEvent { - pub fn description(&self) -> &'static str { - match self { - PushSubscriptionEvent::Success => "Push subscription successful", - PushSubscriptionEvent::Error => "Push subscription error", - PushSubscriptionEvent::NotFound => "Push subscription not found", - } - } - - pub fn explain(&self) -> &'static str { - match self { - PushSubscriptionEvent::Success => "The push subscription was successful", - PushSubscriptionEvent::Error => "An error occurred with the push subscription", - PushSubscriptionEvent::NotFound => "The push subscription was not found", - } - } -} - -impl SpamEvent { - pub fn description(&self) -> &'static str { - match self { - SpamEvent::Pyzor => "Pyzor success", - SpamEvent::PyzorError => "Pyzor error", - SpamEvent::Classify => "Classifying message for spam", - SpamEvent::Dnsbl => "DNSBL query", - SpamEvent::DnsblError => "Error querying DNSBL", - SpamEvent::TrainStarted => "Spam classifier training started", - SpamEvent::TrainCompleted => "Spam classifier training completed", - SpamEvent::TrainSampleAdded => "New training sample added", - SpamEvent::TrainSampleNotFound => "Training sample not found", - SpamEvent::ModelLoaded => "Spam classifier model loaded", - SpamEvent::ModelNotReady => "Spam classifier model not ready", - SpamEvent::ModelNotFound => "Spam classifier model not found", - } - } - - pub fn explain(&self) -> &'static str { - match self { - SpamEvent::PyzorError => "An error occurred with Pyzor", - SpamEvent::Classify => "The message is being classified for spam", - SpamEvent::Pyzor => "Pyzor query successful", - SpamEvent::Dnsbl => "The DNSBL query was successful", - SpamEvent::DnsblError => "An error occurred while querying the DNSBL", - SpamEvent::TrainStarted => "SGD logistic regression training has started", - SpamEvent::TrainCompleted => "SGD logistic regression training has completed", - SpamEvent::TrainSampleAdded => "A new training sample has been added", - SpamEvent::TrainSampleNotFound => "A training sample was not found", - SpamEvent::ModelLoaded => "The spam classifier model has been loaded", - SpamEvent::ModelNotReady => { - "The spam classifier model has not been trained with enough data" - } - SpamEvent::ModelNotFound => "The spam classifier model has not been trained yet", - } - } -} - -impl SieveEvent { - pub fn description(&self) -> &'static str { - match self { - SieveEvent::ActionAccept => "Sieve action: Accept", - SieveEvent::ActionAcceptReplace => "Sieve action: Accept and replace", - SieveEvent::ActionDiscard => "Sieve action: Discard", - SieveEvent::ActionReject => "Sieve action: Reject", - SieveEvent::SendMessage => "Sieve sending message", - SieveEvent::MessageTooLarge => "Sieve message too large", - SieveEvent::ScriptNotFound => "Sieve script not found", - SieveEvent::ListNotFound => "Sieve list not found", - SieveEvent::RuntimeError => "Sieve runtime error", - SieveEvent::UnexpectedError => "Unexpected Sieve error", - SieveEvent::NotSupported => "Sieve action not supported", - SieveEvent::QuotaExceeded => "Sieve quota exceeded", - } - } - - pub fn explain(&self) -> &'static str { - match self { - SieveEvent::ActionAccept => "The Sieve script requested to accept the message", - SieveEvent::ActionAcceptReplace => { - "The Sieve script requested to accept the message and replace its contents" - } - SieveEvent::ActionDiscard => "The Sieve script requested to discard the message", - SieveEvent::ActionReject => "The Sieve script requested to reject the message", - SieveEvent::SendMessage => "The Sieve script is sending a message", - SieveEvent::MessageTooLarge => "The Sieve message is too large", - SieveEvent::ScriptNotFound => "The Sieve script was not found", - SieveEvent::ListNotFound => "The Sieve list was not found", - SieveEvent::RuntimeError => "A runtime error occurred with the Sieve script", - SieveEvent::UnexpectedError => "An unexpected error occurred with the Sieve script", - SieveEvent::NotSupported => "The Sieve action is not supported", - SieveEvent::QuotaExceeded => "The Sieve quota was exceeded", - } - } -} - -impl TlsEvent { - pub fn description(&self) -> &'static str { - match self { - TlsEvent::Handshake => "TLS handshake", - TlsEvent::HandshakeError => "TLS handshake error", - TlsEvent::NotConfigured => "TLS not configured", - TlsEvent::CertificateNotFound => "TLS certificate not found", - TlsEvent::NoCertificatesAvailable => "No TLS certificates available", - TlsEvent::MultipleCertificatesAvailable => "Multiple TLS certificates available", - } - } - - pub fn explain(&self) -> &'static str { - match self { - TlsEvent::Handshake => "Successful TLS handshake", - TlsEvent::HandshakeError => "An error occurred during the TLS handshake", - TlsEvent::NotConfigured => "TLS is not configured", - TlsEvent::CertificateNotFound => "The TLS certificate was not found", - TlsEvent::NoCertificatesAvailable => "No TLS certificates are available", - TlsEvent::MultipleCertificatesAvailable => "Multiple TLS certificates are available", - } - } -} - -impl NetworkEvent { - pub fn description(&self) -> &'static str { - match self { - NetworkEvent::ListenStart => "Network listener started", - NetworkEvent::ListenStop => "Network listener stopped", - NetworkEvent::ListenError => "Network listener error", - NetworkEvent::BindError => "Network bind error", - NetworkEvent::ReadError => "Network read error", - NetworkEvent::WriteError => "Network write error", - NetworkEvent::FlushError => "Network flush error", - NetworkEvent::AcceptError => "Network accept error", - NetworkEvent::SplitError => "Network split error", - NetworkEvent::Timeout => "Network timeout", - NetworkEvent::Closed => "Network connection closed", - NetworkEvent::ProxyError => "Proxy protocol error", - NetworkEvent::SetOptError => "Network set option error", - } - } - - pub fn explain(&self) -> &'static str { - match self { - NetworkEvent::ListenStart => "The network listener has started", - NetworkEvent::ListenStop => "The network listener has stopped", - NetworkEvent::ListenError => "An error occurred with the network listener", - NetworkEvent::BindError => "An error occurred while binding the network listener", - NetworkEvent::ReadError => "An error occurred while reading from the network", - NetworkEvent::WriteError => "An error occurred while writing to the network", - NetworkEvent::FlushError => "An error occurred while flushing the network", - NetworkEvent::AcceptError => "An error occurred while accepting a network connection", - NetworkEvent::SplitError => "An error occurred while splitting the network connection", - NetworkEvent::Timeout => "A network timeout occurred", - NetworkEvent::Closed => "The network connection was closed", - NetworkEvent::ProxyError => "An error occurred with the proxy protocol", - NetworkEvent::SetOptError => "An error occurred while setting network options", - } - } -} - -impl ServerEvent { - pub fn description(&self) -> &'static str { - match self { - ServerEvent::Startup => { - concat!("Starting Stalwart Server v", env!("CARGO_PKG_VERSION")) - } - ServerEvent::Shutdown => { - concat!("Shutting down Stalwart Server v", env!("CARGO_PKG_VERSION")) - } - ServerEvent::StartupError => "Server startup error", - ServerEvent::ThreadError => "Server thread error", - ServerEvent::Licensing => "Server licensing event", - } - } - - pub fn explain(&self) -> &'static str { - match self { - ServerEvent::Startup => "Stalwart Server has started", - ServerEvent::Shutdown => "Stalwart Server is shutting down", - ServerEvent::StartupError => "An error occurred while starting the server", - ServerEvent::ThreadError => "An error occurred with a server thread", - ServerEvent::Licensing => "A licensing event occurred", - } - } -} - -impl TelemetryEvent { - pub fn description(&self) -> &'static str { - match self { - TelemetryEvent::Alert => "Alert triggered", - TelemetryEvent::LogError => "Log collector error", - TelemetryEvent::WebhookError => "Webhook collector error", - TelemetryEvent::JournalError => "Journal collector error", - TelemetryEvent::OtelExporterError => "OpenTelemetry exporter error", - TelemetryEvent::OtelMetricsExporterError => "OpenTelemetry metrics exporter error", - TelemetryEvent::PrometheusExporterError => "Prometheus exporter error", - } - } - - pub fn explain(&self) -> &'static str { - match self { - TelemetryEvent::Alert => "An alert was triggered", - TelemetryEvent::LogError => "An error occurred with the log collector", - TelemetryEvent::WebhookError => "An error occurred with the webhook collector", - TelemetryEvent::JournalError => "An error occurred with the journal collector", - TelemetryEvent::OtelExporterError => { - "An error occurred with the OpenTelemetry exporter" - } - TelemetryEvent::OtelMetricsExporterError => { - "An error occurred with the OpenTelemetry metrics exporter" - } - TelemetryEvent::PrometheusExporterError => { - "An error occurred with the Prometheus exporter" - } - } - } -} - -impl AcmeEvent { - pub fn description(&self) -> &'static str { - match self { - AcmeEvent::AuthStart => "ACME authentication started", - AcmeEvent::AuthPending => "ACME authentication pending", - AcmeEvent::AuthValid => "ACME authentication valid", - AcmeEvent::AuthCompleted => "ACME authentication completed", - AcmeEvent::AuthError => "ACME authentication error", - AcmeEvent::AuthTooManyAttempts => "Too many ACME authentication attempts", - AcmeEvent::ProcessCert => "Processing ACME certificate", - AcmeEvent::OrderStart => "ACME order started", - AcmeEvent::OrderProcessing => "ACME order processing", - AcmeEvent::OrderCompleted => "ACME order completed", - AcmeEvent::OrderReady => "ACME order ready", - AcmeEvent::OrderValid => "ACME order valid", - AcmeEvent::OrderInvalid => "ACME order invalid", - AcmeEvent::RenewBackoff => "ACME renew backoff", - AcmeEvent::ClientSuppliedSni => "ACME client supplied SNI", - AcmeEvent::ClientMissingSni => "ACME client missing SNI", - AcmeEvent::TlsAlpnReceived => "ACME TLS ALPN received", - AcmeEvent::TlsAlpnError => "ACME TLS ALPN error", - AcmeEvent::TokenNotFound => "ACME token not found", - AcmeEvent::Error => "ACME error", - } - } - - pub fn explain(&self) -> &'static str { - match self { - AcmeEvent::AuthStart => "ACME authentication has started", - AcmeEvent::AuthPending => "ACME authentication is pending", - AcmeEvent::AuthValid => "ACME authentication is valid", - AcmeEvent::AuthCompleted => "ACME authentication has completed", - AcmeEvent::AuthError => "An error occurred with ACME authentication", - AcmeEvent::AuthTooManyAttempts => "Too many ACME authentication attempts", - AcmeEvent::ProcessCert => "Processing the ACME certificate", - AcmeEvent::OrderStart => "ACME order has started", - AcmeEvent::OrderProcessing => "ACME order is processing", - AcmeEvent::OrderCompleted => "ACME order has completed", - AcmeEvent::OrderReady => "ACME order is ready", - AcmeEvent::OrderValid => "ACME order is valid", - AcmeEvent::OrderInvalid => "ACME order is invalid", - AcmeEvent::RenewBackoff => "ACME renew backoff", - AcmeEvent::ClientSuppliedSni => "ACME client supplied SNI", - AcmeEvent::ClientMissingSni => "ACME client missing SNI", - AcmeEvent::TlsAlpnReceived => "ACME TLS ALPN received", - AcmeEvent::TlsAlpnError => "ACME TLS ALPN error", - AcmeEvent::TokenNotFound => "ACME token not found", - AcmeEvent::Error => "An error occurred with ACME", - } - } -} - -impl DnsEvent { - pub fn description(&self) -> &'static str { - match self { - DnsEvent::RecordCreated => "DNS record created", - DnsEvent::RecordCreationFailed => "DNS record creation failed", - DnsEvent::RecordDeletionFailed => "DNS record deletion failed", - DnsEvent::RecordNotPropagated => "DNS record not propagated", - DnsEvent::RecordLookupFailed => "DNS record lookup failed", - DnsEvent::RecordPropagated => "DNS record propagated", - DnsEvent::RecordPropagationTimeout => "DNS record propagation timeout", - DnsEvent::BuildError => "DNS updater build error", - } - } - - pub fn explain(&self) -> &'static str { - match self { - DnsEvent::RecordCreated => "DNS record has been created", - DnsEvent::RecordCreationFailed => "Failed to create DNS record", - DnsEvent::RecordDeletionFailed => "Failed to delete DNS record", - DnsEvent::RecordNotPropagated => "DNS record has not propagated", - DnsEvent::RecordLookupFailed => "Failed to look up DNS record", - DnsEvent::RecordPropagated => "DNS record has propagated", - DnsEvent::RecordPropagationTimeout => "DNS record propagation timeout", - DnsEvent::BuildError => "An error occurred while building the DNS updater", - } - } -} - -impl PurgeEvent { - pub fn description(&self) -> &'static str { - match self { - PurgeEvent::Started => "Purge started", - PurgeEvent::Finished => "Purge finished", - PurgeEvent::Running => "Purge running", - PurgeEvent::Error => "Purge error", - PurgeEvent::InProgress => "Active purge in progress", - PurgeEvent::AutoExpunge => "Auto-expunge executed", - PurgeEvent::BlobCleanup => "Blob storage cleanup completed", - } - } - - pub fn explain(&self) -> &'static str { - match self { - PurgeEvent::Started => "The purge has started", - PurgeEvent::Finished => "The purge has finished", - PurgeEvent::Running => "The purge is running", - PurgeEvent::Error => "An error occurred with the purge", - PurgeEvent::InProgress => "An active purge is in progress", - PurgeEvent::AutoExpunge => "Auto-expunge has been executed", - PurgeEvent::BlobCleanup => "Blob storage cleanup has completed", - } - } -} - -impl EvalEvent { - pub fn description(&self) -> &'static str { - match self { - EvalEvent::Result => "Expression evaluation result", - EvalEvent::Error => "Expression evaluation error", - EvalEvent::DirectoryNotFound => "Directory not found while evaluating expression", - EvalEvent::StoreNotFound => "Store not found while evaluating expression", - } - } - - pub fn explain(&self) -> &'static str { - match self { - EvalEvent::Result => "The expression evaluation has a result", - EvalEvent::Error => "An error occurred while evaluating the expression", - EvalEvent::DirectoryNotFound => { - "The directory was not found while evaluating the expression" - } - EvalEvent::StoreNotFound => "The store was not found while evaluating the expression", - } - } -} - -impl ConfigEvent { - pub fn description(&self) -> &'static str { - match self { - ConfigEvent::ParseError => "Configuration parse error", - ConfigEvent::BuildError => "Configuration build error", - ConfigEvent::MacroError => "Configuration macro error", - ConfigEvent::WriteError => "Configuration write error", - ConfigEvent::FetchError => "Configuration fetch error", - ConfigEvent::DefaultApplied => "Default configuration applied", - ConfigEvent::MissingSetting => "Missing configuration setting", - ConfigEvent::UnusedSetting => "Unused configuration setting", - ConfigEvent::ParseWarning => "Configuration parse warning", - ConfigEvent::BuildWarning => "Configuration build warning", - ConfigEvent::ImportExternal => "Importing external configuration", - ConfigEvent::AlreadyUpToDate => "Configuration already up to date", - } - } - - pub fn explain(&self) -> &'static str { - match self { - ConfigEvent::ParseError => "An error occurred while parsing the configuration", - ConfigEvent::BuildError => "An error occurred while building the configuration", - ConfigEvent::MacroError => "An error occurred with a configuration macro", - ConfigEvent::WriteError => "An error occurred while writing the configuration", - ConfigEvent::FetchError => "An error occurred while fetching the configuration", - ConfigEvent::DefaultApplied => "The default configuration has been applied", - ConfigEvent::MissingSetting => "A configuration setting is missing", - ConfigEvent::UnusedSetting => "A configuration setting is unused", - ConfigEvent::ParseWarning => "A warning occurred while parsing the configuration", - ConfigEvent::BuildWarning => "A warning occurred while building the configuration", - ConfigEvent::ImportExternal => "An external configuration is being imported", - ConfigEvent::AlreadyUpToDate => "The configuration is already up to date", - } - } -} - -impl ArcEvent { - pub fn description(&self) -> &'static str { - match self { - ArcEvent::ChainTooLong => "ARC chain too long", - ArcEvent::InvalidInstance => "Invalid ARC instance", - ArcEvent::InvalidCv => "Invalid ARC CV", - ArcEvent::HasHeaderTag => "ARC has header tag", - ArcEvent::BrokenChain => "Broken ARC chain", - ArcEvent::SealerNotFound => "ARC sealer not found", - } - } - - pub fn explain(&self) -> &'static str { - match self { - ArcEvent::ChainTooLong => "The ARC chain is too long", - ArcEvent::InvalidInstance => "The ARC instance is invalid", - ArcEvent::InvalidCv => "The ARC CV is invalid", - ArcEvent::HasHeaderTag => "The ARC has a header tag", - ArcEvent::BrokenChain => "The ARC chain is broken", - ArcEvent::SealerNotFound => "The ARC sealer was not found", - } - } -} - -impl DkimEvent { - pub fn description(&self) -> &'static str { - match self { - DkimEvent::Pass => "DKIM verification passed", - DkimEvent::Neutral => "DKIM verification neutral", - DkimEvent::Fail => "DKIM verification failed", - DkimEvent::PermError => "DKIM permanent error", - DkimEvent::TempError => "DKIM temporary error", - DkimEvent::None => "No DKIM signature", - DkimEvent::UnsupportedVersion => "Unsupported DKIM version", - DkimEvent::UnsupportedAlgorithm => "Unsupported DKIM algorithm", - DkimEvent::UnsupportedCanonicalization => "Unsupported DKIM canonicalization", - DkimEvent::UnsupportedKeyType => "Unsupported DKIM key type", - DkimEvent::FailedBodyHashMatch => "DKIM body hash mismatch", - DkimEvent::FailedVerification => "DKIM verification failed", - DkimEvent::FailedAuidMatch => "DKIM AUID mismatch", - DkimEvent::RevokedPublicKey => "DKIM public key revoked", - DkimEvent::IncompatibleAlgorithms => "Incompatible DKIM algorithms", - DkimEvent::SignatureExpired => "DKIM signature expired", - DkimEvent::SignatureLength => "DKIM signature length issue", - DkimEvent::SignerNotFound => "DKIM signer not found", - DkimEvent::BuildError => "DKIM signature build error", - } - } - - pub fn explain(&self) -> &'static str { - match self { - DkimEvent::Pass => "DKIM verification has passed", - DkimEvent::Neutral => "DKIM verification is neutral", - DkimEvent::Fail => "DKIM verification has failed", - DkimEvent::PermError => "A permanent error occurred with DKIM", - DkimEvent::TempError => "A temporary error occurred with DKIM", - DkimEvent::None => "No DKIM signature was found", - DkimEvent::UnsupportedVersion => "The DKIM version is unsupported", - DkimEvent::UnsupportedAlgorithm => "The DKIM algorithm is unsupported", - DkimEvent::UnsupportedCanonicalization => "The DKIM canonicalization is unsupported", - DkimEvent::UnsupportedKeyType => "The DKIM key type is unsupported", - DkimEvent::FailedBodyHashMatch => "The DKIM body hash does not match", - DkimEvent::FailedVerification => "The DKIM verification has failed", - DkimEvent::FailedAuidMatch => "The DKIM AUID does not match", - DkimEvent::RevokedPublicKey => "The DKIM public key has been revoked", - DkimEvent::IncompatibleAlgorithms => "The DKIM algorithms are incompatible", - DkimEvent::SignatureExpired => "The DKIM signature has expired", - DkimEvent::SignatureLength => "The DKIM signature length is incorrect", - DkimEvent::SignerNotFound => "The DKIM signer was not found", - DkimEvent::BuildError => "An error occurred while building the DKIM signature", - } - } -} - -impl SpfEvent { - pub fn description(&self) -> &'static str { - match self { - SpfEvent::Pass => "SPF check passed", - SpfEvent::Fail => "SPF check failed", - SpfEvent::SoftFail => "SPF soft fail", - SpfEvent::Neutral => "SPF neutral result", - SpfEvent::TempError => "SPF temporary error", - SpfEvent::PermError => "SPF permanent error", - SpfEvent::None => "No SPF record", - } - } - - pub fn explain(&self) -> &'static str { - match self { - SpfEvent::Pass => "The SPF check has passed", - SpfEvent::Fail => "The SPF check has failed", - SpfEvent::SoftFail => "The SPF check has soft failed", - SpfEvent::Neutral => "The SPF result is neutral", - SpfEvent::TempError => "A temporary error occurred with SPF", - SpfEvent::PermError => "A permanent error occurred with SPF", - SpfEvent::None => "No SPF record was found", - } - } -} - -impl DmarcEvent { - pub fn description(&self) -> &'static str { - match self { - DmarcEvent::Pass => "DMARC check passed", - DmarcEvent::Fail => "DMARC check failed", - DmarcEvent::PermError => "DMARC permanent error", - DmarcEvent::TempError => "DMARC temporary error", - DmarcEvent::None => "No DMARC record", - } - } - - pub fn explain(&self) -> &'static str { - match self { - DmarcEvent::Pass => "The DMARC check has passed", - DmarcEvent::Fail => "The DMARC check has failed", - DmarcEvent::PermError => "A permanent error occurred with DMARC", - DmarcEvent::TempError => "A temporary error occurred with DMARC", - DmarcEvent::None => "No DMARC record was found", - } - } -} - -impl IprevEvent { - pub fn description(&self) -> &'static str { - match self { - IprevEvent::Pass => "IPREV check passed", - IprevEvent::Fail => "IPREV check failed", - IprevEvent::PermError => "IPREV permanent error", - IprevEvent::TempError => "IPREV temporary error", - IprevEvent::None => "No IPREV record", - } - } - - pub fn explain(&self) -> &'static str { - match self { - IprevEvent::Pass => "The IPREV check has passed", - IprevEvent::Fail => "The IPREV check has failed", - IprevEvent::PermError => "A permanent error occurred with IPREV", - IprevEvent::TempError => "A temporary error occurred with IPREV", - IprevEvent::None => "No IPREV record was found", - } - } -} - -impl MailAuthEvent { - pub fn description(&self) -> &'static str { - match self { - MailAuthEvent::ParseError => "Mail authentication parse error", - MailAuthEvent::MissingParameters => "Missing mail authentication parameters", - MailAuthEvent::NoHeadersFound => "No headers found in message", - MailAuthEvent::Crypto => "Crypto error during mail authentication", - MailAuthEvent::Io => "I/O error during mail authentication", - MailAuthEvent::Base64 => "Base64 error during mail authentication", - MailAuthEvent::DnsError => "DNS error", - MailAuthEvent::DnsRecordNotFound => "DNS record not found", - MailAuthEvent::DnsInvalidRecordType => "Invalid DNS record type", - MailAuthEvent::PolicyNotAligned => "Policy not aligned", - } - } - - pub fn explain(&self) -> &'static str { - match self { - MailAuthEvent::ParseError => "An error occurred while parsing mail authentication", - MailAuthEvent::MissingParameters => "Mail authentication parameters are missing", - MailAuthEvent::NoHeadersFound => "No headers were found in the message", - MailAuthEvent::Crypto => "A crypto error occurred during mail authentication", - MailAuthEvent::Io => "An I/O error occurred during mail authentication", - MailAuthEvent::Base64 => "A base64 error occurred during mail authentication", - MailAuthEvent::DnsError => "A DNS error occurred", - MailAuthEvent::DnsRecordNotFound => "The DNS record was not found", - MailAuthEvent::DnsInvalidRecordType => "The DNS record type is invalid", - MailAuthEvent::PolicyNotAligned => "The policy is not aligned", - } - } -} - -impl StoreEvent { - pub fn description(&self) -> &'static str { - match self { - StoreEvent::AssertValueFailed => "Another process modified the record", - StoreEvent::FoundationdbError => "FoundationDB error", - StoreEvent::MysqlError => "MySQL error", - StoreEvent::PostgresqlError => "PostgreSQL error", - StoreEvent::RocksdbError => "RocksDB error", - StoreEvent::SqliteError => "SQLite error", - StoreEvent::LdapError => "LDAP error", - StoreEvent::ElasticsearchError => "ElasticSearch error", - StoreEvent::RedisError => "Redis error", - StoreEvent::S3Error => "S3 error", - StoreEvent::AzureError => "Azure error", - StoreEvent::FilesystemError => "Filesystem error", - StoreEvent::PoolError => "Connection pool error", - StoreEvent::DataCorruption => "Data corruption detected", - StoreEvent::DecompressError => "Decompression error", - StoreEvent::DeserializeError => "Deserialization error", - StoreEvent::NotFound => "Record not found in database", - StoreEvent::NotConfigured => "Store not configured", - StoreEvent::NotSupported => "Operation not supported by store", - StoreEvent::UnexpectedError => "Unexpected store error", - StoreEvent::CryptoError => "Store crypto error", - StoreEvent::BlobMissingMarker => "Blob missing marker", - StoreEvent::SqlQuery => "SQL query executed", - StoreEvent::LdapQuery => "LDAP query executed", - StoreEvent::LdapWarning => "LDAP authentication warning", - StoreEvent::DataWrite => "Write batch operation", - StoreEvent::BlobRead => "Blob read operation", - StoreEvent::BlobWrite => "Blob write operation", - StoreEvent::BlobDelete => "Blob delete operation", - StoreEvent::DataIterate => "Data store iteration operation", - StoreEvent::HttpStoreFetch => "HTTP store updated", - StoreEvent::HttpStoreError => "Error updating HTTP store", - StoreEvent::CacheMiss => "Cache miss", - StoreEvent::CacheHit => "Cache hit", - StoreEvent::CacheStale => "Cache is stale", - StoreEvent::CacheUpdate => "Cache update", - StoreEvent::MeilisearchError => "Meilisearch error", - } - } - - pub fn explain(&self) -> &'static str { - match self { - StoreEvent::AssertValueFailed => "Another process modified the record", - StoreEvent::FoundationdbError => "A FoundationDB error occurred", - StoreEvent::MysqlError => "A MySQL error occurred", - StoreEvent::PostgresqlError => "A PostgreSQL error occurred", - StoreEvent::RocksdbError => "A RocksDB error occurred", - StoreEvent::SqliteError => "An SQLite error occurred", - StoreEvent::LdapError => "An LDAP error occurred", - StoreEvent::ElasticsearchError => "An ElasticSearch error occurred", - StoreEvent::RedisError => "A Redis error occurred", - StoreEvent::S3Error => "An S3 error occurred", - StoreEvent::AzureError => "An Azure error occurred", - StoreEvent::FilesystemError => "A filesystem error occurred", - StoreEvent::PoolError => "A connection pool error occurred", - StoreEvent::DataCorruption => "Data corruption was detected", - StoreEvent::DecompressError => "A decompression error occurred", - StoreEvent::DeserializeError => "A deserialization error occurred", - StoreEvent::NotFound => "The record was not found in the database", - StoreEvent::NotConfigured => "The store is not configured", - StoreEvent::NotSupported => "The operation is not supported by the store", - StoreEvent::UnexpectedError => "An unexpected store error occurred", - StoreEvent::CryptoError => "A store crypto error occurred", - StoreEvent::BlobMissingMarker => "The blob is missing a marker", - StoreEvent::SqlQuery => "An SQL query was executed", - StoreEvent::LdapQuery => "An LDAP query was executed", - StoreEvent::LdapWarning => "An LDAP authentication warning occurred", - StoreEvent::DataWrite => "A write batch operation was executed", - StoreEvent::BlobRead => "A blob read operation was executed", - StoreEvent::BlobWrite => "A blob write operation was executed", - StoreEvent::BlobDelete => "A blob delete operation was executed", - StoreEvent::DataIterate => "A data store iteration operation was executed", - StoreEvent::HttpStoreFetch => "The HTTP store was updated", - StoreEvent::HttpStoreError => "An error occurred while updating the HTTP store", - StoreEvent::CacheMiss => "No cache entry found for the account", - StoreEvent::CacheHit => "Cache entry found for the account, no update needed", - StoreEvent::CacheStale => "Cache is too old, rebuilding", - StoreEvent::CacheUpdate => "Cache updated with latest database changes", - StoreEvent::MeilisearchError => "A Meilisearch error occurred", - } - } -} - -impl MessageIngestEvent { - pub fn description(&self) -> &'static str { - match self { - MessageIngestEvent::Ham => "Message ingested", - MessageIngestEvent::Spam => "Possible spam message ingested", - MessageIngestEvent::ImapAppend => "Message appended via IMAP", - MessageIngestEvent::JmapAppend => "Message appended via JMAP", - MessageIngestEvent::Duplicate => "Skipping duplicate message", - MessageIngestEvent::Error => "Message ingestion error", - MessageIngestEvent::FtsIndex => "Full-text search index updated", - } - } - - pub fn explain(&self) -> &'static str { - match self { - MessageIngestEvent::Ham => "The message has been ingested", - MessageIngestEvent::Spam => "A possible spam message has been ingested", - MessageIngestEvent::ImapAppend => "The message has been appended via IMAP", - MessageIngestEvent::JmapAppend => "The message has been appended via JMAP", - MessageIngestEvent::Duplicate => "The message is a duplicate and has been skipped", - MessageIngestEvent::Error => "An error occurred while ingesting the message", - MessageIngestEvent::FtsIndex => "The full-text search index has been updated", - } - } -} - -impl JmapEvent { - pub fn description(&self) -> &'static str { - match self { - JmapEvent::MethodCall => "JMAP method call", - JmapEvent::InvalidArguments => "Invalid JMAP arguments", - JmapEvent::RequestTooLarge => "JMAP request too large", - JmapEvent::StateMismatch => "JMAP state mismatch", - JmapEvent::AnchorNotFound => "JMAP anchor not found", - JmapEvent::UnsupportedFilter => "Unsupported JMAP filter", - JmapEvent::UnsupportedSort => "Unsupported JMAP sort", - JmapEvent::UnknownMethod => "Unknown JMAP method", - JmapEvent::InvalidResultReference => "Invalid JMAP result reference", - JmapEvent::Forbidden => "JMAP operation forbidden", - JmapEvent::AccountNotFound => "JMAP account not found", - JmapEvent::AccountNotSupportedByMethod => "JMAP account not supported by method", - JmapEvent::AccountReadOnly => "JMAP account is read-only", - JmapEvent::NotFound => "JMAP resource not found", - JmapEvent::CannotCalculateChanges => "Cannot calculate JMAP changes", - JmapEvent::UnknownDataType => "Unknown JMAP data type", - JmapEvent::UnknownCapability => "Unknown JMAP capability", - JmapEvent::NotJson => "JMAP request is not JSON", - JmapEvent::NotRequest => "JMAP input is not a request", - JmapEvent::WebsocketStart => "JMAP WebSocket connection started", - JmapEvent::WebsocketStop => "JMAP WebSocket connection stopped", - JmapEvent::WebsocketError => "JMAP WebSocket error", - } - } - - pub fn explain(&self) -> &'static str { - match self { - JmapEvent::MethodCall => "A JMAP method call has been made", - JmapEvent::InvalidArguments => "The JMAP arguments are invalid", - JmapEvent::RequestTooLarge => "The JMAP request is too large", - JmapEvent::StateMismatch => "The JMAP state is mismatched", - JmapEvent::AnchorNotFound => "The JMAP anchor was not found", - JmapEvent::UnsupportedFilter => "The JMAP filter is unsupported", - JmapEvent::UnsupportedSort => "The JMAP sort is unsupported", - JmapEvent::UnknownMethod => "The JMAP method is unknown", - JmapEvent::InvalidResultReference => "The JMAP result reference is invalid", - JmapEvent::Forbidden => "The JMAP operation is forbidden", - JmapEvent::AccountNotFound => "The JMAP account was not found", - JmapEvent::AccountNotSupportedByMethod => { - "The JMAP account is not supported by the method" - } - JmapEvent::AccountReadOnly => "The JMAP account is read-only", - JmapEvent::NotFound => "The JMAP resource was not found", - JmapEvent::CannotCalculateChanges => "Cannot calculate JMAP changes", - JmapEvent::UnknownDataType => "The JMAP data type is unknown", - JmapEvent::UnknownCapability => "The JMAP capability is unknown", - JmapEvent::NotJson => "The JMAP request is not JSON", - JmapEvent::NotRequest => "The JMAP input is not a request", - JmapEvent::WebsocketStart => "The JMAP WebSocket connection has started", - JmapEvent::WebsocketStop => "The JMAP WebSocket connection has stopped", - JmapEvent::WebsocketError => "An error occurred with the JMAP WebSocket connection", - } - } -} - -impl LimitEvent { - pub fn description(&self) -> &'static str { - match self { - LimitEvent::SizeRequest => "Request size limit reached", - LimitEvent::SizeUpload => "Upload size limit reached", - LimitEvent::CallsIn => "Incoming calls limit reached", - LimitEvent::ConcurrentRequest => "Concurrent request limit reached", - LimitEvent::ConcurrentUpload => "Concurrent upload limit reached", - LimitEvent::ConcurrentConnection => "Concurrent connection limit reached", - LimitEvent::Quota => "Quota limit reached", - LimitEvent::BlobQuota => "Blob quota limit reached", - LimitEvent::TooManyRequests => "Too many requests", - LimitEvent::TenantQuota => "Tenant quota limit reached", - } - } - - pub fn explain(&self) -> &'static str { - match self { - LimitEvent::SizeRequest => "The request size limit has been reached", - LimitEvent::SizeUpload => "The upload size limit has been reached", - LimitEvent::CallsIn => "The incoming calls limit has been reached", - LimitEvent::ConcurrentRequest => "The concurrent request limit has been reached", - LimitEvent::ConcurrentUpload => "The concurrent upload limit has been reached", - LimitEvent::ConcurrentConnection => "The concurrent connection limit has been reached", - LimitEvent::Quota => "The quota limit has been reached", - LimitEvent::BlobQuota => "The blob quota limit has been reached", - LimitEvent::TooManyRequests => "Too many requests have been made", - LimitEvent::TenantQuota => "One of the tenant quota limits has been reached", - } - } -} - -impl ManageEvent { - pub fn description(&self) -> &'static str { - match self { - ManageEvent::MissingParameter => "Missing parameter", - ManageEvent::AlreadyExists => "Record already exists", - ManageEvent::AssertFailed => "Assertion failed", - ManageEvent::NotFound => "Resource not found", - ManageEvent::NotSupported => "Management operation not supported", - ManageEvent::Error => "Management error", - } - } - - pub fn explain(&self) -> &'static str { - match self { - ManageEvent::MissingParameter => "A parameter is missing", - ManageEvent::AlreadyExists => "A record with the same name already exists", - ManageEvent::AssertFailed => "A management assertion has failed", - ManageEvent::NotFound => "The managed resource was not found", - ManageEvent::NotSupported => "The management operation is not supported", - ManageEvent::Error => "A management error occurred", - } - } -} - -impl AuthEvent { - pub fn description(&self) -> &'static str { - match self { - AuthEvent::Success => "Authentication successful", - AuthEvent::Failed => "Authentication failed", - AuthEvent::MissingTotp => "Missing TOTP for authentication", - AuthEvent::TooManyAttempts => "Too many authentication attempts", - AuthEvent::Error => "Authentication error", - AuthEvent::TokenExpired => "OAuth token expired", - AuthEvent::ClientRegistration => "OAuth Client registration", - } - } - - pub fn explain(&self) -> &'static str { - match self { - AuthEvent::Success => "Successful authentication", - AuthEvent::Failed => "Failed authentication", - AuthEvent::MissingTotp => "TOTP is missing for authentication", - AuthEvent::TooManyAttempts => "Too many authentication attempts have been made", - AuthEvent::Error => "An error occurred with authentication", - AuthEvent::TokenExpired => "OAuth authentication token has expired", - AuthEvent::ClientRegistration => "OAuth client successfully registered", - } - } -} - -impl ResourceEvent { - pub fn description(&self) -> &'static str { - match self { - ResourceEvent::NotFound => "Resource not found", - ResourceEvent::BadParameters => "Bad resource parameters", - ResourceEvent::Error => "Resource error", - ResourceEvent::DownloadExternal => "Downloading external resource", - ResourceEvent::WebadminUnpacked => "Webadmin resource unpacked", - } - } - - pub fn explain(&self) -> &'static str { - match self { - ResourceEvent::NotFound => "The resource was not found", - ResourceEvent::BadParameters => "The resource parameters are bad", - ResourceEvent::Error => "An error occurred with the resource", - ResourceEvent::DownloadExternal => "The external resource is being downloaded", - ResourceEvent::WebadminUnpacked => "The webadmin resource has been unpacked", - } - } -} - -impl SecurityEvent { - pub fn description(&self) -> &'static str { - match self { - SecurityEvent::AuthenticationBan => "Banned due to authentication errors", - SecurityEvent::AbuseBan => "Banned due to abuse", - SecurityEvent::LoiterBan => "Banned due to loitering", - SecurityEvent::IpBlocked => "Blocked IP address", - SecurityEvent::ScanBan => "Banned due to scan", - SecurityEvent::Unauthorized => "Unauthorized access", - } - } - - pub fn explain(&self) -> &'static str { - match self { - SecurityEvent::AuthenticationBan => { - "IP address was banned due to multiple authentication errors" - } - SecurityEvent::AbuseBan => { - "IP address was banned due to abuse, such as RCPT TO attacks" - } - SecurityEvent::ScanBan => "IP address was banned due to exploit scanning", - SecurityEvent::LoiterBan => "IP address was banned due to multiple loitering events", - SecurityEvent::IpBlocked => "Rejected connection from blocked IP address", - SecurityEvent::Unauthorized => "Account does not have permission to access resource", - } - } -} - -impl AiEvent { - pub fn description(&self) -> &'static str { - match self { - AiEvent::LlmResponse => "LLM response", - AiEvent::ApiError => "AI API error", - } - } - - pub fn explain(&self) -> &'static str { - match self { - AiEvent::LlmResponse => "An LLM response has been received", - AiEvent::ApiError => "An AI API error occurred", - } - } -} - -impl WebDavEvent { - pub fn description(&self) -> &'static str { - match self { - WebDavEvent::Propfind => "WebDAV PROPFIND request", - WebDavEvent::Proppatch => "WebDAV PROPPATCH request", - WebDavEvent::Get => "WebDAV GET request", - WebDavEvent::Report => "WebDAV REPORT request", - WebDavEvent::Mkcol => "WebDAV MKCOL request", - WebDavEvent::Delete => "WebDAV DELETE request", - WebDavEvent::Put => "WebDAV PUT request", - WebDavEvent::Post => "WebDAV POST request", - WebDavEvent::Patch => "WebDAV PATCH request", - WebDavEvent::Copy => "WebDAV COPY request", - WebDavEvent::Move => "WebDAV MOVE request", - WebDavEvent::Lock => "WebDAV LOCK request", - WebDavEvent::Unlock => "WebDAV UNLOCK request", - WebDavEvent::Acl => "WebDAV ACL request", - WebDavEvent::Error => "WebDAV error", - WebDavEvent::Head => "WebDAV HEAD request", - WebDavEvent::Mkcalendar => "WebDAV MKCALENDAR request", - WebDavEvent::Options => "WebDAV OPTIONS request", - } - } - - pub fn explain(&self) -> &'static str { - match self { - WebDavEvent::Propfind => "A PROPFIND request has been made to the server", - WebDavEvent::Proppatch => "A PROPPATCH request has been made to the server", - WebDavEvent::Get => "A GET request has been made to the server", - WebDavEvent::Report => "A REPORT request has been made to the server", - WebDavEvent::Mkcol => "A MKCOL request has been made to the server", - WebDavEvent::Delete => "A DELETE request has been made to the server", - WebDavEvent::Put => "A PUT request has been made to the server", - WebDavEvent::Post => "A POST request has been made to the server", - WebDavEvent::Patch => "A PATCH request has been made to the server", - WebDavEvent::Copy => "A COPY request has been made to the server", - WebDavEvent::Move => "A MOVE request has been made to the server", - WebDavEvent::Lock => "A LOCK request has been made to the server", - WebDavEvent::Unlock => "An UNLOCK request has been made to the server", - WebDavEvent::Acl => { - "An ACL request has been made to the - server" - } - WebDavEvent::Error => "An error occurred with the WebDAV request", - WebDavEvent::Head => "A HEAD request has been made to the server", - WebDavEvent::Mkcalendar => "A MKCALENDAR request has been made to the server", - WebDavEvent::Options => "An OPTIONS request has been made to the server", - } - } -} - -impl CalendarEvent { - pub fn description(&self) -> &'static str { - match self { - CalendarEvent::RuleExpansionError => "Calendar rule expansion error", - CalendarEvent::AlarmSent => "Calendar alarm sent", - CalendarEvent::AlarmSkipped => "Calendar alarm skipped", - CalendarEvent::AlarmRecipientOverride => "Calendar alarm recipient overriden", - CalendarEvent::AlarmFailed => "Calendar alarm could not be sent", - CalendarEvent::ItipMessageSent => "Calendar iTIP message sent", - CalendarEvent::ItipMessageReceived => "Calendar iTIP message received", - CalendarEvent::ItipMessageError => "iTIP message error", - } - } - - pub fn explain(&self) -> &'static str { - match self { - CalendarEvent::RuleExpansionError => { - "An error occurred while expanding calendar recurrences" - } - CalendarEvent::AlarmSent => "A calendar alarm has been sent to the recipient", - CalendarEvent::AlarmSkipped => "A calendar alarm was skipped", - CalendarEvent::AlarmRecipientOverride => "A calendar alarm recipient was overridden", - CalendarEvent::AlarmFailed => "A calendar alarm could not be sent to the recipient", - CalendarEvent::ItipMessageSent => "A calendar iTIP message has been sent", - CalendarEvent::ItipMessageReceived => "A calendar iTIP/iMIP message has been received", - CalendarEvent::ItipMessageError => { - "An error occurred while processing an iTIP/iMIP message" - } - } - } -} diff --git a/crates/trc/src/event/enums.rs b/crates/trc/src/event/enums.rs new file mode 100644 index 00000000..6a9a907b --- /dev/null +++ b/crates/trc/src/event/enums.rs @@ -0,0 +1,1224 @@ +/* + * SPDX-FileCopyrightText: 2020 Stalwart Labs LLC + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL + */ + +// This file is auto-generated. Do not edit directly. + +pub const TOTAL_EVENT_COUNT: usize = 593; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum EventType { + Acme(AcmeEvent), + Ai(AiEvent), + Arc(ArcEvent), + Auth(AuthEvent), + Calendar(CalendarEvent), + Cluster(ClusterEvent), + Config(ConfigEvent), + Dane(DaneEvent), + Delivery(DeliveryEvent), + Dkim(DkimEvent), + Dmarc(DmarcEvent), + Dns(DnsEvent), + Eval(EvalEvent), + Housekeeper(HousekeeperEvent), + Http(HttpEvent), + Imap(ImapEvent), + IncomingReport(IncomingReportEvent), + Iprev(IprevEvent), + Jmap(JmapEvent), + Limit(LimitEvent), + MailAuth(MailAuthEvent), + Manage(ManageEvent), + ManageSieve(ManageSieveEvent), + MessageIngest(MessageIngestEvent), + Milter(MilterEvent), + MtaHook(MtaHookEvent), + MtaSts(MtaStsEvent), + Network(NetworkEvent), + OutgoingReport(OutgoingReportEvent), + Pop3(Pop3Event), + Purge(PurgeEvent), + PushSubscription(PushSubscriptionEvent), + Queue(QueueEvent), + Resource(ResourceEvent), + Security(SecurityEvent), + Server(ServerEvent), + Sieve(SieveEvent), + Smtp(SmtpEvent), + Spam(SpamEvent), + Spf(SpfEvent), + Store(StoreEvent), + TaskQueue(TaskQueueEvent), + Telemetry(TelemetryEvent), + Tls(TlsEvent), + TlsRpt(TlsRptEvent), + WebDav(WebDavEvent), +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum AcmeEvent { + AuthStart = 3, + AuthPending = 2, + AuthValid = 5, + AuthCompleted = 0, + AuthError = 1, + AuthTooManyAttempts = 4, + ProcessCert = 22, + OrderStart = 20, + OrderProcessing = 18, + OrderCompleted = 16, + OrderReady = 19, + OrderValid = 21, + OrderInvalid = 17, + RenewBackoff = 23, + ClientSuppliedSni = 7, + ClientMissingSni = 6, + TlsAlpnReceived = 25, + TlsAlpnError = 24, + TokenNotFound = 26, + Error = 15, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum AiEvent { + LlmResponse = 556, + ApiError = 557, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum ArcEvent { + ChainTooLong = 28, + InvalidInstance = 31, + InvalidCv = 30, + HasHeaderTag = 29, + BrokenChain = 27, + SealerNotFound = 32, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum AuthEvent { + Success = 37, + Failed = 35, + TokenExpired = 554, + MissingTotp = 36, + TooManyAttempts = 38, + ClientRegistration = 555, + Error = 34, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum CalendarEvent { + RuleExpansionError = 576, + AlarmSent = 579, + AlarmSkipped = 580, + AlarmRecipientOverride = 581, + AlarmFailed = 582, + ItipMessageSent = 583, + ItipMessageReceived = 584, + ItipMessageError = 585, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum ClusterEvent { + SubscriberStart = 39, + SubscriberStop = 40, + SubscriberError = 41, + SubscriberDisconnected = 42, + PublisherStart = 43, + PublisherStop = 44, + PublisherError = 45, + MessageReceived = 46, + MessageSkipped = 47, + MessageInvalid = 49, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum ConfigEvent { + ParseError = 62, + BuildError = 54, + MacroError = 60, + WriteError = 65, + FetchError = 58, + DefaultApplied = 56, + MissingSetting = 61, + UnusedSetting = 64, + ParseWarning = 63, + BuildWarning = 55, + ImportExternal = 59, + AlreadyUpToDate = 53, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum DaneEvent { + AuthenticationSuccess = 67, + AuthenticationFailure = 66, + NoCertificatesFound = 69, + CertificateParseError = 68, + TlsaRecordMatch = 73, + TlsaRecordFetch = 70, + TlsaRecordFetchError = 71, + TlsaRecordNotFound = 75, + TlsaRecordNotDnssecSigned = 74, + TlsaRecordInvalid = 72, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum DeliveryEvent { + AttemptStart = 77, + AttemptEnd = 76, + Completed = 80, + Failed = 92, + DomainDeliveryStart = 85, + MxLookup = 101, + MxLookupFailed = 102, + IpLookup = 95, + IpLookupFailed = 96, + NullMx = 103, + Connect = 82, + ConnectError = 83, + MissingOutboundHostname = 100, + GreetingFailed = 93, + Ehlo = 90, + EhloRejected = 91, + Auth = 78, + AuthFailed = 79, + MailFrom = 97, + MailFromRejected = 98, + Delivered = 84, + RcptTo = 107, + RcptToRejected = 109, + RcptToFailed = 108, + MessageRejected = 99, + StartTls = 110, + StartTlsUnavailable = 113, + StartTlsError = 112, + StartTlsDisabled = 111, + ImplicitTlsError = 94, + ConcurrencyLimitExceeded = 81, + RateLimitExceeded = 104, + DoubleBounce = 86, + DsnSuccess = 88, + DsnTempFail = 89, + DsnPermFail = 87, + RawInput = 105, + RawOutput = 106, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum DkimEvent { + Pass = 121, + Neutral = 119, + Fail = 114, + PermError = 122, + TempError = 127, + None = 120, + UnsupportedVersion = 131, + UnsupportedAlgorithm = 128, + UnsupportedCanonicalization = 129, + UnsupportedKeyType = 130, + FailedBodyHashMatch = 116, + FailedVerification = 117, + FailedAuidMatch = 115, + RevokedPublicKey = 123, + IncompatibleAlgorithms = 118, + SignatureExpired = 124, + SignatureLength = 125, + SignerNotFound = 126, + BuildError = 592, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum DmarcEvent { + Pass = 134, + Fail = 132, + PermError = 135, + TempError = 136, + None = 133, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum DnsEvent { + RecordCreated = 8, + RecordCreationFailed = 9, + RecordDeletionFailed = 10, + RecordNotPropagated = 12, + RecordLookupFailed = 11, + RecordPropagated = 13, + RecordPropagationTimeout = 14, + BuildError = 591, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum EvalEvent { + Result = 139, + Error = 138, + DirectoryNotFound = 137, + StoreNotFound = 140, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum HousekeeperEvent { + Start = 150, + Stop = 151, + Schedule = 149, + Run = 146, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum HttpEvent { + ConnectionStart = 153, + ConnectionEnd = 152, + Error = 154, + RequestUrl = 156, + RequestBody = 155, + ResponseBody = 157, + XForwardedMissing = 158, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum ImapEvent { + ConnectionStart = 163, + ConnectionEnd = 162, + GetAcl = 171, + SetAcl = 188, + MyRights = 180, + ListRights = 176, + Append = 159, + Capabilities = 160, + Id = 172, + Close = 161, + Copy = 164, + Move = 179, + CreateMailbox = 165, + DeleteMailbox = 166, + RenameMailbox = 185, + Enable = 167, + Expunge = 169, + Fetch = 170, + IdleStart = 173, + IdleStop = 174, + List = 175, + Lsub = 178, + Logout = 177, + Namespace = 181, + Noop = 182, + Search = 186, + Sort = 189, + Select = 187, + Status = 190, + Store = 191, + Subscribe = 192, + Unsubscribe = 194, + Thread = 193, + GetQuota = 57, + Error = 168, + RawInput = 183, + RawOutput = 184, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum IncomingReportEvent { + DmarcReport = 200, + DmarcReportWithWarnings = 201, + TlsReport = 206, + TlsReportWithWarnings = 207, + AbuseReport = 195, + AuthFailureReport = 197, + FraudReport = 202, + NotSpamReport = 204, + VirusReport = 209, + OtherReport = 205, + MessageParseFailed = 203, + DmarcParseFailed = 199, + TlsRpcParseFailed = 208, + ArfParseFailed = 196, + DecompressError = 198, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum IprevEvent { + Pass = 212, + Fail = 210, + PermError = 213, + TempError = 214, + None = 211, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum JmapEvent { + MethodCall = 223, + InvalidArguments = 221, + RequestTooLarge = 227, + StateMismatch = 228, + AnchorNotFound = 218, + UnsupportedFilter = 232, + UnsupportedSort = 233, + UnknownMethod = 231, + InvalidResultReference = 222, + Forbidden = 220, + AccountNotFound = 215, + AccountNotSupportedByMethod = 216, + AccountReadOnly = 217, + NotFound = 224, + CannotCalculateChanges = 219, + UnknownDataType = 230, + UnknownCapability = 229, + NotJson = 225, + NotRequest = 226, + WebsocketStart = 235, + WebsocketStop = 236, + WebsocketError = 234, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum LimitEvent { + SizeRequest = 243, + SizeUpload = 244, + CallsIn = 238, + ConcurrentRequest = 240, + ConcurrentUpload = 241, + ConcurrentConnection = 239, + Quota = 242, + BlobQuota = 237, + TenantQuota = 553, + TooManyRequests = 245, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum MailAuthEvent { + ParseError = 254, + MissingParameters = 252, + NoHeadersFound = 253, + Crypto = 247, + Io = 251, + Base64 = 246, + DnsError = 248, + DnsRecordNotFound = 250, + DnsInvalidRecordType = 249, + PolicyNotAligned = 255, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum ManageEvent { + MissingParameter = 278, + AlreadyExists = 275, + AssertFailed = 276, + NotFound = 279, + NotSupported = 280, + Error = 277, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum ManageSieveEvent { + ConnectionStart = 259, + ConnectionEnd = 258, + CreateScript = 260, + UpdateScript = 274, + GetScript = 263, + DeleteScript = 261, + RenameScript = 270, + CheckScript = 257, + HaveSpace = 264, + ListScripts = 265, + SetActive = 271, + Capabilities = 256, + StartTls = 272, + Unauthenticate = 273, + Logout = 266, + Noop = 267, + Error = 262, + RawInput = 268, + RawOutput = 269, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum MessageIngestEvent { + Ham = 283, + Spam = 286, + ImapAppend = 284, + JmapAppend = 285, + Duplicate = 281, + Error = 282, + FtsIndex = 142, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum MilterEvent { + Read = 299, + Write = 303, + ActionAccept = 287, + ActionDiscard = 289, + ActionReject = 290, + ActionTempFail = 293, + ActionReplyCode = 291, + ActionConnectionFailure = 288, + ActionShutdown = 292, + IoError = 297, + FrameTooLarge = 296, + FrameInvalid = 295, + UnexpectedResponse = 302, + Timeout = 300, + TlsInvalidName = 301, + Disconnected = 294, + ParseError = 298, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum MtaHookEvent { + ActionAccept = 304, + ActionDiscard = 305, + ActionReject = 307, + ActionQuarantine = 306, + Error = 308, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum MtaStsEvent { + Authorized = 309, + NotAuthorized = 311, + PolicyFetch = 312, + PolicyNotFound = 314, + PolicyFetchError = 313, + InvalidPolicy = 310, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum NetworkEvent { + ListenStart = 321, + ListenStop = 322, + ListenError = 320, + BindError = 316, + ReadError = 324, + WriteError = 328, + FlushError = 319, + AcceptError = 315, + SplitError = 326, + Timeout = 327, + Closed = 317, + ProxyError = 323, + SetOptError = 325, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum OutgoingReportEvent { + SpfReport = 342, + SpfRateLimited = 341, + DkimReport = 330, + DkimRateLimited = 329, + DmarcReport = 333, + DmarcRateLimited = 332, + DmarcAggregateReport = 331, + TlsAggregate = 344, + HttpSubmission = 334, + UnauthorizedReportingAddress = 345, + ReportingAddressValidationError = 340, + NotFound = 339, + SubmissionError = 343, + NoRecipientsFound = 338, + Locked = 337, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum Pop3Event { + ConnectionStart = 348, + ConnectionEnd = 347, + Delete = 349, + Reset = 358, + Quit = 355, + Fetch = 351, + List = 352, + ListMessage = 353, + Uidl = 361, + UidlMessage = 362, + Stat = 360, + Noop = 354, + Capabilities = 346, + StartTls = 359, + Utf8 = 363, + Error = 350, + RawInput = 356, + RawOutput = 357, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum PurgeEvent { + Started = 369, + Finished = 366, + Running = 368, + Error = 365, + InProgress = 367, + AutoExpunge = 364, + BlobCleanup = 370, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum PushSubscriptionEvent { + Success = 373, + Error = 371, + NotFound = 372, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum QueueEvent { + QueueMessage = 380, + QueueMessageAuthenticated = 381, + QueueReport = 382, + QueueDsn = 379, + QueueAutogenerated = 378, + Rescheduled = 385, + Locked = 377, + BlobNotFound = 374, + RateLimitExceeded = 384, + ConcurrencyLimitExceeded = 375, + QuotaExceeded = 383, + BackPressure = 48, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum ResourceEvent { + NotFound = 389, + BadParameters = 386, + Error = 388, + DownloadExternal = 387, + WebadminUnpacked = 390, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum SecurityEvent { + AuthenticationBan = 33, + AbuseBan = 549, + ScanBan = 558, + LoiterBan = 550, + IpBlocked = 318, + Unauthorized = 552, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum ServerEvent { + Startup = 393, + Shutdown = 392, + StartupError = 394, + ThreadError = 395, + Licensing = 391, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum SieveEvent { + ActionAccept = 396, + ActionAcceptReplace = 397, + ActionDiscard = 398, + ActionReject = 399, + SendMessage = 406, + MessageTooLarge = 401, + ScriptNotFound = 405, + ListNotFound = 400, + RuntimeError = 404, + UnexpectedError = 407, + NotSupported = 402, + QuotaExceeded = 403, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum SmtpEvent { + ConnectionStart = 417, + ConnectionEnd = 416, + Error = 428, + IdNotFound = 469, + ConcurrencyLimitExceeded = 415, + TransferLimitExceeded = 485, + RateLimitExceeded = 461, + TimeLimitExceeded = 481, + MissingAuthDirectory = 452, + MessageParseFailed = 450, + MessageTooLarge = 451, + LoopDetected = 443, + DkimPass = 422, + DkimFail = 421, + ArcPass = 410, + ArcFail = 409, + SpfEhloPass = 474, + SpfEhloFail = 473, + SpfFromPass = 476, + SpfFromFail = 475, + DmarcPass = 424, + DmarcFail = 423, + IprevPass = 441, + IprevFail = 440, + TooManyMessages = 483, + Ehlo = 426, + InvalidEhlo = 436, + DidNotSayEhlo = 420, + EhloExpected = 427, + LhloExpected = 442, + MailFromUnauthenticated = 447, + MailFromUnauthorized = 448, + MailFromNotAllowed = 551, + MailFromRewritten = 446, + MailFromMissing = 445, + MailFrom = 444, + MultipleMailFrom = 456, + MailboxDoesNotExist = 449, + RelayNotAllowed = 468, + RcptTo = 464, + RcptToDuplicate = 465, + RcptToRewritten = 467, + RcptToMissing = 466, + RcptToGreylisted = 561, + TooManyRecipients = 484, + TooManyInvalidRcpt = 482, + RawInput = 462, + RawOutput = 463, + MissingLocalHostname = 453, + Vrfy = 487, + VrfyNotFound = 489, + VrfyDisabled = 488, + Expn = 429, + ExpnNotFound = 431, + ExpnDisabled = 430, + RequireTlsDisabled = 471, + DeliverByDisabled = 418, + DeliverByInvalid = 419, + FutureReleaseDisabled = 432, + FutureReleaseInvalid = 433, + MtPriorityDisabled = 454, + MtPriorityInvalid = 455, + DsnDisabled = 425, + AuthNotAllowed = 413, + AuthMechanismNotSupported = 412, + AuthExchangeTooLong = 411, + AlreadyAuthenticated = 408, + Noop = 457, + StartTls = 477, + StartTlsUnavailable = 479, + StartTlsAlready = 478, + Rset = 472, + Quit = 460, + Help = 434, + CommandNotImplemented = 414, + InvalidCommand = 435, + InvalidSenderAddress = 439, + InvalidRecipientAddress = 438, + InvalidParameter = 437, + UnsupportedParameter = 486, + SyntaxError = 480, + RequestTooLarge = 470, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum SpamEvent { + Pyzor = 564, + PyzorError = 494, + Dnsbl = 562, + DnsblError = 563, + TrainStarted = 588, + TrainCompleted = 495, + TrainSampleAdded = 143, + TrainSampleNotFound = 491, + Classify = 490, + ModelLoaded = 589, + ModelNotReady = 496, + ModelNotFound = 497, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum SpfEvent { + Pass = 501, + Fail = 498, + SoftFail = 503, + Neutral = 499, + TempError = 504, + PermError = 502, + None = 500, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum StoreEvent { + AssertValueFailed = 505, + FoundationdbError = 518, + MysqlError = 522, + PostgresqlError = 527, + RocksdbError = 529, + SqliteError = 532, + LdapError = 520, + ElasticsearchError = 516, + MeilisearchError = 590, + RedisError = 528, + S3Error = 530, + AzureError = 559, + FilesystemError = 517, + PoolError = 526, + DataCorruption = 511, + DecompressError = 514, + DeserializeError = 515, + NotFound = 524, + NotConfigured = 523, + NotSupported = 525, + UnexpectedError = 533, + CryptoError = 510, + HttpStoreError = 493, + CacheMiss = 50, + CacheHit = 51, + CacheStale = 52, + CacheUpdate = 577, + BlobMissingMarker = 507, + DataWrite = 513, + DataIterate = 512, + BlobRead = 508, + BlobWrite = 509, + BlobDelete = 506, + SqlQuery = 531, + LdapQuery = 521, + LdapWarning = 519, + HttpStoreFetch = 492, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum TaskQueueEvent { + TaskAcquired = 578, + TaskLocked = 144, + TaskIgnored = 586, + TaskFailed = 587, + BlobNotFound = 141, + MetadataNotFound = 145, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum TelemetryEvent { + Alert = 548, + LogError = 535, + WebhookError = 539, + OtelExporterError = 536, + OtelMetricsExporterError = 537, + PrometheusExporterError = 538, + JournalError = 534, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum TlsEvent { + Handshake = 543, + HandshakeError = 544, + NotConfigured = 547, + CertificateNotFound = 542, + NoCertificatesAvailable = 546, + MultipleCertificatesAvailable = 545, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum TlsRptEvent { + RecordFetch = 540, + RecordFetchError = 541, + RecordNotFound = 560, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum WebDavEvent { + Propfind = 147, + Proppatch = 148, + Get = 335, + Head = 574, + Report = 336, + Mkcol = 376, + Mkcalendar = 575, + Delete = 458, + Put = 459, + Post = 565, + Patch = 566, + Copy = 567, + Move = 568, + Lock = 569, + Unlock = 570, + Acl = 571, + Options = 573, + Error = 572, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum MetricType { + AcmeAuthError = 27, + AcmeAuthTooManyAttempts = 28, + AcmeOrderCompleted = 29, + AcmeOrderInvalid = 30, + AcmeClientMissingSni = 31, + AcmeTlsAlpnError = 32, + AcmeTokenNotFound = 33, + AcmeError = 34, + ArcChainTooLong = 39, + ArcInvalidInstance = 40, + ArcInvalidCv = 41, + ArcHasHeaderTag = 42, + ArcBrokenChain = 43, + AuthSuccess = 44, + AuthFailed = 45, + AuthTooManyAttempts = 46, + AuthError = 47, + CalendarAlarmSent = 48, + CalendarAlarmFailed = 49, + CalendarItipMessageSent = 50, + CalendarItipMessageReceived = 51, + CalendarItipMessageError = 52, + ClusterSubscriberError = 53, + ClusterSubscriberDisconnected = 54, + ClusterPublisherError = 55, + DaneAuthenticationSuccess = 56, + DaneAuthenticationFailure = 57, + DaneNoCertificatesFound = 58, + DaneCertificateParseError = 59, + DaneTlsaRecordFetchError = 60, + DaneTlsaRecordNotFound = 61, + DaneTlsaRecordNotDnssecSigned = 62, + DaneTlsaRecordInvalid = 63, + DeliveryTotalTime = 2, + DeliveryAttemptTime = 3, + DeliveryActiveConnections = 22, + DeliveryAttemptStart = 64, + DeliveryAttemptEnd = 65, + DeliveryCompleted = 66, + DeliveryMxLookupFailed = 67, + DeliveryIpLookupFailed = 68, + DeliveryNullMx = 69, + DeliveryGreetingFailed = 70, + DeliveryEhloRejected = 71, + DeliveryAuthFailed = 72, + DeliveryMailFromRejected = 73, + DeliveryDelivered = 74, + DeliveryRcptToRejected = 75, + DeliveryRcptToFailed = 76, + DeliveryMessageRejected = 77, + DeliveryStartTlsUnavailable = 78, + DeliveryStartTlsError = 79, + DeliveryStartTlsDisabled = 80, + DeliveryImplicitTlsError = 81, + DeliveryConcurrencyLimitExceeded = 82, + DeliveryRateLimitExceeded = 83, + DeliveryDoubleBounce = 84, + DeliveryDsnSuccess = 85, + DeliveryDsnTempFail = 86, + DeliveryDsnPermFail = 87, + DkimPass = 88, + DkimNeutral = 89, + DkimFail = 90, + DkimPermError = 91, + DkimTempError = 92, + DkimNone = 93, + DkimUnsupportedVersion = 94, + DkimUnsupportedAlgorithm = 95, + DkimUnsupportedCanonicalization = 96, + DkimUnsupportedKeyType = 97, + DkimFailedBodyHashMatch = 98, + DkimFailedVerification = 99, + DkimFailedAuidMatch = 100, + DkimRevokedPublicKey = 101, + DkimIncompatibleAlgorithms = 102, + DkimSignatureExpired = 103, + DkimSignatureLength = 104, + DkimSignerNotFound = 105, + DmarcPass = 106, + DmarcFail = 107, + DmarcPermError = 108, + DmarcTempError = 109, + DmarcNone = 110, + DnsLookupTime = 11, + DnsRecordCreationFailed = 35, + DnsRecordDeletionFailed = 36, + DnsRecordLookupFailed = 37, + DnsRecordPropagationTimeout = 38, + DomainCount = 26, + EvalError = 111, + EvalDirectoryNotFound = 112, + EvalStoreNotFound = 113, + HttpRequestTime = 12, + HttpActiveConnections = 17, + HttpError = 114, + HttpRequestBody = 115, + HttpResponseBody = 116, + HttpXForwardedMissing = 117, + ImapRequestTime = 13, + ImapActiveConnections = 18, + ImapConnectionStart = 118, + ImapConnectionEnd = 119, + IncomingReportDmarcReport = 120, + IncomingReportDmarcReportWithWarnings = 121, + IncomingReportTlsReport = 122, + IncomingReportTlsReportWithWarnings = 123, + IncomingReportAbuseReport = 124, + IncomingReportAuthFailureReport = 125, + IncomingReportFraudReport = 126, + IncomingReportNotSpamReport = 127, + IncomingReportVirusReport = 128, + IncomingReportOtherReport = 129, + IncomingReportMessageParseFailed = 130, + IncomingReportDmarcParseFailed = 131, + IncomingReportTlsRpcParseFailed = 132, + IncomingReportArfParseFailed = 133, + IncomingReportDecompressError = 134, + IprevPass = 135, + IprevFail = 136, + IprevPermError = 137, + IprevTempError = 138, + IprevNone = 139, + JmapMethodCall = 140, + JmapInvalidArguments = 141, + JmapRequestTooLarge = 142, + JmapUnsupportedFilter = 143, + JmapUnsupportedSort = 144, + JmapUnknownMethod = 145, + JmapForbidden = 146, + JmapNotJson = 147, + JmapNotRequest = 148, + JmapWebsocketStart = 149, + JmapWebsocketError = 150, + LimitSizeRequest = 151, + LimitSizeUpload = 152, + LimitCallsIn = 153, + LimitConcurrentRequest = 154, + LimitConcurrentUpload = 155, + LimitConcurrentConnection = 156, + LimitQuota = 157, + LimitBlobQuota = 158, + LimitTenantQuota = 159, + LimitTooManyRequests = 160, + MailAuthParseError = 161, + MailAuthMissingParameters = 162, + MailAuthNoHeadersFound = 163, + MailAuthCrypto = 164, + MailAuthIo = 165, + MailAuthBase64 = 166, + MailAuthDnsError = 167, + MailAuthDnsRecordNotFound = 168, + MailAuthDnsInvalidRecordType = 169, + MailAuthPolicyNotAligned = 170, + ManageSieveConnectionStart = 171, + ManageSieveConnectionEnd = 172, + MessageSize = 4, + MessageAuthenticatedSize = 5, + MessageIngestTime = 0, + MessageIngestIndexTime = 1, + MessageIngestHam = 173, + MessageIngestSpam = 174, + MessageIngestImapAppend = 175, + MessageIngestJmapAppend = 176, + MessageIngestDuplicate = 177, + MessageIngestError = 178, + MessageIngestFtsIndex = 179, + MilterActionAccept = 180, + MilterActionDiscard = 181, + MilterActionReject = 182, + MilterActionTempFail = 183, + MilterActionReplyCode = 184, + MilterActionConnectionFailure = 185, + MilterActionShutdown = 186, + MtaHookActionAccept = 187, + MtaHookActionDiscard = 188, + MtaHookActionReject = 189, + MtaHookActionQuarantine = 190, + MtaHookError = 191, + MtaStsAuthorized = 192, + MtaStsNotAuthorized = 193, + MtaStsInvalidPolicy = 194, + NetworkTimeout = 195, + OutgoingReportSize = 6, + OutgoingReportSpfReport = 196, + OutgoingReportSpfRateLimited = 197, + OutgoingReportDkimReport = 198, + OutgoingReportDkimRateLimited = 199, + OutgoingReportDmarcReport = 200, + OutgoingReportDmarcRateLimited = 201, + OutgoingReportDmarcAggregateReport = 202, + OutgoingReportTlsAggregate = 203, + OutgoingReportHttpSubmission = 204, + OutgoingReportUnauthorizedReportingAddress = 205, + OutgoingReportReportingAddressValidationError = 206, + OutgoingReportNotFound = 207, + OutgoingReportSubmissionError = 208, + OutgoingReportNoRecipientsFound = 209, + Pop3RequestTime = 14, + Pop3ActiveConnections = 19, + Pop3ConnectionStart = 210, + Pop3ConnectionEnd = 211, + PurgeError = 212, + PushSubscriptionSuccess = 213, + PushSubscriptionError = 214, + PushSubscriptionNotFound = 215, + QueueCount = 24, + QueueQueueMessage = 216, + QueueQueueMessageAuthenticated = 217, + QueueQueueReport = 218, + QueueQueueDsn = 219, + QueueQueueAutogenerated = 220, + QueueRescheduled = 221, + QueueBlobNotFound = 222, + QueueRateLimitExceeded = 223, + QueueConcurrencyLimitExceeded = 224, + QueueQuotaExceeded = 225, + ResourceNotFound = 226, + ResourceBadParameters = 227, + ResourceError = 228, + SecurityAuthenticationBan = 229, + SecurityAbuseBan = 230, + SecurityScanBan = 231, + SecurityLoiterBan = 232, + SecurityIpBlocked = 233, + SecurityUnauthorized = 234, + ServerMemory = 23, + ServerThreadError = 235, + SieveRequestTime = 16, + SieveActiveConnections = 21, + SieveActionAccept = 236, + SieveActionAcceptReplace = 237, + SieveActionDiscard = 238, + SieveActionReject = 239, + SieveSendMessage = 240, + SieveMessageTooLarge = 241, + SieveRuntimeError = 242, + SieveUnexpectedError = 243, + SieveNotSupported = 244, + SieveQuotaExceeded = 245, + SmtpRequestTime = 15, + SmtpActiveConnections = 20, + SmtpConnectionStart = 246, + SmtpConnectionEnd = 247, + SmtpError = 248, + SmtpConcurrencyLimitExceeded = 249, + SmtpTransferLimitExceeded = 250, + SmtpRateLimitExceeded = 251, + SmtpTimeLimitExceeded = 252, + SmtpMessageParseFailed = 253, + SmtpMessageTooLarge = 254, + SmtpLoopDetected = 255, + SmtpDkimPass = 256, + SmtpDkimFail = 257, + SmtpArcPass = 258, + SmtpArcFail = 259, + SmtpSpfEhloPass = 260, + SmtpSpfEhloFail = 261, + SmtpSpfFromPass = 262, + SmtpSpfFromFail = 263, + SmtpDmarcPass = 264, + SmtpDmarcFail = 265, + SmtpIprevPass = 266, + SmtpIprevFail = 267, + SmtpTooManyMessages = 268, + SmtpInvalidEhlo = 269, + SmtpDidNotSayEhlo = 270, + SmtpMailFromUnauthenticated = 271, + SmtpMailFromUnauthorized = 272, + SmtpMailFromMissing = 273, + SmtpMultipleMailFrom = 274, + SmtpMailboxDoesNotExist = 275, + SmtpRelayNotAllowed = 276, + SmtpRcptToDuplicate = 277, + SmtpRcptToMissing = 278, + SmtpTooManyRecipients = 279, + SmtpTooManyInvalidRcpt = 280, + SmtpAuthMechanismNotSupported = 281, + SmtpAuthExchangeTooLong = 282, + SmtpCommandNotImplemented = 283, + SmtpInvalidCommand = 284, + SmtpSyntaxError = 285, + SmtpRequestTooLarge = 286, + SpamPyzorError = 287, + SpamDnsblError = 288, + SpamTrainCompleted = 289, + SpamTrainSampleAdded = 290, + SpamClassify = 291, + SpamModelNotReady = 292, + SpfPass = 293, + SpfFail = 294, + SpfSoftFail = 295, + SpfNeutral = 296, + SpfTempError = 297, + SpfPermError = 298, + SpfNone = 299, + StoreDataReadTime = 7, + StoreDataWriteTime = 8, + StoreBlobReadTime = 9, + StoreBlobWriteTime = 10, + StoreAssertValueFailed = 300, + StoreFoundationdbError = 301, + StoreMysqlError = 302, + StorePostgresqlError = 303, + StoreRocksdbError = 304, + StoreSqliteError = 305, + StoreLdapError = 306, + StoreElasticsearchError = 307, + StoreRedisError = 308, + StoreS3Error = 309, + StoreAzureError = 310, + StoreFilesystemError = 311, + StorePoolError = 312, + StoreDataCorruption = 313, + StoreDecompressError = 314, + StoreDeserializeError = 315, + StoreNotFound = 316, + StoreNotConfigured = 317, + StoreNotSupported = 318, + StoreUnexpectedError = 319, + StoreCryptoError = 320, + StoreHttpStoreError = 321, + StoreBlobMissingMarker = 322, + StoreDataWrite = 323, + StoreDataIterate = 324, + StoreBlobRead = 325, + StoreBlobWrite = 326, + StoreBlobDelete = 327, + TaskQueueBlobNotFound = 328, + TaskQueueMetadataNotFound = 329, + TelemetryLogError = 330, + TelemetryWebhookError = 331, + TelemetryOtelExporterError = 332, + TelemetryOtelMetricsExporterError = 333, + TelemetryPrometheusExporterError = 334, + TelemetryJournalError = 335, + TlsHandshakeError = 336, + UserCount = 25, +} diff --git a/crates/trc/src/event/enums_impl.rs b/crates/trc/src/event/enums_impl.rs new file mode 100644 index 00000000..63b94563 --- /dev/null +++ b/crates/trc/src/event/enums_impl.rs @@ -0,0 +1,8329 @@ +/* + * SPDX-FileCopyrightText: 2020 Stalwart Labs LLC + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL + */ + +// This file is auto-generated. Do not edit directly. + +use crate::{event::enums::*, Level}; + +impl EventType { + pub fn parse(value: &str) -> Option { + hashify::map! { + value.as_bytes(), + EventType, + b"acme.auth-start" => EventType::Acme(AcmeEvent::AuthStart), + b"acme.auth-pending" => EventType::Acme(AcmeEvent::AuthPending), + b"acme.auth-valid" => EventType::Acme(AcmeEvent::AuthValid), + b"acme.auth-completed" => EventType::Acme(AcmeEvent::AuthCompleted), + b"acme.auth-error" => EventType::Acme(AcmeEvent::AuthError), + b"acme.auth-too-many-attempts" => EventType::Acme(AcmeEvent::AuthTooManyAttempts), + b"acme.process-cert" => EventType::Acme(AcmeEvent::ProcessCert), + b"acme.order-start" => EventType::Acme(AcmeEvent::OrderStart), + b"acme.order-processing" => EventType::Acme(AcmeEvent::OrderProcessing), + b"acme.order-completed" => EventType::Acme(AcmeEvent::OrderCompleted), + b"acme.order-ready" => EventType::Acme(AcmeEvent::OrderReady), + b"acme.order-valid" => EventType::Acme(AcmeEvent::OrderValid), + b"acme.order-invalid" => EventType::Acme(AcmeEvent::OrderInvalid), + b"acme.renew-backoff" => EventType::Acme(AcmeEvent::RenewBackoff), + b"acme.client-supplied-sni" => EventType::Acme(AcmeEvent::ClientSuppliedSni), + b"acme.client-missing-sni" => EventType::Acme(AcmeEvent::ClientMissingSni), + b"acme.tls-alpn-received" => EventType::Acme(AcmeEvent::TlsAlpnReceived), + b"acme.tls-alpn-error" => EventType::Acme(AcmeEvent::TlsAlpnError), + b"acme.token-not-found" => EventType::Acme(AcmeEvent::TokenNotFound), + b"acme.error" => EventType::Acme(AcmeEvent::Error), + b"ai.llm-response" => EventType::Ai(AiEvent::LlmResponse), + b"ai.api-error" => EventType::Ai(AiEvent::ApiError), + b"arc.chain-too-long" => EventType::Arc(ArcEvent::ChainTooLong), + b"arc.invalid-instance" => EventType::Arc(ArcEvent::InvalidInstance), + b"arc.invalid-cv" => EventType::Arc(ArcEvent::InvalidCv), + b"arc.has-header-tag" => EventType::Arc(ArcEvent::HasHeaderTag), + b"arc.broken-chain" => EventType::Arc(ArcEvent::BrokenChain), + b"arc.sealer-not-found" => EventType::Arc(ArcEvent::SealerNotFound), + b"auth.success" => EventType::Auth(AuthEvent::Success), + b"auth.failed" => EventType::Auth(AuthEvent::Failed), + b"auth.token-expired" => EventType::Auth(AuthEvent::TokenExpired), + b"auth.missing-totp" => EventType::Auth(AuthEvent::MissingTotp), + b"auth.too-many-attempts" => EventType::Auth(AuthEvent::TooManyAttempts), + b"auth.client-registration" => EventType::Auth(AuthEvent::ClientRegistration), + b"auth.error" => EventType::Auth(AuthEvent::Error), + b"calendar.rule-expansion-error" => EventType::Calendar(CalendarEvent::RuleExpansionError), + b"calendar.alarm-sent" => EventType::Calendar(CalendarEvent::AlarmSent), + b"calendar.alarm-skipped" => EventType::Calendar(CalendarEvent::AlarmSkipped), + b"calendar.alarm-recipient-override" => EventType::Calendar(CalendarEvent::AlarmRecipientOverride), + b"calendar.alarm-failed" => EventType::Calendar(CalendarEvent::AlarmFailed), + b"calendar.itip-message-sent" => EventType::Calendar(CalendarEvent::ItipMessageSent), + b"calendar.itip-message-received" => EventType::Calendar(CalendarEvent::ItipMessageReceived), + b"calendar.itip-message-error" => EventType::Calendar(CalendarEvent::ItipMessageError), + b"cluster.subscriber-start" => EventType::Cluster(ClusterEvent::SubscriberStart), + b"cluster.subscriber-stop" => EventType::Cluster(ClusterEvent::SubscriberStop), + b"cluster.subscriber-error" => EventType::Cluster(ClusterEvent::SubscriberError), + b"cluster.subscriber-disconnected" => EventType::Cluster(ClusterEvent::SubscriberDisconnected), + b"cluster.publisher-start" => EventType::Cluster(ClusterEvent::PublisherStart), + b"cluster.publisher-stop" => EventType::Cluster(ClusterEvent::PublisherStop), + b"cluster.publisher-error" => EventType::Cluster(ClusterEvent::PublisherError), + b"cluster.message-received" => EventType::Cluster(ClusterEvent::MessageReceived), + b"cluster.message-skipped" => EventType::Cluster(ClusterEvent::MessageSkipped), + b"cluster.message-invalid" => EventType::Cluster(ClusterEvent::MessageInvalid), + b"config.parse-error" => EventType::Config(ConfigEvent::ParseError), + b"config.build-error" => EventType::Config(ConfigEvent::BuildError), + b"config.macro-error" => EventType::Config(ConfigEvent::MacroError), + b"config.write-error" => EventType::Config(ConfigEvent::WriteError), + b"config.fetch-error" => EventType::Config(ConfigEvent::FetchError), + b"config.default-applied" => EventType::Config(ConfigEvent::DefaultApplied), + b"config.missing-setting" => EventType::Config(ConfigEvent::MissingSetting), + b"config.unused-setting" => EventType::Config(ConfigEvent::UnusedSetting), + b"config.parse-warning" => EventType::Config(ConfigEvent::ParseWarning), + b"config.build-warning" => EventType::Config(ConfigEvent::BuildWarning), + b"config.import-external" => EventType::Config(ConfigEvent::ImportExternal), + b"config.already-up-to-date" => EventType::Config(ConfigEvent::AlreadyUpToDate), + b"dane.authentication-success" => EventType::Dane(DaneEvent::AuthenticationSuccess), + b"dane.authentication-failure" => EventType::Dane(DaneEvent::AuthenticationFailure), + b"dane.no-certificates-found" => EventType::Dane(DaneEvent::NoCertificatesFound), + b"dane.certificate-parse-error" => EventType::Dane(DaneEvent::CertificateParseError), + b"dane.tlsa-record-match" => EventType::Dane(DaneEvent::TlsaRecordMatch), + b"dane.tlsa-record-fetch" => EventType::Dane(DaneEvent::TlsaRecordFetch), + b"dane.tlsa-record-fetch-error" => EventType::Dane(DaneEvent::TlsaRecordFetchError), + b"dane.tlsa-record-not-found" => EventType::Dane(DaneEvent::TlsaRecordNotFound), + b"dane.tlsa-record-not-dnssec-signed" => EventType::Dane(DaneEvent::TlsaRecordNotDnssecSigned), + b"dane.tlsa-record-invalid" => EventType::Dane(DaneEvent::TlsaRecordInvalid), + b"delivery.attempt-start" => EventType::Delivery(DeliveryEvent::AttemptStart), + b"delivery.attempt-end" => EventType::Delivery(DeliveryEvent::AttemptEnd), + b"delivery.completed" => EventType::Delivery(DeliveryEvent::Completed), + b"delivery.failed" => EventType::Delivery(DeliveryEvent::Failed), + b"delivery.domain-delivery-start" => EventType::Delivery(DeliveryEvent::DomainDeliveryStart), + b"delivery.mx-lookup" => EventType::Delivery(DeliveryEvent::MxLookup), + b"delivery.mx-lookup-failed" => EventType::Delivery(DeliveryEvent::MxLookupFailed), + b"delivery.ip-lookup" => EventType::Delivery(DeliveryEvent::IpLookup), + b"delivery.ip-lookup-failed" => EventType::Delivery(DeliveryEvent::IpLookupFailed), + b"delivery.null-mx" => EventType::Delivery(DeliveryEvent::NullMx), + b"delivery.connect" => EventType::Delivery(DeliveryEvent::Connect), + b"delivery.connect-error" => EventType::Delivery(DeliveryEvent::ConnectError), + b"delivery.missing-outbound-hostname" => EventType::Delivery(DeliveryEvent::MissingOutboundHostname), + b"delivery.greeting-failed" => EventType::Delivery(DeliveryEvent::GreetingFailed), + b"delivery.ehlo" => EventType::Delivery(DeliveryEvent::Ehlo), + b"delivery.ehlo-rejected" => EventType::Delivery(DeliveryEvent::EhloRejected), + b"delivery.auth" => EventType::Delivery(DeliveryEvent::Auth), + b"delivery.auth-failed" => EventType::Delivery(DeliveryEvent::AuthFailed), + b"delivery.mail-from" => EventType::Delivery(DeliveryEvent::MailFrom), + b"delivery.mail-from-rejected" => EventType::Delivery(DeliveryEvent::MailFromRejected), + b"delivery.delivered" => EventType::Delivery(DeliveryEvent::Delivered), + b"delivery.rcpt-to" => EventType::Delivery(DeliveryEvent::RcptTo), + b"delivery.rcpt-to-rejected" => EventType::Delivery(DeliveryEvent::RcptToRejected), + b"delivery.rcpt-to-failed" => EventType::Delivery(DeliveryEvent::RcptToFailed), + b"delivery.message-rejected" => EventType::Delivery(DeliveryEvent::MessageRejected), + b"delivery.start-tls" => EventType::Delivery(DeliveryEvent::StartTls), + b"delivery.start-tls-unavailable" => EventType::Delivery(DeliveryEvent::StartTlsUnavailable), + b"delivery.start-tls-error" => EventType::Delivery(DeliveryEvent::StartTlsError), + b"delivery.start-tls-disabled" => EventType::Delivery(DeliveryEvent::StartTlsDisabled), + b"delivery.implicit-tls-error" => EventType::Delivery(DeliveryEvent::ImplicitTlsError), + b"delivery.concurrency-limit-exceeded" => EventType::Delivery(DeliveryEvent::ConcurrencyLimitExceeded), + b"delivery.rate-limit-exceeded" => EventType::Delivery(DeliveryEvent::RateLimitExceeded), + b"delivery.double-bounce" => EventType::Delivery(DeliveryEvent::DoubleBounce), + b"delivery.dsn-success" => EventType::Delivery(DeliveryEvent::DsnSuccess), + b"delivery.dsn-temp-fail" => EventType::Delivery(DeliveryEvent::DsnTempFail), + b"delivery.dsn-perm-fail" => EventType::Delivery(DeliveryEvent::DsnPermFail), + b"delivery.raw-input" => EventType::Delivery(DeliveryEvent::RawInput), + b"delivery.raw-output" => EventType::Delivery(DeliveryEvent::RawOutput), + b"dkim.pass" => EventType::Dkim(DkimEvent::Pass), + b"dkim.neutral" => EventType::Dkim(DkimEvent::Neutral), + b"dkim.fail" => EventType::Dkim(DkimEvent::Fail), + b"dkim.perm-error" => EventType::Dkim(DkimEvent::PermError), + b"dkim.temp-error" => EventType::Dkim(DkimEvent::TempError), + b"dkim.none" => EventType::Dkim(DkimEvent::None), + b"dkim.unsupported-version" => EventType::Dkim(DkimEvent::UnsupportedVersion), + b"dkim.unsupported-algorithm" => EventType::Dkim(DkimEvent::UnsupportedAlgorithm), + b"dkim.unsupported-canonicalization" => EventType::Dkim(DkimEvent::UnsupportedCanonicalization), + b"dkim.unsupported-key-type" => EventType::Dkim(DkimEvent::UnsupportedKeyType), + b"dkim.failed-body-hash-match" => EventType::Dkim(DkimEvent::FailedBodyHashMatch), + b"dkim.failed-verification" => EventType::Dkim(DkimEvent::FailedVerification), + b"dkim.failed-auid-match" => EventType::Dkim(DkimEvent::FailedAuidMatch), + b"dkim.revoked-public-key" => EventType::Dkim(DkimEvent::RevokedPublicKey), + b"dkim.incompatible-algorithms" => EventType::Dkim(DkimEvent::IncompatibleAlgorithms), + b"dkim.signature-expired" => EventType::Dkim(DkimEvent::SignatureExpired), + b"dkim.signature-length" => EventType::Dkim(DkimEvent::SignatureLength), + b"dkim.signer-not-found" => EventType::Dkim(DkimEvent::SignerNotFound), + b"dkim.build-error" => EventType::Dkim(DkimEvent::BuildError), + b"dmarc.pass" => EventType::Dmarc(DmarcEvent::Pass), + b"dmarc.fail" => EventType::Dmarc(DmarcEvent::Fail), + b"dmarc.perm-error" => EventType::Dmarc(DmarcEvent::PermError), + b"dmarc.temp-error" => EventType::Dmarc(DmarcEvent::TempError), + b"dmarc.none" => EventType::Dmarc(DmarcEvent::None), + b"dns.record-created" => EventType::Dns(DnsEvent::RecordCreated), + b"dns.record-creation-failed" => EventType::Dns(DnsEvent::RecordCreationFailed), + b"dns.record-deletion-failed" => EventType::Dns(DnsEvent::RecordDeletionFailed), + b"dns.record-not-propagated" => EventType::Dns(DnsEvent::RecordNotPropagated), + b"dns.record-lookup-failed" => EventType::Dns(DnsEvent::RecordLookupFailed), + b"dns.record-propagated" => EventType::Dns(DnsEvent::RecordPropagated), + b"dns.record-propagation-timeout" => EventType::Dns(DnsEvent::RecordPropagationTimeout), + b"dns.build-error" => EventType::Dns(DnsEvent::BuildError), + b"eval.result" => EventType::Eval(EvalEvent::Result), + b"eval.error" => EventType::Eval(EvalEvent::Error), + b"eval.directory-not-found" => EventType::Eval(EvalEvent::DirectoryNotFound), + b"eval.store-not-found" => EventType::Eval(EvalEvent::StoreNotFound), + b"housekeeper.start" => EventType::Housekeeper(HousekeeperEvent::Start), + b"housekeeper.stop" => EventType::Housekeeper(HousekeeperEvent::Stop), + b"housekeeper.schedule" => EventType::Housekeeper(HousekeeperEvent::Schedule), + b"housekeeper.run" => EventType::Housekeeper(HousekeeperEvent::Run), + b"http.connection-start" => EventType::Http(HttpEvent::ConnectionStart), + b"http.connection-end" => EventType::Http(HttpEvent::ConnectionEnd), + b"http.error" => EventType::Http(HttpEvent::Error), + b"http.request-url" => EventType::Http(HttpEvent::RequestUrl), + b"http.request-body" => EventType::Http(HttpEvent::RequestBody), + b"http.response-body" => EventType::Http(HttpEvent::ResponseBody), + b"http.x-forwarded-missing" => EventType::Http(HttpEvent::XForwardedMissing), + b"imap.connection-start" => EventType::Imap(ImapEvent::ConnectionStart), + b"imap.connection-end" => EventType::Imap(ImapEvent::ConnectionEnd), + b"imap.get-acl" => EventType::Imap(ImapEvent::GetAcl), + b"imap.set-acl" => EventType::Imap(ImapEvent::SetAcl), + b"imap.my-rights" => EventType::Imap(ImapEvent::MyRights), + b"imap.list-rights" => EventType::Imap(ImapEvent::ListRights), + b"imap.append" => EventType::Imap(ImapEvent::Append), + b"imap.capabilities" => EventType::Imap(ImapEvent::Capabilities), + b"imap.id" => EventType::Imap(ImapEvent::Id), + b"imap.close" => EventType::Imap(ImapEvent::Close), + b"imap.copy" => EventType::Imap(ImapEvent::Copy), + b"imap.move" => EventType::Imap(ImapEvent::Move), + b"imap.create-mailbox" => EventType::Imap(ImapEvent::CreateMailbox), + b"imap.delete-mailbox" => EventType::Imap(ImapEvent::DeleteMailbox), + b"imap.rename-mailbox" => EventType::Imap(ImapEvent::RenameMailbox), + b"imap.enable" => EventType::Imap(ImapEvent::Enable), + b"imap.expunge" => EventType::Imap(ImapEvent::Expunge), + b"imap.fetch" => EventType::Imap(ImapEvent::Fetch), + b"imap.idle-start" => EventType::Imap(ImapEvent::IdleStart), + b"imap.idle-stop" => EventType::Imap(ImapEvent::IdleStop), + b"imap.list" => EventType::Imap(ImapEvent::List), + b"imap.lsub" => EventType::Imap(ImapEvent::Lsub), + b"imap.logout" => EventType::Imap(ImapEvent::Logout), + b"imap.namespace" => EventType::Imap(ImapEvent::Namespace), + b"imap.noop" => EventType::Imap(ImapEvent::Noop), + b"imap.search" => EventType::Imap(ImapEvent::Search), + b"imap.sort" => EventType::Imap(ImapEvent::Sort), + b"imap.select" => EventType::Imap(ImapEvent::Select), + b"imap.status" => EventType::Imap(ImapEvent::Status), + b"imap.store" => EventType::Imap(ImapEvent::Store), + b"imap.subscribe" => EventType::Imap(ImapEvent::Subscribe), + b"imap.unsubscribe" => EventType::Imap(ImapEvent::Unsubscribe), + b"imap.thread" => EventType::Imap(ImapEvent::Thread), + b"imap.get-quota" => EventType::Imap(ImapEvent::GetQuota), + b"imap.error" => EventType::Imap(ImapEvent::Error), + b"imap.raw-input" => EventType::Imap(ImapEvent::RawInput), + b"imap.raw-output" => EventType::Imap(ImapEvent::RawOutput), + b"incoming-report.dmarc-report" => EventType::IncomingReport(IncomingReportEvent::DmarcReport), + b"incoming-report.dmarc-report-with-warnings" => EventType::IncomingReport(IncomingReportEvent::DmarcReportWithWarnings), + b"incoming-report.tls-report" => EventType::IncomingReport(IncomingReportEvent::TlsReport), + b"incoming-report.tls-report-with-warnings" => EventType::IncomingReport(IncomingReportEvent::TlsReportWithWarnings), + b"incoming-report.abuse-report" => EventType::IncomingReport(IncomingReportEvent::AbuseReport), + b"incoming-report.auth-failure-report" => EventType::IncomingReport(IncomingReportEvent::AuthFailureReport), + b"incoming-report.fraud-report" => EventType::IncomingReport(IncomingReportEvent::FraudReport), + b"incoming-report.not-spam-report" => EventType::IncomingReport(IncomingReportEvent::NotSpamReport), + b"incoming-report.virus-report" => EventType::IncomingReport(IncomingReportEvent::VirusReport), + b"incoming-report.other-report" => EventType::IncomingReport(IncomingReportEvent::OtherReport), + b"incoming-report.message-parse-failed" => EventType::IncomingReport(IncomingReportEvent::MessageParseFailed), + b"incoming-report.dmarc-parse-failed" => EventType::IncomingReport(IncomingReportEvent::DmarcParseFailed), + b"incoming-report.tls-rpc-parse-failed" => EventType::IncomingReport(IncomingReportEvent::TlsRpcParseFailed), + b"incoming-report.arf-parse-failed" => EventType::IncomingReport(IncomingReportEvent::ArfParseFailed), + b"incoming-report.decompress-error" => EventType::IncomingReport(IncomingReportEvent::DecompressError), + b"iprev.pass" => EventType::Iprev(IprevEvent::Pass), + b"iprev.fail" => EventType::Iprev(IprevEvent::Fail), + b"iprev.perm-error" => EventType::Iprev(IprevEvent::PermError), + b"iprev.temp-error" => EventType::Iprev(IprevEvent::TempError), + b"iprev.none" => EventType::Iprev(IprevEvent::None), + b"jmap.method-call" => EventType::Jmap(JmapEvent::MethodCall), + b"jmap.invalid-arguments" => EventType::Jmap(JmapEvent::InvalidArguments), + b"jmap.request-too-large" => EventType::Jmap(JmapEvent::RequestTooLarge), + b"jmap.state-mismatch" => EventType::Jmap(JmapEvent::StateMismatch), + b"jmap.anchor-not-found" => EventType::Jmap(JmapEvent::AnchorNotFound), + b"jmap.unsupported-filter" => EventType::Jmap(JmapEvent::UnsupportedFilter), + b"jmap.unsupported-sort" => EventType::Jmap(JmapEvent::UnsupportedSort), + b"jmap.unknown-method" => EventType::Jmap(JmapEvent::UnknownMethod), + b"jmap.invalid-result-reference" => EventType::Jmap(JmapEvent::InvalidResultReference), + b"jmap.forbidden" => EventType::Jmap(JmapEvent::Forbidden), + b"jmap.account-not-found" => EventType::Jmap(JmapEvent::AccountNotFound), + b"jmap.account-not-supported-by-method" => EventType::Jmap(JmapEvent::AccountNotSupportedByMethod), + b"jmap.account-read-only" => EventType::Jmap(JmapEvent::AccountReadOnly), + b"jmap.not-found" => EventType::Jmap(JmapEvent::NotFound), + b"jmap.cannot-calculate-changes" => EventType::Jmap(JmapEvent::CannotCalculateChanges), + b"jmap.unknown-data-type" => EventType::Jmap(JmapEvent::UnknownDataType), + b"jmap.unknown-capability" => EventType::Jmap(JmapEvent::UnknownCapability), + b"jmap.not-json" => EventType::Jmap(JmapEvent::NotJson), + b"jmap.not-request" => EventType::Jmap(JmapEvent::NotRequest), + b"jmap.websocket-start" => EventType::Jmap(JmapEvent::WebsocketStart), + b"jmap.websocket-stop" => EventType::Jmap(JmapEvent::WebsocketStop), + b"jmap.websocket-error" => EventType::Jmap(JmapEvent::WebsocketError), + b"limit.size-request" => EventType::Limit(LimitEvent::SizeRequest), + b"limit.size-upload" => EventType::Limit(LimitEvent::SizeUpload), + b"limit.calls-in" => EventType::Limit(LimitEvent::CallsIn), + b"limit.concurrent-request" => EventType::Limit(LimitEvent::ConcurrentRequest), + b"limit.concurrent-upload" => EventType::Limit(LimitEvent::ConcurrentUpload), + b"limit.concurrent-connection" => EventType::Limit(LimitEvent::ConcurrentConnection), + b"limit.quota" => EventType::Limit(LimitEvent::Quota), + b"limit.blob-quota" => EventType::Limit(LimitEvent::BlobQuota), + b"limit.tenant-quota" => EventType::Limit(LimitEvent::TenantQuota), + b"limit.too-many-requests" => EventType::Limit(LimitEvent::TooManyRequests), + b"mail-auth.parse-error" => EventType::MailAuth(MailAuthEvent::ParseError), + b"mail-auth.missing-parameters" => EventType::MailAuth(MailAuthEvent::MissingParameters), + b"mail-auth.no-headers-found" => EventType::MailAuth(MailAuthEvent::NoHeadersFound), + b"mail-auth.crypto" => EventType::MailAuth(MailAuthEvent::Crypto), + b"mail-auth.io" => EventType::MailAuth(MailAuthEvent::Io), + b"mail-auth.base64" => EventType::MailAuth(MailAuthEvent::Base64), + b"mail-auth.dns-error" => EventType::MailAuth(MailAuthEvent::DnsError), + b"mail-auth.dns-record-not-found" => EventType::MailAuth(MailAuthEvent::DnsRecordNotFound), + b"mail-auth.dns-invalid-record-type" => EventType::MailAuth(MailAuthEvent::DnsInvalidRecordType), + b"mail-auth.policy-not-aligned" => EventType::MailAuth(MailAuthEvent::PolicyNotAligned), + b"manage.missing-parameter" => EventType::Manage(ManageEvent::MissingParameter), + b"manage.already-exists" => EventType::Manage(ManageEvent::AlreadyExists), + b"manage.assert-failed" => EventType::Manage(ManageEvent::AssertFailed), + b"manage.not-found" => EventType::Manage(ManageEvent::NotFound), + b"manage.not-supported" => EventType::Manage(ManageEvent::NotSupported), + b"manage.error" => EventType::Manage(ManageEvent::Error), + b"manage-sieve.connection-start" => EventType::ManageSieve(ManageSieveEvent::ConnectionStart), + b"manage-sieve.connection-end" => EventType::ManageSieve(ManageSieveEvent::ConnectionEnd), + b"manage-sieve.create-script" => EventType::ManageSieve(ManageSieveEvent::CreateScript), + b"manage-sieve.update-script" => EventType::ManageSieve(ManageSieveEvent::UpdateScript), + b"manage-sieve.get-script" => EventType::ManageSieve(ManageSieveEvent::GetScript), + b"manage-sieve.delete-script" => EventType::ManageSieve(ManageSieveEvent::DeleteScript), + b"manage-sieve.rename-script" => EventType::ManageSieve(ManageSieveEvent::RenameScript), + b"manage-sieve.check-script" => EventType::ManageSieve(ManageSieveEvent::CheckScript), + b"manage-sieve.have-space" => EventType::ManageSieve(ManageSieveEvent::HaveSpace), + b"manage-sieve.list-scripts" => EventType::ManageSieve(ManageSieveEvent::ListScripts), + b"manage-sieve.set-active" => EventType::ManageSieve(ManageSieveEvent::SetActive), + b"manage-sieve.capabilities" => EventType::ManageSieve(ManageSieveEvent::Capabilities), + b"manage-sieve.start-tls" => EventType::ManageSieve(ManageSieveEvent::StartTls), + b"manage-sieve.unauthenticate" => EventType::ManageSieve(ManageSieveEvent::Unauthenticate), + b"manage-sieve.logout" => EventType::ManageSieve(ManageSieveEvent::Logout), + b"manage-sieve.noop" => EventType::ManageSieve(ManageSieveEvent::Noop), + b"manage-sieve.error" => EventType::ManageSieve(ManageSieveEvent::Error), + b"manage-sieve.raw-input" => EventType::ManageSieve(ManageSieveEvent::RawInput), + b"manage-sieve.raw-output" => EventType::ManageSieve(ManageSieveEvent::RawOutput), + b"message-ingest.ham" => EventType::MessageIngest(MessageIngestEvent::Ham), + b"message-ingest.spam" => EventType::MessageIngest(MessageIngestEvent::Spam), + b"message-ingest.imap-append" => EventType::MessageIngest(MessageIngestEvent::ImapAppend), + b"message-ingest.jmap-append" => EventType::MessageIngest(MessageIngestEvent::JmapAppend), + b"message-ingest.duplicate" => EventType::MessageIngest(MessageIngestEvent::Duplicate), + b"message-ingest.error" => EventType::MessageIngest(MessageIngestEvent::Error), + b"message-ingest.fts-index" => EventType::MessageIngest(MessageIngestEvent::FtsIndex), + b"milter.read" => EventType::Milter(MilterEvent::Read), + b"milter.write" => EventType::Milter(MilterEvent::Write), + b"milter.action-accept" => EventType::Milter(MilterEvent::ActionAccept), + b"milter.action-discard" => EventType::Milter(MilterEvent::ActionDiscard), + b"milter.action-reject" => EventType::Milter(MilterEvent::ActionReject), + b"milter.action-temp-fail" => EventType::Milter(MilterEvent::ActionTempFail), + b"milter.action-reply-code" => EventType::Milter(MilterEvent::ActionReplyCode), + b"milter.action-connection-failure" => EventType::Milter(MilterEvent::ActionConnectionFailure), + b"milter.action-shutdown" => EventType::Milter(MilterEvent::ActionShutdown), + b"milter.io-error" => EventType::Milter(MilterEvent::IoError), + b"milter.frame-too-large" => EventType::Milter(MilterEvent::FrameTooLarge), + b"milter.frame-invalid" => EventType::Milter(MilterEvent::FrameInvalid), + b"milter.unexpected-response" => EventType::Milter(MilterEvent::UnexpectedResponse), + b"milter.timeout" => EventType::Milter(MilterEvent::Timeout), + b"milter.tls-invalid-name" => EventType::Milter(MilterEvent::TlsInvalidName), + b"milter.disconnected" => EventType::Milter(MilterEvent::Disconnected), + b"milter.parse-error" => EventType::Milter(MilterEvent::ParseError), + b"mta-hook.action-accept" => EventType::MtaHook(MtaHookEvent::ActionAccept), + b"mta-hook.action-discard" => EventType::MtaHook(MtaHookEvent::ActionDiscard), + b"mta-hook.action-reject" => EventType::MtaHook(MtaHookEvent::ActionReject), + b"mta-hook.action-quarantine" => EventType::MtaHook(MtaHookEvent::ActionQuarantine), + b"mta-hook.error" => EventType::MtaHook(MtaHookEvent::Error), + b"mta-sts.authorized" => EventType::MtaSts(MtaStsEvent::Authorized), + b"mta-sts.not-authorized" => EventType::MtaSts(MtaStsEvent::NotAuthorized), + b"mta-sts.policy-fetch" => EventType::MtaSts(MtaStsEvent::PolicyFetch), + b"mta-sts.policy-not-found" => EventType::MtaSts(MtaStsEvent::PolicyNotFound), + b"mta-sts.policy-fetch-error" => EventType::MtaSts(MtaStsEvent::PolicyFetchError), + b"mta-sts.invalid-policy" => EventType::MtaSts(MtaStsEvent::InvalidPolicy), + b"network.listen-start" => EventType::Network(NetworkEvent::ListenStart), + b"network.listen-stop" => EventType::Network(NetworkEvent::ListenStop), + b"network.listen-error" => EventType::Network(NetworkEvent::ListenError), + b"network.bind-error" => EventType::Network(NetworkEvent::BindError), + b"network.read-error" => EventType::Network(NetworkEvent::ReadError), + b"network.write-error" => EventType::Network(NetworkEvent::WriteError), + b"network.flush-error" => EventType::Network(NetworkEvent::FlushError), + b"network.accept-error" => EventType::Network(NetworkEvent::AcceptError), + b"network.split-error" => EventType::Network(NetworkEvent::SplitError), + b"network.timeout" => EventType::Network(NetworkEvent::Timeout), + b"network.closed" => EventType::Network(NetworkEvent::Closed), + b"network.proxy-error" => EventType::Network(NetworkEvent::ProxyError), + b"network.set-opt-error" => EventType::Network(NetworkEvent::SetOptError), + b"outgoing-report.spf-report" => EventType::OutgoingReport(OutgoingReportEvent::SpfReport), + b"outgoing-report.spf-rate-limited" => EventType::OutgoingReport(OutgoingReportEvent::SpfRateLimited), + b"outgoing-report.dkim-report" => EventType::OutgoingReport(OutgoingReportEvent::DkimReport), + b"outgoing-report.dkim-rate-limited" => EventType::OutgoingReport(OutgoingReportEvent::DkimRateLimited), + b"outgoing-report.dmarc-report" => EventType::OutgoingReport(OutgoingReportEvent::DmarcReport), + b"outgoing-report.dmarc-rate-limited" => EventType::OutgoingReport(OutgoingReportEvent::DmarcRateLimited), + b"outgoing-report.dmarc-aggregate-report" => EventType::OutgoingReport(OutgoingReportEvent::DmarcAggregateReport), + b"outgoing-report.tls-aggregate" => EventType::OutgoingReport(OutgoingReportEvent::TlsAggregate), + b"outgoing-report.http-submission" => EventType::OutgoingReport(OutgoingReportEvent::HttpSubmission), + b"outgoing-report.unauthorized-reporting-address" => EventType::OutgoingReport(OutgoingReportEvent::UnauthorizedReportingAddress), + b"outgoing-report.reporting-address-validation-error" => EventType::OutgoingReport(OutgoingReportEvent::ReportingAddressValidationError), + b"outgoing-report.not-found" => EventType::OutgoingReport(OutgoingReportEvent::NotFound), + b"outgoing-report.submission-error" => EventType::OutgoingReport(OutgoingReportEvent::SubmissionError), + b"outgoing-report.no-recipients-found" => EventType::OutgoingReport(OutgoingReportEvent::NoRecipientsFound), + b"outgoing-report.locked" => EventType::OutgoingReport(OutgoingReportEvent::Locked), + b"pop3.connection-start" => EventType::Pop3(Pop3Event::ConnectionStart), + b"pop3.connection-end" => EventType::Pop3(Pop3Event::ConnectionEnd), + b"pop3.delete" => EventType::Pop3(Pop3Event::Delete), + b"pop3.reset" => EventType::Pop3(Pop3Event::Reset), + b"pop3.quit" => EventType::Pop3(Pop3Event::Quit), + b"pop3.fetch" => EventType::Pop3(Pop3Event::Fetch), + b"pop3.list" => EventType::Pop3(Pop3Event::List), + b"pop3.list-message" => EventType::Pop3(Pop3Event::ListMessage), + b"pop3.uidl" => EventType::Pop3(Pop3Event::Uidl), + b"pop3.uidl-message" => EventType::Pop3(Pop3Event::UidlMessage), + b"pop3.stat" => EventType::Pop3(Pop3Event::Stat), + b"pop3.noop" => EventType::Pop3(Pop3Event::Noop), + b"pop3.capabilities" => EventType::Pop3(Pop3Event::Capabilities), + b"pop3.start-tls" => EventType::Pop3(Pop3Event::StartTls), + b"pop3.utf8" => EventType::Pop3(Pop3Event::Utf8), + b"pop3.error" => EventType::Pop3(Pop3Event::Error), + b"pop3.raw-input" => EventType::Pop3(Pop3Event::RawInput), + b"pop3.raw-output" => EventType::Pop3(Pop3Event::RawOutput), + b"purge.started" => EventType::Purge(PurgeEvent::Started), + b"purge.finished" => EventType::Purge(PurgeEvent::Finished), + b"purge.running" => EventType::Purge(PurgeEvent::Running), + b"purge.error" => EventType::Purge(PurgeEvent::Error), + b"purge.in-progress" => EventType::Purge(PurgeEvent::InProgress), + b"purge.auto-expunge" => EventType::Purge(PurgeEvent::AutoExpunge), + b"purge.blob-cleanup" => EventType::Purge(PurgeEvent::BlobCleanup), + b"push-subscription.success" => EventType::PushSubscription(PushSubscriptionEvent::Success), + b"push-subscription.error" => EventType::PushSubscription(PushSubscriptionEvent::Error), + b"push-subscription.not-found" => EventType::PushSubscription(PushSubscriptionEvent::NotFound), + b"queue.queue-message" => EventType::Queue(QueueEvent::QueueMessage), + b"queue.queue-message-authenticated" => EventType::Queue(QueueEvent::QueueMessageAuthenticated), + b"queue.queue-report" => EventType::Queue(QueueEvent::QueueReport), + b"queue.queue-dsn" => EventType::Queue(QueueEvent::QueueDsn), + b"queue.queue-autogenerated" => EventType::Queue(QueueEvent::QueueAutogenerated), + b"queue.rescheduled" => EventType::Queue(QueueEvent::Rescheduled), + b"queue.locked" => EventType::Queue(QueueEvent::Locked), + b"queue.blob-not-found" => EventType::Queue(QueueEvent::BlobNotFound), + b"queue.rate-limit-exceeded" => EventType::Queue(QueueEvent::RateLimitExceeded), + b"queue.concurrency-limit-exceeded" => EventType::Queue(QueueEvent::ConcurrencyLimitExceeded), + b"queue.quota-exceeded" => EventType::Queue(QueueEvent::QuotaExceeded), + b"queue.back-pressure" => EventType::Queue(QueueEvent::BackPressure), + b"resource.not-found" => EventType::Resource(ResourceEvent::NotFound), + b"resource.bad-parameters" => EventType::Resource(ResourceEvent::BadParameters), + b"resource.error" => EventType::Resource(ResourceEvent::Error), + b"resource.download-external" => EventType::Resource(ResourceEvent::DownloadExternal), + b"resource.webadmin-unpacked" => EventType::Resource(ResourceEvent::WebadminUnpacked), + b"security.authentication-ban" => EventType::Security(SecurityEvent::AuthenticationBan), + b"security.abuse-ban" => EventType::Security(SecurityEvent::AbuseBan), + b"security.scan-ban" => EventType::Security(SecurityEvent::ScanBan), + b"security.loiter-ban" => EventType::Security(SecurityEvent::LoiterBan), + b"security.ip-blocked" => EventType::Security(SecurityEvent::IpBlocked), + b"security.unauthorized" => EventType::Security(SecurityEvent::Unauthorized), + b"server.startup" => EventType::Server(ServerEvent::Startup), + b"server.shutdown" => EventType::Server(ServerEvent::Shutdown), + b"server.startup-error" => EventType::Server(ServerEvent::StartupError), + b"server.thread-error" => EventType::Server(ServerEvent::ThreadError), + b"server.licensing" => EventType::Server(ServerEvent::Licensing), + b"sieve.action-accept" => EventType::Sieve(SieveEvent::ActionAccept), + b"sieve.action-accept-replace" => EventType::Sieve(SieveEvent::ActionAcceptReplace), + b"sieve.action-discard" => EventType::Sieve(SieveEvent::ActionDiscard), + b"sieve.action-reject" => EventType::Sieve(SieveEvent::ActionReject), + b"sieve.send-message" => EventType::Sieve(SieveEvent::SendMessage), + b"sieve.message-too-large" => EventType::Sieve(SieveEvent::MessageTooLarge), + b"sieve.script-not-found" => EventType::Sieve(SieveEvent::ScriptNotFound), + b"sieve.list-not-found" => EventType::Sieve(SieveEvent::ListNotFound), + b"sieve.runtime-error" => EventType::Sieve(SieveEvent::RuntimeError), + b"sieve.unexpected-error" => EventType::Sieve(SieveEvent::UnexpectedError), + b"sieve.not-supported" => EventType::Sieve(SieveEvent::NotSupported), + b"sieve.quota-exceeded" => EventType::Sieve(SieveEvent::QuotaExceeded), + b"smtp.connection-start" => EventType::Smtp(SmtpEvent::ConnectionStart), + b"smtp.connection-end" => EventType::Smtp(SmtpEvent::ConnectionEnd), + b"smtp.error" => EventType::Smtp(SmtpEvent::Error), + b"smtp.id-not-found" => EventType::Smtp(SmtpEvent::IdNotFound), + b"smtp.concurrency-limit-exceeded" => EventType::Smtp(SmtpEvent::ConcurrencyLimitExceeded), + b"smtp.transfer-limit-exceeded" => EventType::Smtp(SmtpEvent::TransferLimitExceeded), + b"smtp.rate-limit-exceeded" => EventType::Smtp(SmtpEvent::RateLimitExceeded), + b"smtp.time-limit-exceeded" => EventType::Smtp(SmtpEvent::TimeLimitExceeded), + b"smtp.missing-auth-directory" => EventType::Smtp(SmtpEvent::MissingAuthDirectory), + b"smtp.message-parse-failed" => EventType::Smtp(SmtpEvent::MessageParseFailed), + b"smtp.message-too-large" => EventType::Smtp(SmtpEvent::MessageTooLarge), + b"smtp.loop-detected" => EventType::Smtp(SmtpEvent::LoopDetected), + b"smtp.dkim-pass" => EventType::Smtp(SmtpEvent::DkimPass), + b"smtp.dkim-fail" => EventType::Smtp(SmtpEvent::DkimFail), + b"smtp.arc-pass" => EventType::Smtp(SmtpEvent::ArcPass), + b"smtp.arc-fail" => EventType::Smtp(SmtpEvent::ArcFail), + b"smtp.spf-ehlo-pass" => EventType::Smtp(SmtpEvent::SpfEhloPass), + b"smtp.spf-ehlo-fail" => EventType::Smtp(SmtpEvent::SpfEhloFail), + b"smtp.spf-from-pass" => EventType::Smtp(SmtpEvent::SpfFromPass), + b"smtp.spf-from-fail" => EventType::Smtp(SmtpEvent::SpfFromFail), + b"smtp.dmarc-pass" => EventType::Smtp(SmtpEvent::DmarcPass), + b"smtp.dmarc-fail" => EventType::Smtp(SmtpEvent::DmarcFail), + b"smtp.iprev-pass" => EventType::Smtp(SmtpEvent::IprevPass), + b"smtp.iprev-fail" => EventType::Smtp(SmtpEvent::IprevFail), + b"smtp.too-many-messages" => EventType::Smtp(SmtpEvent::TooManyMessages), + b"smtp.ehlo" => EventType::Smtp(SmtpEvent::Ehlo), + b"smtp.invalid-ehlo" => EventType::Smtp(SmtpEvent::InvalidEhlo), + b"smtp.did-not-say-ehlo" => EventType::Smtp(SmtpEvent::DidNotSayEhlo), + b"smtp.ehlo-expected" => EventType::Smtp(SmtpEvent::EhloExpected), + b"smtp.lhlo-expected" => EventType::Smtp(SmtpEvent::LhloExpected), + b"smtp.mail-from-unauthenticated" => EventType::Smtp(SmtpEvent::MailFromUnauthenticated), + b"smtp.mail-from-unauthorized" => EventType::Smtp(SmtpEvent::MailFromUnauthorized), + b"smtp.mail-from-not-allowed" => EventType::Smtp(SmtpEvent::MailFromNotAllowed), + b"smtp.mail-from-rewritten" => EventType::Smtp(SmtpEvent::MailFromRewritten), + b"smtp.mail-from-missing" => EventType::Smtp(SmtpEvent::MailFromMissing), + b"smtp.mail-from" => EventType::Smtp(SmtpEvent::MailFrom), + b"smtp.multiple-mail-from" => EventType::Smtp(SmtpEvent::MultipleMailFrom), + b"smtp.mailbox-does-not-exist" => EventType::Smtp(SmtpEvent::MailboxDoesNotExist), + b"smtp.relay-not-allowed" => EventType::Smtp(SmtpEvent::RelayNotAllowed), + b"smtp.rcpt-to" => EventType::Smtp(SmtpEvent::RcptTo), + b"smtp.rcpt-to-duplicate" => EventType::Smtp(SmtpEvent::RcptToDuplicate), + b"smtp.rcpt-to-rewritten" => EventType::Smtp(SmtpEvent::RcptToRewritten), + b"smtp.rcpt-to-missing" => EventType::Smtp(SmtpEvent::RcptToMissing), + b"smtp.rcpt-to-greylisted" => EventType::Smtp(SmtpEvent::RcptToGreylisted), + b"smtp.too-many-recipients" => EventType::Smtp(SmtpEvent::TooManyRecipients), + b"smtp.too-many-invalid-rcpt" => EventType::Smtp(SmtpEvent::TooManyInvalidRcpt), + b"smtp.raw-input" => EventType::Smtp(SmtpEvent::RawInput), + b"smtp.raw-output" => EventType::Smtp(SmtpEvent::RawOutput), + b"smtp.missing-local-hostname" => EventType::Smtp(SmtpEvent::MissingLocalHostname), + b"smtp.vrfy" => EventType::Smtp(SmtpEvent::Vrfy), + b"smtp.vrfy-not-found" => EventType::Smtp(SmtpEvent::VrfyNotFound), + b"smtp.vrfy-disabled" => EventType::Smtp(SmtpEvent::VrfyDisabled), + b"smtp.expn" => EventType::Smtp(SmtpEvent::Expn), + b"smtp.expn-not-found" => EventType::Smtp(SmtpEvent::ExpnNotFound), + b"smtp.expn-disabled" => EventType::Smtp(SmtpEvent::ExpnDisabled), + b"smtp.require-tls-disabled" => EventType::Smtp(SmtpEvent::RequireTlsDisabled), + b"smtp.deliver-by-disabled" => EventType::Smtp(SmtpEvent::DeliverByDisabled), + b"smtp.deliver-by-invalid" => EventType::Smtp(SmtpEvent::DeliverByInvalid), + b"smtp.future-release-disabled" => EventType::Smtp(SmtpEvent::FutureReleaseDisabled), + b"smtp.future-release-invalid" => EventType::Smtp(SmtpEvent::FutureReleaseInvalid), + b"smtp.mt-priority-disabled" => EventType::Smtp(SmtpEvent::MtPriorityDisabled), + b"smtp.mt-priority-invalid" => EventType::Smtp(SmtpEvent::MtPriorityInvalid), + b"smtp.dsn-disabled" => EventType::Smtp(SmtpEvent::DsnDisabled), + b"smtp.auth-not-allowed" => EventType::Smtp(SmtpEvent::AuthNotAllowed), + b"smtp.auth-mechanism-not-supported" => EventType::Smtp(SmtpEvent::AuthMechanismNotSupported), + b"smtp.auth-exchange-too-long" => EventType::Smtp(SmtpEvent::AuthExchangeTooLong), + b"smtp.already-authenticated" => EventType::Smtp(SmtpEvent::AlreadyAuthenticated), + b"smtp.noop" => EventType::Smtp(SmtpEvent::Noop), + b"smtp.start-tls" => EventType::Smtp(SmtpEvent::StartTls), + b"smtp.start-tls-unavailable" => EventType::Smtp(SmtpEvent::StartTlsUnavailable), + b"smtp.start-tls-already" => EventType::Smtp(SmtpEvent::StartTlsAlready), + b"smtp.rset" => EventType::Smtp(SmtpEvent::Rset), + b"smtp.quit" => EventType::Smtp(SmtpEvent::Quit), + b"smtp.help" => EventType::Smtp(SmtpEvent::Help), + b"smtp.command-not-implemented" => EventType::Smtp(SmtpEvent::CommandNotImplemented), + b"smtp.invalid-command" => EventType::Smtp(SmtpEvent::InvalidCommand), + b"smtp.invalid-sender-address" => EventType::Smtp(SmtpEvent::InvalidSenderAddress), + b"smtp.invalid-recipient-address" => EventType::Smtp(SmtpEvent::InvalidRecipientAddress), + b"smtp.invalid-parameter" => EventType::Smtp(SmtpEvent::InvalidParameter), + b"smtp.unsupported-parameter" => EventType::Smtp(SmtpEvent::UnsupportedParameter), + b"smtp.syntax-error" => EventType::Smtp(SmtpEvent::SyntaxError), + b"smtp.request-too-large" => EventType::Smtp(SmtpEvent::RequestTooLarge), + b"spam.pyzor" => EventType::Spam(SpamEvent::Pyzor), + b"spam.pyzor-error" => EventType::Spam(SpamEvent::PyzorError), + b"spam.dnsbl" => EventType::Spam(SpamEvent::Dnsbl), + b"spam.dnsbl-error" => EventType::Spam(SpamEvent::DnsblError), + b"spam.train-started" => EventType::Spam(SpamEvent::TrainStarted), + b"spam.train-completed" => EventType::Spam(SpamEvent::TrainCompleted), + b"spam.train-sample-added" => EventType::Spam(SpamEvent::TrainSampleAdded), + b"spam.train-sample-not-found" => EventType::Spam(SpamEvent::TrainSampleNotFound), + b"spam.classify" => EventType::Spam(SpamEvent::Classify), + b"spam.model-loaded" => EventType::Spam(SpamEvent::ModelLoaded), + b"spam.model-not-ready" => EventType::Spam(SpamEvent::ModelNotReady), + b"spam.model-not-found" => EventType::Spam(SpamEvent::ModelNotFound), + b"spf.pass" => EventType::Spf(SpfEvent::Pass), + b"spf.fail" => EventType::Spf(SpfEvent::Fail), + b"spf.soft-fail" => EventType::Spf(SpfEvent::SoftFail), + b"spf.neutral" => EventType::Spf(SpfEvent::Neutral), + b"spf.temp-error" => EventType::Spf(SpfEvent::TempError), + b"spf.perm-error" => EventType::Spf(SpfEvent::PermError), + b"spf.none" => EventType::Spf(SpfEvent::None), + b"store.assert-value-failed" => EventType::Store(StoreEvent::AssertValueFailed), + b"store.foundationdb-error" => EventType::Store(StoreEvent::FoundationdbError), + b"store.mysql-error" => EventType::Store(StoreEvent::MysqlError), + b"store.postgresql-error" => EventType::Store(StoreEvent::PostgresqlError), + b"store.rocksdb-error" => EventType::Store(StoreEvent::RocksdbError), + b"store.sqlite-error" => EventType::Store(StoreEvent::SqliteError), + b"store.ldap-error" => EventType::Store(StoreEvent::LdapError), + b"store.elasticsearch-error" => EventType::Store(StoreEvent::ElasticsearchError), + b"store.meilisearch-error" => EventType::Store(StoreEvent::MeilisearchError), + b"store.redis-error" => EventType::Store(StoreEvent::RedisError), + b"store.s3-error" => EventType::Store(StoreEvent::S3Error), + b"store.azure-error" => EventType::Store(StoreEvent::AzureError), + b"store.filesystem-error" => EventType::Store(StoreEvent::FilesystemError), + b"store.pool-error" => EventType::Store(StoreEvent::PoolError), + b"store.data-corruption" => EventType::Store(StoreEvent::DataCorruption), + b"store.decompress-error" => EventType::Store(StoreEvent::DecompressError), + b"store.deserialize-error" => EventType::Store(StoreEvent::DeserializeError), + b"store.not-found" => EventType::Store(StoreEvent::NotFound), + b"store.not-configured" => EventType::Store(StoreEvent::NotConfigured), + b"store.not-supported" => EventType::Store(StoreEvent::NotSupported), + b"store.unexpected-error" => EventType::Store(StoreEvent::UnexpectedError), + b"store.crypto-error" => EventType::Store(StoreEvent::CryptoError), + b"store.http-store-error" => EventType::Store(StoreEvent::HttpStoreError), + b"store.cache-miss" => EventType::Store(StoreEvent::CacheMiss), + b"store.cache-hit" => EventType::Store(StoreEvent::CacheHit), + b"store.cache-stale" => EventType::Store(StoreEvent::CacheStale), + b"store.cache-update" => EventType::Store(StoreEvent::CacheUpdate), + b"store.blob-missing-marker" => EventType::Store(StoreEvent::BlobMissingMarker), + b"store.data-write" => EventType::Store(StoreEvent::DataWrite), + b"store.data-iterate" => EventType::Store(StoreEvent::DataIterate), + b"store.blob-read" => EventType::Store(StoreEvent::BlobRead), + b"store.blob-write" => EventType::Store(StoreEvent::BlobWrite), + b"store.blob-delete" => EventType::Store(StoreEvent::BlobDelete), + b"store.sql-query" => EventType::Store(StoreEvent::SqlQuery), + b"store.ldap-query" => EventType::Store(StoreEvent::LdapQuery), + b"store.ldap-warning" => EventType::Store(StoreEvent::LdapWarning), + b"store.http-store-fetch" => EventType::Store(StoreEvent::HttpStoreFetch), + b"task-queue.task-acquired" => EventType::TaskQueue(TaskQueueEvent::TaskAcquired), + b"task-queue.task-locked" => EventType::TaskQueue(TaskQueueEvent::TaskLocked), + b"task-queue.task-ignored" => EventType::TaskQueue(TaskQueueEvent::TaskIgnored), + b"task-queue.task-failed" => EventType::TaskQueue(TaskQueueEvent::TaskFailed), + b"task-queue.blob-not-found" => EventType::TaskQueue(TaskQueueEvent::BlobNotFound), + b"task-queue.metadata-not-found" => EventType::TaskQueue(TaskQueueEvent::MetadataNotFound), + b"telemetry.alert" => EventType::Telemetry(TelemetryEvent::Alert), + b"telemetry.log-error" => EventType::Telemetry(TelemetryEvent::LogError), + b"telemetry.webhook-error" => EventType::Telemetry(TelemetryEvent::WebhookError), + b"telemetry.otel-exporter-error" => EventType::Telemetry(TelemetryEvent::OtelExporterError), + b"telemetry.otel-metrics-exporter-error" => EventType::Telemetry(TelemetryEvent::OtelMetricsExporterError), + b"telemetry.prometheus-exporter-error" => EventType::Telemetry(TelemetryEvent::PrometheusExporterError), + b"telemetry.journal-error" => EventType::Telemetry(TelemetryEvent::JournalError), + b"tls.handshake" => EventType::Tls(TlsEvent::Handshake), + b"tls.handshake-error" => EventType::Tls(TlsEvent::HandshakeError), + b"tls.not-configured" => EventType::Tls(TlsEvent::NotConfigured), + b"tls.certificate-not-found" => EventType::Tls(TlsEvent::CertificateNotFound), + b"tls.no-certificates-available" => EventType::Tls(TlsEvent::NoCertificatesAvailable), + b"tls.multiple-certificates-available" => EventType::Tls(TlsEvent::MultipleCertificatesAvailable), + b"tls-rpt.record-fetch" => EventType::TlsRpt(TlsRptEvent::RecordFetch), + b"tls-rpt.record-fetch-error" => EventType::TlsRpt(TlsRptEvent::RecordFetchError), + b"tls-rpt.record-not-found" => EventType::TlsRpt(TlsRptEvent::RecordNotFound), + b"web-dav.propfind" => EventType::WebDav(WebDavEvent::Propfind), + b"web-dav.proppatch" => EventType::WebDav(WebDavEvent::Proppatch), + b"web-dav.get" => EventType::WebDav(WebDavEvent::Get), + b"web-dav.head" => EventType::WebDav(WebDavEvent::Head), + b"web-dav.report" => EventType::WebDav(WebDavEvent::Report), + b"web-dav.mkcol" => EventType::WebDav(WebDavEvent::Mkcol), + b"web-dav.mkcalendar" => EventType::WebDav(WebDavEvent::Mkcalendar), + b"web-dav.delete" => EventType::WebDav(WebDavEvent::Delete), + b"web-dav.put" => EventType::WebDav(WebDavEvent::Put), + b"web-dav.post" => EventType::WebDav(WebDavEvent::Post), + b"web-dav.patch" => EventType::WebDav(WebDavEvent::Patch), + b"web-dav.copy" => EventType::WebDav(WebDavEvent::Copy), + b"web-dav.move" => EventType::WebDav(WebDavEvent::Move), + b"web-dav.lock" => EventType::WebDav(WebDavEvent::Lock), + b"web-dav.unlock" => EventType::WebDav(WebDavEvent::Unlock), + b"web-dav.acl" => EventType::WebDav(WebDavEvent::Acl), + b"web-dav.options" => EventType::WebDav(WebDavEvent::Options), + b"web-dav.error" => EventType::WebDav(WebDavEvent::Error), + } + .copied() + } + + pub fn as_str(&self) -> &'static str { + match self { + EventType::Acme(AcmeEvent::AuthStart) => "acme.auth-start", + EventType::Acme(AcmeEvent::AuthPending) => "acme.auth-pending", + EventType::Acme(AcmeEvent::AuthValid) => "acme.auth-valid", + EventType::Acme(AcmeEvent::AuthCompleted) => "acme.auth-completed", + EventType::Acme(AcmeEvent::AuthError) => "acme.auth-error", + EventType::Acme(AcmeEvent::AuthTooManyAttempts) => "acme.auth-too-many-attempts", + EventType::Acme(AcmeEvent::ProcessCert) => "acme.process-cert", + EventType::Acme(AcmeEvent::OrderStart) => "acme.order-start", + EventType::Acme(AcmeEvent::OrderProcessing) => "acme.order-processing", + EventType::Acme(AcmeEvent::OrderCompleted) => "acme.order-completed", + EventType::Acme(AcmeEvent::OrderReady) => "acme.order-ready", + EventType::Acme(AcmeEvent::OrderValid) => "acme.order-valid", + EventType::Acme(AcmeEvent::OrderInvalid) => "acme.order-invalid", + EventType::Acme(AcmeEvent::RenewBackoff) => "acme.renew-backoff", + EventType::Acme(AcmeEvent::ClientSuppliedSni) => "acme.client-supplied-sni", + EventType::Acme(AcmeEvent::ClientMissingSni) => "acme.client-missing-sni", + EventType::Acme(AcmeEvent::TlsAlpnReceived) => "acme.tls-alpn-received", + EventType::Acme(AcmeEvent::TlsAlpnError) => "acme.tls-alpn-error", + EventType::Acme(AcmeEvent::TokenNotFound) => "acme.token-not-found", + EventType::Acme(AcmeEvent::Error) => "acme.error", + EventType::Ai(AiEvent::LlmResponse) => "ai.llm-response", + EventType::Ai(AiEvent::ApiError) => "ai.api-error", + EventType::Arc(ArcEvent::ChainTooLong) => "arc.chain-too-long", + EventType::Arc(ArcEvent::InvalidInstance) => "arc.invalid-instance", + EventType::Arc(ArcEvent::InvalidCv) => "arc.invalid-cv", + EventType::Arc(ArcEvent::HasHeaderTag) => "arc.has-header-tag", + EventType::Arc(ArcEvent::BrokenChain) => "arc.broken-chain", + EventType::Arc(ArcEvent::SealerNotFound) => "arc.sealer-not-found", + EventType::Auth(AuthEvent::Success) => "auth.success", + EventType::Auth(AuthEvent::Failed) => "auth.failed", + EventType::Auth(AuthEvent::TokenExpired) => "auth.token-expired", + EventType::Auth(AuthEvent::MissingTotp) => "auth.missing-totp", + EventType::Auth(AuthEvent::TooManyAttempts) => "auth.too-many-attempts", + EventType::Auth(AuthEvent::ClientRegistration) => "auth.client-registration", + EventType::Auth(AuthEvent::Error) => "auth.error", + EventType::Calendar(CalendarEvent::RuleExpansionError) => { + "calendar.rule-expansion-error" + } + EventType::Calendar(CalendarEvent::AlarmSent) => "calendar.alarm-sent", + EventType::Calendar(CalendarEvent::AlarmSkipped) => "calendar.alarm-skipped", + EventType::Calendar(CalendarEvent::AlarmRecipientOverride) => { + "calendar.alarm-recipient-override" + } + EventType::Calendar(CalendarEvent::AlarmFailed) => "calendar.alarm-failed", + EventType::Calendar(CalendarEvent::ItipMessageSent) => "calendar.itip-message-sent", + EventType::Calendar(CalendarEvent::ItipMessageReceived) => { + "calendar.itip-message-received" + } + EventType::Calendar(CalendarEvent::ItipMessageError) => "calendar.itip-message-error", + EventType::Cluster(ClusterEvent::SubscriberStart) => "cluster.subscriber-start", + EventType::Cluster(ClusterEvent::SubscriberStop) => "cluster.subscriber-stop", + EventType::Cluster(ClusterEvent::SubscriberError) => "cluster.subscriber-error", + EventType::Cluster(ClusterEvent::SubscriberDisconnected) => { + "cluster.subscriber-disconnected" + } + EventType::Cluster(ClusterEvent::PublisherStart) => "cluster.publisher-start", + EventType::Cluster(ClusterEvent::PublisherStop) => "cluster.publisher-stop", + EventType::Cluster(ClusterEvent::PublisherError) => "cluster.publisher-error", + EventType::Cluster(ClusterEvent::MessageReceived) => "cluster.message-received", + EventType::Cluster(ClusterEvent::MessageSkipped) => "cluster.message-skipped", + EventType::Cluster(ClusterEvent::MessageInvalid) => "cluster.message-invalid", + EventType::Config(ConfigEvent::ParseError) => "config.parse-error", + EventType::Config(ConfigEvent::BuildError) => "config.build-error", + EventType::Config(ConfigEvent::MacroError) => "config.macro-error", + EventType::Config(ConfigEvent::WriteError) => "config.write-error", + EventType::Config(ConfigEvent::FetchError) => "config.fetch-error", + EventType::Config(ConfigEvent::DefaultApplied) => "config.default-applied", + EventType::Config(ConfigEvent::MissingSetting) => "config.missing-setting", + EventType::Config(ConfigEvent::UnusedSetting) => "config.unused-setting", + EventType::Config(ConfigEvent::ParseWarning) => "config.parse-warning", + EventType::Config(ConfigEvent::BuildWarning) => "config.build-warning", + EventType::Config(ConfigEvent::ImportExternal) => "config.import-external", + EventType::Config(ConfigEvent::AlreadyUpToDate) => "config.already-up-to-date", + EventType::Dane(DaneEvent::AuthenticationSuccess) => "dane.authentication-success", + EventType::Dane(DaneEvent::AuthenticationFailure) => "dane.authentication-failure", + EventType::Dane(DaneEvent::NoCertificatesFound) => "dane.no-certificates-found", + EventType::Dane(DaneEvent::CertificateParseError) => "dane.certificate-parse-error", + EventType::Dane(DaneEvent::TlsaRecordMatch) => "dane.tlsa-record-match", + EventType::Dane(DaneEvent::TlsaRecordFetch) => "dane.tlsa-record-fetch", + EventType::Dane(DaneEvent::TlsaRecordFetchError) => "dane.tlsa-record-fetch-error", + EventType::Dane(DaneEvent::TlsaRecordNotFound) => "dane.tlsa-record-not-found", + EventType::Dane(DaneEvent::TlsaRecordNotDnssecSigned) => { + "dane.tlsa-record-not-dnssec-signed" + } + EventType::Dane(DaneEvent::TlsaRecordInvalid) => "dane.tlsa-record-invalid", + EventType::Delivery(DeliveryEvent::AttemptStart) => "delivery.attempt-start", + EventType::Delivery(DeliveryEvent::AttemptEnd) => "delivery.attempt-end", + EventType::Delivery(DeliveryEvent::Completed) => "delivery.completed", + EventType::Delivery(DeliveryEvent::Failed) => "delivery.failed", + EventType::Delivery(DeliveryEvent::DomainDeliveryStart) => { + "delivery.domain-delivery-start" + } + EventType::Delivery(DeliveryEvent::MxLookup) => "delivery.mx-lookup", + EventType::Delivery(DeliveryEvent::MxLookupFailed) => "delivery.mx-lookup-failed", + EventType::Delivery(DeliveryEvent::IpLookup) => "delivery.ip-lookup", + EventType::Delivery(DeliveryEvent::IpLookupFailed) => "delivery.ip-lookup-failed", + EventType::Delivery(DeliveryEvent::NullMx) => "delivery.null-mx", + EventType::Delivery(DeliveryEvent::Connect) => "delivery.connect", + EventType::Delivery(DeliveryEvent::ConnectError) => "delivery.connect-error", + EventType::Delivery(DeliveryEvent::MissingOutboundHostname) => { + "delivery.missing-outbound-hostname" + } + EventType::Delivery(DeliveryEvent::GreetingFailed) => "delivery.greeting-failed", + EventType::Delivery(DeliveryEvent::Ehlo) => "delivery.ehlo", + EventType::Delivery(DeliveryEvent::EhloRejected) => "delivery.ehlo-rejected", + EventType::Delivery(DeliveryEvent::Auth) => "delivery.auth", + EventType::Delivery(DeliveryEvent::AuthFailed) => "delivery.auth-failed", + EventType::Delivery(DeliveryEvent::MailFrom) => "delivery.mail-from", + EventType::Delivery(DeliveryEvent::MailFromRejected) => "delivery.mail-from-rejected", + EventType::Delivery(DeliveryEvent::Delivered) => "delivery.delivered", + EventType::Delivery(DeliveryEvent::RcptTo) => "delivery.rcpt-to", + EventType::Delivery(DeliveryEvent::RcptToRejected) => "delivery.rcpt-to-rejected", + EventType::Delivery(DeliveryEvent::RcptToFailed) => "delivery.rcpt-to-failed", + EventType::Delivery(DeliveryEvent::MessageRejected) => "delivery.message-rejected", + EventType::Delivery(DeliveryEvent::StartTls) => "delivery.start-tls", + EventType::Delivery(DeliveryEvent::StartTlsUnavailable) => { + "delivery.start-tls-unavailable" + } + EventType::Delivery(DeliveryEvent::StartTlsError) => "delivery.start-tls-error", + EventType::Delivery(DeliveryEvent::StartTlsDisabled) => "delivery.start-tls-disabled", + EventType::Delivery(DeliveryEvent::ImplicitTlsError) => "delivery.implicit-tls-error", + EventType::Delivery(DeliveryEvent::ConcurrencyLimitExceeded) => { + "delivery.concurrency-limit-exceeded" + } + EventType::Delivery(DeliveryEvent::RateLimitExceeded) => "delivery.rate-limit-exceeded", + EventType::Delivery(DeliveryEvent::DoubleBounce) => "delivery.double-bounce", + EventType::Delivery(DeliveryEvent::DsnSuccess) => "delivery.dsn-success", + EventType::Delivery(DeliveryEvent::DsnTempFail) => "delivery.dsn-temp-fail", + EventType::Delivery(DeliveryEvent::DsnPermFail) => "delivery.dsn-perm-fail", + EventType::Delivery(DeliveryEvent::RawInput) => "delivery.raw-input", + EventType::Delivery(DeliveryEvent::RawOutput) => "delivery.raw-output", + EventType::Dkim(DkimEvent::Pass) => "dkim.pass", + EventType::Dkim(DkimEvent::Neutral) => "dkim.neutral", + EventType::Dkim(DkimEvent::Fail) => "dkim.fail", + EventType::Dkim(DkimEvent::PermError) => "dkim.perm-error", + EventType::Dkim(DkimEvent::TempError) => "dkim.temp-error", + EventType::Dkim(DkimEvent::None) => "dkim.none", + EventType::Dkim(DkimEvent::UnsupportedVersion) => "dkim.unsupported-version", + EventType::Dkim(DkimEvent::UnsupportedAlgorithm) => "dkim.unsupported-algorithm", + EventType::Dkim(DkimEvent::UnsupportedCanonicalization) => { + "dkim.unsupported-canonicalization" + } + EventType::Dkim(DkimEvent::UnsupportedKeyType) => "dkim.unsupported-key-type", + EventType::Dkim(DkimEvent::FailedBodyHashMatch) => "dkim.failed-body-hash-match", + EventType::Dkim(DkimEvent::FailedVerification) => "dkim.failed-verification", + EventType::Dkim(DkimEvent::FailedAuidMatch) => "dkim.failed-auid-match", + EventType::Dkim(DkimEvent::RevokedPublicKey) => "dkim.revoked-public-key", + EventType::Dkim(DkimEvent::IncompatibleAlgorithms) => "dkim.incompatible-algorithms", + EventType::Dkim(DkimEvent::SignatureExpired) => "dkim.signature-expired", + EventType::Dkim(DkimEvent::SignatureLength) => "dkim.signature-length", + EventType::Dkim(DkimEvent::SignerNotFound) => "dkim.signer-not-found", + EventType::Dkim(DkimEvent::BuildError) => "dkim.build-error", + EventType::Dmarc(DmarcEvent::Pass) => "dmarc.pass", + EventType::Dmarc(DmarcEvent::Fail) => "dmarc.fail", + EventType::Dmarc(DmarcEvent::PermError) => "dmarc.perm-error", + EventType::Dmarc(DmarcEvent::TempError) => "dmarc.temp-error", + EventType::Dmarc(DmarcEvent::None) => "dmarc.none", + EventType::Dns(DnsEvent::RecordCreated) => "dns.record-created", + EventType::Dns(DnsEvent::RecordCreationFailed) => "dns.record-creation-failed", + EventType::Dns(DnsEvent::RecordDeletionFailed) => "dns.record-deletion-failed", + EventType::Dns(DnsEvent::RecordNotPropagated) => "dns.record-not-propagated", + EventType::Dns(DnsEvent::RecordLookupFailed) => "dns.record-lookup-failed", + EventType::Dns(DnsEvent::RecordPropagated) => "dns.record-propagated", + EventType::Dns(DnsEvent::RecordPropagationTimeout) => "dns.record-propagation-timeout", + EventType::Dns(DnsEvent::BuildError) => "dns.build-error", + EventType::Eval(EvalEvent::Result) => "eval.result", + EventType::Eval(EvalEvent::Error) => "eval.error", + EventType::Eval(EvalEvent::DirectoryNotFound) => "eval.directory-not-found", + EventType::Eval(EvalEvent::StoreNotFound) => "eval.store-not-found", + EventType::Housekeeper(HousekeeperEvent::Start) => "housekeeper.start", + EventType::Housekeeper(HousekeeperEvent::Stop) => "housekeeper.stop", + EventType::Housekeeper(HousekeeperEvent::Schedule) => "housekeeper.schedule", + EventType::Housekeeper(HousekeeperEvent::Run) => "housekeeper.run", + EventType::Http(HttpEvent::ConnectionStart) => "http.connection-start", + EventType::Http(HttpEvent::ConnectionEnd) => "http.connection-end", + EventType::Http(HttpEvent::Error) => "http.error", + EventType::Http(HttpEvent::RequestUrl) => "http.request-url", + EventType::Http(HttpEvent::RequestBody) => "http.request-body", + EventType::Http(HttpEvent::ResponseBody) => "http.response-body", + EventType::Http(HttpEvent::XForwardedMissing) => "http.x-forwarded-missing", + EventType::Imap(ImapEvent::ConnectionStart) => "imap.connection-start", + EventType::Imap(ImapEvent::ConnectionEnd) => "imap.connection-end", + EventType::Imap(ImapEvent::GetAcl) => "imap.get-acl", + EventType::Imap(ImapEvent::SetAcl) => "imap.set-acl", + EventType::Imap(ImapEvent::MyRights) => "imap.my-rights", + EventType::Imap(ImapEvent::ListRights) => "imap.list-rights", + EventType::Imap(ImapEvent::Append) => "imap.append", + EventType::Imap(ImapEvent::Capabilities) => "imap.capabilities", + EventType::Imap(ImapEvent::Id) => "imap.id", + EventType::Imap(ImapEvent::Close) => "imap.close", + EventType::Imap(ImapEvent::Copy) => "imap.copy", + EventType::Imap(ImapEvent::Move) => "imap.move", + EventType::Imap(ImapEvent::CreateMailbox) => "imap.create-mailbox", + EventType::Imap(ImapEvent::DeleteMailbox) => "imap.delete-mailbox", + EventType::Imap(ImapEvent::RenameMailbox) => "imap.rename-mailbox", + EventType::Imap(ImapEvent::Enable) => "imap.enable", + EventType::Imap(ImapEvent::Expunge) => "imap.expunge", + EventType::Imap(ImapEvent::Fetch) => "imap.fetch", + EventType::Imap(ImapEvent::IdleStart) => "imap.idle-start", + EventType::Imap(ImapEvent::IdleStop) => "imap.idle-stop", + EventType::Imap(ImapEvent::List) => "imap.list", + EventType::Imap(ImapEvent::Lsub) => "imap.lsub", + EventType::Imap(ImapEvent::Logout) => "imap.logout", + EventType::Imap(ImapEvent::Namespace) => "imap.namespace", + EventType::Imap(ImapEvent::Noop) => "imap.noop", + EventType::Imap(ImapEvent::Search) => "imap.search", + EventType::Imap(ImapEvent::Sort) => "imap.sort", + EventType::Imap(ImapEvent::Select) => "imap.select", + EventType::Imap(ImapEvent::Status) => "imap.status", + EventType::Imap(ImapEvent::Store) => "imap.store", + EventType::Imap(ImapEvent::Subscribe) => "imap.subscribe", + EventType::Imap(ImapEvent::Unsubscribe) => "imap.unsubscribe", + EventType::Imap(ImapEvent::Thread) => "imap.thread", + EventType::Imap(ImapEvent::GetQuota) => "imap.get-quota", + EventType::Imap(ImapEvent::Error) => "imap.error", + EventType::Imap(ImapEvent::RawInput) => "imap.raw-input", + EventType::Imap(ImapEvent::RawOutput) => "imap.raw-output", + EventType::IncomingReport(IncomingReportEvent::DmarcReport) => { + "incoming-report.dmarc-report" + } + EventType::IncomingReport(IncomingReportEvent::DmarcReportWithWarnings) => { + "incoming-report.dmarc-report-with-warnings" + } + EventType::IncomingReport(IncomingReportEvent::TlsReport) => { + "incoming-report.tls-report" + } + EventType::IncomingReport(IncomingReportEvent::TlsReportWithWarnings) => { + "incoming-report.tls-report-with-warnings" + } + EventType::IncomingReport(IncomingReportEvent::AbuseReport) => { + "incoming-report.abuse-report" + } + EventType::IncomingReport(IncomingReportEvent::AuthFailureReport) => { + "incoming-report.auth-failure-report" + } + EventType::IncomingReport(IncomingReportEvent::FraudReport) => { + "incoming-report.fraud-report" + } + EventType::IncomingReport(IncomingReportEvent::NotSpamReport) => { + "incoming-report.not-spam-report" + } + EventType::IncomingReport(IncomingReportEvent::VirusReport) => { + "incoming-report.virus-report" + } + EventType::IncomingReport(IncomingReportEvent::OtherReport) => { + "incoming-report.other-report" + } + EventType::IncomingReport(IncomingReportEvent::MessageParseFailed) => { + "incoming-report.message-parse-failed" + } + EventType::IncomingReport(IncomingReportEvent::DmarcParseFailed) => { + "incoming-report.dmarc-parse-failed" + } + EventType::IncomingReport(IncomingReportEvent::TlsRpcParseFailed) => { + "incoming-report.tls-rpc-parse-failed" + } + EventType::IncomingReport(IncomingReportEvent::ArfParseFailed) => { + "incoming-report.arf-parse-failed" + } + EventType::IncomingReport(IncomingReportEvent::DecompressError) => { + "incoming-report.decompress-error" + } + EventType::Iprev(IprevEvent::Pass) => "iprev.pass", + EventType::Iprev(IprevEvent::Fail) => "iprev.fail", + EventType::Iprev(IprevEvent::PermError) => "iprev.perm-error", + EventType::Iprev(IprevEvent::TempError) => "iprev.temp-error", + EventType::Iprev(IprevEvent::None) => "iprev.none", + EventType::Jmap(JmapEvent::MethodCall) => "jmap.method-call", + EventType::Jmap(JmapEvent::InvalidArguments) => "jmap.invalid-arguments", + EventType::Jmap(JmapEvent::RequestTooLarge) => "jmap.request-too-large", + EventType::Jmap(JmapEvent::StateMismatch) => "jmap.state-mismatch", + EventType::Jmap(JmapEvent::AnchorNotFound) => "jmap.anchor-not-found", + EventType::Jmap(JmapEvent::UnsupportedFilter) => "jmap.unsupported-filter", + EventType::Jmap(JmapEvent::UnsupportedSort) => "jmap.unsupported-sort", + EventType::Jmap(JmapEvent::UnknownMethod) => "jmap.unknown-method", + EventType::Jmap(JmapEvent::InvalidResultReference) => "jmap.invalid-result-reference", + EventType::Jmap(JmapEvent::Forbidden) => "jmap.forbidden", + EventType::Jmap(JmapEvent::AccountNotFound) => "jmap.account-not-found", + EventType::Jmap(JmapEvent::AccountNotSupportedByMethod) => { + "jmap.account-not-supported-by-method" + } + EventType::Jmap(JmapEvent::AccountReadOnly) => "jmap.account-read-only", + EventType::Jmap(JmapEvent::NotFound) => "jmap.not-found", + EventType::Jmap(JmapEvent::CannotCalculateChanges) => "jmap.cannot-calculate-changes", + EventType::Jmap(JmapEvent::UnknownDataType) => "jmap.unknown-data-type", + EventType::Jmap(JmapEvent::UnknownCapability) => "jmap.unknown-capability", + EventType::Jmap(JmapEvent::NotJson) => "jmap.not-json", + EventType::Jmap(JmapEvent::NotRequest) => "jmap.not-request", + EventType::Jmap(JmapEvent::WebsocketStart) => "jmap.websocket-start", + EventType::Jmap(JmapEvent::WebsocketStop) => "jmap.websocket-stop", + EventType::Jmap(JmapEvent::WebsocketError) => "jmap.websocket-error", + EventType::Limit(LimitEvent::SizeRequest) => "limit.size-request", + EventType::Limit(LimitEvent::SizeUpload) => "limit.size-upload", + EventType::Limit(LimitEvent::CallsIn) => "limit.calls-in", + EventType::Limit(LimitEvent::ConcurrentRequest) => "limit.concurrent-request", + EventType::Limit(LimitEvent::ConcurrentUpload) => "limit.concurrent-upload", + EventType::Limit(LimitEvent::ConcurrentConnection) => "limit.concurrent-connection", + EventType::Limit(LimitEvent::Quota) => "limit.quota", + EventType::Limit(LimitEvent::BlobQuota) => "limit.blob-quota", + EventType::Limit(LimitEvent::TenantQuota) => "limit.tenant-quota", + EventType::Limit(LimitEvent::TooManyRequests) => "limit.too-many-requests", + EventType::MailAuth(MailAuthEvent::ParseError) => "mail-auth.parse-error", + EventType::MailAuth(MailAuthEvent::MissingParameters) => "mail-auth.missing-parameters", + EventType::MailAuth(MailAuthEvent::NoHeadersFound) => "mail-auth.no-headers-found", + EventType::MailAuth(MailAuthEvent::Crypto) => "mail-auth.crypto", + EventType::MailAuth(MailAuthEvent::Io) => "mail-auth.io", + EventType::MailAuth(MailAuthEvent::Base64) => "mail-auth.base64", + EventType::MailAuth(MailAuthEvent::DnsError) => "mail-auth.dns-error", + EventType::MailAuth(MailAuthEvent::DnsRecordNotFound) => { + "mail-auth.dns-record-not-found" + } + EventType::MailAuth(MailAuthEvent::DnsInvalidRecordType) => { + "mail-auth.dns-invalid-record-type" + } + EventType::MailAuth(MailAuthEvent::PolicyNotAligned) => "mail-auth.policy-not-aligned", + EventType::Manage(ManageEvent::MissingParameter) => "manage.missing-parameter", + EventType::Manage(ManageEvent::AlreadyExists) => "manage.already-exists", + EventType::Manage(ManageEvent::AssertFailed) => "manage.assert-failed", + EventType::Manage(ManageEvent::NotFound) => "manage.not-found", + EventType::Manage(ManageEvent::NotSupported) => "manage.not-supported", + EventType::Manage(ManageEvent::Error) => "manage.error", + EventType::ManageSieve(ManageSieveEvent::ConnectionStart) => { + "manage-sieve.connection-start" + } + EventType::ManageSieve(ManageSieveEvent::ConnectionEnd) => { + "manage-sieve.connection-end" + } + EventType::ManageSieve(ManageSieveEvent::CreateScript) => "manage-sieve.create-script", + EventType::ManageSieve(ManageSieveEvent::UpdateScript) => "manage-sieve.update-script", + EventType::ManageSieve(ManageSieveEvent::GetScript) => "manage-sieve.get-script", + EventType::ManageSieve(ManageSieveEvent::DeleteScript) => "manage-sieve.delete-script", + EventType::ManageSieve(ManageSieveEvent::RenameScript) => "manage-sieve.rename-script", + EventType::ManageSieve(ManageSieveEvent::CheckScript) => "manage-sieve.check-script", + EventType::ManageSieve(ManageSieveEvent::HaveSpace) => "manage-sieve.have-space", + EventType::ManageSieve(ManageSieveEvent::ListScripts) => "manage-sieve.list-scripts", + EventType::ManageSieve(ManageSieveEvent::SetActive) => "manage-sieve.set-active", + EventType::ManageSieve(ManageSieveEvent::Capabilities) => "manage-sieve.capabilities", + EventType::ManageSieve(ManageSieveEvent::StartTls) => "manage-sieve.start-tls", + EventType::ManageSieve(ManageSieveEvent::Unauthenticate) => { + "manage-sieve.unauthenticate" + } + EventType::ManageSieve(ManageSieveEvent::Logout) => "manage-sieve.logout", + EventType::ManageSieve(ManageSieveEvent::Noop) => "manage-sieve.noop", + EventType::ManageSieve(ManageSieveEvent::Error) => "manage-sieve.error", + EventType::ManageSieve(ManageSieveEvent::RawInput) => "manage-sieve.raw-input", + EventType::ManageSieve(ManageSieveEvent::RawOutput) => "manage-sieve.raw-output", + EventType::MessageIngest(MessageIngestEvent::Ham) => "message-ingest.ham", + EventType::MessageIngest(MessageIngestEvent::Spam) => "message-ingest.spam", + EventType::MessageIngest(MessageIngestEvent::ImapAppend) => { + "message-ingest.imap-append" + } + EventType::MessageIngest(MessageIngestEvent::JmapAppend) => { + "message-ingest.jmap-append" + } + EventType::MessageIngest(MessageIngestEvent::Duplicate) => "message-ingest.duplicate", + EventType::MessageIngest(MessageIngestEvent::Error) => "message-ingest.error", + EventType::MessageIngest(MessageIngestEvent::FtsIndex) => "message-ingest.fts-index", + EventType::Milter(MilterEvent::Read) => "milter.read", + EventType::Milter(MilterEvent::Write) => "milter.write", + EventType::Milter(MilterEvent::ActionAccept) => "milter.action-accept", + EventType::Milter(MilterEvent::ActionDiscard) => "milter.action-discard", + EventType::Milter(MilterEvent::ActionReject) => "milter.action-reject", + EventType::Milter(MilterEvent::ActionTempFail) => "milter.action-temp-fail", + EventType::Milter(MilterEvent::ActionReplyCode) => "milter.action-reply-code", + EventType::Milter(MilterEvent::ActionConnectionFailure) => { + "milter.action-connection-failure" + } + EventType::Milter(MilterEvent::ActionShutdown) => "milter.action-shutdown", + EventType::Milter(MilterEvent::IoError) => "milter.io-error", + EventType::Milter(MilterEvent::FrameTooLarge) => "milter.frame-too-large", + EventType::Milter(MilterEvent::FrameInvalid) => "milter.frame-invalid", + EventType::Milter(MilterEvent::UnexpectedResponse) => "milter.unexpected-response", + EventType::Milter(MilterEvent::Timeout) => "milter.timeout", + EventType::Milter(MilterEvent::TlsInvalidName) => "milter.tls-invalid-name", + EventType::Milter(MilterEvent::Disconnected) => "milter.disconnected", + EventType::Milter(MilterEvent::ParseError) => "milter.parse-error", + EventType::MtaHook(MtaHookEvent::ActionAccept) => "mta-hook.action-accept", + EventType::MtaHook(MtaHookEvent::ActionDiscard) => "mta-hook.action-discard", + EventType::MtaHook(MtaHookEvent::ActionReject) => "mta-hook.action-reject", + EventType::MtaHook(MtaHookEvent::ActionQuarantine) => "mta-hook.action-quarantine", + EventType::MtaHook(MtaHookEvent::Error) => "mta-hook.error", + EventType::MtaSts(MtaStsEvent::Authorized) => "mta-sts.authorized", + EventType::MtaSts(MtaStsEvent::NotAuthorized) => "mta-sts.not-authorized", + EventType::MtaSts(MtaStsEvent::PolicyFetch) => "mta-sts.policy-fetch", + EventType::MtaSts(MtaStsEvent::PolicyNotFound) => "mta-sts.policy-not-found", + EventType::MtaSts(MtaStsEvent::PolicyFetchError) => "mta-sts.policy-fetch-error", + EventType::MtaSts(MtaStsEvent::InvalidPolicy) => "mta-sts.invalid-policy", + EventType::Network(NetworkEvent::ListenStart) => "network.listen-start", + EventType::Network(NetworkEvent::ListenStop) => "network.listen-stop", + EventType::Network(NetworkEvent::ListenError) => "network.listen-error", + EventType::Network(NetworkEvent::BindError) => "network.bind-error", + EventType::Network(NetworkEvent::ReadError) => "network.read-error", + EventType::Network(NetworkEvent::WriteError) => "network.write-error", + EventType::Network(NetworkEvent::FlushError) => "network.flush-error", + EventType::Network(NetworkEvent::AcceptError) => "network.accept-error", + EventType::Network(NetworkEvent::SplitError) => "network.split-error", + EventType::Network(NetworkEvent::Timeout) => "network.timeout", + EventType::Network(NetworkEvent::Closed) => "network.closed", + EventType::Network(NetworkEvent::ProxyError) => "network.proxy-error", + EventType::Network(NetworkEvent::SetOptError) => "network.set-opt-error", + EventType::OutgoingReport(OutgoingReportEvent::SpfReport) => { + "outgoing-report.spf-report" + } + EventType::OutgoingReport(OutgoingReportEvent::SpfRateLimited) => { + "outgoing-report.spf-rate-limited" + } + EventType::OutgoingReport(OutgoingReportEvent::DkimReport) => { + "outgoing-report.dkim-report" + } + EventType::OutgoingReport(OutgoingReportEvent::DkimRateLimited) => { + "outgoing-report.dkim-rate-limited" + } + EventType::OutgoingReport(OutgoingReportEvent::DmarcReport) => { + "outgoing-report.dmarc-report" + } + EventType::OutgoingReport(OutgoingReportEvent::DmarcRateLimited) => { + "outgoing-report.dmarc-rate-limited" + } + EventType::OutgoingReport(OutgoingReportEvent::DmarcAggregateReport) => { + "outgoing-report.dmarc-aggregate-report" + } + EventType::OutgoingReport(OutgoingReportEvent::TlsAggregate) => { + "outgoing-report.tls-aggregate" + } + EventType::OutgoingReport(OutgoingReportEvent::HttpSubmission) => { + "outgoing-report.http-submission" + } + EventType::OutgoingReport(OutgoingReportEvent::UnauthorizedReportingAddress) => { + "outgoing-report.unauthorized-reporting-address" + } + EventType::OutgoingReport(OutgoingReportEvent::ReportingAddressValidationError) => { + "outgoing-report.reporting-address-validation-error" + } + EventType::OutgoingReport(OutgoingReportEvent::NotFound) => "outgoing-report.not-found", + EventType::OutgoingReport(OutgoingReportEvent::SubmissionError) => { + "outgoing-report.submission-error" + } + EventType::OutgoingReport(OutgoingReportEvent::NoRecipientsFound) => { + "outgoing-report.no-recipients-found" + } + EventType::OutgoingReport(OutgoingReportEvent::Locked) => "outgoing-report.locked", + EventType::Pop3(Pop3Event::ConnectionStart) => "pop3.connection-start", + EventType::Pop3(Pop3Event::ConnectionEnd) => "pop3.connection-end", + EventType::Pop3(Pop3Event::Delete) => "pop3.delete", + EventType::Pop3(Pop3Event::Reset) => "pop3.reset", + EventType::Pop3(Pop3Event::Quit) => "pop3.quit", + EventType::Pop3(Pop3Event::Fetch) => "pop3.fetch", + EventType::Pop3(Pop3Event::List) => "pop3.list", + EventType::Pop3(Pop3Event::ListMessage) => "pop3.list-message", + EventType::Pop3(Pop3Event::Uidl) => "pop3.uidl", + EventType::Pop3(Pop3Event::UidlMessage) => "pop3.uidl-message", + EventType::Pop3(Pop3Event::Stat) => "pop3.stat", + EventType::Pop3(Pop3Event::Noop) => "pop3.noop", + EventType::Pop3(Pop3Event::Capabilities) => "pop3.capabilities", + EventType::Pop3(Pop3Event::StartTls) => "pop3.start-tls", + EventType::Pop3(Pop3Event::Utf8) => "pop3.utf8", + EventType::Pop3(Pop3Event::Error) => "pop3.error", + EventType::Pop3(Pop3Event::RawInput) => "pop3.raw-input", + EventType::Pop3(Pop3Event::RawOutput) => "pop3.raw-output", + EventType::Purge(PurgeEvent::Started) => "purge.started", + EventType::Purge(PurgeEvent::Finished) => "purge.finished", + EventType::Purge(PurgeEvent::Running) => "purge.running", + EventType::Purge(PurgeEvent::Error) => "purge.error", + EventType::Purge(PurgeEvent::InProgress) => "purge.in-progress", + EventType::Purge(PurgeEvent::AutoExpunge) => "purge.auto-expunge", + EventType::Purge(PurgeEvent::BlobCleanup) => "purge.blob-cleanup", + EventType::PushSubscription(PushSubscriptionEvent::Success) => { + "push-subscription.success" + } + EventType::PushSubscription(PushSubscriptionEvent::Error) => "push-subscription.error", + EventType::PushSubscription(PushSubscriptionEvent::NotFound) => { + "push-subscription.not-found" + } + EventType::Queue(QueueEvent::QueueMessage) => "queue.queue-message", + EventType::Queue(QueueEvent::QueueMessageAuthenticated) => { + "queue.queue-message-authenticated" + } + EventType::Queue(QueueEvent::QueueReport) => "queue.queue-report", + EventType::Queue(QueueEvent::QueueDsn) => "queue.queue-dsn", + EventType::Queue(QueueEvent::QueueAutogenerated) => "queue.queue-autogenerated", + EventType::Queue(QueueEvent::Rescheduled) => "queue.rescheduled", + EventType::Queue(QueueEvent::Locked) => "queue.locked", + EventType::Queue(QueueEvent::BlobNotFound) => "queue.blob-not-found", + EventType::Queue(QueueEvent::RateLimitExceeded) => "queue.rate-limit-exceeded", + EventType::Queue(QueueEvent::ConcurrencyLimitExceeded) => { + "queue.concurrency-limit-exceeded" + } + EventType::Queue(QueueEvent::QuotaExceeded) => "queue.quota-exceeded", + EventType::Queue(QueueEvent::BackPressure) => "queue.back-pressure", + EventType::Resource(ResourceEvent::NotFound) => "resource.not-found", + EventType::Resource(ResourceEvent::BadParameters) => "resource.bad-parameters", + EventType::Resource(ResourceEvent::Error) => "resource.error", + EventType::Resource(ResourceEvent::DownloadExternal) => "resource.download-external", + EventType::Resource(ResourceEvent::WebadminUnpacked) => "resource.webadmin-unpacked", + EventType::Security(SecurityEvent::AuthenticationBan) => "security.authentication-ban", + EventType::Security(SecurityEvent::AbuseBan) => "security.abuse-ban", + EventType::Security(SecurityEvent::ScanBan) => "security.scan-ban", + EventType::Security(SecurityEvent::LoiterBan) => "security.loiter-ban", + EventType::Security(SecurityEvent::IpBlocked) => "security.ip-blocked", + EventType::Security(SecurityEvent::Unauthorized) => "security.unauthorized", + EventType::Server(ServerEvent::Startup) => "server.startup", + EventType::Server(ServerEvent::Shutdown) => "server.shutdown", + EventType::Server(ServerEvent::StartupError) => "server.startup-error", + EventType::Server(ServerEvent::ThreadError) => "server.thread-error", + EventType::Server(ServerEvent::Licensing) => "server.licensing", + EventType::Sieve(SieveEvent::ActionAccept) => "sieve.action-accept", + EventType::Sieve(SieveEvent::ActionAcceptReplace) => "sieve.action-accept-replace", + EventType::Sieve(SieveEvent::ActionDiscard) => "sieve.action-discard", + EventType::Sieve(SieveEvent::ActionReject) => "sieve.action-reject", + EventType::Sieve(SieveEvent::SendMessage) => "sieve.send-message", + EventType::Sieve(SieveEvent::MessageTooLarge) => "sieve.message-too-large", + EventType::Sieve(SieveEvent::ScriptNotFound) => "sieve.script-not-found", + EventType::Sieve(SieveEvent::ListNotFound) => "sieve.list-not-found", + EventType::Sieve(SieveEvent::RuntimeError) => "sieve.runtime-error", + EventType::Sieve(SieveEvent::UnexpectedError) => "sieve.unexpected-error", + EventType::Sieve(SieveEvent::NotSupported) => "sieve.not-supported", + EventType::Sieve(SieveEvent::QuotaExceeded) => "sieve.quota-exceeded", + EventType::Smtp(SmtpEvent::ConnectionStart) => "smtp.connection-start", + EventType::Smtp(SmtpEvent::ConnectionEnd) => "smtp.connection-end", + EventType::Smtp(SmtpEvent::Error) => "smtp.error", + EventType::Smtp(SmtpEvent::IdNotFound) => "smtp.id-not-found", + EventType::Smtp(SmtpEvent::ConcurrencyLimitExceeded) => { + "smtp.concurrency-limit-exceeded" + } + EventType::Smtp(SmtpEvent::TransferLimitExceeded) => "smtp.transfer-limit-exceeded", + EventType::Smtp(SmtpEvent::RateLimitExceeded) => "smtp.rate-limit-exceeded", + EventType::Smtp(SmtpEvent::TimeLimitExceeded) => "smtp.time-limit-exceeded", + EventType::Smtp(SmtpEvent::MissingAuthDirectory) => "smtp.missing-auth-directory", + EventType::Smtp(SmtpEvent::MessageParseFailed) => "smtp.message-parse-failed", + EventType::Smtp(SmtpEvent::MessageTooLarge) => "smtp.message-too-large", + EventType::Smtp(SmtpEvent::LoopDetected) => "smtp.loop-detected", + EventType::Smtp(SmtpEvent::DkimPass) => "smtp.dkim-pass", + EventType::Smtp(SmtpEvent::DkimFail) => "smtp.dkim-fail", + EventType::Smtp(SmtpEvent::ArcPass) => "smtp.arc-pass", + EventType::Smtp(SmtpEvent::ArcFail) => "smtp.arc-fail", + EventType::Smtp(SmtpEvent::SpfEhloPass) => "smtp.spf-ehlo-pass", + EventType::Smtp(SmtpEvent::SpfEhloFail) => "smtp.spf-ehlo-fail", + EventType::Smtp(SmtpEvent::SpfFromPass) => "smtp.spf-from-pass", + EventType::Smtp(SmtpEvent::SpfFromFail) => "smtp.spf-from-fail", + EventType::Smtp(SmtpEvent::DmarcPass) => "smtp.dmarc-pass", + EventType::Smtp(SmtpEvent::DmarcFail) => "smtp.dmarc-fail", + EventType::Smtp(SmtpEvent::IprevPass) => "smtp.iprev-pass", + EventType::Smtp(SmtpEvent::IprevFail) => "smtp.iprev-fail", + EventType::Smtp(SmtpEvent::TooManyMessages) => "smtp.too-many-messages", + EventType::Smtp(SmtpEvent::Ehlo) => "smtp.ehlo", + EventType::Smtp(SmtpEvent::InvalidEhlo) => "smtp.invalid-ehlo", + EventType::Smtp(SmtpEvent::DidNotSayEhlo) => "smtp.did-not-say-ehlo", + EventType::Smtp(SmtpEvent::EhloExpected) => "smtp.ehlo-expected", + EventType::Smtp(SmtpEvent::LhloExpected) => "smtp.lhlo-expected", + EventType::Smtp(SmtpEvent::MailFromUnauthenticated) => "smtp.mail-from-unauthenticated", + EventType::Smtp(SmtpEvent::MailFromUnauthorized) => "smtp.mail-from-unauthorized", + EventType::Smtp(SmtpEvent::MailFromNotAllowed) => "smtp.mail-from-not-allowed", + EventType::Smtp(SmtpEvent::MailFromRewritten) => "smtp.mail-from-rewritten", + EventType::Smtp(SmtpEvent::MailFromMissing) => "smtp.mail-from-missing", + EventType::Smtp(SmtpEvent::MailFrom) => "smtp.mail-from", + EventType::Smtp(SmtpEvent::MultipleMailFrom) => "smtp.multiple-mail-from", + EventType::Smtp(SmtpEvent::MailboxDoesNotExist) => "smtp.mailbox-does-not-exist", + EventType::Smtp(SmtpEvent::RelayNotAllowed) => "smtp.relay-not-allowed", + EventType::Smtp(SmtpEvent::RcptTo) => "smtp.rcpt-to", + EventType::Smtp(SmtpEvent::RcptToDuplicate) => "smtp.rcpt-to-duplicate", + EventType::Smtp(SmtpEvent::RcptToRewritten) => "smtp.rcpt-to-rewritten", + EventType::Smtp(SmtpEvent::RcptToMissing) => "smtp.rcpt-to-missing", + EventType::Smtp(SmtpEvent::RcptToGreylisted) => "smtp.rcpt-to-greylisted", + EventType::Smtp(SmtpEvent::TooManyRecipients) => "smtp.too-many-recipients", + EventType::Smtp(SmtpEvent::TooManyInvalidRcpt) => "smtp.too-many-invalid-rcpt", + EventType::Smtp(SmtpEvent::RawInput) => "smtp.raw-input", + EventType::Smtp(SmtpEvent::RawOutput) => "smtp.raw-output", + EventType::Smtp(SmtpEvent::MissingLocalHostname) => "smtp.missing-local-hostname", + EventType::Smtp(SmtpEvent::Vrfy) => "smtp.vrfy", + EventType::Smtp(SmtpEvent::VrfyNotFound) => "smtp.vrfy-not-found", + EventType::Smtp(SmtpEvent::VrfyDisabled) => "smtp.vrfy-disabled", + EventType::Smtp(SmtpEvent::Expn) => "smtp.expn", + EventType::Smtp(SmtpEvent::ExpnNotFound) => "smtp.expn-not-found", + EventType::Smtp(SmtpEvent::ExpnDisabled) => "smtp.expn-disabled", + EventType::Smtp(SmtpEvent::RequireTlsDisabled) => "smtp.require-tls-disabled", + EventType::Smtp(SmtpEvent::DeliverByDisabled) => "smtp.deliver-by-disabled", + EventType::Smtp(SmtpEvent::DeliverByInvalid) => "smtp.deliver-by-invalid", + EventType::Smtp(SmtpEvent::FutureReleaseDisabled) => "smtp.future-release-disabled", + EventType::Smtp(SmtpEvent::FutureReleaseInvalid) => "smtp.future-release-invalid", + EventType::Smtp(SmtpEvent::MtPriorityDisabled) => "smtp.mt-priority-disabled", + EventType::Smtp(SmtpEvent::MtPriorityInvalid) => "smtp.mt-priority-invalid", + EventType::Smtp(SmtpEvent::DsnDisabled) => "smtp.dsn-disabled", + EventType::Smtp(SmtpEvent::AuthNotAllowed) => "smtp.auth-not-allowed", + EventType::Smtp(SmtpEvent::AuthMechanismNotSupported) => { + "smtp.auth-mechanism-not-supported" + } + EventType::Smtp(SmtpEvent::AuthExchangeTooLong) => "smtp.auth-exchange-too-long", + EventType::Smtp(SmtpEvent::AlreadyAuthenticated) => "smtp.already-authenticated", + EventType::Smtp(SmtpEvent::Noop) => "smtp.noop", + EventType::Smtp(SmtpEvent::StartTls) => "smtp.start-tls", + EventType::Smtp(SmtpEvent::StartTlsUnavailable) => "smtp.start-tls-unavailable", + EventType::Smtp(SmtpEvent::StartTlsAlready) => "smtp.start-tls-already", + EventType::Smtp(SmtpEvent::Rset) => "smtp.rset", + EventType::Smtp(SmtpEvent::Quit) => "smtp.quit", + EventType::Smtp(SmtpEvent::Help) => "smtp.help", + EventType::Smtp(SmtpEvent::CommandNotImplemented) => "smtp.command-not-implemented", + EventType::Smtp(SmtpEvent::InvalidCommand) => "smtp.invalid-command", + EventType::Smtp(SmtpEvent::InvalidSenderAddress) => "smtp.invalid-sender-address", + EventType::Smtp(SmtpEvent::InvalidRecipientAddress) => "smtp.invalid-recipient-address", + EventType::Smtp(SmtpEvent::InvalidParameter) => "smtp.invalid-parameter", + EventType::Smtp(SmtpEvent::UnsupportedParameter) => "smtp.unsupported-parameter", + EventType::Smtp(SmtpEvent::SyntaxError) => "smtp.syntax-error", + EventType::Smtp(SmtpEvent::RequestTooLarge) => "smtp.request-too-large", + EventType::Spam(SpamEvent::Pyzor) => "spam.pyzor", + EventType::Spam(SpamEvent::PyzorError) => "spam.pyzor-error", + EventType::Spam(SpamEvent::Dnsbl) => "spam.dnsbl", + EventType::Spam(SpamEvent::DnsblError) => "spam.dnsbl-error", + EventType::Spam(SpamEvent::TrainStarted) => "spam.train-started", + EventType::Spam(SpamEvent::TrainCompleted) => "spam.train-completed", + EventType::Spam(SpamEvent::TrainSampleAdded) => "spam.train-sample-added", + EventType::Spam(SpamEvent::TrainSampleNotFound) => "spam.train-sample-not-found", + EventType::Spam(SpamEvent::Classify) => "spam.classify", + EventType::Spam(SpamEvent::ModelLoaded) => "spam.model-loaded", + EventType::Spam(SpamEvent::ModelNotReady) => "spam.model-not-ready", + EventType::Spam(SpamEvent::ModelNotFound) => "spam.model-not-found", + EventType::Spf(SpfEvent::Pass) => "spf.pass", + EventType::Spf(SpfEvent::Fail) => "spf.fail", + EventType::Spf(SpfEvent::SoftFail) => "spf.soft-fail", + EventType::Spf(SpfEvent::Neutral) => "spf.neutral", + EventType::Spf(SpfEvent::TempError) => "spf.temp-error", + EventType::Spf(SpfEvent::PermError) => "spf.perm-error", + EventType::Spf(SpfEvent::None) => "spf.none", + EventType::Store(StoreEvent::AssertValueFailed) => "store.assert-value-failed", + EventType::Store(StoreEvent::FoundationdbError) => "store.foundationdb-error", + EventType::Store(StoreEvent::MysqlError) => "store.mysql-error", + EventType::Store(StoreEvent::PostgresqlError) => "store.postgresql-error", + EventType::Store(StoreEvent::RocksdbError) => "store.rocksdb-error", + EventType::Store(StoreEvent::SqliteError) => "store.sqlite-error", + EventType::Store(StoreEvent::LdapError) => "store.ldap-error", + EventType::Store(StoreEvent::ElasticsearchError) => "store.elasticsearch-error", + EventType::Store(StoreEvent::MeilisearchError) => "store.meilisearch-error", + EventType::Store(StoreEvent::RedisError) => "store.redis-error", + EventType::Store(StoreEvent::S3Error) => "store.s3-error", + EventType::Store(StoreEvent::AzureError) => "store.azure-error", + EventType::Store(StoreEvent::FilesystemError) => "store.filesystem-error", + EventType::Store(StoreEvent::PoolError) => "store.pool-error", + EventType::Store(StoreEvent::DataCorruption) => "store.data-corruption", + EventType::Store(StoreEvent::DecompressError) => "store.decompress-error", + EventType::Store(StoreEvent::DeserializeError) => "store.deserialize-error", + EventType::Store(StoreEvent::NotFound) => "store.not-found", + EventType::Store(StoreEvent::NotConfigured) => "store.not-configured", + EventType::Store(StoreEvent::NotSupported) => "store.not-supported", + EventType::Store(StoreEvent::UnexpectedError) => "store.unexpected-error", + EventType::Store(StoreEvent::CryptoError) => "store.crypto-error", + EventType::Store(StoreEvent::HttpStoreError) => "store.http-store-error", + EventType::Store(StoreEvent::CacheMiss) => "store.cache-miss", + EventType::Store(StoreEvent::CacheHit) => "store.cache-hit", + EventType::Store(StoreEvent::CacheStale) => "store.cache-stale", + EventType::Store(StoreEvent::CacheUpdate) => "store.cache-update", + EventType::Store(StoreEvent::BlobMissingMarker) => "store.blob-missing-marker", + EventType::Store(StoreEvent::DataWrite) => "store.data-write", + EventType::Store(StoreEvent::DataIterate) => "store.data-iterate", + EventType::Store(StoreEvent::BlobRead) => "store.blob-read", + EventType::Store(StoreEvent::BlobWrite) => "store.blob-write", + EventType::Store(StoreEvent::BlobDelete) => "store.blob-delete", + EventType::Store(StoreEvent::SqlQuery) => "store.sql-query", + EventType::Store(StoreEvent::LdapQuery) => "store.ldap-query", + EventType::Store(StoreEvent::LdapWarning) => "store.ldap-warning", + EventType::Store(StoreEvent::HttpStoreFetch) => "store.http-store-fetch", + EventType::TaskQueue(TaskQueueEvent::TaskAcquired) => "task-queue.task-acquired", + EventType::TaskQueue(TaskQueueEvent::TaskLocked) => "task-queue.task-locked", + EventType::TaskQueue(TaskQueueEvent::TaskIgnored) => "task-queue.task-ignored", + EventType::TaskQueue(TaskQueueEvent::TaskFailed) => "task-queue.task-failed", + EventType::TaskQueue(TaskQueueEvent::BlobNotFound) => "task-queue.blob-not-found", + EventType::TaskQueue(TaskQueueEvent::MetadataNotFound) => { + "task-queue.metadata-not-found" + } + EventType::Telemetry(TelemetryEvent::Alert) => "telemetry.alert", + EventType::Telemetry(TelemetryEvent::LogError) => "telemetry.log-error", + EventType::Telemetry(TelemetryEvent::WebhookError) => "telemetry.webhook-error", + EventType::Telemetry(TelemetryEvent::OtelExporterError) => { + "telemetry.otel-exporter-error" + } + EventType::Telemetry(TelemetryEvent::OtelMetricsExporterError) => { + "telemetry.otel-metrics-exporter-error" + } + EventType::Telemetry(TelemetryEvent::PrometheusExporterError) => { + "telemetry.prometheus-exporter-error" + } + EventType::Telemetry(TelemetryEvent::JournalError) => "telemetry.journal-error", + EventType::Tls(TlsEvent::Handshake) => "tls.handshake", + EventType::Tls(TlsEvent::HandshakeError) => "tls.handshake-error", + EventType::Tls(TlsEvent::NotConfigured) => "tls.not-configured", + EventType::Tls(TlsEvent::CertificateNotFound) => "tls.certificate-not-found", + EventType::Tls(TlsEvent::NoCertificatesAvailable) => "tls.no-certificates-available", + EventType::Tls(TlsEvent::MultipleCertificatesAvailable) => { + "tls.multiple-certificates-available" + } + EventType::TlsRpt(TlsRptEvent::RecordFetch) => "tls-rpt.record-fetch", + EventType::TlsRpt(TlsRptEvent::RecordFetchError) => "tls-rpt.record-fetch-error", + EventType::TlsRpt(TlsRptEvent::RecordNotFound) => "tls-rpt.record-not-found", + EventType::WebDav(WebDavEvent::Propfind) => "web-dav.propfind", + EventType::WebDav(WebDavEvent::Proppatch) => "web-dav.proppatch", + EventType::WebDav(WebDavEvent::Get) => "web-dav.get", + EventType::WebDav(WebDavEvent::Head) => "web-dav.head", + EventType::WebDav(WebDavEvent::Report) => "web-dav.report", + EventType::WebDav(WebDavEvent::Mkcol) => "web-dav.mkcol", + EventType::WebDav(WebDavEvent::Mkcalendar) => "web-dav.mkcalendar", + EventType::WebDav(WebDavEvent::Delete) => "web-dav.delete", + EventType::WebDav(WebDavEvent::Put) => "web-dav.put", + EventType::WebDav(WebDavEvent::Post) => "web-dav.post", + EventType::WebDav(WebDavEvent::Patch) => "web-dav.patch", + EventType::WebDav(WebDavEvent::Copy) => "web-dav.copy", + EventType::WebDav(WebDavEvent::Move) => "web-dav.move", + EventType::WebDav(WebDavEvent::Lock) => "web-dav.lock", + EventType::WebDav(WebDavEvent::Unlock) => "web-dav.unlock", + EventType::WebDav(WebDavEvent::Acl) => "web-dav.acl", + EventType::WebDav(WebDavEvent::Options) => "web-dav.options", + EventType::WebDav(WebDavEvent::Error) => "web-dav.error", + } + } + + pub const fn to_id(&self) -> u16 { + match self { + EventType::Acme(AcmeEvent::AuthStart) => 3, + EventType::Acme(AcmeEvent::AuthPending) => 2, + EventType::Acme(AcmeEvent::AuthValid) => 5, + EventType::Acme(AcmeEvent::AuthCompleted) => 0, + EventType::Acme(AcmeEvent::AuthError) => 1, + EventType::Acme(AcmeEvent::AuthTooManyAttempts) => 4, + EventType::Acme(AcmeEvent::ProcessCert) => 22, + EventType::Acme(AcmeEvent::OrderStart) => 20, + EventType::Acme(AcmeEvent::OrderProcessing) => 18, + EventType::Acme(AcmeEvent::OrderCompleted) => 16, + EventType::Acme(AcmeEvent::OrderReady) => 19, + EventType::Acme(AcmeEvent::OrderValid) => 21, + EventType::Acme(AcmeEvent::OrderInvalid) => 17, + EventType::Acme(AcmeEvent::RenewBackoff) => 23, + EventType::Acme(AcmeEvent::ClientSuppliedSni) => 7, + EventType::Acme(AcmeEvent::ClientMissingSni) => 6, + EventType::Acme(AcmeEvent::TlsAlpnReceived) => 25, + EventType::Acme(AcmeEvent::TlsAlpnError) => 24, + EventType::Acme(AcmeEvent::TokenNotFound) => 26, + EventType::Acme(AcmeEvent::Error) => 15, + EventType::Ai(AiEvent::LlmResponse) => 556, + EventType::Ai(AiEvent::ApiError) => 557, + EventType::Arc(ArcEvent::ChainTooLong) => 28, + EventType::Arc(ArcEvent::InvalidInstance) => 31, + EventType::Arc(ArcEvent::InvalidCv) => 30, + EventType::Arc(ArcEvent::HasHeaderTag) => 29, + EventType::Arc(ArcEvent::BrokenChain) => 27, + EventType::Arc(ArcEvent::SealerNotFound) => 32, + EventType::Auth(AuthEvent::Success) => 37, + EventType::Auth(AuthEvent::Failed) => 35, + EventType::Auth(AuthEvent::TokenExpired) => 554, + EventType::Auth(AuthEvent::MissingTotp) => 36, + EventType::Auth(AuthEvent::TooManyAttempts) => 38, + EventType::Auth(AuthEvent::ClientRegistration) => 555, + EventType::Auth(AuthEvent::Error) => 34, + EventType::Calendar(CalendarEvent::RuleExpansionError) => 576, + EventType::Calendar(CalendarEvent::AlarmSent) => 579, + EventType::Calendar(CalendarEvent::AlarmSkipped) => 580, + EventType::Calendar(CalendarEvent::AlarmRecipientOverride) => 581, + EventType::Calendar(CalendarEvent::AlarmFailed) => 582, + EventType::Calendar(CalendarEvent::ItipMessageSent) => 583, + EventType::Calendar(CalendarEvent::ItipMessageReceived) => 584, + EventType::Calendar(CalendarEvent::ItipMessageError) => 585, + EventType::Cluster(ClusterEvent::SubscriberStart) => 39, + EventType::Cluster(ClusterEvent::SubscriberStop) => 40, + EventType::Cluster(ClusterEvent::SubscriberError) => 41, + EventType::Cluster(ClusterEvent::SubscriberDisconnected) => 42, + EventType::Cluster(ClusterEvent::PublisherStart) => 43, + EventType::Cluster(ClusterEvent::PublisherStop) => 44, + EventType::Cluster(ClusterEvent::PublisherError) => 45, + EventType::Cluster(ClusterEvent::MessageReceived) => 46, + EventType::Cluster(ClusterEvent::MessageSkipped) => 47, + EventType::Cluster(ClusterEvent::MessageInvalid) => 49, + EventType::Config(ConfigEvent::ParseError) => 62, + EventType::Config(ConfigEvent::BuildError) => 54, + EventType::Config(ConfigEvent::MacroError) => 60, + EventType::Config(ConfigEvent::WriteError) => 65, + EventType::Config(ConfigEvent::FetchError) => 58, + EventType::Config(ConfigEvent::DefaultApplied) => 56, + EventType::Config(ConfigEvent::MissingSetting) => 61, + EventType::Config(ConfigEvent::UnusedSetting) => 64, + EventType::Config(ConfigEvent::ParseWarning) => 63, + EventType::Config(ConfigEvent::BuildWarning) => 55, + EventType::Config(ConfigEvent::ImportExternal) => 59, + EventType::Config(ConfigEvent::AlreadyUpToDate) => 53, + EventType::Dane(DaneEvent::AuthenticationSuccess) => 67, + EventType::Dane(DaneEvent::AuthenticationFailure) => 66, + EventType::Dane(DaneEvent::NoCertificatesFound) => 69, + EventType::Dane(DaneEvent::CertificateParseError) => 68, + EventType::Dane(DaneEvent::TlsaRecordMatch) => 73, + EventType::Dane(DaneEvent::TlsaRecordFetch) => 70, + EventType::Dane(DaneEvent::TlsaRecordFetchError) => 71, + EventType::Dane(DaneEvent::TlsaRecordNotFound) => 75, + EventType::Dane(DaneEvent::TlsaRecordNotDnssecSigned) => 74, + EventType::Dane(DaneEvent::TlsaRecordInvalid) => 72, + EventType::Delivery(DeliveryEvent::AttemptStart) => 77, + EventType::Delivery(DeliveryEvent::AttemptEnd) => 76, + EventType::Delivery(DeliveryEvent::Completed) => 80, + EventType::Delivery(DeliveryEvent::Failed) => 92, + EventType::Delivery(DeliveryEvent::DomainDeliveryStart) => 85, + EventType::Delivery(DeliveryEvent::MxLookup) => 101, + EventType::Delivery(DeliveryEvent::MxLookupFailed) => 102, + EventType::Delivery(DeliveryEvent::IpLookup) => 95, + EventType::Delivery(DeliveryEvent::IpLookupFailed) => 96, + EventType::Delivery(DeliveryEvent::NullMx) => 103, + EventType::Delivery(DeliveryEvent::Connect) => 82, + EventType::Delivery(DeliveryEvent::ConnectError) => 83, + EventType::Delivery(DeliveryEvent::MissingOutboundHostname) => 100, + EventType::Delivery(DeliveryEvent::GreetingFailed) => 93, + EventType::Delivery(DeliveryEvent::Ehlo) => 90, + EventType::Delivery(DeliveryEvent::EhloRejected) => 91, + EventType::Delivery(DeliveryEvent::Auth) => 78, + EventType::Delivery(DeliveryEvent::AuthFailed) => 79, + EventType::Delivery(DeliveryEvent::MailFrom) => 97, + EventType::Delivery(DeliveryEvent::MailFromRejected) => 98, + EventType::Delivery(DeliveryEvent::Delivered) => 84, + EventType::Delivery(DeliveryEvent::RcptTo) => 107, + EventType::Delivery(DeliveryEvent::RcptToRejected) => 109, + EventType::Delivery(DeliveryEvent::RcptToFailed) => 108, + EventType::Delivery(DeliveryEvent::MessageRejected) => 99, + EventType::Delivery(DeliveryEvent::StartTls) => 110, + EventType::Delivery(DeliveryEvent::StartTlsUnavailable) => 113, + EventType::Delivery(DeliveryEvent::StartTlsError) => 112, + EventType::Delivery(DeliveryEvent::StartTlsDisabled) => 111, + EventType::Delivery(DeliveryEvent::ImplicitTlsError) => 94, + EventType::Delivery(DeliveryEvent::ConcurrencyLimitExceeded) => 81, + EventType::Delivery(DeliveryEvent::RateLimitExceeded) => 104, + EventType::Delivery(DeliveryEvent::DoubleBounce) => 86, + EventType::Delivery(DeliveryEvent::DsnSuccess) => 88, + EventType::Delivery(DeliveryEvent::DsnTempFail) => 89, + EventType::Delivery(DeliveryEvent::DsnPermFail) => 87, + EventType::Delivery(DeliveryEvent::RawInput) => 105, + EventType::Delivery(DeliveryEvent::RawOutput) => 106, + EventType::Dkim(DkimEvent::Pass) => 121, + EventType::Dkim(DkimEvent::Neutral) => 119, + EventType::Dkim(DkimEvent::Fail) => 114, + EventType::Dkim(DkimEvent::PermError) => 122, + EventType::Dkim(DkimEvent::TempError) => 127, + EventType::Dkim(DkimEvent::None) => 120, + EventType::Dkim(DkimEvent::UnsupportedVersion) => 131, + EventType::Dkim(DkimEvent::UnsupportedAlgorithm) => 128, + EventType::Dkim(DkimEvent::UnsupportedCanonicalization) => 129, + EventType::Dkim(DkimEvent::UnsupportedKeyType) => 130, + EventType::Dkim(DkimEvent::FailedBodyHashMatch) => 116, + EventType::Dkim(DkimEvent::FailedVerification) => 117, + EventType::Dkim(DkimEvent::FailedAuidMatch) => 115, + EventType::Dkim(DkimEvent::RevokedPublicKey) => 123, + EventType::Dkim(DkimEvent::IncompatibleAlgorithms) => 118, + EventType::Dkim(DkimEvent::SignatureExpired) => 124, + EventType::Dkim(DkimEvent::SignatureLength) => 125, + EventType::Dkim(DkimEvent::SignerNotFound) => 126, + EventType::Dkim(DkimEvent::BuildError) => 592, + EventType::Dmarc(DmarcEvent::Pass) => 134, + EventType::Dmarc(DmarcEvent::Fail) => 132, + EventType::Dmarc(DmarcEvent::PermError) => 135, + EventType::Dmarc(DmarcEvent::TempError) => 136, + EventType::Dmarc(DmarcEvent::None) => 133, + EventType::Dns(DnsEvent::RecordCreated) => 8, + EventType::Dns(DnsEvent::RecordCreationFailed) => 9, + EventType::Dns(DnsEvent::RecordDeletionFailed) => 10, + EventType::Dns(DnsEvent::RecordNotPropagated) => 12, + EventType::Dns(DnsEvent::RecordLookupFailed) => 11, + EventType::Dns(DnsEvent::RecordPropagated) => 13, + EventType::Dns(DnsEvent::RecordPropagationTimeout) => 14, + EventType::Dns(DnsEvent::BuildError) => 591, + EventType::Eval(EvalEvent::Result) => 139, + EventType::Eval(EvalEvent::Error) => 138, + EventType::Eval(EvalEvent::DirectoryNotFound) => 137, + EventType::Eval(EvalEvent::StoreNotFound) => 140, + EventType::Housekeeper(HousekeeperEvent::Start) => 150, + EventType::Housekeeper(HousekeeperEvent::Stop) => 151, + EventType::Housekeeper(HousekeeperEvent::Schedule) => 149, + EventType::Housekeeper(HousekeeperEvent::Run) => 146, + EventType::Http(HttpEvent::ConnectionStart) => 153, + EventType::Http(HttpEvent::ConnectionEnd) => 152, + EventType::Http(HttpEvent::Error) => 154, + EventType::Http(HttpEvent::RequestUrl) => 156, + EventType::Http(HttpEvent::RequestBody) => 155, + EventType::Http(HttpEvent::ResponseBody) => 157, + EventType::Http(HttpEvent::XForwardedMissing) => 158, + EventType::Imap(ImapEvent::ConnectionStart) => 163, + EventType::Imap(ImapEvent::ConnectionEnd) => 162, + EventType::Imap(ImapEvent::GetAcl) => 171, + EventType::Imap(ImapEvent::SetAcl) => 188, + EventType::Imap(ImapEvent::MyRights) => 180, + EventType::Imap(ImapEvent::ListRights) => 176, + EventType::Imap(ImapEvent::Append) => 159, + EventType::Imap(ImapEvent::Capabilities) => 160, + EventType::Imap(ImapEvent::Id) => 172, + EventType::Imap(ImapEvent::Close) => 161, + EventType::Imap(ImapEvent::Copy) => 164, + EventType::Imap(ImapEvent::Move) => 179, + EventType::Imap(ImapEvent::CreateMailbox) => 165, + EventType::Imap(ImapEvent::DeleteMailbox) => 166, + EventType::Imap(ImapEvent::RenameMailbox) => 185, + EventType::Imap(ImapEvent::Enable) => 167, + EventType::Imap(ImapEvent::Expunge) => 169, + EventType::Imap(ImapEvent::Fetch) => 170, + EventType::Imap(ImapEvent::IdleStart) => 173, + EventType::Imap(ImapEvent::IdleStop) => 174, + EventType::Imap(ImapEvent::List) => 175, + EventType::Imap(ImapEvent::Lsub) => 178, + EventType::Imap(ImapEvent::Logout) => 177, + EventType::Imap(ImapEvent::Namespace) => 181, + EventType::Imap(ImapEvent::Noop) => 182, + EventType::Imap(ImapEvent::Search) => 186, + EventType::Imap(ImapEvent::Sort) => 189, + EventType::Imap(ImapEvent::Select) => 187, + EventType::Imap(ImapEvent::Status) => 190, + EventType::Imap(ImapEvent::Store) => 191, + EventType::Imap(ImapEvent::Subscribe) => 192, + EventType::Imap(ImapEvent::Unsubscribe) => 194, + EventType::Imap(ImapEvent::Thread) => 193, + EventType::Imap(ImapEvent::GetQuota) => 57, + EventType::Imap(ImapEvent::Error) => 168, + EventType::Imap(ImapEvent::RawInput) => 183, + EventType::Imap(ImapEvent::RawOutput) => 184, + EventType::IncomingReport(IncomingReportEvent::DmarcReport) => 200, + EventType::IncomingReport(IncomingReportEvent::DmarcReportWithWarnings) => 201, + EventType::IncomingReport(IncomingReportEvent::TlsReport) => 206, + EventType::IncomingReport(IncomingReportEvent::TlsReportWithWarnings) => 207, + EventType::IncomingReport(IncomingReportEvent::AbuseReport) => 195, + EventType::IncomingReport(IncomingReportEvent::AuthFailureReport) => 197, + EventType::IncomingReport(IncomingReportEvent::FraudReport) => 202, + EventType::IncomingReport(IncomingReportEvent::NotSpamReport) => 204, + EventType::IncomingReport(IncomingReportEvent::VirusReport) => 209, + EventType::IncomingReport(IncomingReportEvent::OtherReport) => 205, + EventType::IncomingReport(IncomingReportEvent::MessageParseFailed) => 203, + EventType::IncomingReport(IncomingReportEvent::DmarcParseFailed) => 199, + EventType::IncomingReport(IncomingReportEvent::TlsRpcParseFailed) => 208, + EventType::IncomingReport(IncomingReportEvent::ArfParseFailed) => 196, + EventType::IncomingReport(IncomingReportEvent::DecompressError) => 198, + EventType::Iprev(IprevEvent::Pass) => 212, + EventType::Iprev(IprevEvent::Fail) => 210, + EventType::Iprev(IprevEvent::PermError) => 213, + EventType::Iprev(IprevEvent::TempError) => 214, + EventType::Iprev(IprevEvent::None) => 211, + EventType::Jmap(JmapEvent::MethodCall) => 223, + EventType::Jmap(JmapEvent::InvalidArguments) => 221, + EventType::Jmap(JmapEvent::RequestTooLarge) => 227, + EventType::Jmap(JmapEvent::StateMismatch) => 228, + EventType::Jmap(JmapEvent::AnchorNotFound) => 218, + EventType::Jmap(JmapEvent::UnsupportedFilter) => 232, + EventType::Jmap(JmapEvent::UnsupportedSort) => 233, + EventType::Jmap(JmapEvent::UnknownMethod) => 231, + EventType::Jmap(JmapEvent::InvalidResultReference) => 222, + EventType::Jmap(JmapEvent::Forbidden) => 220, + EventType::Jmap(JmapEvent::AccountNotFound) => 215, + EventType::Jmap(JmapEvent::AccountNotSupportedByMethod) => 216, + EventType::Jmap(JmapEvent::AccountReadOnly) => 217, + EventType::Jmap(JmapEvent::NotFound) => 224, + EventType::Jmap(JmapEvent::CannotCalculateChanges) => 219, + EventType::Jmap(JmapEvent::UnknownDataType) => 230, + EventType::Jmap(JmapEvent::UnknownCapability) => 229, + EventType::Jmap(JmapEvent::NotJson) => 225, + EventType::Jmap(JmapEvent::NotRequest) => 226, + EventType::Jmap(JmapEvent::WebsocketStart) => 235, + EventType::Jmap(JmapEvent::WebsocketStop) => 236, + EventType::Jmap(JmapEvent::WebsocketError) => 234, + EventType::Limit(LimitEvent::SizeRequest) => 243, + EventType::Limit(LimitEvent::SizeUpload) => 244, + EventType::Limit(LimitEvent::CallsIn) => 238, + EventType::Limit(LimitEvent::ConcurrentRequest) => 240, + EventType::Limit(LimitEvent::ConcurrentUpload) => 241, + EventType::Limit(LimitEvent::ConcurrentConnection) => 239, + EventType::Limit(LimitEvent::Quota) => 242, + EventType::Limit(LimitEvent::BlobQuota) => 237, + EventType::Limit(LimitEvent::TenantQuota) => 553, + EventType::Limit(LimitEvent::TooManyRequests) => 245, + EventType::MailAuth(MailAuthEvent::ParseError) => 254, + EventType::MailAuth(MailAuthEvent::MissingParameters) => 252, + EventType::MailAuth(MailAuthEvent::NoHeadersFound) => 253, + EventType::MailAuth(MailAuthEvent::Crypto) => 247, + EventType::MailAuth(MailAuthEvent::Io) => 251, + EventType::MailAuth(MailAuthEvent::Base64) => 246, + EventType::MailAuth(MailAuthEvent::DnsError) => 248, + EventType::MailAuth(MailAuthEvent::DnsRecordNotFound) => 250, + EventType::MailAuth(MailAuthEvent::DnsInvalidRecordType) => 249, + EventType::MailAuth(MailAuthEvent::PolicyNotAligned) => 255, + EventType::Manage(ManageEvent::MissingParameter) => 278, + EventType::Manage(ManageEvent::AlreadyExists) => 275, + EventType::Manage(ManageEvent::AssertFailed) => 276, + EventType::Manage(ManageEvent::NotFound) => 279, + EventType::Manage(ManageEvent::NotSupported) => 280, + EventType::Manage(ManageEvent::Error) => 277, + EventType::ManageSieve(ManageSieveEvent::ConnectionStart) => 259, + EventType::ManageSieve(ManageSieveEvent::ConnectionEnd) => 258, + EventType::ManageSieve(ManageSieveEvent::CreateScript) => 260, + EventType::ManageSieve(ManageSieveEvent::UpdateScript) => 274, + EventType::ManageSieve(ManageSieveEvent::GetScript) => 263, + EventType::ManageSieve(ManageSieveEvent::DeleteScript) => 261, + EventType::ManageSieve(ManageSieveEvent::RenameScript) => 270, + EventType::ManageSieve(ManageSieveEvent::CheckScript) => 257, + EventType::ManageSieve(ManageSieveEvent::HaveSpace) => 264, + EventType::ManageSieve(ManageSieveEvent::ListScripts) => 265, + EventType::ManageSieve(ManageSieveEvent::SetActive) => 271, + EventType::ManageSieve(ManageSieveEvent::Capabilities) => 256, + EventType::ManageSieve(ManageSieveEvent::StartTls) => 272, + EventType::ManageSieve(ManageSieveEvent::Unauthenticate) => 273, + EventType::ManageSieve(ManageSieveEvent::Logout) => 266, + EventType::ManageSieve(ManageSieveEvent::Noop) => 267, + EventType::ManageSieve(ManageSieveEvent::Error) => 262, + EventType::ManageSieve(ManageSieveEvent::RawInput) => 268, + EventType::ManageSieve(ManageSieveEvent::RawOutput) => 269, + EventType::MessageIngest(MessageIngestEvent::Ham) => 283, + EventType::MessageIngest(MessageIngestEvent::Spam) => 286, + EventType::MessageIngest(MessageIngestEvent::ImapAppend) => 284, + EventType::MessageIngest(MessageIngestEvent::JmapAppend) => 285, + EventType::MessageIngest(MessageIngestEvent::Duplicate) => 281, + EventType::MessageIngest(MessageIngestEvent::Error) => 282, + EventType::MessageIngest(MessageIngestEvent::FtsIndex) => 142, + EventType::Milter(MilterEvent::Read) => 299, + EventType::Milter(MilterEvent::Write) => 303, + EventType::Milter(MilterEvent::ActionAccept) => 287, + EventType::Milter(MilterEvent::ActionDiscard) => 289, + EventType::Milter(MilterEvent::ActionReject) => 290, + EventType::Milter(MilterEvent::ActionTempFail) => 293, + EventType::Milter(MilterEvent::ActionReplyCode) => 291, + EventType::Milter(MilterEvent::ActionConnectionFailure) => 288, + EventType::Milter(MilterEvent::ActionShutdown) => 292, + EventType::Milter(MilterEvent::IoError) => 297, + EventType::Milter(MilterEvent::FrameTooLarge) => 296, + EventType::Milter(MilterEvent::FrameInvalid) => 295, + EventType::Milter(MilterEvent::UnexpectedResponse) => 302, + EventType::Milter(MilterEvent::Timeout) => 300, + EventType::Milter(MilterEvent::TlsInvalidName) => 301, + EventType::Milter(MilterEvent::Disconnected) => 294, + EventType::Milter(MilterEvent::ParseError) => 298, + EventType::MtaHook(MtaHookEvent::ActionAccept) => 304, + EventType::MtaHook(MtaHookEvent::ActionDiscard) => 305, + EventType::MtaHook(MtaHookEvent::ActionReject) => 307, + EventType::MtaHook(MtaHookEvent::ActionQuarantine) => 306, + EventType::MtaHook(MtaHookEvent::Error) => 308, + EventType::MtaSts(MtaStsEvent::Authorized) => 309, + EventType::MtaSts(MtaStsEvent::NotAuthorized) => 311, + EventType::MtaSts(MtaStsEvent::PolicyFetch) => 312, + EventType::MtaSts(MtaStsEvent::PolicyNotFound) => 314, + EventType::MtaSts(MtaStsEvent::PolicyFetchError) => 313, + EventType::MtaSts(MtaStsEvent::InvalidPolicy) => 310, + EventType::Network(NetworkEvent::ListenStart) => 321, + EventType::Network(NetworkEvent::ListenStop) => 322, + EventType::Network(NetworkEvent::ListenError) => 320, + EventType::Network(NetworkEvent::BindError) => 316, + EventType::Network(NetworkEvent::ReadError) => 324, + EventType::Network(NetworkEvent::WriteError) => 328, + EventType::Network(NetworkEvent::FlushError) => 319, + EventType::Network(NetworkEvent::AcceptError) => 315, + EventType::Network(NetworkEvent::SplitError) => 326, + EventType::Network(NetworkEvent::Timeout) => 327, + EventType::Network(NetworkEvent::Closed) => 317, + EventType::Network(NetworkEvent::ProxyError) => 323, + EventType::Network(NetworkEvent::SetOptError) => 325, + EventType::OutgoingReport(OutgoingReportEvent::SpfReport) => 342, + EventType::OutgoingReport(OutgoingReportEvent::SpfRateLimited) => 341, + EventType::OutgoingReport(OutgoingReportEvent::DkimReport) => 330, + EventType::OutgoingReport(OutgoingReportEvent::DkimRateLimited) => 329, + EventType::OutgoingReport(OutgoingReportEvent::DmarcReport) => 333, + EventType::OutgoingReport(OutgoingReportEvent::DmarcRateLimited) => 332, + EventType::OutgoingReport(OutgoingReportEvent::DmarcAggregateReport) => 331, + EventType::OutgoingReport(OutgoingReportEvent::TlsAggregate) => 344, + EventType::OutgoingReport(OutgoingReportEvent::HttpSubmission) => 334, + EventType::OutgoingReport(OutgoingReportEvent::UnauthorizedReportingAddress) => 345, + EventType::OutgoingReport(OutgoingReportEvent::ReportingAddressValidationError) => 340, + EventType::OutgoingReport(OutgoingReportEvent::NotFound) => 339, + EventType::OutgoingReport(OutgoingReportEvent::SubmissionError) => 343, + EventType::OutgoingReport(OutgoingReportEvent::NoRecipientsFound) => 338, + EventType::OutgoingReport(OutgoingReportEvent::Locked) => 337, + EventType::Pop3(Pop3Event::ConnectionStart) => 348, + EventType::Pop3(Pop3Event::ConnectionEnd) => 347, + EventType::Pop3(Pop3Event::Delete) => 349, + EventType::Pop3(Pop3Event::Reset) => 358, + EventType::Pop3(Pop3Event::Quit) => 355, + EventType::Pop3(Pop3Event::Fetch) => 351, + EventType::Pop3(Pop3Event::List) => 352, + EventType::Pop3(Pop3Event::ListMessage) => 353, + EventType::Pop3(Pop3Event::Uidl) => 361, + EventType::Pop3(Pop3Event::UidlMessage) => 362, + EventType::Pop3(Pop3Event::Stat) => 360, + EventType::Pop3(Pop3Event::Noop) => 354, + EventType::Pop3(Pop3Event::Capabilities) => 346, + EventType::Pop3(Pop3Event::StartTls) => 359, + EventType::Pop3(Pop3Event::Utf8) => 363, + EventType::Pop3(Pop3Event::Error) => 350, + EventType::Pop3(Pop3Event::RawInput) => 356, + EventType::Pop3(Pop3Event::RawOutput) => 357, + EventType::Purge(PurgeEvent::Started) => 369, + EventType::Purge(PurgeEvent::Finished) => 366, + EventType::Purge(PurgeEvent::Running) => 368, + EventType::Purge(PurgeEvent::Error) => 365, + EventType::Purge(PurgeEvent::InProgress) => 367, + EventType::Purge(PurgeEvent::AutoExpunge) => 364, + EventType::Purge(PurgeEvent::BlobCleanup) => 370, + EventType::PushSubscription(PushSubscriptionEvent::Success) => 373, + EventType::PushSubscription(PushSubscriptionEvent::Error) => 371, + EventType::PushSubscription(PushSubscriptionEvent::NotFound) => 372, + EventType::Queue(QueueEvent::QueueMessage) => 380, + EventType::Queue(QueueEvent::QueueMessageAuthenticated) => 381, + EventType::Queue(QueueEvent::QueueReport) => 382, + EventType::Queue(QueueEvent::QueueDsn) => 379, + EventType::Queue(QueueEvent::QueueAutogenerated) => 378, + EventType::Queue(QueueEvent::Rescheduled) => 385, + EventType::Queue(QueueEvent::Locked) => 377, + EventType::Queue(QueueEvent::BlobNotFound) => 374, + EventType::Queue(QueueEvent::RateLimitExceeded) => 384, + EventType::Queue(QueueEvent::ConcurrencyLimitExceeded) => 375, + EventType::Queue(QueueEvent::QuotaExceeded) => 383, + EventType::Queue(QueueEvent::BackPressure) => 48, + EventType::Resource(ResourceEvent::NotFound) => 389, + EventType::Resource(ResourceEvent::BadParameters) => 386, + EventType::Resource(ResourceEvent::Error) => 388, + EventType::Resource(ResourceEvent::DownloadExternal) => 387, + EventType::Resource(ResourceEvent::WebadminUnpacked) => 390, + EventType::Security(SecurityEvent::AuthenticationBan) => 33, + EventType::Security(SecurityEvent::AbuseBan) => 549, + EventType::Security(SecurityEvent::ScanBan) => 558, + EventType::Security(SecurityEvent::LoiterBan) => 550, + EventType::Security(SecurityEvent::IpBlocked) => 318, + EventType::Security(SecurityEvent::Unauthorized) => 552, + EventType::Server(ServerEvent::Startup) => 393, + EventType::Server(ServerEvent::Shutdown) => 392, + EventType::Server(ServerEvent::StartupError) => 394, + EventType::Server(ServerEvent::ThreadError) => 395, + EventType::Server(ServerEvent::Licensing) => 391, + EventType::Sieve(SieveEvent::ActionAccept) => 396, + EventType::Sieve(SieveEvent::ActionAcceptReplace) => 397, + EventType::Sieve(SieveEvent::ActionDiscard) => 398, + EventType::Sieve(SieveEvent::ActionReject) => 399, + EventType::Sieve(SieveEvent::SendMessage) => 406, + EventType::Sieve(SieveEvent::MessageTooLarge) => 401, + EventType::Sieve(SieveEvent::ScriptNotFound) => 405, + EventType::Sieve(SieveEvent::ListNotFound) => 400, + EventType::Sieve(SieveEvent::RuntimeError) => 404, + EventType::Sieve(SieveEvent::UnexpectedError) => 407, + EventType::Sieve(SieveEvent::NotSupported) => 402, + EventType::Sieve(SieveEvent::QuotaExceeded) => 403, + EventType::Smtp(SmtpEvent::ConnectionStart) => 417, + EventType::Smtp(SmtpEvent::ConnectionEnd) => 416, + EventType::Smtp(SmtpEvent::Error) => 428, + EventType::Smtp(SmtpEvent::IdNotFound) => 469, + EventType::Smtp(SmtpEvent::ConcurrencyLimitExceeded) => 415, + EventType::Smtp(SmtpEvent::TransferLimitExceeded) => 485, + EventType::Smtp(SmtpEvent::RateLimitExceeded) => 461, + EventType::Smtp(SmtpEvent::TimeLimitExceeded) => 481, + EventType::Smtp(SmtpEvent::MissingAuthDirectory) => 452, + EventType::Smtp(SmtpEvent::MessageParseFailed) => 450, + EventType::Smtp(SmtpEvent::MessageTooLarge) => 451, + EventType::Smtp(SmtpEvent::LoopDetected) => 443, + EventType::Smtp(SmtpEvent::DkimPass) => 422, + EventType::Smtp(SmtpEvent::DkimFail) => 421, + EventType::Smtp(SmtpEvent::ArcPass) => 410, + EventType::Smtp(SmtpEvent::ArcFail) => 409, + EventType::Smtp(SmtpEvent::SpfEhloPass) => 474, + EventType::Smtp(SmtpEvent::SpfEhloFail) => 473, + EventType::Smtp(SmtpEvent::SpfFromPass) => 476, + EventType::Smtp(SmtpEvent::SpfFromFail) => 475, + EventType::Smtp(SmtpEvent::DmarcPass) => 424, + EventType::Smtp(SmtpEvent::DmarcFail) => 423, + EventType::Smtp(SmtpEvent::IprevPass) => 441, + EventType::Smtp(SmtpEvent::IprevFail) => 440, + EventType::Smtp(SmtpEvent::TooManyMessages) => 483, + EventType::Smtp(SmtpEvent::Ehlo) => 426, + EventType::Smtp(SmtpEvent::InvalidEhlo) => 436, + EventType::Smtp(SmtpEvent::DidNotSayEhlo) => 420, + EventType::Smtp(SmtpEvent::EhloExpected) => 427, + EventType::Smtp(SmtpEvent::LhloExpected) => 442, + EventType::Smtp(SmtpEvent::MailFromUnauthenticated) => 447, + EventType::Smtp(SmtpEvent::MailFromUnauthorized) => 448, + EventType::Smtp(SmtpEvent::MailFromNotAllowed) => 551, + EventType::Smtp(SmtpEvent::MailFromRewritten) => 446, + EventType::Smtp(SmtpEvent::MailFromMissing) => 445, + EventType::Smtp(SmtpEvent::MailFrom) => 444, + EventType::Smtp(SmtpEvent::MultipleMailFrom) => 456, + EventType::Smtp(SmtpEvent::MailboxDoesNotExist) => 449, + EventType::Smtp(SmtpEvent::RelayNotAllowed) => 468, + EventType::Smtp(SmtpEvent::RcptTo) => 464, + EventType::Smtp(SmtpEvent::RcptToDuplicate) => 465, + EventType::Smtp(SmtpEvent::RcptToRewritten) => 467, + EventType::Smtp(SmtpEvent::RcptToMissing) => 466, + EventType::Smtp(SmtpEvent::RcptToGreylisted) => 561, + EventType::Smtp(SmtpEvent::TooManyRecipients) => 484, + EventType::Smtp(SmtpEvent::TooManyInvalidRcpt) => 482, + EventType::Smtp(SmtpEvent::RawInput) => 462, + EventType::Smtp(SmtpEvent::RawOutput) => 463, + EventType::Smtp(SmtpEvent::MissingLocalHostname) => 453, + EventType::Smtp(SmtpEvent::Vrfy) => 487, + EventType::Smtp(SmtpEvent::VrfyNotFound) => 489, + EventType::Smtp(SmtpEvent::VrfyDisabled) => 488, + EventType::Smtp(SmtpEvent::Expn) => 429, + EventType::Smtp(SmtpEvent::ExpnNotFound) => 431, + EventType::Smtp(SmtpEvent::ExpnDisabled) => 430, + EventType::Smtp(SmtpEvent::RequireTlsDisabled) => 471, + EventType::Smtp(SmtpEvent::DeliverByDisabled) => 418, + EventType::Smtp(SmtpEvent::DeliverByInvalid) => 419, + EventType::Smtp(SmtpEvent::FutureReleaseDisabled) => 432, + EventType::Smtp(SmtpEvent::FutureReleaseInvalid) => 433, + EventType::Smtp(SmtpEvent::MtPriorityDisabled) => 454, + EventType::Smtp(SmtpEvent::MtPriorityInvalid) => 455, + EventType::Smtp(SmtpEvent::DsnDisabled) => 425, + EventType::Smtp(SmtpEvent::AuthNotAllowed) => 413, + EventType::Smtp(SmtpEvent::AuthMechanismNotSupported) => 412, + EventType::Smtp(SmtpEvent::AuthExchangeTooLong) => 411, + EventType::Smtp(SmtpEvent::AlreadyAuthenticated) => 408, + EventType::Smtp(SmtpEvent::Noop) => 457, + EventType::Smtp(SmtpEvent::StartTls) => 477, + EventType::Smtp(SmtpEvent::StartTlsUnavailable) => 479, + EventType::Smtp(SmtpEvent::StartTlsAlready) => 478, + EventType::Smtp(SmtpEvent::Rset) => 472, + EventType::Smtp(SmtpEvent::Quit) => 460, + EventType::Smtp(SmtpEvent::Help) => 434, + EventType::Smtp(SmtpEvent::CommandNotImplemented) => 414, + EventType::Smtp(SmtpEvent::InvalidCommand) => 435, + EventType::Smtp(SmtpEvent::InvalidSenderAddress) => 439, + EventType::Smtp(SmtpEvent::InvalidRecipientAddress) => 438, + EventType::Smtp(SmtpEvent::InvalidParameter) => 437, + EventType::Smtp(SmtpEvent::UnsupportedParameter) => 486, + EventType::Smtp(SmtpEvent::SyntaxError) => 480, + EventType::Smtp(SmtpEvent::RequestTooLarge) => 470, + EventType::Spam(SpamEvent::Pyzor) => 564, + EventType::Spam(SpamEvent::PyzorError) => 494, + EventType::Spam(SpamEvent::Dnsbl) => 562, + EventType::Spam(SpamEvent::DnsblError) => 563, + EventType::Spam(SpamEvent::TrainStarted) => 588, + EventType::Spam(SpamEvent::TrainCompleted) => 495, + EventType::Spam(SpamEvent::TrainSampleAdded) => 143, + EventType::Spam(SpamEvent::TrainSampleNotFound) => 491, + EventType::Spam(SpamEvent::Classify) => 490, + EventType::Spam(SpamEvent::ModelLoaded) => 589, + EventType::Spam(SpamEvent::ModelNotReady) => 496, + EventType::Spam(SpamEvent::ModelNotFound) => 497, + EventType::Spf(SpfEvent::Pass) => 501, + EventType::Spf(SpfEvent::Fail) => 498, + EventType::Spf(SpfEvent::SoftFail) => 503, + EventType::Spf(SpfEvent::Neutral) => 499, + EventType::Spf(SpfEvent::TempError) => 504, + EventType::Spf(SpfEvent::PermError) => 502, + EventType::Spf(SpfEvent::None) => 500, + EventType::Store(StoreEvent::AssertValueFailed) => 505, + EventType::Store(StoreEvent::FoundationdbError) => 518, + EventType::Store(StoreEvent::MysqlError) => 522, + EventType::Store(StoreEvent::PostgresqlError) => 527, + EventType::Store(StoreEvent::RocksdbError) => 529, + EventType::Store(StoreEvent::SqliteError) => 532, + EventType::Store(StoreEvent::LdapError) => 520, + EventType::Store(StoreEvent::ElasticsearchError) => 516, + EventType::Store(StoreEvent::MeilisearchError) => 590, + EventType::Store(StoreEvent::RedisError) => 528, + EventType::Store(StoreEvent::S3Error) => 530, + EventType::Store(StoreEvent::AzureError) => 559, + EventType::Store(StoreEvent::FilesystemError) => 517, + EventType::Store(StoreEvent::PoolError) => 526, + EventType::Store(StoreEvent::DataCorruption) => 511, + EventType::Store(StoreEvent::DecompressError) => 514, + EventType::Store(StoreEvent::DeserializeError) => 515, + EventType::Store(StoreEvent::NotFound) => 524, + EventType::Store(StoreEvent::NotConfigured) => 523, + EventType::Store(StoreEvent::NotSupported) => 525, + EventType::Store(StoreEvent::UnexpectedError) => 533, + EventType::Store(StoreEvent::CryptoError) => 510, + EventType::Store(StoreEvent::HttpStoreError) => 493, + EventType::Store(StoreEvent::CacheMiss) => 50, + EventType::Store(StoreEvent::CacheHit) => 51, + EventType::Store(StoreEvent::CacheStale) => 52, + EventType::Store(StoreEvent::CacheUpdate) => 577, + EventType::Store(StoreEvent::BlobMissingMarker) => 507, + EventType::Store(StoreEvent::DataWrite) => 513, + EventType::Store(StoreEvent::DataIterate) => 512, + EventType::Store(StoreEvent::BlobRead) => 508, + EventType::Store(StoreEvent::BlobWrite) => 509, + EventType::Store(StoreEvent::BlobDelete) => 506, + EventType::Store(StoreEvent::SqlQuery) => 531, + EventType::Store(StoreEvent::LdapQuery) => 521, + EventType::Store(StoreEvent::LdapWarning) => 519, + EventType::Store(StoreEvent::HttpStoreFetch) => 492, + EventType::TaskQueue(TaskQueueEvent::TaskAcquired) => 578, + EventType::TaskQueue(TaskQueueEvent::TaskLocked) => 144, + EventType::TaskQueue(TaskQueueEvent::TaskIgnored) => 586, + EventType::TaskQueue(TaskQueueEvent::TaskFailed) => 587, + EventType::TaskQueue(TaskQueueEvent::BlobNotFound) => 141, + EventType::TaskQueue(TaskQueueEvent::MetadataNotFound) => 145, + EventType::Telemetry(TelemetryEvent::Alert) => 548, + EventType::Telemetry(TelemetryEvent::LogError) => 535, + EventType::Telemetry(TelemetryEvent::WebhookError) => 539, + EventType::Telemetry(TelemetryEvent::OtelExporterError) => 536, + EventType::Telemetry(TelemetryEvent::OtelMetricsExporterError) => 537, + EventType::Telemetry(TelemetryEvent::PrometheusExporterError) => 538, + EventType::Telemetry(TelemetryEvent::JournalError) => 534, + EventType::Tls(TlsEvent::Handshake) => 543, + EventType::Tls(TlsEvent::HandshakeError) => 544, + EventType::Tls(TlsEvent::NotConfigured) => 547, + EventType::Tls(TlsEvent::CertificateNotFound) => 542, + EventType::Tls(TlsEvent::NoCertificatesAvailable) => 546, + EventType::Tls(TlsEvent::MultipleCertificatesAvailable) => 545, + EventType::TlsRpt(TlsRptEvent::RecordFetch) => 540, + EventType::TlsRpt(TlsRptEvent::RecordFetchError) => 541, + EventType::TlsRpt(TlsRptEvent::RecordNotFound) => 560, + EventType::WebDav(WebDavEvent::Propfind) => 147, + EventType::WebDav(WebDavEvent::Proppatch) => 148, + EventType::WebDav(WebDavEvent::Get) => 335, + EventType::WebDav(WebDavEvent::Head) => 574, + EventType::WebDav(WebDavEvent::Report) => 336, + EventType::WebDav(WebDavEvent::Mkcol) => 376, + EventType::WebDav(WebDavEvent::Mkcalendar) => 575, + EventType::WebDav(WebDavEvent::Delete) => 458, + EventType::WebDav(WebDavEvent::Put) => 459, + EventType::WebDav(WebDavEvent::Post) => 565, + EventType::WebDav(WebDavEvent::Patch) => 566, + EventType::WebDav(WebDavEvent::Copy) => 567, + EventType::WebDav(WebDavEvent::Move) => 568, + EventType::WebDav(WebDavEvent::Lock) => 569, + EventType::WebDav(WebDavEvent::Unlock) => 570, + EventType::WebDav(WebDavEvent::Acl) => 571, + EventType::WebDav(WebDavEvent::Options) => 573, + EventType::WebDav(WebDavEvent::Error) => 572, + } + } + + pub fn from_id(id: u16) -> Option { + match id { + 3 => Some(EventType::Acme(AcmeEvent::AuthStart)), + 2 => Some(EventType::Acme(AcmeEvent::AuthPending)), + 5 => Some(EventType::Acme(AcmeEvent::AuthValid)), + 0 => Some(EventType::Acme(AcmeEvent::AuthCompleted)), + 1 => Some(EventType::Acme(AcmeEvent::AuthError)), + 4 => Some(EventType::Acme(AcmeEvent::AuthTooManyAttempts)), + 22 => Some(EventType::Acme(AcmeEvent::ProcessCert)), + 20 => Some(EventType::Acme(AcmeEvent::OrderStart)), + 18 => Some(EventType::Acme(AcmeEvent::OrderProcessing)), + 16 => Some(EventType::Acme(AcmeEvent::OrderCompleted)), + 19 => Some(EventType::Acme(AcmeEvent::OrderReady)), + 21 => Some(EventType::Acme(AcmeEvent::OrderValid)), + 17 => Some(EventType::Acme(AcmeEvent::OrderInvalid)), + 23 => Some(EventType::Acme(AcmeEvent::RenewBackoff)), + 7 => Some(EventType::Acme(AcmeEvent::ClientSuppliedSni)), + 6 => Some(EventType::Acme(AcmeEvent::ClientMissingSni)), + 25 => Some(EventType::Acme(AcmeEvent::TlsAlpnReceived)), + 24 => Some(EventType::Acme(AcmeEvent::TlsAlpnError)), + 26 => Some(EventType::Acme(AcmeEvent::TokenNotFound)), + 15 => Some(EventType::Acme(AcmeEvent::Error)), + 556 => Some(EventType::Ai(AiEvent::LlmResponse)), + 557 => Some(EventType::Ai(AiEvent::ApiError)), + 28 => Some(EventType::Arc(ArcEvent::ChainTooLong)), + 31 => Some(EventType::Arc(ArcEvent::InvalidInstance)), + 30 => Some(EventType::Arc(ArcEvent::InvalidCv)), + 29 => Some(EventType::Arc(ArcEvent::HasHeaderTag)), + 27 => Some(EventType::Arc(ArcEvent::BrokenChain)), + 32 => Some(EventType::Arc(ArcEvent::SealerNotFound)), + 37 => Some(EventType::Auth(AuthEvent::Success)), + 35 => Some(EventType::Auth(AuthEvent::Failed)), + 554 => Some(EventType::Auth(AuthEvent::TokenExpired)), + 36 => Some(EventType::Auth(AuthEvent::MissingTotp)), + 38 => Some(EventType::Auth(AuthEvent::TooManyAttempts)), + 555 => Some(EventType::Auth(AuthEvent::ClientRegistration)), + 34 => Some(EventType::Auth(AuthEvent::Error)), + 576 => Some(EventType::Calendar(CalendarEvent::RuleExpansionError)), + 579 => Some(EventType::Calendar(CalendarEvent::AlarmSent)), + 580 => Some(EventType::Calendar(CalendarEvent::AlarmSkipped)), + 581 => Some(EventType::Calendar(CalendarEvent::AlarmRecipientOverride)), + 582 => Some(EventType::Calendar(CalendarEvent::AlarmFailed)), + 583 => Some(EventType::Calendar(CalendarEvent::ItipMessageSent)), + 584 => Some(EventType::Calendar(CalendarEvent::ItipMessageReceived)), + 585 => Some(EventType::Calendar(CalendarEvent::ItipMessageError)), + 39 => Some(EventType::Cluster(ClusterEvent::SubscriberStart)), + 40 => Some(EventType::Cluster(ClusterEvent::SubscriberStop)), + 41 => Some(EventType::Cluster(ClusterEvent::SubscriberError)), + 42 => Some(EventType::Cluster(ClusterEvent::SubscriberDisconnected)), + 43 => Some(EventType::Cluster(ClusterEvent::PublisherStart)), + 44 => Some(EventType::Cluster(ClusterEvent::PublisherStop)), + 45 => Some(EventType::Cluster(ClusterEvent::PublisherError)), + 46 => Some(EventType::Cluster(ClusterEvent::MessageReceived)), + 47 => Some(EventType::Cluster(ClusterEvent::MessageSkipped)), + 49 => Some(EventType::Cluster(ClusterEvent::MessageInvalid)), + 62 => Some(EventType::Config(ConfigEvent::ParseError)), + 54 => Some(EventType::Config(ConfigEvent::BuildError)), + 60 => Some(EventType::Config(ConfigEvent::MacroError)), + 65 => Some(EventType::Config(ConfigEvent::WriteError)), + 58 => Some(EventType::Config(ConfigEvent::FetchError)), + 56 => Some(EventType::Config(ConfigEvent::DefaultApplied)), + 61 => Some(EventType::Config(ConfigEvent::MissingSetting)), + 64 => Some(EventType::Config(ConfigEvent::UnusedSetting)), + 63 => Some(EventType::Config(ConfigEvent::ParseWarning)), + 55 => Some(EventType::Config(ConfigEvent::BuildWarning)), + 59 => Some(EventType::Config(ConfigEvent::ImportExternal)), + 53 => Some(EventType::Config(ConfigEvent::AlreadyUpToDate)), + 67 => Some(EventType::Dane(DaneEvent::AuthenticationSuccess)), + 66 => Some(EventType::Dane(DaneEvent::AuthenticationFailure)), + 69 => Some(EventType::Dane(DaneEvent::NoCertificatesFound)), + 68 => Some(EventType::Dane(DaneEvent::CertificateParseError)), + 73 => Some(EventType::Dane(DaneEvent::TlsaRecordMatch)), + 70 => Some(EventType::Dane(DaneEvent::TlsaRecordFetch)), + 71 => Some(EventType::Dane(DaneEvent::TlsaRecordFetchError)), + 75 => Some(EventType::Dane(DaneEvent::TlsaRecordNotFound)), + 74 => Some(EventType::Dane(DaneEvent::TlsaRecordNotDnssecSigned)), + 72 => Some(EventType::Dane(DaneEvent::TlsaRecordInvalid)), + 77 => Some(EventType::Delivery(DeliveryEvent::AttemptStart)), + 76 => Some(EventType::Delivery(DeliveryEvent::AttemptEnd)), + 80 => Some(EventType::Delivery(DeliveryEvent::Completed)), + 92 => Some(EventType::Delivery(DeliveryEvent::Failed)), + 85 => Some(EventType::Delivery(DeliveryEvent::DomainDeliveryStart)), + 101 => Some(EventType::Delivery(DeliveryEvent::MxLookup)), + 102 => Some(EventType::Delivery(DeliveryEvent::MxLookupFailed)), + 95 => Some(EventType::Delivery(DeliveryEvent::IpLookup)), + 96 => Some(EventType::Delivery(DeliveryEvent::IpLookupFailed)), + 103 => Some(EventType::Delivery(DeliveryEvent::NullMx)), + 82 => Some(EventType::Delivery(DeliveryEvent::Connect)), + 83 => Some(EventType::Delivery(DeliveryEvent::ConnectError)), + 100 => Some(EventType::Delivery(DeliveryEvent::MissingOutboundHostname)), + 93 => Some(EventType::Delivery(DeliveryEvent::GreetingFailed)), + 90 => Some(EventType::Delivery(DeliveryEvent::Ehlo)), + 91 => Some(EventType::Delivery(DeliveryEvent::EhloRejected)), + 78 => Some(EventType::Delivery(DeliveryEvent::Auth)), + 79 => Some(EventType::Delivery(DeliveryEvent::AuthFailed)), + 97 => Some(EventType::Delivery(DeliveryEvent::MailFrom)), + 98 => Some(EventType::Delivery(DeliveryEvent::MailFromRejected)), + 84 => Some(EventType::Delivery(DeliveryEvent::Delivered)), + 107 => Some(EventType::Delivery(DeliveryEvent::RcptTo)), + 109 => Some(EventType::Delivery(DeliveryEvent::RcptToRejected)), + 108 => Some(EventType::Delivery(DeliveryEvent::RcptToFailed)), + 99 => Some(EventType::Delivery(DeliveryEvent::MessageRejected)), + 110 => Some(EventType::Delivery(DeliveryEvent::StartTls)), + 113 => Some(EventType::Delivery(DeliveryEvent::StartTlsUnavailable)), + 112 => Some(EventType::Delivery(DeliveryEvent::StartTlsError)), + 111 => Some(EventType::Delivery(DeliveryEvent::StartTlsDisabled)), + 94 => Some(EventType::Delivery(DeliveryEvent::ImplicitTlsError)), + 81 => Some(EventType::Delivery(DeliveryEvent::ConcurrencyLimitExceeded)), + 104 => Some(EventType::Delivery(DeliveryEvent::RateLimitExceeded)), + 86 => Some(EventType::Delivery(DeliveryEvent::DoubleBounce)), + 88 => Some(EventType::Delivery(DeliveryEvent::DsnSuccess)), + 89 => Some(EventType::Delivery(DeliveryEvent::DsnTempFail)), + 87 => Some(EventType::Delivery(DeliveryEvent::DsnPermFail)), + 105 => Some(EventType::Delivery(DeliveryEvent::RawInput)), + 106 => Some(EventType::Delivery(DeliveryEvent::RawOutput)), + 121 => Some(EventType::Dkim(DkimEvent::Pass)), + 119 => Some(EventType::Dkim(DkimEvent::Neutral)), + 114 => Some(EventType::Dkim(DkimEvent::Fail)), + 122 => Some(EventType::Dkim(DkimEvent::PermError)), + 127 => Some(EventType::Dkim(DkimEvent::TempError)), + 120 => Some(EventType::Dkim(DkimEvent::None)), + 131 => Some(EventType::Dkim(DkimEvent::UnsupportedVersion)), + 128 => Some(EventType::Dkim(DkimEvent::UnsupportedAlgorithm)), + 129 => Some(EventType::Dkim(DkimEvent::UnsupportedCanonicalization)), + 130 => Some(EventType::Dkim(DkimEvent::UnsupportedKeyType)), + 116 => Some(EventType::Dkim(DkimEvent::FailedBodyHashMatch)), + 117 => Some(EventType::Dkim(DkimEvent::FailedVerification)), + 115 => Some(EventType::Dkim(DkimEvent::FailedAuidMatch)), + 123 => Some(EventType::Dkim(DkimEvent::RevokedPublicKey)), + 118 => Some(EventType::Dkim(DkimEvent::IncompatibleAlgorithms)), + 124 => Some(EventType::Dkim(DkimEvent::SignatureExpired)), + 125 => Some(EventType::Dkim(DkimEvent::SignatureLength)), + 126 => Some(EventType::Dkim(DkimEvent::SignerNotFound)), + 592 => Some(EventType::Dkim(DkimEvent::BuildError)), + 134 => Some(EventType::Dmarc(DmarcEvent::Pass)), + 132 => Some(EventType::Dmarc(DmarcEvent::Fail)), + 135 => Some(EventType::Dmarc(DmarcEvent::PermError)), + 136 => Some(EventType::Dmarc(DmarcEvent::TempError)), + 133 => Some(EventType::Dmarc(DmarcEvent::None)), + 8 => Some(EventType::Dns(DnsEvent::RecordCreated)), + 9 => Some(EventType::Dns(DnsEvent::RecordCreationFailed)), + 10 => Some(EventType::Dns(DnsEvent::RecordDeletionFailed)), + 12 => Some(EventType::Dns(DnsEvent::RecordNotPropagated)), + 11 => Some(EventType::Dns(DnsEvent::RecordLookupFailed)), + 13 => Some(EventType::Dns(DnsEvent::RecordPropagated)), + 14 => Some(EventType::Dns(DnsEvent::RecordPropagationTimeout)), + 591 => Some(EventType::Dns(DnsEvent::BuildError)), + 139 => Some(EventType::Eval(EvalEvent::Result)), + 138 => Some(EventType::Eval(EvalEvent::Error)), + 137 => Some(EventType::Eval(EvalEvent::DirectoryNotFound)), + 140 => Some(EventType::Eval(EvalEvent::StoreNotFound)), + 150 => Some(EventType::Housekeeper(HousekeeperEvent::Start)), + 151 => Some(EventType::Housekeeper(HousekeeperEvent::Stop)), + 149 => Some(EventType::Housekeeper(HousekeeperEvent::Schedule)), + 146 => Some(EventType::Housekeeper(HousekeeperEvent::Run)), + 153 => Some(EventType::Http(HttpEvent::ConnectionStart)), + 152 => Some(EventType::Http(HttpEvent::ConnectionEnd)), + 154 => Some(EventType::Http(HttpEvent::Error)), + 156 => Some(EventType::Http(HttpEvent::RequestUrl)), + 155 => Some(EventType::Http(HttpEvent::RequestBody)), + 157 => Some(EventType::Http(HttpEvent::ResponseBody)), + 158 => Some(EventType::Http(HttpEvent::XForwardedMissing)), + 163 => Some(EventType::Imap(ImapEvent::ConnectionStart)), + 162 => Some(EventType::Imap(ImapEvent::ConnectionEnd)), + 171 => Some(EventType::Imap(ImapEvent::GetAcl)), + 188 => Some(EventType::Imap(ImapEvent::SetAcl)), + 180 => Some(EventType::Imap(ImapEvent::MyRights)), + 176 => Some(EventType::Imap(ImapEvent::ListRights)), + 159 => Some(EventType::Imap(ImapEvent::Append)), + 160 => Some(EventType::Imap(ImapEvent::Capabilities)), + 172 => Some(EventType::Imap(ImapEvent::Id)), + 161 => Some(EventType::Imap(ImapEvent::Close)), + 164 => Some(EventType::Imap(ImapEvent::Copy)), + 179 => Some(EventType::Imap(ImapEvent::Move)), + 165 => Some(EventType::Imap(ImapEvent::CreateMailbox)), + 166 => Some(EventType::Imap(ImapEvent::DeleteMailbox)), + 185 => Some(EventType::Imap(ImapEvent::RenameMailbox)), + 167 => Some(EventType::Imap(ImapEvent::Enable)), + 169 => Some(EventType::Imap(ImapEvent::Expunge)), + 170 => Some(EventType::Imap(ImapEvent::Fetch)), + 173 => Some(EventType::Imap(ImapEvent::IdleStart)), + 174 => Some(EventType::Imap(ImapEvent::IdleStop)), + 175 => Some(EventType::Imap(ImapEvent::List)), + 178 => Some(EventType::Imap(ImapEvent::Lsub)), + 177 => Some(EventType::Imap(ImapEvent::Logout)), + 181 => Some(EventType::Imap(ImapEvent::Namespace)), + 182 => Some(EventType::Imap(ImapEvent::Noop)), + 186 => Some(EventType::Imap(ImapEvent::Search)), + 189 => Some(EventType::Imap(ImapEvent::Sort)), + 187 => Some(EventType::Imap(ImapEvent::Select)), + 190 => Some(EventType::Imap(ImapEvent::Status)), + 191 => Some(EventType::Imap(ImapEvent::Store)), + 192 => Some(EventType::Imap(ImapEvent::Subscribe)), + 194 => Some(EventType::Imap(ImapEvent::Unsubscribe)), + 193 => Some(EventType::Imap(ImapEvent::Thread)), + 57 => Some(EventType::Imap(ImapEvent::GetQuota)), + 168 => Some(EventType::Imap(ImapEvent::Error)), + 183 => Some(EventType::Imap(ImapEvent::RawInput)), + 184 => Some(EventType::Imap(ImapEvent::RawOutput)), + 200 => Some(EventType::IncomingReport(IncomingReportEvent::DmarcReport)), + 201 => Some(EventType::IncomingReport( + IncomingReportEvent::DmarcReportWithWarnings, + )), + 206 => Some(EventType::IncomingReport(IncomingReportEvent::TlsReport)), + 207 => Some(EventType::IncomingReport( + IncomingReportEvent::TlsReportWithWarnings, + )), + 195 => Some(EventType::IncomingReport(IncomingReportEvent::AbuseReport)), + 197 => Some(EventType::IncomingReport( + IncomingReportEvent::AuthFailureReport, + )), + 202 => Some(EventType::IncomingReport(IncomingReportEvent::FraudReport)), + 204 => Some(EventType::IncomingReport( + IncomingReportEvent::NotSpamReport, + )), + 209 => Some(EventType::IncomingReport(IncomingReportEvent::VirusReport)), + 205 => Some(EventType::IncomingReport(IncomingReportEvent::OtherReport)), + 203 => Some(EventType::IncomingReport( + IncomingReportEvent::MessageParseFailed, + )), + 199 => Some(EventType::IncomingReport( + IncomingReportEvent::DmarcParseFailed, + )), + 208 => Some(EventType::IncomingReport( + IncomingReportEvent::TlsRpcParseFailed, + )), + 196 => Some(EventType::IncomingReport( + IncomingReportEvent::ArfParseFailed, + )), + 198 => Some(EventType::IncomingReport( + IncomingReportEvent::DecompressError, + )), + 212 => Some(EventType::Iprev(IprevEvent::Pass)), + 210 => Some(EventType::Iprev(IprevEvent::Fail)), + 213 => Some(EventType::Iprev(IprevEvent::PermError)), + 214 => Some(EventType::Iprev(IprevEvent::TempError)), + 211 => Some(EventType::Iprev(IprevEvent::None)), + 223 => Some(EventType::Jmap(JmapEvent::MethodCall)), + 221 => Some(EventType::Jmap(JmapEvent::InvalidArguments)), + 227 => Some(EventType::Jmap(JmapEvent::RequestTooLarge)), + 228 => Some(EventType::Jmap(JmapEvent::StateMismatch)), + 218 => Some(EventType::Jmap(JmapEvent::AnchorNotFound)), + 232 => Some(EventType::Jmap(JmapEvent::UnsupportedFilter)), + 233 => Some(EventType::Jmap(JmapEvent::UnsupportedSort)), + 231 => Some(EventType::Jmap(JmapEvent::UnknownMethod)), + 222 => Some(EventType::Jmap(JmapEvent::InvalidResultReference)), + 220 => Some(EventType::Jmap(JmapEvent::Forbidden)), + 215 => Some(EventType::Jmap(JmapEvent::AccountNotFound)), + 216 => Some(EventType::Jmap(JmapEvent::AccountNotSupportedByMethod)), + 217 => Some(EventType::Jmap(JmapEvent::AccountReadOnly)), + 224 => Some(EventType::Jmap(JmapEvent::NotFound)), + 219 => Some(EventType::Jmap(JmapEvent::CannotCalculateChanges)), + 230 => Some(EventType::Jmap(JmapEvent::UnknownDataType)), + 229 => Some(EventType::Jmap(JmapEvent::UnknownCapability)), + 225 => Some(EventType::Jmap(JmapEvent::NotJson)), + 226 => Some(EventType::Jmap(JmapEvent::NotRequest)), + 235 => Some(EventType::Jmap(JmapEvent::WebsocketStart)), + 236 => Some(EventType::Jmap(JmapEvent::WebsocketStop)), + 234 => Some(EventType::Jmap(JmapEvent::WebsocketError)), + 243 => Some(EventType::Limit(LimitEvent::SizeRequest)), + 244 => Some(EventType::Limit(LimitEvent::SizeUpload)), + 238 => Some(EventType::Limit(LimitEvent::CallsIn)), + 240 => Some(EventType::Limit(LimitEvent::ConcurrentRequest)), + 241 => Some(EventType::Limit(LimitEvent::ConcurrentUpload)), + 239 => Some(EventType::Limit(LimitEvent::ConcurrentConnection)), + 242 => Some(EventType::Limit(LimitEvent::Quota)), + 237 => Some(EventType::Limit(LimitEvent::BlobQuota)), + 553 => Some(EventType::Limit(LimitEvent::TenantQuota)), + 245 => Some(EventType::Limit(LimitEvent::TooManyRequests)), + 254 => Some(EventType::MailAuth(MailAuthEvent::ParseError)), + 252 => Some(EventType::MailAuth(MailAuthEvent::MissingParameters)), + 253 => Some(EventType::MailAuth(MailAuthEvent::NoHeadersFound)), + 247 => Some(EventType::MailAuth(MailAuthEvent::Crypto)), + 251 => Some(EventType::MailAuth(MailAuthEvent::Io)), + 246 => Some(EventType::MailAuth(MailAuthEvent::Base64)), + 248 => Some(EventType::MailAuth(MailAuthEvent::DnsError)), + 250 => Some(EventType::MailAuth(MailAuthEvent::DnsRecordNotFound)), + 249 => Some(EventType::MailAuth(MailAuthEvent::DnsInvalidRecordType)), + 255 => Some(EventType::MailAuth(MailAuthEvent::PolicyNotAligned)), + 278 => Some(EventType::Manage(ManageEvent::MissingParameter)), + 275 => Some(EventType::Manage(ManageEvent::AlreadyExists)), + 276 => Some(EventType::Manage(ManageEvent::AssertFailed)), + 279 => Some(EventType::Manage(ManageEvent::NotFound)), + 280 => Some(EventType::Manage(ManageEvent::NotSupported)), + 277 => Some(EventType::Manage(ManageEvent::Error)), + 259 => Some(EventType::ManageSieve(ManageSieveEvent::ConnectionStart)), + 258 => Some(EventType::ManageSieve(ManageSieveEvent::ConnectionEnd)), + 260 => Some(EventType::ManageSieve(ManageSieveEvent::CreateScript)), + 274 => Some(EventType::ManageSieve(ManageSieveEvent::UpdateScript)), + 263 => Some(EventType::ManageSieve(ManageSieveEvent::GetScript)), + 261 => Some(EventType::ManageSieve(ManageSieveEvent::DeleteScript)), + 270 => Some(EventType::ManageSieve(ManageSieveEvent::RenameScript)), + 257 => Some(EventType::ManageSieve(ManageSieveEvent::CheckScript)), + 264 => Some(EventType::ManageSieve(ManageSieveEvent::HaveSpace)), + 265 => Some(EventType::ManageSieve(ManageSieveEvent::ListScripts)), + 271 => Some(EventType::ManageSieve(ManageSieveEvent::SetActive)), + 256 => Some(EventType::ManageSieve(ManageSieveEvent::Capabilities)), + 272 => Some(EventType::ManageSieve(ManageSieveEvent::StartTls)), + 273 => Some(EventType::ManageSieve(ManageSieveEvent::Unauthenticate)), + 266 => Some(EventType::ManageSieve(ManageSieveEvent::Logout)), + 267 => Some(EventType::ManageSieve(ManageSieveEvent::Noop)), + 262 => Some(EventType::ManageSieve(ManageSieveEvent::Error)), + 268 => Some(EventType::ManageSieve(ManageSieveEvent::RawInput)), + 269 => Some(EventType::ManageSieve(ManageSieveEvent::RawOutput)), + 283 => Some(EventType::MessageIngest(MessageIngestEvent::Ham)), + 286 => Some(EventType::MessageIngest(MessageIngestEvent::Spam)), + 284 => Some(EventType::MessageIngest(MessageIngestEvent::ImapAppend)), + 285 => Some(EventType::MessageIngest(MessageIngestEvent::JmapAppend)), + 281 => Some(EventType::MessageIngest(MessageIngestEvent::Duplicate)), + 282 => Some(EventType::MessageIngest(MessageIngestEvent::Error)), + 142 => Some(EventType::MessageIngest(MessageIngestEvent::FtsIndex)), + 299 => Some(EventType::Milter(MilterEvent::Read)), + 303 => Some(EventType::Milter(MilterEvent::Write)), + 287 => Some(EventType::Milter(MilterEvent::ActionAccept)), + 289 => Some(EventType::Milter(MilterEvent::ActionDiscard)), + 290 => Some(EventType::Milter(MilterEvent::ActionReject)), + 293 => Some(EventType::Milter(MilterEvent::ActionTempFail)), + 291 => Some(EventType::Milter(MilterEvent::ActionReplyCode)), + 288 => Some(EventType::Milter(MilterEvent::ActionConnectionFailure)), + 292 => Some(EventType::Milter(MilterEvent::ActionShutdown)), + 297 => Some(EventType::Milter(MilterEvent::IoError)), + 296 => Some(EventType::Milter(MilterEvent::FrameTooLarge)), + 295 => Some(EventType::Milter(MilterEvent::FrameInvalid)), + 302 => Some(EventType::Milter(MilterEvent::UnexpectedResponse)), + 300 => Some(EventType::Milter(MilterEvent::Timeout)), + 301 => Some(EventType::Milter(MilterEvent::TlsInvalidName)), + 294 => Some(EventType::Milter(MilterEvent::Disconnected)), + 298 => Some(EventType::Milter(MilterEvent::ParseError)), + 304 => Some(EventType::MtaHook(MtaHookEvent::ActionAccept)), + 305 => Some(EventType::MtaHook(MtaHookEvent::ActionDiscard)), + 307 => Some(EventType::MtaHook(MtaHookEvent::ActionReject)), + 306 => Some(EventType::MtaHook(MtaHookEvent::ActionQuarantine)), + 308 => Some(EventType::MtaHook(MtaHookEvent::Error)), + 309 => Some(EventType::MtaSts(MtaStsEvent::Authorized)), + 311 => Some(EventType::MtaSts(MtaStsEvent::NotAuthorized)), + 312 => Some(EventType::MtaSts(MtaStsEvent::PolicyFetch)), + 314 => Some(EventType::MtaSts(MtaStsEvent::PolicyNotFound)), + 313 => Some(EventType::MtaSts(MtaStsEvent::PolicyFetchError)), + 310 => Some(EventType::MtaSts(MtaStsEvent::InvalidPolicy)), + 321 => Some(EventType::Network(NetworkEvent::ListenStart)), + 322 => Some(EventType::Network(NetworkEvent::ListenStop)), + 320 => Some(EventType::Network(NetworkEvent::ListenError)), + 316 => Some(EventType::Network(NetworkEvent::BindError)), + 324 => Some(EventType::Network(NetworkEvent::ReadError)), + 328 => Some(EventType::Network(NetworkEvent::WriteError)), + 319 => Some(EventType::Network(NetworkEvent::FlushError)), + 315 => Some(EventType::Network(NetworkEvent::AcceptError)), + 326 => Some(EventType::Network(NetworkEvent::SplitError)), + 327 => Some(EventType::Network(NetworkEvent::Timeout)), + 317 => Some(EventType::Network(NetworkEvent::Closed)), + 323 => Some(EventType::Network(NetworkEvent::ProxyError)), + 325 => Some(EventType::Network(NetworkEvent::SetOptError)), + 342 => Some(EventType::OutgoingReport(OutgoingReportEvent::SpfReport)), + 341 => Some(EventType::OutgoingReport( + OutgoingReportEvent::SpfRateLimited, + )), + 330 => Some(EventType::OutgoingReport(OutgoingReportEvent::DkimReport)), + 329 => Some(EventType::OutgoingReport( + OutgoingReportEvent::DkimRateLimited, + )), + 333 => Some(EventType::OutgoingReport(OutgoingReportEvent::DmarcReport)), + 332 => Some(EventType::OutgoingReport( + OutgoingReportEvent::DmarcRateLimited, + )), + 331 => Some(EventType::OutgoingReport( + OutgoingReportEvent::DmarcAggregateReport, + )), + 344 => Some(EventType::OutgoingReport(OutgoingReportEvent::TlsAggregate)), + 334 => Some(EventType::OutgoingReport( + OutgoingReportEvent::HttpSubmission, + )), + 345 => Some(EventType::OutgoingReport( + OutgoingReportEvent::UnauthorizedReportingAddress, + )), + 340 => Some(EventType::OutgoingReport( + OutgoingReportEvent::ReportingAddressValidationError, + )), + 339 => Some(EventType::OutgoingReport(OutgoingReportEvent::NotFound)), + 343 => Some(EventType::OutgoingReport( + OutgoingReportEvent::SubmissionError, + )), + 338 => Some(EventType::OutgoingReport( + OutgoingReportEvent::NoRecipientsFound, + )), + 337 => Some(EventType::OutgoingReport(OutgoingReportEvent::Locked)), + 348 => Some(EventType::Pop3(Pop3Event::ConnectionStart)), + 347 => Some(EventType::Pop3(Pop3Event::ConnectionEnd)), + 349 => Some(EventType::Pop3(Pop3Event::Delete)), + 358 => Some(EventType::Pop3(Pop3Event::Reset)), + 355 => Some(EventType::Pop3(Pop3Event::Quit)), + 351 => Some(EventType::Pop3(Pop3Event::Fetch)), + 352 => Some(EventType::Pop3(Pop3Event::List)), + 353 => Some(EventType::Pop3(Pop3Event::ListMessage)), + 361 => Some(EventType::Pop3(Pop3Event::Uidl)), + 362 => Some(EventType::Pop3(Pop3Event::UidlMessage)), + 360 => Some(EventType::Pop3(Pop3Event::Stat)), + 354 => Some(EventType::Pop3(Pop3Event::Noop)), + 346 => Some(EventType::Pop3(Pop3Event::Capabilities)), + 359 => Some(EventType::Pop3(Pop3Event::StartTls)), + 363 => Some(EventType::Pop3(Pop3Event::Utf8)), + 350 => Some(EventType::Pop3(Pop3Event::Error)), + 356 => Some(EventType::Pop3(Pop3Event::RawInput)), + 357 => Some(EventType::Pop3(Pop3Event::RawOutput)), + 369 => Some(EventType::Purge(PurgeEvent::Started)), + 366 => Some(EventType::Purge(PurgeEvent::Finished)), + 368 => Some(EventType::Purge(PurgeEvent::Running)), + 365 => Some(EventType::Purge(PurgeEvent::Error)), + 367 => Some(EventType::Purge(PurgeEvent::InProgress)), + 364 => Some(EventType::Purge(PurgeEvent::AutoExpunge)), + 370 => Some(EventType::Purge(PurgeEvent::BlobCleanup)), + 373 => Some(EventType::PushSubscription(PushSubscriptionEvent::Success)), + 371 => Some(EventType::PushSubscription(PushSubscriptionEvent::Error)), + 372 => Some(EventType::PushSubscription(PushSubscriptionEvent::NotFound)), + 380 => Some(EventType::Queue(QueueEvent::QueueMessage)), + 381 => Some(EventType::Queue(QueueEvent::QueueMessageAuthenticated)), + 382 => Some(EventType::Queue(QueueEvent::QueueReport)), + 379 => Some(EventType::Queue(QueueEvent::QueueDsn)), + 378 => Some(EventType::Queue(QueueEvent::QueueAutogenerated)), + 385 => Some(EventType::Queue(QueueEvent::Rescheduled)), + 377 => Some(EventType::Queue(QueueEvent::Locked)), + 374 => Some(EventType::Queue(QueueEvent::BlobNotFound)), + 384 => Some(EventType::Queue(QueueEvent::RateLimitExceeded)), + 375 => Some(EventType::Queue(QueueEvent::ConcurrencyLimitExceeded)), + 383 => Some(EventType::Queue(QueueEvent::QuotaExceeded)), + 48 => Some(EventType::Queue(QueueEvent::BackPressure)), + 389 => Some(EventType::Resource(ResourceEvent::NotFound)), + 386 => Some(EventType::Resource(ResourceEvent::BadParameters)), + 388 => Some(EventType::Resource(ResourceEvent::Error)), + 387 => Some(EventType::Resource(ResourceEvent::DownloadExternal)), + 390 => Some(EventType::Resource(ResourceEvent::WebadminUnpacked)), + 33 => Some(EventType::Security(SecurityEvent::AuthenticationBan)), + 549 => Some(EventType::Security(SecurityEvent::AbuseBan)), + 558 => Some(EventType::Security(SecurityEvent::ScanBan)), + 550 => Some(EventType::Security(SecurityEvent::LoiterBan)), + 318 => Some(EventType::Security(SecurityEvent::IpBlocked)), + 552 => Some(EventType::Security(SecurityEvent::Unauthorized)), + 393 => Some(EventType::Server(ServerEvent::Startup)), + 392 => Some(EventType::Server(ServerEvent::Shutdown)), + 394 => Some(EventType::Server(ServerEvent::StartupError)), + 395 => Some(EventType::Server(ServerEvent::ThreadError)), + 391 => Some(EventType::Server(ServerEvent::Licensing)), + 396 => Some(EventType::Sieve(SieveEvent::ActionAccept)), + 397 => Some(EventType::Sieve(SieveEvent::ActionAcceptReplace)), + 398 => Some(EventType::Sieve(SieveEvent::ActionDiscard)), + 399 => Some(EventType::Sieve(SieveEvent::ActionReject)), + 406 => Some(EventType::Sieve(SieveEvent::SendMessage)), + 401 => Some(EventType::Sieve(SieveEvent::MessageTooLarge)), + 405 => Some(EventType::Sieve(SieveEvent::ScriptNotFound)), + 400 => Some(EventType::Sieve(SieveEvent::ListNotFound)), + 404 => Some(EventType::Sieve(SieveEvent::RuntimeError)), + 407 => Some(EventType::Sieve(SieveEvent::UnexpectedError)), + 402 => Some(EventType::Sieve(SieveEvent::NotSupported)), + 403 => Some(EventType::Sieve(SieveEvent::QuotaExceeded)), + 417 => Some(EventType::Smtp(SmtpEvent::ConnectionStart)), + 416 => Some(EventType::Smtp(SmtpEvent::ConnectionEnd)), + 428 => Some(EventType::Smtp(SmtpEvent::Error)), + 469 => Some(EventType::Smtp(SmtpEvent::IdNotFound)), + 415 => Some(EventType::Smtp(SmtpEvent::ConcurrencyLimitExceeded)), + 485 => Some(EventType::Smtp(SmtpEvent::TransferLimitExceeded)), + 461 => Some(EventType::Smtp(SmtpEvent::RateLimitExceeded)), + 481 => Some(EventType::Smtp(SmtpEvent::TimeLimitExceeded)), + 452 => Some(EventType::Smtp(SmtpEvent::MissingAuthDirectory)), + 450 => Some(EventType::Smtp(SmtpEvent::MessageParseFailed)), + 451 => Some(EventType::Smtp(SmtpEvent::MessageTooLarge)), + 443 => Some(EventType::Smtp(SmtpEvent::LoopDetected)), + 422 => Some(EventType::Smtp(SmtpEvent::DkimPass)), + 421 => Some(EventType::Smtp(SmtpEvent::DkimFail)), + 410 => Some(EventType::Smtp(SmtpEvent::ArcPass)), + 409 => Some(EventType::Smtp(SmtpEvent::ArcFail)), + 474 => Some(EventType::Smtp(SmtpEvent::SpfEhloPass)), + 473 => Some(EventType::Smtp(SmtpEvent::SpfEhloFail)), + 476 => Some(EventType::Smtp(SmtpEvent::SpfFromPass)), + 475 => Some(EventType::Smtp(SmtpEvent::SpfFromFail)), + 424 => Some(EventType::Smtp(SmtpEvent::DmarcPass)), + 423 => Some(EventType::Smtp(SmtpEvent::DmarcFail)), + 441 => Some(EventType::Smtp(SmtpEvent::IprevPass)), + 440 => Some(EventType::Smtp(SmtpEvent::IprevFail)), + 483 => Some(EventType::Smtp(SmtpEvent::TooManyMessages)), + 426 => Some(EventType::Smtp(SmtpEvent::Ehlo)), + 436 => Some(EventType::Smtp(SmtpEvent::InvalidEhlo)), + 420 => Some(EventType::Smtp(SmtpEvent::DidNotSayEhlo)), + 427 => Some(EventType::Smtp(SmtpEvent::EhloExpected)), + 442 => Some(EventType::Smtp(SmtpEvent::LhloExpected)), + 447 => Some(EventType::Smtp(SmtpEvent::MailFromUnauthenticated)), + 448 => Some(EventType::Smtp(SmtpEvent::MailFromUnauthorized)), + 551 => Some(EventType::Smtp(SmtpEvent::MailFromNotAllowed)), + 446 => Some(EventType::Smtp(SmtpEvent::MailFromRewritten)), + 445 => Some(EventType::Smtp(SmtpEvent::MailFromMissing)), + 444 => Some(EventType::Smtp(SmtpEvent::MailFrom)), + 456 => Some(EventType::Smtp(SmtpEvent::MultipleMailFrom)), + 449 => Some(EventType::Smtp(SmtpEvent::MailboxDoesNotExist)), + 468 => Some(EventType::Smtp(SmtpEvent::RelayNotAllowed)), + 464 => Some(EventType::Smtp(SmtpEvent::RcptTo)), + 465 => Some(EventType::Smtp(SmtpEvent::RcptToDuplicate)), + 467 => Some(EventType::Smtp(SmtpEvent::RcptToRewritten)), + 466 => Some(EventType::Smtp(SmtpEvent::RcptToMissing)), + 561 => Some(EventType::Smtp(SmtpEvent::RcptToGreylisted)), + 484 => Some(EventType::Smtp(SmtpEvent::TooManyRecipients)), + 482 => Some(EventType::Smtp(SmtpEvent::TooManyInvalidRcpt)), + 462 => Some(EventType::Smtp(SmtpEvent::RawInput)), + 463 => Some(EventType::Smtp(SmtpEvent::RawOutput)), + 453 => Some(EventType::Smtp(SmtpEvent::MissingLocalHostname)), + 487 => Some(EventType::Smtp(SmtpEvent::Vrfy)), + 489 => Some(EventType::Smtp(SmtpEvent::VrfyNotFound)), + 488 => Some(EventType::Smtp(SmtpEvent::VrfyDisabled)), + 429 => Some(EventType::Smtp(SmtpEvent::Expn)), + 431 => Some(EventType::Smtp(SmtpEvent::ExpnNotFound)), + 430 => Some(EventType::Smtp(SmtpEvent::ExpnDisabled)), + 471 => Some(EventType::Smtp(SmtpEvent::RequireTlsDisabled)), + 418 => Some(EventType::Smtp(SmtpEvent::DeliverByDisabled)), + 419 => Some(EventType::Smtp(SmtpEvent::DeliverByInvalid)), + 432 => Some(EventType::Smtp(SmtpEvent::FutureReleaseDisabled)), + 433 => Some(EventType::Smtp(SmtpEvent::FutureReleaseInvalid)), + 454 => Some(EventType::Smtp(SmtpEvent::MtPriorityDisabled)), + 455 => Some(EventType::Smtp(SmtpEvent::MtPriorityInvalid)), + 425 => Some(EventType::Smtp(SmtpEvent::DsnDisabled)), + 413 => Some(EventType::Smtp(SmtpEvent::AuthNotAllowed)), + 412 => Some(EventType::Smtp(SmtpEvent::AuthMechanismNotSupported)), + 411 => Some(EventType::Smtp(SmtpEvent::AuthExchangeTooLong)), + 408 => Some(EventType::Smtp(SmtpEvent::AlreadyAuthenticated)), + 457 => Some(EventType::Smtp(SmtpEvent::Noop)), + 477 => Some(EventType::Smtp(SmtpEvent::StartTls)), + 479 => Some(EventType::Smtp(SmtpEvent::StartTlsUnavailable)), + 478 => Some(EventType::Smtp(SmtpEvent::StartTlsAlready)), + 472 => Some(EventType::Smtp(SmtpEvent::Rset)), + 460 => Some(EventType::Smtp(SmtpEvent::Quit)), + 434 => Some(EventType::Smtp(SmtpEvent::Help)), + 414 => Some(EventType::Smtp(SmtpEvent::CommandNotImplemented)), + 435 => Some(EventType::Smtp(SmtpEvent::InvalidCommand)), + 439 => Some(EventType::Smtp(SmtpEvent::InvalidSenderAddress)), + 438 => Some(EventType::Smtp(SmtpEvent::InvalidRecipientAddress)), + 437 => Some(EventType::Smtp(SmtpEvent::InvalidParameter)), + 486 => Some(EventType::Smtp(SmtpEvent::UnsupportedParameter)), + 480 => Some(EventType::Smtp(SmtpEvent::SyntaxError)), + 470 => Some(EventType::Smtp(SmtpEvent::RequestTooLarge)), + 564 => Some(EventType::Spam(SpamEvent::Pyzor)), + 494 => Some(EventType::Spam(SpamEvent::PyzorError)), + 562 => Some(EventType::Spam(SpamEvent::Dnsbl)), + 563 => Some(EventType::Spam(SpamEvent::DnsblError)), + 588 => Some(EventType::Spam(SpamEvent::TrainStarted)), + 495 => Some(EventType::Spam(SpamEvent::TrainCompleted)), + 143 => Some(EventType::Spam(SpamEvent::TrainSampleAdded)), + 491 => Some(EventType::Spam(SpamEvent::TrainSampleNotFound)), + 490 => Some(EventType::Spam(SpamEvent::Classify)), + 589 => Some(EventType::Spam(SpamEvent::ModelLoaded)), + 496 => Some(EventType::Spam(SpamEvent::ModelNotReady)), + 497 => Some(EventType::Spam(SpamEvent::ModelNotFound)), + 501 => Some(EventType::Spf(SpfEvent::Pass)), + 498 => Some(EventType::Spf(SpfEvent::Fail)), + 503 => Some(EventType::Spf(SpfEvent::SoftFail)), + 499 => Some(EventType::Spf(SpfEvent::Neutral)), + 504 => Some(EventType::Spf(SpfEvent::TempError)), + 502 => Some(EventType::Spf(SpfEvent::PermError)), + 500 => Some(EventType::Spf(SpfEvent::None)), + 505 => Some(EventType::Store(StoreEvent::AssertValueFailed)), + 518 => Some(EventType::Store(StoreEvent::FoundationdbError)), + 522 => Some(EventType::Store(StoreEvent::MysqlError)), + 527 => Some(EventType::Store(StoreEvent::PostgresqlError)), + 529 => Some(EventType::Store(StoreEvent::RocksdbError)), + 532 => Some(EventType::Store(StoreEvent::SqliteError)), + 520 => Some(EventType::Store(StoreEvent::LdapError)), + 516 => Some(EventType::Store(StoreEvent::ElasticsearchError)), + 590 => Some(EventType::Store(StoreEvent::MeilisearchError)), + 528 => Some(EventType::Store(StoreEvent::RedisError)), + 530 => Some(EventType::Store(StoreEvent::S3Error)), + 559 => Some(EventType::Store(StoreEvent::AzureError)), + 517 => Some(EventType::Store(StoreEvent::FilesystemError)), + 526 => Some(EventType::Store(StoreEvent::PoolError)), + 511 => Some(EventType::Store(StoreEvent::DataCorruption)), + 514 => Some(EventType::Store(StoreEvent::DecompressError)), + 515 => Some(EventType::Store(StoreEvent::DeserializeError)), + 524 => Some(EventType::Store(StoreEvent::NotFound)), + 523 => Some(EventType::Store(StoreEvent::NotConfigured)), + 525 => Some(EventType::Store(StoreEvent::NotSupported)), + 533 => Some(EventType::Store(StoreEvent::UnexpectedError)), + 510 => Some(EventType::Store(StoreEvent::CryptoError)), + 493 => Some(EventType::Store(StoreEvent::HttpStoreError)), + 50 => Some(EventType::Store(StoreEvent::CacheMiss)), + 51 => Some(EventType::Store(StoreEvent::CacheHit)), + 52 => Some(EventType::Store(StoreEvent::CacheStale)), + 577 => Some(EventType::Store(StoreEvent::CacheUpdate)), + 507 => Some(EventType::Store(StoreEvent::BlobMissingMarker)), + 513 => Some(EventType::Store(StoreEvent::DataWrite)), + 512 => Some(EventType::Store(StoreEvent::DataIterate)), + 508 => Some(EventType::Store(StoreEvent::BlobRead)), + 509 => Some(EventType::Store(StoreEvent::BlobWrite)), + 506 => Some(EventType::Store(StoreEvent::BlobDelete)), + 531 => Some(EventType::Store(StoreEvent::SqlQuery)), + 521 => Some(EventType::Store(StoreEvent::LdapQuery)), + 519 => Some(EventType::Store(StoreEvent::LdapWarning)), + 492 => Some(EventType::Store(StoreEvent::HttpStoreFetch)), + 578 => Some(EventType::TaskQueue(TaskQueueEvent::TaskAcquired)), + 144 => Some(EventType::TaskQueue(TaskQueueEvent::TaskLocked)), + 586 => Some(EventType::TaskQueue(TaskQueueEvent::TaskIgnored)), + 587 => Some(EventType::TaskQueue(TaskQueueEvent::TaskFailed)), + 141 => Some(EventType::TaskQueue(TaskQueueEvent::BlobNotFound)), + 145 => Some(EventType::TaskQueue(TaskQueueEvent::MetadataNotFound)), + 548 => Some(EventType::Telemetry(TelemetryEvent::Alert)), + 535 => Some(EventType::Telemetry(TelemetryEvent::LogError)), + 539 => Some(EventType::Telemetry(TelemetryEvent::WebhookError)), + 536 => Some(EventType::Telemetry(TelemetryEvent::OtelExporterError)), + 537 => Some(EventType::Telemetry( + TelemetryEvent::OtelMetricsExporterError, + )), + 538 => Some(EventType::Telemetry( + TelemetryEvent::PrometheusExporterError, + )), + 534 => Some(EventType::Telemetry(TelemetryEvent::JournalError)), + 543 => Some(EventType::Tls(TlsEvent::Handshake)), + 544 => Some(EventType::Tls(TlsEvent::HandshakeError)), + 547 => Some(EventType::Tls(TlsEvent::NotConfigured)), + 542 => Some(EventType::Tls(TlsEvent::CertificateNotFound)), + 546 => Some(EventType::Tls(TlsEvent::NoCertificatesAvailable)), + 545 => Some(EventType::Tls(TlsEvent::MultipleCertificatesAvailable)), + 540 => Some(EventType::TlsRpt(TlsRptEvent::RecordFetch)), + 541 => Some(EventType::TlsRpt(TlsRptEvent::RecordFetchError)), + 560 => Some(EventType::TlsRpt(TlsRptEvent::RecordNotFound)), + 147 => Some(EventType::WebDav(WebDavEvent::Propfind)), + 148 => Some(EventType::WebDav(WebDavEvent::Proppatch)), + 335 => Some(EventType::WebDav(WebDavEvent::Get)), + 574 => Some(EventType::WebDav(WebDavEvent::Head)), + 336 => Some(EventType::WebDav(WebDavEvent::Report)), + 376 => Some(EventType::WebDav(WebDavEvent::Mkcol)), + 575 => Some(EventType::WebDav(WebDavEvent::Mkcalendar)), + 458 => Some(EventType::WebDav(WebDavEvent::Delete)), + 459 => Some(EventType::WebDav(WebDavEvent::Put)), + 565 => Some(EventType::WebDav(WebDavEvent::Post)), + 566 => Some(EventType::WebDav(WebDavEvent::Patch)), + 567 => Some(EventType::WebDav(WebDavEvent::Copy)), + 568 => Some(EventType::WebDav(WebDavEvent::Move)), + 569 => Some(EventType::WebDav(WebDavEvent::Lock)), + 570 => Some(EventType::WebDav(WebDavEvent::Unlock)), + 571 => Some(EventType::WebDav(WebDavEvent::Acl)), + 573 => Some(EventType::WebDav(WebDavEvent::Options)), + 572 => Some(EventType::WebDav(WebDavEvent::Error)), + _ => None, + } + } + + pub fn level(&self) -> Level { + match self { + EventType::Acme(AcmeEvent::Error) => Level::Error, + EventType::Auth(AuthEvent::Error) => Level::Error, + EventType::Cluster(ClusterEvent::SubscriberError) => Level::Error, + EventType::Cluster(ClusterEvent::PublisherError) => Level::Error, + EventType::Cluster(ClusterEvent::MessageInvalid) => Level::Error, + EventType::Config(ConfigEvent::ParseError) => Level::Error, + EventType::Config(ConfigEvent::BuildError) => Level::Error, + EventType::Config(ConfigEvent::MacroError) => Level::Error, + EventType::Config(ConfigEvent::WriteError) => Level::Error, + EventType::Config(ConfigEvent::FetchError) => Level::Error, + EventType::Dkim(DkimEvent::BuildError) => Level::Error, + EventType::Dns(DnsEvent::BuildError) => Level::Error, + EventType::MessageIngest(MessageIngestEvent::Error) => Level::Error, + EventType::Network(NetworkEvent::ListenError) => Level::Error, + EventType::Network(NetworkEvent::BindError) => Level::Error, + EventType::Network(NetworkEvent::SplitError) => Level::Error, + EventType::Network(NetworkEvent::SetOptError) => Level::Error, + EventType::Purge(PurgeEvent::Error) => Level::Error, + EventType::Resource(ResourceEvent::BadParameters) => Level::Error, + EventType::Resource(ResourceEvent::Error) => Level::Error, + EventType::Server(ServerEvent::StartupError) => Level::Error, + EventType::Server(ServerEvent::ThreadError) => Level::Error, + EventType::Sieve(SieveEvent::UnexpectedError) => Level::Error, + EventType::Store(StoreEvent::AssertValueFailed) => Level::Error, + EventType::Store(StoreEvent::FoundationdbError) => Level::Error, + EventType::Store(StoreEvent::MysqlError) => Level::Error, + EventType::Store(StoreEvent::PostgresqlError) => Level::Error, + EventType::Store(StoreEvent::RocksdbError) => Level::Error, + EventType::Store(StoreEvent::SqliteError) => Level::Error, + EventType::Store(StoreEvent::LdapError) => Level::Error, + EventType::Store(StoreEvent::ElasticsearchError) => Level::Error, + EventType::Store(StoreEvent::MeilisearchError) => Level::Error, + EventType::Store(StoreEvent::RedisError) => Level::Error, + EventType::Store(StoreEvent::S3Error) => Level::Error, + EventType::Store(StoreEvent::AzureError) => Level::Error, + EventType::Store(StoreEvent::FilesystemError) => Level::Error, + EventType::Store(StoreEvent::PoolError) => Level::Error, + EventType::Store(StoreEvent::DataCorruption) => Level::Error, + EventType::Store(StoreEvent::DecompressError) => Level::Error, + EventType::Store(StoreEvent::DeserializeError) => Level::Error, + EventType::Store(StoreEvent::NotConfigured) => Level::Error, + EventType::Store(StoreEvent::NotSupported) => Level::Error, + EventType::Store(StoreEvent::UnexpectedError) => Level::Error, + EventType::Store(StoreEvent::CryptoError) => Level::Error, + EventType::Tls(TlsEvent::NotConfigured) => Level::Error, + EventType::Acme(AcmeEvent::AuthStart) => Level::Info, + EventType::Acme(AcmeEvent::AuthPending) => Level::Info, + EventType::Acme(AcmeEvent::AuthValid) => Level::Info, + EventType::Acme(AcmeEvent::AuthCompleted) => Level::Info, + EventType::Acme(AcmeEvent::ProcessCert) => Level::Info, + EventType::Acme(AcmeEvent::OrderStart) => Level::Info, + EventType::Acme(AcmeEvent::OrderProcessing) => Level::Info, + EventType::Acme(AcmeEvent::OrderCompleted) => Level::Info, + EventType::Acme(AcmeEvent::OrderReady) => Level::Info, + EventType::Acme(AcmeEvent::OrderValid) => Level::Info, + EventType::Acme(AcmeEvent::TlsAlpnReceived) => Level::Info, + EventType::Auth(AuthEvent::Success) => Level::Info, + EventType::Auth(AuthEvent::ClientRegistration) => Level::Info, + EventType::Calendar(CalendarEvent::AlarmSent) => Level::Info, + EventType::Calendar(CalendarEvent::ItipMessageSent) => Level::Info, + EventType::Calendar(CalendarEvent::ItipMessageReceived) => Level::Info, + EventType::Cluster(ClusterEvent::SubscriberStart) => Level::Info, + EventType::Cluster(ClusterEvent::SubscriberStop) => Level::Info, + EventType::Cluster(ClusterEvent::PublisherStart) => Level::Info, + EventType::Cluster(ClusterEvent::PublisherStop) => Level::Info, + EventType::Config(ConfigEvent::ImportExternal) => Level::Info, + EventType::Dane(DaneEvent::AuthenticationSuccess) => Level::Info, + EventType::Dane(DaneEvent::AuthenticationFailure) => Level::Info, + EventType::Dane(DaneEvent::NoCertificatesFound) => Level::Info, + EventType::Dane(DaneEvent::CertificateParseError) => Level::Info, + EventType::Dane(DaneEvent::TlsaRecordMatch) => Level::Info, + EventType::Dane(DaneEvent::TlsaRecordFetch) => Level::Info, + EventType::Dane(DaneEvent::TlsaRecordFetchError) => Level::Info, + EventType::Dane(DaneEvent::TlsaRecordNotFound) => Level::Info, + EventType::Dane(DaneEvent::TlsaRecordNotDnssecSigned) => Level::Info, + EventType::Dane(DaneEvent::TlsaRecordInvalid) => Level::Info, + EventType::Delivery(DeliveryEvent::AttemptStart) => Level::Info, + EventType::Delivery(DeliveryEvent::AttemptEnd) => Level::Info, + EventType::Delivery(DeliveryEvent::Completed) => Level::Info, + EventType::Delivery(DeliveryEvent::Failed) => Level::Info, + EventType::Delivery(DeliveryEvent::DomainDeliveryStart) => Level::Info, + EventType::Delivery(DeliveryEvent::MxLookupFailed) => Level::Info, + EventType::Delivery(DeliveryEvent::IpLookupFailed) => Level::Info, + EventType::Delivery(DeliveryEvent::NullMx) => Level::Info, + EventType::Delivery(DeliveryEvent::Connect) => Level::Info, + EventType::Delivery(DeliveryEvent::ConnectError) => Level::Info, + EventType::Delivery(DeliveryEvent::GreetingFailed) => Level::Info, + EventType::Delivery(DeliveryEvent::EhloRejected) => Level::Info, + EventType::Delivery(DeliveryEvent::AuthFailed) => Level::Info, + EventType::Delivery(DeliveryEvent::MailFromRejected) => Level::Info, + EventType::Delivery(DeliveryEvent::Delivered) => Level::Info, + EventType::Delivery(DeliveryEvent::RcptToRejected) => Level::Info, + EventType::Delivery(DeliveryEvent::RcptToFailed) => Level::Info, + EventType::Delivery(DeliveryEvent::MessageRejected) => Level::Info, + EventType::Delivery(DeliveryEvent::StartTls) => Level::Info, + EventType::Delivery(DeliveryEvent::StartTlsUnavailable) => Level::Info, + EventType::Delivery(DeliveryEvent::StartTlsError) => Level::Info, + EventType::Delivery(DeliveryEvent::StartTlsDisabled) => Level::Info, + EventType::Delivery(DeliveryEvent::ImplicitTlsError) => Level::Info, + EventType::Delivery(DeliveryEvent::DoubleBounce) => Level::Info, + EventType::Delivery(DeliveryEvent::DsnSuccess) => Level::Info, + EventType::Delivery(DeliveryEvent::DsnTempFail) => Level::Info, + EventType::Delivery(DeliveryEvent::DsnPermFail) => Level::Info, + EventType::Dns(DnsEvent::RecordCreated) => Level::Info, + EventType::Dns(DnsEvent::RecordPropagated) => Level::Info, + EventType::Housekeeper(HousekeeperEvent::Start) => Level::Info, + EventType::Housekeeper(HousekeeperEvent::Stop) => Level::Info, + EventType::IncomingReport(IncomingReportEvent::DmarcReport) => Level::Info, + EventType::IncomingReport(IncomingReportEvent::TlsReport) => Level::Info, + EventType::IncomingReport(IncomingReportEvent::AbuseReport) => Level::Info, + EventType::IncomingReport(IncomingReportEvent::AuthFailureReport) => Level::Info, + EventType::IncomingReport(IncomingReportEvent::FraudReport) => Level::Info, + EventType::IncomingReport(IncomingReportEvent::NotSpamReport) => Level::Info, + EventType::IncomingReport(IncomingReportEvent::VirusReport) => Level::Info, + EventType::IncomingReport(IncomingReportEvent::OtherReport) => Level::Info, + EventType::IncomingReport(IncomingReportEvent::MessageParseFailed) => Level::Info, + EventType::IncomingReport(IncomingReportEvent::DmarcParseFailed) => Level::Info, + EventType::IncomingReport(IncomingReportEvent::TlsRpcParseFailed) => Level::Info, + EventType::IncomingReport(IncomingReportEvent::ArfParseFailed) => Level::Info, + EventType::IncomingReport(IncomingReportEvent::DecompressError) => Level::Info, + EventType::Limit(LimitEvent::TenantQuota) => Level::Info, + EventType::MessageIngest(MessageIngestEvent::Ham) => Level::Info, + EventType::MessageIngest(MessageIngestEvent::Spam) => Level::Info, + EventType::MessageIngest(MessageIngestEvent::ImapAppend) => Level::Info, + EventType::MessageIngest(MessageIngestEvent::JmapAppend) => Level::Info, + EventType::MessageIngest(MessageIngestEvent::Duplicate) => Level::Info, + EventType::MessageIngest(MessageIngestEvent::FtsIndex) => Level::Info, + EventType::Milter(MilterEvent::ActionAccept) => Level::Info, + EventType::Milter(MilterEvent::ActionDiscard) => Level::Info, + EventType::Milter(MilterEvent::ActionReject) => Level::Info, + EventType::Milter(MilterEvent::ActionTempFail) => Level::Info, + EventType::Milter(MilterEvent::ActionReplyCode) => Level::Info, + EventType::Milter(MilterEvent::ActionConnectionFailure) => Level::Info, + EventType::Milter(MilterEvent::ActionShutdown) => Level::Info, + EventType::MtaHook(MtaHookEvent::ActionAccept) => Level::Info, + EventType::MtaHook(MtaHookEvent::ActionDiscard) => Level::Info, + EventType::MtaHook(MtaHookEvent::ActionReject) => Level::Info, + EventType::MtaHook(MtaHookEvent::ActionQuarantine) => Level::Info, + EventType::MtaSts(MtaStsEvent::Authorized) => Level::Info, + EventType::MtaSts(MtaStsEvent::NotAuthorized) => Level::Info, + EventType::MtaSts(MtaStsEvent::PolicyFetch) => Level::Info, + EventType::MtaSts(MtaStsEvent::PolicyNotFound) => Level::Info, + EventType::MtaSts(MtaStsEvent::PolicyFetchError) => Level::Info, + EventType::MtaSts(MtaStsEvent::InvalidPolicy) => Level::Info, + EventType::Network(NetworkEvent::ListenStart) => Level::Info, + EventType::Network(NetworkEvent::ListenStop) => Level::Info, + EventType::OutgoingReport(OutgoingReportEvent::SpfReport) => Level::Info, + EventType::OutgoingReport(OutgoingReportEvent::SpfRateLimited) => Level::Info, + EventType::OutgoingReport(OutgoingReportEvent::DkimReport) => Level::Info, + EventType::OutgoingReport(OutgoingReportEvent::DkimRateLimited) => Level::Info, + EventType::OutgoingReport(OutgoingReportEvent::DmarcReport) => Level::Info, + EventType::OutgoingReport(OutgoingReportEvent::DmarcRateLimited) => Level::Info, + EventType::OutgoingReport(OutgoingReportEvent::DmarcAggregateReport) => Level::Info, + EventType::OutgoingReport(OutgoingReportEvent::TlsAggregate) => Level::Info, + EventType::OutgoingReport(OutgoingReportEvent::HttpSubmission) => Level::Info, + EventType::OutgoingReport(OutgoingReportEvent::UnauthorizedReportingAddress) => { + Level::Info + } + EventType::OutgoingReport(OutgoingReportEvent::ReportingAddressValidationError) => { + Level::Info + } + EventType::OutgoingReport(OutgoingReportEvent::NotFound) => Level::Info, + EventType::OutgoingReport(OutgoingReportEvent::SubmissionError) => Level::Info, + EventType::OutgoingReport(OutgoingReportEvent::NoRecipientsFound) => Level::Info, + EventType::OutgoingReport(OutgoingReportEvent::Locked) => Level::Info, + EventType::Purge(PurgeEvent::Running) => Level::Info, + EventType::Purge(PurgeEvent::BlobCleanup) => Level::Info, + EventType::Queue(QueueEvent::QueueMessage) => Level::Info, + EventType::Queue(QueueEvent::QueueMessageAuthenticated) => Level::Info, + EventType::Queue(QueueEvent::QueueReport) => Level::Info, + EventType::Queue(QueueEvent::QueueDsn) => Level::Info, + EventType::Queue(QueueEvent::QueueAutogenerated) => Level::Info, + EventType::Queue(QueueEvent::Rescheduled) => Level::Info, + EventType::Queue(QueueEvent::RateLimitExceeded) => Level::Info, + EventType::Queue(QueueEvent::ConcurrencyLimitExceeded) => Level::Info, + EventType::Queue(QueueEvent::QuotaExceeded) => Level::Info, + EventType::Resource(ResourceEvent::DownloadExternal) => Level::Info, + EventType::Resource(ResourceEvent::WebadminUnpacked) => Level::Info, + EventType::Security(SecurityEvent::AuthenticationBan) => Level::Info, + EventType::Security(SecurityEvent::AbuseBan) => Level::Info, + EventType::Security(SecurityEvent::ScanBan) => Level::Info, + EventType::Security(SecurityEvent::LoiterBan) => Level::Info, + EventType::Security(SecurityEvent::IpBlocked) => Level::Info, + EventType::Security(SecurityEvent::Unauthorized) => Level::Info, + EventType::Server(ServerEvent::Startup) => Level::Info, + EventType::Server(ServerEvent::Shutdown) => Level::Info, + EventType::Server(ServerEvent::Licensing) => Level::Info, + EventType::Sieve(SieveEvent::SendMessage) => Level::Info, + EventType::Smtp(SmtpEvent::ConcurrencyLimitExceeded) => Level::Info, + EventType::Smtp(SmtpEvent::TransferLimitExceeded) => Level::Info, + EventType::Smtp(SmtpEvent::RateLimitExceeded) => Level::Info, + EventType::Smtp(SmtpEvent::TimeLimitExceeded) => Level::Info, + EventType::Smtp(SmtpEvent::MissingAuthDirectory) => Level::Info, + EventType::Smtp(SmtpEvent::MessageParseFailed) => Level::Info, + EventType::Smtp(SmtpEvent::MessageTooLarge) => Level::Info, + EventType::Smtp(SmtpEvent::LoopDetected) => Level::Info, + EventType::Smtp(SmtpEvent::DkimPass) => Level::Info, + EventType::Smtp(SmtpEvent::DkimFail) => Level::Info, + EventType::Smtp(SmtpEvent::ArcPass) => Level::Info, + EventType::Smtp(SmtpEvent::ArcFail) => Level::Info, + EventType::Smtp(SmtpEvent::SpfEhloPass) => Level::Info, + EventType::Smtp(SmtpEvent::SpfEhloFail) => Level::Info, + EventType::Smtp(SmtpEvent::SpfFromPass) => Level::Info, + EventType::Smtp(SmtpEvent::SpfFromFail) => Level::Info, + EventType::Smtp(SmtpEvent::DmarcPass) => Level::Info, + EventType::Smtp(SmtpEvent::DmarcFail) => Level::Info, + EventType::Smtp(SmtpEvent::IprevPass) => Level::Info, + EventType::Smtp(SmtpEvent::IprevFail) => Level::Info, + EventType::Smtp(SmtpEvent::TooManyMessages) => Level::Info, + EventType::Smtp(SmtpEvent::Ehlo) => Level::Info, + EventType::Smtp(SmtpEvent::InvalidEhlo) => Level::Info, + EventType::Smtp(SmtpEvent::MailFrom) => Level::Info, + EventType::Smtp(SmtpEvent::MailboxDoesNotExist) => Level::Info, + EventType::Smtp(SmtpEvent::RelayNotAllowed) => Level::Info, + EventType::Smtp(SmtpEvent::RcptTo) => Level::Info, + EventType::Smtp(SmtpEvent::RcptToGreylisted) => Level::Info, + EventType::Smtp(SmtpEvent::TooManyRecipients) => Level::Info, + EventType::Smtp(SmtpEvent::TooManyInvalidRcpt) => Level::Info, + EventType::Smtp(SmtpEvent::Vrfy) => Level::Info, + EventType::Smtp(SmtpEvent::VrfyNotFound) => Level::Info, + EventType::Smtp(SmtpEvent::VrfyDisabled) => Level::Info, + EventType::Smtp(SmtpEvent::Expn) => Level::Info, + EventType::Smtp(SmtpEvent::ExpnNotFound) => Level::Info, + EventType::Smtp(SmtpEvent::ExpnDisabled) => Level::Info, + EventType::Smtp(SmtpEvent::AuthNotAllowed) => Level::Info, + EventType::Smtp(SmtpEvent::AuthMechanismNotSupported) => Level::Info, + EventType::Smtp(SmtpEvent::RequestTooLarge) => Level::Info, + EventType::Spam(SpamEvent::TrainStarted) => Level::Info, + EventType::Spam(SpamEvent::TrainCompleted) => Level::Info, + EventType::Spam(SpamEvent::ModelLoaded) => Level::Info, + EventType::Spam(SpamEvent::ModelNotReady) => Level::Info, + EventType::Spam(SpamEvent::ModelNotFound) => Level::Info, + EventType::Tls(TlsEvent::Handshake) => Level::Info, + EventType::TlsRpt(TlsRptEvent::RecordFetch) => Level::Info, + EventType::TlsRpt(TlsRptEvent::RecordFetchError) => Level::Info, + EventType::TlsRpt(TlsRptEvent::RecordNotFound) => Level::Info, + EventType::Ai(AiEvent::LlmResponse) => Level::Trace, + EventType::Auth(AuthEvent::MissingTotp) => Level::Trace, + EventType::Cluster(ClusterEvent::MessageReceived) => Level::Trace, + EventType::Cluster(ClusterEvent::MessageSkipped) => Level::Trace, + EventType::Delivery(DeliveryEvent::RawInput) => Level::Trace, + EventType::Delivery(DeliveryEvent::RawOutput) => Level::Trace, + EventType::Eval(EvalEvent::Result) => Level::Trace, + EventType::Http(HttpEvent::RequestBody) => Level::Trace, + EventType::Http(HttpEvent::ResponseBody) => Level::Trace, + EventType::Imap(ImapEvent::RawInput) => Level::Trace, + EventType::Imap(ImapEvent::RawOutput) => Level::Trace, + EventType::ManageSieve(ManageSieveEvent::RawInput) => Level::Trace, + EventType::ManageSieve(ManageSieveEvent::RawOutput) => Level::Trace, + EventType::Milter(MilterEvent::Read) => Level::Trace, + EventType::Milter(MilterEvent::Write) => Level::Trace, + EventType::Network(NetworkEvent::ReadError) => Level::Trace, + EventType::Network(NetworkEvent::WriteError) => Level::Trace, + EventType::Network(NetworkEvent::FlushError) => Level::Trace, + EventType::Network(NetworkEvent::Closed) => Level::Trace, + EventType::Pop3(Pop3Event::RawInput) => Level::Trace, + EventType::Pop3(Pop3Event::RawOutput) => Level::Trace, + EventType::PushSubscription(PushSubscriptionEvent::Success) => Level::Trace, + EventType::Smtp(SmtpEvent::RawInput) => Level::Trace, + EventType::Smtp(SmtpEvent::RawOutput) => Level::Trace, + EventType::Store(StoreEvent::DataWrite) => Level::Trace, + EventType::Store(StoreEvent::DataIterate) => Level::Trace, + EventType::Store(StoreEvent::BlobRead) => Level::Trace, + EventType::Store(StoreEvent::BlobWrite) => Level::Trace, + EventType::Store(StoreEvent::BlobDelete) => Level::Trace, + EventType::Store(StoreEvent::SqlQuery) => Level::Trace, + EventType::Store(StoreEvent::LdapQuery) => Level::Trace, + EventType::Acme(AcmeEvent::AuthError) => Level::Warn, + EventType::Acme(AcmeEvent::AuthTooManyAttempts) => Level::Warn, + EventType::Acme(AcmeEvent::OrderInvalid) => Level::Warn, + EventType::Acme(AcmeEvent::TlsAlpnError) => Level::Warn, + EventType::Acme(AcmeEvent::TokenNotFound) => Level::Warn, + EventType::Ai(AiEvent::ApiError) => Level::Warn, + EventType::Arc(ArcEvent::SealerNotFound) => Level::Warn, + EventType::Auth(AuthEvent::TooManyAttempts) => Level::Warn, + EventType::Calendar(CalendarEvent::AlarmFailed) => Level::Warn, + EventType::Cluster(ClusterEvent::SubscriberDisconnected) => Level::Warn, + EventType::Config(ConfigEvent::ParseWarning) => Level::Warn, + EventType::Config(ConfigEvent::BuildWarning) => Level::Warn, + EventType::Delivery(DeliveryEvent::MissingOutboundHostname) => Level::Warn, + EventType::Delivery(DeliveryEvent::ConcurrencyLimitExceeded) => Level::Warn, + EventType::Delivery(DeliveryEvent::RateLimitExceeded) => Level::Warn, + EventType::Dkim(DkimEvent::SignerNotFound) => Level::Warn, + EventType::Dns(DnsEvent::RecordCreationFailed) => Level::Warn, + EventType::Dns(DnsEvent::RecordPropagationTimeout) => Level::Warn, + EventType::Eval(EvalEvent::DirectoryNotFound) => Level::Warn, + EventType::Http(HttpEvent::XForwardedMissing) => Level::Warn, + EventType::IncomingReport(IncomingReportEvent::DmarcReportWithWarnings) => Level::Warn, + EventType::IncomingReport(IncomingReportEvent::TlsReportWithWarnings) => Level::Warn, + EventType::Limit(LimitEvent::ConcurrentConnection) => Level::Warn, + EventType::Limit(LimitEvent::TooManyRequests) => Level::Warn, + EventType::Milter(MilterEvent::IoError) => Level::Warn, + EventType::Milter(MilterEvent::FrameTooLarge) => Level::Warn, + EventType::Milter(MilterEvent::FrameInvalid) => Level::Warn, + EventType::Milter(MilterEvent::UnexpectedResponse) => Level::Warn, + EventType::Milter(MilterEvent::Timeout) => Level::Warn, + EventType::Milter(MilterEvent::TlsInvalidName) => Level::Warn, + EventType::Milter(MilterEvent::Disconnected) => Level::Warn, + EventType::Milter(MilterEvent::ParseError) => Level::Warn, + EventType::MtaHook(MtaHookEvent::Error) => Level::Warn, + EventType::Network(NetworkEvent::ProxyError) => Level::Warn, + EventType::Queue(QueueEvent::BackPressure) => Level::Warn, + EventType::Sieve(SieveEvent::MessageTooLarge) => Level::Warn, + EventType::Sieve(SieveEvent::ScriptNotFound) => Level::Warn, + EventType::Sieve(SieveEvent::ListNotFound) => Level::Warn, + EventType::Sieve(SieveEvent::NotSupported) => Level::Warn, + EventType::Sieve(SieveEvent::QuotaExceeded) => Level::Warn, + EventType::Smtp(SmtpEvent::IdNotFound) => Level::Warn, + EventType::Smtp(SmtpEvent::MissingLocalHostname) => Level::Warn, + EventType::Spam(SpamEvent::TrainSampleNotFound) => Level::Warn, + EventType::Store(StoreEvent::HttpStoreError) => Level::Warn, + EventType::Store(StoreEvent::BlobMissingMarker) => Level::Warn, + EventType::TaskQueue(TaskQueueEvent::TaskFailed) => Level::Warn, + EventType::Telemetry(TelemetryEvent::Alert) => Level::Warn, + EventType::Telemetry(TelemetryEvent::LogError) => Level::Warn, + EventType::Telemetry(TelemetryEvent::WebhookError) => Level::Warn, + EventType::Telemetry(TelemetryEvent::OtelExporterError) => Level::Warn, + EventType::Telemetry(TelemetryEvent::OtelMetricsExporterError) => Level::Warn, + EventType::Telemetry(TelemetryEvent::PrometheusExporterError) => Level::Warn, + EventType::Telemetry(TelemetryEvent::JournalError) => Level::Warn, + EventType::Tls(TlsEvent::NoCertificatesAvailable) => Level::Warn, + EventType::Tls(TlsEvent::MultipleCertificatesAvailable) => Level::Warn, + _ => Level::Debug, + } + } + + pub fn description(&self) -> &'static str { + match self { + EventType::Acme(AcmeEvent::AuthStart) => "ACME authentication started", + EventType::Acme(AcmeEvent::AuthPending) => "ACME authentication pending", + EventType::Acme(AcmeEvent::AuthValid) => "ACME authentication valid", + EventType::Acme(AcmeEvent::AuthCompleted) => "ACME authentication completed", + EventType::Acme(AcmeEvent::AuthError) => "ACME authentication error", + EventType::Acme(AcmeEvent::AuthTooManyAttempts) => { + "Too many ACME authentication attempts" + } + EventType::Acme(AcmeEvent::ProcessCert) => "Processing ACME certificate", + EventType::Acme(AcmeEvent::OrderStart) => "ACME order started", + EventType::Acme(AcmeEvent::OrderProcessing) => "ACME order processing", + EventType::Acme(AcmeEvent::OrderCompleted) => "ACME order completed", + EventType::Acme(AcmeEvent::OrderReady) => "ACME order ready", + EventType::Acme(AcmeEvent::OrderValid) => "ACME order valid", + EventType::Acme(AcmeEvent::OrderInvalid) => "ACME order invalid", + EventType::Acme(AcmeEvent::RenewBackoff) => "ACME renew backoff", + EventType::Acme(AcmeEvent::ClientSuppliedSni) => "ACME client supplied SNI", + EventType::Acme(AcmeEvent::ClientMissingSni) => "ACME client missing SNI", + EventType::Acme(AcmeEvent::TlsAlpnReceived) => "ACME TLS ALPN received", + EventType::Acme(AcmeEvent::TlsAlpnError) => "ACME TLS ALPN error", + EventType::Acme(AcmeEvent::TokenNotFound) => "ACME token not found", + EventType::Acme(AcmeEvent::Error) => "ACME error", + EventType::Ai(AiEvent::LlmResponse) => "LLM response", + EventType::Ai(AiEvent::ApiError) => "AI API error", + EventType::Arc(ArcEvent::ChainTooLong) => "ARC chain too long", + EventType::Arc(ArcEvent::InvalidInstance) => "Invalid ARC instance", + EventType::Arc(ArcEvent::InvalidCv) => "Invalid ARC CV", + EventType::Arc(ArcEvent::HasHeaderTag) => "ARC has header tag", + EventType::Arc(ArcEvent::BrokenChain) => "Broken ARC chain", + EventType::Arc(ArcEvent::SealerNotFound) => "ARC sealer not found", + EventType::Auth(AuthEvent::Success) => "Authentication successful", + EventType::Auth(AuthEvent::Failed) => "Authentication failed", + EventType::Auth(AuthEvent::TokenExpired) => "OAuth token expired", + EventType::Auth(AuthEvent::MissingTotp) => "Missing TOTP for authentication", + EventType::Auth(AuthEvent::TooManyAttempts) => "Too many authentication attempts", + EventType::Auth(AuthEvent::ClientRegistration) => "OAuth Client registration", + EventType::Auth(AuthEvent::Error) => "Authentication error", + EventType::Calendar(CalendarEvent::RuleExpansionError) => { + "Calendar rule expansion error" + } + EventType::Calendar(CalendarEvent::AlarmSent) => "Calendar alarm sent", + EventType::Calendar(CalendarEvent::AlarmSkipped) => "Calendar alarm skipped", + EventType::Calendar(CalendarEvent::AlarmRecipientOverride) => { + "Calendar alarm recipient overriden" + } + EventType::Calendar(CalendarEvent::AlarmFailed) => "Calendar alarm could not be sent", + EventType::Calendar(CalendarEvent::ItipMessageSent) => "Calendar iTIP message sent", + EventType::Calendar(CalendarEvent::ItipMessageReceived) => { + "Calendar iTIP message received" + } + EventType::Calendar(CalendarEvent::ItipMessageError) => "iTIP message error", + EventType::Cluster(ClusterEvent::SubscriberStart) => "PubSub subscriber started", + EventType::Cluster(ClusterEvent::SubscriberStop) => "PubSub subscriber stopped", + EventType::Cluster(ClusterEvent::SubscriberError) => "PubSub subscriber error", + EventType::Cluster(ClusterEvent::SubscriberDisconnected) => { + "PubSub subscriber disconnected" + } + EventType::Cluster(ClusterEvent::PublisherStart) => "PubSub publisher started", + EventType::Cluster(ClusterEvent::PublisherStop) => "PubSub publisher stopped", + EventType::Cluster(ClusterEvent::PublisherError) => "PubSub publisher error", + EventType::Cluster(ClusterEvent::MessageReceived) => "PubSub message received", + EventType::Cluster(ClusterEvent::MessageSkipped) => "PubSub message skipped", + EventType::Cluster(ClusterEvent::MessageInvalid) => "Invalid PubSub message", + EventType::Config(ConfigEvent::ParseError) => "Configuration parse error", + EventType::Config(ConfigEvent::BuildError) => "Configuration build error", + EventType::Config(ConfigEvent::MacroError) => "Configuration macro error", + EventType::Config(ConfigEvent::WriteError) => "Configuration write error", + EventType::Config(ConfigEvent::FetchError) => "Configuration fetch error", + EventType::Config(ConfigEvent::DefaultApplied) => "Default configuration applied", + EventType::Config(ConfigEvent::MissingSetting) => "Missing configuration setting", + EventType::Config(ConfigEvent::UnusedSetting) => "Unused configuration setting", + EventType::Config(ConfigEvent::ParseWarning) => "Configuration parse warning", + EventType::Config(ConfigEvent::BuildWarning) => "Configuration build warning", + EventType::Config(ConfigEvent::ImportExternal) => "Importing external configuration", + EventType::Config(ConfigEvent::AlreadyUpToDate) => "Configuration already up to date", + EventType::Dane(DaneEvent::AuthenticationSuccess) => "DANE authentication successful", + EventType::Dane(DaneEvent::AuthenticationFailure) => "DANE authentication failed", + EventType::Dane(DaneEvent::NoCertificatesFound) => "No certificates found for DANE", + EventType::Dane(DaneEvent::CertificateParseError) => { + "Error parsing certificate for DANE" + } + EventType::Dane(DaneEvent::TlsaRecordMatch) => "TLSA record match found", + EventType::Dane(DaneEvent::TlsaRecordFetch) => "Fetching TLSA record", + EventType::Dane(DaneEvent::TlsaRecordFetchError) => "Error fetching TLSA record", + EventType::Dane(DaneEvent::TlsaRecordNotFound) => "TLSA record not found", + EventType::Dane(DaneEvent::TlsaRecordNotDnssecSigned) => { + "TLSA record not DNSSEC signed" + } + EventType::Dane(DaneEvent::TlsaRecordInvalid) => "Invalid TLSA record", + EventType::Delivery(DeliveryEvent::AttemptStart) => "Delivery attempt started", + EventType::Delivery(DeliveryEvent::AttemptEnd) => "Delivery attempt ended", + EventType::Delivery(DeliveryEvent::Completed) => "Delivery completed", + EventType::Delivery(DeliveryEvent::Failed) => "Delivery failed", + EventType::Delivery(DeliveryEvent::DomainDeliveryStart) => { + "New delivery attempt for domain" + } + EventType::Delivery(DeliveryEvent::MxLookup) => "MX record lookup", + EventType::Delivery(DeliveryEvent::MxLookupFailed) => "MX record lookup failed", + EventType::Delivery(DeliveryEvent::IpLookup) => "IP address lookup", + EventType::Delivery(DeliveryEvent::IpLookupFailed) => "IP address lookup failed", + EventType::Delivery(DeliveryEvent::NullMx) => "Null MX record found", + EventType::Delivery(DeliveryEvent::Connect) => "Connecting to remote server", + EventType::Delivery(DeliveryEvent::ConnectError) => "Connection error", + EventType::Delivery(DeliveryEvent::MissingOutboundHostname) => { + "Missing outbound hostname in configuration" + } + EventType::Delivery(DeliveryEvent::GreetingFailed) => "SMTP greeting failed", + EventType::Delivery(DeliveryEvent::Ehlo) => "SMTP EHLO command", + EventType::Delivery(DeliveryEvent::EhloRejected) => "SMTP EHLO rejected", + EventType::Delivery(DeliveryEvent::Auth) => "SMTP authentication", + EventType::Delivery(DeliveryEvent::AuthFailed) => "SMTP authentication failed", + EventType::Delivery(DeliveryEvent::MailFrom) => "SMTP MAIL FROM command", + EventType::Delivery(DeliveryEvent::MailFromRejected) => "SMTP MAIL FROM rejected", + EventType::Delivery(DeliveryEvent::Delivered) => "Message delivered", + EventType::Delivery(DeliveryEvent::RcptTo) => "SMTP RCPT TO command", + EventType::Delivery(DeliveryEvent::RcptToRejected) => "SMTP RCPT TO rejected", + EventType::Delivery(DeliveryEvent::RcptToFailed) => "SMTP RCPT TO failed", + EventType::Delivery(DeliveryEvent::MessageRejected) => { + "Message rejected by remote server" + } + EventType::Delivery(DeliveryEvent::StartTls) => "SMTP STARTTLS command", + EventType::Delivery(DeliveryEvent::StartTlsUnavailable) => "STARTTLS unavailable", + EventType::Delivery(DeliveryEvent::StartTlsError) => "STARTTLS error", + EventType::Delivery(DeliveryEvent::StartTlsDisabled) => "STARTTLS disabled", + EventType::Delivery(DeliveryEvent::ImplicitTlsError) => "Implicit TLS error", + EventType::Delivery(DeliveryEvent::ConcurrencyLimitExceeded) => { + "Concurrency limit exceeded" + } + EventType::Delivery(DeliveryEvent::RateLimitExceeded) => "Rate limit exceeded", + EventType::Delivery(DeliveryEvent::DoubleBounce) => { + "Discarding message after double bounce" + } + EventType::Delivery(DeliveryEvent::DsnSuccess) => "DSN success notification", + EventType::Delivery(DeliveryEvent::DsnTempFail) => "DSN temporary failure notification", + EventType::Delivery(DeliveryEvent::DsnPermFail) => "DSN permanent failure notification", + EventType::Delivery(DeliveryEvent::RawInput) => "Raw SMTP input received", + EventType::Delivery(DeliveryEvent::RawOutput) => "Raw SMTP output sent", + EventType::Dkim(DkimEvent::Pass) => "DKIM verification passed", + EventType::Dkim(DkimEvent::Neutral) => "DKIM verification neutral", + EventType::Dkim(DkimEvent::Fail) => "DKIM verification failed", + EventType::Dkim(DkimEvent::PermError) => "DKIM permanent error", + EventType::Dkim(DkimEvent::TempError) => "DKIM temporary error", + EventType::Dkim(DkimEvent::None) => "No DKIM signature", + EventType::Dkim(DkimEvent::UnsupportedVersion) => "Unsupported DKIM version", + EventType::Dkim(DkimEvent::UnsupportedAlgorithm) => "Unsupported DKIM algorithm", + EventType::Dkim(DkimEvent::UnsupportedCanonicalization) => { + "Unsupported DKIM canonicalization" + } + EventType::Dkim(DkimEvent::UnsupportedKeyType) => "Unsupported DKIM key type", + EventType::Dkim(DkimEvent::FailedBodyHashMatch) => "DKIM body hash mismatch", + EventType::Dkim(DkimEvent::FailedVerification) => "DKIM verification failed", + EventType::Dkim(DkimEvent::FailedAuidMatch) => "DKIM AUID mismatch", + EventType::Dkim(DkimEvent::RevokedPublicKey) => "DKIM public key revoked", + EventType::Dkim(DkimEvent::IncompatibleAlgorithms) => "Incompatible DKIM algorithms", + EventType::Dkim(DkimEvent::SignatureExpired) => "DKIM signature expired", + EventType::Dkim(DkimEvent::SignatureLength) => "DKIM signature length issue", + EventType::Dkim(DkimEvent::SignerNotFound) => "DKIM signer not found", + EventType::Dkim(DkimEvent::BuildError) => "DKIM build error", + EventType::Dmarc(DmarcEvent::Pass) => "DMARC check passed", + EventType::Dmarc(DmarcEvent::Fail) => "DMARC check failed", + EventType::Dmarc(DmarcEvent::PermError) => "DMARC permanent error", + EventType::Dmarc(DmarcEvent::TempError) => "DMARC temporary error", + EventType::Dmarc(DmarcEvent::None) => "No DMARC record", + EventType::Dns(DnsEvent::RecordCreated) => "DNS record created", + EventType::Dns(DnsEvent::RecordCreationFailed) => "DNS record creation failed", + EventType::Dns(DnsEvent::RecordDeletionFailed) => "DNS record deletion failed", + EventType::Dns(DnsEvent::RecordNotPropagated) => "DNS record not propagated", + EventType::Dns(DnsEvent::RecordLookupFailed) => "DNS record lookup failed", + EventType::Dns(DnsEvent::RecordPropagated) => "DNS record propagated", + EventType::Dns(DnsEvent::RecordPropagationTimeout) => "DNS record propagation timeout", + EventType::Dns(DnsEvent::BuildError) => "DNS updater build error", + EventType::Eval(EvalEvent::Result) => "Expression evaluation result", + EventType::Eval(EvalEvent::Error) => "Expression evaluation error", + EventType::Eval(EvalEvent::DirectoryNotFound) => { + "Directory not found while evaluating expression" + } + EventType::Eval(EvalEvent::StoreNotFound) => { + "Store not found while evaluating expression" + } + EventType::Housekeeper(HousekeeperEvent::Start) => "Housekeeper process started", + EventType::Housekeeper(HousekeeperEvent::Stop) => "Housekeeper process stopped", + EventType::Housekeeper(HousekeeperEvent::Schedule) => "Housekeeper task scheduled", + EventType::Housekeeper(HousekeeperEvent::Run) => "Housekeeper task run", + EventType::Http(HttpEvent::ConnectionStart) => "HTTP connection started", + EventType::Http(HttpEvent::ConnectionEnd) => "HTTP connection ended", + EventType::Http(HttpEvent::Error) => "HTTP error occurred", + EventType::Http(HttpEvent::RequestUrl) => "HTTP request URL", + EventType::Http(HttpEvent::RequestBody) => "HTTP request body", + EventType::Http(HttpEvent::ResponseBody) => "HTTP response body", + EventType::Http(HttpEvent::XForwardedMissing) => "X-Forwarded-For header is missing", + EventType::Imap(ImapEvent::ConnectionStart) => "IMAP connection started", + EventType::Imap(ImapEvent::ConnectionEnd) => "IMAP connection ended", + EventType::Imap(ImapEvent::GetAcl) => "IMAP GET ACL command", + EventType::Imap(ImapEvent::SetAcl) => "IMAP SET ACL command", + EventType::Imap(ImapEvent::MyRights) => "IMAP MYRIGHTS command", + EventType::Imap(ImapEvent::ListRights) => "IMAP LISTRIGHTS command", + EventType::Imap(ImapEvent::Append) => "IMAP APPEND command", + EventType::Imap(ImapEvent::Capabilities) => "IMAP CAPABILITIES command", + EventType::Imap(ImapEvent::Id) => "IMAP ID command", + EventType::Imap(ImapEvent::Close) => "IMAP CLOSE command", + EventType::Imap(ImapEvent::Copy) => "IMAP COPY command", + EventType::Imap(ImapEvent::Move) => "IMAP MOVE command", + EventType::Imap(ImapEvent::CreateMailbox) => "IMAP CREATE mailbox command", + EventType::Imap(ImapEvent::DeleteMailbox) => "IMAP DELETE mailbox command", + EventType::Imap(ImapEvent::RenameMailbox) => "IMAP RENAME mailbox command", + EventType::Imap(ImapEvent::Enable) => "IMAP ENABLE command", + EventType::Imap(ImapEvent::Expunge) => "IMAP EXPUNGE command", + EventType::Imap(ImapEvent::Fetch) => "IMAP FETCH command", + EventType::Imap(ImapEvent::IdleStart) => "IMAP IDLE start", + EventType::Imap(ImapEvent::IdleStop) => "IMAP IDLE stop", + EventType::Imap(ImapEvent::List) => "IMAP LIST command", + EventType::Imap(ImapEvent::Lsub) => "IMAP LSUB command", + EventType::Imap(ImapEvent::Logout) => "IMAP LOGOUT command", + EventType::Imap(ImapEvent::Namespace) => "IMAP NAMESPACE command", + EventType::Imap(ImapEvent::Noop) => "IMAP NOOP command", + EventType::Imap(ImapEvent::Search) => "IMAP SEARCH command", + EventType::Imap(ImapEvent::Sort) => "IMAP SORT command", + EventType::Imap(ImapEvent::Select) => "IMAP SELECT command", + EventType::Imap(ImapEvent::Status) => "IMAP STATUS command", + EventType::Imap(ImapEvent::Store) => "IMAP STORE command", + EventType::Imap(ImapEvent::Subscribe) => "IMAP SUBSCRIBE command", + EventType::Imap(ImapEvent::Unsubscribe) => "IMAP UNSUBSCRIBE command", + EventType::Imap(ImapEvent::Thread) => "IMAP THREAD command", + EventType::Imap(ImapEvent::GetQuota) => "IMAP GETQUOTA command", + EventType::Imap(ImapEvent::Error) => "IMAP error occurred", + EventType::Imap(ImapEvent::RawInput) => "Raw IMAP input received", + EventType::Imap(ImapEvent::RawOutput) => "Raw IMAP output sent", + EventType::IncomingReport(IncomingReportEvent::DmarcReport) => "DMARC report received", + EventType::IncomingReport(IncomingReportEvent::DmarcReportWithWarnings) => { + "DMARC report received with warnings" + } + EventType::IncomingReport(IncomingReportEvent::TlsReport) => "TLS report received", + EventType::IncomingReport(IncomingReportEvent::TlsReportWithWarnings) => { + "TLS report received with warnings" + } + EventType::IncomingReport(IncomingReportEvent::AbuseReport) => "Abuse report received", + EventType::IncomingReport(IncomingReportEvent::AuthFailureReport) => { + "Authentication failure report received" + } + EventType::IncomingReport(IncomingReportEvent::FraudReport) => "Fraud report received", + EventType::IncomingReport(IncomingReportEvent::NotSpamReport) => { + "Not spam report received" + } + EventType::IncomingReport(IncomingReportEvent::VirusReport) => "Virus report received", + EventType::IncomingReport(IncomingReportEvent::OtherReport) => { + "Other type of report received" + } + EventType::IncomingReport(IncomingReportEvent::MessageParseFailed) => { + "Failed to parse incoming report message" + } + EventType::IncomingReport(IncomingReportEvent::DmarcParseFailed) => { + "Failed to parse DMARC report" + } + EventType::IncomingReport(IncomingReportEvent::TlsRpcParseFailed) => { + "Failed to parse TLS RPC report" + } + EventType::IncomingReport(IncomingReportEvent::ArfParseFailed) => { + "Failed to parse ARF report" + } + EventType::IncomingReport(IncomingReportEvent::DecompressError) => { + "Error decompressing report" + } + EventType::Iprev(IprevEvent::Pass) => "IPREV check passed", + EventType::Iprev(IprevEvent::Fail) => "IPREV check failed", + EventType::Iprev(IprevEvent::PermError) => "IPREV permanent error", + EventType::Iprev(IprevEvent::TempError) => "IPREV temporary error", + EventType::Iprev(IprevEvent::None) => "No IPREV record", + EventType::Jmap(JmapEvent::MethodCall) => "JMAP method call", + EventType::Jmap(JmapEvent::InvalidArguments) => "Invalid JMAP arguments", + EventType::Jmap(JmapEvent::RequestTooLarge) => "JMAP request too large", + EventType::Jmap(JmapEvent::StateMismatch) => "JMAP state mismatch", + EventType::Jmap(JmapEvent::AnchorNotFound) => "JMAP anchor not found", + EventType::Jmap(JmapEvent::UnsupportedFilter) => "Unsupported JMAP filter", + EventType::Jmap(JmapEvent::UnsupportedSort) => "Unsupported JMAP sort", + EventType::Jmap(JmapEvent::UnknownMethod) => "Unknown JMAP method", + EventType::Jmap(JmapEvent::InvalidResultReference) => "Invalid JMAP result reference", + EventType::Jmap(JmapEvent::Forbidden) => "JMAP operation forbidden", + EventType::Jmap(JmapEvent::AccountNotFound) => "JMAP account not found", + EventType::Jmap(JmapEvent::AccountNotSupportedByMethod) => { + "JMAP account not supported by method" + } + EventType::Jmap(JmapEvent::AccountReadOnly) => "JMAP account is read-only", + EventType::Jmap(JmapEvent::NotFound) => "JMAP resource not found", + EventType::Jmap(JmapEvent::CannotCalculateChanges) => "Cannot calculate JMAP changes", + EventType::Jmap(JmapEvent::UnknownDataType) => "Unknown JMAP data type", + EventType::Jmap(JmapEvent::UnknownCapability) => "Unknown JMAP capability", + EventType::Jmap(JmapEvent::NotJson) => "JMAP request is not JSON", + EventType::Jmap(JmapEvent::NotRequest) => "JMAP input is not a request", + EventType::Jmap(JmapEvent::WebsocketStart) => "JMAP WebSocket connection started", + EventType::Jmap(JmapEvent::WebsocketStop) => "JMAP WebSocket connection stopped", + EventType::Jmap(JmapEvent::WebsocketError) => "JMAP WebSocket error", + EventType::Limit(LimitEvent::SizeRequest) => "Request size limit reached", + EventType::Limit(LimitEvent::SizeUpload) => "Upload size limit reached", + EventType::Limit(LimitEvent::CallsIn) => "Incoming calls limit reached", + EventType::Limit(LimitEvent::ConcurrentRequest) => "Concurrent request limit reached", + EventType::Limit(LimitEvent::ConcurrentUpload) => "Concurrent upload limit reached", + EventType::Limit(LimitEvent::ConcurrentConnection) => { + "Concurrent connection limit reached" + } + EventType::Limit(LimitEvent::Quota) => "Quota limit reached", + EventType::Limit(LimitEvent::BlobQuota) => "Blob quota limit reached", + EventType::Limit(LimitEvent::TenantQuota) => "Tenant quota limit reached", + EventType::Limit(LimitEvent::TooManyRequests) => "Too many requests", + EventType::MailAuth(MailAuthEvent::ParseError) => "Mail authentication parse error", + EventType::MailAuth(MailAuthEvent::MissingParameters) => { + "Missing mail authentication parameters" + } + EventType::MailAuth(MailAuthEvent::NoHeadersFound) => "No headers found in message", + EventType::MailAuth(MailAuthEvent::Crypto) => "Crypto error during mail authentication", + EventType::MailAuth(MailAuthEvent::Io) => "I/O error during mail authentication", + EventType::MailAuth(MailAuthEvent::Base64) => "Base64 error during mail authentication", + EventType::MailAuth(MailAuthEvent::DnsError) => "DNS error", + EventType::MailAuth(MailAuthEvent::DnsRecordNotFound) => "DNS record not found", + EventType::MailAuth(MailAuthEvent::DnsInvalidRecordType) => "Invalid DNS record type", + EventType::MailAuth(MailAuthEvent::PolicyNotAligned) => "Policy not aligned", + EventType::Manage(ManageEvent::MissingParameter) => "Missing parameter", + EventType::Manage(ManageEvent::AlreadyExists) => "Record already exists", + EventType::Manage(ManageEvent::AssertFailed) => "Assertion failed", + EventType::Manage(ManageEvent::NotFound) => "Resource not found", + EventType::Manage(ManageEvent::NotSupported) => "Management operation not supported", + EventType::Manage(ManageEvent::Error) => "Management error", + EventType::ManageSieve(ManageSieveEvent::ConnectionStart) => { + "ManageSieve connection started" + } + EventType::ManageSieve(ManageSieveEvent::ConnectionEnd) => { + "ManageSieve connection ended" + } + EventType::ManageSieve(ManageSieveEvent::CreateScript) => { + "ManageSieve CREATE script command" + } + EventType::ManageSieve(ManageSieveEvent::UpdateScript) => { + "ManageSieve UPDATE script command" + } + EventType::ManageSieve(ManageSieveEvent::GetScript) => "ManageSieve GET script command", + EventType::ManageSieve(ManageSieveEvent::DeleteScript) => { + "ManageSieve DELETE script command" + } + EventType::ManageSieve(ManageSieveEvent::RenameScript) => { + "ManageSieve RENAME script command" + } + EventType::ManageSieve(ManageSieveEvent::CheckScript) => { + "ManageSieve CHECK script command" + } + EventType::ManageSieve(ManageSieveEvent::HaveSpace) => "ManageSieve HAVESPACE command", + EventType::ManageSieve(ManageSieveEvent::ListScripts) => { + "ManageSieve LIST scripts command" + } + EventType::ManageSieve(ManageSieveEvent::SetActive) => "ManageSieve SET ACTIVE command", + EventType::ManageSieve(ManageSieveEvent::Capabilities) => { + "ManageSieve CAPABILITIES command" + } + EventType::ManageSieve(ManageSieveEvent::StartTls) => "ManageSieve STARTTLS command", + EventType::ManageSieve(ManageSieveEvent::Unauthenticate) => { + "ManageSieve UNAUTHENTICATE command" + } + EventType::ManageSieve(ManageSieveEvent::Logout) => "ManageSieve LOGOUT command", + EventType::ManageSieve(ManageSieveEvent::Noop) => "ManageSieve NOOP command", + EventType::ManageSieve(ManageSieveEvent::Error) => "ManageSieve error occurred", + EventType::ManageSieve(ManageSieveEvent::RawInput) => "Raw ManageSieve input received", + EventType::ManageSieve(ManageSieveEvent::RawOutput) => "Raw ManageSieve output sent", + EventType::MessageIngest(MessageIngestEvent::Ham) => "Message ingested", + EventType::MessageIngest(MessageIngestEvent::Spam) => "Possible spam message ingested", + EventType::MessageIngest(MessageIngestEvent::ImapAppend) => "Message appended via IMAP", + EventType::MessageIngest(MessageIngestEvent::JmapAppend) => "Message appended via JMAP", + EventType::MessageIngest(MessageIngestEvent::Duplicate) => "Skipping duplicate message", + EventType::MessageIngest(MessageIngestEvent::Error) => "Message ingestion error", + EventType::MessageIngest(MessageIngestEvent::FtsIndex) => { + "Full-text search index updated" + } + EventType::Milter(MilterEvent::Read) => "Reading from Milter", + EventType::Milter(MilterEvent::Write) => "Writing to Milter", + EventType::Milter(MilterEvent::ActionAccept) => "Milter action: Accept", + EventType::Milter(MilterEvent::ActionDiscard) => "Milter action: Discard", + EventType::Milter(MilterEvent::ActionReject) => "Milter action: Reject", + EventType::Milter(MilterEvent::ActionTempFail) => "Milter action: Temporary failure", + EventType::Milter(MilterEvent::ActionReplyCode) => "Milter action: Reply code", + EventType::Milter(MilterEvent::ActionConnectionFailure) => { + "Milter action: Connection failure" + } + EventType::Milter(MilterEvent::ActionShutdown) => "Milter action: Shutdown", + EventType::Milter(MilterEvent::IoError) => "Milter I/O error", + EventType::Milter(MilterEvent::FrameTooLarge) => "Milter frame too large", + EventType::Milter(MilterEvent::FrameInvalid) => "Invalid Milter frame", + EventType::Milter(MilterEvent::UnexpectedResponse) => "Unexpected Milter response", + EventType::Milter(MilterEvent::Timeout) => "Milter timeout", + EventType::Milter(MilterEvent::TlsInvalidName) => "Invalid TLS name for Milter", + EventType::Milter(MilterEvent::Disconnected) => "Milter disconnected", + EventType::Milter(MilterEvent::ParseError) => "Milter parse error", + EventType::MtaHook(MtaHookEvent::ActionAccept) => "MTA hook action: Accept", + EventType::MtaHook(MtaHookEvent::ActionDiscard) => "MTA hook action: Discard", + EventType::MtaHook(MtaHookEvent::ActionReject) => "MTA hook action: Reject", + EventType::MtaHook(MtaHookEvent::ActionQuarantine) => "MTA hook action: Quarantine", + EventType::MtaHook(MtaHookEvent::Error) => "MTA hook error", + EventType::MtaSts(MtaStsEvent::Authorized) => "Host authorized by MTA-STS policy", + EventType::MtaSts(MtaStsEvent::NotAuthorized) => { + "Host not authorized by MTA-STS policy" + } + EventType::MtaSts(MtaStsEvent::PolicyFetch) => "Fetched MTA-STS policy", + EventType::MtaSts(MtaStsEvent::PolicyNotFound) => "MTA-STS policy not found", + EventType::MtaSts(MtaStsEvent::PolicyFetchError) => "Error fetching MTA-STS policy", + EventType::MtaSts(MtaStsEvent::InvalidPolicy) => "Invalid MTA-STS policy", + EventType::Network(NetworkEvent::ListenStart) => "Network listener started", + EventType::Network(NetworkEvent::ListenStop) => "Network listener stopped", + EventType::Network(NetworkEvent::ListenError) => "Network listener error", + EventType::Network(NetworkEvent::BindError) => "Network bind error", + EventType::Network(NetworkEvent::ReadError) => "Network read error", + EventType::Network(NetworkEvent::WriteError) => "Network write error", + EventType::Network(NetworkEvent::FlushError) => "Network flush error", + EventType::Network(NetworkEvent::AcceptError) => "Network accept error", + EventType::Network(NetworkEvent::SplitError) => "Network split error", + EventType::Network(NetworkEvent::Timeout) => "Network timeout", + EventType::Network(NetworkEvent::Closed) => "Network connection closed", + EventType::Network(NetworkEvent::ProxyError) => "Proxy protocol error", + EventType::Network(NetworkEvent::SetOptError) => "Network set option error", + EventType::OutgoingReport(OutgoingReportEvent::SpfReport) => "SPF report sent", + EventType::OutgoingReport(OutgoingReportEvent::SpfRateLimited) => { + "SPF report rate limited" + } + EventType::OutgoingReport(OutgoingReportEvent::DkimReport) => "DKIM report sent", + EventType::OutgoingReport(OutgoingReportEvent::DkimRateLimited) => { + "DKIM report rate limited" + } + EventType::OutgoingReport(OutgoingReportEvent::DmarcReport) => "DMARC report sent", + EventType::OutgoingReport(OutgoingReportEvent::DmarcRateLimited) => { + "DMARC report rate limited" + } + EventType::OutgoingReport(OutgoingReportEvent::DmarcAggregateReport) => { + "DMARC aggregate is being prepared" + } + EventType::OutgoingReport(OutgoingReportEvent::TlsAggregate) => { + "TLS aggregate report is being prepared" + } + EventType::OutgoingReport(OutgoingReportEvent::HttpSubmission) => { + "Report submitted via HTTP" + } + EventType::OutgoingReport(OutgoingReportEvent::UnauthorizedReportingAddress) => { + "Unauthorized reporting address" + } + EventType::OutgoingReport(OutgoingReportEvent::ReportingAddressValidationError) => { + "Error validating reporting address" + } + EventType::OutgoingReport(OutgoingReportEvent::NotFound) => "Report not found", + EventType::OutgoingReport(OutgoingReportEvent::SubmissionError) => { + "Error submitting report" + } + EventType::OutgoingReport(OutgoingReportEvent::NoRecipientsFound) => { + "No recipients found for report" + } + EventType::OutgoingReport(OutgoingReportEvent::Locked) => { + "Report is locked by another process" + } + EventType::Pop3(Pop3Event::ConnectionStart) => "POP3 connection started", + EventType::Pop3(Pop3Event::ConnectionEnd) => "POP3 connection ended", + EventType::Pop3(Pop3Event::Delete) => "POP3 DELETE command", + EventType::Pop3(Pop3Event::Reset) => "POP3 RESET command", + EventType::Pop3(Pop3Event::Quit) => "POP3 QUIT command", + EventType::Pop3(Pop3Event::Fetch) => "POP3 FETCH command", + EventType::Pop3(Pop3Event::List) => "POP3 LIST command", + EventType::Pop3(Pop3Event::ListMessage) => "POP3 LIST specific message command", + EventType::Pop3(Pop3Event::Uidl) => "POP3 UIDL command", + EventType::Pop3(Pop3Event::UidlMessage) => "POP3 UIDL specific message command", + EventType::Pop3(Pop3Event::Stat) => "POP3 STAT command", + EventType::Pop3(Pop3Event::Noop) => "POP3 NOOP command", + EventType::Pop3(Pop3Event::Capabilities) => "POP3 CAPABILITIES command", + EventType::Pop3(Pop3Event::StartTls) => "POP3 STARTTLS command", + EventType::Pop3(Pop3Event::Utf8) => "POP3 UTF8 command", + EventType::Pop3(Pop3Event::Error) => "POP3 error occurred", + EventType::Pop3(Pop3Event::RawInput) => "Raw POP3 input received", + EventType::Pop3(Pop3Event::RawOutput) => "Raw POP3 output sent", + EventType::Purge(PurgeEvent::Started) => "Purge started", + EventType::Purge(PurgeEvent::Finished) => "Purge finished", + EventType::Purge(PurgeEvent::Running) => "Purge running", + EventType::Purge(PurgeEvent::Error) => "Purge error", + EventType::Purge(PurgeEvent::InProgress) => "Active purge in progress", + EventType::Purge(PurgeEvent::AutoExpunge) => "Auto-expunge executed", + EventType::Purge(PurgeEvent::BlobCleanup) => "Blob storage cleanup completed", + EventType::PushSubscription(PushSubscriptionEvent::Success) => { + "Push subscription successful" + } + EventType::PushSubscription(PushSubscriptionEvent::Error) => "Push subscription error", + EventType::PushSubscription(PushSubscriptionEvent::NotFound) => { + "Push subscription not found" + } + EventType::Queue(QueueEvent::QueueMessage) => "Queued message for delivery", + EventType::Queue(QueueEvent::QueueMessageAuthenticated) => { + "Queued message submission for delivery" + } + EventType::Queue(QueueEvent::QueueReport) => "Queued report for delivery", + EventType::Queue(QueueEvent::QueueDsn) => "Queued DSN for delivery", + EventType::Queue(QueueEvent::QueueAutogenerated) => { + "Queued autogenerated message for delivery" + } + EventType::Queue(QueueEvent::Rescheduled) => "Message rescheduled for delivery", + EventType::Queue(QueueEvent::Locked) => "Queue event is locked by another process", + EventType::Queue(QueueEvent::BlobNotFound) => "Message blob not found", + EventType::Queue(QueueEvent::RateLimitExceeded) => "Rate limit exceeded", + EventType::Queue(QueueEvent::ConcurrencyLimitExceeded) => "Concurrency limit exceeded", + EventType::Queue(QueueEvent::QuotaExceeded) => "Quota exceeded", + EventType::Queue(QueueEvent::BackPressure) => "Queue backpressure detected", + EventType::Resource(ResourceEvent::NotFound) => "Resource not found", + EventType::Resource(ResourceEvent::BadParameters) => "Bad resource parameters", + EventType::Resource(ResourceEvent::Error) => "Resource error", + EventType::Resource(ResourceEvent::DownloadExternal) => "Downloading external resource", + EventType::Resource(ResourceEvent::WebadminUnpacked) => "Webadmin resource unpacked", + EventType::Security(SecurityEvent::AuthenticationBan) => { + "Banned due to authentication errors" + } + EventType::Security(SecurityEvent::AbuseBan) => "Banned due to abuse", + EventType::Security(SecurityEvent::ScanBan) => "Banned due to scan", + EventType::Security(SecurityEvent::LoiterBan) => "Banned due to loitering", + EventType::Security(SecurityEvent::IpBlocked) => "Blocked IP address", + EventType::Security(SecurityEvent::Unauthorized) => "Unauthorized access", + EventType::Server(ServerEvent::Startup) => "Starting Stalwart Server v0.15.4", + EventType::Server(ServerEvent::Shutdown) => "Shutting down Stalwart Server v0.15.4", + EventType::Server(ServerEvent::StartupError) => "Server startup error", + EventType::Server(ServerEvent::ThreadError) => "Server thread error", + EventType::Server(ServerEvent::Licensing) => "Server licensing event", + EventType::Sieve(SieveEvent::ActionAccept) => "Sieve action: Accept", + EventType::Sieve(SieveEvent::ActionAcceptReplace) => "Sieve action: Accept and replace", + EventType::Sieve(SieveEvent::ActionDiscard) => "Sieve action: Discard", + EventType::Sieve(SieveEvent::ActionReject) => "Sieve action: Reject", + EventType::Sieve(SieveEvent::SendMessage) => "Sieve sending message", + EventType::Sieve(SieveEvent::MessageTooLarge) => "Sieve message too large", + EventType::Sieve(SieveEvent::ScriptNotFound) => "Sieve script not found", + EventType::Sieve(SieveEvent::ListNotFound) => "Sieve list not found", + EventType::Sieve(SieveEvent::RuntimeError) => "Sieve runtime error", + EventType::Sieve(SieveEvent::UnexpectedError) => "Unexpected Sieve error", + EventType::Sieve(SieveEvent::NotSupported) => "Sieve action not supported", + EventType::Sieve(SieveEvent::QuotaExceeded) => "Sieve quota exceeded", + EventType::Smtp(SmtpEvent::ConnectionStart) => "SMTP connection started", + EventType::Smtp(SmtpEvent::ConnectionEnd) => "SMTP connection ended", + EventType::Smtp(SmtpEvent::Error) => "SMTP error occurred", + EventType::Smtp(SmtpEvent::IdNotFound) => "Strategy not found", + EventType::Smtp(SmtpEvent::ConcurrencyLimitExceeded) => "Concurrency limit exceeded", + EventType::Smtp(SmtpEvent::TransferLimitExceeded) => "Transfer limit exceeded", + EventType::Smtp(SmtpEvent::RateLimitExceeded) => "Rate limit exceeded", + EventType::Smtp(SmtpEvent::TimeLimitExceeded) => "Time limit exceeded", + EventType::Smtp(SmtpEvent::MissingAuthDirectory) => "Missing auth directory", + EventType::Smtp(SmtpEvent::MessageParseFailed) => "Message parsing failed", + EventType::Smtp(SmtpEvent::MessageTooLarge) => "Message too large", + EventType::Smtp(SmtpEvent::LoopDetected) => "Mail loop detected", + EventType::Smtp(SmtpEvent::DkimPass) => "DKIM verification passed", + EventType::Smtp(SmtpEvent::DkimFail) => "DKIM verification failed", + EventType::Smtp(SmtpEvent::ArcPass) => "ARC verification passed", + EventType::Smtp(SmtpEvent::ArcFail) => "ARC verification failed", + EventType::Smtp(SmtpEvent::SpfEhloPass) => "SPF EHLO check passed", + EventType::Smtp(SmtpEvent::SpfEhloFail) => "SPF EHLO check failed", + EventType::Smtp(SmtpEvent::SpfFromPass) => "SPF From check passed", + EventType::Smtp(SmtpEvent::SpfFromFail) => "SPF From check failed", + EventType::Smtp(SmtpEvent::DmarcPass) => "DMARC check passed", + EventType::Smtp(SmtpEvent::DmarcFail) => "DMARC check failed", + EventType::Smtp(SmtpEvent::IprevPass) => "IPREV check passed", + EventType::Smtp(SmtpEvent::IprevFail) => "IPREV check failed", + EventType::Smtp(SmtpEvent::TooManyMessages) => "Too many messages", + EventType::Smtp(SmtpEvent::Ehlo) => "SMTP EHLO command", + EventType::Smtp(SmtpEvent::InvalidEhlo) => "Invalid EHLO command", + EventType::Smtp(SmtpEvent::DidNotSayEhlo) => "Client did not say EHLO", + EventType::Smtp(SmtpEvent::EhloExpected) => "EHLO command expected", + EventType::Smtp(SmtpEvent::LhloExpected) => "LHLO command expected", + EventType::Smtp(SmtpEvent::MailFromUnauthenticated) => { + "MAIL FROM without authentication" + } + EventType::Smtp(SmtpEvent::MailFromUnauthorized) => "MAIL FROM unauthorized", + EventType::Smtp(SmtpEvent::MailFromNotAllowed) => "MAIL FROM not allowed", + EventType::Smtp(SmtpEvent::MailFromRewritten) => "MAIL FROM address rewritten", + EventType::Smtp(SmtpEvent::MailFromMissing) => "MAIL FROM address missing", + EventType::Smtp(SmtpEvent::MailFrom) => "SMTP MAIL FROM command", + EventType::Smtp(SmtpEvent::MultipleMailFrom) => "Multiple MAIL FROM commands", + EventType::Smtp(SmtpEvent::MailboxDoesNotExist) => "Mailbox does not exist", + EventType::Smtp(SmtpEvent::RelayNotAllowed) => "Relay not allowed", + EventType::Smtp(SmtpEvent::RcptTo) => "SMTP RCPT TO command", + EventType::Smtp(SmtpEvent::RcptToDuplicate) => "Duplicate RCPT TO", + EventType::Smtp(SmtpEvent::RcptToRewritten) => "RCPT TO address rewritten", + EventType::Smtp(SmtpEvent::RcptToMissing) => "RCPT TO address missing", + EventType::Smtp(SmtpEvent::RcptToGreylisted) => "RCPT TO greylisted", + EventType::Smtp(SmtpEvent::TooManyRecipients) => "Too many recipients", + EventType::Smtp(SmtpEvent::TooManyInvalidRcpt) => "Too many invalid recipients", + EventType::Smtp(SmtpEvent::RawInput) => "Raw SMTP input received", + EventType::Smtp(SmtpEvent::RawOutput) => "Raw SMTP output sent", + EventType::Smtp(SmtpEvent::MissingLocalHostname) => "Missing local hostname", + EventType::Smtp(SmtpEvent::Vrfy) => "SMTP VRFY command", + EventType::Smtp(SmtpEvent::VrfyNotFound) => "VRFY address not found", + EventType::Smtp(SmtpEvent::VrfyDisabled) => "VRFY command disabled", + EventType::Smtp(SmtpEvent::Expn) => "SMTP EXPN command", + EventType::Smtp(SmtpEvent::ExpnNotFound) => "EXPN address not found", + EventType::Smtp(SmtpEvent::ExpnDisabled) => "EXPN command disabled", + EventType::Smtp(SmtpEvent::RequireTlsDisabled) => "REQUIRETLS extension disabled", + EventType::Smtp(SmtpEvent::DeliverByDisabled) => "DELIVERBY extension disabled", + EventType::Smtp(SmtpEvent::DeliverByInvalid) => "Invalid DELIVERBY parameter", + EventType::Smtp(SmtpEvent::FutureReleaseDisabled) => { + "FUTURE RELEASE extension disabled" + } + EventType::Smtp(SmtpEvent::FutureReleaseInvalid) => "Invalid FUTURE RELEASE parameter", + EventType::Smtp(SmtpEvent::MtPriorityDisabled) => "MT-PRIORITY extension disabled", + EventType::Smtp(SmtpEvent::MtPriorityInvalid) => "Invalid MT-PRIORITY parameter", + EventType::Smtp(SmtpEvent::DsnDisabled) => "DSN extension disabled", + EventType::Smtp(SmtpEvent::AuthNotAllowed) => "Authentication not allowed", + EventType::Smtp(SmtpEvent::AuthMechanismNotSupported) => "Auth mechanism not supported", + EventType::Smtp(SmtpEvent::AuthExchangeTooLong) => "Auth exchange too long", + EventType::Smtp(SmtpEvent::AlreadyAuthenticated) => "Already authenticated", + EventType::Smtp(SmtpEvent::Noop) => "SMTP NOOP command", + EventType::Smtp(SmtpEvent::StartTls) => "SMTP STARTTLS command", + EventType::Smtp(SmtpEvent::StartTlsUnavailable) => "STARTTLS unavailable", + EventType::Smtp(SmtpEvent::StartTlsAlready) => "TLS already active", + EventType::Smtp(SmtpEvent::Rset) => "SMTP RSET command", + EventType::Smtp(SmtpEvent::Quit) => "SMTP QUIT command", + EventType::Smtp(SmtpEvent::Help) => "SMTP HELP command", + EventType::Smtp(SmtpEvent::CommandNotImplemented) => "Command not implemented", + EventType::Smtp(SmtpEvent::InvalidCommand) => "Invalid command", + EventType::Smtp(SmtpEvent::InvalidSenderAddress) => "Invalid sender address", + EventType::Smtp(SmtpEvent::InvalidRecipientAddress) => "Invalid recipient address", + EventType::Smtp(SmtpEvent::InvalidParameter) => "Invalid parameter", + EventType::Smtp(SmtpEvent::UnsupportedParameter) => "Unsupported parameter", + EventType::Smtp(SmtpEvent::SyntaxError) => "Syntax error", + EventType::Smtp(SmtpEvent::RequestTooLarge) => "Request too large", + EventType::Spam(SpamEvent::Pyzor) => "Pyzor success", + EventType::Spam(SpamEvent::PyzorError) => "Pyzor error", + EventType::Spam(SpamEvent::Dnsbl) => "DNSBL query", + EventType::Spam(SpamEvent::DnsblError) => "Error querying DNSBL", + EventType::Spam(SpamEvent::TrainStarted) => "Spam classifier training started", + EventType::Spam(SpamEvent::TrainCompleted) => "Spam classifier training completed", + EventType::Spam(SpamEvent::TrainSampleAdded) => "New training sample added", + EventType::Spam(SpamEvent::TrainSampleNotFound) => "Training sample not found", + EventType::Spam(SpamEvent::Classify) => "Classifying message for spam", + EventType::Spam(SpamEvent::ModelLoaded) => "Spam classifier model loaded", + EventType::Spam(SpamEvent::ModelNotReady) => "Spam classifier model not ready", + EventType::Spam(SpamEvent::ModelNotFound) => "Spam classifier model not found", + EventType::Spf(SpfEvent::Pass) => "SPF check passed", + EventType::Spf(SpfEvent::Fail) => "SPF check failed", + EventType::Spf(SpfEvent::SoftFail) => "SPF soft fail", + EventType::Spf(SpfEvent::Neutral) => "SPF neutral result", + EventType::Spf(SpfEvent::TempError) => "SPF temporary error", + EventType::Spf(SpfEvent::PermError) => "SPF permanent error", + EventType::Spf(SpfEvent::None) => "No SPF record", + EventType::Store(StoreEvent::AssertValueFailed) => { + "Another process modified the record" + } + EventType::Store(StoreEvent::FoundationdbError) => "FoundationDB error", + EventType::Store(StoreEvent::MysqlError) => "MySQL error", + EventType::Store(StoreEvent::PostgresqlError) => "PostgreSQL error", + EventType::Store(StoreEvent::RocksdbError) => "RocksDB error", + EventType::Store(StoreEvent::SqliteError) => "SQLite error", + EventType::Store(StoreEvent::LdapError) => "LDAP error", + EventType::Store(StoreEvent::ElasticsearchError) => "ElasticSearch error", + EventType::Store(StoreEvent::MeilisearchError) => "Meilisearch error", + EventType::Store(StoreEvent::RedisError) => "Redis error", + EventType::Store(StoreEvent::S3Error) => "S3 error", + EventType::Store(StoreEvent::AzureError) => "Azure error", + EventType::Store(StoreEvent::FilesystemError) => "Filesystem error", + EventType::Store(StoreEvent::PoolError) => "Connection pool error", + EventType::Store(StoreEvent::DataCorruption) => "Data corruption detected", + EventType::Store(StoreEvent::DecompressError) => "Decompression error", + EventType::Store(StoreEvent::DeserializeError) => "Deserialization error", + EventType::Store(StoreEvent::NotFound) => "Record not found in database", + EventType::Store(StoreEvent::NotConfigured) => "Store not configured", + EventType::Store(StoreEvent::NotSupported) => "Operation not supported by store", + EventType::Store(StoreEvent::UnexpectedError) => "Unexpected store error", + EventType::Store(StoreEvent::CryptoError) => "Store crypto error", + EventType::Store(StoreEvent::HttpStoreError) => "Error updating HTTP store", + EventType::Store(StoreEvent::CacheMiss) => "Cache miss", + EventType::Store(StoreEvent::CacheHit) => "Cache hit", + EventType::Store(StoreEvent::CacheStale) => "Cache is stale", + EventType::Store(StoreEvent::CacheUpdate) => "Cache update", + EventType::Store(StoreEvent::BlobMissingMarker) => "Blob missing marker", + EventType::Store(StoreEvent::DataWrite) => "Write batch operation", + EventType::Store(StoreEvent::DataIterate) => "Data store iteration operation", + EventType::Store(StoreEvent::BlobRead) => "Blob read operation", + EventType::Store(StoreEvent::BlobWrite) => "Blob write operation", + EventType::Store(StoreEvent::BlobDelete) => "Blob delete operation", + EventType::Store(StoreEvent::SqlQuery) => "SQL query executed", + EventType::Store(StoreEvent::LdapQuery) => "LDAP query executed", + EventType::Store(StoreEvent::LdapWarning) => "LDAP authentication warning", + EventType::Store(StoreEvent::HttpStoreFetch) => "HTTP store updated", + EventType::TaskQueue(TaskQueueEvent::TaskAcquired) => "Task acquired from queue", + EventType::TaskQueue(TaskQueueEvent::TaskLocked) => "Task is locked by another process", + EventType::TaskQueue(TaskQueueEvent::TaskIgnored) => { + "Task ignored based on current server roles" + } + EventType::TaskQueue(TaskQueueEvent::TaskFailed) => "Task failed during processing", + EventType::TaskQueue(TaskQueueEvent::BlobNotFound) => "Blob not found for task", + EventType::TaskQueue(TaskQueueEvent::MetadataNotFound) => "Metadata not found for task", + EventType::Telemetry(TelemetryEvent::Alert) => "Alert triggered", + EventType::Telemetry(TelemetryEvent::LogError) => "Log collector error", + EventType::Telemetry(TelemetryEvent::WebhookError) => "Webhook collector error", + EventType::Telemetry(TelemetryEvent::OtelExporterError) => { + "OpenTelemetry exporter error" + } + EventType::Telemetry(TelemetryEvent::OtelMetricsExporterError) => { + "OpenTelemetry metrics exporter error" + } + EventType::Telemetry(TelemetryEvent::PrometheusExporterError) => { + "Prometheus exporter error" + } + EventType::Telemetry(TelemetryEvent::JournalError) => "Journal collector error", + EventType::Tls(TlsEvent::Handshake) => "TLS handshake", + EventType::Tls(TlsEvent::HandshakeError) => "TLS handshake error", + EventType::Tls(TlsEvent::NotConfigured) => "TLS not configured", + EventType::Tls(TlsEvent::CertificateNotFound) => "TLS certificate not found", + EventType::Tls(TlsEvent::NoCertificatesAvailable) => "No TLS certificates available", + EventType::Tls(TlsEvent::MultipleCertificatesAvailable) => { + "Multiple TLS certificates available" + } + EventType::TlsRpt(TlsRptEvent::RecordFetch) => "Fetched TLS-RPT record", + EventType::TlsRpt(TlsRptEvent::RecordFetchError) => "Error fetching TLS-RPT record", + EventType::TlsRpt(TlsRptEvent::RecordNotFound) => "TLS-RPT record not found", + EventType::WebDav(WebDavEvent::Propfind) => "WebDAV PROPFIND request", + EventType::WebDav(WebDavEvent::Proppatch) => "WebDAV PROPPATCH request", + EventType::WebDav(WebDavEvent::Get) => "WebDAV GET request", + EventType::WebDav(WebDavEvent::Head) => "WebDAV HEAD request", + EventType::WebDav(WebDavEvent::Report) => "WebDAV REPORT request", + EventType::WebDav(WebDavEvent::Mkcol) => "WebDAV MKCOL request", + EventType::WebDav(WebDavEvent::Mkcalendar) => "WebDAV MKCALENDAR request", + EventType::WebDav(WebDavEvent::Delete) => "WebDAV DELETE request", + EventType::WebDav(WebDavEvent::Put) => "WebDAV PUT request", + EventType::WebDav(WebDavEvent::Post) => "WebDAV POST request", + EventType::WebDav(WebDavEvent::Patch) => "WebDAV PATCH request", + EventType::WebDav(WebDavEvent::Copy) => "WebDAV COPY request", + EventType::WebDav(WebDavEvent::Move) => "WebDAV MOVE request", + EventType::WebDav(WebDavEvent::Lock) => "WebDAV LOCK request", + EventType::WebDav(WebDavEvent::Unlock) => "WebDAV UNLOCK request", + EventType::WebDav(WebDavEvent::Acl) => "WebDAV ACL request", + EventType::WebDav(WebDavEvent::Options) => "WebDAV OPTIONS request", + EventType::WebDav(WebDavEvent::Error) => "WebDAV error", + } + } + + pub fn explain(&self) -> &'static str { + match self { + EventType::Acme(AcmeEvent::AuthStart) => "ACME authentication has started", + EventType::Acme(AcmeEvent::AuthPending) => "ACME authentication is pending", + EventType::Acme(AcmeEvent::AuthValid) => "ACME authentication is valid", + EventType::Acme(AcmeEvent::AuthCompleted) => "ACME authentication has completed", + EventType::Acme(AcmeEvent::AuthError) => "An error occurred with ACME authentication", + EventType::Acme(AcmeEvent::AuthTooManyAttempts) => { + "Too many ACME authentication attempts" + } + EventType::Acme(AcmeEvent::ProcessCert) => "Processing the ACME certificate", + EventType::Acme(AcmeEvent::OrderStart) => "ACME order has started", + EventType::Acme(AcmeEvent::OrderProcessing) => "ACME order is processing", + EventType::Acme(AcmeEvent::OrderCompleted) => "ACME order has completed", + EventType::Acme(AcmeEvent::OrderReady) => "ACME order is ready", + EventType::Acme(AcmeEvent::OrderValid) => "ACME order is valid", + EventType::Acme(AcmeEvent::OrderInvalid) => "ACME order is invalid", + EventType::Acme(AcmeEvent::RenewBackoff) => "ACME renew backoff", + EventType::Acme(AcmeEvent::ClientSuppliedSni) => "ACME client supplied SNI", + EventType::Acme(AcmeEvent::ClientMissingSni) => "ACME client missing SNI", + EventType::Acme(AcmeEvent::TlsAlpnReceived) => "ACME TLS ALPN received", + EventType::Acme(AcmeEvent::TlsAlpnError) => "ACME TLS ALPN error", + EventType::Acme(AcmeEvent::TokenNotFound) => "ACME token not found", + EventType::Acme(AcmeEvent::Error) => "An error occurred with ACME", + EventType::Ai(AiEvent::LlmResponse) => "An LLM response has been received", + EventType::Ai(AiEvent::ApiError) => "An AI API error occurred", + EventType::Arc(ArcEvent::ChainTooLong) => "The ARC chain is too long", + EventType::Arc(ArcEvent::InvalidInstance) => "The ARC instance is invalid", + EventType::Arc(ArcEvent::InvalidCv) => "The ARC CV is invalid", + EventType::Arc(ArcEvent::HasHeaderTag) => "The ARC has a header tag", + EventType::Arc(ArcEvent::BrokenChain) => "The ARC chain is broken", + EventType::Arc(ArcEvent::SealerNotFound) => "The ARC sealer was not found", + EventType::Auth(AuthEvent::Success) => "Successful authentication", + EventType::Auth(AuthEvent::Failed) => "Failed authentication", + EventType::Auth(AuthEvent::TokenExpired) => "OAuth authentication token has expired", + EventType::Auth(AuthEvent::MissingTotp) => "TOTP is missing for authentication", + EventType::Auth(AuthEvent::TooManyAttempts) => { + "Too many authentication attempts have been made" + } + EventType::Auth(AuthEvent::ClientRegistration) => { + "OAuth client successfully registered" + } + EventType::Auth(AuthEvent::Error) => "An error occurred with authentication", + EventType::Calendar(CalendarEvent::RuleExpansionError) => { + "An error occurred while expanding calendar recurrences" + } + EventType::Calendar(CalendarEvent::AlarmSent) => { + "A calendar alarm has been sent to the recipient" + } + EventType::Calendar(CalendarEvent::AlarmSkipped) => "A calendar alarm was skipped", + EventType::Calendar(CalendarEvent::AlarmRecipientOverride) => { + "A calendar alarm recipient was overridden" + } + EventType::Calendar(CalendarEvent::AlarmFailed) => { + "A calendar alarm could not be sent to the recipient" + } + EventType::Calendar(CalendarEvent::ItipMessageSent) => { + "A calendar iTIP message has been sent" + } + EventType::Calendar(CalendarEvent::ItipMessageReceived) => { + "A calendar iTIP/iMIP message has been received" + } + EventType::Calendar(CalendarEvent::ItipMessageError) => { + "An error occurred while processing an iTIP/iMIP message" + } + EventType::Cluster(ClusterEvent::SubscriberStart) => { + "The PubSub subscriber has started" + } + EventType::Cluster(ClusterEvent::SubscriberStop) => "The PubSub subscriber has stopped", + EventType::Cluster(ClusterEvent::SubscriberError) => { + "An error occurred while subscribing to PubSub" + } + EventType::Cluster(ClusterEvent::SubscriberDisconnected) => { + "The PubSub subscriber has disconnected" + } + EventType::Cluster(ClusterEvent::PublisherStart) => "The PubSub publisher has started", + EventType::Cluster(ClusterEvent::PublisherStop) => "The PubSub publisher has stopped", + EventType::Cluster(ClusterEvent::PublisherError) => { + "An error occurred while publishing to PubSub" + } + EventType::Cluster(ClusterEvent::MessageReceived) => { + "A message was received from the PubSub server" + } + EventType::Cluster(ClusterEvent::MessageSkipped) => { + "A message originating from this node was skipped" + } + EventType::Cluster(ClusterEvent::MessageInvalid) => { + "An invalid message was received from the PubSub server" + } + EventType::Config(ConfigEvent::ParseError) => { + "An error occurred while parsing the configuration" + } + EventType::Config(ConfigEvent::BuildError) => { + "An error occurred while building the configuration" + } + EventType::Config(ConfigEvent::MacroError) => { + "An error occurred with a configuration macro" + } + EventType::Config(ConfigEvent::WriteError) => { + "An error occurred while writing the configuration" + } + EventType::Config(ConfigEvent::FetchError) => { + "An error occurred while fetching the configuration" + } + EventType::Config(ConfigEvent::DefaultApplied) => { + "The default configuration has been applied" + } + EventType::Config(ConfigEvent::MissingSetting) => "A configuration setting is missing", + EventType::Config(ConfigEvent::UnusedSetting) => "A configuration setting is unused", + EventType::Config(ConfigEvent::ParseWarning) => { + "A warning occurred while parsing the configuration" + } + EventType::Config(ConfigEvent::BuildWarning) => { + "A warning occurred while building the configuration" + } + EventType::Config(ConfigEvent::ImportExternal) => { + "An external configuration is being imported" + } + EventType::Config(ConfigEvent::AlreadyUpToDate) => { + "The configuration is already up to date" + } + EventType::Dane(DaneEvent::AuthenticationSuccess) => "Successful DANE authentication", + EventType::Dane(DaneEvent::AuthenticationFailure) => "Failed DANE authentication", + EventType::Dane(DaneEvent::NoCertificatesFound) => { + "No certificates were found for DANE" + } + EventType::Dane(DaneEvent::CertificateParseError) => { + "An error occurred while parsing the certificate" + } + EventType::Dane(DaneEvent::TlsaRecordMatch) => "A TLSA record match was found", + EventType::Dane(DaneEvent::TlsaRecordFetch) => "The TLSA record has been fetched", + EventType::Dane(DaneEvent::TlsaRecordFetchError) => { + "An error occurred while fetching the TLSA record" + } + EventType::Dane(DaneEvent::TlsaRecordNotFound) => "The TLSA record was not found", + EventType::Dane(DaneEvent::TlsaRecordNotDnssecSigned) => { + "The TLSA record is not DNSSEC signed" + } + EventType::Dane(DaneEvent::TlsaRecordInvalid) => "The TLSA record is invalid", + EventType::Delivery(DeliveryEvent::AttemptStart) => { + "A new delivery attempt for the message has started" + } + EventType::Delivery(DeliveryEvent::AttemptEnd) => "The delivery attempt has ended", + EventType::Delivery(DeliveryEvent::Completed) => { + "Delivery was completed for all recipients" + } + EventType::Delivery(DeliveryEvent::Failed) => { + "Message delivery failed due to a temporary error" + } + EventType::Delivery(DeliveryEvent::DomainDeliveryStart) => { + "A new delivery attempt for a domain has started" + } + EventType::Delivery(DeliveryEvent::MxLookup) => "Looking up MX records for the domain", + EventType::Delivery(DeliveryEvent::MxLookupFailed) => { + "Failed to look up MX records for the domain" + } + EventType::Delivery(DeliveryEvent::IpLookup) => "Looking up IP address for the domain", + EventType::Delivery(DeliveryEvent::IpLookupFailed) => { + "Failed to look up IP address for the domain" + } + EventType::Delivery(DeliveryEvent::NullMx) => { + "The domain has a null MX record, delivery is impossible" + } + EventType::Delivery(DeliveryEvent::Connect) => "Connecting to the remote server", + EventType::Delivery(DeliveryEvent::ConnectError) => { + "Error connecting to the remote server" + } + EventType::Delivery(DeliveryEvent::MissingOutboundHostname) => { + "The outbound hostname is missing in the configuration" + } + EventType::Delivery(DeliveryEvent::GreetingFailed) => { + "Failed to read the SMTP greeting from the remote server" + } + EventType::Delivery(DeliveryEvent::Ehlo) => { + "The EHLO command was sent to the remote server" + } + EventType::Delivery(DeliveryEvent::EhloRejected) => { + "The remote server rejected the EHLO command" + } + EventType::Delivery(DeliveryEvent::Auth) => "Authenticating with the remote server", + EventType::Delivery(DeliveryEvent::AuthFailed) => { + "Authentication with the remote server failed" + } + EventType::Delivery(DeliveryEvent::MailFrom) => { + "The MAIL FROM command was sent to the remote server" + } + EventType::Delivery(DeliveryEvent::MailFromRejected) => { + "The remote server rejected the MAIL FROM command" + } + EventType::Delivery(DeliveryEvent::Delivered) => { + "The message was delivered to the recipient" + } + EventType::Delivery(DeliveryEvent::RcptTo) => { + "The RCPT TO command was sent to the remote server" + } + EventType::Delivery(DeliveryEvent::RcptToRejected) => { + "The remote server rejected the RCPT TO command" + } + EventType::Delivery(DeliveryEvent::RcptToFailed) => { + "Failed to send the RCPT TO command to the remote server" + } + EventType::Delivery(DeliveryEvent::MessageRejected) => { + "The remote server rejected the message" + } + EventType::Delivery(DeliveryEvent::StartTls) => { + "Requesting a TLS connection with the remote server" + } + EventType::Delivery(DeliveryEvent::StartTlsUnavailable) => { + "The remote server does not support STARTTLS" + } + EventType::Delivery(DeliveryEvent::StartTlsError) => { + "It was not possible to establish a TLS connection" + } + EventType::Delivery(DeliveryEvent::StartTlsDisabled) => { + "STARTTLS has been disabled in the configuration for this host" + } + EventType::Delivery(DeliveryEvent::ImplicitTlsError) => "Error starting implicit TLS", + EventType::Delivery(DeliveryEvent::ConcurrencyLimitExceeded) => { + "The concurrency limit was exceeded for the remote host" + } + EventType::Delivery(DeliveryEvent::RateLimitExceeded) => { + "The rate limit was exceeded for the remote host" + } + EventType::Delivery(DeliveryEvent::DoubleBounce) => { + "The message was discarded after a double bounce" + } + EventType::Delivery(DeliveryEvent::DsnSuccess) => { + "A success delivery status notification was created" + } + EventType::Delivery(DeliveryEvent::DsnTempFail) => { + "A temporary failure delivery status notification was created" + } + EventType::Delivery(DeliveryEvent::DsnPermFail) => { + "A permanent failure delivery status notification was created" + } + EventType::Delivery(DeliveryEvent::RawInput) => "Raw SMTP input received", + EventType::Delivery(DeliveryEvent::RawOutput) => "Raw SMTP output sent", + EventType::Dkim(DkimEvent::Pass) => "DKIM verification has passed", + EventType::Dkim(DkimEvent::Neutral) => "DKIM verification is neutral", + EventType::Dkim(DkimEvent::Fail) => "DKIM verification has failed", + EventType::Dkim(DkimEvent::PermError) => "A permanent error occurred with DKIM", + EventType::Dkim(DkimEvent::TempError) => "A temporary error occurred with DKIM", + EventType::Dkim(DkimEvent::None) => "No DKIM signature was found", + EventType::Dkim(DkimEvent::UnsupportedVersion) => "The DKIM version is unsupported", + EventType::Dkim(DkimEvent::UnsupportedAlgorithm) => "The DKIM algorithm is unsupported", + EventType::Dkim(DkimEvent::UnsupportedCanonicalization) => { + "The DKIM canonicalization is unsupported" + } + EventType::Dkim(DkimEvent::UnsupportedKeyType) => "The DKIM key type is unsupported", + EventType::Dkim(DkimEvent::FailedBodyHashMatch) => "The DKIM body hash does not match", + EventType::Dkim(DkimEvent::FailedVerification) => "The DKIM verification has failed", + EventType::Dkim(DkimEvent::FailedAuidMatch) => "The DKIM AUID does not match", + EventType::Dkim(DkimEvent::RevokedPublicKey) => "The DKIM public key has been revoked", + EventType::Dkim(DkimEvent::IncompatibleAlgorithms) => { + "The DKIM algorithms are incompatible" + } + EventType::Dkim(DkimEvent::SignatureExpired) => "The DKIM signature has expired", + EventType::Dkim(DkimEvent::SignatureLength) => "The DKIM signature length is incorrect", + EventType::Dkim(DkimEvent::SignerNotFound) => "The DKIM signer was not found", + EventType::Dkim(DkimEvent::BuildError) => { + "An error occurred while building DKIM signature" + } + EventType::Dmarc(DmarcEvent::Pass) => "The DMARC check has passed", + EventType::Dmarc(DmarcEvent::Fail) => "The DMARC check has failed", + EventType::Dmarc(DmarcEvent::PermError) => "A permanent error occurred with DMARC", + EventType::Dmarc(DmarcEvent::TempError) => "A temporary error occurred with DMARC", + EventType::Dmarc(DmarcEvent::None) => "No DMARC record was found", + EventType::Dns(DnsEvent::RecordCreated) => "DNS record has been created", + EventType::Dns(DnsEvent::RecordCreationFailed) => "Failed to create DNS record", + EventType::Dns(DnsEvent::RecordDeletionFailed) => "Failed to delete DNS record", + EventType::Dns(DnsEvent::RecordNotPropagated) => "DNS record has not propagated", + EventType::Dns(DnsEvent::RecordLookupFailed) => "Failed to look up DNS record", + EventType::Dns(DnsEvent::RecordPropagated) => "DNS record has propagated", + EventType::Dns(DnsEvent::RecordPropagationTimeout) => "DNS record propagation timeout", + EventType::Dns(DnsEvent::BuildError) => "An error occurred while building DNS updater", + EventType::Eval(EvalEvent::Result) => "The expression evaluation has a result", + EventType::Eval(EvalEvent::Error) => { + "An error occurred while evaluating the expression" + } + EventType::Eval(EvalEvent::DirectoryNotFound) => { + "The directory was not found while evaluating the expression" + } + EventType::Eval(EvalEvent::StoreNotFound) => { + "The store was not found while evaluating the expression" + } + EventType::Housekeeper(HousekeeperEvent::Start) => { + "The housekeeper process has started" + } + EventType::Housekeeper(HousekeeperEvent::Stop) => "The housekeeper process has stopped", + EventType::Housekeeper(HousekeeperEvent::Schedule) => { + "A housekeeper task has been scheduled" + } + EventType::Housekeeper(HousekeeperEvent::Run) => "A housekeeper task is running", + EventType::Http(HttpEvent::ConnectionStart) => "An HTTP connection was started", + EventType::Http(HttpEvent::ConnectionEnd) => "An HTTP connection was ended", + EventType::Http(HttpEvent::Error) => "An error occurred during an HTTP request", + EventType::Http(HttpEvent::RequestUrl) => "The URL of an HTTP request", + EventType::Http(HttpEvent::RequestBody) => "The body of an HTTP request", + EventType::Http(HttpEvent::ResponseBody) => "The body of an HTTP response", + EventType::Http(HttpEvent::XForwardedMissing) => { + "The X-Forwarded-For header is missing" + } + EventType::Imap(ImapEvent::ConnectionStart) => "IMAP connection started", + EventType::Imap(ImapEvent::ConnectionEnd) => "IMAP connection ended", + EventType::Imap(ImapEvent::GetAcl) => "Client requested mailbox ACL", + EventType::Imap(ImapEvent::SetAcl) => "Client set mailbox ACL", + EventType::Imap(ImapEvent::MyRights) => "Client requested mailbox rights", + EventType::Imap(ImapEvent::ListRights) => "Client requested mailbox rights list", + EventType::Imap(ImapEvent::Append) => "Client appended a message to a mailbox", + EventType::Imap(ImapEvent::Capabilities) => "Client requested server capabilities", + EventType::Imap(ImapEvent::Id) => "Client sent an ID command", + EventType::Imap(ImapEvent::Close) => "Client closed a mailbox", + EventType::Imap(ImapEvent::Copy) => "Client copied messages between mailboxes", + EventType::Imap(ImapEvent::Move) => "Client moved messages between mailboxes", + EventType::Imap(ImapEvent::CreateMailbox) => "Client created a mailbox", + EventType::Imap(ImapEvent::DeleteMailbox) => "Client deleted a mailbox", + EventType::Imap(ImapEvent::RenameMailbox) => "Client renamed a mailbox", + EventType::Imap(ImapEvent::Enable) => "Client enabled an extension", + EventType::Imap(ImapEvent::Expunge) => "Client expunged messages", + EventType::Imap(ImapEvent::Fetch) => "Client fetched messages", + EventType::Imap(ImapEvent::IdleStart) => "Client started IDLE", + EventType::Imap(ImapEvent::IdleStop) => "Client stopped IDLE", + EventType::Imap(ImapEvent::List) => "Client listed mailboxes", + EventType::Imap(ImapEvent::Lsub) => "Client listed subscribed mailboxes", + EventType::Imap(ImapEvent::Logout) => "Client logged out", + EventType::Imap(ImapEvent::Namespace) => "Client requested namespace", + EventType::Imap(ImapEvent::Noop) => "Client sent a NOOP command", + EventType::Imap(ImapEvent::Search) => "Client searched for messages", + EventType::Imap(ImapEvent::Sort) => "Client sorted messages", + EventType::Imap(ImapEvent::Select) => "Client selected a mailbox", + EventType::Imap(ImapEvent::Status) => "Client requested mailbox status", + EventType::Imap(ImapEvent::Store) => "Client stored flags", + EventType::Imap(ImapEvent::Subscribe) => "Client subscribed to a mailbox", + EventType::Imap(ImapEvent::Unsubscribe) => "Client unsubscribed from a mailbox", + EventType::Imap(ImapEvent::Thread) => "Client requested message threads", + EventType::Imap(ImapEvent::GetQuota) => "Client requested mailbox quota", + EventType::Imap(ImapEvent::Error) => "An error occurred during an IMAP command", + EventType::Imap(ImapEvent::RawInput) => "Raw IMAP input received", + EventType::Imap(ImapEvent::RawOutput) => "Raw IMAP output sent", + EventType::IncomingReport(IncomingReportEvent::DmarcReport) => { + "A DMARC report has been received" + } + EventType::IncomingReport(IncomingReportEvent::DmarcReportWithWarnings) => { + "A DMARC report with warnings has been received" + } + EventType::IncomingReport(IncomingReportEvent::TlsReport) => { + "A TLS report has been received" + } + EventType::IncomingReport(IncomingReportEvent::TlsReportWithWarnings) => { + "A TLS report with warnings has been received" + } + EventType::IncomingReport(IncomingReportEvent::AbuseReport) => { + "An abuse report has been received" + } + EventType::IncomingReport(IncomingReportEvent::AuthFailureReport) => { + "An authentication failure report has been received" + } + EventType::IncomingReport(IncomingReportEvent::FraudReport) => { + "A fraud report has been received" + } + EventType::IncomingReport(IncomingReportEvent::NotSpamReport) => { + "A not spam report has been received" + } + EventType::IncomingReport(IncomingReportEvent::VirusReport) => { + "A virus report has been received" + } + EventType::IncomingReport(IncomingReportEvent::OtherReport) => { + "An unknown type of report has been received" + } + EventType::IncomingReport(IncomingReportEvent::MessageParseFailed) => { + "Failed to parse the incoming report message" + } + EventType::IncomingReport(IncomingReportEvent::DmarcParseFailed) => { + "Failed to parse the DMARC report" + } + EventType::IncomingReport(IncomingReportEvent::TlsRpcParseFailed) => { + "Failed to parse the TLS RPC report" + } + EventType::IncomingReport(IncomingReportEvent::ArfParseFailed) => { + "Failed to parse the ARF report" + } + EventType::IncomingReport(IncomingReportEvent::DecompressError) => { + "Error decompressing the report" + } + EventType::Iprev(IprevEvent::Pass) => "The IPREV check has passed", + EventType::Iprev(IprevEvent::Fail) => "The IPREV check has failed", + EventType::Iprev(IprevEvent::PermError) => "A permanent error occurred with IPREV", + EventType::Iprev(IprevEvent::TempError) => "A temporary error occurred with IPREV", + EventType::Iprev(IprevEvent::None) => "No IPREV record was found", + EventType::Jmap(JmapEvent::MethodCall) => "A JMAP method call has been made", + EventType::Jmap(JmapEvent::InvalidArguments) => "The JMAP arguments are invalid", + EventType::Jmap(JmapEvent::RequestTooLarge) => "The JMAP request is too large", + EventType::Jmap(JmapEvent::StateMismatch) => "The JMAP state is mismatched", + EventType::Jmap(JmapEvent::AnchorNotFound) => "The JMAP anchor was not found", + EventType::Jmap(JmapEvent::UnsupportedFilter) => "The JMAP filter is unsupported", + EventType::Jmap(JmapEvent::UnsupportedSort) => "The JMAP sort is unsupported", + EventType::Jmap(JmapEvent::UnknownMethod) => "The JMAP method is unknown", + EventType::Jmap(JmapEvent::InvalidResultReference) => { + "The JMAP result reference is invalid" + } + EventType::Jmap(JmapEvent::Forbidden) => "The JMAP operation is forbidden", + EventType::Jmap(JmapEvent::AccountNotFound) => "The JMAP account was not found", + EventType::Jmap(JmapEvent::AccountNotSupportedByMethod) => { + "The JMAP account is not supported by the method" + } + EventType::Jmap(JmapEvent::AccountReadOnly) => "The JMAP account is read-only", + EventType::Jmap(JmapEvent::NotFound) => "The JMAP resource was not found", + EventType::Jmap(JmapEvent::CannotCalculateChanges) => "Cannot calculate JMAP changes", + EventType::Jmap(JmapEvent::UnknownDataType) => "The JMAP data type is unknown", + EventType::Jmap(JmapEvent::UnknownCapability) => "The JMAP capability is unknown", + EventType::Jmap(JmapEvent::NotJson) => "The JMAP request is not JSON", + EventType::Jmap(JmapEvent::NotRequest) => "The JMAP input is not a request", + EventType::Jmap(JmapEvent::WebsocketStart) => { + "The JMAP WebSocket connection has started" + } + EventType::Jmap(JmapEvent::WebsocketStop) => { + "The JMAP WebSocket connection has stopped" + } + EventType::Jmap(JmapEvent::WebsocketError) => { + "An error occurred with the JMAP WebSocket connection" + } + EventType::Limit(LimitEvent::SizeRequest) => "The request size limit has been reached", + EventType::Limit(LimitEvent::SizeUpload) => "The upload size limit has been reached", + EventType::Limit(LimitEvent::CallsIn) => "The incoming calls limit has been reached", + EventType::Limit(LimitEvent::ConcurrentRequest) => { + "The concurrent request limit has been reached" + } + EventType::Limit(LimitEvent::ConcurrentUpload) => { + "The concurrent upload limit has been reached" + } + EventType::Limit(LimitEvent::ConcurrentConnection) => { + "The concurrent connection limit has been reached" + } + EventType::Limit(LimitEvent::Quota) => "The quota limit has been reached", + EventType::Limit(LimitEvent::BlobQuota) => "The blob quota limit has been reached", + EventType::Limit(LimitEvent::TenantQuota) => { + "One of the tenant quota limits has been reached" + } + EventType::Limit(LimitEvent::TooManyRequests) => "Too many requests have been made", + EventType::MailAuth(MailAuthEvent::ParseError) => { + "An error occurred while parsing mail authentication" + } + EventType::MailAuth(MailAuthEvent::MissingParameters) => { + "Mail authentication parameters are missing" + } + EventType::MailAuth(MailAuthEvent::NoHeadersFound) => { + "No headers were found in the message" + } + EventType::MailAuth(MailAuthEvent::Crypto) => { + "A crypto error occurred during mail authentication" + } + EventType::MailAuth(MailAuthEvent::Io) => { + "An I/O error occurred during mail authentication" + } + EventType::MailAuth(MailAuthEvent::Base64) => { + "A base64 error occurred during mail authentication" + } + EventType::MailAuth(MailAuthEvent::DnsError) => "A DNS error occurred", + EventType::MailAuth(MailAuthEvent::DnsRecordNotFound) => "The DNS record was not found", + EventType::MailAuth(MailAuthEvent::DnsInvalidRecordType) => { + "The DNS record type is invalid" + } + EventType::MailAuth(MailAuthEvent::PolicyNotAligned) => "The policy is not aligned", + EventType::Manage(ManageEvent::MissingParameter) => "A parameter is missing", + EventType::Manage(ManageEvent::AlreadyExists) => { + "A record with the same name already exists" + } + EventType::Manage(ManageEvent::AssertFailed) => "A management assertion has failed", + EventType::Manage(ManageEvent::NotFound) => "The managed resource was not found", + EventType::Manage(ManageEvent::NotSupported) => { + "The management operation is not supported" + } + EventType::Manage(ManageEvent::Error) => "A management error occurred", + EventType::ManageSieve(ManageSieveEvent::ConnectionStart) => { + "ManageSieve connection started" + } + EventType::ManageSieve(ManageSieveEvent::ConnectionEnd) => { + "ManageSieve connection ended" + } + EventType::ManageSieve(ManageSieveEvent::CreateScript) => "Client created a script", + EventType::ManageSieve(ManageSieveEvent::UpdateScript) => "Client updated a script", + EventType::ManageSieve(ManageSieveEvent::GetScript) => "Client fetched a script", + EventType::ManageSieve(ManageSieveEvent::DeleteScript) => "Client deleted a script", + EventType::ManageSieve(ManageSieveEvent::RenameScript) => "Client renamed a script", + EventType::ManageSieve(ManageSieveEvent::CheckScript) => "Client checked a script", + EventType::ManageSieve(ManageSieveEvent::HaveSpace) => "Client checked for space", + EventType::ManageSieve(ManageSieveEvent::ListScripts) => "Client listed scripts", + EventType::ManageSieve(ManageSieveEvent::SetActive) => "Client set an active script", + EventType::ManageSieve(ManageSieveEvent::Capabilities) => { + "Client requested server capabilities" + } + EventType::ManageSieve(ManageSieveEvent::StartTls) => "Client requested TLS", + EventType::ManageSieve(ManageSieveEvent::Unauthenticate) => "Client unauthenticated", + EventType::ManageSieve(ManageSieveEvent::Logout) => "Client logged out", + EventType::ManageSieve(ManageSieveEvent::Noop) => "Client sent a NOOP command", + EventType::ManageSieve(ManageSieveEvent::Error) => { + "An error occurred during a ManageSieve command" + } + EventType::ManageSieve(ManageSieveEvent::RawInput) => "Raw ManageSieve input received", + EventType::ManageSieve(ManageSieveEvent::RawOutput) => "Raw ManageSieve output sent", + EventType::MessageIngest(MessageIngestEvent::Ham) => "The message has been ingested", + EventType::MessageIngest(MessageIngestEvent::Spam) => { + "A possible spam message has been ingested" + } + EventType::MessageIngest(MessageIngestEvent::ImapAppend) => { + "The message has been appended via IMAP" + } + EventType::MessageIngest(MessageIngestEvent::JmapAppend) => { + "The message has been appended via JMAP" + } + EventType::MessageIngest(MessageIngestEvent::Duplicate) => { + "The message is a duplicate and has been skipped" + } + EventType::MessageIngest(MessageIngestEvent::Error) => { + "An error occurred while ingesting the message" + } + EventType::MessageIngest(MessageIngestEvent::FtsIndex) => { + "The full-text search index has been updated" + } + EventType::Milter(MilterEvent::Read) => "Reading from the Milter", + EventType::Milter(MilterEvent::Write) => "Writing to the Milter", + EventType::Milter(MilterEvent::ActionAccept) => { + "The Milter requested to accept the message" + } + EventType::Milter(MilterEvent::ActionDiscard) => { + "The Milter requested to discard the message" + } + EventType::Milter(MilterEvent::ActionReject) => { + "The Milter requested to reject the message" + } + EventType::Milter(MilterEvent::ActionTempFail) => { + "The Milter requested to temporarily fail the message" + } + EventType::Milter(MilterEvent::ActionReplyCode) => "The Milter requested a reply code", + EventType::Milter(MilterEvent::ActionConnectionFailure) => { + "The Milter requested a connection failure" + } + EventType::Milter(MilterEvent::ActionShutdown) => "The Milter requested a shutdown", + EventType::Milter(MilterEvent::IoError) => "An I/O error occurred with the Milter", + EventType::Milter(MilterEvent::FrameTooLarge) => "The Milter frame was too large", + EventType::Milter(MilterEvent::FrameInvalid) => "The Milter frame was invalid", + EventType::Milter(MilterEvent::UnexpectedResponse) => { + "An unexpected response was received from the Milter" + } + EventType::Milter(MilterEvent::Timeout) => "A timeout occurred with the Milter", + EventType::Milter(MilterEvent::TlsInvalidName) => "The Milter TLS name is invalid", + EventType::Milter(MilterEvent::Disconnected) => "The Milter disconnected", + EventType::Milter(MilterEvent::ParseError) => { + "An error occurred while parsing the Milter response" + } + EventType::MtaHook(MtaHookEvent::ActionAccept) => { + "The MTA hook requested to accept the message" + } + EventType::MtaHook(MtaHookEvent::ActionDiscard) => { + "The MTA hook requested to discard the message" + } + EventType::MtaHook(MtaHookEvent::ActionReject) => { + "The MTA hook requested to reject the message" + } + EventType::MtaHook(MtaHookEvent::ActionQuarantine) => { + "The MTA hook requested to quarantine the message" + } + EventType::MtaHook(MtaHookEvent::Error) => "An error occurred with the MTA hook", + EventType::MtaSts(MtaStsEvent::Authorized) => { + "The host is authorized by the MTA-STS policy" + } + EventType::MtaSts(MtaStsEvent::NotAuthorized) => { + "The host is not authorized by the MTA-STS policy" + } + EventType::MtaSts(MtaStsEvent::PolicyFetch) => "The MTA-STS policy has been fetched", + EventType::MtaSts(MtaStsEvent::PolicyNotFound) => "An MTA-STS policy was not found", + EventType::MtaSts(MtaStsEvent::PolicyFetchError) => { + "An error occurred while fetching the MTA-STS policy" + } + EventType::MtaSts(MtaStsEvent::InvalidPolicy) => "The MTA-STS policy is invalid", + EventType::Network(NetworkEvent::ListenStart) => "The network listener has started", + EventType::Network(NetworkEvent::ListenStop) => "The network listener has stopped", + EventType::Network(NetworkEvent::ListenError) => { + "An error occurred with the network listener" + } + EventType::Network(NetworkEvent::BindError) => { + "An error occurred while binding the network listener" + } + EventType::Network(NetworkEvent::ReadError) => { + "An error occurred while reading from the network" + } + EventType::Network(NetworkEvent::WriteError) => { + "An error occurred while writing to the network" + } + EventType::Network(NetworkEvent::FlushError) => { + "An error occurred while flushing the network" + } + EventType::Network(NetworkEvent::AcceptError) => { + "An error occurred while accepting a network connection" + } + EventType::Network(NetworkEvent::SplitError) => { + "An error occurred while splitting the network connection" + } + EventType::Network(NetworkEvent::Timeout) => "A network timeout occurred", + EventType::Network(NetworkEvent::Closed) => "The network connection was closed", + EventType::Network(NetworkEvent::ProxyError) => { + "An error occurred with the proxy protocol" + } + EventType::Network(NetworkEvent::SetOptError) => { + "An error occurred while setting network options" + } + EventType::OutgoingReport(OutgoingReportEvent::SpfReport) => { + "An SPF report has been sent" + } + EventType::OutgoingReport(OutgoingReportEvent::SpfRateLimited) => { + "The SPF report was rate limited" + } + EventType::OutgoingReport(OutgoingReportEvent::DkimReport) => { + "A DKIM report has been sent" + } + EventType::OutgoingReport(OutgoingReportEvent::DkimRateLimited) => { + "The DKIM report was rate limited" + } + EventType::OutgoingReport(OutgoingReportEvent::DmarcReport) => { + "A DMARC report has been sent" + } + EventType::OutgoingReport(OutgoingReportEvent::DmarcRateLimited) => { + "The DMARC report was rate limited" + } + EventType::OutgoingReport(OutgoingReportEvent::DmarcAggregateReport) => { + "A DMARC aggregate report will be sent" + } + EventType::OutgoingReport(OutgoingReportEvent::TlsAggregate) => { + "A TLS aggregate report will be sent" + } + EventType::OutgoingReport(OutgoingReportEvent::HttpSubmission) => { + "The report was submitted via HTTP" + } + EventType::OutgoingReport(OutgoingReportEvent::UnauthorizedReportingAddress) => { + "The reporting address is not authorized to send reports" + } + EventType::OutgoingReport(OutgoingReportEvent::ReportingAddressValidationError) => { + "Error validating the reporting address" + } + EventType::OutgoingReport(OutgoingReportEvent::NotFound) => "The report was not found", + EventType::OutgoingReport(OutgoingReportEvent::SubmissionError) => { + "Error submitting the report" + } + EventType::OutgoingReport(OutgoingReportEvent::NoRecipientsFound) => { + "No recipients found for the report" + } + EventType::OutgoingReport(OutgoingReportEvent::Locked) => { + "The report is locked by another process" + } + EventType::Pop3(Pop3Event::ConnectionStart) => "POP3 connection started", + EventType::Pop3(Pop3Event::ConnectionEnd) => "POP3 connection ended", + EventType::Pop3(Pop3Event::Delete) => "Client deleted a message", + EventType::Pop3(Pop3Event::Reset) => "Client reset the session", + EventType::Pop3(Pop3Event::Quit) => "Client quit the session", + EventType::Pop3(Pop3Event::Fetch) => "Client fetched a message", + EventType::Pop3(Pop3Event::List) => "Client listed messages", + EventType::Pop3(Pop3Event::ListMessage) => "Client listed a specific message", + EventType::Pop3(Pop3Event::Uidl) => "Client requested unique identifiers", + EventType::Pop3(Pop3Event::UidlMessage) => { + "Client requested a specific unique identifier" + } + EventType::Pop3(Pop3Event::Stat) => "Client requested mailbox status", + EventType::Pop3(Pop3Event::Noop) => "Client sent a NOOP command", + EventType::Pop3(Pop3Event::Capabilities) => "Client requested server capabilities", + EventType::Pop3(Pop3Event::StartTls) => "Client requested TLS", + EventType::Pop3(Pop3Event::Utf8) => "Client requested UTF-8 support", + EventType::Pop3(Pop3Event::Error) => "An error occurred during a POP3 command", + EventType::Pop3(Pop3Event::RawInput) => "Raw POP3 input received", + EventType::Pop3(Pop3Event::RawOutput) => "Raw POP3 output sent", + EventType::Purge(PurgeEvent::Started) => "The purge has started", + EventType::Purge(PurgeEvent::Finished) => "The purge has finished", + EventType::Purge(PurgeEvent::Running) => "The purge is running", + EventType::Purge(PurgeEvent::Error) => "An error occurred with the purge", + EventType::Purge(PurgeEvent::InProgress) => "An active purge is in progress", + EventType::Purge(PurgeEvent::AutoExpunge) => "Auto-expunge has been executed", + EventType::Purge(PurgeEvent::BlobCleanup) => "Blob storage cleanup has completed", + EventType::PushSubscription(PushSubscriptionEvent::Success) => { + "The push subscription was successful" + } + EventType::PushSubscription(PushSubscriptionEvent::Error) => { + "An error occurred with the push subscription" + } + EventType::PushSubscription(PushSubscriptionEvent::NotFound) => { + "The push subscription was not found" + } + EventType::Queue(QueueEvent::QueueMessage) => "A new message was queued for delivery", + EventType::Queue(QueueEvent::QueueMessageAuthenticated) => { + "A new message was queued for delivery from an authenticated client" + } + EventType::Queue(QueueEvent::QueueReport) => "A new report was queued for delivery", + EventType::Queue(QueueEvent::QueueDsn) => { + "A delivery status notification was queued for delivery" + } + EventType::Queue(QueueEvent::QueueAutogenerated) => { + "A system generated message was queued for delivery" + } + EventType::Queue(QueueEvent::Rescheduled) => "The message was rescheduled for delivery", + EventType::Queue(QueueEvent::Locked) => "The queue event is locked by another process", + EventType::Queue(QueueEvent::BlobNotFound) => "The message blob was not found", + EventType::Queue(QueueEvent::RateLimitExceeded) => "The queue rate limit was exceeded", + EventType::Queue(QueueEvent::ConcurrencyLimitExceeded) => { + "The queue concurrency limit was exceeded" + } + EventType::Queue(QueueEvent::QuotaExceeded) => "The queue quota was exceeded", + EventType::Queue(QueueEvent::BackPressure) => { + "Queue congested, processing can't keep up with incoming message rate" + } + EventType::Resource(ResourceEvent::NotFound) => "The resource was not found", + EventType::Resource(ResourceEvent::BadParameters) => "The resource parameters are bad", + EventType::Resource(ResourceEvent::Error) => "An error occurred with the resource", + EventType::Resource(ResourceEvent::DownloadExternal) => { + "The external resource is being downloaded" + } + EventType::Resource(ResourceEvent::WebadminUnpacked) => { + "The webadmin resource has been unpacked" + } + EventType::Security(SecurityEvent::AuthenticationBan) => { + "IP address was banned due to multiple authentication errors" + } + EventType::Security(SecurityEvent::AbuseBan) => { + "IP address was banned due to abuse, such as RCPT TO attacks" + } + EventType::Security(SecurityEvent::ScanBan) => { + "IP address was banned due to exploit scanning" + } + EventType::Security(SecurityEvent::LoiterBan) => { + "IP address was banned due to multiple loitering events" + } + EventType::Security(SecurityEvent::IpBlocked) => { + "Rejected connection from blocked IP address" + } + EventType::Security(SecurityEvent::Unauthorized) => { + "Account does not have permission to access resource" + } + EventType::Server(ServerEvent::Startup) => "Stalwart Server has started", + EventType::Server(ServerEvent::Shutdown) => "Stalwart Server is shutting down", + EventType::Server(ServerEvent::StartupError) => { + "An error occurred while starting the server" + } + EventType::Server(ServerEvent::ThreadError) => "An error occurred with a server thread", + EventType::Server(ServerEvent::Licensing) => "A licensing event occurred", + EventType::Sieve(SieveEvent::ActionAccept) => { + "The Sieve script requested to accept the message" + } + EventType::Sieve(SieveEvent::ActionAcceptReplace) => { + "The Sieve script requested to accept the message and replace its contents" + } + EventType::Sieve(SieveEvent::ActionDiscard) => { + "The Sieve script requested to discard the message" + } + EventType::Sieve(SieveEvent::ActionReject) => { + "The Sieve script requested to reject the message" + } + EventType::Sieve(SieveEvent::SendMessage) => "The Sieve script is sending a message", + EventType::Sieve(SieveEvent::MessageTooLarge) => "The Sieve message is too large", + EventType::Sieve(SieveEvent::ScriptNotFound) => "The Sieve script was not found", + EventType::Sieve(SieveEvent::ListNotFound) => "The Sieve list was not found", + EventType::Sieve(SieveEvent::RuntimeError) => { + "A runtime error occurred with the Sieve script" + } + EventType::Sieve(SieveEvent::UnexpectedError) => { + "An unexpected error occurred with the Sieve script" + } + EventType::Sieve(SieveEvent::NotSupported) => "The Sieve action is not supported", + EventType::Sieve(SieveEvent::QuotaExceeded) => "The Sieve quota was exceeded", + EventType::Smtp(SmtpEvent::ConnectionStart) => "A new SMTP connection was started", + EventType::Smtp(SmtpEvent::ConnectionEnd) => "The SMTP connection was ended", + EventType::Smtp(SmtpEvent::Error) => "An error occurred during an SMTP command", + EventType::Smtp(SmtpEvent::IdNotFound) => { + "The strategy ID was not found in the configuration" + } + EventType::Smtp(SmtpEvent::ConcurrencyLimitExceeded) => { + "The concurrency limit was exceeded" + } + EventType::Smtp(SmtpEvent::TransferLimitExceeded) => { + "The remote host transferred more data than allowed" + } + EventType::Smtp(SmtpEvent::RateLimitExceeded) => "The rate limit was exceeded", + EventType::Smtp(SmtpEvent::TimeLimitExceeded) => { + "The remote host kept the SMTP session open too long" + } + EventType::Smtp(SmtpEvent::MissingAuthDirectory) => "The auth directory was missing", + EventType::Smtp(SmtpEvent::MessageParseFailed) => "Failed to parse the message", + EventType::Smtp(SmtpEvent::MessageTooLarge) => { + "The message was rejected because it was too large" + } + EventType::Smtp(SmtpEvent::LoopDetected) => { + "A mail loop was detected, the message contains too many Received headers" + } + EventType::Smtp(SmtpEvent::DkimPass) => "Successful DKIM verification", + EventType::Smtp(SmtpEvent::DkimFail) => "Failed to verify DKIM signature", + EventType::Smtp(SmtpEvent::ArcPass) => "Successful ARC verification", + EventType::Smtp(SmtpEvent::ArcFail) => "Failed to verify ARC signature", + EventType::Smtp(SmtpEvent::SpfEhloPass) => "EHLO identity passed SPF check", + EventType::Smtp(SmtpEvent::SpfEhloFail) => "EHLO identity failed SPF check", + EventType::Smtp(SmtpEvent::SpfFromPass) => "MAIL FROM identity passed SPF check", + EventType::Smtp(SmtpEvent::SpfFromFail) => "MAIL FROM identity failed SPF check", + EventType::Smtp(SmtpEvent::DmarcPass) => "Successful DMARC verification", + EventType::Smtp(SmtpEvent::DmarcFail) => "Failed to verify DMARC policy", + EventType::Smtp(SmtpEvent::IprevPass) => "Reverse IP check passed", + EventType::Smtp(SmtpEvent::IprevFail) => "Reverse IP check failed", + EventType::Smtp(SmtpEvent::TooManyMessages) => { + "The remote server exceeded the number of messages allowed per session" + } + EventType::Smtp(SmtpEvent::Ehlo) => "The remote server sent an EHLO command", + EventType::Smtp(SmtpEvent::InvalidEhlo) => { + "The remote server sent an invalid EHLO command" + } + EventType::Smtp(SmtpEvent::DidNotSayEhlo) => { + "The remote server did not send EHLO command" + } + EventType::Smtp(SmtpEvent::EhloExpected) => { + "The remote server sent a LHLO command while EHLO was expected" + } + EventType::Smtp(SmtpEvent::LhloExpected) => { + "The remote server sent an EHLO command while LHLO was expected" + } + EventType::Smtp(SmtpEvent::MailFromUnauthenticated) => { + "The remote client did not authenticate before sending MAIL FROM" + } + EventType::Smtp(SmtpEvent::MailFromUnauthorized) => { + "The remote client is not authorized to send mail from the given address" + } + EventType::Smtp(SmtpEvent::MailFromNotAllowed) => { + "The remote client is not allowed to send mail from this address" + } + EventType::Smtp(SmtpEvent::MailFromRewritten) => { + "The envelope sender address was rewritten" + } + EventType::Smtp(SmtpEvent::MailFromMissing) => { + "The remote client issued an RCPT TO command before MAIL FROM" + } + EventType::Smtp(SmtpEvent::MailFrom) => "The remote client sent a MAIL FROM command", + EventType::Smtp(SmtpEvent::MultipleMailFrom) => { + "The remote client already sent a MAIL FROM command" + } + EventType::Smtp(SmtpEvent::MailboxDoesNotExist) => { + "The mailbox does not exist on the server" + } + EventType::Smtp(SmtpEvent::RelayNotAllowed) => "The server does not allow relaying", + EventType::Smtp(SmtpEvent::RcptTo) => "The remote client sent an RCPT TO command", + EventType::Smtp(SmtpEvent::RcptToDuplicate) => { + "The remote client already sent an RCPT TO command for this recipient" + } + EventType::Smtp(SmtpEvent::RcptToRewritten) => { + "The envelope recipient address was rewritten" + } + EventType::Smtp(SmtpEvent::RcptToMissing) => { + "The remote client issued a DATA command before RCPT TO" + } + EventType::Smtp(SmtpEvent::RcptToGreylisted) => "The recipient was greylisted", + EventType::Smtp(SmtpEvent::TooManyRecipients) => { + "The remote client exceeded the number of recipients allowed" + } + EventType::Smtp(SmtpEvent::TooManyInvalidRcpt) => { + "The remote client exceeded the number of invalid RCPT TO commands allowed" + } + EventType::Smtp(SmtpEvent::RawInput) => "Raw SMTP input received", + EventType::Smtp(SmtpEvent::RawOutput) => "Raw SMTP output sent", + EventType::Smtp(SmtpEvent::MissingLocalHostname) => { + "The local hostname is missing in the configuration" + } + EventType::Smtp(SmtpEvent::Vrfy) => "The remote client sent a VRFY command", + EventType::Smtp(SmtpEvent::VrfyNotFound) => { + "The remote client sent a VRFY command for an address that was not found" + } + EventType::Smtp(SmtpEvent::VrfyDisabled) => "The VRFY command is disabled", + EventType::Smtp(SmtpEvent::Expn) => "The remote client sent an EXPN command", + EventType::Smtp(SmtpEvent::ExpnNotFound) => { + "The remote client sent an EXPN command for an address that was not found" + } + EventType::Smtp(SmtpEvent::ExpnDisabled) => "The EXPN command is disabled", + EventType::Smtp(SmtpEvent::RequireTlsDisabled) => { + "The REQUIRETLS extension is disabled" + } + EventType::Smtp(SmtpEvent::DeliverByDisabled) => "The DELIVERBY extension is disabled", + EventType::Smtp(SmtpEvent::DeliverByInvalid) => "The DELIVERBY parameter is invalid", + EventType::Smtp(SmtpEvent::FutureReleaseDisabled) => { + "The FUTURE RELEASE extension is disabled" + } + EventType::Smtp(SmtpEvent::FutureReleaseInvalid) => { + "The FUTURE RELEASE parameter is invalid" + } + EventType::Smtp(SmtpEvent::MtPriorityDisabled) => { + "The MT-PRIORITY extension is disabled" + } + EventType::Smtp(SmtpEvent::MtPriorityInvalid) => "The MT-PRIORITY parameter is invalid", + EventType::Smtp(SmtpEvent::DsnDisabled) => "The DSN extension is disabled", + EventType::Smtp(SmtpEvent::AuthNotAllowed) => { + "Authentication is not allowed on this listener" + } + EventType::Smtp(SmtpEvent::AuthMechanismNotSupported) => { + "The requested authentication mechanism is not supported" + } + EventType::Smtp(SmtpEvent::AuthExchangeTooLong) => { + "The authentication exchange was too long" + } + EventType::Smtp(SmtpEvent::AlreadyAuthenticated) => { + "The client is already authenticated" + } + EventType::Smtp(SmtpEvent::Noop) => "The remote client sent a NOOP command", + EventType::Smtp(SmtpEvent::StartTls) => "The remote client requested a TLS connection", + EventType::Smtp(SmtpEvent::StartTlsUnavailable) => { + "The remote client requested a TLS connection but it is not available" + } + EventType::Smtp(SmtpEvent::StartTlsAlready) => "TLS is already active", + EventType::Smtp(SmtpEvent::Rset) => "The remote client sent a RSET command", + EventType::Smtp(SmtpEvent::Quit) => "The remote client sent a QUIT command", + EventType::Smtp(SmtpEvent::Help) => "The remote client sent a HELP command", + EventType::Smtp(SmtpEvent::CommandNotImplemented) => { + "The server does not implement the requested command" + } + EventType::Smtp(SmtpEvent::InvalidCommand) => { + "The remote client sent an invalid command" + } + EventType::Smtp(SmtpEvent::InvalidSenderAddress) => { + "The specified sender address is invalid" + } + EventType::Smtp(SmtpEvent::InvalidRecipientAddress) => { + "The specified recipient address is invalid" + } + EventType::Smtp(SmtpEvent::InvalidParameter) => { + "The command contained an invalid parameter" + } + EventType::Smtp(SmtpEvent::UnsupportedParameter) => { + "The command contained an unsupported parameter" + } + EventType::Smtp(SmtpEvent::SyntaxError) => "The command contained a syntax error", + EventType::Smtp(SmtpEvent::RequestTooLarge) => "The request was too large", + EventType::Spam(SpamEvent::Pyzor) => "Pyzor query successful", + EventType::Spam(SpamEvent::PyzorError) => "An error occurred with Pyzor", + EventType::Spam(SpamEvent::Dnsbl) => "The DNSBL query was successful", + EventType::Spam(SpamEvent::DnsblError) => "An error occurred while querying the DNSBL", + EventType::Spam(SpamEvent::TrainStarted) => { + "SGD logistic regression training has started" + } + EventType::Spam(SpamEvent::TrainCompleted) => { + "SGD logistic regression training has completed" + } + EventType::Spam(SpamEvent::TrainSampleAdded) => "A new training sample has been added", + EventType::Spam(SpamEvent::TrainSampleNotFound) => "A training sample was not found", + EventType::Spam(SpamEvent::Classify) => "The message is being classified for spam", + EventType::Spam(SpamEvent::ModelLoaded) => "The spam classifier model has been loaded", + EventType::Spam(SpamEvent::ModelNotReady) => { + "The spam classifier model has not been trained with enough data" + } + EventType::Spam(SpamEvent::ModelNotFound) => { + "The spam classifier model has not been trained yet" + } + EventType::Spf(SpfEvent::Pass) => "The SPF check has passed", + EventType::Spf(SpfEvent::Fail) => "The SPF check has failed", + EventType::Spf(SpfEvent::SoftFail) => "The SPF check has soft failed", + EventType::Spf(SpfEvent::Neutral) => "The SPF result is neutral", + EventType::Spf(SpfEvent::TempError) => "A temporary error occurred with SPF", + EventType::Spf(SpfEvent::PermError) => "A permanent error occurred with SPF", + EventType::Spf(SpfEvent::None) => "No SPF record was found", + EventType::Store(StoreEvent::AssertValueFailed) => { + "Another process modified the record" + } + EventType::Store(StoreEvent::FoundationdbError) => "A FoundationDB error occurred", + EventType::Store(StoreEvent::MysqlError) => "A MySQL error occurred", + EventType::Store(StoreEvent::PostgresqlError) => "A PostgreSQL error occurred", + EventType::Store(StoreEvent::RocksdbError) => "A RocksDB error occurred", + EventType::Store(StoreEvent::SqliteError) => "An SQLite error occurred", + EventType::Store(StoreEvent::LdapError) => "An LDAP error occurred", + EventType::Store(StoreEvent::ElasticsearchError) => "An ElasticSearch error occurred", + EventType::Store(StoreEvent::MeilisearchError) => "A Meilisearch error occurred", + EventType::Store(StoreEvent::RedisError) => "A Redis error occurred", + EventType::Store(StoreEvent::S3Error) => "An S3 error occurred", + EventType::Store(StoreEvent::AzureError) => "An Azure error occurred", + EventType::Store(StoreEvent::FilesystemError) => "A filesystem error occurred", + EventType::Store(StoreEvent::PoolError) => "A connection pool error occurred", + EventType::Store(StoreEvent::DataCorruption) => "Data corruption was detected", + EventType::Store(StoreEvent::DecompressError) => "A decompression error occurred", + EventType::Store(StoreEvent::DeserializeError) => "A deserialization error occurred", + EventType::Store(StoreEvent::NotFound) => "The record was not found in the database", + EventType::Store(StoreEvent::NotConfigured) => "The store is not configured", + EventType::Store(StoreEvent::NotSupported) => { + "The operation is not supported by the store" + } + EventType::Store(StoreEvent::UnexpectedError) => "An unexpected store error occurred", + EventType::Store(StoreEvent::CryptoError) => "A store crypto error occurred", + EventType::Store(StoreEvent::HttpStoreError) => { + "An error occurred while updating the HTTP store" + } + EventType::Store(StoreEvent::CacheMiss) => "No cache entry found for the account", + EventType::Store(StoreEvent::CacheHit) => { + "Cache entry found for the account, no update needed" + } + EventType::Store(StoreEvent::CacheStale) => "Cache is too old, rebuilding", + EventType::Store(StoreEvent::CacheUpdate) => { + "Cache updated with latest database changes" + } + EventType::Store(StoreEvent::BlobMissingMarker) => "The blob is missing a marker", + EventType::Store(StoreEvent::DataWrite) => "A write batch operation was executed", + EventType::Store(StoreEvent::DataIterate) => { + "A data store iteration operation was executed" + } + EventType::Store(StoreEvent::BlobRead) => "A blob read operation was executed", + EventType::Store(StoreEvent::BlobWrite) => "A blob write operation was executed", + EventType::Store(StoreEvent::BlobDelete) => "A blob delete operation was executed", + EventType::Store(StoreEvent::SqlQuery) => "An SQL query was executed", + EventType::Store(StoreEvent::LdapQuery) => "An LDAP query was executed", + EventType::Store(StoreEvent::LdapWarning) => "An LDAP authentication warning occurred", + EventType::Store(StoreEvent::HttpStoreFetch) => "The HTTP store was updated", + EventType::TaskQueue(TaskQueueEvent::TaskAcquired) => { + "A task has been acquired from the queue" + } + EventType::TaskQueue(TaskQueueEvent::TaskLocked) => { + "The task id is locked by another process" + } + EventType::TaskQueue(TaskQueueEvent::TaskIgnored) => { + "The task was ignored based on the current server roles" + } + EventType::TaskQueue(TaskQueueEvent::TaskFailed) => "The task failed during processing", + EventType::TaskQueue(TaskQueueEvent::BlobNotFound) => { + "The requested blob was not found for task" + } + EventType::TaskQueue(TaskQueueEvent::MetadataNotFound) => { + "The metadata was not found for task" + } + EventType::Telemetry(TelemetryEvent::Alert) => "An alert was triggered", + EventType::Telemetry(TelemetryEvent::LogError) => { + "An error occurred with the log collector" + } + EventType::Telemetry(TelemetryEvent::WebhookError) => { + "An error occurred with the webhook collector" + } + EventType::Telemetry(TelemetryEvent::OtelExporterError) => { + "An error occurred with the OpenTelemetry exporter" + } + EventType::Telemetry(TelemetryEvent::OtelMetricsExporterError) => { + "An error occurred with the OpenTelemetry metrics exporter" + } + EventType::Telemetry(TelemetryEvent::PrometheusExporterError) => { + "An error occurred with the Prometheus exporter" + } + EventType::Telemetry(TelemetryEvent::JournalError) => { + "An error occurred with the journal collector" + } + EventType::Tls(TlsEvent::Handshake) => "Successful TLS handshake", + EventType::Tls(TlsEvent::HandshakeError) => { + "An error occurred during the TLS handshake" + } + EventType::Tls(TlsEvent::NotConfigured) => "TLS is not configured", + EventType::Tls(TlsEvent::CertificateNotFound) => "The TLS certificate was not found", + EventType::Tls(TlsEvent::NoCertificatesAvailable) => { + "No TLS certificates are available" + } + EventType::Tls(TlsEvent::MultipleCertificatesAvailable) => { + "Multiple TLS certificates are available" + } + EventType::TlsRpt(TlsRptEvent::RecordFetch) => "The TLS-RPT record has been fetched", + EventType::TlsRpt(TlsRptEvent::RecordFetchError) => { + "An error occurred while fetching the TLS-RPT record" + } + EventType::TlsRpt(TlsRptEvent::RecordNotFound) => "No TLS-RPT records were found", + EventType::WebDav(WebDavEvent::Propfind) => { + "A PROPFIND request has been made to the server" + } + EventType::WebDav(WebDavEvent::Proppatch) => { + "A PROPPATCH request has been made to the server" + } + EventType::WebDav(WebDavEvent::Get) => "A GET request has been made to the server", + EventType::WebDav(WebDavEvent::Head) => "A HEAD request has been made to the server", + EventType::WebDav(WebDavEvent::Report) => { + "A REPORT request has been made to the server" + } + EventType::WebDav(WebDavEvent::Mkcol) => "A MKCOL request has been made to the server", + EventType::WebDav(WebDavEvent::Mkcalendar) => { + "A MKCALENDAR request has been made to the server" + } + EventType::WebDav(WebDavEvent::Delete) => { + "A DELETE request has been made to the server" + } + EventType::WebDav(WebDavEvent::Put) => "A PUT request has been made to the server", + EventType::WebDav(WebDavEvent::Post) => "A POST request has been made to the server", + EventType::WebDav(WebDavEvent::Patch) => "A PATCH request has been made to the server", + EventType::WebDav(WebDavEvent::Copy) => "A COPY request has been made to the server", + EventType::WebDav(WebDavEvent::Move) => "A MOVE request has been made to the server", + EventType::WebDav(WebDavEvent::Lock) => "A LOCK request has been made to the server", + EventType::WebDav(WebDavEvent::Unlock) => { + "An UNLOCK request has been made to the server" + } + EventType::WebDav(WebDavEvent::Acl) => "An ACL request has been made to the server", + EventType::WebDav(WebDavEvent::Options) => { + "An OPTIONS request has been made to the server" + } + EventType::WebDav(WebDavEvent::Error) => "An error occurred with the WebDAV request", + } + } + + pub fn message(&self) -> &'static str { + match self { + EventType::Auth(AuthEvent::Success) => "Authentication error", + EventType::Auth(AuthEvent::Failed) => "Authentication failed", + EventType::Auth(AuthEvent::TokenExpired) => "Authentication error", + EventType::Auth(AuthEvent::MissingTotp) => "A TOTP code is required to authenticate this account. Try authenticating again using 'secret$totp_token'.", + EventType::Auth(AuthEvent::TooManyAttempts) => "Too many authentication attempts", + EventType::Auth(AuthEvent::ClientRegistration) => "Authentication error", + EventType::Auth(AuthEvent::Error) => "Authentication error", + EventType::Config(ConfigEvent::ParseError) => "Configuration error", + EventType::Config(ConfigEvent::BuildError) => "Configuration error", + EventType::Config(ConfigEvent::MacroError) => "Configuration error", + EventType::Config(ConfigEvent::WriteError) => "Configuration error", + EventType::Config(ConfigEvent::FetchError) => "Configuration error", + EventType::Config(ConfigEvent::DefaultApplied) => "Configuration error", + EventType::Config(ConfigEvent::MissingSetting) => "Configuration error", + EventType::Config(ConfigEvent::UnusedSetting) => "Configuration error", + EventType::Config(ConfigEvent::ParseWarning) => "Configuration error", + EventType::Config(ConfigEvent::BuildWarning) => "Configuration error", + EventType::Config(ConfigEvent::ImportExternal) => "Configuration error", + EventType::Config(ConfigEvent::AlreadyUpToDate) => "Configuration error", + EventType::Imap(ImapEvent::ConnectionStart) => "IMAP error", + EventType::Imap(ImapEvent::ConnectionEnd) => "IMAP error", + EventType::Imap(ImapEvent::GetAcl) => "IMAP error", + EventType::Imap(ImapEvent::SetAcl) => "IMAP error", + EventType::Imap(ImapEvent::MyRights) => "IMAP error", + EventType::Imap(ImapEvent::ListRights) => "IMAP error", + EventType::Imap(ImapEvent::Append) => "IMAP error", + EventType::Imap(ImapEvent::Capabilities) => "IMAP error", + EventType::Imap(ImapEvent::Id) => "IMAP error", + EventType::Imap(ImapEvent::Close) => "IMAP error", + EventType::Imap(ImapEvent::Copy) => "IMAP error", + EventType::Imap(ImapEvent::Move) => "IMAP error", + EventType::Imap(ImapEvent::CreateMailbox) => "IMAP error", + EventType::Imap(ImapEvent::DeleteMailbox) => "IMAP error", + EventType::Imap(ImapEvent::RenameMailbox) => "IMAP error", + EventType::Imap(ImapEvent::Enable) => "IMAP error", + EventType::Imap(ImapEvent::Expunge) => "IMAP error", + EventType::Imap(ImapEvent::Fetch) => "IMAP error", + EventType::Imap(ImapEvent::IdleStart) => "IMAP error", + EventType::Imap(ImapEvent::IdleStop) => "IMAP error", + EventType::Imap(ImapEvent::List) => "IMAP error", + EventType::Imap(ImapEvent::Lsub) => "IMAP error", + EventType::Imap(ImapEvent::Logout) => "IMAP error", + EventType::Imap(ImapEvent::Namespace) => "IMAP error", + EventType::Imap(ImapEvent::Noop) => "IMAP error", + EventType::Imap(ImapEvent::Search) => "IMAP error", + EventType::Imap(ImapEvent::Sort) => "IMAP error", + EventType::Imap(ImapEvent::Select) => "IMAP error", + EventType::Imap(ImapEvent::Status) => "IMAP error", + EventType::Imap(ImapEvent::Store) => "IMAP error", + EventType::Imap(ImapEvent::Subscribe) => "IMAP error", + EventType::Imap(ImapEvent::Unsubscribe) => "IMAP error", + EventType::Imap(ImapEvent::Thread) => "IMAP error", + EventType::Imap(ImapEvent::GetQuota) => "IMAP error", + EventType::Imap(ImapEvent::Error) => "IMAP error", + EventType::Imap(ImapEvent::RawInput) => "IMAP error", + EventType::Imap(ImapEvent::RawOutput) => "IMAP error", + EventType::Jmap(JmapEvent::MethodCall) => "Other message", + EventType::Jmap(JmapEvent::InvalidArguments) => "Invalid arguments", + EventType::Jmap(JmapEvent::RequestTooLarge) => "Request too large", + EventType::Jmap(JmapEvent::StateMismatch) => "State mismatch", + EventType::Jmap(JmapEvent::AnchorNotFound) => "Anchor not found", + EventType::Jmap(JmapEvent::UnsupportedFilter) => "Unsupported filter", + EventType::Jmap(JmapEvent::UnsupportedSort) => "Unsupported sort", + EventType::Jmap(JmapEvent::UnknownMethod) => "Unknown method", + EventType::Jmap(JmapEvent::InvalidResultReference) => "Invalid result reference", + EventType::Jmap(JmapEvent::Forbidden) => "Forbidden", + EventType::Jmap(JmapEvent::AccountNotFound) => "Account not found", + EventType::Jmap(JmapEvent::AccountNotSupportedByMethod) => "Account not supported by method", + EventType::Jmap(JmapEvent::AccountReadOnly) => "Account read-only", + EventType::Jmap(JmapEvent::NotFound) => "Not found", + EventType::Jmap(JmapEvent::CannotCalculateChanges) => "Cannot calculate changes", + EventType::Jmap(JmapEvent::UnknownDataType) => "Unknown data type", + EventType::Jmap(JmapEvent::UnknownCapability) => "Unknown capability", + EventType::Jmap(JmapEvent::NotJson) => "Not JSON", + EventType::Jmap(JmapEvent::NotRequest) => "Not a request", + EventType::Jmap(JmapEvent::WebsocketStart) => "Other message", + EventType::Jmap(JmapEvent::WebsocketStop) => "Other message", + EventType::Jmap(JmapEvent::WebsocketError) => "Other message", + EventType::Limit(LimitEvent::SizeRequest) => "Request too large", + EventType::Limit(LimitEvent::SizeUpload) => "Upload too large", + EventType::Limit(LimitEvent::CallsIn) => "Too many calls in", + EventType::Limit(LimitEvent::ConcurrentRequest) => "Too many concurrent requests", + EventType::Limit(LimitEvent::ConcurrentUpload) => "Too many concurrent uploads", + EventType::Limit(LimitEvent::ConcurrentConnection) => "Too many concurrent connections", + EventType::Limit(LimitEvent::Quota) => "Quota exceeded", + EventType::Limit(LimitEvent::BlobQuota) => "Blob quota exceeded", + EventType::Limit(LimitEvent::TenantQuota) => "Tenant quota exceeded", + EventType::Limit(LimitEvent::TooManyRequests) => "Too many requests", + EventType::Manage(ManageEvent::MissingParameter) => "Missing parameter", + EventType::Manage(ManageEvent::AlreadyExists) => "Already exists", + EventType::Manage(ManageEvent::AssertFailed) => "Assertion failed", + EventType::Manage(ManageEvent::NotFound) => "Not found", + EventType::Manage(ManageEvent::NotSupported) => "Operation not supported", + EventType::Manage(ManageEvent::Error) => "Management API Error", + EventType::ManageSieve(ManageSieveEvent::ConnectionStart) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::ConnectionEnd) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::CreateScript) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::UpdateScript) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::GetScript) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::DeleteScript) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::RenameScript) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::CheckScript) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::HaveSpace) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::ListScripts) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::SetActive) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::Capabilities) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::StartTls) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::Unauthenticate) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::Logout) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::Noop) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::Error) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::RawInput) => "ManageSieve error", + EventType::ManageSieve(ManageSieveEvent::RawOutput) => "ManageSieve error", + EventType::Network(NetworkEvent::ListenStart) => "Network error", + EventType::Network(NetworkEvent::ListenStop) => "Network error", + EventType::Network(NetworkEvent::ListenError) => "Network error", + EventType::Network(NetworkEvent::BindError) => "Network error", + EventType::Network(NetworkEvent::ReadError) => "Network error", + EventType::Network(NetworkEvent::WriteError) => "Network error", + EventType::Network(NetworkEvent::FlushError) => "Network error", + EventType::Network(NetworkEvent::AcceptError) => "Network error", + EventType::Network(NetworkEvent::SplitError) => "Network error", + EventType::Network(NetworkEvent::Timeout) => "Network error", + EventType::Network(NetworkEvent::Closed) => "Network error", + EventType::Network(NetworkEvent::ProxyError) => "Network error", + EventType::Network(NetworkEvent::SetOptError) => "Network error", + EventType::Pop3(Pop3Event::ConnectionStart) => "POP3 error", + EventType::Pop3(Pop3Event::ConnectionEnd) => "POP3 error", + EventType::Pop3(Pop3Event::Delete) => "POP3 error", + EventType::Pop3(Pop3Event::Reset) => "POP3 error", + EventType::Pop3(Pop3Event::Quit) => "POP3 error", + EventType::Pop3(Pop3Event::Fetch) => "POP3 error", + EventType::Pop3(Pop3Event::List) => "POP3 error", + EventType::Pop3(Pop3Event::ListMessage) => "POP3 error", + EventType::Pop3(Pop3Event::Uidl) => "POP3 error", + EventType::Pop3(Pop3Event::UidlMessage) => "POP3 error", + EventType::Pop3(Pop3Event::Stat) => "POP3 error", + EventType::Pop3(Pop3Event::Noop) => "POP3 error", + EventType::Pop3(Pop3Event::Capabilities) => "POP3 error", + EventType::Pop3(Pop3Event::StartTls) => "POP3 error", + EventType::Pop3(Pop3Event::Utf8) => "POP3 error", + EventType::Pop3(Pop3Event::Error) => "POP3 error", + EventType::Pop3(Pop3Event::RawInput) => "POP3 error", + EventType::Pop3(Pop3Event::RawOutput) => "POP3 error", + EventType::Resource(ResourceEvent::NotFound) => "Not found", + EventType::Resource(ResourceEvent::BadParameters) => "Bad parameters", + EventType::Resource(ResourceEvent::Error) => "Resource error", + EventType::Resource(ResourceEvent::DownloadExternal) => "Other status", + EventType::Resource(ResourceEvent::WebadminUnpacked) => "Other status", + EventType::Security(SecurityEvent::AuthenticationBan) => "Insufficient permissions", + EventType::Security(SecurityEvent::AbuseBan) => "Insufficient permissions", + EventType::Security(SecurityEvent::ScanBan) => "Insufficient permissions", + EventType::Security(SecurityEvent::LoiterBan) => "Insufficient permissions", + EventType::Security(SecurityEvent::IpBlocked) => "Insufficient permissions", + EventType::Security(SecurityEvent::Unauthorized) => "Insufficient permissions", + EventType::Smtp(SmtpEvent::ConnectionStart) => "SMTP error", + EventType::Smtp(SmtpEvent::ConnectionEnd) => "SMTP error", + EventType::Smtp(SmtpEvent::Error) => "SMTP error", + EventType::Smtp(SmtpEvent::IdNotFound) => "SMTP error", + EventType::Smtp(SmtpEvent::ConcurrencyLimitExceeded) => "SMTP error", + EventType::Smtp(SmtpEvent::TransferLimitExceeded) => "SMTP error", + EventType::Smtp(SmtpEvent::RateLimitExceeded) => "SMTP error", + EventType::Smtp(SmtpEvent::TimeLimitExceeded) => "SMTP error", + EventType::Smtp(SmtpEvent::MissingAuthDirectory) => "SMTP error", + EventType::Smtp(SmtpEvent::MessageParseFailed) => "SMTP error", + EventType::Smtp(SmtpEvent::MessageTooLarge) => "SMTP error", + EventType::Smtp(SmtpEvent::LoopDetected) => "SMTP error", + EventType::Smtp(SmtpEvent::DkimPass) => "SMTP error", + EventType::Smtp(SmtpEvent::DkimFail) => "SMTP error", + EventType::Smtp(SmtpEvent::ArcPass) => "SMTP error", + EventType::Smtp(SmtpEvent::ArcFail) => "SMTP error", + EventType::Smtp(SmtpEvent::SpfEhloPass) => "SMTP error", + EventType::Smtp(SmtpEvent::SpfEhloFail) => "SMTP error", + EventType::Smtp(SmtpEvent::SpfFromPass) => "SMTP error", + EventType::Smtp(SmtpEvent::SpfFromFail) => "SMTP error", + EventType::Smtp(SmtpEvent::DmarcPass) => "SMTP error", + EventType::Smtp(SmtpEvent::DmarcFail) => "SMTP error", + EventType::Smtp(SmtpEvent::IprevPass) => "SMTP error", + EventType::Smtp(SmtpEvent::IprevFail) => "SMTP error", + EventType::Smtp(SmtpEvent::TooManyMessages) => "SMTP error", + EventType::Smtp(SmtpEvent::Ehlo) => "SMTP error", + EventType::Smtp(SmtpEvent::InvalidEhlo) => "SMTP error", + EventType::Smtp(SmtpEvent::DidNotSayEhlo) => "SMTP error", + EventType::Smtp(SmtpEvent::EhloExpected) => "SMTP error", + EventType::Smtp(SmtpEvent::LhloExpected) => "SMTP error", + EventType::Smtp(SmtpEvent::MailFromUnauthenticated) => "SMTP error", + EventType::Smtp(SmtpEvent::MailFromUnauthorized) => "SMTP error", + EventType::Smtp(SmtpEvent::MailFromNotAllowed) => "SMTP error", + EventType::Smtp(SmtpEvent::MailFromRewritten) => "SMTP error", + EventType::Smtp(SmtpEvent::MailFromMissing) => "SMTP error", + EventType::Smtp(SmtpEvent::MailFrom) => "SMTP error", + EventType::Smtp(SmtpEvent::MultipleMailFrom) => "SMTP error", + EventType::Smtp(SmtpEvent::MailboxDoesNotExist) => "SMTP error", + EventType::Smtp(SmtpEvent::RelayNotAllowed) => "SMTP error", + EventType::Smtp(SmtpEvent::RcptTo) => "SMTP error", + EventType::Smtp(SmtpEvent::RcptToDuplicate) => "SMTP error", + EventType::Smtp(SmtpEvent::RcptToRewritten) => "SMTP error", + EventType::Smtp(SmtpEvent::RcptToMissing) => "SMTP error", + EventType::Smtp(SmtpEvent::RcptToGreylisted) => "SMTP error", + EventType::Smtp(SmtpEvent::TooManyRecipients) => "SMTP error", + EventType::Smtp(SmtpEvent::TooManyInvalidRcpt) => "SMTP error", + EventType::Smtp(SmtpEvent::RawInput) => "SMTP error", + EventType::Smtp(SmtpEvent::RawOutput) => "SMTP error", + EventType::Smtp(SmtpEvent::MissingLocalHostname) => "SMTP error", + EventType::Smtp(SmtpEvent::Vrfy) => "SMTP error", + EventType::Smtp(SmtpEvent::VrfyNotFound) => "SMTP error", + EventType::Smtp(SmtpEvent::VrfyDisabled) => "SMTP error", + EventType::Smtp(SmtpEvent::Expn) => "SMTP error", + EventType::Smtp(SmtpEvent::ExpnNotFound) => "SMTP error", + EventType::Smtp(SmtpEvent::ExpnDisabled) => "SMTP error", + EventType::Smtp(SmtpEvent::RequireTlsDisabled) => "SMTP error", + EventType::Smtp(SmtpEvent::DeliverByDisabled) => "SMTP error", + EventType::Smtp(SmtpEvent::DeliverByInvalid) => "SMTP error", + EventType::Smtp(SmtpEvent::FutureReleaseDisabled) => "SMTP error", + EventType::Smtp(SmtpEvent::FutureReleaseInvalid) => "SMTP error", + EventType::Smtp(SmtpEvent::MtPriorityDisabled) => "SMTP error", + EventType::Smtp(SmtpEvent::MtPriorityInvalid) => "SMTP error", + EventType::Smtp(SmtpEvent::DsnDisabled) => "SMTP error", + EventType::Smtp(SmtpEvent::AuthNotAllowed) => "SMTP error", + EventType::Smtp(SmtpEvent::AuthMechanismNotSupported) => "SMTP error", + EventType::Smtp(SmtpEvent::AuthExchangeTooLong) => "SMTP error", + EventType::Smtp(SmtpEvent::AlreadyAuthenticated) => "SMTP error", + EventType::Smtp(SmtpEvent::Noop) => "SMTP error", + EventType::Smtp(SmtpEvent::StartTls) => "SMTP error", + EventType::Smtp(SmtpEvent::StartTlsUnavailable) => "SMTP error", + EventType::Smtp(SmtpEvent::StartTlsAlready) => "SMTP error", + EventType::Smtp(SmtpEvent::Rset) => "SMTP error", + EventType::Smtp(SmtpEvent::Quit) => "SMTP error", + EventType::Smtp(SmtpEvent::Help) => "SMTP error", + EventType::Smtp(SmtpEvent::CommandNotImplemented) => "SMTP error", + EventType::Smtp(SmtpEvent::InvalidCommand) => "SMTP error", + EventType::Smtp(SmtpEvent::InvalidSenderAddress) => "SMTP error", + EventType::Smtp(SmtpEvent::InvalidRecipientAddress) => "SMTP error", + EventType::Smtp(SmtpEvent::InvalidParameter) => "SMTP error", + EventType::Smtp(SmtpEvent::UnsupportedParameter) => "SMTP error", + EventType::Smtp(SmtpEvent::SyntaxError) => "SMTP error", + EventType::Smtp(SmtpEvent::RequestTooLarge) => "SMTP error", + EventType::Store(StoreEvent::AssertValueFailed) => "Another process has modified the value", + EventType::Store(StoreEvent::FoundationdbError) => "FoundationDB error", + EventType::Store(StoreEvent::MysqlError) => "MySQL error", + EventType::Store(StoreEvent::PostgresqlError) => "PostgreSQL error", + EventType::Store(StoreEvent::RocksdbError) => "RocksDB error", + EventType::Store(StoreEvent::SqliteError) => "SQLite error", + EventType::Store(StoreEvent::LdapError) => "LDAP error", + EventType::Store(StoreEvent::ElasticsearchError) => "ElasticSearch error", + EventType::Store(StoreEvent::MeilisearchError) => "Store error", + EventType::Store(StoreEvent::RedisError) => "Redis error", + EventType::Store(StoreEvent::S3Error) => "S3 error", + EventType::Store(StoreEvent::AzureError) => "Azure error", + EventType::Store(StoreEvent::FilesystemError) => "Filesystem error", + EventType::Store(StoreEvent::PoolError) => "Connection pool error", + EventType::Store(StoreEvent::DataCorruption) => "Data corruption", + EventType::Store(StoreEvent::DecompressError) => "Decompression error", + EventType::Store(StoreEvent::DeserializeError) => "Deserialization error", + EventType::Store(StoreEvent::NotFound) => "Not found", + EventType::Store(StoreEvent::NotConfigured) => "Not configured", + EventType::Store(StoreEvent::NotSupported) => "Operation not supported", + EventType::Store(StoreEvent::UnexpectedError) => "Unexpected error", + EventType::Store(StoreEvent::CryptoError) => "Crypto error", + EventType::Store(StoreEvent::HttpStoreError) => "Store error", + EventType::Store(StoreEvent::CacheMiss) => "Store error", + EventType::Store(StoreEvent::CacheHit) => "Store error", + EventType::Store(StoreEvent::CacheStale) => "Store error", + EventType::Store(StoreEvent::CacheUpdate) => "Store error", + EventType::Store(StoreEvent::BlobMissingMarker) => "Blob is missing marker", + EventType::Store(StoreEvent::DataWrite) => "Store error", + EventType::Store(StoreEvent::DataIterate) => "Store error", + EventType::Store(StoreEvent::BlobRead) => "Store error", + EventType::Store(StoreEvent::BlobWrite) => "Store error", + EventType::Store(StoreEvent::BlobDelete) => "Store error", + EventType::Store(StoreEvent::SqlQuery) => "Store error", + EventType::Store(StoreEvent::LdapQuery) => "Store error", + EventType::Store(StoreEvent::LdapWarning) => "Store error", + EventType::Store(StoreEvent::HttpStoreFetch) => "Store error", + _ => "Internal Server Error", + } + } + + pub const fn variants() -> &'static [Self] { + &[ + EventType::Acme(AcmeEvent::AuthStart), + EventType::Acme(AcmeEvent::AuthPending), + EventType::Acme(AcmeEvent::AuthValid), + EventType::Acme(AcmeEvent::AuthCompleted), + EventType::Acme(AcmeEvent::AuthError), + EventType::Acme(AcmeEvent::AuthTooManyAttempts), + EventType::Acme(AcmeEvent::ProcessCert), + EventType::Acme(AcmeEvent::OrderStart), + EventType::Acme(AcmeEvent::OrderProcessing), + EventType::Acme(AcmeEvent::OrderCompleted), + EventType::Acme(AcmeEvent::OrderReady), + EventType::Acme(AcmeEvent::OrderValid), + EventType::Acme(AcmeEvent::OrderInvalid), + EventType::Acme(AcmeEvent::RenewBackoff), + EventType::Acme(AcmeEvent::ClientSuppliedSni), + EventType::Acme(AcmeEvent::ClientMissingSni), + EventType::Acme(AcmeEvent::TlsAlpnReceived), + EventType::Acme(AcmeEvent::TlsAlpnError), + EventType::Acme(AcmeEvent::TokenNotFound), + EventType::Acme(AcmeEvent::Error), + EventType::Ai(AiEvent::LlmResponse), + EventType::Ai(AiEvent::ApiError), + EventType::Arc(ArcEvent::ChainTooLong), + EventType::Arc(ArcEvent::InvalidInstance), + EventType::Arc(ArcEvent::InvalidCv), + EventType::Arc(ArcEvent::HasHeaderTag), + EventType::Arc(ArcEvent::BrokenChain), + EventType::Arc(ArcEvent::SealerNotFound), + EventType::Auth(AuthEvent::Success), + EventType::Auth(AuthEvent::Failed), + EventType::Auth(AuthEvent::TokenExpired), + EventType::Auth(AuthEvent::MissingTotp), + EventType::Auth(AuthEvent::TooManyAttempts), + EventType::Auth(AuthEvent::ClientRegistration), + EventType::Auth(AuthEvent::Error), + EventType::Calendar(CalendarEvent::RuleExpansionError), + EventType::Calendar(CalendarEvent::AlarmSent), + EventType::Calendar(CalendarEvent::AlarmSkipped), + EventType::Calendar(CalendarEvent::AlarmRecipientOverride), + EventType::Calendar(CalendarEvent::AlarmFailed), + EventType::Calendar(CalendarEvent::ItipMessageSent), + EventType::Calendar(CalendarEvent::ItipMessageReceived), + EventType::Calendar(CalendarEvent::ItipMessageError), + EventType::Cluster(ClusterEvent::SubscriberStart), + EventType::Cluster(ClusterEvent::SubscriberStop), + EventType::Cluster(ClusterEvent::SubscriberError), + EventType::Cluster(ClusterEvent::SubscriberDisconnected), + EventType::Cluster(ClusterEvent::PublisherStart), + EventType::Cluster(ClusterEvent::PublisherStop), + EventType::Cluster(ClusterEvent::PublisherError), + EventType::Cluster(ClusterEvent::MessageReceived), + EventType::Cluster(ClusterEvent::MessageSkipped), + EventType::Cluster(ClusterEvent::MessageInvalid), + EventType::Config(ConfigEvent::ParseError), + EventType::Config(ConfigEvent::BuildError), + EventType::Config(ConfigEvent::MacroError), + EventType::Config(ConfigEvent::WriteError), + EventType::Config(ConfigEvent::FetchError), + EventType::Config(ConfigEvent::DefaultApplied), + EventType::Config(ConfigEvent::MissingSetting), + EventType::Config(ConfigEvent::UnusedSetting), + EventType::Config(ConfigEvent::ParseWarning), + EventType::Config(ConfigEvent::BuildWarning), + EventType::Config(ConfigEvent::ImportExternal), + EventType::Config(ConfigEvent::AlreadyUpToDate), + EventType::Dane(DaneEvent::AuthenticationSuccess), + EventType::Dane(DaneEvent::AuthenticationFailure), + EventType::Dane(DaneEvent::NoCertificatesFound), + EventType::Dane(DaneEvent::CertificateParseError), + EventType::Dane(DaneEvent::TlsaRecordMatch), + EventType::Dane(DaneEvent::TlsaRecordFetch), + EventType::Dane(DaneEvent::TlsaRecordFetchError), + EventType::Dane(DaneEvent::TlsaRecordNotFound), + EventType::Dane(DaneEvent::TlsaRecordNotDnssecSigned), + EventType::Dane(DaneEvent::TlsaRecordInvalid), + EventType::Delivery(DeliveryEvent::AttemptStart), + EventType::Delivery(DeliveryEvent::AttemptEnd), + EventType::Delivery(DeliveryEvent::Completed), + EventType::Delivery(DeliveryEvent::Failed), + EventType::Delivery(DeliveryEvent::DomainDeliveryStart), + EventType::Delivery(DeliveryEvent::MxLookup), + EventType::Delivery(DeliveryEvent::MxLookupFailed), + EventType::Delivery(DeliveryEvent::IpLookup), + EventType::Delivery(DeliveryEvent::IpLookupFailed), + EventType::Delivery(DeliveryEvent::NullMx), + EventType::Delivery(DeliveryEvent::Connect), + EventType::Delivery(DeliveryEvent::ConnectError), + EventType::Delivery(DeliveryEvent::MissingOutboundHostname), + EventType::Delivery(DeliveryEvent::GreetingFailed), + EventType::Delivery(DeliveryEvent::Ehlo), + EventType::Delivery(DeliveryEvent::EhloRejected), + EventType::Delivery(DeliveryEvent::Auth), + EventType::Delivery(DeliveryEvent::AuthFailed), + EventType::Delivery(DeliveryEvent::MailFrom), + EventType::Delivery(DeliveryEvent::MailFromRejected), + EventType::Delivery(DeliveryEvent::Delivered), + EventType::Delivery(DeliveryEvent::RcptTo), + EventType::Delivery(DeliveryEvent::RcptToRejected), + EventType::Delivery(DeliveryEvent::RcptToFailed), + EventType::Delivery(DeliveryEvent::MessageRejected), + EventType::Delivery(DeliveryEvent::StartTls), + EventType::Delivery(DeliveryEvent::StartTlsUnavailable), + EventType::Delivery(DeliveryEvent::StartTlsError), + EventType::Delivery(DeliveryEvent::StartTlsDisabled), + EventType::Delivery(DeliveryEvent::ImplicitTlsError), + EventType::Delivery(DeliveryEvent::ConcurrencyLimitExceeded), + EventType::Delivery(DeliveryEvent::RateLimitExceeded), + EventType::Delivery(DeliveryEvent::DoubleBounce), + EventType::Delivery(DeliveryEvent::DsnSuccess), + EventType::Delivery(DeliveryEvent::DsnTempFail), + EventType::Delivery(DeliveryEvent::DsnPermFail), + EventType::Delivery(DeliveryEvent::RawInput), + EventType::Delivery(DeliveryEvent::RawOutput), + EventType::Dkim(DkimEvent::Pass), + EventType::Dkim(DkimEvent::Neutral), + EventType::Dkim(DkimEvent::Fail), + EventType::Dkim(DkimEvent::PermError), + EventType::Dkim(DkimEvent::TempError), + EventType::Dkim(DkimEvent::None), + EventType::Dkim(DkimEvent::UnsupportedVersion), + EventType::Dkim(DkimEvent::UnsupportedAlgorithm), + EventType::Dkim(DkimEvent::UnsupportedCanonicalization), + EventType::Dkim(DkimEvent::UnsupportedKeyType), + EventType::Dkim(DkimEvent::FailedBodyHashMatch), + EventType::Dkim(DkimEvent::FailedVerification), + EventType::Dkim(DkimEvent::FailedAuidMatch), + EventType::Dkim(DkimEvent::RevokedPublicKey), + EventType::Dkim(DkimEvent::IncompatibleAlgorithms), + EventType::Dkim(DkimEvent::SignatureExpired), + EventType::Dkim(DkimEvent::SignatureLength), + EventType::Dkim(DkimEvent::SignerNotFound), + EventType::Dkim(DkimEvent::BuildError), + EventType::Dmarc(DmarcEvent::Pass), + EventType::Dmarc(DmarcEvent::Fail), + EventType::Dmarc(DmarcEvent::PermError), + EventType::Dmarc(DmarcEvent::TempError), + EventType::Dmarc(DmarcEvent::None), + EventType::Dns(DnsEvent::RecordCreated), + EventType::Dns(DnsEvent::RecordCreationFailed), + EventType::Dns(DnsEvent::RecordDeletionFailed), + EventType::Dns(DnsEvent::RecordNotPropagated), + EventType::Dns(DnsEvent::RecordLookupFailed), + EventType::Dns(DnsEvent::RecordPropagated), + EventType::Dns(DnsEvent::RecordPropagationTimeout), + EventType::Dns(DnsEvent::BuildError), + EventType::Eval(EvalEvent::Result), + EventType::Eval(EvalEvent::Error), + EventType::Eval(EvalEvent::DirectoryNotFound), + EventType::Eval(EvalEvent::StoreNotFound), + EventType::Housekeeper(HousekeeperEvent::Start), + EventType::Housekeeper(HousekeeperEvent::Stop), + EventType::Housekeeper(HousekeeperEvent::Schedule), + EventType::Housekeeper(HousekeeperEvent::Run), + EventType::Http(HttpEvent::ConnectionStart), + EventType::Http(HttpEvent::ConnectionEnd), + EventType::Http(HttpEvent::Error), + EventType::Http(HttpEvent::RequestUrl), + EventType::Http(HttpEvent::RequestBody), + EventType::Http(HttpEvent::ResponseBody), + EventType::Http(HttpEvent::XForwardedMissing), + EventType::Imap(ImapEvent::ConnectionStart), + EventType::Imap(ImapEvent::ConnectionEnd), + EventType::Imap(ImapEvent::GetAcl), + EventType::Imap(ImapEvent::SetAcl), + EventType::Imap(ImapEvent::MyRights), + EventType::Imap(ImapEvent::ListRights), + EventType::Imap(ImapEvent::Append), + EventType::Imap(ImapEvent::Capabilities), + EventType::Imap(ImapEvent::Id), + EventType::Imap(ImapEvent::Close), + EventType::Imap(ImapEvent::Copy), + EventType::Imap(ImapEvent::Move), + EventType::Imap(ImapEvent::CreateMailbox), + EventType::Imap(ImapEvent::DeleteMailbox), + EventType::Imap(ImapEvent::RenameMailbox), + EventType::Imap(ImapEvent::Enable), + EventType::Imap(ImapEvent::Expunge), + EventType::Imap(ImapEvent::Fetch), + EventType::Imap(ImapEvent::IdleStart), + EventType::Imap(ImapEvent::IdleStop), + EventType::Imap(ImapEvent::List), + EventType::Imap(ImapEvent::Lsub), + EventType::Imap(ImapEvent::Logout), + EventType::Imap(ImapEvent::Namespace), + EventType::Imap(ImapEvent::Noop), + EventType::Imap(ImapEvent::Search), + EventType::Imap(ImapEvent::Sort), + EventType::Imap(ImapEvent::Select), + EventType::Imap(ImapEvent::Status), + EventType::Imap(ImapEvent::Store), + EventType::Imap(ImapEvent::Subscribe), + EventType::Imap(ImapEvent::Unsubscribe), + EventType::Imap(ImapEvent::Thread), + EventType::Imap(ImapEvent::GetQuota), + EventType::Imap(ImapEvent::Error), + EventType::Imap(ImapEvent::RawInput), + EventType::Imap(ImapEvent::RawOutput), + EventType::IncomingReport(IncomingReportEvent::DmarcReport), + EventType::IncomingReport(IncomingReportEvent::DmarcReportWithWarnings), + EventType::IncomingReport(IncomingReportEvent::TlsReport), + EventType::IncomingReport(IncomingReportEvent::TlsReportWithWarnings), + EventType::IncomingReport(IncomingReportEvent::AbuseReport), + EventType::IncomingReport(IncomingReportEvent::AuthFailureReport), + EventType::IncomingReport(IncomingReportEvent::FraudReport), + EventType::IncomingReport(IncomingReportEvent::NotSpamReport), + EventType::IncomingReport(IncomingReportEvent::VirusReport), + EventType::IncomingReport(IncomingReportEvent::OtherReport), + EventType::IncomingReport(IncomingReportEvent::MessageParseFailed), + EventType::IncomingReport(IncomingReportEvent::DmarcParseFailed), + EventType::IncomingReport(IncomingReportEvent::TlsRpcParseFailed), + EventType::IncomingReport(IncomingReportEvent::ArfParseFailed), + EventType::IncomingReport(IncomingReportEvent::DecompressError), + EventType::Iprev(IprevEvent::Pass), + EventType::Iprev(IprevEvent::Fail), + EventType::Iprev(IprevEvent::PermError), + EventType::Iprev(IprevEvent::TempError), + EventType::Iprev(IprevEvent::None), + EventType::Jmap(JmapEvent::MethodCall), + EventType::Jmap(JmapEvent::InvalidArguments), + EventType::Jmap(JmapEvent::RequestTooLarge), + EventType::Jmap(JmapEvent::StateMismatch), + EventType::Jmap(JmapEvent::AnchorNotFound), + EventType::Jmap(JmapEvent::UnsupportedFilter), + EventType::Jmap(JmapEvent::UnsupportedSort), + EventType::Jmap(JmapEvent::UnknownMethod), + EventType::Jmap(JmapEvent::InvalidResultReference), + EventType::Jmap(JmapEvent::Forbidden), + EventType::Jmap(JmapEvent::AccountNotFound), + EventType::Jmap(JmapEvent::AccountNotSupportedByMethod), + EventType::Jmap(JmapEvent::AccountReadOnly), + EventType::Jmap(JmapEvent::NotFound), + EventType::Jmap(JmapEvent::CannotCalculateChanges), + EventType::Jmap(JmapEvent::UnknownDataType), + EventType::Jmap(JmapEvent::UnknownCapability), + EventType::Jmap(JmapEvent::NotJson), + EventType::Jmap(JmapEvent::NotRequest), + EventType::Jmap(JmapEvent::WebsocketStart), + EventType::Jmap(JmapEvent::WebsocketStop), + EventType::Jmap(JmapEvent::WebsocketError), + EventType::Limit(LimitEvent::SizeRequest), + EventType::Limit(LimitEvent::SizeUpload), + EventType::Limit(LimitEvent::CallsIn), + EventType::Limit(LimitEvent::ConcurrentRequest), + EventType::Limit(LimitEvent::ConcurrentUpload), + EventType::Limit(LimitEvent::ConcurrentConnection), + EventType::Limit(LimitEvent::Quota), + EventType::Limit(LimitEvent::BlobQuota), + EventType::Limit(LimitEvent::TenantQuota), + EventType::Limit(LimitEvent::TooManyRequests), + EventType::MailAuth(MailAuthEvent::ParseError), + EventType::MailAuth(MailAuthEvent::MissingParameters), + EventType::MailAuth(MailAuthEvent::NoHeadersFound), + EventType::MailAuth(MailAuthEvent::Crypto), + EventType::MailAuth(MailAuthEvent::Io), + EventType::MailAuth(MailAuthEvent::Base64), + EventType::MailAuth(MailAuthEvent::DnsError), + EventType::MailAuth(MailAuthEvent::DnsRecordNotFound), + EventType::MailAuth(MailAuthEvent::DnsInvalidRecordType), + EventType::MailAuth(MailAuthEvent::PolicyNotAligned), + EventType::Manage(ManageEvent::MissingParameter), + EventType::Manage(ManageEvent::AlreadyExists), + EventType::Manage(ManageEvent::AssertFailed), + EventType::Manage(ManageEvent::NotFound), + EventType::Manage(ManageEvent::NotSupported), + EventType::Manage(ManageEvent::Error), + EventType::ManageSieve(ManageSieveEvent::ConnectionStart), + EventType::ManageSieve(ManageSieveEvent::ConnectionEnd), + EventType::ManageSieve(ManageSieveEvent::CreateScript), + EventType::ManageSieve(ManageSieveEvent::UpdateScript), + EventType::ManageSieve(ManageSieveEvent::GetScript), + EventType::ManageSieve(ManageSieveEvent::DeleteScript), + EventType::ManageSieve(ManageSieveEvent::RenameScript), + EventType::ManageSieve(ManageSieveEvent::CheckScript), + EventType::ManageSieve(ManageSieveEvent::HaveSpace), + EventType::ManageSieve(ManageSieveEvent::ListScripts), + EventType::ManageSieve(ManageSieveEvent::SetActive), + EventType::ManageSieve(ManageSieveEvent::Capabilities), + EventType::ManageSieve(ManageSieveEvent::StartTls), + EventType::ManageSieve(ManageSieveEvent::Unauthenticate), + EventType::ManageSieve(ManageSieveEvent::Logout), + EventType::ManageSieve(ManageSieveEvent::Noop), + EventType::ManageSieve(ManageSieveEvent::Error), + EventType::ManageSieve(ManageSieveEvent::RawInput), + EventType::ManageSieve(ManageSieveEvent::RawOutput), + EventType::MessageIngest(MessageIngestEvent::Ham), + EventType::MessageIngest(MessageIngestEvent::Spam), + EventType::MessageIngest(MessageIngestEvent::ImapAppend), + EventType::MessageIngest(MessageIngestEvent::JmapAppend), + EventType::MessageIngest(MessageIngestEvent::Duplicate), + EventType::MessageIngest(MessageIngestEvent::Error), + EventType::MessageIngest(MessageIngestEvent::FtsIndex), + EventType::Milter(MilterEvent::Read), + EventType::Milter(MilterEvent::Write), + EventType::Milter(MilterEvent::ActionAccept), + EventType::Milter(MilterEvent::ActionDiscard), + EventType::Milter(MilterEvent::ActionReject), + EventType::Milter(MilterEvent::ActionTempFail), + EventType::Milter(MilterEvent::ActionReplyCode), + EventType::Milter(MilterEvent::ActionConnectionFailure), + EventType::Milter(MilterEvent::ActionShutdown), + EventType::Milter(MilterEvent::IoError), + EventType::Milter(MilterEvent::FrameTooLarge), + EventType::Milter(MilterEvent::FrameInvalid), + EventType::Milter(MilterEvent::UnexpectedResponse), + EventType::Milter(MilterEvent::Timeout), + EventType::Milter(MilterEvent::TlsInvalidName), + EventType::Milter(MilterEvent::Disconnected), + EventType::Milter(MilterEvent::ParseError), + EventType::MtaHook(MtaHookEvent::ActionAccept), + EventType::MtaHook(MtaHookEvent::ActionDiscard), + EventType::MtaHook(MtaHookEvent::ActionReject), + EventType::MtaHook(MtaHookEvent::ActionQuarantine), + EventType::MtaHook(MtaHookEvent::Error), + EventType::MtaSts(MtaStsEvent::Authorized), + EventType::MtaSts(MtaStsEvent::NotAuthorized), + EventType::MtaSts(MtaStsEvent::PolicyFetch), + EventType::MtaSts(MtaStsEvent::PolicyNotFound), + EventType::MtaSts(MtaStsEvent::PolicyFetchError), + EventType::MtaSts(MtaStsEvent::InvalidPolicy), + EventType::Network(NetworkEvent::ListenStart), + EventType::Network(NetworkEvent::ListenStop), + EventType::Network(NetworkEvent::ListenError), + EventType::Network(NetworkEvent::BindError), + EventType::Network(NetworkEvent::ReadError), + EventType::Network(NetworkEvent::WriteError), + EventType::Network(NetworkEvent::FlushError), + EventType::Network(NetworkEvent::AcceptError), + EventType::Network(NetworkEvent::SplitError), + EventType::Network(NetworkEvent::Timeout), + EventType::Network(NetworkEvent::Closed), + EventType::Network(NetworkEvent::ProxyError), + EventType::Network(NetworkEvent::SetOptError), + EventType::OutgoingReport(OutgoingReportEvent::SpfReport), + EventType::OutgoingReport(OutgoingReportEvent::SpfRateLimited), + EventType::OutgoingReport(OutgoingReportEvent::DkimReport), + EventType::OutgoingReport(OutgoingReportEvent::DkimRateLimited), + EventType::OutgoingReport(OutgoingReportEvent::DmarcReport), + EventType::OutgoingReport(OutgoingReportEvent::DmarcRateLimited), + EventType::OutgoingReport(OutgoingReportEvent::DmarcAggregateReport), + EventType::OutgoingReport(OutgoingReportEvent::TlsAggregate), + EventType::OutgoingReport(OutgoingReportEvent::HttpSubmission), + EventType::OutgoingReport(OutgoingReportEvent::UnauthorizedReportingAddress), + EventType::OutgoingReport(OutgoingReportEvent::ReportingAddressValidationError), + EventType::OutgoingReport(OutgoingReportEvent::NotFound), + EventType::OutgoingReport(OutgoingReportEvent::SubmissionError), + EventType::OutgoingReport(OutgoingReportEvent::NoRecipientsFound), + EventType::OutgoingReport(OutgoingReportEvent::Locked), + EventType::Pop3(Pop3Event::ConnectionStart), + EventType::Pop3(Pop3Event::ConnectionEnd), + EventType::Pop3(Pop3Event::Delete), + EventType::Pop3(Pop3Event::Reset), + EventType::Pop3(Pop3Event::Quit), + EventType::Pop3(Pop3Event::Fetch), + EventType::Pop3(Pop3Event::List), + EventType::Pop3(Pop3Event::ListMessage), + EventType::Pop3(Pop3Event::Uidl), + EventType::Pop3(Pop3Event::UidlMessage), + EventType::Pop3(Pop3Event::Stat), + EventType::Pop3(Pop3Event::Noop), + EventType::Pop3(Pop3Event::Capabilities), + EventType::Pop3(Pop3Event::StartTls), + EventType::Pop3(Pop3Event::Utf8), + EventType::Pop3(Pop3Event::Error), + EventType::Pop3(Pop3Event::RawInput), + EventType::Pop3(Pop3Event::RawOutput), + EventType::Purge(PurgeEvent::Started), + EventType::Purge(PurgeEvent::Finished), + EventType::Purge(PurgeEvent::Running), + EventType::Purge(PurgeEvent::Error), + EventType::Purge(PurgeEvent::InProgress), + EventType::Purge(PurgeEvent::AutoExpunge), + EventType::Purge(PurgeEvent::BlobCleanup), + EventType::PushSubscription(PushSubscriptionEvent::Success), + EventType::PushSubscription(PushSubscriptionEvent::Error), + EventType::PushSubscription(PushSubscriptionEvent::NotFound), + EventType::Queue(QueueEvent::QueueMessage), + EventType::Queue(QueueEvent::QueueMessageAuthenticated), + EventType::Queue(QueueEvent::QueueReport), + EventType::Queue(QueueEvent::QueueDsn), + EventType::Queue(QueueEvent::QueueAutogenerated), + EventType::Queue(QueueEvent::Rescheduled), + EventType::Queue(QueueEvent::Locked), + EventType::Queue(QueueEvent::BlobNotFound), + EventType::Queue(QueueEvent::RateLimitExceeded), + EventType::Queue(QueueEvent::ConcurrencyLimitExceeded), + EventType::Queue(QueueEvent::QuotaExceeded), + EventType::Queue(QueueEvent::BackPressure), + EventType::Resource(ResourceEvent::NotFound), + EventType::Resource(ResourceEvent::BadParameters), + EventType::Resource(ResourceEvent::Error), + EventType::Resource(ResourceEvent::DownloadExternal), + EventType::Resource(ResourceEvent::WebadminUnpacked), + EventType::Security(SecurityEvent::AuthenticationBan), + EventType::Security(SecurityEvent::AbuseBan), + EventType::Security(SecurityEvent::ScanBan), + EventType::Security(SecurityEvent::LoiterBan), + EventType::Security(SecurityEvent::IpBlocked), + EventType::Security(SecurityEvent::Unauthorized), + EventType::Server(ServerEvent::Startup), + EventType::Server(ServerEvent::Shutdown), + EventType::Server(ServerEvent::StartupError), + EventType::Server(ServerEvent::ThreadError), + EventType::Server(ServerEvent::Licensing), + EventType::Sieve(SieveEvent::ActionAccept), + EventType::Sieve(SieveEvent::ActionAcceptReplace), + EventType::Sieve(SieveEvent::ActionDiscard), + EventType::Sieve(SieveEvent::ActionReject), + EventType::Sieve(SieveEvent::SendMessage), + EventType::Sieve(SieveEvent::MessageTooLarge), + EventType::Sieve(SieveEvent::ScriptNotFound), + EventType::Sieve(SieveEvent::ListNotFound), + EventType::Sieve(SieveEvent::RuntimeError), + EventType::Sieve(SieveEvent::UnexpectedError), + EventType::Sieve(SieveEvent::NotSupported), + EventType::Sieve(SieveEvent::QuotaExceeded), + EventType::Smtp(SmtpEvent::ConnectionStart), + EventType::Smtp(SmtpEvent::ConnectionEnd), + EventType::Smtp(SmtpEvent::Error), + EventType::Smtp(SmtpEvent::IdNotFound), + EventType::Smtp(SmtpEvent::ConcurrencyLimitExceeded), + EventType::Smtp(SmtpEvent::TransferLimitExceeded), + EventType::Smtp(SmtpEvent::RateLimitExceeded), + EventType::Smtp(SmtpEvent::TimeLimitExceeded), + EventType::Smtp(SmtpEvent::MissingAuthDirectory), + EventType::Smtp(SmtpEvent::MessageParseFailed), + EventType::Smtp(SmtpEvent::MessageTooLarge), + EventType::Smtp(SmtpEvent::LoopDetected), + EventType::Smtp(SmtpEvent::DkimPass), + EventType::Smtp(SmtpEvent::DkimFail), + EventType::Smtp(SmtpEvent::ArcPass), + EventType::Smtp(SmtpEvent::ArcFail), + EventType::Smtp(SmtpEvent::SpfEhloPass), + EventType::Smtp(SmtpEvent::SpfEhloFail), + EventType::Smtp(SmtpEvent::SpfFromPass), + EventType::Smtp(SmtpEvent::SpfFromFail), + EventType::Smtp(SmtpEvent::DmarcPass), + EventType::Smtp(SmtpEvent::DmarcFail), + EventType::Smtp(SmtpEvent::IprevPass), + EventType::Smtp(SmtpEvent::IprevFail), + EventType::Smtp(SmtpEvent::TooManyMessages), + EventType::Smtp(SmtpEvent::Ehlo), + EventType::Smtp(SmtpEvent::InvalidEhlo), + EventType::Smtp(SmtpEvent::DidNotSayEhlo), + EventType::Smtp(SmtpEvent::EhloExpected), + EventType::Smtp(SmtpEvent::LhloExpected), + EventType::Smtp(SmtpEvent::MailFromUnauthenticated), + EventType::Smtp(SmtpEvent::MailFromUnauthorized), + EventType::Smtp(SmtpEvent::MailFromNotAllowed), + EventType::Smtp(SmtpEvent::MailFromRewritten), + EventType::Smtp(SmtpEvent::MailFromMissing), + EventType::Smtp(SmtpEvent::MailFrom), + EventType::Smtp(SmtpEvent::MultipleMailFrom), + EventType::Smtp(SmtpEvent::MailboxDoesNotExist), + EventType::Smtp(SmtpEvent::RelayNotAllowed), + EventType::Smtp(SmtpEvent::RcptTo), + EventType::Smtp(SmtpEvent::RcptToDuplicate), + EventType::Smtp(SmtpEvent::RcptToRewritten), + EventType::Smtp(SmtpEvent::RcptToMissing), + EventType::Smtp(SmtpEvent::RcptToGreylisted), + EventType::Smtp(SmtpEvent::TooManyRecipients), + EventType::Smtp(SmtpEvent::TooManyInvalidRcpt), + EventType::Smtp(SmtpEvent::RawInput), + EventType::Smtp(SmtpEvent::RawOutput), + EventType::Smtp(SmtpEvent::MissingLocalHostname), + EventType::Smtp(SmtpEvent::Vrfy), + EventType::Smtp(SmtpEvent::VrfyNotFound), + EventType::Smtp(SmtpEvent::VrfyDisabled), + EventType::Smtp(SmtpEvent::Expn), + EventType::Smtp(SmtpEvent::ExpnNotFound), + EventType::Smtp(SmtpEvent::ExpnDisabled), + EventType::Smtp(SmtpEvent::RequireTlsDisabled), + EventType::Smtp(SmtpEvent::DeliverByDisabled), + EventType::Smtp(SmtpEvent::DeliverByInvalid), + EventType::Smtp(SmtpEvent::FutureReleaseDisabled), + EventType::Smtp(SmtpEvent::FutureReleaseInvalid), + EventType::Smtp(SmtpEvent::MtPriorityDisabled), + EventType::Smtp(SmtpEvent::MtPriorityInvalid), + EventType::Smtp(SmtpEvent::DsnDisabled), + EventType::Smtp(SmtpEvent::AuthNotAllowed), + EventType::Smtp(SmtpEvent::AuthMechanismNotSupported), + EventType::Smtp(SmtpEvent::AuthExchangeTooLong), + EventType::Smtp(SmtpEvent::AlreadyAuthenticated), + EventType::Smtp(SmtpEvent::Noop), + EventType::Smtp(SmtpEvent::StartTls), + EventType::Smtp(SmtpEvent::StartTlsUnavailable), + EventType::Smtp(SmtpEvent::StartTlsAlready), + EventType::Smtp(SmtpEvent::Rset), + EventType::Smtp(SmtpEvent::Quit), + EventType::Smtp(SmtpEvent::Help), + EventType::Smtp(SmtpEvent::CommandNotImplemented), + EventType::Smtp(SmtpEvent::InvalidCommand), + EventType::Smtp(SmtpEvent::InvalidSenderAddress), + EventType::Smtp(SmtpEvent::InvalidRecipientAddress), + EventType::Smtp(SmtpEvent::InvalidParameter), + EventType::Smtp(SmtpEvent::UnsupportedParameter), + EventType::Smtp(SmtpEvent::SyntaxError), + EventType::Smtp(SmtpEvent::RequestTooLarge), + EventType::Spam(SpamEvent::Pyzor), + EventType::Spam(SpamEvent::PyzorError), + EventType::Spam(SpamEvent::Dnsbl), + EventType::Spam(SpamEvent::DnsblError), + EventType::Spam(SpamEvent::TrainStarted), + EventType::Spam(SpamEvent::TrainCompleted), + EventType::Spam(SpamEvent::TrainSampleAdded), + EventType::Spam(SpamEvent::TrainSampleNotFound), + EventType::Spam(SpamEvent::Classify), + EventType::Spam(SpamEvent::ModelLoaded), + EventType::Spam(SpamEvent::ModelNotReady), + EventType::Spam(SpamEvent::ModelNotFound), + EventType::Spf(SpfEvent::Pass), + EventType::Spf(SpfEvent::Fail), + EventType::Spf(SpfEvent::SoftFail), + EventType::Spf(SpfEvent::Neutral), + EventType::Spf(SpfEvent::TempError), + EventType::Spf(SpfEvent::PermError), + EventType::Spf(SpfEvent::None), + EventType::Store(StoreEvent::AssertValueFailed), + EventType::Store(StoreEvent::FoundationdbError), + EventType::Store(StoreEvent::MysqlError), + EventType::Store(StoreEvent::PostgresqlError), + EventType::Store(StoreEvent::RocksdbError), + EventType::Store(StoreEvent::SqliteError), + EventType::Store(StoreEvent::LdapError), + EventType::Store(StoreEvent::ElasticsearchError), + EventType::Store(StoreEvent::MeilisearchError), + EventType::Store(StoreEvent::RedisError), + EventType::Store(StoreEvent::S3Error), + EventType::Store(StoreEvent::AzureError), + EventType::Store(StoreEvent::FilesystemError), + EventType::Store(StoreEvent::PoolError), + EventType::Store(StoreEvent::DataCorruption), + EventType::Store(StoreEvent::DecompressError), + EventType::Store(StoreEvent::DeserializeError), + EventType::Store(StoreEvent::NotFound), + EventType::Store(StoreEvent::NotConfigured), + EventType::Store(StoreEvent::NotSupported), + EventType::Store(StoreEvent::UnexpectedError), + EventType::Store(StoreEvent::CryptoError), + EventType::Store(StoreEvent::HttpStoreError), + EventType::Store(StoreEvent::CacheMiss), + EventType::Store(StoreEvent::CacheHit), + EventType::Store(StoreEvent::CacheStale), + EventType::Store(StoreEvent::CacheUpdate), + EventType::Store(StoreEvent::BlobMissingMarker), + EventType::Store(StoreEvent::DataWrite), + EventType::Store(StoreEvent::DataIterate), + EventType::Store(StoreEvent::BlobRead), + EventType::Store(StoreEvent::BlobWrite), + EventType::Store(StoreEvent::BlobDelete), + EventType::Store(StoreEvent::SqlQuery), + EventType::Store(StoreEvent::LdapQuery), + EventType::Store(StoreEvent::LdapWarning), + EventType::Store(StoreEvent::HttpStoreFetch), + EventType::TaskQueue(TaskQueueEvent::TaskAcquired), + EventType::TaskQueue(TaskQueueEvent::TaskLocked), + EventType::TaskQueue(TaskQueueEvent::TaskIgnored), + EventType::TaskQueue(TaskQueueEvent::TaskFailed), + EventType::TaskQueue(TaskQueueEvent::BlobNotFound), + EventType::TaskQueue(TaskQueueEvent::MetadataNotFound), + EventType::Telemetry(TelemetryEvent::Alert), + EventType::Telemetry(TelemetryEvent::LogError), + EventType::Telemetry(TelemetryEvent::WebhookError), + EventType::Telemetry(TelemetryEvent::OtelExporterError), + EventType::Telemetry(TelemetryEvent::OtelMetricsExporterError), + EventType::Telemetry(TelemetryEvent::PrometheusExporterError), + EventType::Telemetry(TelemetryEvent::JournalError), + EventType::Tls(TlsEvent::Handshake), + EventType::Tls(TlsEvent::HandshakeError), + EventType::Tls(TlsEvent::NotConfigured), + EventType::Tls(TlsEvent::CertificateNotFound), + EventType::Tls(TlsEvent::NoCertificatesAvailable), + EventType::Tls(TlsEvent::MultipleCertificatesAvailable), + EventType::TlsRpt(TlsRptEvent::RecordFetch), + EventType::TlsRpt(TlsRptEvent::RecordFetchError), + EventType::TlsRpt(TlsRptEvent::RecordNotFound), + EventType::WebDav(WebDavEvent::Propfind), + EventType::WebDav(WebDavEvent::Proppatch), + EventType::WebDav(WebDavEvent::Get), + EventType::WebDav(WebDavEvent::Head), + EventType::WebDav(WebDavEvent::Report), + EventType::WebDav(WebDavEvent::Mkcol), + EventType::WebDav(WebDavEvent::Mkcalendar), + EventType::WebDav(WebDavEvent::Delete), + EventType::WebDav(WebDavEvent::Put), + EventType::WebDav(WebDavEvent::Post), + EventType::WebDav(WebDavEvent::Patch), + EventType::WebDav(WebDavEvent::Copy), + EventType::WebDav(WebDavEvent::Move), + EventType::WebDav(WebDavEvent::Lock), + EventType::WebDav(WebDavEvent::Unlock), + EventType::WebDav(WebDavEvent::Acl), + EventType::WebDav(WebDavEvent::Options), + EventType::WebDav(WebDavEvent::Error), + ] + } +} + +impl MetricType { + pub fn parse(value: &str) -> Option { + hashify::map! { + value.as_bytes(), + MetricType, + b"acme.auth-error" => MetricType::AcmeAuthError, + b"acme.auth-too-many-attempts" => MetricType::AcmeAuthTooManyAttempts, + b"acme.order-completed" => MetricType::AcmeOrderCompleted, + b"acme.order-invalid" => MetricType::AcmeOrderInvalid, + b"acme.client-missing-sni" => MetricType::AcmeClientMissingSni, + b"acme.tls-alpn-error" => MetricType::AcmeTlsAlpnError, + b"acme.token-not-found" => MetricType::AcmeTokenNotFound, + b"acme.error" => MetricType::AcmeError, + b"arc.chain-too-long" => MetricType::ArcChainTooLong, + b"arc.invalid-instance" => MetricType::ArcInvalidInstance, + b"arc.invalid-cv" => MetricType::ArcInvalidCv, + b"arc.has-header-tag" => MetricType::ArcHasHeaderTag, + b"arc.broken-chain" => MetricType::ArcBrokenChain, + b"auth.success" => MetricType::AuthSuccess, + b"auth.failed" => MetricType::AuthFailed, + b"auth.too-many-attempts" => MetricType::AuthTooManyAttempts, + b"auth.error" => MetricType::AuthError, + b"calendar.alarm-sent" => MetricType::CalendarAlarmSent, + b"calendar.alarm-failed" => MetricType::CalendarAlarmFailed, + b"calendar.itip-message-sent" => MetricType::CalendarItipMessageSent, + b"calendar.itip-message-received" => MetricType::CalendarItipMessageReceived, + b"calendar.itip-message-error" => MetricType::CalendarItipMessageError, + b"cluster.subscriber-error" => MetricType::ClusterSubscriberError, + b"cluster.subscriber-disconnected" => MetricType::ClusterSubscriberDisconnected, + b"cluster.publisher-error" => MetricType::ClusterPublisherError, + b"dane.authentication-success" => MetricType::DaneAuthenticationSuccess, + b"dane.authentication-failure" => MetricType::DaneAuthenticationFailure, + b"dane.no-certificates-found" => MetricType::DaneNoCertificatesFound, + b"dane.certificate-parse-error" => MetricType::DaneCertificateParseError, + b"dane.tlsa-record-fetch-error" => MetricType::DaneTlsaRecordFetchError, + b"dane.tlsa-record-not-found" => MetricType::DaneTlsaRecordNotFound, + b"dane.tlsa-record-not-dnssec-signed" => MetricType::DaneTlsaRecordNotDnssecSigned, + b"dane.tlsa-record-invalid" => MetricType::DaneTlsaRecordInvalid, + b"delivery.total-time" => MetricType::DeliveryTotalTime, + b"delivery.attempt-time" => MetricType::DeliveryAttemptTime, + b"delivery.active-connections" => MetricType::DeliveryActiveConnections, + b"delivery.attempt-start" => MetricType::DeliveryAttemptStart, + b"delivery.attempt-end" => MetricType::DeliveryAttemptEnd, + b"delivery.completed" => MetricType::DeliveryCompleted, + b"delivery.mx-lookup-failed" => MetricType::DeliveryMxLookupFailed, + b"delivery.ip-lookup-failed" => MetricType::DeliveryIpLookupFailed, + b"delivery.null-mx" => MetricType::DeliveryNullMx, + b"delivery.greeting-failed" => MetricType::DeliveryGreetingFailed, + b"delivery.ehlo-rejected" => MetricType::DeliveryEhloRejected, + b"delivery.auth-failed" => MetricType::DeliveryAuthFailed, + b"delivery.mail-from-rejected" => MetricType::DeliveryMailFromRejected, + b"delivery.delivered" => MetricType::DeliveryDelivered, + b"delivery.rcpt-to-rejected" => MetricType::DeliveryRcptToRejected, + b"delivery.rcpt-to-failed" => MetricType::DeliveryRcptToFailed, + b"delivery.message-rejected" => MetricType::DeliveryMessageRejected, + b"delivery.start-tls-unavailable" => MetricType::DeliveryStartTlsUnavailable, + b"delivery.start-tls-error" => MetricType::DeliveryStartTlsError, + b"delivery.start-tls-disabled" => MetricType::DeliveryStartTlsDisabled, + b"delivery.implicit-tls-error" => MetricType::DeliveryImplicitTlsError, + b"delivery.concurrency-limit-exceeded" => MetricType::DeliveryConcurrencyLimitExceeded, + b"delivery.rate-limit-exceeded" => MetricType::DeliveryRateLimitExceeded, + b"delivery.double-bounce" => MetricType::DeliveryDoubleBounce, + b"delivery.dsn-success" => MetricType::DeliveryDsnSuccess, + b"delivery.dsn-temp-fail" => MetricType::DeliveryDsnTempFail, + b"delivery.dsn-perm-fail" => MetricType::DeliveryDsnPermFail, + b"dkim.pass" => MetricType::DkimPass, + b"dkim.neutral" => MetricType::DkimNeutral, + b"dkim.fail" => MetricType::DkimFail, + b"dkim.perm-error" => MetricType::DkimPermError, + b"dkim.temp-error" => MetricType::DkimTempError, + b"dkim.none" => MetricType::DkimNone, + b"dkim.unsupported-version" => MetricType::DkimUnsupportedVersion, + b"dkim.unsupported-algorithm" => MetricType::DkimUnsupportedAlgorithm, + b"dkim.unsupported-canonicalization" => MetricType::DkimUnsupportedCanonicalization, + b"dkim.unsupported-key-type" => MetricType::DkimUnsupportedKeyType, + b"dkim.failed-body-hash-match" => MetricType::DkimFailedBodyHashMatch, + b"dkim.failed-verification" => MetricType::DkimFailedVerification, + b"dkim.failed-auid-match" => MetricType::DkimFailedAuidMatch, + b"dkim.revoked-public-key" => MetricType::DkimRevokedPublicKey, + b"dkim.incompatible-algorithms" => MetricType::DkimIncompatibleAlgorithms, + b"dkim.signature-expired" => MetricType::DkimSignatureExpired, + b"dkim.signature-length" => MetricType::DkimSignatureLength, + b"dkim.signer-not-found" => MetricType::DkimSignerNotFound, + b"dmarc.pass" => MetricType::DmarcPass, + b"dmarc.fail" => MetricType::DmarcFail, + b"dmarc.perm-error" => MetricType::DmarcPermError, + b"dmarc.temp-error" => MetricType::DmarcTempError, + b"dmarc.none" => MetricType::DmarcNone, + b"dns.lookup-time" => MetricType::DnsLookupTime, + b"dns.record-creation-failed" => MetricType::DnsRecordCreationFailed, + b"dns.record-deletion-failed" => MetricType::DnsRecordDeletionFailed, + b"dns.record-lookup-failed" => MetricType::DnsRecordLookupFailed, + b"dns.record-propagation-timeout" => MetricType::DnsRecordPropagationTimeout, + b"domain.count" => MetricType::DomainCount, + b"eval.error" => MetricType::EvalError, + b"eval.directory-not-found" => MetricType::EvalDirectoryNotFound, + b"eval.store-not-found" => MetricType::EvalStoreNotFound, + b"http.request-time" => MetricType::HttpRequestTime, + b"http.active-connections" => MetricType::HttpActiveConnections, + b"http.error" => MetricType::HttpError, + b"http.request-body" => MetricType::HttpRequestBody, + b"http.response-body" => MetricType::HttpResponseBody, + b"http.x-forwarded-missing" => MetricType::HttpXForwardedMissing, + b"imap.request-time" => MetricType::ImapRequestTime, + b"imap.active-connections" => MetricType::ImapActiveConnections, + b"imap.connection-start" => MetricType::ImapConnectionStart, + b"imap.connection-end" => MetricType::ImapConnectionEnd, + b"incoming-report.dmarc-report" => MetricType::IncomingReportDmarcReport, + b"incoming-report.dmarc-report-with-warnings" => MetricType::IncomingReportDmarcReportWithWarnings, + b"incoming-report.tls-report" => MetricType::IncomingReportTlsReport, + b"incoming-report.tls-report-with-warnings" => MetricType::IncomingReportTlsReportWithWarnings, + b"incoming-report.abuse-report" => MetricType::IncomingReportAbuseReport, + b"incoming-report.auth-failure-report" => MetricType::IncomingReportAuthFailureReport, + b"incoming-report.fraud-report" => MetricType::IncomingReportFraudReport, + b"incoming-report.not-spam-report" => MetricType::IncomingReportNotSpamReport, + b"incoming-report.virus-report" => MetricType::IncomingReportVirusReport, + b"incoming-report.other-report" => MetricType::IncomingReportOtherReport, + b"incoming-report.message-parse-failed" => MetricType::IncomingReportMessageParseFailed, + b"incoming-report.dmarc-parse-failed" => MetricType::IncomingReportDmarcParseFailed, + b"incoming-report.tls-rpc-parse-failed" => MetricType::IncomingReportTlsRpcParseFailed, + b"incoming-report.arf-parse-failed" => MetricType::IncomingReportArfParseFailed, + b"incoming-report.decompress-error" => MetricType::IncomingReportDecompressError, + b"iprev.pass" => MetricType::IprevPass, + b"iprev.fail" => MetricType::IprevFail, + b"iprev.perm-error" => MetricType::IprevPermError, + b"iprev.temp-error" => MetricType::IprevTempError, + b"iprev.none" => MetricType::IprevNone, + b"jmap.method-call" => MetricType::JmapMethodCall, + b"jmap.invalid-arguments" => MetricType::JmapInvalidArguments, + b"jmap.request-too-large" => MetricType::JmapRequestTooLarge, + b"jmap.unsupported-filter" => MetricType::JmapUnsupportedFilter, + b"jmap.unsupported-sort" => MetricType::JmapUnsupportedSort, + b"jmap.unknown-method" => MetricType::JmapUnknownMethod, + b"jmap.forbidden" => MetricType::JmapForbidden, + b"jmap.not-json" => MetricType::JmapNotJson, + b"jmap.not-request" => MetricType::JmapNotRequest, + b"jmap.websocket-start" => MetricType::JmapWebsocketStart, + b"jmap.websocket-error" => MetricType::JmapWebsocketError, + b"limit.size-request" => MetricType::LimitSizeRequest, + b"limit.size-upload" => MetricType::LimitSizeUpload, + b"limit.calls-in" => MetricType::LimitCallsIn, + b"limit.concurrent-request" => MetricType::LimitConcurrentRequest, + b"limit.concurrent-upload" => MetricType::LimitConcurrentUpload, + b"limit.concurrent-connection" => MetricType::LimitConcurrentConnection, + b"limit.quota" => MetricType::LimitQuota, + b"limit.blob-quota" => MetricType::LimitBlobQuota, + b"limit.tenant-quota" => MetricType::LimitTenantQuota, + b"limit.too-many-requests" => MetricType::LimitTooManyRequests, + b"mail-auth.parse-error" => MetricType::MailAuthParseError, + b"mail-auth.missing-parameters" => MetricType::MailAuthMissingParameters, + b"mail-auth.no-headers-found" => MetricType::MailAuthNoHeadersFound, + b"mail-auth.crypto" => MetricType::MailAuthCrypto, + b"mail-auth.io" => MetricType::MailAuthIo, + b"mail-auth.base64" => MetricType::MailAuthBase64, + b"mail-auth.dns-error" => MetricType::MailAuthDnsError, + b"mail-auth.dns-record-not-found" => MetricType::MailAuthDnsRecordNotFound, + b"mail-auth.dns-invalid-record-type" => MetricType::MailAuthDnsInvalidRecordType, + b"mail-auth.policy-not-aligned" => MetricType::MailAuthPolicyNotAligned, + b"manage-sieve.connection-start" => MetricType::ManageSieveConnectionStart, + b"manage-sieve.connection-end" => MetricType::ManageSieveConnectionEnd, + b"message.size" => MetricType::MessageSize, + b"message.authenticated-size" => MetricType::MessageAuthenticatedSize, + b"message-ingest.time" => MetricType::MessageIngestTime, + b"message-ingest.index-time" => MetricType::MessageIngestIndexTime, + b"message-ingest.ham" => MetricType::MessageIngestHam, + b"message-ingest.spam" => MetricType::MessageIngestSpam, + b"message-ingest.imap-append" => MetricType::MessageIngestImapAppend, + b"message-ingest.jmap-append" => MetricType::MessageIngestJmapAppend, + b"message-ingest.duplicate" => MetricType::MessageIngestDuplicate, + b"message-ingest.error" => MetricType::MessageIngestError, + b"message-ingest.fts-index" => MetricType::MessageIngestFtsIndex, + b"milter.action-accept" => MetricType::MilterActionAccept, + b"milter.action-discard" => MetricType::MilterActionDiscard, + b"milter.action-reject" => MetricType::MilterActionReject, + b"milter.action-temp-fail" => MetricType::MilterActionTempFail, + b"milter.action-reply-code" => MetricType::MilterActionReplyCode, + b"milter.action-connection-failure" => MetricType::MilterActionConnectionFailure, + b"milter.action-shutdown" => MetricType::MilterActionShutdown, + b"mta-hook.action-accept" => MetricType::MtaHookActionAccept, + b"mta-hook.action-discard" => MetricType::MtaHookActionDiscard, + b"mta-hook.action-reject" => MetricType::MtaHookActionReject, + b"mta-hook.action-quarantine" => MetricType::MtaHookActionQuarantine, + b"mta-hook.error" => MetricType::MtaHookError, + b"mta-sts.authorized" => MetricType::MtaStsAuthorized, + b"mta-sts.not-authorized" => MetricType::MtaStsNotAuthorized, + b"mta-sts.invalid-policy" => MetricType::MtaStsInvalidPolicy, + b"network.timeout" => MetricType::NetworkTimeout, + b"outgoing-report.size" => MetricType::OutgoingReportSize, + b"outgoing-report.spf-report" => MetricType::OutgoingReportSpfReport, + b"outgoing-report.spf-rate-limited" => MetricType::OutgoingReportSpfRateLimited, + b"outgoing-report.dkim-report" => MetricType::OutgoingReportDkimReport, + b"outgoing-report.dkim-rate-limited" => MetricType::OutgoingReportDkimRateLimited, + b"outgoing-report.dmarc-report" => MetricType::OutgoingReportDmarcReport, + b"outgoing-report.dmarc-rate-limited" => MetricType::OutgoingReportDmarcRateLimited, + b"outgoing-report.dmarc-aggregate-report" => MetricType::OutgoingReportDmarcAggregateReport, + b"outgoing-report.tls-aggregate" => MetricType::OutgoingReportTlsAggregate, + b"outgoing-report.http-submission" => MetricType::OutgoingReportHttpSubmission, + b"outgoing-report.unauthorized-reporting-address" => MetricType::OutgoingReportUnauthorizedReportingAddress, + b"outgoing-report.reporting-address-validation-error" => MetricType::OutgoingReportReportingAddressValidationError, + b"outgoing-report.not-found" => MetricType::OutgoingReportNotFound, + b"outgoing-report.submission-error" => MetricType::OutgoingReportSubmissionError, + b"outgoing-report.no-recipients-found" => MetricType::OutgoingReportNoRecipientsFound, + b"pop3.request-time" => MetricType::Pop3RequestTime, + b"pop3.active-connections" => MetricType::Pop3ActiveConnections, + b"pop3.connection-start" => MetricType::Pop3ConnectionStart, + b"pop3.connection-end" => MetricType::Pop3ConnectionEnd, + b"purge.error" => MetricType::PurgeError, + b"push-subscription.success" => MetricType::PushSubscriptionSuccess, + b"push-subscription.error" => MetricType::PushSubscriptionError, + b"push-subscription.not-found" => MetricType::PushSubscriptionNotFound, + b"queue.count" => MetricType::QueueCount, + b"queue.queue-message" => MetricType::QueueQueueMessage, + b"queue.queue-message-authenticated" => MetricType::QueueQueueMessageAuthenticated, + b"queue.queue-report" => MetricType::QueueQueueReport, + b"queue.queue-dsn" => MetricType::QueueQueueDsn, + b"queue.queue-autogenerated" => MetricType::QueueQueueAutogenerated, + b"queue.rescheduled" => MetricType::QueueRescheduled, + b"queue.blob-not-found" => MetricType::QueueBlobNotFound, + b"queue.rate-limit-exceeded" => MetricType::QueueRateLimitExceeded, + b"queue.concurrency-limit-exceeded" => MetricType::QueueConcurrencyLimitExceeded, + b"queue.quota-exceeded" => MetricType::QueueQuotaExceeded, + b"resource.not-found" => MetricType::ResourceNotFound, + b"resource.bad-parameters" => MetricType::ResourceBadParameters, + b"resource.error" => MetricType::ResourceError, + b"security.authentication-ban" => MetricType::SecurityAuthenticationBan, + b"security.abuse-ban" => MetricType::SecurityAbuseBan, + b"security.scan-ban" => MetricType::SecurityScanBan, + b"security.loiter-ban" => MetricType::SecurityLoiterBan, + b"security.ip-blocked" => MetricType::SecurityIpBlocked, + b"security.unauthorized" => MetricType::SecurityUnauthorized, + b"server.memory" => MetricType::ServerMemory, + b"server.thread-error" => MetricType::ServerThreadError, + b"sieve.request-time" => MetricType::SieveRequestTime, + b"sieve.active-connections" => MetricType::SieveActiveConnections, + b"sieve.action-accept" => MetricType::SieveActionAccept, + b"sieve.action-accept-replace" => MetricType::SieveActionAcceptReplace, + b"sieve.action-discard" => MetricType::SieveActionDiscard, + b"sieve.action-reject" => MetricType::SieveActionReject, + b"sieve.send-message" => MetricType::SieveSendMessage, + b"sieve.message-too-large" => MetricType::SieveMessageTooLarge, + b"sieve.runtime-error" => MetricType::SieveRuntimeError, + b"sieve.unexpected-error" => MetricType::SieveUnexpectedError, + b"sieve.not-supported" => MetricType::SieveNotSupported, + b"sieve.quota-exceeded" => MetricType::SieveQuotaExceeded, + b"smtp.request-time" => MetricType::SmtpRequestTime, + b"smtp.active-connections" => MetricType::SmtpActiveConnections, + b"smtp.connection-start" => MetricType::SmtpConnectionStart, + b"smtp.connection-end" => MetricType::SmtpConnectionEnd, + b"smtp.error" => MetricType::SmtpError, + b"smtp.concurrency-limit-exceeded" => MetricType::SmtpConcurrencyLimitExceeded, + b"smtp.transfer-limit-exceeded" => MetricType::SmtpTransferLimitExceeded, + b"smtp.rate-limit-exceeded" => MetricType::SmtpRateLimitExceeded, + b"smtp.time-limit-exceeded" => MetricType::SmtpTimeLimitExceeded, + b"smtp.message-parse-failed" => MetricType::SmtpMessageParseFailed, + b"smtp.message-too-large" => MetricType::SmtpMessageTooLarge, + b"smtp.loop-detected" => MetricType::SmtpLoopDetected, + b"smtp.dkim-pass" => MetricType::SmtpDkimPass, + b"smtp.dkim-fail" => MetricType::SmtpDkimFail, + b"smtp.arc-pass" => MetricType::SmtpArcPass, + b"smtp.arc-fail" => MetricType::SmtpArcFail, + b"smtp.spf-ehlo-pass" => MetricType::SmtpSpfEhloPass, + b"smtp.spf-ehlo-fail" => MetricType::SmtpSpfEhloFail, + b"smtp.spf-from-pass" => MetricType::SmtpSpfFromPass, + b"smtp.spf-from-fail" => MetricType::SmtpSpfFromFail, + b"smtp.dmarc-pass" => MetricType::SmtpDmarcPass, + b"smtp.dmarc-fail" => MetricType::SmtpDmarcFail, + b"smtp.iprev-pass" => MetricType::SmtpIprevPass, + b"smtp.iprev-fail" => MetricType::SmtpIprevFail, + b"smtp.too-many-messages" => MetricType::SmtpTooManyMessages, + b"smtp.invalid-ehlo" => MetricType::SmtpInvalidEhlo, + b"smtp.did-not-say-ehlo" => MetricType::SmtpDidNotSayEhlo, + b"smtp.mail-from-unauthenticated" => MetricType::SmtpMailFromUnauthenticated, + b"smtp.mail-from-unauthorized" => MetricType::SmtpMailFromUnauthorized, + b"smtp.mail-from-missing" => MetricType::SmtpMailFromMissing, + b"smtp.multiple-mail-from" => MetricType::SmtpMultipleMailFrom, + b"smtp.mailbox-does-not-exist" => MetricType::SmtpMailboxDoesNotExist, + b"smtp.relay-not-allowed" => MetricType::SmtpRelayNotAllowed, + b"smtp.rcpt-to-duplicate" => MetricType::SmtpRcptToDuplicate, + b"smtp.rcpt-to-missing" => MetricType::SmtpRcptToMissing, + b"smtp.too-many-recipients" => MetricType::SmtpTooManyRecipients, + b"smtp.too-many-invalid-rcpt" => MetricType::SmtpTooManyInvalidRcpt, + b"smtp.auth-mechanism-not-supported" => MetricType::SmtpAuthMechanismNotSupported, + b"smtp.auth-exchange-too-long" => MetricType::SmtpAuthExchangeTooLong, + b"smtp.command-not-implemented" => MetricType::SmtpCommandNotImplemented, + b"smtp.invalid-command" => MetricType::SmtpInvalidCommand, + b"smtp.syntax-error" => MetricType::SmtpSyntaxError, + b"smtp.request-too-large" => MetricType::SmtpRequestTooLarge, + b"spam.pyzor-error" => MetricType::SpamPyzorError, + b"spam.dnsbl-error" => MetricType::SpamDnsblError, + b"spam.train-completed" => MetricType::SpamTrainCompleted, + b"spam.train-sample-added" => MetricType::SpamTrainSampleAdded, + b"spam.classify" => MetricType::SpamClassify, + b"spam.model-not-ready" => MetricType::SpamModelNotReady, + b"spf.pass" => MetricType::SpfPass, + b"spf.fail" => MetricType::SpfFail, + b"spf.soft-fail" => MetricType::SpfSoftFail, + b"spf.neutral" => MetricType::SpfNeutral, + b"spf.temp-error" => MetricType::SpfTempError, + b"spf.perm-error" => MetricType::SpfPermError, + b"spf.none" => MetricType::SpfNone, + b"store.data-read-time" => MetricType::StoreDataReadTime, + b"store.data-write-time" => MetricType::StoreDataWriteTime, + b"store.blob-read-time" => MetricType::StoreBlobReadTime, + b"store.blob-write-time" => MetricType::StoreBlobWriteTime, + b"store.assert-value-failed" => MetricType::StoreAssertValueFailed, + b"store.foundationdb-error" => MetricType::StoreFoundationdbError, + b"store.mysql-error" => MetricType::StoreMysqlError, + b"store.postgresql-error" => MetricType::StorePostgresqlError, + b"store.rocksdb-error" => MetricType::StoreRocksdbError, + b"store.sqlite-error" => MetricType::StoreSqliteError, + b"store.ldap-error" => MetricType::StoreLdapError, + b"store.elasticsearch-error" => MetricType::StoreElasticsearchError, + b"store.redis-error" => MetricType::StoreRedisError, + b"store.s3-error" => MetricType::StoreS3Error, + b"store.azure-error" => MetricType::StoreAzureError, + b"store.filesystem-error" => MetricType::StoreFilesystemError, + b"store.pool-error" => MetricType::StorePoolError, + b"store.data-corruption" => MetricType::StoreDataCorruption, + b"store.decompress-error" => MetricType::StoreDecompressError, + b"store.deserialize-error" => MetricType::StoreDeserializeError, + b"store.not-found" => MetricType::StoreNotFound, + b"store.not-configured" => MetricType::StoreNotConfigured, + b"store.not-supported" => MetricType::StoreNotSupported, + b"store.unexpected-error" => MetricType::StoreUnexpectedError, + b"store.crypto-error" => MetricType::StoreCryptoError, + b"store.http-store-error" => MetricType::StoreHttpStoreError, + b"store.blob-missing-marker" => MetricType::StoreBlobMissingMarker, + b"store.data-write" => MetricType::StoreDataWrite, + b"store.data-iterate" => MetricType::StoreDataIterate, + b"store.blob-read" => MetricType::StoreBlobRead, + b"store.blob-write" => MetricType::StoreBlobWrite, + b"store.blob-delete" => MetricType::StoreBlobDelete, + b"task-queue.blob-not-found" => MetricType::TaskQueueBlobNotFound, + b"task-queue.metadata-not-found" => MetricType::TaskQueueMetadataNotFound, + b"telemetry.log-error" => MetricType::TelemetryLogError, + b"telemetry.webhook-error" => MetricType::TelemetryWebhookError, + b"telemetry.otel-exporter-error" => MetricType::TelemetryOtelExporterError, + b"telemetry.otel-metrics-exporter-error" => MetricType::TelemetryOtelMetricsExporterError, + b"telemetry.prometheus-exporter-error" => MetricType::TelemetryPrometheusExporterError, + b"telemetry.journal-error" => MetricType::TelemetryJournalError, + b"tls.handshake-error" => MetricType::TlsHandshakeError, + b"user.count" => MetricType::UserCount, + } + .copied() + } + + pub fn as_str(&self) -> &'static str { + match self { + MetricType::AcmeAuthError => "acme.auth-error", + MetricType::AcmeAuthTooManyAttempts => "acme.auth-too-many-attempts", + MetricType::AcmeOrderCompleted => "acme.order-completed", + MetricType::AcmeOrderInvalid => "acme.order-invalid", + MetricType::AcmeClientMissingSni => "acme.client-missing-sni", + MetricType::AcmeTlsAlpnError => "acme.tls-alpn-error", + MetricType::AcmeTokenNotFound => "acme.token-not-found", + MetricType::AcmeError => "acme.error", + MetricType::ArcChainTooLong => "arc.chain-too-long", + MetricType::ArcInvalidInstance => "arc.invalid-instance", + MetricType::ArcInvalidCv => "arc.invalid-cv", + MetricType::ArcHasHeaderTag => "arc.has-header-tag", + MetricType::ArcBrokenChain => "arc.broken-chain", + MetricType::AuthSuccess => "auth.success", + MetricType::AuthFailed => "auth.failed", + MetricType::AuthTooManyAttempts => "auth.too-many-attempts", + MetricType::AuthError => "auth.error", + MetricType::CalendarAlarmSent => "calendar.alarm-sent", + MetricType::CalendarAlarmFailed => "calendar.alarm-failed", + MetricType::CalendarItipMessageSent => "calendar.itip-message-sent", + MetricType::CalendarItipMessageReceived => "calendar.itip-message-received", + MetricType::CalendarItipMessageError => "calendar.itip-message-error", + MetricType::ClusterSubscriberError => "cluster.subscriber-error", + MetricType::ClusterSubscriberDisconnected => "cluster.subscriber-disconnected", + MetricType::ClusterPublisherError => "cluster.publisher-error", + MetricType::DaneAuthenticationSuccess => "dane.authentication-success", + MetricType::DaneAuthenticationFailure => "dane.authentication-failure", + MetricType::DaneNoCertificatesFound => "dane.no-certificates-found", + MetricType::DaneCertificateParseError => "dane.certificate-parse-error", + MetricType::DaneTlsaRecordFetchError => "dane.tlsa-record-fetch-error", + MetricType::DaneTlsaRecordNotFound => "dane.tlsa-record-not-found", + MetricType::DaneTlsaRecordNotDnssecSigned => "dane.tlsa-record-not-dnssec-signed", + MetricType::DaneTlsaRecordInvalid => "dane.tlsa-record-invalid", + MetricType::DeliveryTotalTime => "delivery.total-time", + MetricType::DeliveryAttemptTime => "delivery.attempt-time", + MetricType::DeliveryActiveConnections => "delivery.active-connections", + MetricType::DeliveryAttemptStart => "delivery.attempt-start", + MetricType::DeliveryAttemptEnd => "delivery.attempt-end", + MetricType::DeliveryCompleted => "delivery.completed", + MetricType::DeliveryMxLookupFailed => "delivery.mx-lookup-failed", + MetricType::DeliveryIpLookupFailed => "delivery.ip-lookup-failed", + MetricType::DeliveryNullMx => "delivery.null-mx", + MetricType::DeliveryGreetingFailed => "delivery.greeting-failed", + MetricType::DeliveryEhloRejected => "delivery.ehlo-rejected", + MetricType::DeliveryAuthFailed => "delivery.auth-failed", + MetricType::DeliveryMailFromRejected => "delivery.mail-from-rejected", + MetricType::DeliveryDelivered => "delivery.delivered", + MetricType::DeliveryRcptToRejected => "delivery.rcpt-to-rejected", + MetricType::DeliveryRcptToFailed => "delivery.rcpt-to-failed", + MetricType::DeliveryMessageRejected => "delivery.message-rejected", + MetricType::DeliveryStartTlsUnavailable => "delivery.start-tls-unavailable", + MetricType::DeliveryStartTlsError => "delivery.start-tls-error", + MetricType::DeliveryStartTlsDisabled => "delivery.start-tls-disabled", + MetricType::DeliveryImplicitTlsError => "delivery.implicit-tls-error", + MetricType::DeliveryConcurrencyLimitExceeded => "delivery.concurrency-limit-exceeded", + MetricType::DeliveryRateLimitExceeded => "delivery.rate-limit-exceeded", + MetricType::DeliveryDoubleBounce => "delivery.double-bounce", + MetricType::DeliveryDsnSuccess => "delivery.dsn-success", + MetricType::DeliveryDsnTempFail => "delivery.dsn-temp-fail", + MetricType::DeliveryDsnPermFail => "delivery.dsn-perm-fail", + MetricType::DkimPass => "dkim.pass", + MetricType::DkimNeutral => "dkim.neutral", + MetricType::DkimFail => "dkim.fail", + MetricType::DkimPermError => "dkim.perm-error", + MetricType::DkimTempError => "dkim.temp-error", + MetricType::DkimNone => "dkim.none", + MetricType::DkimUnsupportedVersion => "dkim.unsupported-version", + MetricType::DkimUnsupportedAlgorithm => "dkim.unsupported-algorithm", + MetricType::DkimUnsupportedCanonicalization => "dkim.unsupported-canonicalization", + MetricType::DkimUnsupportedKeyType => "dkim.unsupported-key-type", + MetricType::DkimFailedBodyHashMatch => "dkim.failed-body-hash-match", + MetricType::DkimFailedVerification => "dkim.failed-verification", + MetricType::DkimFailedAuidMatch => "dkim.failed-auid-match", + MetricType::DkimRevokedPublicKey => "dkim.revoked-public-key", + MetricType::DkimIncompatibleAlgorithms => "dkim.incompatible-algorithms", + MetricType::DkimSignatureExpired => "dkim.signature-expired", + MetricType::DkimSignatureLength => "dkim.signature-length", + MetricType::DkimSignerNotFound => "dkim.signer-not-found", + MetricType::DmarcPass => "dmarc.pass", + MetricType::DmarcFail => "dmarc.fail", + MetricType::DmarcPermError => "dmarc.perm-error", + MetricType::DmarcTempError => "dmarc.temp-error", + MetricType::DmarcNone => "dmarc.none", + MetricType::DnsLookupTime => "dns.lookup-time", + MetricType::DnsRecordCreationFailed => "dns.record-creation-failed", + MetricType::DnsRecordDeletionFailed => "dns.record-deletion-failed", + MetricType::DnsRecordLookupFailed => "dns.record-lookup-failed", + MetricType::DnsRecordPropagationTimeout => "dns.record-propagation-timeout", + MetricType::DomainCount => "domain.count", + MetricType::EvalError => "eval.error", + MetricType::EvalDirectoryNotFound => "eval.directory-not-found", + MetricType::EvalStoreNotFound => "eval.store-not-found", + MetricType::HttpRequestTime => "http.request-time", + MetricType::HttpActiveConnections => "http.active-connections", + MetricType::HttpError => "http.error", + MetricType::HttpRequestBody => "http.request-body", + MetricType::HttpResponseBody => "http.response-body", + MetricType::HttpXForwardedMissing => "http.x-forwarded-missing", + MetricType::ImapRequestTime => "imap.request-time", + MetricType::ImapActiveConnections => "imap.active-connections", + MetricType::ImapConnectionStart => "imap.connection-start", + MetricType::ImapConnectionEnd => "imap.connection-end", + MetricType::IncomingReportDmarcReport => "incoming-report.dmarc-report", + MetricType::IncomingReportDmarcReportWithWarnings => { + "incoming-report.dmarc-report-with-warnings" + } + MetricType::IncomingReportTlsReport => "incoming-report.tls-report", + MetricType::IncomingReportTlsReportWithWarnings => { + "incoming-report.tls-report-with-warnings" + } + MetricType::IncomingReportAbuseReport => "incoming-report.abuse-report", + MetricType::IncomingReportAuthFailureReport => "incoming-report.auth-failure-report", + MetricType::IncomingReportFraudReport => "incoming-report.fraud-report", + MetricType::IncomingReportNotSpamReport => "incoming-report.not-spam-report", + MetricType::IncomingReportVirusReport => "incoming-report.virus-report", + MetricType::IncomingReportOtherReport => "incoming-report.other-report", + MetricType::IncomingReportMessageParseFailed => "incoming-report.message-parse-failed", + MetricType::IncomingReportDmarcParseFailed => "incoming-report.dmarc-parse-failed", + MetricType::IncomingReportTlsRpcParseFailed => "incoming-report.tls-rpc-parse-failed", + MetricType::IncomingReportArfParseFailed => "incoming-report.arf-parse-failed", + MetricType::IncomingReportDecompressError => "incoming-report.decompress-error", + MetricType::IprevPass => "iprev.pass", + MetricType::IprevFail => "iprev.fail", + MetricType::IprevPermError => "iprev.perm-error", + MetricType::IprevTempError => "iprev.temp-error", + MetricType::IprevNone => "iprev.none", + MetricType::JmapMethodCall => "jmap.method-call", + MetricType::JmapInvalidArguments => "jmap.invalid-arguments", + MetricType::JmapRequestTooLarge => "jmap.request-too-large", + MetricType::JmapUnsupportedFilter => "jmap.unsupported-filter", + MetricType::JmapUnsupportedSort => "jmap.unsupported-sort", + MetricType::JmapUnknownMethod => "jmap.unknown-method", + MetricType::JmapForbidden => "jmap.forbidden", + MetricType::JmapNotJson => "jmap.not-json", + MetricType::JmapNotRequest => "jmap.not-request", + MetricType::JmapWebsocketStart => "jmap.websocket-start", + MetricType::JmapWebsocketError => "jmap.websocket-error", + MetricType::LimitSizeRequest => "limit.size-request", + MetricType::LimitSizeUpload => "limit.size-upload", + MetricType::LimitCallsIn => "limit.calls-in", + MetricType::LimitConcurrentRequest => "limit.concurrent-request", + MetricType::LimitConcurrentUpload => "limit.concurrent-upload", + MetricType::LimitConcurrentConnection => "limit.concurrent-connection", + MetricType::LimitQuota => "limit.quota", + MetricType::LimitBlobQuota => "limit.blob-quota", + MetricType::LimitTenantQuota => "limit.tenant-quota", + MetricType::LimitTooManyRequests => "limit.too-many-requests", + MetricType::MailAuthParseError => "mail-auth.parse-error", + MetricType::MailAuthMissingParameters => "mail-auth.missing-parameters", + MetricType::MailAuthNoHeadersFound => "mail-auth.no-headers-found", + MetricType::MailAuthCrypto => "mail-auth.crypto", + MetricType::MailAuthIo => "mail-auth.io", + MetricType::MailAuthBase64 => "mail-auth.base64", + MetricType::MailAuthDnsError => "mail-auth.dns-error", + MetricType::MailAuthDnsRecordNotFound => "mail-auth.dns-record-not-found", + MetricType::MailAuthDnsInvalidRecordType => "mail-auth.dns-invalid-record-type", + MetricType::MailAuthPolicyNotAligned => "mail-auth.policy-not-aligned", + MetricType::ManageSieveConnectionStart => "manage-sieve.connection-start", + MetricType::ManageSieveConnectionEnd => "manage-sieve.connection-end", + MetricType::MessageSize => "message.size", + MetricType::MessageAuthenticatedSize => "message.authenticated-size", + MetricType::MessageIngestTime => "message-ingest.time", + MetricType::MessageIngestIndexTime => "message-ingest.index-time", + MetricType::MessageIngestHam => "message-ingest.ham", + MetricType::MessageIngestSpam => "message-ingest.spam", + MetricType::MessageIngestImapAppend => "message-ingest.imap-append", + MetricType::MessageIngestJmapAppend => "message-ingest.jmap-append", + MetricType::MessageIngestDuplicate => "message-ingest.duplicate", + MetricType::MessageIngestError => "message-ingest.error", + MetricType::MessageIngestFtsIndex => "message-ingest.fts-index", + MetricType::MilterActionAccept => "milter.action-accept", + MetricType::MilterActionDiscard => "milter.action-discard", + MetricType::MilterActionReject => "milter.action-reject", + MetricType::MilterActionTempFail => "milter.action-temp-fail", + MetricType::MilterActionReplyCode => "milter.action-reply-code", + MetricType::MilterActionConnectionFailure => "milter.action-connection-failure", + MetricType::MilterActionShutdown => "milter.action-shutdown", + MetricType::MtaHookActionAccept => "mta-hook.action-accept", + MetricType::MtaHookActionDiscard => "mta-hook.action-discard", + MetricType::MtaHookActionReject => "mta-hook.action-reject", + MetricType::MtaHookActionQuarantine => "mta-hook.action-quarantine", + MetricType::MtaHookError => "mta-hook.error", + MetricType::MtaStsAuthorized => "mta-sts.authorized", + MetricType::MtaStsNotAuthorized => "mta-sts.not-authorized", + MetricType::MtaStsInvalidPolicy => "mta-sts.invalid-policy", + MetricType::NetworkTimeout => "network.timeout", + MetricType::OutgoingReportSize => "outgoing-report.size", + MetricType::OutgoingReportSpfReport => "outgoing-report.spf-report", + MetricType::OutgoingReportSpfRateLimited => "outgoing-report.spf-rate-limited", + MetricType::OutgoingReportDkimReport => "outgoing-report.dkim-report", + MetricType::OutgoingReportDkimRateLimited => "outgoing-report.dkim-rate-limited", + MetricType::OutgoingReportDmarcReport => "outgoing-report.dmarc-report", + MetricType::OutgoingReportDmarcRateLimited => "outgoing-report.dmarc-rate-limited", + MetricType::OutgoingReportDmarcAggregateReport => { + "outgoing-report.dmarc-aggregate-report" + } + MetricType::OutgoingReportTlsAggregate => "outgoing-report.tls-aggregate", + MetricType::OutgoingReportHttpSubmission => "outgoing-report.http-submission", + MetricType::OutgoingReportUnauthorizedReportingAddress => { + "outgoing-report.unauthorized-reporting-address" + } + MetricType::OutgoingReportReportingAddressValidationError => { + "outgoing-report.reporting-address-validation-error" + } + MetricType::OutgoingReportNotFound => "outgoing-report.not-found", + MetricType::OutgoingReportSubmissionError => "outgoing-report.submission-error", + MetricType::OutgoingReportNoRecipientsFound => "outgoing-report.no-recipients-found", + MetricType::Pop3RequestTime => "pop3.request-time", + MetricType::Pop3ActiveConnections => "pop3.active-connections", + MetricType::Pop3ConnectionStart => "pop3.connection-start", + MetricType::Pop3ConnectionEnd => "pop3.connection-end", + MetricType::PurgeError => "purge.error", + MetricType::PushSubscriptionSuccess => "push-subscription.success", + MetricType::PushSubscriptionError => "push-subscription.error", + MetricType::PushSubscriptionNotFound => "push-subscription.not-found", + MetricType::QueueCount => "queue.count", + MetricType::QueueQueueMessage => "queue.queue-message", + MetricType::QueueQueueMessageAuthenticated => "queue.queue-message-authenticated", + MetricType::QueueQueueReport => "queue.queue-report", + MetricType::QueueQueueDsn => "queue.queue-dsn", + MetricType::QueueQueueAutogenerated => "queue.queue-autogenerated", + MetricType::QueueRescheduled => "queue.rescheduled", + MetricType::QueueBlobNotFound => "queue.blob-not-found", + MetricType::QueueRateLimitExceeded => "queue.rate-limit-exceeded", + MetricType::QueueConcurrencyLimitExceeded => "queue.concurrency-limit-exceeded", + MetricType::QueueQuotaExceeded => "queue.quota-exceeded", + MetricType::ResourceNotFound => "resource.not-found", + MetricType::ResourceBadParameters => "resource.bad-parameters", + MetricType::ResourceError => "resource.error", + MetricType::SecurityAuthenticationBan => "security.authentication-ban", + MetricType::SecurityAbuseBan => "security.abuse-ban", + MetricType::SecurityScanBan => "security.scan-ban", + MetricType::SecurityLoiterBan => "security.loiter-ban", + MetricType::SecurityIpBlocked => "security.ip-blocked", + MetricType::SecurityUnauthorized => "security.unauthorized", + MetricType::ServerMemory => "server.memory", + MetricType::ServerThreadError => "server.thread-error", + MetricType::SieveRequestTime => "sieve.request-time", + MetricType::SieveActiveConnections => "sieve.active-connections", + MetricType::SieveActionAccept => "sieve.action-accept", + MetricType::SieveActionAcceptReplace => "sieve.action-accept-replace", + MetricType::SieveActionDiscard => "sieve.action-discard", + MetricType::SieveActionReject => "sieve.action-reject", + MetricType::SieveSendMessage => "sieve.send-message", + MetricType::SieveMessageTooLarge => "sieve.message-too-large", + MetricType::SieveRuntimeError => "sieve.runtime-error", + MetricType::SieveUnexpectedError => "sieve.unexpected-error", + MetricType::SieveNotSupported => "sieve.not-supported", + MetricType::SieveQuotaExceeded => "sieve.quota-exceeded", + MetricType::SmtpRequestTime => "smtp.request-time", + MetricType::SmtpActiveConnections => "smtp.active-connections", + MetricType::SmtpConnectionStart => "smtp.connection-start", + MetricType::SmtpConnectionEnd => "smtp.connection-end", + MetricType::SmtpError => "smtp.error", + MetricType::SmtpConcurrencyLimitExceeded => "smtp.concurrency-limit-exceeded", + MetricType::SmtpTransferLimitExceeded => "smtp.transfer-limit-exceeded", + MetricType::SmtpRateLimitExceeded => "smtp.rate-limit-exceeded", + MetricType::SmtpTimeLimitExceeded => "smtp.time-limit-exceeded", + MetricType::SmtpMessageParseFailed => "smtp.message-parse-failed", + MetricType::SmtpMessageTooLarge => "smtp.message-too-large", + MetricType::SmtpLoopDetected => "smtp.loop-detected", + MetricType::SmtpDkimPass => "smtp.dkim-pass", + MetricType::SmtpDkimFail => "smtp.dkim-fail", + MetricType::SmtpArcPass => "smtp.arc-pass", + MetricType::SmtpArcFail => "smtp.arc-fail", + MetricType::SmtpSpfEhloPass => "smtp.spf-ehlo-pass", + MetricType::SmtpSpfEhloFail => "smtp.spf-ehlo-fail", + MetricType::SmtpSpfFromPass => "smtp.spf-from-pass", + MetricType::SmtpSpfFromFail => "smtp.spf-from-fail", + MetricType::SmtpDmarcPass => "smtp.dmarc-pass", + MetricType::SmtpDmarcFail => "smtp.dmarc-fail", + MetricType::SmtpIprevPass => "smtp.iprev-pass", + MetricType::SmtpIprevFail => "smtp.iprev-fail", + MetricType::SmtpTooManyMessages => "smtp.too-many-messages", + MetricType::SmtpInvalidEhlo => "smtp.invalid-ehlo", + MetricType::SmtpDidNotSayEhlo => "smtp.did-not-say-ehlo", + MetricType::SmtpMailFromUnauthenticated => "smtp.mail-from-unauthenticated", + MetricType::SmtpMailFromUnauthorized => "smtp.mail-from-unauthorized", + MetricType::SmtpMailFromMissing => "smtp.mail-from-missing", + MetricType::SmtpMultipleMailFrom => "smtp.multiple-mail-from", + MetricType::SmtpMailboxDoesNotExist => "smtp.mailbox-does-not-exist", + MetricType::SmtpRelayNotAllowed => "smtp.relay-not-allowed", + MetricType::SmtpRcptToDuplicate => "smtp.rcpt-to-duplicate", + MetricType::SmtpRcptToMissing => "smtp.rcpt-to-missing", + MetricType::SmtpTooManyRecipients => "smtp.too-many-recipients", + MetricType::SmtpTooManyInvalidRcpt => "smtp.too-many-invalid-rcpt", + MetricType::SmtpAuthMechanismNotSupported => "smtp.auth-mechanism-not-supported", + MetricType::SmtpAuthExchangeTooLong => "smtp.auth-exchange-too-long", + MetricType::SmtpCommandNotImplemented => "smtp.command-not-implemented", + MetricType::SmtpInvalidCommand => "smtp.invalid-command", + MetricType::SmtpSyntaxError => "smtp.syntax-error", + MetricType::SmtpRequestTooLarge => "smtp.request-too-large", + MetricType::SpamPyzorError => "spam.pyzor-error", + MetricType::SpamDnsblError => "spam.dnsbl-error", + MetricType::SpamTrainCompleted => "spam.train-completed", + MetricType::SpamTrainSampleAdded => "spam.train-sample-added", + MetricType::SpamClassify => "spam.classify", + MetricType::SpamModelNotReady => "spam.model-not-ready", + MetricType::SpfPass => "spf.pass", + MetricType::SpfFail => "spf.fail", + MetricType::SpfSoftFail => "spf.soft-fail", + MetricType::SpfNeutral => "spf.neutral", + MetricType::SpfTempError => "spf.temp-error", + MetricType::SpfPermError => "spf.perm-error", + MetricType::SpfNone => "spf.none", + MetricType::StoreDataReadTime => "store.data-read-time", + MetricType::StoreDataWriteTime => "store.data-write-time", + MetricType::StoreBlobReadTime => "store.blob-read-time", + MetricType::StoreBlobWriteTime => "store.blob-write-time", + MetricType::StoreAssertValueFailed => "store.assert-value-failed", + MetricType::StoreFoundationdbError => "store.foundationdb-error", + MetricType::StoreMysqlError => "store.mysql-error", + MetricType::StorePostgresqlError => "store.postgresql-error", + MetricType::StoreRocksdbError => "store.rocksdb-error", + MetricType::StoreSqliteError => "store.sqlite-error", + MetricType::StoreLdapError => "store.ldap-error", + MetricType::StoreElasticsearchError => "store.elasticsearch-error", + MetricType::StoreRedisError => "store.redis-error", + MetricType::StoreS3Error => "store.s3-error", + MetricType::StoreAzureError => "store.azure-error", + MetricType::StoreFilesystemError => "store.filesystem-error", + MetricType::StorePoolError => "store.pool-error", + MetricType::StoreDataCorruption => "store.data-corruption", + MetricType::StoreDecompressError => "store.decompress-error", + MetricType::StoreDeserializeError => "store.deserialize-error", + MetricType::StoreNotFound => "store.not-found", + MetricType::StoreNotConfigured => "store.not-configured", + MetricType::StoreNotSupported => "store.not-supported", + MetricType::StoreUnexpectedError => "store.unexpected-error", + MetricType::StoreCryptoError => "store.crypto-error", + MetricType::StoreHttpStoreError => "store.http-store-error", + MetricType::StoreBlobMissingMarker => "store.blob-missing-marker", + MetricType::StoreDataWrite => "store.data-write", + MetricType::StoreDataIterate => "store.data-iterate", + MetricType::StoreBlobRead => "store.blob-read", + MetricType::StoreBlobWrite => "store.blob-write", + MetricType::StoreBlobDelete => "store.blob-delete", + MetricType::TaskQueueBlobNotFound => "task-queue.blob-not-found", + MetricType::TaskQueueMetadataNotFound => "task-queue.metadata-not-found", + MetricType::TelemetryLogError => "telemetry.log-error", + MetricType::TelemetryWebhookError => "telemetry.webhook-error", + MetricType::TelemetryOtelExporterError => "telemetry.otel-exporter-error", + MetricType::TelemetryOtelMetricsExporterError => { + "telemetry.otel-metrics-exporter-error" + } + MetricType::TelemetryPrometheusExporterError => "telemetry.prometheus-exporter-error", + MetricType::TelemetryJournalError => "telemetry.journal-error", + MetricType::TlsHandshakeError => "tls.handshake-error", + MetricType::UserCount => "user.count", + } + } + + pub fn to_id(&self) -> u16 { + match self { + MetricType::AcmeAuthError => 27, + MetricType::AcmeAuthTooManyAttempts => 28, + MetricType::AcmeOrderCompleted => 29, + MetricType::AcmeOrderInvalid => 30, + MetricType::AcmeClientMissingSni => 31, + MetricType::AcmeTlsAlpnError => 32, + MetricType::AcmeTokenNotFound => 33, + MetricType::AcmeError => 34, + MetricType::ArcChainTooLong => 39, + MetricType::ArcInvalidInstance => 40, + MetricType::ArcInvalidCv => 41, + MetricType::ArcHasHeaderTag => 42, + MetricType::ArcBrokenChain => 43, + MetricType::AuthSuccess => 44, + MetricType::AuthFailed => 45, + MetricType::AuthTooManyAttempts => 46, + MetricType::AuthError => 47, + MetricType::CalendarAlarmSent => 48, + MetricType::CalendarAlarmFailed => 49, + MetricType::CalendarItipMessageSent => 50, + MetricType::CalendarItipMessageReceived => 51, + MetricType::CalendarItipMessageError => 52, + MetricType::ClusterSubscriberError => 53, + MetricType::ClusterSubscriberDisconnected => 54, + MetricType::ClusterPublisherError => 55, + MetricType::DaneAuthenticationSuccess => 56, + MetricType::DaneAuthenticationFailure => 57, + MetricType::DaneNoCertificatesFound => 58, + MetricType::DaneCertificateParseError => 59, + MetricType::DaneTlsaRecordFetchError => 60, + MetricType::DaneTlsaRecordNotFound => 61, + MetricType::DaneTlsaRecordNotDnssecSigned => 62, + MetricType::DaneTlsaRecordInvalid => 63, + MetricType::DeliveryTotalTime => 2, + MetricType::DeliveryAttemptTime => 3, + MetricType::DeliveryActiveConnections => 22, + MetricType::DeliveryAttemptStart => 64, + MetricType::DeliveryAttemptEnd => 65, + MetricType::DeliveryCompleted => 66, + MetricType::DeliveryMxLookupFailed => 67, + MetricType::DeliveryIpLookupFailed => 68, + MetricType::DeliveryNullMx => 69, + MetricType::DeliveryGreetingFailed => 70, + MetricType::DeliveryEhloRejected => 71, + MetricType::DeliveryAuthFailed => 72, + MetricType::DeliveryMailFromRejected => 73, + MetricType::DeliveryDelivered => 74, + MetricType::DeliveryRcptToRejected => 75, + MetricType::DeliveryRcptToFailed => 76, + MetricType::DeliveryMessageRejected => 77, + MetricType::DeliveryStartTlsUnavailable => 78, + MetricType::DeliveryStartTlsError => 79, + MetricType::DeliveryStartTlsDisabled => 80, + MetricType::DeliveryImplicitTlsError => 81, + MetricType::DeliveryConcurrencyLimitExceeded => 82, + MetricType::DeliveryRateLimitExceeded => 83, + MetricType::DeliveryDoubleBounce => 84, + MetricType::DeliveryDsnSuccess => 85, + MetricType::DeliveryDsnTempFail => 86, + MetricType::DeliveryDsnPermFail => 87, + MetricType::DkimPass => 88, + MetricType::DkimNeutral => 89, + MetricType::DkimFail => 90, + MetricType::DkimPermError => 91, + MetricType::DkimTempError => 92, + MetricType::DkimNone => 93, + MetricType::DkimUnsupportedVersion => 94, + MetricType::DkimUnsupportedAlgorithm => 95, + MetricType::DkimUnsupportedCanonicalization => 96, + MetricType::DkimUnsupportedKeyType => 97, + MetricType::DkimFailedBodyHashMatch => 98, + MetricType::DkimFailedVerification => 99, + MetricType::DkimFailedAuidMatch => 100, + MetricType::DkimRevokedPublicKey => 101, + MetricType::DkimIncompatibleAlgorithms => 102, + MetricType::DkimSignatureExpired => 103, + MetricType::DkimSignatureLength => 104, + MetricType::DkimSignerNotFound => 105, + MetricType::DmarcPass => 106, + MetricType::DmarcFail => 107, + MetricType::DmarcPermError => 108, + MetricType::DmarcTempError => 109, + MetricType::DmarcNone => 110, + MetricType::DnsLookupTime => 11, + MetricType::DnsRecordCreationFailed => 35, + MetricType::DnsRecordDeletionFailed => 36, + MetricType::DnsRecordLookupFailed => 37, + MetricType::DnsRecordPropagationTimeout => 38, + MetricType::DomainCount => 26, + MetricType::EvalError => 111, + MetricType::EvalDirectoryNotFound => 112, + MetricType::EvalStoreNotFound => 113, + MetricType::HttpRequestTime => 12, + MetricType::HttpActiveConnections => 17, + MetricType::HttpError => 114, + MetricType::HttpRequestBody => 115, + MetricType::HttpResponseBody => 116, + MetricType::HttpXForwardedMissing => 117, + MetricType::ImapRequestTime => 13, + MetricType::ImapActiveConnections => 18, + MetricType::ImapConnectionStart => 118, + MetricType::ImapConnectionEnd => 119, + MetricType::IncomingReportDmarcReport => 120, + MetricType::IncomingReportDmarcReportWithWarnings => 121, + MetricType::IncomingReportTlsReport => 122, + MetricType::IncomingReportTlsReportWithWarnings => 123, + MetricType::IncomingReportAbuseReport => 124, + MetricType::IncomingReportAuthFailureReport => 125, + MetricType::IncomingReportFraudReport => 126, + MetricType::IncomingReportNotSpamReport => 127, + MetricType::IncomingReportVirusReport => 128, + MetricType::IncomingReportOtherReport => 129, + MetricType::IncomingReportMessageParseFailed => 130, + MetricType::IncomingReportDmarcParseFailed => 131, + MetricType::IncomingReportTlsRpcParseFailed => 132, + MetricType::IncomingReportArfParseFailed => 133, + MetricType::IncomingReportDecompressError => 134, + MetricType::IprevPass => 135, + MetricType::IprevFail => 136, + MetricType::IprevPermError => 137, + MetricType::IprevTempError => 138, + MetricType::IprevNone => 139, + MetricType::JmapMethodCall => 140, + MetricType::JmapInvalidArguments => 141, + MetricType::JmapRequestTooLarge => 142, + MetricType::JmapUnsupportedFilter => 143, + MetricType::JmapUnsupportedSort => 144, + MetricType::JmapUnknownMethod => 145, + MetricType::JmapForbidden => 146, + MetricType::JmapNotJson => 147, + MetricType::JmapNotRequest => 148, + MetricType::JmapWebsocketStart => 149, + MetricType::JmapWebsocketError => 150, + MetricType::LimitSizeRequest => 151, + MetricType::LimitSizeUpload => 152, + MetricType::LimitCallsIn => 153, + MetricType::LimitConcurrentRequest => 154, + MetricType::LimitConcurrentUpload => 155, + MetricType::LimitConcurrentConnection => 156, + MetricType::LimitQuota => 157, + MetricType::LimitBlobQuota => 158, + MetricType::LimitTenantQuota => 159, + MetricType::LimitTooManyRequests => 160, + MetricType::MailAuthParseError => 161, + MetricType::MailAuthMissingParameters => 162, + MetricType::MailAuthNoHeadersFound => 163, + MetricType::MailAuthCrypto => 164, + MetricType::MailAuthIo => 165, + MetricType::MailAuthBase64 => 166, + MetricType::MailAuthDnsError => 167, + MetricType::MailAuthDnsRecordNotFound => 168, + MetricType::MailAuthDnsInvalidRecordType => 169, + MetricType::MailAuthPolicyNotAligned => 170, + MetricType::ManageSieveConnectionStart => 171, + MetricType::ManageSieveConnectionEnd => 172, + MetricType::MessageSize => 4, + MetricType::MessageAuthenticatedSize => 5, + MetricType::MessageIngestTime => 0, + MetricType::MessageIngestIndexTime => 1, + MetricType::MessageIngestHam => 173, + MetricType::MessageIngestSpam => 174, + MetricType::MessageIngestImapAppend => 175, + MetricType::MessageIngestJmapAppend => 176, + MetricType::MessageIngestDuplicate => 177, + MetricType::MessageIngestError => 178, + MetricType::MessageIngestFtsIndex => 179, + MetricType::MilterActionAccept => 180, + MetricType::MilterActionDiscard => 181, + MetricType::MilterActionReject => 182, + MetricType::MilterActionTempFail => 183, + MetricType::MilterActionReplyCode => 184, + MetricType::MilterActionConnectionFailure => 185, + MetricType::MilterActionShutdown => 186, + MetricType::MtaHookActionAccept => 187, + MetricType::MtaHookActionDiscard => 188, + MetricType::MtaHookActionReject => 189, + MetricType::MtaHookActionQuarantine => 190, + MetricType::MtaHookError => 191, + MetricType::MtaStsAuthorized => 192, + MetricType::MtaStsNotAuthorized => 193, + MetricType::MtaStsInvalidPolicy => 194, + MetricType::NetworkTimeout => 195, + MetricType::OutgoingReportSize => 6, + MetricType::OutgoingReportSpfReport => 196, + MetricType::OutgoingReportSpfRateLimited => 197, + MetricType::OutgoingReportDkimReport => 198, + MetricType::OutgoingReportDkimRateLimited => 199, + MetricType::OutgoingReportDmarcReport => 200, + MetricType::OutgoingReportDmarcRateLimited => 201, + MetricType::OutgoingReportDmarcAggregateReport => 202, + MetricType::OutgoingReportTlsAggregate => 203, + MetricType::OutgoingReportHttpSubmission => 204, + MetricType::OutgoingReportUnauthorizedReportingAddress => 205, + MetricType::OutgoingReportReportingAddressValidationError => 206, + MetricType::OutgoingReportNotFound => 207, + MetricType::OutgoingReportSubmissionError => 208, + MetricType::OutgoingReportNoRecipientsFound => 209, + MetricType::Pop3RequestTime => 14, + MetricType::Pop3ActiveConnections => 19, + MetricType::Pop3ConnectionStart => 210, + MetricType::Pop3ConnectionEnd => 211, + MetricType::PurgeError => 212, + MetricType::PushSubscriptionSuccess => 213, + MetricType::PushSubscriptionError => 214, + MetricType::PushSubscriptionNotFound => 215, + MetricType::QueueCount => 24, + MetricType::QueueQueueMessage => 216, + MetricType::QueueQueueMessageAuthenticated => 217, + MetricType::QueueQueueReport => 218, + MetricType::QueueQueueDsn => 219, + MetricType::QueueQueueAutogenerated => 220, + MetricType::QueueRescheduled => 221, + MetricType::QueueBlobNotFound => 222, + MetricType::QueueRateLimitExceeded => 223, + MetricType::QueueConcurrencyLimitExceeded => 224, + MetricType::QueueQuotaExceeded => 225, + MetricType::ResourceNotFound => 226, + MetricType::ResourceBadParameters => 227, + MetricType::ResourceError => 228, + MetricType::SecurityAuthenticationBan => 229, + MetricType::SecurityAbuseBan => 230, + MetricType::SecurityScanBan => 231, + MetricType::SecurityLoiterBan => 232, + MetricType::SecurityIpBlocked => 233, + MetricType::SecurityUnauthorized => 234, + MetricType::ServerMemory => 23, + MetricType::ServerThreadError => 235, + MetricType::SieveRequestTime => 16, + MetricType::SieveActiveConnections => 21, + MetricType::SieveActionAccept => 236, + MetricType::SieveActionAcceptReplace => 237, + MetricType::SieveActionDiscard => 238, + MetricType::SieveActionReject => 239, + MetricType::SieveSendMessage => 240, + MetricType::SieveMessageTooLarge => 241, + MetricType::SieveRuntimeError => 242, + MetricType::SieveUnexpectedError => 243, + MetricType::SieveNotSupported => 244, + MetricType::SieveQuotaExceeded => 245, + MetricType::SmtpRequestTime => 15, + MetricType::SmtpActiveConnections => 20, + MetricType::SmtpConnectionStart => 246, + MetricType::SmtpConnectionEnd => 247, + MetricType::SmtpError => 248, + MetricType::SmtpConcurrencyLimitExceeded => 249, + MetricType::SmtpTransferLimitExceeded => 250, + MetricType::SmtpRateLimitExceeded => 251, + MetricType::SmtpTimeLimitExceeded => 252, + MetricType::SmtpMessageParseFailed => 253, + MetricType::SmtpMessageTooLarge => 254, + MetricType::SmtpLoopDetected => 255, + MetricType::SmtpDkimPass => 256, + MetricType::SmtpDkimFail => 257, + MetricType::SmtpArcPass => 258, + MetricType::SmtpArcFail => 259, + MetricType::SmtpSpfEhloPass => 260, + MetricType::SmtpSpfEhloFail => 261, + MetricType::SmtpSpfFromPass => 262, + MetricType::SmtpSpfFromFail => 263, + MetricType::SmtpDmarcPass => 264, + MetricType::SmtpDmarcFail => 265, + MetricType::SmtpIprevPass => 266, + MetricType::SmtpIprevFail => 267, + MetricType::SmtpTooManyMessages => 268, + MetricType::SmtpInvalidEhlo => 269, + MetricType::SmtpDidNotSayEhlo => 270, + MetricType::SmtpMailFromUnauthenticated => 271, + MetricType::SmtpMailFromUnauthorized => 272, + MetricType::SmtpMailFromMissing => 273, + MetricType::SmtpMultipleMailFrom => 274, + MetricType::SmtpMailboxDoesNotExist => 275, + MetricType::SmtpRelayNotAllowed => 276, + MetricType::SmtpRcptToDuplicate => 277, + MetricType::SmtpRcptToMissing => 278, + MetricType::SmtpTooManyRecipients => 279, + MetricType::SmtpTooManyInvalidRcpt => 280, + MetricType::SmtpAuthMechanismNotSupported => 281, + MetricType::SmtpAuthExchangeTooLong => 282, + MetricType::SmtpCommandNotImplemented => 283, + MetricType::SmtpInvalidCommand => 284, + MetricType::SmtpSyntaxError => 285, + MetricType::SmtpRequestTooLarge => 286, + MetricType::SpamPyzorError => 287, + MetricType::SpamDnsblError => 288, + MetricType::SpamTrainCompleted => 289, + MetricType::SpamTrainSampleAdded => 290, + MetricType::SpamClassify => 291, + MetricType::SpamModelNotReady => 292, + MetricType::SpfPass => 293, + MetricType::SpfFail => 294, + MetricType::SpfSoftFail => 295, + MetricType::SpfNeutral => 296, + MetricType::SpfTempError => 297, + MetricType::SpfPermError => 298, + MetricType::SpfNone => 299, + MetricType::StoreDataReadTime => 7, + MetricType::StoreDataWriteTime => 8, + MetricType::StoreBlobReadTime => 9, + MetricType::StoreBlobWriteTime => 10, + MetricType::StoreAssertValueFailed => 300, + MetricType::StoreFoundationdbError => 301, + MetricType::StoreMysqlError => 302, + MetricType::StorePostgresqlError => 303, + MetricType::StoreRocksdbError => 304, + MetricType::StoreSqliteError => 305, + MetricType::StoreLdapError => 306, + MetricType::StoreElasticsearchError => 307, + MetricType::StoreRedisError => 308, + MetricType::StoreS3Error => 309, + MetricType::StoreAzureError => 310, + MetricType::StoreFilesystemError => 311, + MetricType::StorePoolError => 312, + MetricType::StoreDataCorruption => 313, + MetricType::StoreDecompressError => 314, + MetricType::StoreDeserializeError => 315, + MetricType::StoreNotFound => 316, + MetricType::StoreNotConfigured => 317, + MetricType::StoreNotSupported => 318, + MetricType::StoreUnexpectedError => 319, + MetricType::StoreCryptoError => 320, + MetricType::StoreHttpStoreError => 321, + MetricType::StoreBlobMissingMarker => 322, + MetricType::StoreDataWrite => 323, + MetricType::StoreDataIterate => 324, + MetricType::StoreBlobRead => 325, + MetricType::StoreBlobWrite => 326, + MetricType::StoreBlobDelete => 327, + MetricType::TaskQueueBlobNotFound => 328, + MetricType::TaskQueueMetadataNotFound => 329, + MetricType::TelemetryLogError => 330, + MetricType::TelemetryWebhookError => 331, + MetricType::TelemetryOtelExporterError => 332, + MetricType::TelemetryOtelMetricsExporterError => 333, + MetricType::TelemetryPrometheusExporterError => 334, + MetricType::TelemetryJournalError => 335, + MetricType::TlsHandshakeError => 336, + MetricType::UserCount => 25, + } + } + + pub fn from_id(id: u16) -> Option { + match id { + 27 => Some(MetricType::AcmeAuthError), + 28 => Some(MetricType::AcmeAuthTooManyAttempts), + 29 => Some(MetricType::AcmeOrderCompleted), + 30 => Some(MetricType::AcmeOrderInvalid), + 31 => Some(MetricType::AcmeClientMissingSni), + 32 => Some(MetricType::AcmeTlsAlpnError), + 33 => Some(MetricType::AcmeTokenNotFound), + 34 => Some(MetricType::AcmeError), + 39 => Some(MetricType::ArcChainTooLong), + 40 => Some(MetricType::ArcInvalidInstance), + 41 => Some(MetricType::ArcInvalidCv), + 42 => Some(MetricType::ArcHasHeaderTag), + 43 => Some(MetricType::ArcBrokenChain), + 44 => Some(MetricType::AuthSuccess), + 45 => Some(MetricType::AuthFailed), + 46 => Some(MetricType::AuthTooManyAttempts), + 47 => Some(MetricType::AuthError), + 48 => Some(MetricType::CalendarAlarmSent), + 49 => Some(MetricType::CalendarAlarmFailed), + 50 => Some(MetricType::CalendarItipMessageSent), + 51 => Some(MetricType::CalendarItipMessageReceived), + 52 => Some(MetricType::CalendarItipMessageError), + 53 => Some(MetricType::ClusterSubscriberError), + 54 => Some(MetricType::ClusterSubscriberDisconnected), + 55 => Some(MetricType::ClusterPublisherError), + 56 => Some(MetricType::DaneAuthenticationSuccess), + 57 => Some(MetricType::DaneAuthenticationFailure), + 58 => Some(MetricType::DaneNoCertificatesFound), + 59 => Some(MetricType::DaneCertificateParseError), + 60 => Some(MetricType::DaneTlsaRecordFetchError), + 61 => Some(MetricType::DaneTlsaRecordNotFound), + 62 => Some(MetricType::DaneTlsaRecordNotDnssecSigned), + 63 => Some(MetricType::DaneTlsaRecordInvalid), + 2 => Some(MetricType::DeliveryTotalTime), + 3 => Some(MetricType::DeliveryAttemptTime), + 22 => Some(MetricType::DeliveryActiveConnections), + 64 => Some(MetricType::DeliveryAttemptStart), + 65 => Some(MetricType::DeliveryAttemptEnd), + 66 => Some(MetricType::DeliveryCompleted), + 67 => Some(MetricType::DeliveryMxLookupFailed), + 68 => Some(MetricType::DeliveryIpLookupFailed), + 69 => Some(MetricType::DeliveryNullMx), + 70 => Some(MetricType::DeliveryGreetingFailed), + 71 => Some(MetricType::DeliveryEhloRejected), + 72 => Some(MetricType::DeliveryAuthFailed), + 73 => Some(MetricType::DeliveryMailFromRejected), + 74 => Some(MetricType::DeliveryDelivered), + 75 => Some(MetricType::DeliveryRcptToRejected), + 76 => Some(MetricType::DeliveryRcptToFailed), + 77 => Some(MetricType::DeliveryMessageRejected), + 78 => Some(MetricType::DeliveryStartTlsUnavailable), + 79 => Some(MetricType::DeliveryStartTlsError), + 80 => Some(MetricType::DeliveryStartTlsDisabled), + 81 => Some(MetricType::DeliveryImplicitTlsError), + 82 => Some(MetricType::DeliveryConcurrencyLimitExceeded), + 83 => Some(MetricType::DeliveryRateLimitExceeded), + 84 => Some(MetricType::DeliveryDoubleBounce), + 85 => Some(MetricType::DeliveryDsnSuccess), + 86 => Some(MetricType::DeliveryDsnTempFail), + 87 => Some(MetricType::DeliveryDsnPermFail), + 88 => Some(MetricType::DkimPass), + 89 => Some(MetricType::DkimNeutral), + 90 => Some(MetricType::DkimFail), + 91 => Some(MetricType::DkimPermError), + 92 => Some(MetricType::DkimTempError), + 93 => Some(MetricType::DkimNone), + 94 => Some(MetricType::DkimUnsupportedVersion), + 95 => Some(MetricType::DkimUnsupportedAlgorithm), + 96 => Some(MetricType::DkimUnsupportedCanonicalization), + 97 => Some(MetricType::DkimUnsupportedKeyType), + 98 => Some(MetricType::DkimFailedBodyHashMatch), + 99 => Some(MetricType::DkimFailedVerification), + 100 => Some(MetricType::DkimFailedAuidMatch), + 101 => Some(MetricType::DkimRevokedPublicKey), + 102 => Some(MetricType::DkimIncompatibleAlgorithms), + 103 => Some(MetricType::DkimSignatureExpired), + 104 => Some(MetricType::DkimSignatureLength), + 105 => Some(MetricType::DkimSignerNotFound), + 106 => Some(MetricType::DmarcPass), + 107 => Some(MetricType::DmarcFail), + 108 => Some(MetricType::DmarcPermError), + 109 => Some(MetricType::DmarcTempError), + 110 => Some(MetricType::DmarcNone), + 11 => Some(MetricType::DnsLookupTime), + 35 => Some(MetricType::DnsRecordCreationFailed), + 36 => Some(MetricType::DnsRecordDeletionFailed), + 37 => Some(MetricType::DnsRecordLookupFailed), + 38 => Some(MetricType::DnsRecordPropagationTimeout), + 26 => Some(MetricType::DomainCount), + 111 => Some(MetricType::EvalError), + 112 => Some(MetricType::EvalDirectoryNotFound), + 113 => Some(MetricType::EvalStoreNotFound), + 12 => Some(MetricType::HttpRequestTime), + 17 => Some(MetricType::HttpActiveConnections), + 114 => Some(MetricType::HttpError), + 115 => Some(MetricType::HttpRequestBody), + 116 => Some(MetricType::HttpResponseBody), + 117 => Some(MetricType::HttpXForwardedMissing), + 13 => Some(MetricType::ImapRequestTime), + 18 => Some(MetricType::ImapActiveConnections), + 118 => Some(MetricType::ImapConnectionStart), + 119 => Some(MetricType::ImapConnectionEnd), + 120 => Some(MetricType::IncomingReportDmarcReport), + 121 => Some(MetricType::IncomingReportDmarcReportWithWarnings), + 122 => Some(MetricType::IncomingReportTlsReport), + 123 => Some(MetricType::IncomingReportTlsReportWithWarnings), + 124 => Some(MetricType::IncomingReportAbuseReport), + 125 => Some(MetricType::IncomingReportAuthFailureReport), + 126 => Some(MetricType::IncomingReportFraudReport), + 127 => Some(MetricType::IncomingReportNotSpamReport), + 128 => Some(MetricType::IncomingReportVirusReport), + 129 => Some(MetricType::IncomingReportOtherReport), + 130 => Some(MetricType::IncomingReportMessageParseFailed), + 131 => Some(MetricType::IncomingReportDmarcParseFailed), + 132 => Some(MetricType::IncomingReportTlsRpcParseFailed), + 133 => Some(MetricType::IncomingReportArfParseFailed), + 134 => Some(MetricType::IncomingReportDecompressError), + 135 => Some(MetricType::IprevPass), + 136 => Some(MetricType::IprevFail), + 137 => Some(MetricType::IprevPermError), + 138 => Some(MetricType::IprevTempError), + 139 => Some(MetricType::IprevNone), + 140 => Some(MetricType::JmapMethodCall), + 141 => Some(MetricType::JmapInvalidArguments), + 142 => Some(MetricType::JmapRequestTooLarge), + 143 => Some(MetricType::JmapUnsupportedFilter), + 144 => Some(MetricType::JmapUnsupportedSort), + 145 => Some(MetricType::JmapUnknownMethod), + 146 => Some(MetricType::JmapForbidden), + 147 => Some(MetricType::JmapNotJson), + 148 => Some(MetricType::JmapNotRequest), + 149 => Some(MetricType::JmapWebsocketStart), + 150 => Some(MetricType::JmapWebsocketError), + 151 => Some(MetricType::LimitSizeRequest), + 152 => Some(MetricType::LimitSizeUpload), + 153 => Some(MetricType::LimitCallsIn), + 154 => Some(MetricType::LimitConcurrentRequest), + 155 => Some(MetricType::LimitConcurrentUpload), + 156 => Some(MetricType::LimitConcurrentConnection), + 157 => Some(MetricType::LimitQuota), + 158 => Some(MetricType::LimitBlobQuota), + 159 => Some(MetricType::LimitTenantQuota), + 160 => Some(MetricType::LimitTooManyRequests), + 161 => Some(MetricType::MailAuthParseError), + 162 => Some(MetricType::MailAuthMissingParameters), + 163 => Some(MetricType::MailAuthNoHeadersFound), + 164 => Some(MetricType::MailAuthCrypto), + 165 => Some(MetricType::MailAuthIo), + 166 => Some(MetricType::MailAuthBase64), + 167 => Some(MetricType::MailAuthDnsError), + 168 => Some(MetricType::MailAuthDnsRecordNotFound), + 169 => Some(MetricType::MailAuthDnsInvalidRecordType), + 170 => Some(MetricType::MailAuthPolicyNotAligned), + 171 => Some(MetricType::ManageSieveConnectionStart), + 172 => Some(MetricType::ManageSieveConnectionEnd), + 4 => Some(MetricType::MessageSize), + 5 => Some(MetricType::MessageAuthenticatedSize), + 0 => Some(MetricType::MessageIngestTime), + 1 => Some(MetricType::MessageIngestIndexTime), + 173 => Some(MetricType::MessageIngestHam), + 174 => Some(MetricType::MessageIngestSpam), + 175 => Some(MetricType::MessageIngestImapAppend), + 176 => Some(MetricType::MessageIngestJmapAppend), + 177 => Some(MetricType::MessageIngestDuplicate), + 178 => Some(MetricType::MessageIngestError), + 179 => Some(MetricType::MessageIngestFtsIndex), + 180 => Some(MetricType::MilterActionAccept), + 181 => Some(MetricType::MilterActionDiscard), + 182 => Some(MetricType::MilterActionReject), + 183 => Some(MetricType::MilterActionTempFail), + 184 => Some(MetricType::MilterActionReplyCode), + 185 => Some(MetricType::MilterActionConnectionFailure), + 186 => Some(MetricType::MilterActionShutdown), + 187 => Some(MetricType::MtaHookActionAccept), + 188 => Some(MetricType::MtaHookActionDiscard), + 189 => Some(MetricType::MtaHookActionReject), + 190 => Some(MetricType::MtaHookActionQuarantine), + 191 => Some(MetricType::MtaHookError), + 192 => Some(MetricType::MtaStsAuthorized), + 193 => Some(MetricType::MtaStsNotAuthorized), + 194 => Some(MetricType::MtaStsInvalidPolicy), + 195 => Some(MetricType::NetworkTimeout), + 6 => Some(MetricType::OutgoingReportSize), + 196 => Some(MetricType::OutgoingReportSpfReport), + 197 => Some(MetricType::OutgoingReportSpfRateLimited), + 198 => Some(MetricType::OutgoingReportDkimReport), + 199 => Some(MetricType::OutgoingReportDkimRateLimited), + 200 => Some(MetricType::OutgoingReportDmarcReport), + 201 => Some(MetricType::OutgoingReportDmarcRateLimited), + 202 => Some(MetricType::OutgoingReportDmarcAggregateReport), + 203 => Some(MetricType::OutgoingReportTlsAggregate), + 204 => Some(MetricType::OutgoingReportHttpSubmission), + 205 => Some(MetricType::OutgoingReportUnauthorizedReportingAddress), + 206 => Some(MetricType::OutgoingReportReportingAddressValidationError), + 207 => Some(MetricType::OutgoingReportNotFound), + 208 => Some(MetricType::OutgoingReportSubmissionError), + 209 => Some(MetricType::OutgoingReportNoRecipientsFound), + 14 => Some(MetricType::Pop3RequestTime), + 19 => Some(MetricType::Pop3ActiveConnections), + 210 => Some(MetricType::Pop3ConnectionStart), + 211 => Some(MetricType::Pop3ConnectionEnd), + 212 => Some(MetricType::PurgeError), + 213 => Some(MetricType::PushSubscriptionSuccess), + 214 => Some(MetricType::PushSubscriptionError), + 215 => Some(MetricType::PushSubscriptionNotFound), + 24 => Some(MetricType::QueueCount), + 216 => Some(MetricType::QueueQueueMessage), + 217 => Some(MetricType::QueueQueueMessageAuthenticated), + 218 => Some(MetricType::QueueQueueReport), + 219 => Some(MetricType::QueueQueueDsn), + 220 => Some(MetricType::QueueQueueAutogenerated), + 221 => Some(MetricType::QueueRescheduled), + 222 => Some(MetricType::QueueBlobNotFound), + 223 => Some(MetricType::QueueRateLimitExceeded), + 224 => Some(MetricType::QueueConcurrencyLimitExceeded), + 225 => Some(MetricType::QueueQuotaExceeded), + 226 => Some(MetricType::ResourceNotFound), + 227 => Some(MetricType::ResourceBadParameters), + 228 => Some(MetricType::ResourceError), + 229 => Some(MetricType::SecurityAuthenticationBan), + 230 => Some(MetricType::SecurityAbuseBan), + 231 => Some(MetricType::SecurityScanBan), + 232 => Some(MetricType::SecurityLoiterBan), + 233 => Some(MetricType::SecurityIpBlocked), + 234 => Some(MetricType::SecurityUnauthorized), + 23 => Some(MetricType::ServerMemory), + 235 => Some(MetricType::ServerThreadError), + 16 => Some(MetricType::SieveRequestTime), + 21 => Some(MetricType::SieveActiveConnections), + 236 => Some(MetricType::SieveActionAccept), + 237 => Some(MetricType::SieveActionAcceptReplace), + 238 => Some(MetricType::SieveActionDiscard), + 239 => Some(MetricType::SieveActionReject), + 240 => Some(MetricType::SieveSendMessage), + 241 => Some(MetricType::SieveMessageTooLarge), + 242 => Some(MetricType::SieveRuntimeError), + 243 => Some(MetricType::SieveUnexpectedError), + 244 => Some(MetricType::SieveNotSupported), + 245 => Some(MetricType::SieveQuotaExceeded), + 15 => Some(MetricType::SmtpRequestTime), + 20 => Some(MetricType::SmtpActiveConnections), + 246 => Some(MetricType::SmtpConnectionStart), + 247 => Some(MetricType::SmtpConnectionEnd), + 248 => Some(MetricType::SmtpError), + 249 => Some(MetricType::SmtpConcurrencyLimitExceeded), + 250 => Some(MetricType::SmtpTransferLimitExceeded), + 251 => Some(MetricType::SmtpRateLimitExceeded), + 252 => Some(MetricType::SmtpTimeLimitExceeded), + 253 => Some(MetricType::SmtpMessageParseFailed), + 254 => Some(MetricType::SmtpMessageTooLarge), + 255 => Some(MetricType::SmtpLoopDetected), + 256 => Some(MetricType::SmtpDkimPass), + 257 => Some(MetricType::SmtpDkimFail), + 258 => Some(MetricType::SmtpArcPass), + 259 => Some(MetricType::SmtpArcFail), + 260 => Some(MetricType::SmtpSpfEhloPass), + 261 => Some(MetricType::SmtpSpfEhloFail), + 262 => Some(MetricType::SmtpSpfFromPass), + 263 => Some(MetricType::SmtpSpfFromFail), + 264 => Some(MetricType::SmtpDmarcPass), + 265 => Some(MetricType::SmtpDmarcFail), + 266 => Some(MetricType::SmtpIprevPass), + 267 => Some(MetricType::SmtpIprevFail), + 268 => Some(MetricType::SmtpTooManyMessages), + 269 => Some(MetricType::SmtpInvalidEhlo), + 270 => Some(MetricType::SmtpDidNotSayEhlo), + 271 => Some(MetricType::SmtpMailFromUnauthenticated), + 272 => Some(MetricType::SmtpMailFromUnauthorized), + 273 => Some(MetricType::SmtpMailFromMissing), + 274 => Some(MetricType::SmtpMultipleMailFrom), + 275 => Some(MetricType::SmtpMailboxDoesNotExist), + 276 => Some(MetricType::SmtpRelayNotAllowed), + 277 => Some(MetricType::SmtpRcptToDuplicate), + 278 => Some(MetricType::SmtpRcptToMissing), + 279 => Some(MetricType::SmtpTooManyRecipients), + 280 => Some(MetricType::SmtpTooManyInvalidRcpt), + 281 => Some(MetricType::SmtpAuthMechanismNotSupported), + 282 => Some(MetricType::SmtpAuthExchangeTooLong), + 283 => Some(MetricType::SmtpCommandNotImplemented), + 284 => Some(MetricType::SmtpInvalidCommand), + 285 => Some(MetricType::SmtpSyntaxError), + 286 => Some(MetricType::SmtpRequestTooLarge), + 287 => Some(MetricType::SpamPyzorError), + 288 => Some(MetricType::SpamDnsblError), + 289 => Some(MetricType::SpamTrainCompleted), + 290 => Some(MetricType::SpamTrainSampleAdded), + 291 => Some(MetricType::SpamClassify), + 292 => Some(MetricType::SpamModelNotReady), + 293 => Some(MetricType::SpfPass), + 294 => Some(MetricType::SpfFail), + 295 => Some(MetricType::SpfSoftFail), + 296 => Some(MetricType::SpfNeutral), + 297 => Some(MetricType::SpfTempError), + 298 => Some(MetricType::SpfPermError), + 299 => Some(MetricType::SpfNone), + 7 => Some(MetricType::StoreDataReadTime), + 8 => Some(MetricType::StoreDataWriteTime), + 9 => Some(MetricType::StoreBlobReadTime), + 10 => Some(MetricType::StoreBlobWriteTime), + 300 => Some(MetricType::StoreAssertValueFailed), + 301 => Some(MetricType::StoreFoundationdbError), + 302 => Some(MetricType::StoreMysqlError), + 303 => Some(MetricType::StorePostgresqlError), + 304 => Some(MetricType::StoreRocksdbError), + 305 => Some(MetricType::StoreSqliteError), + 306 => Some(MetricType::StoreLdapError), + 307 => Some(MetricType::StoreElasticsearchError), + 308 => Some(MetricType::StoreRedisError), + 309 => Some(MetricType::StoreS3Error), + 310 => Some(MetricType::StoreAzureError), + 311 => Some(MetricType::StoreFilesystemError), + 312 => Some(MetricType::StorePoolError), + 313 => Some(MetricType::StoreDataCorruption), + 314 => Some(MetricType::StoreDecompressError), + 315 => Some(MetricType::StoreDeserializeError), + 316 => Some(MetricType::StoreNotFound), + 317 => Some(MetricType::StoreNotConfigured), + 318 => Some(MetricType::StoreNotSupported), + 319 => Some(MetricType::StoreUnexpectedError), + 320 => Some(MetricType::StoreCryptoError), + 321 => Some(MetricType::StoreHttpStoreError), + 322 => Some(MetricType::StoreBlobMissingMarker), + 323 => Some(MetricType::StoreDataWrite), + 324 => Some(MetricType::StoreDataIterate), + 325 => Some(MetricType::StoreBlobRead), + 326 => Some(MetricType::StoreBlobWrite), + 327 => Some(MetricType::StoreBlobDelete), + 328 => Some(MetricType::TaskQueueBlobNotFound), + 329 => Some(MetricType::TaskQueueMetadataNotFound), + 330 => Some(MetricType::TelemetryLogError), + 331 => Some(MetricType::TelemetryWebhookError), + 332 => Some(MetricType::TelemetryOtelExporterError), + 333 => Some(MetricType::TelemetryOtelMetricsExporterError), + 334 => Some(MetricType::TelemetryPrometheusExporterError), + 335 => Some(MetricType::TelemetryJournalError), + 336 => Some(MetricType::TlsHandshakeError), + 25 => Some(MetricType::UserCount), + _ => None, + } + } + + pub fn event_id(&self) -> usize { + match self { + MetricType::AcmeAuthError => 1, + MetricType::AcmeAuthTooManyAttempts => 4, + MetricType::AcmeOrderCompleted => 16, + MetricType::AcmeOrderInvalid => 17, + MetricType::AcmeClientMissingSni => 6, + MetricType::AcmeTlsAlpnError => 24, + MetricType::AcmeTokenNotFound => 26, + MetricType::AcmeError => 15, + MetricType::ArcChainTooLong => 28, + MetricType::ArcInvalidInstance => 31, + MetricType::ArcInvalidCv => 30, + MetricType::ArcHasHeaderTag => 29, + MetricType::ArcBrokenChain => 27, + MetricType::AuthSuccess => 37, + MetricType::AuthFailed => 35, + MetricType::AuthTooManyAttempts => 38, + MetricType::AuthError => 34, + MetricType::CalendarAlarmSent => 579, + MetricType::CalendarAlarmFailed => 582, + MetricType::CalendarItipMessageSent => 583, + MetricType::CalendarItipMessageReceived => 584, + MetricType::CalendarItipMessageError => 585, + MetricType::ClusterSubscriberError => 41, + MetricType::ClusterSubscriberDisconnected => 42, + MetricType::ClusterPublisherError => 45, + MetricType::DaneAuthenticationSuccess => 67, + MetricType::DaneAuthenticationFailure => 66, + MetricType::DaneNoCertificatesFound => 69, + MetricType::DaneCertificateParseError => 68, + MetricType::DaneTlsaRecordFetchError => 71, + MetricType::DaneTlsaRecordNotFound => 75, + MetricType::DaneTlsaRecordNotDnssecSigned => 74, + MetricType::DaneTlsaRecordInvalid => 72, + MetricType::DeliveryAttemptStart => 77, + MetricType::DeliveryAttemptEnd => 76, + MetricType::DeliveryCompleted => 80, + MetricType::DeliveryMxLookupFailed => 102, + MetricType::DeliveryIpLookupFailed => 96, + MetricType::DeliveryNullMx => 103, + MetricType::DeliveryGreetingFailed => 93, + MetricType::DeliveryEhloRejected => 91, + MetricType::DeliveryAuthFailed => 79, + MetricType::DeliveryMailFromRejected => 98, + MetricType::DeliveryDelivered => 84, + MetricType::DeliveryRcptToRejected => 109, + MetricType::DeliveryRcptToFailed => 108, + MetricType::DeliveryMessageRejected => 99, + MetricType::DeliveryStartTlsUnavailable => 113, + MetricType::DeliveryStartTlsError => 112, + MetricType::DeliveryStartTlsDisabled => 111, + MetricType::DeliveryImplicitTlsError => 94, + MetricType::DeliveryConcurrencyLimitExceeded => 81, + MetricType::DeliveryRateLimitExceeded => 104, + MetricType::DeliveryDoubleBounce => 86, + MetricType::DeliveryDsnSuccess => 88, + MetricType::DeliveryDsnTempFail => 89, + MetricType::DeliveryDsnPermFail => 87, + MetricType::DkimPass => 121, + MetricType::DkimNeutral => 119, + MetricType::DkimFail => 114, + MetricType::DkimPermError => 122, + MetricType::DkimTempError => 127, + MetricType::DkimNone => 120, + MetricType::DkimUnsupportedVersion => 131, + MetricType::DkimUnsupportedAlgorithm => 128, + MetricType::DkimUnsupportedCanonicalization => 129, + MetricType::DkimUnsupportedKeyType => 130, + MetricType::DkimFailedBodyHashMatch => 116, + MetricType::DkimFailedVerification => 117, + MetricType::DkimFailedAuidMatch => 115, + MetricType::DkimRevokedPublicKey => 123, + MetricType::DkimIncompatibleAlgorithms => 118, + MetricType::DkimSignatureExpired => 124, + MetricType::DkimSignatureLength => 125, + MetricType::DkimSignerNotFound => 126, + MetricType::DmarcPass => 134, + MetricType::DmarcFail => 132, + MetricType::DmarcPermError => 135, + MetricType::DmarcTempError => 136, + MetricType::DmarcNone => 133, + MetricType::DnsRecordCreationFailed => 9, + MetricType::DnsRecordDeletionFailed => 10, + MetricType::DnsRecordLookupFailed => 11, + MetricType::DnsRecordPropagationTimeout => 14, + MetricType::EvalError => 138, + MetricType::EvalDirectoryNotFound => 137, + MetricType::EvalStoreNotFound => 140, + MetricType::HttpError => 154, + MetricType::HttpRequestBody => 155, + MetricType::HttpResponseBody => 157, + MetricType::HttpXForwardedMissing => 158, + MetricType::ImapConnectionStart => 163, + MetricType::ImapConnectionEnd => 162, + MetricType::IncomingReportDmarcReport => 200, + MetricType::IncomingReportDmarcReportWithWarnings => 201, + MetricType::IncomingReportTlsReport => 206, + MetricType::IncomingReportTlsReportWithWarnings => 207, + MetricType::IncomingReportAbuseReport => 195, + MetricType::IncomingReportAuthFailureReport => 197, + MetricType::IncomingReportFraudReport => 202, + MetricType::IncomingReportNotSpamReport => 204, + MetricType::IncomingReportVirusReport => 209, + MetricType::IncomingReportOtherReport => 205, + MetricType::IncomingReportMessageParseFailed => 203, + MetricType::IncomingReportDmarcParseFailed => 199, + MetricType::IncomingReportTlsRpcParseFailed => 208, + MetricType::IncomingReportArfParseFailed => 196, + MetricType::IncomingReportDecompressError => 198, + MetricType::IprevPass => 212, + MetricType::IprevFail => 210, + MetricType::IprevPermError => 213, + MetricType::IprevTempError => 214, + MetricType::IprevNone => 211, + MetricType::JmapMethodCall => 223, + MetricType::JmapInvalidArguments => 221, + MetricType::JmapRequestTooLarge => 227, + MetricType::JmapUnsupportedFilter => 232, + MetricType::JmapUnsupportedSort => 233, + MetricType::JmapUnknownMethod => 231, + MetricType::JmapForbidden => 220, + MetricType::JmapNotJson => 225, + MetricType::JmapNotRequest => 226, + MetricType::JmapWebsocketStart => 235, + MetricType::JmapWebsocketError => 234, + MetricType::LimitSizeRequest => 243, + MetricType::LimitSizeUpload => 244, + MetricType::LimitCallsIn => 238, + MetricType::LimitConcurrentRequest => 240, + MetricType::LimitConcurrentUpload => 241, + MetricType::LimitConcurrentConnection => 239, + MetricType::LimitQuota => 242, + MetricType::LimitBlobQuota => 237, + MetricType::LimitTenantQuota => 553, + MetricType::LimitTooManyRequests => 245, + MetricType::MailAuthParseError => 254, + MetricType::MailAuthMissingParameters => 252, + MetricType::MailAuthNoHeadersFound => 253, + MetricType::MailAuthCrypto => 247, + MetricType::MailAuthIo => 251, + MetricType::MailAuthBase64 => 246, + MetricType::MailAuthDnsError => 248, + MetricType::MailAuthDnsRecordNotFound => 250, + MetricType::MailAuthDnsInvalidRecordType => 249, + MetricType::MailAuthPolicyNotAligned => 255, + MetricType::ManageSieveConnectionStart => 259, + MetricType::ManageSieveConnectionEnd => 258, + MetricType::MessageIngestHam => 283, + MetricType::MessageIngestSpam => 286, + MetricType::MessageIngestImapAppend => 284, + MetricType::MessageIngestJmapAppend => 285, + MetricType::MessageIngestDuplicate => 281, + MetricType::MessageIngestError => 282, + MetricType::MessageIngestFtsIndex => 142, + MetricType::MilterActionAccept => 287, + MetricType::MilterActionDiscard => 289, + MetricType::MilterActionReject => 290, + MetricType::MilterActionTempFail => 293, + MetricType::MilterActionReplyCode => 291, + MetricType::MilterActionConnectionFailure => 288, + MetricType::MilterActionShutdown => 292, + MetricType::MtaHookActionAccept => 304, + MetricType::MtaHookActionDiscard => 305, + MetricType::MtaHookActionReject => 307, + MetricType::MtaHookActionQuarantine => 306, + MetricType::MtaHookError => 308, + MetricType::MtaStsAuthorized => 309, + MetricType::MtaStsNotAuthorized => 311, + MetricType::MtaStsInvalidPolicy => 310, + MetricType::NetworkTimeout => 327, + MetricType::OutgoingReportSpfReport => 342, + MetricType::OutgoingReportSpfRateLimited => 341, + MetricType::OutgoingReportDkimReport => 330, + MetricType::OutgoingReportDkimRateLimited => 329, + MetricType::OutgoingReportDmarcReport => 333, + MetricType::OutgoingReportDmarcRateLimited => 332, + MetricType::OutgoingReportDmarcAggregateReport => 331, + MetricType::OutgoingReportTlsAggregate => 344, + MetricType::OutgoingReportHttpSubmission => 334, + MetricType::OutgoingReportUnauthorizedReportingAddress => 345, + MetricType::OutgoingReportReportingAddressValidationError => 340, + MetricType::OutgoingReportNotFound => 339, + MetricType::OutgoingReportSubmissionError => 343, + MetricType::OutgoingReportNoRecipientsFound => 338, + MetricType::Pop3ConnectionStart => 348, + MetricType::Pop3ConnectionEnd => 347, + MetricType::PurgeError => 365, + MetricType::PushSubscriptionSuccess => 373, + MetricType::PushSubscriptionError => 371, + MetricType::PushSubscriptionNotFound => 372, + MetricType::QueueQueueMessage => 380, + MetricType::QueueQueueMessageAuthenticated => 381, + MetricType::QueueQueueReport => 382, + MetricType::QueueQueueDsn => 379, + MetricType::QueueQueueAutogenerated => 378, + MetricType::QueueRescheduled => 385, + MetricType::QueueBlobNotFound => 374, + MetricType::QueueRateLimitExceeded => 384, + MetricType::QueueConcurrencyLimitExceeded => 375, + MetricType::QueueQuotaExceeded => 383, + MetricType::ResourceNotFound => 389, + MetricType::ResourceBadParameters => 386, + MetricType::ResourceError => 388, + MetricType::SecurityAuthenticationBan => 33, + MetricType::SecurityAbuseBan => 549, + MetricType::SecurityScanBan => 558, + MetricType::SecurityLoiterBan => 550, + MetricType::SecurityIpBlocked => 318, + MetricType::SecurityUnauthorized => 552, + MetricType::ServerThreadError => 395, + MetricType::SieveActionAccept => 396, + MetricType::SieveActionAcceptReplace => 397, + MetricType::SieveActionDiscard => 398, + MetricType::SieveActionReject => 399, + MetricType::SieveSendMessage => 406, + MetricType::SieveMessageTooLarge => 401, + MetricType::SieveRuntimeError => 404, + MetricType::SieveUnexpectedError => 407, + MetricType::SieveNotSupported => 402, + MetricType::SieveQuotaExceeded => 403, + MetricType::SmtpConnectionStart => 417, + MetricType::SmtpConnectionEnd => 416, + MetricType::SmtpError => 428, + MetricType::SmtpConcurrencyLimitExceeded => 415, + MetricType::SmtpTransferLimitExceeded => 485, + MetricType::SmtpRateLimitExceeded => 461, + MetricType::SmtpTimeLimitExceeded => 481, + MetricType::SmtpMessageParseFailed => 450, + MetricType::SmtpMessageTooLarge => 451, + MetricType::SmtpLoopDetected => 443, + MetricType::SmtpDkimPass => 422, + MetricType::SmtpDkimFail => 421, + MetricType::SmtpArcPass => 410, + MetricType::SmtpArcFail => 409, + MetricType::SmtpSpfEhloPass => 474, + MetricType::SmtpSpfEhloFail => 473, + MetricType::SmtpSpfFromPass => 476, + MetricType::SmtpSpfFromFail => 475, + MetricType::SmtpDmarcPass => 424, + MetricType::SmtpDmarcFail => 423, + MetricType::SmtpIprevPass => 441, + MetricType::SmtpIprevFail => 440, + MetricType::SmtpTooManyMessages => 483, + MetricType::SmtpInvalidEhlo => 436, + MetricType::SmtpDidNotSayEhlo => 420, + MetricType::SmtpMailFromUnauthenticated => 447, + MetricType::SmtpMailFromUnauthorized => 448, + MetricType::SmtpMailFromMissing => 445, + MetricType::SmtpMultipleMailFrom => 456, + MetricType::SmtpMailboxDoesNotExist => 449, + MetricType::SmtpRelayNotAllowed => 468, + MetricType::SmtpRcptToDuplicate => 465, + MetricType::SmtpRcptToMissing => 466, + MetricType::SmtpTooManyRecipients => 484, + MetricType::SmtpTooManyInvalidRcpt => 482, + MetricType::SmtpAuthMechanismNotSupported => 412, + MetricType::SmtpAuthExchangeTooLong => 411, + MetricType::SmtpCommandNotImplemented => 414, + MetricType::SmtpInvalidCommand => 435, + MetricType::SmtpSyntaxError => 480, + MetricType::SmtpRequestTooLarge => 470, + MetricType::SpamPyzorError => 494, + MetricType::SpamDnsblError => 563, + MetricType::SpamTrainCompleted => 495, + MetricType::SpamTrainSampleAdded => 143, + MetricType::SpamClassify => 490, + MetricType::SpamModelNotReady => 496, + MetricType::SpfPass => 501, + MetricType::SpfFail => 498, + MetricType::SpfSoftFail => 503, + MetricType::SpfNeutral => 499, + MetricType::SpfTempError => 504, + MetricType::SpfPermError => 502, + MetricType::SpfNone => 500, + MetricType::StoreAssertValueFailed => 505, + MetricType::StoreFoundationdbError => 518, + MetricType::StoreMysqlError => 522, + MetricType::StorePostgresqlError => 527, + MetricType::StoreRocksdbError => 529, + MetricType::StoreSqliteError => 532, + MetricType::StoreLdapError => 520, + MetricType::StoreElasticsearchError => 516, + MetricType::StoreRedisError => 528, + MetricType::StoreS3Error => 530, + MetricType::StoreAzureError => 559, + MetricType::StoreFilesystemError => 517, + MetricType::StorePoolError => 526, + MetricType::StoreDataCorruption => 511, + MetricType::StoreDecompressError => 514, + MetricType::StoreDeserializeError => 515, + MetricType::StoreNotFound => 524, + MetricType::StoreNotConfigured => 523, + MetricType::StoreNotSupported => 525, + MetricType::StoreUnexpectedError => 533, + MetricType::StoreCryptoError => 510, + MetricType::StoreHttpStoreError => 493, + MetricType::StoreBlobMissingMarker => 507, + MetricType::StoreDataWrite => 513, + MetricType::StoreDataIterate => 512, + MetricType::StoreBlobRead => 508, + MetricType::StoreBlobWrite => 509, + MetricType::StoreBlobDelete => 506, + MetricType::TaskQueueBlobNotFound => 141, + MetricType::TaskQueueMetadataNotFound => 145, + MetricType::TelemetryLogError => 535, + MetricType::TelemetryWebhookError => 539, + MetricType::TelemetryOtelExporterError => 536, + MetricType::TelemetryOtelMetricsExporterError => 537, + MetricType::TelemetryPrometheusExporterError => 538, + MetricType::TelemetryJournalError => 534, + MetricType::TlsHandshakeError => 544, + _ => usize::MAX, + } + } + + pub fn description(&self) -> &'static str { + match self { + MetricType::AcmeAuthError => "ACME authentication error", + MetricType::AcmeAuthTooManyAttempts => "Too many ACME authentication attempts", + MetricType::AcmeOrderCompleted => "ACME order completed", + MetricType::AcmeOrderInvalid => "ACME order invalid", + MetricType::AcmeClientMissingSni => "ACME client missing SNI", + MetricType::AcmeTlsAlpnError => "ACME TLS ALPN error", + MetricType::AcmeTokenNotFound => "ACME token not found", + MetricType::AcmeError => "ACME error", + MetricType::ArcChainTooLong => "ARC chain too long", + MetricType::ArcInvalidInstance => "Invalid ARC instance", + MetricType::ArcInvalidCv => "Invalid ARC CV", + MetricType::ArcHasHeaderTag => "ARC has header tag", + MetricType::ArcBrokenChain => "Broken ARC chain", + MetricType::AuthSuccess => "Authentication successful", + MetricType::AuthFailed => "Authentication failed", + MetricType::AuthTooManyAttempts => "Too many authentication attempts", + MetricType::AuthError => "Authentication error", + MetricType::CalendarAlarmSent => "Calendar alarm sent", + MetricType::CalendarAlarmFailed => "Calendar alarm could not be sent", + MetricType::CalendarItipMessageSent => "Calendar iTIP message sent", + MetricType::CalendarItipMessageReceived => "Calendar iTIP message received", + MetricType::CalendarItipMessageError => "iTIP message error", + MetricType::ClusterSubscriberError => "PubSub subscriber error", + MetricType::ClusterSubscriberDisconnected => "PubSub subscriber disconnected", + MetricType::ClusterPublisherError => "PubSub publisher error", + MetricType::DaneAuthenticationSuccess => "DANE authentication successful", + MetricType::DaneAuthenticationFailure => "DANE authentication failed", + MetricType::DaneNoCertificatesFound => "No certificates found for DANE", + MetricType::DaneCertificateParseError => "Error parsing certificate for DANE", + MetricType::DaneTlsaRecordFetchError => "Error fetching TLSA record", + MetricType::DaneTlsaRecordNotFound => "TLSA record not found", + MetricType::DaneTlsaRecordNotDnssecSigned => "TLSA record not DNSSEC signed", + MetricType::DaneTlsaRecordInvalid => "Invalid TLSA record", + MetricType::DeliveryTotalTime => { + "Total message delivery time from submission to delivery" + } + MetricType::DeliveryAttemptTime => "Message delivery time", + MetricType::DeliveryActiveConnections => "Active delivery connections", + MetricType::DeliveryAttemptStart => "Delivery attempt started", + MetricType::DeliveryAttemptEnd => "Delivery attempt ended", + MetricType::DeliveryCompleted => "Delivery completed", + MetricType::DeliveryMxLookupFailed => "MX record lookup failed", + MetricType::DeliveryIpLookupFailed => "IP address lookup failed", + MetricType::DeliveryNullMx => "Null MX record found", + MetricType::DeliveryGreetingFailed => "SMTP greeting failed", + MetricType::DeliveryEhloRejected => "SMTP EHLO rejected", + MetricType::DeliveryAuthFailed => "SMTP authentication failed", + MetricType::DeliveryMailFromRejected => "SMTP MAIL FROM rejected", + MetricType::DeliveryDelivered => "Message delivered", + MetricType::DeliveryRcptToRejected => "SMTP RCPT TO rejected", + MetricType::DeliveryRcptToFailed => "SMTP RCPT TO failed", + MetricType::DeliveryMessageRejected => "Message rejected by remote server", + MetricType::DeliveryStartTlsUnavailable => "STARTTLS unavailable", + MetricType::DeliveryStartTlsError => "STARTTLS error", + MetricType::DeliveryStartTlsDisabled => "STARTTLS disabled", + MetricType::DeliveryImplicitTlsError => "Implicit TLS error", + MetricType::DeliveryConcurrencyLimitExceeded => "Concurrency limit exceeded", + MetricType::DeliveryRateLimitExceeded => "Rate limit exceeded", + MetricType::DeliveryDoubleBounce => "Discarding message after double bounce", + MetricType::DeliveryDsnSuccess => "DSN success notification", + MetricType::DeliveryDsnTempFail => "DSN temporary failure notification", + MetricType::DeliveryDsnPermFail => "DSN permanent failure notification", + MetricType::DkimPass => "DKIM verification passed", + MetricType::DkimNeutral => "DKIM verification neutral", + MetricType::DkimFail => "DKIM verification failed", + MetricType::DkimPermError => "DKIM permanent error", + MetricType::DkimTempError => "DKIM temporary error", + MetricType::DkimNone => "No DKIM signature", + MetricType::DkimUnsupportedVersion => "Unsupported DKIM version", + MetricType::DkimUnsupportedAlgorithm => "Unsupported DKIM algorithm", + MetricType::DkimUnsupportedCanonicalization => "Unsupported DKIM canonicalization", + MetricType::DkimUnsupportedKeyType => "Unsupported DKIM key type", + MetricType::DkimFailedBodyHashMatch => "DKIM body hash mismatch", + MetricType::DkimFailedVerification => "DKIM verification failed", + MetricType::DkimFailedAuidMatch => "DKIM AUID mismatch", + MetricType::DkimRevokedPublicKey => "DKIM public key revoked", + MetricType::DkimIncompatibleAlgorithms => "Incompatible DKIM algorithms", + MetricType::DkimSignatureExpired => "DKIM signature expired", + MetricType::DkimSignatureLength => "DKIM signature length issue", + MetricType::DkimSignerNotFound => "DKIM signer not found", + MetricType::DmarcPass => "DMARC check passed", + MetricType::DmarcFail => "DMARC check failed", + MetricType::DmarcPermError => "DMARC permanent error", + MetricType::DmarcTempError => "DMARC temporary error", + MetricType::DmarcNone => "No DMARC record", + MetricType::DnsLookupTime => "DNS lookup time", + MetricType::DnsRecordCreationFailed => "DNS record creation failed", + MetricType::DnsRecordDeletionFailed => "DNS record deletion failed", + MetricType::DnsRecordLookupFailed => "DNS record lookup failed", + MetricType::DnsRecordPropagationTimeout => "DNS record propagation timeout", + MetricType::DomainCount => "Total number of domains", + MetricType::EvalError => "Expression evaluation error", + MetricType::EvalDirectoryNotFound => "Directory not found while evaluating expression", + MetricType::EvalStoreNotFound => "Store not found while evaluating expression", + MetricType::HttpRequestTime => "HTTP request duration", + MetricType::HttpActiveConnections => "Active HTTP connections", + MetricType::HttpError => "HTTP error occurred", + MetricType::HttpRequestBody => "HTTP request body", + MetricType::HttpResponseBody => "HTTP response body", + MetricType::HttpXForwardedMissing => "X-Forwarded-For header is missing", + MetricType::ImapRequestTime => "IMAP request duration", + MetricType::ImapActiveConnections => "Active IMAP connections", + MetricType::ImapConnectionStart => "IMAP connection started", + MetricType::ImapConnectionEnd => "IMAP connection ended", + MetricType::IncomingReportDmarcReport => "DMARC report received", + MetricType::IncomingReportDmarcReportWithWarnings => { + "DMARC report received with warnings" + } + MetricType::IncomingReportTlsReport => "TLS report received", + MetricType::IncomingReportTlsReportWithWarnings => "TLS report received with warnings", + MetricType::IncomingReportAbuseReport => "Abuse report received", + MetricType::IncomingReportAuthFailureReport => "Authentication failure report received", + MetricType::IncomingReportFraudReport => "Fraud report received", + MetricType::IncomingReportNotSpamReport => "Not spam report received", + MetricType::IncomingReportVirusReport => "Virus report received", + MetricType::IncomingReportOtherReport => "Other type of report received", + MetricType::IncomingReportMessageParseFailed => { + "Failed to parse incoming report message" + } + MetricType::IncomingReportDmarcParseFailed => "Failed to parse DMARC report", + MetricType::IncomingReportTlsRpcParseFailed => "Failed to parse TLS RPC report", + MetricType::IncomingReportArfParseFailed => "Failed to parse ARF report", + MetricType::IncomingReportDecompressError => "Error decompressing report", + MetricType::IprevPass => "IPREV check passed", + MetricType::IprevFail => "IPREV check failed", + MetricType::IprevPermError => "IPREV permanent error", + MetricType::IprevTempError => "IPREV temporary error", + MetricType::IprevNone => "No IPREV record", + MetricType::JmapMethodCall => "JMAP method call", + MetricType::JmapInvalidArguments => "Invalid JMAP arguments", + MetricType::JmapRequestTooLarge => "JMAP request too large", + MetricType::JmapUnsupportedFilter => "Unsupported JMAP filter", + MetricType::JmapUnsupportedSort => "Unsupported JMAP sort", + MetricType::JmapUnknownMethod => "Unknown JMAP method", + MetricType::JmapForbidden => "JMAP operation forbidden", + MetricType::JmapNotJson => "JMAP request is not JSON", + MetricType::JmapNotRequest => "JMAP input is not a request", + MetricType::JmapWebsocketStart => "JMAP WebSocket connection started", + MetricType::JmapWebsocketError => "JMAP WebSocket error", + MetricType::LimitSizeRequest => "Request size limit reached", + MetricType::LimitSizeUpload => "Upload size limit reached", + MetricType::LimitCallsIn => "Incoming calls limit reached", + MetricType::LimitConcurrentRequest => "Concurrent request limit reached", + MetricType::LimitConcurrentUpload => "Concurrent upload limit reached", + MetricType::LimitConcurrentConnection => "Concurrent connection limit reached", + MetricType::LimitQuota => "Quota limit reached", + MetricType::LimitBlobQuota => "Blob quota limit reached", + MetricType::LimitTenantQuota => "Tenant quota limit reached", + MetricType::LimitTooManyRequests => "Too many requests", + MetricType::MailAuthParseError => "Mail authentication parse error", + MetricType::MailAuthMissingParameters => "Missing mail authentication parameters", + MetricType::MailAuthNoHeadersFound => "No headers found in message", + MetricType::MailAuthCrypto => "Crypto error during mail authentication", + MetricType::MailAuthIo => "I/O error during mail authentication", + MetricType::MailAuthBase64 => "Base64 error during mail authentication", + MetricType::MailAuthDnsError => "DNS error", + MetricType::MailAuthDnsRecordNotFound => "DNS record not found", + MetricType::MailAuthDnsInvalidRecordType => "Invalid DNS record type", + MetricType::MailAuthPolicyNotAligned => "Policy not aligned", + MetricType::ManageSieveConnectionStart => "ManageSieve connection started", + MetricType::ManageSieveConnectionEnd => "ManageSieve connection ended", + MetricType::MessageSize => "Received message size", + MetricType::MessageAuthenticatedSize => { + "Received message size from authenticated users" + } + MetricType::MessageIngestTime => "Message ingestion time", + MetricType::MessageIngestIndexTime => "Message full-text indexing time", + MetricType::MessageIngestHam => "Message ingested", + MetricType::MessageIngestSpam => "Possible spam message ingested", + MetricType::MessageIngestImapAppend => "Message appended via IMAP", + MetricType::MessageIngestJmapAppend => "Message appended via JMAP", + MetricType::MessageIngestDuplicate => "Skipping duplicate message", + MetricType::MessageIngestError => "Message ingestion error", + MetricType::MessageIngestFtsIndex => "Full-text search index updated", + MetricType::MilterActionAccept => "Milter action: Accept", + MetricType::MilterActionDiscard => "Milter action: Discard", + MetricType::MilterActionReject => "Milter action: Reject", + MetricType::MilterActionTempFail => "Milter action: Temporary failure", + MetricType::MilterActionReplyCode => "Milter action: Reply code", + MetricType::MilterActionConnectionFailure => "Milter action: Connection failure", + MetricType::MilterActionShutdown => "Milter action: Shutdown", + MetricType::MtaHookActionAccept => "MTA hook action: Accept", + MetricType::MtaHookActionDiscard => "MTA hook action: Discard", + MetricType::MtaHookActionReject => "MTA hook action: Reject", + MetricType::MtaHookActionQuarantine => "MTA hook action: Quarantine", + MetricType::MtaHookError => "MTA hook error", + MetricType::MtaStsAuthorized => "Host authorized by MTA-STS policy", + MetricType::MtaStsNotAuthorized => "Host not authorized by MTA-STS policy", + MetricType::MtaStsInvalidPolicy => "Invalid MTA-STS policy", + MetricType::NetworkTimeout => "Network timeout", + MetricType::OutgoingReportSize => "Outgoing report size", + MetricType::OutgoingReportSpfReport => "SPF report sent", + MetricType::OutgoingReportSpfRateLimited => "SPF report rate limited", + MetricType::OutgoingReportDkimReport => "DKIM report sent", + MetricType::OutgoingReportDkimRateLimited => "DKIM report rate limited", + MetricType::OutgoingReportDmarcReport => "DMARC report sent", + MetricType::OutgoingReportDmarcRateLimited => "DMARC report rate limited", + MetricType::OutgoingReportDmarcAggregateReport => "DMARC aggregate is being prepared", + MetricType::OutgoingReportTlsAggregate => "TLS aggregate report is being prepared", + MetricType::OutgoingReportHttpSubmission => "Report submitted via HTTP", + MetricType::OutgoingReportUnauthorizedReportingAddress => { + "Unauthorized reporting address" + } + MetricType::OutgoingReportReportingAddressValidationError => { + "Error validating reporting address" + } + MetricType::OutgoingReportNotFound => "Report not found", + MetricType::OutgoingReportSubmissionError => "Error submitting report", + MetricType::OutgoingReportNoRecipientsFound => "No recipients found for report", + MetricType::Pop3RequestTime => "POP3 request duration", + MetricType::Pop3ActiveConnections => "Active POP3 connections", + MetricType::Pop3ConnectionStart => "POP3 connection started", + MetricType::Pop3ConnectionEnd => "POP3 connection ended", + MetricType::PurgeError => "Purge error", + MetricType::PushSubscriptionSuccess => "Push subscription successful", + MetricType::PushSubscriptionError => "Push subscription error", + MetricType::PushSubscriptionNotFound => "Push subscription not found", + MetricType::QueueCount => "Total number of messages in the queue", + MetricType::QueueQueueMessage => "Queued message for delivery", + MetricType::QueueQueueMessageAuthenticated => "Queued message submission for delivery", + MetricType::QueueQueueReport => "Queued report for delivery", + MetricType::QueueQueueDsn => "Queued DSN for delivery", + MetricType::QueueQueueAutogenerated => "Queued autogenerated message for delivery", + MetricType::QueueRescheduled => "Message rescheduled for delivery", + MetricType::QueueBlobNotFound => "Message blob not found", + MetricType::QueueRateLimitExceeded => "Rate limit exceeded", + MetricType::QueueConcurrencyLimitExceeded => "Concurrency limit exceeded", + MetricType::QueueQuotaExceeded => "Quota exceeded", + MetricType::ResourceNotFound => "Resource not found", + MetricType::ResourceBadParameters => "Bad resource parameters", + MetricType::ResourceError => "Resource error", + MetricType::SecurityAuthenticationBan => "Banned due to authentication errors", + MetricType::SecurityAbuseBan => "Banned due to abuse", + MetricType::SecurityScanBan => "Banned due to scan", + MetricType::SecurityLoiterBan => "Banned due to loitering", + MetricType::SecurityIpBlocked => "Blocked IP address", + MetricType::SecurityUnauthorized => "Unauthorized access", + MetricType::ServerMemory => "Server memory usage", + MetricType::ServerThreadError => "Server thread error", + MetricType::SieveRequestTime => "ManageSieve request duration", + MetricType::SieveActiveConnections => "Active ManageSieve connections", + MetricType::SieveActionAccept => "Sieve action: Accept", + MetricType::SieveActionAcceptReplace => "Sieve action: Accept and replace", + MetricType::SieveActionDiscard => "Sieve action: Discard", + MetricType::SieveActionReject => "Sieve action: Reject", + MetricType::SieveSendMessage => "Sieve sending message", + MetricType::SieveMessageTooLarge => "Sieve message too large", + MetricType::SieveRuntimeError => "Sieve runtime error", + MetricType::SieveUnexpectedError => "Unexpected Sieve error", + MetricType::SieveNotSupported => "Sieve action not supported", + MetricType::SieveQuotaExceeded => "Sieve quota exceeded", + MetricType::SmtpRequestTime => "SMTP request duration", + MetricType::SmtpActiveConnections => "Active SMTP connections", + MetricType::SmtpConnectionStart => "SMTP connection started", + MetricType::SmtpConnectionEnd => "SMTP connection ended", + MetricType::SmtpError => "SMTP error occurred", + MetricType::SmtpConcurrencyLimitExceeded => "Concurrency limit exceeded", + MetricType::SmtpTransferLimitExceeded => "Transfer limit exceeded", + MetricType::SmtpRateLimitExceeded => "Rate limit exceeded", + MetricType::SmtpTimeLimitExceeded => "Time limit exceeded", + MetricType::SmtpMessageParseFailed => "Message parsing failed", + MetricType::SmtpMessageTooLarge => "Message too large", + MetricType::SmtpLoopDetected => "Mail loop detected", + MetricType::SmtpDkimPass => "DKIM verification passed", + MetricType::SmtpDkimFail => "DKIM verification failed", + MetricType::SmtpArcPass => "ARC verification passed", + MetricType::SmtpArcFail => "ARC verification failed", + MetricType::SmtpSpfEhloPass => "SPF EHLO check passed", + MetricType::SmtpSpfEhloFail => "SPF EHLO check failed", + MetricType::SmtpSpfFromPass => "SPF From check passed", + MetricType::SmtpSpfFromFail => "SPF From check failed", + MetricType::SmtpDmarcPass => "DMARC check passed", + MetricType::SmtpDmarcFail => "DMARC check failed", + MetricType::SmtpIprevPass => "IPREV check passed", + MetricType::SmtpIprevFail => "IPREV check failed", + MetricType::SmtpTooManyMessages => "Too many messages", + MetricType::SmtpInvalidEhlo => "Invalid EHLO command", + MetricType::SmtpDidNotSayEhlo => "Client did not say EHLO", + MetricType::SmtpMailFromUnauthenticated => "MAIL FROM without authentication", + MetricType::SmtpMailFromUnauthorized => "MAIL FROM unauthorized", + MetricType::SmtpMailFromMissing => "MAIL FROM address missing", + MetricType::SmtpMultipleMailFrom => "Multiple MAIL FROM commands", + MetricType::SmtpMailboxDoesNotExist => "Mailbox does not exist", + MetricType::SmtpRelayNotAllowed => "Relay not allowed", + MetricType::SmtpRcptToDuplicate => "Duplicate RCPT TO", + MetricType::SmtpRcptToMissing => "RCPT TO address missing", + MetricType::SmtpTooManyRecipients => "Too many recipients", + MetricType::SmtpTooManyInvalidRcpt => "Too many invalid recipients", + MetricType::SmtpAuthMechanismNotSupported => "Auth mechanism not supported", + MetricType::SmtpAuthExchangeTooLong => "Auth exchange too long", + MetricType::SmtpCommandNotImplemented => "Command not implemented", + MetricType::SmtpInvalidCommand => "Invalid command", + MetricType::SmtpSyntaxError => "Syntax error", + MetricType::SmtpRequestTooLarge => "Request too large", + MetricType::SpamPyzorError => "Pyzor error", + MetricType::SpamDnsblError => "Error querying DNSBL", + MetricType::SpamTrainCompleted => "Spam classifier training completed", + MetricType::SpamTrainSampleAdded => "New training sample added", + MetricType::SpamClassify => "Classifying message for spam", + MetricType::SpamModelNotReady => "Spam classifier model not ready", + MetricType::SpfPass => "SPF check passed", + MetricType::SpfFail => "SPF check failed", + MetricType::SpfSoftFail => "SPF soft fail", + MetricType::SpfNeutral => "SPF neutral result", + MetricType::SpfTempError => "SPF temporary error", + MetricType::SpfPermError => "SPF permanent error", + MetricType::SpfNone => "No SPF record", + MetricType::StoreDataReadTime => "Data store read time", + MetricType::StoreDataWriteTime => "Data store write time", + MetricType::StoreBlobReadTime => "Blob store read time", + MetricType::StoreBlobWriteTime => "Blob store write time", + MetricType::StoreAssertValueFailed => "Another process modified the record", + MetricType::StoreFoundationdbError => "FoundationDB error", + MetricType::StoreMysqlError => "MySQL error", + MetricType::StorePostgresqlError => "PostgreSQL error", + MetricType::StoreRocksdbError => "RocksDB error", + MetricType::StoreSqliteError => "SQLite error", + MetricType::StoreLdapError => "LDAP error", + MetricType::StoreElasticsearchError => "ElasticSearch error", + MetricType::StoreRedisError => "Redis error", + MetricType::StoreS3Error => "S3 error", + MetricType::StoreAzureError => "Azure error", + MetricType::StoreFilesystemError => "Filesystem error", + MetricType::StorePoolError => "Connection pool error", + MetricType::StoreDataCorruption => "Data corruption detected", + MetricType::StoreDecompressError => "Decompression error", + MetricType::StoreDeserializeError => "Deserialization error", + MetricType::StoreNotFound => "Record not found in database", + MetricType::StoreNotConfigured => "Store not configured", + MetricType::StoreNotSupported => "Operation not supported by store", + MetricType::StoreUnexpectedError => "Unexpected store error", + MetricType::StoreCryptoError => "Store crypto error", + MetricType::StoreHttpStoreError => "Error updating HTTP store", + MetricType::StoreBlobMissingMarker => "Blob missing marker", + MetricType::StoreDataWrite => "Write batch operation", + MetricType::StoreDataIterate => "Data store iteration operation", + MetricType::StoreBlobRead => "Blob read operation", + MetricType::StoreBlobWrite => "Blob write operation", + MetricType::StoreBlobDelete => "Blob delete operation", + MetricType::TaskQueueBlobNotFound => "Blob not found for task", + MetricType::TaskQueueMetadataNotFound => "Metadata not found for task", + MetricType::TelemetryLogError => "Log collector error", + MetricType::TelemetryWebhookError => "Webhook collector error", + MetricType::TelemetryOtelExporterError => "OpenTelemetry exporter error", + MetricType::TelemetryOtelMetricsExporterError => "OpenTelemetry metrics exporter error", + MetricType::TelemetryPrometheusExporterError => "Prometheus exporter error", + MetricType::TelemetryJournalError => "Journal collector error", + MetricType::TlsHandshakeError => "TLS handshake error", + MetricType::UserCount => "Total number of users", + } + } + + pub fn unit(&self) -> &'static str { + match self { + MetricType::MessageSize + | MetricType::MessageAuthenticatedSize + | MetricType::OutgoingReportSize + | MetricType::ServerMemory => "bytes", + MetricType::DeliveryActiveConnections + | MetricType::HttpActiveConnections + | MetricType::ImapActiveConnections + | MetricType::Pop3ActiveConnections + | MetricType::SieveActiveConnections + | MetricType::SmtpActiveConnections => "connections", + MetricType::AcmeAuthError + | MetricType::AcmeAuthTooManyAttempts + | MetricType::AcmeOrderCompleted + | MetricType::AcmeOrderInvalid + | MetricType::AcmeClientMissingSni + | MetricType::AcmeTlsAlpnError + | MetricType::AcmeTokenNotFound + | MetricType::AcmeError + | MetricType::ArcChainTooLong + | MetricType::ArcInvalidInstance + | MetricType::ArcInvalidCv + | MetricType::ArcHasHeaderTag + | MetricType::ArcBrokenChain + | MetricType::AuthSuccess + | MetricType::AuthFailed + | MetricType::AuthTooManyAttempts + | MetricType::AuthError + | MetricType::CalendarAlarmSent + | MetricType::CalendarAlarmFailed + | MetricType::CalendarItipMessageSent + | MetricType::CalendarItipMessageReceived + | MetricType::CalendarItipMessageError + | MetricType::ClusterSubscriberError + | MetricType::ClusterSubscriberDisconnected + | MetricType::ClusterPublisherError + | MetricType::DaneAuthenticationSuccess + | MetricType::DaneAuthenticationFailure + | MetricType::DaneNoCertificatesFound + | MetricType::DaneCertificateParseError + | MetricType::DaneTlsaRecordFetchError + | MetricType::DaneTlsaRecordNotFound + | MetricType::DaneTlsaRecordNotDnssecSigned + | MetricType::DaneTlsaRecordInvalid + | MetricType::DeliveryAttemptStart + | MetricType::DeliveryAttemptEnd + | MetricType::DeliveryCompleted + | MetricType::DeliveryMxLookupFailed + | MetricType::DeliveryIpLookupFailed + | MetricType::DeliveryNullMx + | MetricType::DeliveryGreetingFailed + | MetricType::DeliveryEhloRejected + | MetricType::DeliveryAuthFailed + | MetricType::DeliveryMailFromRejected + | MetricType::DeliveryDelivered + | MetricType::DeliveryRcptToRejected + | MetricType::DeliveryRcptToFailed + | MetricType::DeliveryMessageRejected + | MetricType::DeliveryStartTlsUnavailable + | MetricType::DeliveryStartTlsError + | MetricType::DeliveryStartTlsDisabled + | MetricType::DeliveryImplicitTlsError + | MetricType::DeliveryConcurrencyLimitExceeded + | MetricType::DeliveryRateLimitExceeded + | MetricType::DeliveryDoubleBounce + | MetricType::DeliveryDsnSuccess + | MetricType::DeliveryDsnTempFail + | MetricType::DeliveryDsnPermFail + | MetricType::DkimPass + | MetricType::DkimNeutral + | MetricType::DkimFail + | MetricType::DkimPermError + | MetricType::DkimTempError + | MetricType::DkimNone + | MetricType::DkimUnsupportedVersion + | MetricType::DkimUnsupportedAlgorithm + | MetricType::DkimUnsupportedCanonicalization + | MetricType::DkimUnsupportedKeyType + | MetricType::DkimFailedBodyHashMatch + | MetricType::DkimFailedVerification + | MetricType::DkimFailedAuidMatch + | MetricType::DkimRevokedPublicKey + | MetricType::DkimIncompatibleAlgorithms + | MetricType::DkimSignatureExpired + | MetricType::DkimSignatureLength + | MetricType::DkimSignerNotFound + | MetricType::DmarcPass + | MetricType::DmarcFail + | MetricType::DmarcPermError + | MetricType::DmarcTempError + | MetricType::DmarcNone + | MetricType::DnsRecordCreationFailed + | MetricType::DnsRecordDeletionFailed + | MetricType::DnsRecordLookupFailed + | MetricType::DnsRecordPropagationTimeout + | MetricType::EvalError + | MetricType::EvalDirectoryNotFound + | MetricType::EvalStoreNotFound + | MetricType::HttpError + | MetricType::HttpRequestBody + | MetricType::HttpResponseBody + | MetricType::HttpXForwardedMissing + | MetricType::ImapConnectionStart + | MetricType::ImapConnectionEnd + | MetricType::IncomingReportDmarcReport + | MetricType::IncomingReportDmarcReportWithWarnings + | MetricType::IncomingReportTlsReport + | MetricType::IncomingReportTlsReportWithWarnings + | MetricType::IncomingReportAbuseReport + | MetricType::IncomingReportAuthFailureReport + | MetricType::IncomingReportFraudReport + | MetricType::IncomingReportNotSpamReport + | MetricType::IncomingReportVirusReport + | MetricType::IncomingReportOtherReport + | MetricType::IncomingReportMessageParseFailed + | MetricType::IncomingReportDmarcParseFailed + | MetricType::IncomingReportTlsRpcParseFailed + | MetricType::IncomingReportArfParseFailed + | MetricType::IncomingReportDecompressError + | MetricType::IprevPass + | MetricType::IprevFail + | MetricType::IprevPermError + | MetricType::IprevTempError + | MetricType::IprevNone + | MetricType::JmapMethodCall + | MetricType::JmapInvalidArguments + | MetricType::JmapRequestTooLarge + | MetricType::JmapUnsupportedFilter + | MetricType::JmapUnsupportedSort + | MetricType::JmapUnknownMethod + | MetricType::JmapForbidden + | MetricType::JmapNotJson + | MetricType::JmapNotRequest + | MetricType::JmapWebsocketStart + | MetricType::JmapWebsocketError + | MetricType::LimitSizeRequest + | MetricType::LimitSizeUpload + | MetricType::LimitCallsIn + | MetricType::LimitConcurrentRequest + | MetricType::LimitConcurrentUpload + | MetricType::LimitConcurrentConnection + | MetricType::LimitQuota + | MetricType::LimitBlobQuota + | MetricType::LimitTenantQuota + | MetricType::LimitTooManyRequests + | MetricType::MailAuthParseError + | MetricType::MailAuthMissingParameters + | MetricType::MailAuthNoHeadersFound + | MetricType::MailAuthCrypto + | MetricType::MailAuthIo + | MetricType::MailAuthBase64 + | MetricType::MailAuthDnsError + | MetricType::MailAuthDnsRecordNotFound + | MetricType::MailAuthDnsInvalidRecordType + | MetricType::MailAuthPolicyNotAligned + | MetricType::ManageSieveConnectionStart + | MetricType::ManageSieveConnectionEnd + | MetricType::MessageIngestHam + | MetricType::MessageIngestSpam + | MetricType::MessageIngestImapAppend + | MetricType::MessageIngestJmapAppend + | MetricType::MessageIngestDuplicate + | MetricType::MessageIngestError + | MetricType::MessageIngestFtsIndex + | MetricType::MilterActionAccept + | MetricType::MilterActionDiscard + | MetricType::MilterActionReject + | MetricType::MilterActionTempFail + | MetricType::MilterActionReplyCode + | MetricType::MilterActionConnectionFailure + | MetricType::MilterActionShutdown + | MetricType::MtaHookActionAccept + | MetricType::MtaHookActionDiscard + | MetricType::MtaHookActionReject + | MetricType::MtaHookActionQuarantine + | MetricType::MtaHookError + | MetricType::MtaStsAuthorized + | MetricType::MtaStsNotAuthorized + | MetricType::MtaStsInvalidPolicy + | MetricType::NetworkTimeout + | MetricType::OutgoingReportSpfReport + | MetricType::OutgoingReportSpfRateLimited + | MetricType::OutgoingReportDkimReport + | MetricType::OutgoingReportDkimRateLimited + | MetricType::OutgoingReportDmarcReport + | MetricType::OutgoingReportDmarcRateLimited + | MetricType::OutgoingReportDmarcAggregateReport + | MetricType::OutgoingReportTlsAggregate + | MetricType::OutgoingReportHttpSubmission + | MetricType::OutgoingReportUnauthorizedReportingAddress + | MetricType::OutgoingReportReportingAddressValidationError + | MetricType::OutgoingReportNotFound + | MetricType::OutgoingReportSubmissionError + | MetricType::OutgoingReportNoRecipientsFound + | MetricType::Pop3ConnectionStart + | MetricType::Pop3ConnectionEnd + | MetricType::PurgeError + | MetricType::PushSubscriptionSuccess + | MetricType::PushSubscriptionError + | MetricType::PushSubscriptionNotFound + | MetricType::QueueQueueMessage + | MetricType::QueueQueueMessageAuthenticated + | MetricType::QueueQueueReport + | MetricType::QueueQueueDsn + | MetricType::QueueQueueAutogenerated + | MetricType::QueueRescheduled + | MetricType::QueueBlobNotFound + | MetricType::QueueRateLimitExceeded + | MetricType::QueueConcurrencyLimitExceeded + | MetricType::QueueQuotaExceeded + | MetricType::ResourceNotFound + | MetricType::ResourceBadParameters + | MetricType::ResourceError + | MetricType::SecurityAuthenticationBan + | MetricType::SecurityAbuseBan + | MetricType::SecurityScanBan + | MetricType::SecurityLoiterBan + | MetricType::SecurityIpBlocked + | MetricType::SecurityUnauthorized + | MetricType::ServerThreadError + | MetricType::SieveActionAccept + | MetricType::SieveActionAcceptReplace + | MetricType::SieveActionDiscard + | MetricType::SieveActionReject + | MetricType::SieveSendMessage + | MetricType::SieveMessageTooLarge + | MetricType::SieveRuntimeError + | MetricType::SieveUnexpectedError + | MetricType::SieveNotSupported + | MetricType::SieveQuotaExceeded + | MetricType::SmtpConnectionStart + | MetricType::SmtpConnectionEnd + | MetricType::SmtpError + | MetricType::SmtpConcurrencyLimitExceeded + | MetricType::SmtpTransferLimitExceeded + | MetricType::SmtpRateLimitExceeded + | MetricType::SmtpTimeLimitExceeded + | MetricType::SmtpMessageParseFailed + | MetricType::SmtpMessageTooLarge + | MetricType::SmtpLoopDetected + | MetricType::SmtpDkimPass + | MetricType::SmtpDkimFail + | MetricType::SmtpArcPass + | MetricType::SmtpArcFail + | MetricType::SmtpSpfEhloPass + | MetricType::SmtpSpfEhloFail + | MetricType::SmtpSpfFromPass + | MetricType::SmtpSpfFromFail + | MetricType::SmtpDmarcPass + | MetricType::SmtpDmarcFail + | MetricType::SmtpIprevPass + | MetricType::SmtpIprevFail + | MetricType::SmtpTooManyMessages + | MetricType::SmtpInvalidEhlo + | MetricType::SmtpDidNotSayEhlo + | MetricType::SmtpMailFromUnauthenticated + | MetricType::SmtpMailFromUnauthorized + | MetricType::SmtpMailFromMissing + | MetricType::SmtpMultipleMailFrom + | MetricType::SmtpMailboxDoesNotExist + | MetricType::SmtpRelayNotAllowed + | MetricType::SmtpRcptToDuplicate + | MetricType::SmtpRcptToMissing + | MetricType::SmtpTooManyRecipients + | MetricType::SmtpTooManyInvalidRcpt + | MetricType::SmtpAuthMechanismNotSupported + | MetricType::SmtpAuthExchangeTooLong + | MetricType::SmtpCommandNotImplemented + | MetricType::SmtpInvalidCommand + | MetricType::SmtpSyntaxError + | MetricType::SmtpRequestTooLarge + | MetricType::SpamPyzorError + | MetricType::SpamDnsblError + | MetricType::SpamTrainCompleted + | MetricType::SpamTrainSampleAdded + | MetricType::SpamClassify + | MetricType::SpamModelNotReady + | MetricType::SpfPass + | MetricType::SpfFail + | MetricType::SpfSoftFail + | MetricType::SpfNeutral + | MetricType::SpfTempError + | MetricType::SpfPermError + | MetricType::SpfNone + | MetricType::StoreAssertValueFailed + | MetricType::StoreFoundationdbError + | MetricType::StoreMysqlError + | MetricType::StorePostgresqlError + | MetricType::StoreRocksdbError + | MetricType::StoreSqliteError + | MetricType::StoreLdapError + | MetricType::StoreElasticsearchError + | MetricType::StoreRedisError + | MetricType::StoreS3Error + | MetricType::StoreAzureError + | MetricType::StoreFilesystemError + | MetricType::StorePoolError + | MetricType::StoreDataCorruption + | MetricType::StoreDecompressError + | MetricType::StoreDeserializeError + | MetricType::StoreNotFound + | MetricType::StoreNotConfigured + | MetricType::StoreNotSupported + | MetricType::StoreUnexpectedError + | MetricType::StoreCryptoError + | MetricType::StoreHttpStoreError + | MetricType::StoreBlobMissingMarker + | MetricType::StoreDataWrite + | MetricType::StoreDataIterate + | MetricType::StoreBlobRead + | MetricType::StoreBlobWrite + | MetricType::StoreBlobDelete + | MetricType::TaskQueueBlobNotFound + | MetricType::TaskQueueMetadataNotFound + | MetricType::TelemetryLogError + | MetricType::TelemetryWebhookError + | MetricType::TelemetryOtelExporterError + | MetricType::TelemetryOtelMetricsExporterError + | MetricType::TelemetryPrometheusExporterError + | MetricType::TelemetryJournalError + | MetricType::TlsHandshakeError => "count", + MetricType::DomainCount => "domains", + MetricType::QueueCount => "messages", + MetricType::DeliveryTotalTime + | MetricType::DeliveryAttemptTime + | MetricType::DnsLookupTime + | MetricType::HttpRequestTime + | MetricType::ImapRequestTime + | MetricType::MessageIngestTime + | MetricType::MessageIngestIndexTime + | MetricType::Pop3RequestTime + | MetricType::SieveRequestTime + | MetricType::SmtpRequestTime + | MetricType::StoreDataReadTime + | MetricType::StoreDataWriteTime + | MetricType::StoreBlobReadTime + | MetricType::StoreBlobWriteTime => "milliseconds", + MetricType::UserCount => "users", + } + } + + pub const fn variants() -> &'static [Self] { + &[ + MetricType::AcmeAuthError, + MetricType::AcmeAuthTooManyAttempts, + MetricType::AcmeOrderCompleted, + MetricType::AcmeOrderInvalid, + MetricType::AcmeClientMissingSni, + MetricType::AcmeTlsAlpnError, + MetricType::AcmeTokenNotFound, + MetricType::AcmeError, + MetricType::ArcChainTooLong, + MetricType::ArcInvalidInstance, + MetricType::ArcInvalidCv, + MetricType::ArcHasHeaderTag, + MetricType::ArcBrokenChain, + MetricType::AuthSuccess, + MetricType::AuthFailed, + MetricType::AuthTooManyAttempts, + MetricType::AuthError, + MetricType::CalendarAlarmSent, + MetricType::CalendarAlarmFailed, + MetricType::CalendarItipMessageSent, + MetricType::CalendarItipMessageReceived, + MetricType::CalendarItipMessageError, + MetricType::ClusterSubscriberError, + MetricType::ClusterSubscriberDisconnected, + MetricType::ClusterPublisherError, + MetricType::DaneAuthenticationSuccess, + MetricType::DaneAuthenticationFailure, + MetricType::DaneNoCertificatesFound, + MetricType::DaneCertificateParseError, + MetricType::DaneTlsaRecordFetchError, + MetricType::DaneTlsaRecordNotFound, + MetricType::DaneTlsaRecordNotDnssecSigned, + MetricType::DaneTlsaRecordInvalid, + MetricType::DeliveryTotalTime, + MetricType::DeliveryAttemptTime, + MetricType::DeliveryActiveConnections, + MetricType::DeliveryAttemptStart, + MetricType::DeliveryAttemptEnd, + MetricType::DeliveryCompleted, + MetricType::DeliveryMxLookupFailed, + MetricType::DeliveryIpLookupFailed, + MetricType::DeliveryNullMx, + MetricType::DeliveryGreetingFailed, + MetricType::DeliveryEhloRejected, + MetricType::DeliveryAuthFailed, + MetricType::DeliveryMailFromRejected, + MetricType::DeliveryDelivered, + MetricType::DeliveryRcptToRejected, + MetricType::DeliveryRcptToFailed, + MetricType::DeliveryMessageRejected, + MetricType::DeliveryStartTlsUnavailable, + MetricType::DeliveryStartTlsError, + MetricType::DeliveryStartTlsDisabled, + MetricType::DeliveryImplicitTlsError, + MetricType::DeliveryConcurrencyLimitExceeded, + MetricType::DeliveryRateLimitExceeded, + MetricType::DeliveryDoubleBounce, + MetricType::DeliveryDsnSuccess, + MetricType::DeliveryDsnTempFail, + MetricType::DeliveryDsnPermFail, + MetricType::DkimPass, + MetricType::DkimNeutral, + MetricType::DkimFail, + MetricType::DkimPermError, + MetricType::DkimTempError, + MetricType::DkimNone, + MetricType::DkimUnsupportedVersion, + MetricType::DkimUnsupportedAlgorithm, + MetricType::DkimUnsupportedCanonicalization, + MetricType::DkimUnsupportedKeyType, + MetricType::DkimFailedBodyHashMatch, + MetricType::DkimFailedVerification, + MetricType::DkimFailedAuidMatch, + MetricType::DkimRevokedPublicKey, + MetricType::DkimIncompatibleAlgorithms, + MetricType::DkimSignatureExpired, + MetricType::DkimSignatureLength, + MetricType::DkimSignerNotFound, + MetricType::DmarcPass, + MetricType::DmarcFail, + MetricType::DmarcPermError, + MetricType::DmarcTempError, + MetricType::DmarcNone, + MetricType::DnsLookupTime, + MetricType::DnsRecordCreationFailed, + MetricType::DnsRecordDeletionFailed, + MetricType::DnsRecordLookupFailed, + MetricType::DnsRecordPropagationTimeout, + MetricType::DomainCount, + MetricType::EvalError, + MetricType::EvalDirectoryNotFound, + MetricType::EvalStoreNotFound, + MetricType::HttpRequestTime, + MetricType::HttpActiveConnections, + MetricType::HttpError, + MetricType::HttpRequestBody, + MetricType::HttpResponseBody, + MetricType::HttpXForwardedMissing, + MetricType::ImapRequestTime, + MetricType::ImapActiveConnections, + MetricType::ImapConnectionStart, + MetricType::ImapConnectionEnd, + MetricType::IncomingReportDmarcReport, + MetricType::IncomingReportDmarcReportWithWarnings, + MetricType::IncomingReportTlsReport, + MetricType::IncomingReportTlsReportWithWarnings, + MetricType::IncomingReportAbuseReport, + MetricType::IncomingReportAuthFailureReport, + MetricType::IncomingReportFraudReport, + MetricType::IncomingReportNotSpamReport, + MetricType::IncomingReportVirusReport, + MetricType::IncomingReportOtherReport, + MetricType::IncomingReportMessageParseFailed, + MetricType::IncomingReportDmarcParseFailed, + MetricType::IncomingReportTlsRpcParseFailed, + MetricType::IncomingReportArfParseFailed, + MetricType::IncomingReportDecompressError, + MetricType::IprevPass, + MetricType::IprevFail, + MetricType::IprevPermError, + MetricType::IprevTempError, + MetricType::IprevNone, + MetricType::JmapMethodCall, + MetricType::JmapInvalidArguments, + MetricType::JmapRequestTooLarge, + MetricType::JmapUnsupportedFilter, + MetricType::JmapUnsupportedSort, + MetricType::JmapUnknownMethod, + MetricType::JmapForbidden, + MetricType::JmapNotJson, + MetricType::JmapNotRequest, + MetricType::JmapWebsocketStart, + MetricType::JmapWebsocketError, + MetricType::LimitSizeRequest, + MetricType::LimitSizeUpload, + MetricType::LimitCallsIn, + MetricType::LimitConcurrentRequest, + MetricType::LimitConcurrentUpload, + MetricType::LimitConcurrentConnection, + MetricType::LimitQuota, + MetricType::LimitBlobQuota, + MetricType::LimitTenantQuota, + MetricType::LimitTooManyRequests, + MetricType::MailAuthParseError, + MetricType::MailAuthMissingParameters, + MetricType::MailAuthNoHeadersFound, + MetricType::MailAuthCrypto, + MetricType::MailAuthIo, + MetricType::MailAuthBase64, + MetricType::MailAuthDnsError, + MetricType::MailAuthDnsRecordNotFound, + MetricType::MailAuthDnsInvalidRecordType, + MetricType::MailAuthPolicyNotAligned, + MetricType::ManageSieveConnectionStart, + MetricType::ManageSieveConnectionEnd, + MetricType::MessageSize, + MetricType::MessageAuthenticatedSize, + MetricType::MessageIngestTime, + MetricType::MessageIngestIndexTime, + MetricType::MessageIngestHam, + MetricType::MessageIngestSpam, + MetricType::MessageIngestImapAppend, + MetricType::MessageIngestJmapAppend, + MetricType::MessageIngestDuplicate, + MetricType::MessageIngestError, + MetricType::MessageIngestFtsIndex, + MetricType::MilterActionAccept, + MetricType::MilterActionDiscard, + MetricType::MilterActionReject, + MetricType::MilterActionTempFail, + MetricType::MilterActionReplyCode, + MetricType::MilterActionConnectionFailure, + MetricType::MilterActionShutdown, + MetricType::MtaHookActionAccept, + MetricType::MtaHookActionDiscard, + MetricType::MtaHookActionReject, + MetricType::MtaHookActionQuarantine, + MetricType::MtaHookError, + MetricType::MtaStsAuthorized, + MetricType::MtaStsNotAuthorized, + MetricType::MtaStsInvalidPolicy, + MetricType::NetworkTimeout, + MetricType::OutgoingReportSize, + MetricType::OutgoingReportSpfReport, + MetricType::OutgoingReportSpfRateLimited, + MetricType::OutgoingReportDkimReport, + MetricType::OutgoingReportDkimRateLimited, + MetricType::OutgoingReportDmarcReport, + MetricType::OutgoingReportDmarcRateLimited, + MetricType::OutgoingReportDmarcAggregateReport, + MetricType::OutgoingReportTlsAggregate, + MetricType::OutgoingReportHttpSubmission, + MetricType::OutgoingReportUnauthorizedReportingAddress, + MetricType::OutgoingReportReportingAddressValidationError, + MetricType::OutgoingReportNotFound, + MetricType::OutgoingReportSubmissionError, + MetricType::OutgoingReportNoRecipientsFound, + MetricType::Pop3RequestTime, + MetricType::Pop3ActiveConnections, + MetricType::Pop3ConnectionStart, + MetricType::Pop3ConnectionEnd, + MetricType::PurgeError, + MetricType::PushSubscriptionSuccess, + MetricType::PushSubscriptionError, + MetricType::PushSubscriptionNotFound, + MetricType::QueueCount, + MetricType::QueueQueueMessage, + MetricType::QueueQueueMessageAuthenticated, + MetricType::QueueQueueReport, + MetricType::QueueQueueDsn, + MetricType::QueueQueueAutogenerated, + MetricType::QueueRescheduled, + MetricType::QueueBlobNotFound, + MetricType::QueueRateLimitExceeded, + MetricType::QueueConcurrencyLimitExceeded, + MetricType::QueueQuotaExceeded, + MetricType::ResourceNotFound, + MetricType::ResourceBadParameters, + MetricType::ResourceError, + MetricType::SecurityAuthenticationBan, + MetricType::SecurityAbuseBan, + MetricType::SecurityScanBan, + MetricType::SecurityLoiterBan, + MetricType::SecurityIpBlocked, + MetricType::SecurityUnauthorized, + MetricType::ServerMemory, + MetricType::ServerThreadError, + MetricType::SieveRequestTime, + MetricType::SieveActiveConnections, + MetricType::SieveActionAccept, + MetricType::SieveActionAcceptReplace, + MetricType::SieveActionDiscard, + MetricType::SieveActionReject, + MetricType::SieveSendMessage, + MetricType::SieveMessageTooLarge, + MetricType::SieveRuntimeError, + MetricType::SieveUnexpectedError, + MetricType::SieveNotSupported, + MetricType::SieveQuotaExceeded, + MetricType::SmtpRequestTime, + MetricType::SmtpActiveConnections, + MetricType::SmtpConnectionStart, + MetricType::SmtpConnectionEnd, + MetricType::SmtpError, + MetricType::SmtpConcurrencyLimitExceeded, + MetricType::SmtpTransferLimitExceeded, + MetricType::SmtpRateLimitExceeded, + MetricType::SmtpTimeLimitExceeded, + MetricType::SmtpMessageParseFailed, + MetricType::SmtpMessageTooLarge, + MetricType::SmtpLoopDetected, + MetricType::SmtpDkimPass, + MetricType::SmtpDkimFail, + MetricType::SmtpArcPass, + MetricType::SmtpArcFail, + MetricType::SmtpSpfEhloPass, + MetricType::SmtpSpfEhloFail, + MetricType::SmtpSpfFromPass, + MetricType::SmtpSpfFromFail, + MetricType::SmtpDmarcPass, + MetricType::SmtpDmarcFail, + MetricType::SmtpIprevPass, + MetricType::SmtpIprevFail, + MetricType::SmtpTooManyMessages, + MetricType::SmtpInvalidEhlo, + MetricType::SmtpDidNotSayEhlo, + MetricType::SmtpMailFromUnauthenticated, + MetricType::SmtpMailFromUnauthorized, + MetricType::SmtpMailFromMissing, + MetricType::SmtpMultipleMailFrom, + MetricType::SmtpMailboxDoesNotExist, + MetricType::SmtpRelayNotAllowed, + MetricType::SmtpRcptToDuplicate, + MetricType::SmtpRcptToMissing, + MetricType::SmtpTooManyRecipients, + MetricType::SmtpTooManyInvalidRcpt, + MetricType::SmtpAuthMechanismNotSupported, + MetricType::SmtpAuthExchangeTooLong, + MetricType::SmtpCommandNotImplemented, + MetricType::SmtpInvalidCommand, + MetricType::SmtpSyntaxError, + MetricType::SmtpRequestTooLarge, + MetricType::SpamPyzorError, + MetricType::SpamDnsblError, + MetricType::SpamTrainCompleted, + MetricType::SpamTrainSampleAdded, + MetricType::SpamClassify, + MetricType::SpamModelNotReady, + MetricType::SpfPass, + MetricType::SpfFail, + MetricType::SpfSoftFail, + MetricType::SpfNeutral, + MetricType::SpfTempError, + MetricType::SpfPermError, + MetricType::SpfNone, + MetricType::StoreDataReadTime, + MetricType::StoreDataWriteTime, + MetricType::StoreBlobReadTime, + MetricType::StoreBlobWriteTime, + MetricType::StoreAssertValueFailed, + MetricType::StoreFoundationdbError, + MetricType::StoreMysqlError, + MetricType::StorePostgresqlError, + MetricType::StoreRocksdbError, + MetricType::StoreSqliteError, + MetricType::StoreLdapError, + MetricType::StoreElasticsearchError, + MetricType::StoreRedisError, + MetricType::StoreS3Error, + MetricType::StoreAzureError, + MetricType::StoreFilesystemError, + MetricType::StorePoolError, + MetricType::StoreDataCorruption, + MetricType::StoreDecompressError, + MetricType::StoreDeserializeError, + MetricType::StoreNotFound, + MetricType::StoreNotConfigured, + MetricType::StoreNotSupported, + MetricType::StoreUnexpectedError, + MetricType::StoreCryptoError, + MetricType::StoreHttpStoreError, + MetricType::StoreBlobMissingMarker, + MetricType::StoreDataWrite, + MetricType::StoreDataIterate, + MetricType::StoreBlobRead, + MetricType::StoreBlobWrite, + MetricType::StoreBlobDelete, + MetricType::TaskQueueBlobNotFound, + MetricType::TaskQueueMetadataNotFound, + MetricType::TelemetryLogError, + MetricType::TelemetryWebhookError, + MetricType::TelemetryOtelExporterError, + MetricType::TelemetryOtelMetricsExporterError, + MetricType::TelemetryPrometheusExporterError, + MetricType::TelemetryJournalError, + MetricType::TlsHandshakeError, + MetricType::UserCount, + ] + } +} diff --git a/crates/trc/src/event/level.rs b/crates/trc/src/event/level.rs index de1e5043..92c32cc7 100644 --- a/crates/trc/src/event/level.rs +++ b/crates/trc/src/event/level.rs @@ -4,557 +4,9 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ +use crate::Level; use std::{cmp::Ordering, fmt::Display, str::FromStr}; -use super::*; - -impl EventType { - pub fn level(&self) -> Level { - match self { - EventType::Store(event) => match event { - StoreEvent::DataWrite - | StoreEvent::DataIterate - | StoreEvent::BlobRead - | StoreEvent::BlobWrite - | StoreEvent::BlobDelete - | StoreEvent::SqlQuery - | StoreEvent::LdapQuery => Level::Trace, - StoreEvent::CacheMiss - | StoreEvent::CacheHit - | StoreEvent::CacheStale - | StoreEvent::CacheUpdate - | StoreEvent::NotFound - | StoreEvent::HttpStoreFetch - | StoreEvent::LdapWarning => Level::Debug, - StoreEvent::AssertValueFailed - | StoreEvent::FoundationdbError - | StoreEvent::MysqlError - | StoreEvent::PostgresqlError - | StoreEvent::RocksdbError - | StoreEvent::SqliteError - | StoreEvent::LdapError - | StoreEvent::ElasticsearchError - | StoreEvent::MeilisearchError - | StoreEvent::RedisError - | StoreEvent::S3Error - | StoreEvent::AzureError - | StoreEvent::FilesystemError - | StoreEvent::PoolError - | StoreEvent::DataCorruption - | StoreEvent::DecompressError - | StoreEvent::DeserializeError - | StoreEvent::NotConfigured - | StoreEvent::NotSupported - | StoreEvent::UnexpectedError - | StoreEvent::CryptoError => Level::Error, - StoreEvent::BlobMissingMarker | StoreEvent::HttpStoreError => Level::Warn, - }, - EventType::Jmap(_) => Level::Debug, - EventType::Imap(event) => match event { - ImapEvent::ConnectionStart | ImapEvent::ConnectionEnd => Level::Debug, - ImapEvent::GetAcl - | ImapEvent::SetAcl - | ImapEvent::MyRights - | ImapEvent::ListRights - | ImapEvent::Append - | ImapEvent::Capabilities - | ImapEvent::Id - | ImapEvent::Close - | ImapEvent::Copy - | ImapEvent::Move - | ImapEvent::CreateMailbox - | ImapEvent::DeleteMailbox - | ImapEvent::RenameMailbox - | ImapEvent::Enable - | ImapEvent::Expunge - | ImapEvent::Fetch - | ImapEvent::List - | ImapEvent::Lsub - | ImapEvent::Logout - | ImapEvent::Namespace - | ImapEvent::Noop - | ImapEvent::Search - | ImapEvent::Sort - | ImapEvent::Select - | ImapEvent::Status - | ImapEvent::Store - | ImapEvent::Subscribe - | ImapEvent::Unsubscribe - | ImapEvent::Thread - | ImapEvent::Error - | ImapEvent::IdleStart - | ImapEvent::IdleStop - | ImapEvent::GetQuota => Level::Debug, - ImapEvent::RawInput | ImapEvent::RawOutput => Level::Trace, - }, - EventType::ManageSieve(event) => match event { - ManageSieveEvent::ConnectionStart | ManageSieveEvent::ConnectionEnd => Level::Debug, - ManageSieveEvent::CreateScript - | ManageSieveEvent::UpdateScript - | ManageSieveEvent::GetScript - | ManageSieveEvent::DeleteScript - | ManageSieveEvent::RenameScript - | ManageSieveEvent::CheckScript - | ManageSieveEvent::HaveSpace - | ManageSieveEvent::ListScripts - | ManageSieveEvent::SetActive - | ManageSieveEvent::Capabilities - | ManageSieveEvent::StartTls - | ManageSieveEvent::Unauthenticate - | ManageSieveEvent::Logout - | ManageSieveEvent::Noop - | ManageSieveEvent::Error => Level::Debug, - ManageSieveEvent::RawInput | ManageSieveEvent::RawOutput => Level::Trace, - }, - EventType::Pop3(event) => match event { - Pop3Event::ConnectionStart | Pop3Event::ConnectionEnd => Level::Debug, - Pop3Event::Delete - | Pop3Event::Reset - | Pop3Event::Quit - | Pop3Event::Fetch - | Pop3Event::List - | Pop3Event::ListMessage - | Pop3Event::Uidl - | Pop3Event::UidlMessage - | Pop3Event::Stat - | Pop3Event::Noop - | Pop3Event::Capabilities - | Pop3Event::StartTls - | Pop3Event::Utf8 - | Pop3Event::Error => Level::Debug, - Pop3Event::RawInput | Pop3Event::RawOutput => Level::Trace, - }, - EventType::Smtp(event) => match event { - SmtpEvent::ConnectionStart | SmtpEvent::ConnectionEnd => Level::Debug, - SmtpEvent::DidNotSayEhlo - | SmtpEvent::EhloExpected - | SmtpEvent::LhloExpected - | SmtpEvent::MailFromUnauthenticated - | SmtpEvent::MailFromUnauthorized - | SmtpEvent::MailFromRewritten - | SmtpEvent::MailFromMissing - | SmtpEvent::MultipleMailFrom - | SmtpEvent::MailFromNotAllowed - | SmtpEvent::RcptToDuplicate - | SmtpEvent::RcptToRewritten - | SmtpEvent::RcptToMissing - | SmtpEvent::RequireTlsDisabled - | SmtpEvent::DeliverByDisabled - | SmtpEvent::DeliverByInvalid - | SmtpEvent::FutureReleaseDisabled - | SmtpEvent::FutureReleaseInvalid - | SmtpEvent::MtPriorityDisabled - | SmtpEvent::MtPriorityInvalid - | SmtpEvent::DsnDisabled - | SmtpEvent::AuthExchangeTooLong - | SmtpEvent::AlreadyAuthenticated - | SmtpEvent::Noop - | SmtpEvent::StartTls - | SmtpEvent::StartTlsUnavailable - | SmtpEvent::StartTlsAlready - | SmtpEvent::Rset - | SmtpEvent::Quit - | SmtpEvent::Help - | SmtpEvent::CommandNotImplemented - | SmtpEvent::InvalidCommand - | SmtpEvent::InvalidSenderAddress - | SmtpEvent::InvalidRecipientAddress - | SmtpEvent::InvalidParameter - | SmtpEvent::UnsupportedParameter - | SmtpEvent::SyntaxError - | SmtpEvent::Error => Level::Debug, - SmtpEvent::MissingLocalHostname | SmtpEvent::IdNotFound => Level::Warn, - SmtpEvent::ConcurrencyLimitExceeded - | SmtpEvent::TransferLimitExceeded - | SmtpEvent::RateLimitExceeded - | SmtpEvent::TimeLimitExceeded - | SmtpEvent::MissingAuthDirectory - | SmtpEvent::MessageParseFailed - | SmtpEvent::MessageTooLarge - | SmtpEvent::LoopDetected - | SmtpEvent::DkimPass - | SmtpEvent::DkimFail - | SmtpEvent::ArcPass - | SmtpEvent::ArcFail - | SmtpEvent::SpfEhloPass - | SmtpEvent::SpfEhloFail - | SmtpEvent::SpfFromPass - | SmtpEvent::SpfFromFail - | SmtpEvent::DmarcPass - | SmtpEvent::DmarcFail - | SmtpEvent::IprevPass - | SmtpEvent::IprevFail - | SmtpEvent::TooManyMessages - | SmtpEvent::Ehlo - | SmtpEvent::InvalidEhlo - | SmtpEvent::MailFrom - | SmtpEvent::MailboxDoesNotExist - | SmtpEvent::RelayNotAllowed - | SmtpEvent::RcptTo - | SmtpEvent::RcptToGreylisted - | SmtpEvent::TooManyInvalidRcpt - | SmtpEvent::Vrfy - | SmtpEvent::VrfyNotFound - | SmtpEvent::VrfyDisabled - | SmtpEvent::Expn - | SmtpEvent::ExpnNotFound - | SmtpEvent::AuthNotAllowed - | SmtpEvent::AuthMechanismNotSupported - | SmtpEvent::ExpnDisabled - | SmtpEvent::RequestTooLarge - | SmtpEvent::TooManyRecipients => Level::Info, - SmtpEvent::RawInput | SmtpEvent::RawOutput => Level::Trace, - }, - EventType::Network(event) => match event { - NetworkEvent::ReadError - | NetworkEvent::WriteError - | NetworkEvent::FlushError - | NetworkEvent::Closed => Level::Trace, - NetworkEvent::Timeout | NetworkEvent::AcceptError => Level::Debug, - NetworkEvent::ListenStart | NetworkEvent::ListenStop => Level::Info, - NetworkEvent::ListenError - | NetworkEvent::BindError - | NetworkEvent::SetOptError - | NetworkEvent::SplitError => Level::Error, - NetworkEvent::ProxyError => Level::Warn, - }, - EventType::Limit(cause) => match cause { - LimitEvent::SizeRequest => Level::Debug, - LimitEvent::SizeUpload => Level::Debug, - LimitEvent::CallsIn => Level::Debug, - LimitEvent::ConcurrentRequest => Level::Debug, - LimitEvent::ConcurrentUpload => Level::Debug, - LimitEvent::ConcurrentConnection => Level::Warn, - LimitEvent::Quota => Level::Debug, - LimitEvent::BlobQuota => Level::Debug, - LimitEvent::TooManyRequests => Level::Warn, - LimitEvent::TenantQuota => Level::Info, - }, - EventType::Manage(_) => Level::Debug, - EventType::Auth(cause) => match cause { - AuthEvent::Failed | AuthEvent::TokenExpired => Level::Debug, - AuthEvent::MissingTotp => Level::Trace, - AuthEvent::TooManyAttempts => Level::Warn, - AuthEvent::Error => Level::Error, - AuthEvent::Success | AuthEvent::ClientRegistration => Level::Info, - }, - EventType::Config(cause) => match cause { - ConfigEvent::ParseError - | ConfigEvent::BuildError - | ConfigEvent::MacroError - | ConfigEvent::WriteError - | ConfigEvent::FetchError => Level::Error, - ConfigEvent::DefaultApplied - | ConfigEvent::MissingSetting - | ConfigEvent::UnusedSetting - | ConfigEvent::AlreadyUpToDate => Level::Debug, - ConfigEvent::ParseWarning | ConfigEvent::BuildWarning => Level::Warn, - ConfigEvent::ImportExternal => Level::Info, - }, - EventType::Resource(cause) => match cause { - ResourceEvent::NotFound => Level::Debug, - ResourceEvent::BadParameters | ResourceEvent::Error => Level::Error, - ResourceEvent::DownloadExternal | ResourceEvent::WebadminUnpacked => Level::Info, - }, - EventType::Arc(event) => match event { - ArcEvent::ChainTooLong - | ArcEvent::InvalidInstance - | ArcEvent::InvalidCv - | ArcEvent::HasHeaderTag - | ArcEvent::BrokenChain => Level::Debug, - ArcEvent::SealerNotFound => Level::Warn, - }, - EventType::Dkim(event) => match event { - DkimEvent::SignerNotFound | DkimEvent::BuildError => Level::Warn, - _ => Level::Debug, - }, - EventType::MailAuth(_) => Level::Debug, - EventType::Purge(event) => match event { - PurgeEvent::Started => Level::Debug, - PurgeEvent::Finished => Level::Debug, - PurgeEvent::Running => Level::Info, - PurgeEvent::Error => Level::Error, - PurgeEvent::BlobCleanup => Level::Info, - PurgeEvent::InProgress | PurgeEvent::AutoExpunge => Level::Debug, - }, - EventType::Eval(event) => match event { - EvalEvent::Error | EvalEvent::StoreNotFound => Level::Debug, - EvalEvent::Result => Level::Trace, - EvalEvent::DirectoryNotFound => Level::Warn, - }, - EventType::Server(event) => match event { - ServerEvent::Startup | ServerEvent::Shutdown | ServerEvent::Licensing => { - Level::Info - } - ServerEvent::StartupError | ServerEvent::ThreadError => Level::Error, - }, - EventType::Acme(event) => match event { - AcmeEvent::TlsAlpnReceived - | AcmeEvent::AuthStart - | AcmeEvent::AuthPending - | AcmeEvent::AuthValid - | AcmeEvent::AuthCompleted - | AcmeEvent::ProcessCert - | AcmeEvent::OrderProcessing - | AcmeEvent::OrderReady - | AcmeEvent::OrderValid - | AcmeEvent::OrderStart - | AcmeEvent::OrderCompleted => Level::Info, - AcmeEvent::Error => Level::Error, - AcmeEvent::OrderInvalid - | AcmeEvent::AuthError - | AcmeEvent::AuthTooManyAttempts - | AcmeEvent::TokenNotFound - | AcmeEvent::TlsAlpnError => Level::Warn, - AcmeEvent::RenewBackoff - | AcmeEvent::ClientSuppliedSni - | AcmeEvent::ClientMissingSni => Level::Debug, - }, - EventType::Dns(event) => match event { - DnsEvent::RecordCreated | DnsEvent::RecordPropagated => Level::Info, - DnsEvent::RecordPropagationTimeout | DnsEvent::RecordCreationFailed => Level::Warn, - DnsEvent::RecordDeletionFailed - | DnsEvent::RecordNotPropagated - | DnsEvent::RecordLookupFailed => Level::Debug, - DnsEvent::BuildError => Level::Error, - }, - EventType::Tls(event) => match event { - TlsEvent::Handshake => Level::Info, - TlsEvent::HandshakeError | TlsEvent::CertificateNotFound => Level::Debug, - TlsEvent::NotConfigured => Level::Error, - TlsEvent::NoCertificatesAvailable | TlsEvent::MultipleCertificatesAvailable => { - Level::Warn - } - }, - EventType::Sieve(event) => match event { - SieveEvent::NotSupported - | SieveEvent::QuotaExceeded - | SieveEvent::ListNotFound - | SieveEvent::ScriptNotFound - | SieveEvent::MessageTooLarge => Level::Warn, - SieveEvent::SendMessage => Level::Info, - SieveEvent::UnexpectedError => Level::Error, - SieveEvent::ActionAccept - | SieveEvent::RuntimeError - | SieveEvent::ActionAcceptReplace - | SieveEvent::ActionDiscard - | SieveEvent::ActionReject => Level::Debug, - }, - EventType::Spam(event) => match event { - SpamEvent::Pyzor - | SpamEvent::PyzorError - | SpamEvent::Dnsbl - | SpamEvent::DnsblError - | SpamEvent::Classify - | SpamEvent::TrainSampleAdded => Level::Debug, - SpamEvent::TrainSampleNotFound => Level::Warn, - SpamEvent::TrainStarted - | SpamEvent::TrainCompleted - | SpamEvent::ModelLoaded - | SpamEvent::ModelNotReady - | SpamEvent::ModelNotFound => Level::Info, - }, - EventType::Http(event) => match event { - HttpEvent::ConnectionStart | HttpEvent::ConnectionEnd => Level::Debug, - HttpEvent::XForwardedMissing => Level::Warn, - HttpEvent::Error | HttpEvent::RequestUrl => Level::Debug, - HttpEvent::RequestBody | HttpEvent::ResponseBody => Level::Trace, - }, - EventType::PushSubscription(event) => match event { - PushSubscriptionEvent::Error | PushSubscriptionEvent::NotFound => Level::Debug, - PushSubscriptionEvent::Success => Level::Trace, - }, - EventType::Cluster(event) => match event { - ClusterEvent::SubscriberStart - | ClusterEvent::SubscriberStop - | ClusterEvent::PublisherStart - | ClusterEvent::PublisherStop => Level::Info, - ClusterEvent::SubscriberDisconnected => Level::Warn, - ClusterEvent::MessageReceived | ClusterEvent::MessageSkipped => Level::Trace, - ClusterEvent::PublisherError - | ClusterEvent::SubscriberError - | ClusterEvent::MessageInvalid => Level::Error, - }, - EventType::Housekeeper(event) => match event { - HousekeeperEvent::Start | HousekeeperEvent::Stop => Level::Info, - HousekeeperEvent::Run | HousekeeperEvent::Schedule => Level::Debug, - }, - EventType::TaskQueue(event) => match event { - TaskQueueEvent::BlobNotFound - | TaskQueueEvent::TaskAcquired - | TaskQueueEvent::TaskLocked - | TaskQueueEvent::TaskIgnored - | TaskQueueEvent::MetadataNotFound => Level::Debug, - TaskQueueEvent::TaskFailed => Level::Warn, - }, - EventType::Dmarc(_) => Level::Debug, - EventType::Spf(_) => Level::Debug, - EventType::Iprev(_) => Level::Debug, - EventType::Milter(event) => match event { - MilterEvent::Read | MilterEvent::Write => Level::Trace, - MilterEvent::ActionAccept - | MilterEvent::ActionDiscard - | MilterEvent::ActionReject - | MilterEvent::ActionTempFail - | MilterEvent::ActionReplyCode - | MilterEvent::ActionConnectionFailure - | MilterEvent::ActionShutdown => Level::Info, - MilterEvent::IoError - | MilterEvent::FrameTooLarge - | MilterEvent::FrameInvalid - | MilterEvent::UnexpectedResponse - | MilterEvent::Timeout - | MilterEvent::TlsInvalidName - | MilterEvent::Disconnected - | MilterEvent::ParseError => Level::Warn, - }, - EventType::MtaHook(event) => match event { - MtaHookEvent::ActionAccept - | MtaHookEvent::ActionDiscard - | MtaHookEvent::ActionReject - | MtaHookEvent::ActionQuarantine => Level::Info, - MtaHookEvent::Error => Level::Warn, - }, - EventType::Dane(event) => match event { - DaneEvent::AuthenticationSuccess - | DaneEvent::AuthenticationFailure - | DaneEvent::NoCertificatesFound - | DaneEvent::CertificateParseError - | DaneEvent::TlsaRecordMatch - | DaneEvent::TlsaRecordFetch - | DaneEvent::TlsaRecordFetchError - | DaneEvent::TlsaRecordNotFound - | DaneEvent::TlsaRecordNotDnssecSigned - | DaneEvent::TlsaRecordInvalid => Level::Info, - }, - EventType::Delivery(event) => match event { - DeliveryEvent::AttemptStart - | DeliveryEvent::AttemptEnd - | DeliveryEvent::Completed - | DeliveryEvent::Failed - | DeliveryEvent::DomainDeliveryStart - | DeliveryEvent::MxLookupFailed - | DeliveryEvent::IpLookupFailed - | DeliveryEvent::NullMx - | DeliveryEvent::Connect - | DeliveryEvent::ConnectError - | DeliveryEvent::GreetingFailed - | DeliveryEvent::EhloRejected - | DeliveryEvent::AuthFailed - | DeliveryEvent::MailFromRejected - | DeliveryEvent::Delivered - | DeliveryEvent::RcptToRejected - | DeliveryEvent::RcptToFailed - | DeliveryEvent::MessageRejected - | DeliveryEvent::StartTls - | DeliveryEvent::StartTlsUnavailable - | DeliveryEvent::StartTlsError - | DeliveryEvent::StartTlsDisabled - | DeliveryEvent::ImplicitTlsError - | DeliveryEvent::DoubleBounce => Level::Info, - DeliveryEvent::ConcurrencyLimitExceeded - | DeliveryEvent::RateLimitExceeded - | DeliveryEvent::MissingOutboundHostname => Level::Warn, - DeliveryEvent::DsnSuccess - | DeliveryEvent::DsnTempFail - | DeliveryEvent::DsnPermFail => Level::Info, - DeliveryEvent::MxLookup - | DeliveryEvent::IpLookup - | DeliveryEvent::Ehlo - | DeliveryEvent::Auth - | DeliveryEvent::MailFrom - | DeliveryEvent::RcptTo => Level::Debug, - DeliveryEvent::RawInput | DeliveryEvent::RawOutput => Level::Trace, - }, - EventType::Queue(event) => match event { - QueueEvent::BackPressure => Level::Warn, - QueueEvent::QueueMessage - | QueueEvent::QueueMessageAuthenticated - | QueueEvent::QueueReport - | QueueEvent::QueueDsn - | QueueEvent::QueueAutogenerated - | QueueEvent::RateLimitExceeded - | QueueEvent::ConcurrencyLimitExceeded - | QueueEvent::Rescheduled - | QueueEvent::QuotaExceeded => Level::Info, - QueueEvent::Locked | QueueEvent::BlobNotFound => Level::Debug, - }, - EventType::TlsRpt(event) => match event { - TlsRptEvent::RecordFetch - | TlsRptEvent::RecordFetchError - | TlsRptEvent::RecordNotFound => Level::Info, - }, - EventType::MtaSts(event) => match event { - MtaStsEvent::PolicyFetch - | MtaStsEvent::PolicyNotFound - | MtaStsEvent::PolicyFetchError - | MtaStsEvent::InvalidPolicy - | MtaStsEvent::NotAuthorized - | MtaStsEvent::Authorized => Level::Info, - }, - EventType::IncomingReport(event) => match event { - IncomingReportEvent::DmarcReportWithWarnings - | IncomingReportEvent::TlsReportWithWarnings => Level::Warn, - IncomingReportEvent::DmarcReport - | IncomingReportEvent::TlsReport - | IncomingReportEvent::AbuseReport - | IncomingReportEvent::AuthFailureReport - | IncomingReportEvent::FraudReport - | IncomingReportEvent::NotSpamReport - | IncomingReportEvent::VirusReport - | IncomingReportEvent::OtherReport - | IncomingReportEvent::MessageParseFailed - | IncomingReportEvent::DmarcParseFailed - | IncomingReportEvent::TlsRpcParseFailed - | IncomingReportEvent::ArfParseFailed - | IncomingReportEvent::DecompressError => Level::Info, - }, - EventType::OutgoingReport(event) => match event { - OutgoingReportEvent::Locked | OutgoingReportEvent::NotFound => Level::Info, - OutgoingReportEvent::SpfReport - | OutgoingReportEvent::SpfRateLimited - | OutgoingReportEvent::DkimReport - | OutgoingReportEvent::DkimRateLimited - | OutgoingReportEvent::DmarcReport - | OutgoingReportEvent::DmarcRateLimited - | OutgoingReportEvent::DmarcAggregateReport - | OutgoingReportEvent::TlsAggregate - | OutgoingReportEvent::HttpSubmission - | OutgoingReportEvent::UnauthorizedReportingAddress - | OutgoingReportEvent::ReportingAddressValidationError - | OutgoingReportEvent::SubmissionError - | OutgoingReportEvent::NoRecipientsFound => Level::Info, - }, - EventType::Telemetry(_) => Level::Warn, - EventType::MessageIngest(event) => match event { - MessageIngestEvent::Ham - | MessageIngestEvent::Spam - | MessageIngestEvent::ImapAppend - | MessageIngestEvent::JmapAppend - | MessageIngestEvent::Duplicate - | MessageIngestEvent::FtsIndex => Level::Info, - MessageIngestEvent::Error => Level::Error, - }, - EventType::Security(_) => Level::Info, - EventType::Ai(event) => match event { - AiEvent::LlmResponse => Level::Trace, - AiEvent::ApiError => Level::Warn, - }, - EventType::WebDav(_) => Level::Debug, - EventType::Calendar(event) => match event { - CalendarEvent::ItipMessageSent - | CalendarEvent::ItipMessageReceived - | CalendarEvent::AlarmSent => Level::Info, - CalendarEvent::AlarmFailed => Level::Warn, - CalendarEvent::RuleExpansionError - | CalendarEvent::AlarmSkipped - | CalendarEvent::AlarmRecipientOverride - | CalendarEvent::ItipMessageError => Level::Debug, - }, - } - } -} - impl PartialOrd for Level { #[inline(always)] fn partial_cmp(&self, other: &Level) -> Option { diff --git a/crates/trc/src/event/metrics.rs b/crates/trc/src/event/metrics.rs deleted file mode 100644 index 6a285bde..00000000 --- a/crates/trc/src/event/metrics.rs +++ /dev/null @@ -1,235 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2020 Stalwart Labs LLC - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL - */ - -use super::MetricType; - -impl MetricType { - pub fn name(&self) -> &'static str { - match self { - Self::MessageIngestionTime => "message-ingest.time", - Self::MessageFtsIndexTime => "message-ingest.index-time", - Self::DeliveryTotalTime => "delivery.total-time", - Self::DeliveryTime => "delivery.attempt-time", - Self::MessageSize => "message.size", - Self::MessageAuthSize => "message.authenticated-size", - Self::ReportOutgoingSize => "outgoing-report.size", - Self::StoreReadTime => "store.data-read-time", - Self::StoreWriteTime => "store.data-write-time", - Self::BlobReadTime => "store.blob-read-time", - Self::BlobWriteTime => "store.blob-write-time", - Self::DnsLookupTime => "dns.lookup-time", - Self::HttpRequestTime => "http.request-time", - Self::ImapRequestTime => "imap.request-time", - Self::Pop3RequestTime => "pop3.request-time", - Self::SmtpRequestTime => "smtp.request-time", - Self::SieveRequestTime => "sieve.request-time", - Self::HttpActiveConnections => "http.active-connections", - Self::ImapActiveConnections => "imap.active-connections", - Self::Pop3ActiveConnections => "pop3.active-connections", - Self::SmtpActiveConnections => "smtp.active-connections", - Self::SieveActiveConnections => "sieve.active-connections", - Self::DeliveryActiveConnections => "delivery.active-connections", - Self::ServerMemory => "server.memory", - Self::QueueCount => "queue.count", - Self::UserCount => "user.count", - Self::DomainCount => "domain.count", - } - } - - pub fn description(&self) -> &'static str { - match self { - Self::MessageIngestionTime => "Message ingestion time", - Self::MessageFtsIndexTime => "Message full-text indexing time", - Self::DeliveryTotalTime => "Total message delivery time from submission to delivery", - Self::DeliveryTime => "Message delivery time", - Self::MessageSize => "Received message size", - Self::MessageAuthSize => "Received message size from authenticated users", - Self::ReportOutgoingSize => "Outgoing report size", - Self::StoreReadTime => "Data store read time", - Self::StoreWriteTime => "Data store write time", - Self::BlobReadTime => "Blob store read time", - Self::BlobWriteTime => "Blob store write time", - Self::DnsLookupTime => "DNS lookup time", - Self::HttpRequestTime => "HTTP request duration", - Self::ImapRequestTime => "IMAP request duration", - Self::Pop3RequestTime => "POP3 request duration", - Self::SmtpRequestTime => "SMTP request duration", - Self::SieveRequestTime => "ManageSieve request duration", - Self::HttpActiveConnections => "Active HTTP connections", - Self::ImapActiveConnections => "Active IMAP connections", - Self::Pop3ActiveConnections => "Active POP3 connections", - Self::SmtpActiveConnections => "Active SMTP connections", - Self::SieveActiveConnections => "Active ManageSieve connections", - Self::DeliveryActiveConnections => "Active delivery connections", - Self::ServerMemory => "Server memory usage", - Self::QueueCount => "Total number of messages in the queue", - Self::UserCount => "Total number of users", - Self::DomainCount => "Total number of domains", - } - } - - pub fn unit(&self) -> &'static str { - match self { - Self::MessageIngestionTime - | Self::MessageFtsIndexTime - | Self::DeliveryTotalTime - | Self::DeliveryTime - | Self::StoreReadTime - | Self::StoreWriteTime - | Self::BlobReadTime - | Self::BlobWriteTime - | Self::DnsLookupTime - | Self::HttpRequestTime - | Self::ImapRequestTime - | Self::Pop3RequestTime - | Self::SmtpRequestTime - | Self::SieveRequestTime => "milliseconds", - Self::MessageSize - | Self::MessageAuthSize - | Self::ReportOutgoingSize - | Self::ServerMemory => "bytes", - Self::HttpActiveConnections - | Self::ImapActiveConnections - | Self::Pop3ActiveConnections - | Self::SmtpActiveConnections - | Self::SieveActiveConnections - | Self::DeliveryActiveConnections => "connections", - Self::QueueCount => "messages", - Self::UserCount => "users", - Self::DomainCount => "domains", - } - } - - pub fn code(&self) -> u64 { - match self { - Self::MessageIngestionTime => 0, - Self::MessageFtsIndexTime => 1, - Self::DeliveryTotalTime => 2, - Self::DeliveryTime => 3, - Self::MessageSize => 4, - Self::MessageAuthSize => 5, - Self::ReportOutgoingSize => 6, - Self::StoreReadTime => 7, - Self::StoreWriteTime => 8, - Self::BlobReadTime => 9, - Self::BlobWriteTime => 10, - Self::DnsLookupTime => 11, - Self::HttpRequestTime => 12, - Self::ImapRequestTime => 13, - Self::Pop3RequestTime => 14, - Self::SmtpRequestTime => 15, - Self::SieveRequestTime => 16, - Self::HttpActiveConnections => 17, - Self::ImapActiveConnections => 18, - Self::Pop3ActiveConnections => 19, - Self::SmtpActiveConnections => 20, - Self::SieveActiveConnections => 21, - Self::DeliveryActiveConnections => 22, - Self::ServerMemory => 23, - Self::QueueCount => 24, - Self::UserCount => 25, - Self::DomainCount => 26, - } - } - - pub fn from_code(code: u64) -> Option { - match code { - 0 => Some(Self::MessageIngestionTime), - 1 => Some(Self::MessageFtsIndexTime), - 2 => Some(Self::DeliveryTotalTime), - 3 => Some(Self::DeliveryTime), - 4 => Some(Self::MessageSize), - 5 => Some(Self::MessageAuthSize), - 6 => Some(Self::ReportOutgoingSize), - 7 => Some(Self::StoreReadTime), - 8 => Some(Self::StoreWriteTime), - 9 => Some(Self::BlobReadTime), - 10 => Some(Self::BlobWriteTime), - 11 => Some(Self::DnsLookupTime), - 12 => Some(Self::HttpRequestTime), - 13 => Some(Self::ImapRequestTime), - 14 => Some(Self::Pop3RequestTime), - 15 => Some(Self::SmtpRequestTime), - 16 => Some(Self::SieveRequestTime), - 17 => Some(Self::HttpActiveConnections), - 18 => Some(Self::ImapActiveConnections), - 19 => Some(Self::Pop3ActiveConnections), - 20 => Some(Self::SmtpActiveConnections), - 21 => Some(Self::SieveActiveConnections), - 22 => Some(Self::DeliveryActiveConnections), - 23 => Some(Self::ServerMemory), - 24 => Some(Self::QueueCount), - 25 => Some(Self::UserCount), - 26 => Some(Self::DomainCount), - _ => None, - } - } - - pub fn try_parse(name: &str) -> Option { - match name { - "message-ingest.time" => Some(Self::MessageIngestionTime), - "message-ingest.index-time" => Some(Self::MessageFtsIndexTime), - "delivery.total-time" => Some(Self::DeliveryTotalTime), - "delivery.attempt-time" => Some(Self::DeliveryTime), - "message.size" => Some(Self::MessageSize), - "message.authenticated-size" => Some(Self::MessageAuthSize), - "outgoing-report.size" => Some(Self::ReportOutgoingSize), - "store.data-read-time" => Some(Self::StoreReadTime), - "store.data-write-time" => Some(Self::StoreWriteTime), - "store.blob-read-time" => Some(Self::BlobReadTime), - "store.blob-write-time" => Some(Self::BlobWriteTime), - "dns.lookup-time" => Some(Self::DnsLookupTime), - "http.request-time" => Some(Self::HttpRequestTime), - "imap.request-time" => Some(Self::ImapRequestTime), - "pop3.request-time" => Some(Self::Pop3RequestTime), - "smtp.request-time" => Some(Self::SmtpRequestTime), - "sieve.request-time" => Some(Self::SieveRequestTime), - "http.active-connections" => Some(Self::HttpActiveConnections), - "imap.active-connections" => Some(Self::ImapActiveConnections), - "pop3.active-connections" => Some(Self::Pop3ActiveConnections), - "smtp.active-connections" => Some(Self::SmtpActiveConnections), - "sieve.active-connections" => Some(Self::SieveActiveConnections), - "delivery.active-connections" => Some(Self::DeliveryActiveConnections), - "server.memory" => Some(Self::ServerMemory), - "queue.count" => Some(Self::QueueCount), - "user.count" => Some(Self::UserCount), - "domain.count" => Some(Self::DomainCount), - _ => None, - } - } - - pub fn variants() -> &'static [Self] { - &[ - Self::MessageIngestionTime, - Self::MessageFtsIndexTime, - Self::DeliveryTotalTime, - Self::DeliveryTime, - Self::MessageSize, - Self::MessageAuthSize, - Self::ReportOutgoingSize, - Self::StoreReadTime, - Self::StoreWriteTime, - Self::BlobReadTime, - Self::BlobWriteTime, - Self::DnsLookupTime, - Self::HttpRequestTime, - Self::ImapRequestTime, - Self::Pop3RequestTime, - Self::SmtpRequestTime, - Self::SieveRequestTime, - Self::HttpActiveConnections, - Self::ImapActiveConnections, - Self::Pop3ActiveConnections, - Self::SmtpActiveConnections, - Self::SieveActiveConnections, - Self::DeliveryActiveConnections, - Self::ServerMemory, - Self::QueueCount, - Self::UserCount, - Self::DomainCount, - ] - } -} diff --git a/crates/trc/src/event/mod.rs b/crates/trc/src/event/mod.rs index cfff2d94..7d2e292e 100644 --- a/crates/trc/src/event/mod.rs +++ b/crates/trc/src/event/mod.rs @@ -5,9 +5,11 @@ */ pub mod conv; -pub mod description; pub mod level; -pub mod metrics; + +pub mod enums; +#[allow(clippy::match_like_matches_macro)] +pub mod enums_impl; use compact_str::ToCompactString; use std::fmt::Display; @@ -298,25 +300,6 @@ impl EventType { pub fn into_err(self) -> Error { Error::new(self) } - - pub fn message(&self) -> &'static str { - match self { - EventType::Store(cause) => cause.message(), - EventType::Jmap(cause) => cause.message(), - EventType::Imap(_) => "IMAP error", - EventType::ManageSieve(_) => "ManageSieve error", - EventType::Pop3(_) => "POP3 error", - EventType::Smtp(_) => "SMTP error", - EventType::Network(_) => "Network error", - EventType::Limit(cause) => cause.message(), - EventType::Manage(cause) => cause.message(), - EventType::Auth(cause) => cause.message(), - EventType::Config(_) => "Configuration error", - EventType::Resource(cause) => cause.message(), - EventType::Security(_) => "Insufficient permissions", - _ => "Internal server error", - } - } } impl StoreEvent { @@ -339,34 +322,6 @@ impl StoreEvent { pub fn into_err(self) -> Error { Error::new(EventType::Store(self)) } - - pub fn message(&self) -> &'static str { - match self { - Self::AssertValueFailed => "Another process has modified the value", - Self::BlobMissingMarker => "Blob is missing marker", - Self::FoundationdbError => "FoundationDB error", - Self::MysqlError => "MySQL error", - Self::PostgresqlError => "PostgreSQL error", - Self::RocksdbError => "RocksDB error", - Self::SqliteError => "SQLite error", - Self::LdapError => "LDAP error", - Self::ElasticsearchError => "ElasticSearch error", - Self::RedisError => "Redis error", - Self::S3Error => "S3 error", - Self::AzureError => "Azure error", - Self::FilesystemError => "Filesystem error", - Self::PoolError => "Connection pool error", - Self::DataCorruption => "Data corruption", - Self::DecompressError => "Decompression error", - Self::DeserializeError => "Deserialization error", - Self::NotFound => "Not found", - Self::NotConfigured => "Not configured", - Self::NotSupported => "Operation not supported", - Self::UnexpectedError => "Unexpected error", - Self::CryptoError => "Crypto error", - _ => "Store error", - } - } } impl DnsEvent { @@ -459,18 +414,6 @@ impl AuthEvent { pub fn into_err(self) -> Error { Error::new(EventType::Auth(self)) } - - pub fn message(&self) -> &'static str { - match self { - Self::Failed => "Authentication failed", - Self::MissingTotp => concat!( - "A TOTP code is required to authenticate this account. ", - "Try authenticating again using 'secret$totp_token'." - ), - Self::TooManyAttempts => "Too many authentication attempts", - _ => "Authentication error", - } - } } impl ManageEvent { @@ -493,17 +436,6 @@ impl ManageEvent { pub fn into_err(self) -> Error { Error::new(EventType::Manage(self)) } - - pub fn message(&self) -> &'static str { - match self { - Self::MissingParameter => "Missing parameter", - Self::AlreadyExists => "Already exists", - Self::AssertFailed => "Assertion failed", - Self::NotFound => "Not found", - Self::NotSupported => "Operation not supported", - Self::Error => "Management API Error", - } - } } impl JmapEvent { @@ -526,30 +458,6 @@ impl JmapEvent { pub fn into_err(self) -> Error { Error::new(EventType::Jmap(self)) } - - pub fn message(&self) -> &'static str { - match self { - Self::InvalidArguments => "Invalid arguments", - Self::RequestTooLarge => "Request too large", - Self::StateMismatch => "State mismatch", - Self::AnchorNotFound => "Anchor not found", - Self::UnsupportedFilter => "Unsupported filter", - Self::UnsupportedSort => "Unsupported sort", - Self::UnknownMethod => "Unknown method", - Self::InvalidResultReference => "Invalid result reference", - Self::Forbidden => "Forbidden", - Self::AccountNotFound => "Account not found", - Self::AccountNotSupportedByMethod => "Account not supported by method", - Self::AccountReadOnly => "Account read-only", - Self::NotFound => "Not found", - Self::CannotCalculateChanges => "Cannot calculate changes", - Self::UnknownDataType => "Unknown data type", - Self::UnknownCapability => "Unknown capability", - Self::NotJson => "Not JSON", - Self::NotRequest => "Not a request", - _ => "Other message", - } - } } impl LimitEvent { @@ -572,21 +480,6 @@ impl LimitEvent { pub fn into_err(self) -> Error { Error::new(EventType::Limit(self)) } - - pub fn message(&self) -> &'static str { - match self { - Self::SizeRequest => "Request too large", - Self::SizeUpload => "Upload too large", - Self::CallsIn => "Too many calls in", - Self::ConcurrentRequest => "Too many concurrent requests", - Self::ConcurrentConnection => "Too many concurrent connections", - Self::ConcurrentUpload => "Too many concurrent uploads", - Self::Quota => "Quota exceeded", - Self::BlobQuota => "Blob quota exceeded", - Self::TooManyRequests => "Too many requests", - Self::TenantQuota => "Tenant quota exceeded", - } - } } impl ResourceEvent { @@ -609,15 +502,6 @@ impl ResourceEvent { pub fn into_err(self) -> Error { Error::new(EventType::Resource(self)) } - - pub fn message(&self) -> &'static str { - match self { - Self::NotFound => "Not found", - Self::BadParameters => "Bad parameters", - Self::Error => "Resource error", - _ => "Other status", - } - } } impl SmtpEvent { @@ -810,7 +694,7 @@ impl Eq for Value {} impl From for usize { fn from(value: EventType) -> Self { - value.id() + value.to_id() as usize } } diff --git a/crates/trc/src/ipc/channel.rs b/crates/trc/src/ipc/channel.rs index fb3d3182..9e85a8b8 100644 --- a/crates/trc/src/ipc/channel.rs +++ b/crates/trc/src/ipc/channel.rs @@ -109,7 +109,7 @@ impl Event { } pub fn send_with_metrics(self) { - Collector::record_metric(self.inner, self.inner.id(), &self.keys); + Collector::record_metric(self.inner, self.inner.to_id() as usize, &self.keys); self.send(); } } diff --git a/crates/trc/src/ipc/collector.rs b/crates/trc/src/ipc/collector.rs index 4c1763bb..b1eb8a73 100644 --- a/crates/trc/src/ipc/collector.rs +++ b/crates/trc/src/ipc/collector.rs @@ -28,7 +28,7 @@ pub(crate) type CollectorThread = JoinHandle<()>; pub(crate) static ACTIVE_SUBSCRIBERS: Mutex> = Mutex::new(Vec::new()); pub(crate) static COLLECTOR_UPDATES: Mutex> = Mutex::new(Vec::new()); -pub(crate) const EVENT_TYPES: [EventType; TOTAL_EVENT_COUNT] = EventType::variants(); +pub(crate) static EVENT_TYPES: &[EventType] = EventType::variants(); #[allow(clippy::enum_variant_names)] pub(crate) enum Update { @@ -59,19 +59,20 @@ pub struct Collector { active_spans: AHashMap>>, } -const HTTP_CONN_START: usize = EventType::Http(HttpEvent::ConnectionStart).id(); -const HTTP_CONN_END: usize = EventType::Http(HttpEvent::ConnectionEnd).id(); -const IMAP_CONN_START: usize = EventType::Imap(ImapEvent::ConnectionStart).id(); -const IMAP_CONN_END: usize = EventType::Imap(ImapEvent::ConnectionEnd).id(); -const POP3_CONN_START: usize = EventType::Pop3(Pop3Event::ConnectionStart).id(); -const POP3_CONN_END: usize = EventType::Pop3(Pop3Event::ConnectionEnd).id(); -const SMTP_CONN_START: usize = EventType::Smtp(SmtpEvent::ConnectionStart).id(); -const SMTP_CONN_END: usize = EventType::Smtp(SmtpEvent::ConnectionEnd).id(); +const HTTP_CONN_START: usize = EventType::Http(HttpEvent::ConnectionStart).to_id() as usize; +const HTTP_CONN_END: usize = EventType::Http(HttpEvent::ConnectionEnd).to_id() as usize; +const IMAP_CONN_START: usize = EventType::Imap(ImapEvent::ConnectionStart).to_id() as usize; +const IMAP_CONN_END: usize = EventType::Imap(ImapEvent::ConnectionEnd).to_id() as usize; +const POP3_CONN_START: usize = EventType::Pop3(Pop3Event::ConnectionStart).to_id() as usize; +const POP3_CONN_END: usize = EventType::Pop3(Pop3Event::ConnectionEnd).to_id() as usize; +const SMTP_CONN_START: usize = EventType::Smtp(SmtpEvent::ConnectionStart).to_id() as usize; +const SMTP_CONN_END: usize = EventType::Smtp(SmtpEvent::ConnectionEnd).to_id() as usize; const MANAGE_SIEVE_CONN_START: usize = - EventType::ManageSieve(ManageSieveEvent::ConnectionStart).id(); -const MANAGE_SIEVE_CONN_END: usize = EventType::ManageSieve(ManageSieveEvent::ConnectionEnd).id(); -const EV_ATTEMPT_START: usize = EventType::Delivery(DeliveryEvent::AttemptStart).id(); -const EV_ATTEMPT_END: usize = EventType::Delivery(DeliveryEvent::AttemptEnd).id(); + EventType::ManageSieve(ManageSieveEvent::ConnectionStart).to_id() as usize; +const MANAGE_SIEVE_CONN_END: usize = + EventType::ManageSieve(ManageSieveEvent::ConnectionEnd).to_id() as usize; +const EV_ATTEMPT_START: usize = EventType::Delivery(DeliveryEvent::AttemptStart).to_id() as usize; +const EV_ATTEMPT_END: usize = EventType::Delivery(DeliveryEvent::AttemptEnd).to_id() as usize; const STALE_SPAN_CHECK_WATERMARK: usize = 8000; const SPAN_MAX_HOLD: u64 = 60 * 60 * 24; // 1 day @@ -116,7 +117,7 @@ impl Collector { match rx.try_recv() { Ok(Some(event)) => { // Build event - let event_id = event.inner.id(); + let event_id = event.inner.to_id() as usize; let mut event = Event { inner: EventDetails { level: self.levels[event_id], @@ -262,7 +263,7 @@ impl Collector { } Update::UpdateLevels { levels } => { for event in EVENT_TYPES.iter() { - let event_id = event.id(); + let event_id = event.to_id() as usize; if let Some(level) = levels.get(event) { self.levels[event_id] = *level; } else { @@ -347,7 +348,7 @@ impl Default for Collector { }; for event in EVENT_TYPES.iter() { - let event_id = event.id(); + let event_id = event.to_id() as usize; c.levels[event_id] = event.level(); } diff --git a/crates/trc/src/ipc/metrics.rs b/crates/trc/src/ipc/metrics.rs index bf3d9cb0..3c64d4ac 100644 --- a/crates/trc/src/ipc/metrics.rs +++ b/crates/trc/src/ipc/metrics.rs @@ -20,27 +20,27 @@ static EVENT_COUNTERS: AtomicU32Array = AtomicU32Array::new() static CONNECTION_METRICS: [ConnectionMetrics; TOTAL_CONN_TYPES] = init_conn_metrics(); static MESSAGE_INGESTION_TIME: AtomicHistogram<12> = - AtomicHistogram::<10>::new_short_durations(MetricType::MessageIngestionTime); + AtomicHistogram::<10>::new_short_durations(MetricType::MessageIngestTime); static MESSAGE_INDEX_TIME: AtomicHistogram<12> = - AtomicHistogram::<10>::new_short_durations(MetricType::MessageFtsIndexTime); + AtomicHistogram::<10>::new_short_durations(MetricType::MessageIngestIndexTime); static MESSAGE_DELIVERY_TIME: AtomicHistogram<12> = AtomicHistogram::<18>::new_long_durations(MetricType::DeliveryTotalTime); static MESSAGE_INCOMING_SIZE: AtomicHistogram<12> = AtomicHistogram::<12>::new_message_sizes(MetricType::MessageSize); static MESSAGE_SUBMISSION_SIZE: AtomicHistogram<12> = - AtomicHistogram::<12>::new_message_sizes(MetricType::MessageAuthSize); + AtomicHistogram::<12>::new_message_sizes(MetricType::MessageAuthenticatedSize); static MESSAGE_OUT_REPORT_SIZE: AtomicHistogram<12> = - AtomicHistogram::<12>::new_message_sizes(MetricType::ReportOutgoingSize); + AtomicHistogram::<12>::new_message_sizes(MetricType::OutgoingReportSize); static STORE_DATA_READ_TIME: AtomicHistogram<12> = - AtomicHistogram::<10>::new_short_durations(MetricType::StoreReadTime); + AtomicHistogram::<10>::new_short_durations(MetricType::StoreDataReadTime); static STORE_DATA_WRITE_TIME: AtomicHistogram<12> = - AtomicHistogram::<10>::new_short_durations(MetricType::StoreWriteTime); + AtomicHistogram::<10>::new_short_durations(MetricType::StoreDataWriteTime); static STORE_BLOB_READ_TIME: AtomicHistogram<12> = - AtomicHistogram::<10>::new_short_durations(MetricType::BlobReadTime); + AtomicHistogram::<10>::new_short_durations(MetricType::StoreBlobReadTime); static STORE_BLOB_WRITE_TIME: AtomicHistogram<12> = - AtomicHistogram::<10>::new_short_durations(MetricType::BlobWriteTime); + AtomicHistogram::<10>::new_short_durations(MetricType::StoreBlobWriteTime); static DNS_LOOKUP_TIME: AtomicHistogram<12> = AtomicHistogram::<10>::new_short_durations(MetricType::DnsLookupTime); @@ -270,28 +270,28 @@ impl Collector { } #[inline(always)] - pub fn read_event_metric(metric_id: usize) -> u32 { + pub fn read_metric_counter(metric_id: usize) -> u32 { EVENT_COUNTERS.get(metric_id) } pub fn read_metric(metric_type: MetricType) -> f64 { match metric_type { MetricType::ServerMemory => SERVER_MEMORY.get() as f64, - MetricType::MessageIngestionTime => MESSAGE_INGESTION_TIME.average(), - MetricType::MessageFtsIndexTime => MESSAGE_INDEX_TIME.average(), + MetricType::MessageIngestTime => MESSAGE_INGESTION_TIME.average(), + MetricType::MessageIngestIndexTime => MESSAGE_INDEX_TIME.average(), MetricType::MessageSize => MESSAGE_INCOMING_SIZE.average(), - MetricType::MessageAuthSize => MESSAGE_SUBMISSION_SIZE.average(), + MetricType::MessageAuthenticatedSize => MESSAGE_SUBMISSION_SIZE.average(), MetricType::DeliveryTotalTime => MESSAGE_DELIVERY_TIME.average(), - MetricType::DeliveryTime => CONNECTION_METRICS[CONN_SMTP_OUT].elapsed.average(), + MetricType::DeliveryAttemptTime => CONNECTION_METRICS[CONN_SMTP_OUT].elapsed.average(), MetricType::DeliveryActiveConnections => { CONNECTION_METRICS[CONN_SMTP_OUT].active_connections.get() as f64 } MetricType::QueueCount => QUEUE_COUNT.get() as f64, - MetricType::ReportOutgoingSize => MESSAGE_OUT_REPORT_SIZE.average(), - MetricType::StoreReadTime => STORE_DATA_READ_TIME.average(), - MetricType::StoreWriteTime => STORE_DATA_WRITE_TIME.average(), - MetricType::BlobReadTime => STORE_BLOB_READ_TIME.average(), - MetricType::BlobWriteTime => STORE_BLOB_WRITE_TIME.average(), + MetricType::OutgoingReportSize => MESSAGE_OUT_REPORT_SIZE.average(), + MetricType::StoreDataReadTime => STORE_DATA_READ_TIME.average(), + MetricType::StoreDataWriteTime => STORE_DATA_WRITE_TIME.average(), + MetricType::StoreBlobReadTime => STORE_BLOB_READ_TIME.average(), + MetricType::StoreBlobWriteTime => STORE_BLOB_WRITE_TIME.average(), MetricType::DnsLookupTime => DNS_LOOKUP_TIME.average(), MetricType::HttpActiveConnections => { CONNECTION_METRICS[CONN_HTTP].active_connections.get() as f64 @@ -315,6 +315,7 @@ impl Collector { MetricType::SieveRequestTime => CONNECTION_METRICS[CONN_SIEVE].elapsed.average(), MetricType::UserCount => USER_COUNT.get() as f64, MetricType::DomainCount => DOMAIN_COUNT.get() as f64, + _ => EVENT_COUNTERS.get(metric_type.event_id()) as f64, } } @@ -334,10 +335,12 @@ impl Collector { pub fn update_histogram(metric_type: MetricType, value: u64) { match metric_type { - MetricType::MessageIngestionTime => MESSAGE_INGESTION_TIME.observe(value), - MetricType::MessageFtsIndexTime => MESSAGE_INDEX_TIME.observe(value), + MetricType::MessageIngestTime => MESSAGE_INGESTION_TIME.observe(value), + MetricType::MessageIngestIndexTime => MESSAGE_INDEX_TIME.observe(value), MetricType::DeliveryTotalTime => MESSAGE_DELIVERY_TIME.observe(value), - MetricType::DeliveryTime => CONNECTION_METRICS[CONN_SMTP_OUT].elapsed.observe(value), + MetricType::DeliveryAttemptTime => { + CONNECTION_METRICS[CONN_SMTP_OUT].elapsed.observe(value) + } MetricType::DnsLookupTime => DNS_LOOKUP_TIME.observe(value), _ => {} } @@ -358,8 +361,8 @@ impl ConnectionMetrics { #[allow(clippy::new_without_default)] pub const fn new() -> Self { Self { - active_connections: AtomicGauge::new(MetricType::BlobReadTime), - elapsed: AtomicHistogram::<18>::new_medium_durations(MetricType::BlobReadTime), + active_connections: AtomicGauge::new(MetricType::StoreBlobReadTime), + elapsed: AtomicHistogram::<18>::new_medium_durations(MetricType::StoreBlobReadTime), } } } @@ -388,14 +391,14 @@ const fn init_conn_metrics() -> [ConnectionMetrics; TOTAL_CONN_TYPES] { MetricType::SmtpActiveConnections, ], CONN_SMTP_OUT => &[ - MetricType::DeliveryTime, + MetricType::DeliveryAttemptTime, MetricType::DeliveryActiveConnections, ], CONN_SIEVE => &[ MetricType::SieveRequestTime, MetricType::SieveActiveConnections, ], - _ => &[MetricType::BlobReadTime, MetricType::BlobReadTime], + _ => &[MetricType::StoreBlobReadTime, MetricType::StoreBlobReadTime], }; array[i] = ConnectionMetrics { @@ -406,281 +409,3 @@ const fn init_conn_metrics() -> [ConnectionMetrics; TOTAL_CONN_TYPES] { } array } - -impl EventType { - pub fn is_metric(&self) -> bool { - match self { - EventType::Server(ServerEvent::ThreadError) => true, - EventType::Purge(PurgeEvent::Error) => true, - EventType::Eval( - EvalEvent::Error | EvalEvent::StoreNotFound | EvalEvent::DirectoryNotFound, - ) => true, - EventType::Acme( - AcmeEvent::TlsAlpnError - | AcmeEvent::OrderCompleted - | AcmeEvent::AuthError - | AcmeEvent::AuthTooManyAttempts - | AcmeEvent::ClientMissingSni - | AcmeEvent::TokenNotFound - | AcmeEvent::OrderInvalid - | AcmeEvent::Error, - ) => true, - EventType::Dns( - DnsEvent::RecordCreationFailed - | DnsEvent::RecordDeletionFailed - | DnsEvent::RecordPropagationTimeout - | DnsEvent::RecordLookupFailed, - ) => true, - EventType::Store( - StoreEvent::AssertValueFailed - | StoreEvent::FoundationdbError - | StoreEvent::MysqlError - | StoreEvent::PostgresqlError - | StoreEvent::RocksdbError - | StoreEvent::SqliteError - | StoreEvent::LdapError - | StoreEvent::ElasticsearchError - | StoreEvent::RedisError - | StoreEvent::S3Error - | StoreEvent::AzureError - | StoreEvent::FilesystemError - | StoreEvent::PoolError - | StoreEvent::DataCorruption - | StoreEvent::DecompressError - | StoreEvent::DeserializeError - | StoreEvent::NotFound - | StoreEvent::NotConfigured - | StoreEvent::NotSupported - | StoreEvent::UnexpectedError - | StoreEvent::CryptoError - | StoreEvent::BlobMissingMarker - | StoreEvent::DataWrite - | StoreEvent::DataIterate - | StoreEvent::BlobRead - | StoreEvent::BlobWrite - | StoreEvent::BlobDelete - | StoreEvent::HttpStoreError, - ) => true, - EventType::MessageIngest(_) => true, - EventType::Jmap( - JmapEvent::MethodCall - | JmapEvent::WebsocketStart - | JmapEvent::WebsocketError - | JmapEvent::UnsupportedFilter - | JmapEvent::UnsupportedSort - | JmapEvent::Forbidden - | JmapEvent::NotJson - | JmapEvent::NotRequest - | JmapEvent::InvalidArguments - | JmapEvent::RequestTooLarge - | JmapEvent::UnknownMethod, - ) => true, - EventType::Imap(ImapEvent::ConnectionStart | ImapEvent::ConnectionEnd) => true, - EventType::ManageSieve( - ManageSieveEvent::ConnectionStart | ManageSieveEvent::ConnectionEnd, - ) => true, - EventType::Pop3(Pop3Event::ConnectionStart | Pop3Event::ConnectionEnd) => true, - EventType::Smtp( - SmtpEvent::ConnectionStart - | SmtpEvent::ConnectionEnd - | SmtpEvent::Error - | SmtpEvent::ConcurrencyLimitExceeded - | SmtpEvent::TransferLimitExceeded - | SmtpEvent::RateLimitExceeded - | SmtpEvent::TimeLimitExceeded - | SmtpEvent::MessageParseFailed - | SmtpEvent::MessageTooLarge - | SmtpEvent::LoopDetected - | SmtpEvent::DkimPass - | SmtpEvent::DkimFail - | SmtpEvent::ArcPass - | SmtpEvent::ArcFail - | SmtpEvent::SpfEhloPass - | SmtpEvent::SpfEhloFail - | SmtpEvent::SpfFromPass - | SmtpEvent::SpfFromFail - | SmtpEvent::DmarcPass - | SmtpEvent::DmarcFail - | SmtpEvent::IprevPass - | SmtpEvent::IprevFail - | SmtpEvent::TooManyMessages - | SmtpEvent::InvalidEhlo - | SmtpEvent::DidNotSayEhlo - | SmtpEvent::MailFromUnauthenticated - | SmtpEvent::MailFromUnauthorized - | SmtpEvent::MailFromMissing - | SmtpEvent::MultipleMailFrom - | SmtpEvent::MailboxDoesNotExist - | SmtpEvent::RelayNotAllowed - | SmtpEvent::RcptToDuplicate - | SmtpEvent::RcptToMissing - | SmtpEvent::TooManyRecipients - | SmtpEvent::TooManyInvalidRcpt - | SmtpEvent::AuthMechanismNotSupported - | SmtpEvent::AuthExchangeTooLong - | SmtpEvent::CommandNotImplemented - | SmtpEvent::InvalidCommand - | SmtpEvent::SyntaxError - | SmtpEvent::RequestTooLarge, - ) => true, - EventType::Http( - HttpEvent::Error - | HttpEvent::RequestBody - | HttpEvent::ResponseBody - | HttpEvent::XForwardedMissing, - ) => true, - EventType::Network(NetworkEvent::Timeout) => true, - EventType::Security(_) => true, - EventType::Limit(_) => true, - EventType::Manage(_) => false, - EventType::Auth( - AuthEvent::Success - | AuthEvent::Failed - | AuthEvent::TooManyAttempts - | AuthEvent::Error, - ) => true, - EventType::Config(_) => false, - EventType::Resource( - ResourceEvent::NotFound | ResourceEvent::BadParameters | ResourceEvent::Error, - ) => true, - EventType::Arc( - ArcEvent::ChainTooLong - | ArcEvent::InvalidInstance - | ArcEvent::InvalidCv - | ArcEvent::HasHeaderTag - | ArcEvent::BrokenChain, - ) => true, - EventType::Dkim(_) => true, - EventType::Dmarc(_) => true, - EventType::Iprev(_) => true, - EventType::Dane( - DaneEvent::AuthenticationSuccess - | DaneEvent::AuthenticationFailure - | DaneEvent::NoCertificatesFound - | DaneEvent::CertificateParseError - | DaneEvent::TlsaRecordFetchError - | DaneEvent::TlsaRecordNotFound - | DaneEvent::TlsaRecordNotDnssecSigned - | DaneEvent::TlsaRecordInvalid, - ) => true, - EventType::Spf(_) => true, - EventType::MailAuth(_) => true, - EventType::Tls(TlsEvent::HandshakeError) => true, - EventType::Sieve( - SieveEvent::ActionAccept - | SieveEvent::ActionAcceptReplace - | SieveEvent::ActionDiscard - | SieveEvent::ActionReject - | SieveEvent::SendMessage - | SieveEvent::MessageTooLarge - | SieveEvent::RuntimeError - | SieveEvent::UnexpectedError - | SieveEvent::NotSupported - | SieveEvent::QuotaExceeded, - ) => true, - EventType::Spam( - SpamEvent::PyzorError - | SpamEvent::TrainCompleted - | SpamEvent::TrainSampleAdded - | SpamEvent::Classify - | SpamEvent::ModelNotReady - | SpamEvent::DnsblError, - ) => true, - EventType::PushSubscription(_) => true, - EventType::Cluster( - ClusterEvent::SubscriberError - | ClusterEvent::PublisherError - | ClusterEvent::SubscriberDisconnected, - ) => true, - EventType::Housekeeper(_) => false, - EventType::TaskQueue( - TaskQueueEvent::BlobNotFound | TaskQueueEvent::MetadataNotFound, - ) => true, - EventType::Milter( - MilterEvent::ActionAccept - | MilterEvent::ActionDiscard - | MilterEvent::ActionReject - | MilterEvent::ActionTempFail - | MilterEvent::ActionReplyCode - | MilterEvent::ActionConnectionFailure - | MilterEvent::ActionShutdown, - ) => true, - EventType::MtaHook(_) => true, - EventType::Delivery( - DeliveryEvent::AttemptStart - | DeliveryEvent::Completed - | DeliveryEvent::AttemptEnd - | DeliveryEvent::MxLookupFailed - | DeliveryEvent::IpLookupFailed - | DeliveryEvent::NullMx - | DeliveryEvent::GreetingFailed - | DeliveryEvent::EhloRejected - | DeliveryEvent::AuthFailed - | DeliveryEvent::MailFromRejected - | DeliveryEvent::Delivered - | DeliveryEvent::RcptToRejected - | DeliveryEvent::RcptToFailed - | DeliveryEvent::MessageRejected - | DeliveryEvent::StartTlsUnavailable - | DeliveryEvent::StartTlsError - | DeliveryEvent::StartTlsDisabled - | DeliveryEvent::ImplicitTlsError - | DeliveryEvent::ConcurrencyLimitExceeded - | DeliveryEvent::RateLimitExceeded - | DeliveryEvent::DoubleBounce - | DeliveryEvent::DsnSuccess - | DeliveryEvent::DsnTempFail - | DeliveryEvent::DsnPermFail, - ) => true, - EventType::Queue( - QueueEvent::QueueMessage - | QueueEvent::QueueMessageAuthenticated - | QueueEvent::QueueReport - | QueueEvent::QueueDsn - | QueueEvent::QueueAutogenerated - | QueueEvent::Rescheduled - | QueueEvent::BlobNotFound - | QueueEvent::RateLimitExceeded - | QueueEvent::ConcurrencyLimitExceeded - | QueueEvent::QuotaExceeded, - ) => true, - EventType::TlsRpt(_) => false, - EventType::MtaSts( - MtaStsEvent::Authorized | MtaStsEvent::NotAuthorized | MtaStsEvent::InvalidPolicy, - ) => true, - EventType::IncomingReport(_) => true, - EventType::OutgoingReport( - OutgoingReportEvent::SpfReport - | OutgoingReportEvent::SpfRateLimited - | OutgoingReportEvent::DkimReport - | OutgoingReportEvent::DkimRateLimited - | OutgoingReportEvent::DmarcReport - | OutgoingReportEvent::DmarcRateLimited - | OutgoingReportEvent::DmarcAggregateReport - | OutgoingReportEvent::TlsAggregate - | OutgoingReportEvent::HttpSubmission - | OutgoingReportEvent::UnauthorizedReportingAddress - | OutgoingReportEvent::ReportingAddressValidationError - | OutgoingReportEvent::NotFound - | OutgoingReportEvent::SubmissionError - | OutgoingReportEvent::NoRecipientsFound, - ) => true, - EventType::Telemetry( - TelemetryEvent::LogError - | TelemetryEvent::WebhookError - | TelemetryEvent::OtelExporterError - | TelemetryEvent::OtelMetricsExporterError - | TelemetryEvent::PrometheusExporterError - | TelemetryEvent::JournalError, - ) => true, - EventType::Calendar( - CalendarEvent::AlarmSent - | CalendarEvent::AlarmFailed - | CalendarEvent::ItipMessageReceived - | CalendarEvent::ItipMessageSent - | CalendarEvent::ItipMessageError, - ) => true, - _ => false, - } - } -} diff --git a/crates/trc/src/ipc/subscriber.rs b/crates/trc/src/ipc/subscriber.rs index 2fc2be55..7a9c588f 100644 --- a/crates/trc/src/ipc/subscriber.rs +++ b/crates/trc/src/ipc/subscriber.rs @@ -82,7 +82,7 @@ impl SubscriberBuilder { pub fn with_default_interests(mut self, level: Level) -> Self { for event in EventType::variants() { if event.level() >= level { - self.interests.set(event); + self.interests.set(*event); } } self diff --git a/crates/trc/src/lib.rs b/crates/trc/src/lib.rs index 43a2cc0f..3627e89c 100644 --- a/crates/trc/src/lib.rs +++ b/crates/trc/src/lib.rs @@ -10,17 +10,16 @@ pub mod ipc; pub mod macros; pub mod serializers; +pub use crate::event::enums::*; +pub use crate::ipc::collector::Collector; +use compact_str::CompactString; +pub use event_macro::event; +use event_macro::key_names; use std::{ net::{IpAddr, Ipv4Addr, Ipv6Addr}, sync::Arc, }; -pub use crate::ipc::collector::Collector; -use compact_str::CompactString; -pub use event_macro::event; - -use event_macro::{event_family, event_type, key_names, total_event_count}; - pub type Result = std::result::Result; #[derive(Debug, Clone)] @@ -142,906 +141,22 @@ pub enum Key { QueueName, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -#[event_family] -pub enum EventType { - Server(ServerEvent), - Purge(PurgeEvent), - Eval(EvalEvent), - Acme(AcmeEvent), - Store(StoreEvent), - MessageIngest(MessageIngestEvent), - Jmap(JmapEvent), - Imap(ImapEvent), - ManageSieve(ManageSieveEvent), - Pop3(Pop3Event), - Smtp(SmtpEvent), - Http(HttpEvent), - Network(NetworkEvent), - Limit(LimitEvent), - Manage(ManageEvent), - Auth(AuthEvent), - Config(ConfigEvent), - Resource(ResourceEvent), - Arc(ArcEvent), - Dkim(DkimEvent), - Dmarc(DmarcEvent), - Iprev(IprevEvent), - Dane(DaneEvent), - Spf(SpfEvent), - MailAuth(MailAuthEvent), - Tls(TlsEvent), - Sieve(SieveEvent), - Spam(SpamEvent), - PushSubscription(PushSubscriptionEvent), - Cluster(ClusterEvent), - Housekeeper(HousekeeperEvent), - TaskQueue(TaskQueueEvent), - Milter(MilterEvent), - MtaHook(MtaHookEvent), - Delivery(DeliveryEvent), - Queue(QueueEvent), - TlsRpt(TlsRptEvent), - MtaSts(MtaStsEvent), - IncomingReport(IncomingReportEvent), - OutgoingReport(OutgoingReportEvent), - Telemetry(TelemetryEvent), - Security(SecurityEvent), - Ai(AiEvent), - WebDav(WebDavEvent), - Calendar(CalendarEvent), - Dns(DnsEvent), -} - -#[event_type] -pub enum HttpEvent { - ConnectionStart, - ConnectionEnd, - Error, - RequestUrl, - RequestBody, - ResponseBody, - XForwardedMissing, -} - -#[event_type] -pub enum SecurityEvent { - AuthenticationBan, - AbuseBan, - ScanBan, - LoiterBan, - IpBlocked, - Unauthorized, -} - -#[event_type] -pub enum ClusterEvent { - SubscriberStart, - SubscriberStop, - SubscriberError, - SubscriberDisconnected, - PublisherStart, - PublisherStop, - PublisherError, - MessageReceived, - MessageSkipped, - MessageInvalid, -} - -#[event_type] -pub enum HousekeeperEvent { - Start, - Stop, - Schedule, - Run, -} - -#[event_type] -pub enum TaskQueueEvent { - TaskAcquired, - TaskLocked, - TaskIgnored, - TaskFailed, - BlobNotFound, - MetadataNotFound, -} - -#[event_type] -pub enum ImapEvent { - ConnectionStart, - ConnectionEnd, - - // Commands - GetAcl, - SetAcl, - MyRights, - ListRights, - Append, - Capabilities, - Id, - Close, - Copy, - Move, - CreateMailbox, - DeleteMailbox, - RenameMailbox, - Enable, - Expunge, - Fetch, - IdleStart, - IdleStop, - List, - Lsub, - Logout, - Namespace, - Noop, - Search, - Sort, - Select, - Status, - Store, - Subscribe, - Unsubscribe, - Thread, - GetQuota, - - // Errors - Error, - - // Debugging - RawInput, - RawOutput, -} - -#[event_type] -pub enum Pop3Event { - ConnectionStart, - ConnectionEnd, - - // Commands - Delete, - Reset, - Quit, - Fetch, - List, - ListMessage, - Uidl, - UidlMessage, - Stat, - Noop, - Capabilities, - StartTls, - Utf8, - - // Errors - Error, - - // Debugging - RawInput, - RawOutput, -} - -#[event_type] -pub enum ManageSieveEvent { - ConnectionStart, - ConnectionEnd, - - // Commands - CreateScript, - UpdateScript, - GetScript, - DeleteScript, - RenameScript, - CheckScript, - HaveSpace, - ListScripts, - SetActive, - Capabilities, - StartTls, - Unauthenticate, - Logout, - Noop, - - // Errors - Error, - - // Debugging - RawInput, - RawOutput, -} - -#[event_type] -pub enum SmtpEvent { - ConnectionStart, - ConnectionEnd, - Error, - IdNotFound, - ConcurrencyLimitExceeded, - TransferLimitExceeded, - RateLimitExceeded, - TimeLimitExceeded, - MissingAuthDirectory, - MessageParseFailed, - MessageTooLarge, - LoopDetected, - DkimPass, - DkimFail, - ArcPass, - ArcFail, - SpfEhloPass, - SpfEhloFail, - SpfFromPass, - SpfFromFail, - DmarcPass, - DmarcFail, - IprevPass, - IprevFail, - TooManyMessages, - Ehlo, - InvalidEhlo, - DidNotSayEhlo, - EhloExpected, - LhloExpected, - MailFromUnauthenticated, - MailFromUnauthorized, - MailFromNotAllowed, - MailFromRewritten, - MailFromMissing, - MailFrom, - MultipleMailFrom, - MailboxDoesNotExist, - RelayNotAllowed, - RcptTo, - RcptToDuplicate, - RcptToRewritten, - RcptToMissing, - RcptToGreylisted, - TooManyRecipients, - TooManyInvalidRcpt, - RawInput, - RawOutput, - MissingLocalHostname, - Vrfy, - VrfyNotFound, - VrfyDisabled, - Expn, - ExpnNotFound, - ExpnDisabled, - RequireTlsDisabled, - DeliverByDisabled, - DeliverByInvalid, - FutureReleaseDisabled, - FutureReleaseInvalid, - MtPriorityDisabled, - MtPriorityInvalid, - DsnDisabled, - AuthNotAllowed, - AuthMechanismNotSupported, - AuthExchangeTooLong, - AlreadyAuthenticated, - Noop, - StartTls, - StartTlsUnavailable, - StartTlsAlready, - Rset, - Quit, - Help, - CommandNotImplemented, - InvalidCommand, - InvalidSenderAddress, - InvalidRecipientAddress, - InvalidParameter, - UnsupportedParameter, - SyntaxError, - RequestTooLarge, -} - -#[event_type] -pub enum DeliveryEvent { - AttemptStart, - AttemptEnd, - Completed, - Failed, - DomainDeliveryStart, - MxLookup, - MxLookupFailed, - IpLookup, - IpLookupFailed, - NullMx, - Connect, - ConnectError, - MissingOutboundHostname, - GreetingFailed, - Ehlo, - EhloRejected, - Auth, - AuthFailed, - MailFrom, - MailFromRejected, - Delivered, - RcptTo, - RcptToRejected, - RcptToFailed, - MessageRejected, - StartTls, - StartTlsUnavailable, - StartTlsError, - StartTlsDisabled, - ImplicitTlsError, - ConcurrencyLimitExceeded, - RateLimitExceeded, - DoubleBounce, - DsnSuccess, - DsnTempFail, - DsnPermFail, - RawInput, - RawOutput, -} - -#[event_type] -pub enum QueueEvent { - QueueMessage, - QueueMessageAuthenticated, - QueueReport, - QueueDsn, - QueueAutogenerated, - Rescheduled, - Locked, - BlobNotFound, - RateLimitExceeded, - ConcurrencyLimitExceeded, - QuotaExceeded, - BackPressure, -} - -#[event_type] -pub enum IncomingReportEvent { - DmarcReport, - DmarcReportWithWarnings, - TlsReport, - TlsReportWithWarnings, - AbuseReport, - AuthFailureReport, - FraudReport, - NotSpamReport, - VirusReport, - OtherReport, - MessageParseFailed, - DmarcParseFailed, - TlsRpcParseFailed, - ArfParseFailed, - DecompressError, -} - -#[event_type] -pub enum OutgoingReportEvent { - SpfReport, - SpfRateLimited, - DkimReport, - DkimRateLimited, - DmarcReport, - DmarcRateLimited, - DmarcAggregateReport, - TlsAggregate, - HttpSubmission, - UnauthorizedReportingAddress, - ReportingAddressValidationError, - NotFound, - SubmissionError, - NoRecipientsFound, - Locked, -} - -#[event_type] -pub enum MtaStsEvent { - Authorized, - NotAuthorized, - PolicyFetch, - PolicyNotFound, - PolicyFetchError, - InvalidPolicy, -} - -#[event_type] -pub enum TlsRptEvent { - RecordFetch, - RecordFetchError, - RecordNotFound, -} - -#[event_type] -pub enum DaneEvent { - AuthenticationSuccess, - AuthenticationFailure, - NoCertificatesFound, - CertificateParseError, - TlsaRecordMatch, - TlsaRecordFetch, - TlsaRecordFetchError, - TlsaRecordNotFound, - TlsaRecordNotDnssecSigned, - TlsaRecordInvalid, -} - -#[event_type] -pub enum MilterEvent { - Read, - Write, - ActionAccept, - ActionDiscard, - ActionReject, - ActionTempFail, - ActionReplyCode, - ActionConnectionFailure, - ActionShutdown, - IoError, - FrameTooLarge, - FrameInvalid, - UnexpectedResponse, - Timeout, - TlsInvalidName, - Disconnected, - ParseError, -} - -#[event_type] -pub enum MtaHookEvent { - ActionAccept, - ActionDiscard, - ActionReject, - ActionQuarantine, - Error, -} - -#[event_type] -pub enum PushSubscriptionEvent { - Success, - Error, - NotFound, -} - -#[event_type] -pub enum SpamEvent { - Pyzor, - PyzorError, - Dnsbl, - DnsblError, - TrainStarted, - TrainCompleted, - TrainSampleAdded, - TrainSampleNotFound, - Classify, - ModelLoaded, - ModelNotReady, - ModelNotFound, -} - -#[event_type] -pub enum SieveEvent { - ActionAccept, - ActionAcceptReplace, - ActionDiscard, - ActionReject, - SendMessage, - MessageTooLarge, - ScriptNotFound, - ListNotFound, - RuntimeError, - UnexpectedError, - NotSupported, - QuotaExceeded, -} - -#[event_type] -pub enum TlsEvent { - Handshake, - HandshakeError, - NotConfigured, - CertificateNotFound, - NoCertificatesAvailable, - MultipleCertificatesAvailable, -} - -#[event_type] -pub enum NetworkEvent { - ListenStart, - ListenStop, - ListenError, - BindError, - ReadError, - WriteError, - FlushError, - AcceptError, - SplitError, - Timeout, - Closed, - ProxyError, - SetOptError, -} - -#[event_type] -pub enum ServerEvent { - Startup, - Shutdown, - StartupError, - ThreadError, - Licensing, -} - -#[event_type] -pub enum TelemetryEvent { - Alert, - LogError, - WebhookError, - OtelExporterError, - OtelMetricsExporterError, - PrometheusExporterError, - JournalError, -} - -#[event_type] -pub enum AcmeEvent { - AuthStart, - AuthPending, - AuthValid, - AuthCompleted, - AuthError, - AuthTooManyAttempts, - ProcessCert, - OrderStart, - OrderProcessing, - OrderCompleted, - OrderReady, - OrderValid, - OrderInvalid, - RenewBackoff, - ClientSuppliedSni, - ClientMissingSni, - TlsAlpnReceived, - TlsAlpnError, - TokenNotFound, - Error, -} - -#[event_type] -pub enum DnsEvent { - RecordCreated, - RecordCreationFailed, - RecordDeletionFailed, - RecordNotPropagated, - RecordLookupFailed, - RecordPropagated, - RecordPropagationTimeout, - BuildError, -} - -#[event_type] -pub enum PurgeEvent { - Started, - Finished, - Running, - Error, - InProgress, - AutoExpunge, - BlobCleanup, -} - -#[event_type] -pub enum EvalEvent { - Result, - Error, - DirectoryNotFound, - StoreNotFound, -} - -#[event_type] -pub enum ConfigEvent { - ParseError, - BuildError, - MacroError, - WriteError, - FetchError, - DefaultApplied, - MissingSetting, - UnusedSetting, - ParseWarning, - BuildWarning, - ImportExternal, - AlreadyUpToDate, -} - -#[event_type] -pub enum ArcEvent { - ChainTooLong, - InvalidInstance, - InvalidCv, - HasHeaderTag, - BrokenChain, - SealerNotFound, -} - -#[event_type] -pub enum DkimEvent { - Pass, - Neutral, - Fail, - PermError, - TempError, - None, - UnsupportedVersion, - UnsupportedAlgorithm, - UnsupportedCanonicalization, - UnsupportedKeyType, - FailedBodyHashMatch, - FailedVerification, - FailedAuidMatch, - RevokedPublicKey, - IncompatibleAlgorithms, - SignatureExpired, - SignatureLength, - SignerNotFound, - BuildError, -} - -#[event_type] -pub enum SpfEvent { - Pass, - Fail, - SoftFail, - Neutral, - TempError, - PermError, - None, -} - -#[event_type] -pub enum DmarcEvent { - Pass, - Fail, - PermError, - TempError, - None, -} - -#[event_type] -pub enum IprevEvent { - Pass, - Fail, - PermError, - TempError, - None, -} - -#[event_type] -pub enum MailAuthEvent { - ParseError, - MissingParameters, - NoHeadersFound, - Crypto, - Io, - Base64, - DnsError, - DnsRecordNotFound, - DnsInvalidRecordType, - PolicyNotAligned, -} - -#[event_type] -pub enum StoreEvent { - // Errors - AssertValueFailed, - FoundationdbError, - MysqlError, - PostgresqlError, - RocksdbError, - SqliteError, - LdapError, - ElasticsearchError, - MeilisearchError, - RedisError, - S3Error, - AzureError, - FilesystemError, - PoolError, - DataCorruption, - DecompressError, - DeserializeError, - NotFound, - NotConfigured, - NotSupported, - UnexpectedError, - CryptoError, - HttpStoreError, - - // Caching - CacheMiss, - CacheHit, - CacheStale, - CacheUpdate, - - // Warnings - BlobMissingMarker, - - // Traces - DataWrite, - DataIterate, - BlobRead, - BlobWrite, - BlobDelete, - SqlQuery, - LdapQuery, - LdapWarning, - HttpStoreFetch, -} - -#[event_type] -pub enum MessageIngestEvent { - // Events - Ham, - Spam, - ImapAppend, - JmapAppend, - Duplicate, - Error, - FtsIndex, -} - -#[event_type] -pub enum JmapEvent { - // Calls - MethodCall, - - // Method errors - InvalidArguments, - RequestTooLarge, - StateMismatch, - AnchorNotFound, - UnsupportedFilter, - UnsupportedSort, - UnknownMethod, - InvalidResultReference, - Forbidden, - AccountNotFound, - AccountNotSupportedByMethod, - AccountReadOnly, - NotFound, - CannotCalculateChanges, - UnknownDataType, - - // Request errors - UnknownCapability, - NotJson, - NotRequest, - - // Not JMAP standard - WebsocketStart, - WebsocketStop, - WebsocketError, -} - -#[event_type] -pub enum LimitEvent { - SizeRequest, - SizeUpload, - CallsIn, - ConcurrentRequest, - ConcurrentUpload, - ConcurrentConnection, // Used by listener - Quota, - BlobQuota, - TenantQuota, - TooManyRequests, -} - -#[event_type] -pub enum ManageEvent { - MissingParameter, - AlreadyExists, - AssertFailed, - NotFound, - NotSupported, - Error, -} - -#[event_type] -pub enum AuthEvent { - Success, - Failed, - TokenExpired, - MissingTotp, - TooManyAttempts, - ClientRegistration, - Error, -} - -#[event_type] -pub enum ResourceEvent { - NotFound, - BadParameters, - Error, - DownloadExternal, - WebadminUnpacked, -} - -#[event_type] -pub enum AiEvent { - LlmResponse, - ApiError, -} - -#[event_type] -pub enum WebDavEvent { - // Requests - Propfind, - Proppatch, - Get, - Head, - Report, - Mkcol, - Mkcalendar, - Delete, - Put, - Post, - Patch, - Copy, - Move, - Lock, - Unlock, - Acl, - Options, - - // Errors - Error, -} - -#[event_type] -pub enum CalendarEvent { - RuleExpansionError, - AlarmSent, - AlarmSkipped, - AlarmRecipientOverride, - AlarmFailed, - ItipMessageSent, - ItipMessageReceived, - ItipMessageError, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum MetricType { - ServerMemory, - MessageIngestionTime, - MessageFtsIndexTime, - MessageSize, - MessageAuthSize, - DeliveryTotalTime, - DeliveryTime, - DeliveryActiveConnections, - QueueCount, - ReportOutgoingSize, - StoreReadTime, - StoreWriteTime, - BlobReadTime, - BlobWriteTime, - DnsLookupTime, - HttpActiveConnections, - HttpRequestTime, - ImapActiveConnections, - ImapRequestTime, - Pop3ActiveConnections, - Pop3RequestTime, - SmtpActiveConnections, - SmtpRequestTime, - SieveActiveConnections, - SieveRequestTime, - UserCount, - DomainCount, -} - -pub const TOTAL_EVENT_COUNT: usize = total_event_count!(); - pub trait AddContext { fn caused_by(self, location: &'static str) -> Result; fn add_context(self, f: F) -> Result where F: FnOnce(Error) -> Error; } + +#[allow(clippy::derivable_impls)] +impl Default for MetricType { + fn default() -> Self { + MetricType::UserCount + } +} + +impl Default for EventType { + fn default() -> Self { + EventType::Store(StoreEvent::UnexpectedError) + } +} diff --git a/crates/trc/src/macros.rs b/crates/trc/src/macros.rs index da8bb5af..ecf99cc1 100644 --- a/crates/trc/src/macros.rs +++ b/crates/trc/src/macros.rs @@ -20,7 +20,7 @@ macro_rules! bail { macro_rules! error { ($err:expr $(,)?) => { let err = $err; - let event_id = err.as_ref().id(); + let event_id = err.as_ref().to_id() as usize; if $crate::Collector::is_metric(event_id) { $crate::Collector::record_metric(*err.as_ref(), event_id, err.keys()); diff --git a/crates/trc/src/serializers/binary.rs b/crates/trc/src/serializers/binary.rs index e4b0ddab..7a25bc50 100644 --- a/crates/trc/src/serializers/binary.rs +++ b/crates/trc/src/serializers/binary.rs @@ -85,7 +85,7 @@ pub fn deserialize_single_event(bytes: &[u8]) -> crate::Result { pub fn serialize(&self, buf: &mut Vec) { - leb128_write(buf, self.inner.typ.code()); + leb128_write(buf, self.inner.typ.to_id() as u64); buf.extend_from_slice(self.inner.timestamp.to_le_bytes().as_ref()); leb128_write(buf, self.keys.len() as u64); for (k, v) in &self.keys { @@ -94,7 +94,7 @@ impl Event { } } pub fn deserialize<'x>(iter: &mut impl Iterator) -> Option { - let typ = EventType::from_code(leb128_read(iter)?)?; + let typ = EventType::from_id(leb128_read(iter)? as u16)?; let timestamp = u64::from_le_bytes([ *iter.next()?, *iter.next()?, @@ -173,7 +173,7 @@ impl Value { } Value::Event(v) => { buf.push(11u8); - leb128_write(buf, v.0.inner.code()); + leb128_write(buf, v.0.inner.to_id() as u64); leb128_write(buf, v.0.keys.len() as u64); for (k, v) in &v.0.keys { leb128_write(buf, k.code()); @@ -249,7 +249,7 @@ impl Value { Some(Value::Ipv6(Ipv6Addr::from(buf))) } 11 => { - let code = EventType::from_code(leb128_read(iter)?)?; + let code = EventType::from_id(leb128_read(iter)? as u16)?; let keys_len = leb128_read(iter)?; let mut keys = Vec::with_capacity(keys_len as usize); for _ in 0..keys_len { @@ -304,1245 +304,6 @@ fn leb128_read<'x>(iter: &mut impl Iterator) -> Option { None } -impl EventType { - pub fn code(&self) -> u64 { - match self { - EventType::Acme(AcmeEvent::AuthCompleted) => 0, - EventType::Acme(AcmeEvent::AuthError) => 1, - EventType::Acme(AcmeEvent::AuthPending) => 2, - EventType::Acme(AcmeEvent::AuthStart) => 3, - EventType::Acme(AcmeEvent::AuthTooManyAttempts) => 4, - EventType::Acme(AcmeEvent::AuthValid) => 5, - EventType::Acme(AcmeEvent::ClientMissingSni) => 6, - EventType::Acme(AcmeEvent::ClientSuppliedSni) => 7, - EventType::Dns(DnsEvent::RecordCreated) => 8, - EventType::Dns(DnsEvent::RecordCreationFailed) => 9, - EventType::Dns(DnsEvent::RecordDeletionFailed) => 10, - EventType::Dns(DnsEvent::RecordLookupFailed) => 11, - EventType::Dns(DnsEvent::RecordNotPropagated) => 12, - EventType::Dns(DnsEvent::RecordPropagated) => 13, - EventType::Dns(DnsEvent::RecordPropagationTimeout) => 14, - EventType::Acme(AcmeEvent::Error) => 15, - EventType::Acme(AcmeEvent::OrderCompleted) => 16, - EventType::Acme(AcmeEvent::OrderInvalid) => 17, - EventType::Acme(AcmeEvent::OrderProcessing) => 18, - EventType::Acme(AcmeEvent::OrderReady) => 19, - EventType::Acme(AcmeEvent::OrderStart) => 20, - EventType::Acme(AcmeEvent::OrderValid) => 21, - EventType::Acme(AcmeEvent::ProcessCert) => 22, - EventType::Acme(AcmeEvent::RenewBackoff) => 23, - EventType::Acme(AcmeEvent::TlsAlpnError) => 24, - EventType::Acme(AcmeEvent::TlsAlpnReceived) => 25, - EventType::Acme(AcmeEvent::TokenNotFound) => 26, - EventType::Arc(ArcEvent::BrokenChain) => 27, - EventType::Arc(ArcEvent::ChainTooLong) => 28, - EventType::Arc(ArcEvent::HasHeaderTag) => 29, - EventType::Arc(ArcEvent::InvalidCv) => 30, - EventType::Arc(ArcEvent::InvalidInstance) => 31, - EventType::Arc(ArcEvent::SealerNotFound) => 32, - EventType::Security(SecurityEvent::AuthenticationBan) => 33, - EventType::Auth(AuthEvent::Error) => 34, - EventType::Auth(AuthEvent::Failed) => 35, - EventType::Auth(AuthEvent::MissingTotp) => 36, - EventType::Auth(AuthEvent::Success) => 37, - EventType::Auth(AuthEvent::TooManyAttempts) => 38, - EventType::Cluster(ClusterEvent::SubscriberStart) => 39, - EventType::Cluster(ClusterEvent::SubscriberStop) => 40, - EventType::Cluster(ClusterEvent::SubscriberError) => 41, - EventType::Cluster(ClusterEvent::SubscriberDisconnected) => 42, - EventType::Cluster(ClusterEvent::PublisherStart) => 43, - EventType::Cluster(ClusterEvent::PublisherStop) => 44, - EventType::Cluster(ClusterEvent::PublisherError) => 45, - EventType::Cluster(ClusterEvent::MessageReceived) => 46, - EventType::Cluster(ClusterEvent::MessageSkipped) => 47, - EventType::Cluster(ClusterEvent::MessageInvalid) => 49, - EventType::Config(ConfigEvent::AlreadyUpToDate) => 53, - EventType::Config(ConfigEvent::BuildError) => 54, - EventType::Config(ConfigEvent::BuildWarning) => 55, - EventType::Config(ConfigEvent::DefaultApplied) => 56, - EventType::Config(ConfigEvent::FetchError) => 58, - EventType::Config(ConfigEvent::ImportExternal) => 59, - EventType::Config(ConfigEvent::MacroError) => 60, - EventType::Config(ConfigEvent::MissingSetting) => 61, - EventType::Config(ConfigEvent::ParseError) => 62, - EventType::Config(ConfigEvent::ParseWarning) => 63, - EventType::Config(ConfigEvent::UnusedSetting) => 64, - EventType::Config(ConfigEvent::WriteError) => 65, - EventType::Dane(DaneEvent::AuthenticationFailure) => 66, - EventType::Dane(DaneEvent::AuthenticationSuccess) => 67, - EventType::Dane(DaneEvent::CertificateParseError) => 68, - EventType::Dane(DaneEvent::NoCertificatesFound) => 69, - EventType::Dane(DaneEvent::TlsaRecordFetch) => 70, - EventType::Dane(DaneEvent::TlsaRecordFetchError) => 71, - EventType::Dane(DaneEvent::TlsaRecordInvalid) => 72, - EventType::Dane(DaneEvent::TlsaRecordMatch) => 73, - EventType::Dane(DaneEvent::TlsaRecordNotDnssecSigned) => 74, - EventType::Dane(DaneEvent::TlsaRecordNotFound) => 75, - EventType::Delivery(DeliveryEvent::AttemptEnd) => 76, - EventType::Delivery(DeliveryEvent::AttemptStart) => 77, - EventType::Delivery(DeliveryEvent::Auth) => 78, - EventType::Delivery(DeliveryEvent::AuthFailed) => 79, - EventType::Delivery(DeliveryEvent::Completed) => 80, - EventType::Delivery(DeliveryEvent::ConcurrencyLimitExceeded) => 81, - EventType::Delivery(DeliveryEvent::Connect) => 82, - EventType::Delivery(DeliveryEvent::ConnectError) => 83, - EventType::Delivery(DeliveryEvent::Delivered) => 84, - EventType::Delivery(DeliveryEvent::DomainDeliveryStart) => 85, - EventType::Delivery(DeliveryEvent::DoubleBounce) => 86, - EventType::Delivery(DeliveryEvent::DsnPermFail) => 87, - EventType::Delivery(DeliveryEvent::DsnSuccess) => 88, - EventType::Delivery(DeliveryEvent::DsnTempFail) => 89, - EventType::Delivery(DeliveryEvent::Ehlo) => 90, - EventType::Delivery(DeliveryEvent::EhloRejected) => 91, - EventType::Delivery(DeliveryEvent::Failed) => 92, - EventType::Delivery(DeliveryEvent::GreetingFailed) => 93, - EventType::Delivery(DeliveryEvent::ImplicitTlsError) => 94, - EventType::Delivery(DeliveryEvent::IpLookup) => 95, - EventType::Delivery(DeliveryEvent::IpLookupFailed) => 96, - EventType::Delivery(DeliveryEvent::MailFrom) => 97, - EventType::Delivery(DeliveryEvent::MailFromRejected) => 98, - EventType::Delivery(DeliveryEvent::MessageRejected) => 99, - EventType::Delivery(DeliveryEvent::MissingOutboundHostname) => 100, - EventType::Delivery(DeliveryEvent::MxLookup) => 101, - EventType::Delivery(DeliveryEvent::MxLookupFailed) => 102, - EventType::Delivery(DeliveryEvent::NullMx) => 103, - EventType::Delivery(DeliveryEvent::RateLimitExceeded) => 104, - EventType::Delivery(DeliveryEvent::RawInput) => 105, - EventType::Delivery(DeliveryEvent::RawOutput) => 106, - EventType::Delivery(DeliveryEvent::RcptTo) => 107, - EventType::Delivery(DeliveryEvent::RcptToFailed) => 108, - EventType::Delivery(DeliveryEvent::RcptToRejected) => 109, - EventType::Delivery(DeliveryEvent::StartTls) => 110, - EventType::Delivery(DeliveryEvent::StartTlsDisabled) => 111, - EventType::Delivery(DeliveryEvent::StartTlsError) => 112, - EventType::Delivery(DeliveryEvent::StartTlsUnavailable) => 113, - EventType::Dkim(DkimEvent::Fail) => 114, - EventType::Dkim(DkimEvent::FailedAuidMatch) => 115, - EventType::Dkim(DkimEvent::FailedBodyHashMatch) => 116, - EventType::Dkim(DkimEvent::FailedVerification) => 117, - EventType::Dkim(DkimEvent::IncompatibleAlgorithms) => 118, - EventType::Dkim(DkimEvent::Neutral) => 119, - EventType::Dkim(DkimEvent::None) => 120, - EventType::Dkim(DkimEvent::Pass) => 121, - EventType::Dkim(DkimEvent::PermError) => 122, - EventType::Dkim(DkimEvent::RevokedPublicKey) => 123, - EventType::Dkim(DkimEvent::SignatureExpired) => 124, - EventType::Dkim(DkimEvent::SignatureLength) => 125, - EventType::Dkim(DkimEvent::SignerNotFound) => 126, - EventType::Dkim(DkimEvent::TempError) => 127, - EventType::Dkim(DkimEvent::UnsupportedAlgorithm) => 128, - EventType::Dkim(DkimEvent::UnsupportedCanonicalization) => 129, - EventType::Dkim(DkimEvent::UnsupportedKeyType) => 130, - EventType::Dkim(DkimEvent::UnsupportedVersion) => 131, - EventType::Dmarc(DmarcEvent::Fail) => 132, - EventType::Dmarc(DmarcEvent::None) => 133, - EventType::Dmarc(DmarcEvent::Pass) => 134, - EventType::Dmarc(DmarcEvent::PermError) => 135, - EventType::Dmarc(DmarcEvent::TempError) => 136, - EventType::Eval(EvalEvent::DirectoryNotFound) => 137, - EventType::Eval(EvalEvent::Error) => 138, - EventType::Eval(EvalEvent::Result) => 139, - EventType::Eval(EvalEvent::StoreNotFound) => 140, - EventType::TaskQueue(TaskQueueEvent::BlobNotFound) => 141, - EventType::MessageIngest(MessageIngestEvent::FtsIndex) => 142, - EventType::Spam(SpamEvent::TrainSampleAdded) => 143, - EventType::TaskQueue(TaskQueueEvent::TaskLocked) => 144, - EventType::TaskQueue(TaskQueueEvent::MetadataNotFound) => 145, - EventType::Housekeeper(HousekeeperEvent::Run) => 146, - EventType::Housekeeper(HousekeeperEvent::Schedule) => 149, - EventType::Housekeeper(HousekeeperEvent::Start) => 150, - EventType::Housekeeper(HousekeeperEvent::Stop) => 151, - EventType::Http(HttpEvent::ConnectionEnd) => 152, - EventType::Http(HttpEvent::ConnectionStart) => 153, - EventType::Http(HttpEvent::Error) => 154, - EventType::Http(HttpEvent::RequestBody) => 155, - EventType::Http(HttpEvent::RequestUrl) => 156, - EventType::Http(HttpEvent::ResponseBody) => 157, - EventType::Http(HttpEvent::XForwardedMissing) => 158, - EventType::Imap(ImapEvent::Append) => 159, - EventType::Imap(ImapEvent::Capabilities) => 160, - EventType::Imap(ImapEvent::Close) => 161, - EventType::Imap(ImapEvent::ConnectionEnd) => 162, - EventType::Imap(ImapEvent::ConnectionStart) => 163, - EventType::Imap(ImapEvent::Copy) => 164, - EventType::Imap(ImapEvent::CreateMailbox) => 165, - EventType::Imap(ImapEvent::DeleteMailbox) => 166, - EventType::Imap(ImapEvent::Enable) => 167, - EventType::Imap(ImapEvent::Error) => 168, - EventType::Imap(ImapEvent::Expunge) => 169, - EventType::Imap(ImapEvent::Fetch) => 170, - EventType::Imap(ImapEvent::GetAcl) => 171, - EventType::Imap(ImapEvent::Id) => 172, - EventType::Imap(ImapEvent::IdleStart) => 173, - EventType::Imap(ImapEvent::IdleStop) => 174, - EventType::Imap(ImapEvent::List) => 175, - EventType::Imap(ImapEvent::ListRights) => 176, - EventType::Imap(ImapEvent::Logout) => 177, - EventType::Imap(ImapEvent::Lsub) => 178, - EventType::Imap(ImapEvent::Move) => 179, - EventType::Imap(ImapEvent::MyRights) => 180, - EventType::Imap(ImapEvent::Namespace) => 181, - EventType::Imap(ImapEvent::Noop) => 182, - EventType::Imap(ImapEvent::RawInput) => 183, - EventType::Imap(ImapEvent::RawOutput) => 184, - EventType::Imap(ImapEvent::RenameMailbox) => 185, - EventType::Imap(ImapEvent::Search) => 186, - EventType::Imap(ImapEvent::Select) => 187, - EventType::Imap(ImapEvent::SetAcl) => 188, - EventType::Imap(ImapEvent::Sort) => 189, - EventType::Imap(ImapEvent::Status) => 190, - EventType::Imap(ImapEvent::Store) => 191, - EventType::Imap(ImapEvent::Subscribe) => 192, - EventType::Imap(ImapEvent::Thread) => 193, - EventType::Imap(ImapEvent::Unsubscribe) => 194, - EventType::IncomingReport(IncomingReportEvent::AbuseReport) => 195, - EventType::IncomingReport(IncomingReportEvent::ArfParseFailed) => 196, - EventType::IncomingReport(IncomingReportEvent::AuthFailureReport) => 197, - EventType::IncomingReport(IncomingReportEvent::DecompressError) => 198, - EventType::IncomingReport(IncomingReportEvent::DmarcParseFailed) => 199, - EventType::IncomingReport(IncomingReportEvent::DmarcReport) => 200, - EventType::IncomingReport(IncomingReportEvent::DmarcReportWithWarnings) => 201, - EventType::IncomingReport(IncomingReportEvent::FraudReport) => 202, - EventType::IncomingReport(IncomingReportEvent::MessageParseFailed) => 203, - EventType::IncomingReport(IncomingReportEvent::NotSpamReport) => 204, - EventType::IncomingReport(IncomingReportEvent::OtherReport) => 205, - EventType::IncomingReport(IncomingReportEvent::TlsReport) => 206, - EventType::IncomingReport(IncomingReportEvent::TlsReportWithWarnings) => 207, - EventType::IncomingReport(IncomingReportEvent::TlsRpcParseFailed) => 208, - EventType::IncomingReport(IncomingReportEvent::VirusReport) => 209, - EventType::Iprev(IprevEvent::Fail) => 210, - EventType::Iprev(IprevEvent::None) => 211, - EventType::Iprev(IprevEvent::Pass) => 212, - EventType::Iprev(IprevEvent::PermError) => 213, - EventType::Iprev(IprevEvent::TempError) => 214, - EventType::Jmap(JmapEvent::AccountNotFound) => 215, - EventType::Jmap(JmapEvent::AccountNotSupportedByMethod) => 216, - EventType::Jmap(JmapEvent::AccountReadOnly) => 217, - EventType::Jmap(JmapEvent::AnchorNotFound) => 218, - EventType::Jmap(JmapEvent::CannotCalculateChanges) => 219, - EventType::Jmap(JmapEvent::Forbidden) => 220, - EventType::Jmap(JmapEvent::InvalidArguments) => 221, - EventType::Jmap(JmapEvent::InvalidResultReference) => 222, - EventType::Jmap(JmapEvent::MethodCall) => 223, - EventType::Jmap(JmapEvent::NotFound) => 224, - EventType::Jmap(JmapEvent::NotJson) => 225, - EventType::Jmap(JmapEvent::NotRequest) => 226, - EventType::Jmap(JmapEvent::RequestTooLarge) => 227, - EventType::Jmap(JmapEvent::StateMismatch) => 228, - EventType::Jmap(JmapEvent::UnknownCapability) => 229, - EventType::Jmap(JmapEvent::UnknownDataType) => 230, - EventType::Jmap(JmapEvent::UnknownMethod) => 231, - EventType::Jmap(JmapEvent::UnsupportedFilter) => 232, - EventType::Jmap(JmapEvent::UnsupportedSort) => 233, - EventType::Jmap(JmapEvent::WebsocketError) => 234, - EventType::Jmap(JmapEvent::WebsocketStart) => 235, - EventType::Jmap(JmapEvent::WebsocketStop) => 236, - EventType::Limit(LimitEvent::BlobQuota) => 237, - EventType::Limit(LimitEvent::CallsIn) => 238, - EventType::Limit(LimitEvent::ConcurrentConnection) => 239, - EventType::Limit(LimitEvent::ConcurrentRequest) => 240, - EventType::Limit(LimitEvent::ConcurrentUpload) => 241, - EventType::Limit(LimitEvent::Quota) => 242, - EventType::Limit(LimitEvent::SizeRequest) => 243, - EventType::Limit(LimitEvent::SizeUpload) => 244, - EventType::Limit(LimitEvent::TooManyRequests) => 245, - EventType::MailAuth(MailAuthEvent::Base64) => 246, - EventType::MailAuth(MailAuthEvent::Crypto) => 247, - EventType::MailAuth(MailAuthEvent::DnsError) => 248, - EventType::MailAuth(MailAuthEvent::DnsInvalidRecordType) => 249, - EventType::MailAuth(MailAuthEvent::DnsRecordNotFound) => 250, - EventType::MailAuth(MailAuthEvent::Io) => 251, - EventType::MailAuth(MailAuthEvent::MissingParameters) => 252, - EventType::MailAuth(MailAuthEvent::NoHeadersFound) => 253, - EventType::MailAuth(MailAuthEvent::ParseError) => 254, - EventType::MailAuth(MailAuthEvent::PolicyNotAligned) => 255, - EventType::ManageSieve(ManageSieveEvent::Capabilities) => 256, - EventType::ManageSieve(ManageSieveEvent::CheckScript) => 257, - EventType::ManageSieve(ManageSieveEvent::ConnectionEnd) => 258, - EventType::ManageSieve(ManageSieveEvent::ConnectionStart) => 259, - EventType::ManageSieve(ManageSieveEvent::CreateScript) => 260, - EventType::ManageSieve(ManageSieveEvent::DeleteScript) => 261, - EventType::ManageSieve(ManageSieveEvent::Error) => 262, - EventType::ManageSieve(ManageSieveEvent::GetScript) => 263, - EventType::ManageSieve(ManageSieveEvent::HaveSpace) => 264, - EventType::ManageSieve(ManageSieveEvent::ListScripts) => 265, - EventType::ManageSieve(ManageSieveEvent::Logout) => 266, - EventType::ManageSieve(ManageSieveEvent::Noop) => 267, - EventType::ManageSieve(ManageSieveEvent::RawInput) => 268, - EventType::ManageSieve(ManageSieveEvent::RawOutput) => 269, - EventType::ManageSieve(ManageSieveEvent::RenameScript) => 270, - EventType::ManageSieve(ManageSieveEvent::SetActive) => 271, - EventType::ManageSieve(ManageSieveEvent::StartTls) => 272, - EventType::ManageSieve(ManageSieveEvent::Unauthenticate) => 273, - EventType::ManageSieve(ManageSieveEvent::UpdateScript) => 274, - EventType::Manage(ManageEvent::AlreadyExists) => 275, - EventType::Manage(ManageEvent::AssertFailed) => 276, - EventType::Manage(ManageEvent::Error) => 277, - EventType::Manage(ManageEvent::MissingParameter) => 278, - EventType::Manage(ManageEvent::NotFound) => 279, - EventType::Manage(ManageEvent::NotSupported) => 280, - EventType::MessageIngest(MessageIngestEvent::Duplicate) => 281, - EventType::MessageIngest(MessageIngestEvent::Error) => 282, - EventType::MessageIngest(MessageIngestEvent::Ham) => 283, - EventType::MessageIngest(MessageIngestEvent::ImapAppend) => 284, - EventType::MessageIngest(MessageIngestEvent::JmapAppend) => 285, - EventType::MessageIngest(MessageIngestEvent::Spam) => 286, - EventType::Milter(MilterEvent::ActionAccept) => 287, - EventType::Milter(MilterEvent::ActionConnectionFailure) => 288, - EventType::Milter(MilterEvent::ActionDiscard) => 289, - EventType::Milter(MilterEvent::ActionReject) => 290, - EventType::Milter(MilterEvent::ActionReplyCode) => 291, - EventType::Milter(MilterEvent::ActionShutdown) => 292, - EventType::Milter(MilterEvent::ActionTempFail) => 293, - EventType::Milter(MilterEvent::Disconnected) => 294, - EventType::Milter(MilterEvent::FrameInvalid) => 295, - EventType::Milter(MilterEvent::FrameTooLarge) => 296, - EventType::Milter(MilterEvent::IoError) => 297, - EventType::Milter(MilterEvent::ParseError) => 298, - EventType::Milter(MilterEvent::Read) => 299, - EventType::Milter(MilterEvent::Timeout) => 300, - EventType::Milter(MilterEvent::TlsInvalidName) => 301, - EventType::Milter(MilterEvent::UnexpectedResponse) => 302, - EventType::Milter(MilterEvent::Write) => 303, - EventType::MtaHook(MtaHookEvent::ActionAccept) => 304, - EventType::MtaHook(MtaHookEvent::ActionDiscard) => 305, - EventType::MtaHook(MtaHookEvent::ActionQuarantine) => 306, - EventType::MtaHook(MtaHookEvent::ActionReject) => 307, - EventType::MtaHook(MtaHookEvent::Error) => 308, - EventType::MtaSts(MtaStsEvent::Authorized) => 309, - EventType::MtaSts(MtaStsEvent::InvalidPolicy) => 310, - EventType::MtaSts(MtaStsEvent::NotAuthorized) => 311, - EventType::MtaSts(MtaStsEvent::PolicyFetch) => 312, - EventType::MtaSts(MtaStsEvent::PolicyFetchError) => 313, - EventType::MtaSts(MtaStsEvent::PolicyNotFound) => 314, - EventType::Network(NetworkEvent::AcceptError) => 315, - EventType::Network(NetworkEvent::BindError) => 316, - EventType::Network(NetworkEvent::Closed) => 317, - EventType::Security(SecurityEvent::IpBlocked) => 318, - EventType::Network(NetworkEvent::FlushError) => 319, - EventType::Network(NetworkEvent::ListenError) => 320, - EventType::Network(NetworkEvent::ListenStart) => 321, - EventType::Network(NetworkEvent::ListenStop) => 322, - EventType::Network(NetworkEvent::ProxyError) => 323, - EventType::Network(NetworkEvent::ReadError) => 324, - EventType::Network(NetworkEvent::SetOptError) => 325, - EventType::Network(NetworkEvent::SplitError) => 326, - EventType::Network(NetworkEvent::Timeout) => 327, - EventType::Network(NetworkEvent::WriteError) => 328, - EventType::OutgoingReport(OutgoingReportEvent::DkimRateLimited) => 329, - EventType::OutgoingReport(OutgoingReportEvent::DkimReport) => 330, - EventType::OutgoingReport(OutgoingReportEvent::DmarcAggregateReport) => 331, - EventType::OutgoingReport(OutgoingReportEvent::DmarcRateLimited) => 332, - EventType::OutgoingReport(OutgoingReportEvent::DmarcReport) => 333, - EventType::OutgoingReport(OutgoingReportEvent::HttpSubmission) => 334, - EventType::OutgoingReport(OutgoingReportEvent::Locked) => 337, - EventType::OutgoingReport(OutgoingReportEvent::NoRecipientsFound) => 338, - EventType::OutgoingReport(OutgoingReportEvent::NotFound) => 339, - EventType::OutgoingReport(OutgoingReportEvent::ReportingAddressValidationError) => 340, - EventType::OutgoingReport(OutgoingReportEvent::SpfRateLimited) => 341, - EventType::OutgoingReport(OutgoingReportEvent::SpfReport) => 342, - EventType::OutgoingReport(OutgoingReportEvent::SubmissionError) => 343, - EventType::OutgoingReport(OutgoingReportEvent::TlsAggregate) => 344, - EventType::OutgoingReport(OutgoingReportEvent::UnauthorizedReportingAddress) => 345, - EventType::Pop3(Pop3Event::Capabilities) => 346, - EventType::Pop3(Pop3Event::ConnectionEnd) => 347, - EventType::Pop3(Pop3Event::ConnectionStart) => 348, - EventType::Pop3(Pop3Event::Delete) => 349, - EventType::Pop3(Pop3Event::Error) => 350, - EventType::Pop3(Pop3Event::Fetch) => 351, - EventType::Pop3(Pop3Event::List) => 352, - EventType::Pop3(Pop3Event::ListMessage) => 353, - EventType::Pop3(Pop3Event::Noop) => 354, - EventType::Pop3(Pop3Event::Quit) => 355, - EventType::Pop3(Pop3Event::RawInput) => 356, - EventType::Pop3(Pop3Event::RawOutput) => 357, - EventType::Pop3(Pop3Event::Reset) => 358, - EventType::Pop3(Pop3Event::StartTls) => 359, - EventType::Pop3(Pop3Event::Stat) => 360, - EventType::Pop3(Pop3Event::Uidl) => 361, - EventType::Pop3(Pop3Event::UidlMessage) => 362, - EventType::Pop3(Pop3Event::Utf8) => 363, - EventType::Purge(PurgeEvent::AutoExpunge) => 364, - EventType::Purge(PurgeEvent::Error) => 365, - EventType::Purge(PurgeEvent::Finished) => 366, - EventType::Purge(PurgeEvent::InProgress) => 367, - EventType::Purge(PurgeEvent::Running) => 368, - EventType::Purge(PurgeEvent::Started) => 369, - EventType::Purge(PurgeEvent::BlobCleanup) => 370, - EventType::PushSubscription(PushSubscriptionEvent::Error) => 371, - EventType::PushSubscription(PushSubscriptionEvent::NotFound) => 372, - EventType::PushSubscription(PushSubscriptionEvent::Success) => 373, - EventType::Queue(QueueEvent::BlobNotFound) => 374, - EventType::Queue(QueueEvent::ConcurrencyLimitExceeded) => 375, - EventType::Queue(QueueEvent::Locked) => 377, - EventType::Queue(QueueEvent::QueueAutogenerated) => 378, - EventType::Queue(QueueEvent::QueueDsn) => 379, - EventType::Queue(QueueEvent::QueueMessage) => 380, - EventType::Queue(QueueEvent::QueueMessageAuthenticated) => 381, - EventType::Queue(QueueEvent::QueueReport) => 382, - EventType::Queue(QueueEvent::QuotaExceeded) => 383, - EventType::Queue(QueueEvent::RateLimitExceeded) => 384, - EventType::Queue(QueueEvent::Rescheduled) => 385, - EventType::Resource(ResourceEvent::BadParameters) => 386, - EventType::Resource(ResourceEvent::DownloadExternal) => 387, - EventType::Resource(ResourceEvent::Error) => 388, - EventType::Resource(ResourceEvent::NotFound) => 389, - EventType::Resource(ResourceEvent::WebadminUnpacked) => 390, - EventType::Server(ServerEvent::Licensing) => 391, - EventType::Server(ServerEvent::Shutdown) => 392, - EventType::Server(ServerEvent::Startup) => 393, - EventType::Server(ServerEvent::StartupError) => 394, - EventType::Server(ServerEvent::ThreadError) => 395, - EventType::Sieve(SieveEvent::ActionAccept) => 396, - EventType::Sieve(SieveEvent::ActionAcceptReplace) => 397, - EventType::Sieve(SieveEvent::ActionDiscard) => 398, - EventType::Sieve(SieveEvent::ActionReject) => 399, - EventType::Sieve(SieveEvent::ListNotFound) => 400, - EventType::Sieve(SieveEvent::MessageTooLarge) => 401, - EventType::Sieve(SieveEvent::NotSupported) => 402, - EventType::Sieve(SieveEvent::QuotaExceeded) => 403, - EventType::Sieve(SieveEvent::RuntimeError) => 404, - EventType::Sieve(SieveEvent::ScriptNotFound) => 405, - EventType::Sieve(SieveEvent::SendMessage) => 406, - EventType::Sieve(SieveEvent::UnexpectedError) => 407, - EventType::Smtp(SmtpEvent::AlreadyAuthenticated) => 408, - EventType::Smtp(SmtpEvent::ArcFail) => 409, - EventType::Smtp(SmtpEvent::ArcPass) => 410, - EventType::Smtp(SmtpEvent::AuthExchangeTooLong) => 411, - EventType::Smtp(SmtpEvent::AuthMechanismNotSupported) => 412, - EventType::Smtp(SmtpEvent::AuthNotAllowed) => 413, - EventType::Smtp(SmtpEvent::CommandNotImplemented) => 414, - EventType::Smtp(SmtpEvent::ConcurrencyLimitExceeded) => 415, - EventType::Smtp(SmtpEvent::ConnectionEnd) => 416, - EventType::Smtp(SmtpEvent::ConnectionStart) => 417, - EventType::Smtp(SmtpEvent::DeliverByDisabled) => 418, - EventType::Smtp(SmtpEvent::DeliverByInvalid) => 419, - EventType::Smtp(SmtpEvent::DidNotSayEhlo) => 420, - EventType::Smtp(SmtpEvent::DkimFail) => 421, - EventType::Smtp(SmtpEvent::DkimPass) => 422, - EventType::Smtp(SmtpEvent::DmarcFail) => 423, - EventType::Smtp(SmtpEvent::DmarcPass) => 424, - EventType::Smtp(SmtpEvent::DsnDisabled) => 425, - EventType::Smtp(SmtpEvent::Ehlo) => 426, - EventType::Smtp(SmtpEvent::EhloExpected) => 427, - EventType::Smtp(SmtpEvent::Error) => 428, - EventType::Smtp(SmtpEvent::Expn) => 429, - EventType::Smtp(SmtpEvent::ExpnDisabled) => 430, - EventType::Smtp(SmtpEvent::ExpnNotFound) => 431, - EventType::Smtp(SmtpEvent::FutureReleaseDisabled) => 432, - EventType::Smtp(SmtpEvent::FutureReleaseInvalid) => 433, - EventType::Smtp(SmtpEvent::Help) => 434, - EventType::Smtp(SmtpEvent::InvalidCommand) => 435, - EventType::Smtp(SmtpEvent::InvalidEhlo) => 436, - EventType::Smtp(SmtpEvent::InvalidParameter) => 437, - EventType::Smtp(SmtpEvent::InvalidRecipientAddress) => 438, - EventType::Smtp(SmtpEvent::InvalidSenderAddress) => 439, - EventType::Smtp(SmtpEvent::IprevFail) => 440, - EventType::Smtp(SmtpEvent::IprevPass) => 441, - EventType::Smtp(SmtpEvent::LhloExpected) => 442, - EventType::Smtp(SmtpEvent::LoopDetected) => 443, - EventType::Smtp(SmtpEvent::MailFrom) => 444, - EventType::Smtp(SmtpEvent::MailFromMissing) => 445, - EventType::Smtp(SmtpEvent::MailFromRewritten) => 446, - EventType::Smtp(SmtpEvent::MailFromUnauthenticated) => 447, - EventType::Smtp(SmtpEvent::MailFromUnauthorized) => 448, - EventType::Smtp(SmtpEvent::MailboxDoesNotExist) => 449, - EventType::Smtp(SmtpEvent::MessageParseFailed) => 450, - EventType::Smtp(SmtpEvent::MessageTooLarge) => 451, - EventType::Smtp(SmtpEvent::MissingAuthDirectory) => 452, - EventType::Smtp(SmtpEvent::MissingLocalHostname) => 453, - EventType::Smtp(SmtpEvent::MtPriorityDisabled) => 454, - EventType::Smtp(SmtpEvent::MtPriorityInvalid) => 455, - EventType::Smtp(SmtpEvent::MultipleMailFrom) => 456, - EventType::Smtp(SmtpEvent::Noop) => 457, - EventType::Smtp(SmtpEvent::Quit) => 460, - EventType::Smtp(SmtpEvent::RateLimitExceeded) => 461, - EventType::Smtp(SmtpEvent::RawInput) => 462, - EventType::Smtp(SmtpEvent::RawOutput) => 463, - EventType::Smtp(SmtpEvent::RcptTo) => 464, - EventType::Smtp(SmtpEvent::RcptToDuplicate) => 465, - EventType::Smtp(SmtpEvent::RcptToMissing) => 466, - EventType::Smtp(SmtpEvent::RcptToRewritten) => 467, - EventType::Smtp(SmtpEvent::RelayNotAllowed) => 468, - EventType::Smtp(SmtpEvent::IdNotFound) => 469, - EventType::Smtp(SmtpEvent::RequestTooLarge) => 470, - EventType::Smtp(SmtpEvent::RequireTlsDisabled) => 471, - EventType::Smtp(SmtpEvent::Rset) => 472, - EventType::Smtp(SmtpEvent::SpfEhloFail) => 473, - EventType::Smtp(SmtpEvent::SpfEhloPass) => 474, - EventType::Smtp(SmtpEvent::SpfFromFail) => 475, - EventType::Smtp(SmtpEvent::SpfFromPass) => 476, - EventType::Smtp(SmtpEvent::StartTls) => 477, - EventType::Smtp(SmtpEvent::StartTlsAlready) => 478, - EventType::Smtp(SmtpEvent::StartTlsUnavailable) => 479, - EventType::Smtp(SmtpEvent::SyntaxError) => 480, - EventType::Smtp(SmtpEvent::TimeLimitExceeded) => 481, - EventType::Smtp(SmtpEvent::TooManyInvalidRcpt) => 482, - EventType::Smtp(SmtpEvent::TooManyMessages) => 483, - EventType::Smtp(SmtpEvent::TooManyRecipients) => 484, - EventType::Smtp(SmtpEvent::TransferLimitExceeded) => 485, - EventType::Smtp(SmtpEvent::UnsupportedParameter) => 486, - EventType::Smtp(SmtpEvent::Vrfy) => 487, - EventType::Smtp(SmtpEvent::VrfyDisabled) => 488, - EventType::Smtp(SmtpEvent::VrfyNotFound) => 489, - EventType::Spam(SpamEvent::Classify) => 490, - EventType::Spam(SpamEvent::TrainSampleNotFound) => 491, - EventType::Store(StoreEvent::HttpStoreFetch) => 492, - EventType::Store(StoreEvent::HttpStoreError) => 493, - EventType::Spam(SpamEvent::PyzorError) => 494, - EventType::Spam(SpamEvent::TrainCompleted) => 495, - EventType::Spam(SpamEvent::ModelNotReady) => 496, - EventType::Spam(SpamEvent::ModelNotFound) => 497, - EventType::Spf(SpfEvent::Fail) => 498, - EventType::Spf(SpfEvent::Neutral) => 499, - EventType::Spf(SpfEvent::None) => 500, - EventType::Spf(SpfEvent::Pass) => 501, - EventType::Spf(SpfEvent::PermError) => 502, - EventType::Spf(SpfEvent::SoftFail) => 503, - EventType::Spf(SpfEvent::TempError) => 504, - EventType::Store(StoreEvent::AssertValueFailed) => 505, - EventType::Store(StoreEvent::BlobDelete) => 506, - EventType::Store(StoreEvent::BlobMissingMarker) => 507, - EventType::Store(StoreEvent::BlobRead) => 508, - EventType::Store(StoreEvent::BlobWrite) => 509, - EventType::Store(StoreEvent::CryptoError) => 510, - EventType::Store(StoreEvent::DataCorruption) => 511, - EventType::Store(StoreEvent::DataIterate) => 512, - EventType::Store(StoreEvent::DataWrite) => 513, - EventType::Store(StoreEvent::DecompressError) => 514, - EventType::Store(StoreEvent::DeserializeError) => 515, - EventType::Store(StoreEvent::ElasticsearchError) => 516, - EventType::Store(StoreEvent::FilesystemError) => 517, - EventType::Store(StoreEvent::FoundationdbError) => 518, - EventType::Store(StoreEvent::LdapWarning) => 519, - EventType::Store(StoreEvent::LdapError) => 520, - EventType::Store(StoreEvent::LdapQuery) => 521, - EventType::Store(StoreEvent::MysqlError) => 522, - EventType::Store(StoreEvent::NotConfigured) => 523, - EventType::Store(StoreEvent::NotFound) => 524, - EventType::Store(StoreEvent::NotSupported) => 525, - EventType::Store(StoreEvent::PoolError) => 526, - EventType::Store(StoreEvent::PostgresqlError) => 527, - EventType::Store(StoreEvent::RedisError) => 528, - EventType::Store(StoreEvent::RocksdbError) => 529, - EventType::Store(StoreEvent::S3Error) => 530, - EventType::Store(StoreEvent::SqlQuery) => 531, - EventType::Store(StoreEvent::SqliteError) => 532, - EventType::Store(StoreEvent::UnexpectedError) => 533, - EventType::Telemetry(TelemetryEvent::JournalError) => 534, - EventType::Telemetry(TelemetryEvent::LogError) => 535, - EventType::Telemetry(TelemetryEvent::OtelExporterError) => 536, - EventType::Telemetry(TelemetryEvent::OtelMetricsExporterError) => 537, - EventType::Telemetry(TelemetryEvent::PrometheusExporterError) => 538, - EventType::Telemetry(TelemetryEvent::WebhookError) => 539, - EventType::TlsRpt(TlsRptEvent::RecordFetch) => 540, - EventType::TlsRpt(TlsRptEvent::RecordFetchError) => 541, - EventType::Tls(TlsEvent::CertificateNotFound) => 542, - EventType::Tls(TlsEvent::Handshake) => 543, - EventType::Tls(TlsEvent::HandshakeError) => 544, - EventType::Tls(TlsEvent::MultipleCertificatesAvailable) => 545, - EventType::Tls(TlsEvent::NoCertificatesAvailable) => 546, - EventType::Tls(TlsEvent::NotConfigured) => 547, - EventType::Telemetry(TelemetryEvent::Alert) => 548, - EventType::Security(SecurityEvent::AbuseBan) => 549, - EventType::Security(SecurityEvent::LoiterBan) => 550, - EventType::Smtp(SmtpEvent::MailFromNotAllowed) => 551, - EventType::Security(SecurityEvent::Unauthorized) => 552, - EventType::Limit(LimitEvent::TenantQuota) => 553, - EventType::Auth(AuthEvent::TokenExpired) => 554, - EventType::Auth(AuthEvent::ClientRegistration) => 555, - EventType::Ai(AiEvent::LlmResponse) => 556, - EventType::Ai(AiEvent::ApiError) => 557, - EventType::Security(SecurityEvent::ScanBan) => 558, - EventType::Store(StoreEvent::AzureError) => 559, - EventType::TlsRpt(TlsRptEvent::RecordNotFound) => 560, - EventType::Smtp(SmtpEvent::RcptToGreylisted) => 561, - EventType::Spam(SpamEvent::Dnsbl) => 562, - EventType::Spam(SpamEvent::DnsblError) => 563, - EventType::Spam(SpamEvent::Pyzor) => 564, - EventType::Queue(QueueEvent::BackPressure) => 48, - EventType::Imap(ImapEvent::GetQuota) => 57, - EventType::WebDav(WebDavEvent::Propfind) => 147, - EventType::WebDav(WebDavEvent::Proppatch) => 148, - EventType::WebDav(WebDavEvent::Get) => 335, - EventType::WebDav(WebDavEvent::Report) => 336, - EventType::WebDav(WebDavEvent::Mkcol) => 376, - EventType::WebDav(WebDavEvent::Delete) => 458, - EventType::WebDav(WebDavEvent::Put) => 459, - EventType::WebDav(WebDavEvent::Post) => 565, - EventType::WebDav(WebDavEvent::Patch) => 566, - EventType::WebDav(WebDavEvent::Copy) => 567, - EventType::WebDav(WebDavEvent::Move) => 568, - EventType::WebDav(WebDavEvent::Lock) => 569, - EventType::WebDav(WebDavEvent::Unlock) => 570, - EventType::WebDav(WebDavEvent::Acl) => 571, - EventType::WebDav(WebDavEvent::Error) => 572, - EventType::WebDav(WebDavEvent::Options) => 573, - EventType::WebDav(WebDavEvent::Head) => 574, - EventType::WebDav(WebDavEvent::Mkcalendar) => 575, - EventType::Calendar(CalendarEvent::RuleExpansionError) => 576, - EventType::Store(StoreEvent::CacheMiss) => 50, - EventType::Store(StoreEvent::CacheHit) => 51, - EventType::Store(StoreEvent::CacheStale) => 52, - EventType::Store(StoreEvent::CacheUpdate) => 577, - EventType::TaskQueue(TaskQueueEvent::TaskAcquired) => 578, - EventType::Calendar(CalendarEvent::AlarmSent) => 579, - EventType::Calendar(CalendarEvent::AlarmSkipped) => 580, - EventType::Calendar(CalendarEvent::AlarmRecipientOverride) => 581, - EventType::Calendar(CalendarEvent::AlarmFailed) => 582, - EventType::Calendar(CalendarEvent::ItipMessageSent) => 583, - EventType::Calendar(CalendarEvent::ItipMessageReceived) => 584, - EventType::Calendar(CalendarEvent::ItipMessageError) => 585, - EventType::TaskQueue(TaskQueueEvent::TaskIgnored) => 586, - EventType::TaskQueue(TaskQueueEvent::TaskFailed) => 587, - EventType::Spam(SpamEvent::TrainStarted) => 588, - EventType::Spam(SpamEvent::ModelLoaded) => 589, - EventType::Store(StoreEvent::MeilisearchError) => 590, - EventType::Dns(DnsEvent::BuildError) => 591, - EventType::Dkim(DkimEvent::BuildError) => 592, - } - } - - pub fn from_code(code: u64) -> Option { - match code { - 0 => Some(EventType::Acme(AcmeEvent::AuthCompleted)), - 1 => Some(EventType::Acme(AcmeEvent::AuthError)), - 2 => Some(EventType::Acme(AcmeEvent::AuthPending)), - 3 => Some(EventType::Acme(AcmeEvent::AuthStart)), - 4 => Some(EventType::Acme(AcmeEvent::AuthTooManyAttempts)), - 5 => Some(EventType::Acme(AcmeEvent::AuthValid)), - 6 => Some(EventType::Acme(AcmeEvent::ClientMissingSni)), - 7 => Some(EventType::Acme(AcmeEvent::ClientSuppliedSni)), - 8 => Some(EventType::Dns(DnsEvent::RecordCreated)), - 9 => Some(EventType::Dns(DnsEvent::RecordCreationFailed)), - 10 => Some(EventType::Dns(DnsEvent::RecordDeletionFailed)), - 11 => Some(EventType::Dns(DnsEvent::RecordLookupFailed)), - 12 => Some(EventType::Dns(DnsEvent::RecordNotPropagated)), - 13 => Some(EventType::Dns(DnsEvent::RecordPropagated)), - 14 => Some(EventType::Dns(DnsEvent::RecordPropagationTimeout)), - 15 => Some(EventType::Acme(AcmeEvent::Error)), - 16 => Some(EventType::Acme(AcmeEvent::OrderCompleted)), - 17 => Some(EventType::Acme(AcmeEvent::OrderInvalid)), - 18 => Some(EventType::Acme(AcmeEvent::OrderProcessing)), - 19 => Some(EventType::Acme(AcmeEvent::OrderReady)), - 20 => Some(EventType::Acme(AcmeEvent::OrderStart)), - 21 => Some(EventType::Acme(AcmeEvent::OrderValid)), - 22 => Some(EventType::Acme(AcmeEvent::ProcessCert)), - 23 => Some(EventType::Acme(AcmeEvent::RenewBackoff)), - 24 => Some(EventType::Acme(AcmeEvent::TlsAlpnError)), - 25 => Some(EventType::Acme(AcmeEvent::TlsAlpnReceived)), - 26 => Some(EventType::Acme(AcmeEvent::TokenNotFound)), - 27 => Some(EventType::Arc(ArcEvent::BrokenChain)), - 28 => Some(EventType::Arc(ArcEvent::ChainTooLong)), - 29 => Some(EventType::Arc(ArcEvent::HasHeaderTag)), - 30 => Some(EventType::Arc(ArcEvent::InvalidCv)), - 31 => Some(EventType::Arc(ArcEvent::InvalidInstance)), - 32 => Some(EventType::Arc(ArcEvent::SealerNotFound)), - 33 => Some(EventType::Security(SecurityEvent::AuthenticationBan)), - 34 => Some(EventType::Auth(AuthEvent::Error)), - 35 => Some(EventType::Auth(AuthEvent::Failed)), - 36 => Some(EventType::Auth(AuthEvent::MissingTotp)), - 37 => Some(EventType::Auth(AuthEvent::Success)), - 38 => Some(EventType::Auth(AuthEvent::TooManyAttempts)), - 39 => Some(EventType::Cluster(ClusterEvent::SubscriberStart)), - 40 => Some(EventType::Cluster(ClusterEvent::SubscriberStop)), - 41 => Some(EventType::Cluster(ClusterEvent::SubscriberError)), - 42 => Some(EventType::Cluster(ClusterEvent::SubscriberDisconnected)), - 43 => Some(EventType::Cluster(ClusterEvent::PublisherStart)), - 44 => Some(EventType::Cluster(ClusterEvent::PublisherStop)), - 45 => Some(EventType::Cluster(ClusterEvent::PublisherError)), - 46 => Some(EventType::Cluster(ClusterEvent::MessageReceived)), - 47 => Some(EventType::Cluster(ClusterEvent::MessageSkipped)), - 49 => Some(EventType::Cluster(ClusterEvent::MessageInvalid)), - 53 => Some(EventType::Config(ConfigEvent::AlreadyUpToDate)), - 54 => Some(EventType::Config(ConfigEvent::BuildError)), - 55 => Some(EventType::Config(ConfigEvent::BuildWarning)), - 56 => Some(EventType::Config(ConfigEvent::DefaultApplied)), - 58 => Some(EventType::Config(ConfigEvent::FetchError)), - 59 => Some(EventType::Config(ConfigEvent::ImportExternal)), - 60 => Some(EventType::Config(ConfigEvent::MacroError)), - 61 => Some(EventType::Config(ConfigEvent::MissingSetting)), - 62 => Some(EventType::Config(ConfigEvent::ParseError)), - 63 => Some(EventType::Config(ConfigEvent::ParseWarning)), - 64 => Some(EventType::Config(ConfigEvent::UnusedSetting)), - 65 => Some(EventType::Config(ConfigEvent::WriteError)), - 66 => Some(EventType::Dane(DaneEvent::AuthenticationFailure)), - 67 => Some(EventType::Dane(DaneEvent::AuthenticationSuccess)), - 68 => Some(EventType::Dane(DaneEvent::CertificateParseError)), - 69 => Some(EventType::Dane(DaneEvent::NoCertificatesFound)), - 70 => Some(EventType::Dane(DaneEvent::TlsaRecordFetch)), - 71 => Some(EventType::Dane(DaneEvent::TlsaRecordFetchError)), - 72 => Some(EventType::Dane(DaneEvent::TlsaRecordInvalid)), - 73 => Some(EventType::Dane(DaneEvent::TlsaRecordMatch)), - 74 => Some(EventType::Dane(DaneEvent::TlsaRecordNotDnssecSigned)), - 75 => Some(EventType::Dane(DaneEvent::TlsaRecordNotFound)), - 76 => Some(EventType::Delivery(DeliveryEvent::AttemptEnd)), - 77 => Some(EventType::Delivery(DeliveryEvent::AttemptStart)), - 78 => Some(EventType::Delivery(DeliveryEvent::Auth)), - 79 => Some(EventType::Delivery(DeliveryEvent::AuthFailed)), - 80 => Some(EventType::Delivery(DeliveryEvent::Completed)), - 81 => Some(EventType::Delivery(DeliveryEvent::ConcurrencyLimitExceeded)), - 82 => Some(EventType::Delivery(DeliveryEvent::Connect)), - 83 => Some(EventType::Delivery(DeliveryEvent::ConnectError)), - 84 => Some(EventType::Delivery(DeliveryEvent::Delivered)), - 85 => Some(EventType::Delivery(DeliveryEvent::DomainDeliveryStart)), - 86 => Some(EventType::Delivery(DeliveryEvent::DoubleBounce)), - 87 => Some(EventType::Delivery(DeliveryEvent::DsnPermFail)), - 88 => Some(EventType::Delivery(DeliveryEvent::DsnSuccess)), - 89 => Some(EventType::Delivery(DeliveryEvent::DsnTempFail)), - 90 => Some(EventType::Delivery(DeliveryEvent::Ehlo)), - 91 => Some(EventType::Delivery(DeliveryEvent::EhloRejected)), - 92 => Some(EventType::Delivery(DeliveryEvent::Failed)), - 93 => Some(EventType::Delivery(DeliveryEvent::GreetingFailed)), - 94 => Some(EventType::Delivery(DeliveryEvent::ImplicitTlsError)), - 95 => Some(EventType::Delivery(DeliveryEvent::IpLookup)), - 96 => Some(EventType::Delivery(DeliveryEvent::IpLookupFailed)), - 97 => Some(EventType::Delivery(DeliveryEvent::MailFrom)), - 98 => Some(EventType::Delivery(DeliveryEvent::MailFromRejected)), - 99 => Some(EventType::Delivery(DeliveryEvent::MessageRejected)), - 100 => Some(EventType::Delivery(DeliveryEvent::MissingOutboundHostname)), - 101 => Some(EventType::Delivery(DeliveryEvent::MxLookup)), - 102 => Some(EventType::Delivery(DeliveryEvent::MxLookupFailed)), - 103 => Some(EventType::Delivery(DeliveryEvent::NullMx)), - 104 => Some(EventType::Delivery(DeliveryEvent::RateLimitExceeded)), - 105 => Some(EventType::Delivery(DeliveryEvent::RawInput)), - 106 => Some(EventType::Delivery(DeliveryEvent::RawOutput)), - 107 => Some(EventType::Delivery(DeliveryEvent::RcptTo)), - 108 => Some(EventType::Delivery(DeliveryEvent::RcptToFailed)), - 109 => Some(EventType::Delivery(DeliveryEvent::RcptToRejected)), - 110 => Some(EventType::Delivery(DeliveryEvent::StartTls)), - 111 => Some(EventType::Delivery(DeliveryEvent::StartTlsDisabled)), - 112 => Some(EventType::Delivery(DeliveryEvent::StartTlsError)), - 113 => Some(EventType::Delivery(DeliveryEvent::StartTlsUnavailable)), - 114 => Some(EventType::Dkim(DkimEvent::Fail)), - 115 => Some(EventType::Dkim(DkimEvent::FailedAuidMatch)), - 116 => Some(EventType::Dkim(DkimEvent::FailedBodyHashMatch)), - 117 => Some(EventType::Dkim(DkimEvent::FailedVerification)), - 118 => Some(EventType::Dkim(DkimEvent::IncompatibleAlgorithms)), - 119 => Some(EventType::Dkim(DkimEvent::Neutral)), - 120 => Some(EventType::Dkim(DkimEvent::None)), - 121 => Some(EventType::Dkim(DkimEvent::Pass)), - 122 => Some(EventType::Dkim(DkimEvent::PermError)), - 123 => Some(EventType::Dkim(DkimEvent::RevokedPublicKey)), - 124 => Some(EventType::Dkim(DkimEvent::SignatureExpired)), - 125 => Some(EventType::Dkim(DkimEvent::SignatureLength)), - 126 => Some(EventType::Dkim(DkimEvent::SignerNotFound)), - 127 => Some(EventType::Dkim(DkimEvent::TempError)), - 128 => Some(EventType::Dkim(DkimEvent::UnsupportedAlgorithm)), - 129 => Some(EventType::Dkim(DkimEvent::UnsupportedCanonicalization)), - 130 => Some(EventType::Dkim(DkimEvent::UnsupportedKeyType)), - 131 => Some(EventType::Dkim(DkimEvent::UnsupportedVersion)), - 132 => Some(EventType::Dmarc(DmarcEvent::Fail)), - 133 => Some(EventType::Dmarc(DmarcEvent::None)), - 134 => Some(EventType::Dmarc(DmarcEvent::Pass)), - 135 => Some(EventType::Dmarc(DmarcEvent::PermError)), - 136 => Some(EventType::Dmarc(DmarcEvent::TempError)), - 137 => Some(EventType::Eval(EvalEvent::DirectoryNotFound)), - 138 => Some(EventType::Eval(EvalEvent::Error)), - 139 => Some(EventType::Eval(EvalEvent::Result)), - 140 => Some(EventType::Eval(EvalEvent::StoreNotFound)), - 141 => Some(EventType::TaskQueue(TaskQueueEvent::BlobNotFound)), - 142 => Some(EventType::MessageIngest(MessageIngestEvent::FtsIndex)), - 143 => Some(EventType::Spam(SpamEvent::TrainSampleAdded)), - 144 => Some(EventType::TaskQueue(TaskQueueEvent::TaskLocked)), - 145 => Some(EventType::TaskQueue(TaskQueueEvent::MetadataNotFound)), - 146 => Some(EventType::Housekeeper(HousekeeperEvent::Run)), - 149 => Some(EventType::Housekeeper(HousekeeperEvent::Schedule)), - 150 => Some(EventType::Housekeeper(HousekeeperEvent::Start)), - 151 => Some(EventType::Housekeeper(HousekeeperEvent::Stop)), - 152 => Some(EventType::Http(HttpEvent::ConnectionEnd)), - 153 => Some(EventType::Http(HttpEvent::ConnectionStart)), - 154 => Some(EventType::Http(HttpEvent::Error)), - 155 => Some(EventType::Http(HttpEvent::RequestBody)), - 156 => Some(EventType::Http(HttpEvent::RequestUrl)), - 157 => Some(EventType::Http(HttpEvent::ResponseBody)), - 158 => Some(EventType::Http(HttpEvent::XForwardedMissing)), - 159 => Some(EventType::Imap(ImapEvent::Append)), - 160 => Some(EventType::Imap(ImapEvent::Capabilities)), - 161 => Some(EventType::Imap(ImapEvent::Close)), - 162 => Some(EventType::Imap(ImapEvent::ConnectionEnd)), - 163 => Some(EventType::Imap(ImapEvent::ConnectionStart)), - 164 => Some(EventType::Imap(ImapEvent::Copy)), - 165 => Some(EventType::Imap(ImapEvent::CreateMailbox)), - 166 => Some(EventType::Imap(ImapEvent::DeleteMailbox)), - 167 => Some(EventType::Imap(ImapEvent::Enable)), - 168 => Some(EventType::Imap(ImapEvent::Error)), - 169 => Some(EventType::Imap(ImapEvent::Expunge)), - 170 => Some(EventType::Imap(ImapEvent::Fetch)), - 171 => Some(EventType::Imap(ImapEvent::GetAcl)), - 172 => Some(EventType::Imap(ImapEvent::Id)), - 173 => Some(EventType::Imap(ImapEvent::IdleStart)), - 174 => Some(EventType::Imap(ImapEvent::IdleStop)), - 175 => Some(EventType::Imap(ImapEvent::List)), - 176 => Some(EventType::Imap(ImapEvent::ListRights)), - 177 => Some(EventType::Imap(ImapEvent::Logout)), - 178 => Some(EventType::Imap(ImapEvent::Lsub)), - 179 => Some(EventType::Imap(ImapEvent::Move)), - 180 => Some(EventType::Imap(ImapEvent::MyRights)), - 181 => Some(EventType::Imap(ImapEvent::Namespace)), - 182 => Some(EventType::Imap(ImapEvent::Noop)), - 183 => Some(EventType::Imap(ImapEvent::RawInput)), - 184 => Some(EventType::Imap(ImapEvent::RawOutput)), - 185 => Some(EventType::Imap(ImapEvent::RenameMailbox)), - 186 => Some(EventType::Imap(ImapEvent::Search)), - 187 => Some(EventType::Imap(ImapEvent::Select)), - 188 => Some(EventType::Imap(ImapEvent::SetAcl)), - 189 => Some(EventType::Imap(ImapEvent::Sort)), - 190 => Some(EventType::Imap(ImapEvent::Status)), - 191 => Some(EventType::Imap(ImapEvent::Store)), - 192 => Some(EventType::Imap(ImapEvent::Subscribe)), - 193 => Some(EventType::Imap(ImapEvent::Thread)), - 194 => Some(EventType::Imap(ImapEvent::Unsubscribe)), - 195 => Some(EventType::IncomingReport(IncomingReportEvent::AbuseReport)), - 196 => Some(EventType::IncomingReport( - IncomingReportEvent::ArfParseFailed, - )), - 197 => Some(EventType::IncomingReport( - IncomingReportEvent::AuthFailureReport, - )), - 198 => Some(EventType::IncomingReport( - IncomingReportEvent::DecompressError, - )), - 199 => Some(EventType::IncomingReport( - IncomingReportEvent::DmarcParseFailed, - )), - 200 => Some(EventType::IncomingReport(IncomingReportEvent::DmarcReport)), - 201 => Some(EventType::IncomingReport( - IncomingReportEvent::DmarcReportWithWarnings, - )), - 202 => Some(EventType::IncomingReport(IncomingReportEvent::FraudReport)), - 203 => Some(EventType::IncomingReport( - IncomingReportEvent::MessageParseFailed, - )), - 204 => Some(EventType::IncomingReport( - IncomingReportEvent::NotSpamReport, - )), - 205 => Some(EventType::IncomingReport(IncomingReportEvent::OtherReport)), - 206 => Some(EventType::IncomingReport(IncomingReportEvent::TlsReport)), - 207 => Some(EventType::IncomingReport( - IncomingReportEvent::TlsReportWithWarnings, - )), - 208 => Some(EventType::IncomingReport( - IncomingReportEvent::TlsRpcParseFailed, - )), - 209 => Some(EventType::IncomingReport(IncomingReportEvent::VirusReport)), - 210 => Some(EventType::Iprev(IprevEvent::Fail)), - 211 => Some(EventType::Iprev(IprevEvent::None)), - 212 => Some(EventType::Iprev(IprevEvent::Pass)), - 213 => Some(EventType::Iprev(IprevEvent::PermError)), - 214 => Some(EventType::Iprev(IprevEvent::TempError)), - 215 => Some(EventType::Jmap(JmapEvent::AccountNotFound)), - 216 => Some(EventType::Jmap(JmapEvent::AccountNotSupportedByMethod)), - 217 => Some(EventType::Jmap(JmapEvent::AccountReadOnly)), - 218 => Some(EventType::Jmap(JmapEvent::AnchorNotFound)), - 219 => Some(EventType::Jmap(JmapEvent::CannotCalculateChanges)), - 220 => Some(EventType::Jmap(JmapEvent::Forbidden)), - 221 => Some(EventType::Jmap(JmapEvent::InvalidArguments)), - 222 => Some(EventType::Jmap(JmapEvent::InvalidResultReference)), - 223 => Some(EventType::Jmap(JmapEvent::MethodCall)), - 224 => Some(EventType::Jmap(JmapEvent::NotFound)), - 225 => Some(EventType::Jmap(JmapEvent::NotJson)), - 226 => Some(EventType::Jmap(JmapEvent::NotRequest)), - 227 => Some(EventType::Jmap(JmapEvent::RequestTooLarge)), - 228 => Some(EventType::Jmap(JmapEvent::StateMismatch)), - 229 => Some(EventType::Jmap(JmapEvent::UnknownCapability)), - 230 => Some(EventType::Jmap(JmapEvent::UnknownDataType)), - 231 => Some(EventType::Jmap(JmapEvent::UnknownMethod)), - 232 => Some(EventType::Jmap(JmapEvent::UnsupportedFilter)), - 233 => Some(EventType::Jmap(JmapEvent::UnsupportedSort)), - 234 => Some(EventType::Jmap(JmapEvent::WebsocketError)), - 235 => Some(EventType::Jmap(JmapEvent::WebsocketStart)), - 236 => Some(EventType::Jmap(JmapEvent::WebsocketStop)), - 237 => Some(EventType::Limit(LimitEvent::BlobQuota)), - 238 => Some(EventType::Limit(LimitEvent::CallsIn)), - 239 => Some(EventType::Limit(LimitEvent::ConcurrentConnection)), - 240 => Some(EventType::Limit(LimitEvent::ConcurrentRequest)), - 241 => Some(EventType::Limit(LimitEvent::ConcurrentUpload)), - 242 => Some(EventType::Limit(LimitEvent::Quota)), - 243 => Some(EventType::Limit(LimitEvent::SizeRequest)), - 244 => Some(EventType::Limit(LimitEvent::SizeUpload)), - 245 => Some(EventType::Limit(LimitEvent::TooManyRequests)), - 246 => Some(EventType::MailAuth(MailAuthEvent::Base64)), - 247 => Some(EventType::MailAuth(MailAuthEvent::Crypto)), - 248 => Some(EventType::MailAuth(MailAuthEvent::DnsError)), - 249 => Some(EventType::MailAuth(MailAuthEvent::DnsInvalidRecordType)), - 250 => Some(EventType::MailAuth(MailAuthEvent::DnsRecordNotFound)), - 251 => Some(EventType::MailAuth(MailAuthEvent::Io)), - 252 => Some(EventType::MailAuth(MailAuthEvent::MissingParameters)), - 253 => Some(EventType::MailAuth(MailAuthEvent::NoHeadersFound)), - 254 => Some(EventType::MailAuth(MailAuthEvent::ParseError)), - 255 => Some(EventType::MailAuth(MailAuthEvent::PolicyNotAligned)), - 256 => Some(EventType::ManageSieve(ManageSieveEvent::Capabilities)), - 257 => Some(EventType::ManageSieve(ManageSieveEvent::CheckScript)), - 258 => Some(EventType::ManageSieve(ManageSieveEvent::ConnectionEnd)), - 259 => Some(EventType::ManageSieve(ManageSieveEvent::ConnectionStart)), - 260 => Some(EventType::ManageSieve(ManageSieveEvent::CreateScript)), - 261 => Some(EventType::ManageSieve(ManageSieveEvent::DeleteScript)), - 262 => Some(EventType::ManageSieve(ManageSieveEvent::Error)), - 263 => Some(EventType::ManageSieve(ManageSieveEvent::GetScript)), - 264 => Some(EventType::ManageSieve(ManageSieveEvent::HaveSpace)), - 265 => Some(EventType::ManageSieve(ManageSieveEvent::ListScripts)), - 266 => Some(EventType::ManageSieve(ManageSieveEvent::Logout)), - 267 => Some(EventType::ManageSieve(ManageSieveEvent::Noop)), - 268 => Some(EventType::ManageSieve(ManageSieveEvent::RawInput)), - 269 => Some(EventType::ManageSieve(ManageSieveEvent::RawOutput)), - 270 => Some(EventType::ManageSieve(ManageSieveEvent::RenameScript)), - 271 => Some(EventType::ManageSieve(ManageSieveEvent::SetActive)), - 272 => Some(EventType::ManageSieve(ManageSieveEvent::StartTls)), - 273 => Some(EventType::ManageSieve(ManageSieveEvent::Unauthenticate)), - 274 => Some(EventType::ManageSieve(ManageSieveEvent::UpdateScript)), - 275 => Some(EventType::Manage(ManageEvent::AlreadyExists)), - 276 => Some(EventType::Manage(ManageEvent::AssertFailed)), - 277 => Some(EventType::Manage(ManageEvent::Error)), - 278 => Some(EventType::Manage(ManageEvent::MissingParameter)), - 279 => Some(EventType::Manage(ManageEvent::NotFound)), - 280 => Some(EventType::Manage(ManageEvent::NotSupported)), - 281 => Some(EventType::MessageIngest(MessageIngestEvent::Duplicate)), - 282 => Some(EventType::MessageIngest(MessageIngestEvent::Error)), - 283 => Some(EventType::MessageIngest(MessageIngestEvent::Ham)), - 284 => Some(EventType::MessageIngest(MessageIngestEvent::ImapAppend)), - 285 => Some(EventType::MessageIngest(MessageIngestEvent::JmapAppend)), - 286 => Some(EventType::MessageIngest(MessageIngestEvent::Spam)), - 287 => Some(EventType::Milter(MilterEvent::ActionAccept)), - 288 => Some(EventType::Milter(MilterEvent::ActionConnectionFailure)), - 289 => Some(EventType::Milter(MilterEvent::ActionDiscard)), - 290 => Some(EventType::Milter(MilterEvent::ActionReject)), - 291 => Some(EventType::Milter(MilterEvent::ActionReplyCode)), - 292 => Some(EventType::Milter(MilterEvent::ActionShutdown)), - 293 => Some(EventType::Milter(MilterEvent::ActionTempFail)), - 294 => Some(EventType::Milter(MilterEvent::Disconnected)), - 295 => Some(EventType::Milter(MilterEvent::FrameInvalid)), - 296 => Some(EventType::Milter(MilterEvent::FrameTooLarge)), - 297 => Some(EventType::Milter(MilterEvent::IoError)), - 298 => Some(EventType::Milter(MilterEvent::ParseError)), - 299 => Some(EventType::Milter(MilterEvent::Read)), - 300 => Some(EventType::Milter(MilterEvent::Timeout)), - 301 => Some(EventType::Milter(MilterEvent::TlsInvalidName)), - 302 => Some(EventType::Milter(MilterEvent::UnexpectedResponse)), - 303 => Some(EventType::Milter(MilterEvent::Write)), - 304 => Some(EventType::MtaHook(MtaHookEvent::ActionAccept)), - 305 => Some(EventType::MtaHook(MtaHookEvent::ActionDiscard)), - 306 => Some(EventType::MtaHook(MtaHookEvent::ActionQuarantine)), - 307 => Some(EventType::MtaHook(MtaHookEvent::ActionReject)), - 308 => Some(EventType::MtaHook(MtaHookEvent::Error)), - 309 => Some(EventType::MtaSts(MtaStsEvent::Authorized)), - 310 => Some(EventType::MtaSts(MtaStsEvent::InvalidPolicy)), - 311 => Some(EventType::MtaSts(MtaStsEvent::NotAuthorized)), - 312 => Some(EventType::MtaSts(MtaStsEvent::PolicyFetch)), - 313 => Some(EventType::MtaSts(MtaStsEvent::PolicyFetchError)), - 314 => Some(EventType::MtaSts(MtaStsEvent::PolicyNotFound)), - 315 => Some(EventType::Network(NetworkEvent::AcceptError)), - 316 => Some(EventType::Network(NetworkEvent::BindError)), - 317 => Some(EventType::Network(NetworkEvent::Closed)), - 318 => Some(EventType::Security(SecurityEvent::IpBlocked)), - 319 => Some(EventType::Network(NetworkEvent::FlushError)), - 320 => Some(EventType::Network(NetworkEvent::ListenError)), - 321 => Some(EventType::Network(NetworkEvent::ListenStart)), - 322 => Some(EventType::Network(NetworkEvent::ListenStop)), - 323 => Some(EventType::Network(NetworkEvent::ProxyError)), - 324 => Some(EventType::Network(NetworkEvent::ReadError)), - 325 => Some(EventType::Network(NetworkEvent::SetOptError)), - 326 => Some(EventType::Network(NetworkEvent::SplitError)), - 327 => Some(EventType::Network(NetworkEvent::Timeout)), - 328 => Some(EventType::Network(NetworkEvent::WriteError)), - 329 => Some(EventType::OutgoingReport( - OutgoingReportEvent::DkimRateLimited, - )), - 330 => Some(EventType::OutgoingReport(OutgoingReportEvent::DkimReport)), - 331 => Some(EventType::OutgoingReport( - OutgoingReportEvent::DmarcAggregateReport, - )), - 332 => Some(EventType::OutgoingReport( - OutgoingReportEvent::DmarcRateLimited, - )), - 333 => Some(EventType::OutgoingReport(OutgoingReportEvent::DmarcReport)), - 334 => Some(EventType::OutgoingReport( - OutgoingReportEvent::HttpSubmission, - )), - 337 => Some(EventType::OutgoingReport(OutgoingReportEvent::Locked)), - 338 => Some(EventType::OutgoingReport( - OutgoingReportEvent::NoRecipientsFound, - )), - 339 => Some(EventType::OutgoingReport(OutgoingReportEvent::NotFound)), - 340 => Some(EventType::OutgoingReport( - OutgoingReportEvent::ReportingAddressValidationError, - )), - 341 => Some(EventType::OutgoingReport( - OutgoingReportEvent::SpfRateLimited, - )), - 342 => Some(EventType::OutgoingReport(OutgoingReportEvent::SpfReport)), - 343 => Some(EventType::OutgoingReport( - OutgoingReportEvent::SubmissionError, - )), - 344 => Some(EventType::OutgoingReport(OutgoingReportEvent::TlsAggregate)), - 345 => Some(EventType::OutgoingReport( - OutgoingReportEvent::UnauthorizedReportingAddress, - )), - 346 => Some(EventType::Pop3(Pop3Event::Capabilities)), - 347 => Some(EventType::Pop3(Pop3Event::ConnectionEnd)), - 348 => Some(EventType::Pop3(Pop3Event::ConnectionStart)), - 349 => Some(EventType::Pop3(Pop3Event::Delete)), - 350 => Some(EventType::Pop3(Pop3Event::Error)), - 351 => Some(EventType::Pop3(Pop3Event::Fetch)), - 352 => Some(EventType::Pop3(Pop3Event::List)), - 353 => Some(EventType::Pop3(Pop3Event::ListMessage)), - 354 => Some(EventType::Pop3(Pop3Event::Noop)), - 355 => Some(EventType::Pop3(Pop3Event::Quit)), - 356 => Some(EventType::Pop3(Pop3Event::RawInput)), - 357 => Some(EventType::Pop3(Pop3Event::RawOutput)), - 358 => Some(EventType::Pop3(Pop3Event::Reset)), - 359 => Some(EventType::Pop3(Pop3Event::StartTls)), - 360 => Some(EventType::Pop3(Pop3Event::Stat)), - 361 => Some(EventType::Pop3(Pop3Event::Uidl)), - 362 => Some(EventType::Pop3(Pop3Event::UidlMessage)), - 363 => Some(EventType::Pop3(Pop3Event::Utf8)), - 364 => Some(EventType::Purge(PurgeEvent::AutoExpunge)), - 365 => Some(EventType::Purge(PurgeEvent::Error)), - 366 => Some(EventType::Purge(PurgeEvent::Finished)), - 367 => Some(EventType::Purge(PurgeEvent::InProgress)), - 368 => Some(EventType::Purge(PurgeEvent::Running)), - 369 => Some(EventType::Purge(PurgeEvent::Started)), - 370 => Some(EventType::Purge(PurgeEvent::BlobCleanup)), - 371 => Some(EventType::PushSubscription(PushSubscriptionEvent::Error)), - 372 => Some(EventType::PushSubscription(PushSubscriptionEvent::NotFound)), - 373 => Some(EventType::PushSubscription(PushSubscriptionEvent::Success)), - 374 => Some(EventType::Queue(QueueEvent::BlobNotFound)), - 375 => Some(EventType::Queue(QueueEvent::ConcurrencyLimitExceeded)), - 377 => Some(EventType::Queue(QueueEvent::Locked)), - 378 => Some(EventType::Queue(QueueEvent::QueueAutogenerated)), - 379 => Some(EventType::Queue(QueueEvent::QueueDsn)), - 380 => Some(EventType::Queue(QueueEvent::QueueMessage)), - 381 => Some(EventType::Queue(QueueEvent::QueueMessageAuthenticated)), - 382 => Some(EventType::Queue(QueueEvent::QueueReport)), - 383 => Some(EventType::Queue(QueueEvent::QuotaExceeded)), - 384 => Some(EventType::Queue(QueueEvent::RateLimitExceeded)), - 385 => Some(EventType::Queue(QueueEvent::Rescheduled)), - 386 => Some(EventType::Resource(ResourceEvent::BadParameters)), - 387 => Some(EventType::Resource(ResourceEvent::DownloadExternal)), - 388 => Some(EventType::Resource(ResourceEvent::Error)), - 389 => Some(EventType::Resource(ResourceEvent::NotFound)), - 390 => Some(EventType::Resource(ResourceEvent::WebadminUnpacked)), - 391 => Some(EventType::Server(ServerEvent::Licensing)), - 392 => Some(EventType::Server(ServerEvent::Shutdown)), - 393 => Some(EventType::Server(ServerEvent::Startup)), - 394 => Some(EventType::Server(ServerEvent::StartupError)), - 395 => Some(EventType::Server(ServerEvent::ThreadError)), - 396 => Some(EventType::Sieve(SieveEvent::ActionAccept)), - 397 => Some(EventType::Sieve(SieveEvent::ActionAcceptReplace)), - 398 => Some(EventType::Sieve(SieveEvent::ActionDiscard)), - 399 => Some(EventType::Sieve(SieveEvent::ActionReject)), - 400 => Some(EventType::Sieve(SieveEvent::ListNotFound)), - 401 => Some(EventType::Sieve(SieveEvent::MessageTooLarge)), - 402 => Some(EventType::Sieve(SieveEvent::NotSupported)), - 403 => Some(EventType::Sieve(SieveEvent::QuotaExceeded)), - 404 => Some(EventType::Sieve(SieveEvent::RuntimeError)), - 405 => Some(EventType::Sieve(SieveEvent::ScriptNotFound)), - 406 => Some(EventType::Sieve(SieveEvent::SendMessage)), - 407 => Some(EventType::Sieve(SieveEvent::UnexpectedError)), - 408 => Some(EventType::Smtp(SmtpEvent::AlreadyAuthenticated)), - 409 => Some(EventType::Smtp(SmtpEvent::ArcFail)), - 410 => Some(EventType::Smtp(SmtpEvent::ArcPass)), - 411 => Some(EventType::Smtp(SmtpEvent::AuthExchangeTooLong)), - 412 => Some(EventType::Smtp(SmtpEvent::AuthMechanismNotSupported)), - 413 => Some(EventType::Smtp(SmtpEvent::AuthNotAllowed)), - 414 => Some(EventType::Smtp(SmtpEvent::CommandNotImplemented)), - 415 => Some(EventType::Smtp(SmtpEvent::ConcurrencyLimitExceeded)), - 416 => Some(EventType::Smtp(SmtpEvent::ConnectionEnd)), - 417 => Some(EventType::Smtp(SmtpEvent::ConnectionStart)), - 418 => Some(EventType::Smtp(SmtpEvent::DeliverByDisabled)), - 419 => Some(EventType::Smtp(SmtpEvent::DeliverByInvalid)), - 420 => Some(EventType::Smtp(SmtpEvent::DidNotSayEhlo)), - 421 => Some(EventType::Smtp(SmtpEvent::DkimFail)), - 422 => Some(EventType::Smtp(SmtpEvent::DkimPass)), - 423 => Some(EventType::Smtp(SmtpEvent::DmarcFail)), - 424 => Some(EventType::Smtp(SmtpEvent::DmarcPass)), - 425 => Some(EventType::Smtp(SmtpEvent::DsnDisabled)), - 426 => Some(EventType::Smtp(SmtpEvent::Ehlo)), - 427 => Some(EventType::Smtp(SmtpEvent::EhloExpected)), - 428 => Some(EventType::Smtp(SmtpEvent::Error)), - 429 => Some(EventType::Smtp(SmtpEvent::Expn)), - 430 => Some(EventType::Smtp(SmtpEvent::ExpnDisabled)), - 431 => Some(EventType::Smtp(SmtpEvent::ExpnNotFound)), - 432 => Some(EventType::Smtp(SmtpEvent::FutureReleaseDisabled)), - 433 => Some(EventType::Smtp(SmtpEvent::FutureReleaseInvalid)), - 434 => Some(EventType::Smtp(SmtpEvent::Help)), - 435 => Some(EventType::Smtp(SmtpEvent::InvalidCommand)), - 436 => Some(EventType::Smtp(SmtpEvent::InvalidEhlo)), - 437 => Some(EventType::Smtp(SmtpEvent::InvalidParameter)), - 438 => Some(EventType::Smtp(SmtpEvent::InvalidRecipientAddress)), - 439 => Some(EventType::Smtp(SmtpEvent::InvalidSenderAddress)), - 440 => Some(EventType::Smtp(SmtpEvent::IprevFail)), - 441 => Some(EventType::Smtp(SmtpEvent::IprevPass)), - 442 => Some(EventType::Smtp(SmtpEvent::LhloExpected)), - 443 => Some(EventType::Smtp(SmtpEvent::LoopDetected)), - 444 => Some(EventType::Smtp(SmtpEvent::MailFrom)), - 445 => Some(EventType::Smtp(SmtpEvent::MailFromMissing)), - 446 => Some(EventType::Smtp(SmtpEvent::MailFromRewritten)), - 447 => Some(EventType::Smtp(SmtpEvent::MailFromUnauthenticated)), - 448 => Some(EventType::Smtp(SmtpEvent::MailFromUnauthorized)), - 449 => Some(EventType::Smtp(SmtpEvent::MailboxDoesNotExist)), - 450 => Some(EventType::Smtp(SmtpEvent::MessageParseFailed)), - 451 => Some(EventType::Smtp(SmtpEvent::MessageTooLarge)), - 452 => Some(EventType::Smtp(SmtpEvent::MissingAuthDirectory)), - 453 => Some(EventType::Smtp(SmtpEvent::MissingLocalHostname)), - 454 => Some(EventType::Smtp(SmtpEvent::MtPriorityDisabled)), - 455 => Some(EventType::Smtp(SmtpEvent::MtPriorityInvalid)), - 456 => Some(EventType::Smtp(SmtpEvent::MultipleMailFrom)), - 457 => Some(EventType::Smtp(SmtpEvent::Noop)), - 460 => Some(EventType::Smtp(SmtpEvent::Quit)), - 461 => Some(EventType::Smtp(SmtpEvent::RateLimitExceeded)), - 462 => Some(EventType::Smtp(SmtpEvent::RawInput)), - 463 => Some(EventType::Smtp(SmtpEvent::RawOutput)), - 464 => Some(EventType::Smtp(SmtpEvent::RcptTo)), - 465 => Some(EventType::Smtp(SmtpEvent::RcptToDuplicate)), - 466 => Some(EventType::Smtp(SmtpEvent::RcptToMissing)), - 467 => Some(EventType::Smtp(SmtpEvent::RcptToRewritten)), - 468 => Some(EventType::Smtp(SmtpEvent::RelayNotAllowed)), - 469 => Some(EventType::Smtp(SmtpEvent::IdNotFound)), - 470 => Some(EventType::Smtp(SmtpEvent::RequestTooLarge)), - 471 => Some(EventType::Smtp(SmtpEvent::RequireTlsDisabled)), - 472 => Some(EventType::Smtp(SmtpEvent::Rset)), - 473 => Some(EventType::Smtp(SmtpEvent::SpfEhloFail)), - 474 => Some(EventType::Smtp(SmtpEvent::SpfEhloPass)), - 475 => Some(EventType::Smtp(SmtpEvent::SpfFromFail)), - 476 => Some(EventType::Smtp(SmtpEvent::SpfFromPass)), - 477 => Some(EventType::Smtp(SmtpEvent::StartTls)), - 478 => Some(EventType::Smtp(SmtpEvent::StartTlsAlready)), - 479 => Some(EventType::Smtp(SmtpEvent::StartTlsUnavailable)), - 480 => Some(EventType::Smtp(SmtpEvent::SyntaxError)), - 481 => Some(EventType::Smtp(SmtpEvent::TimeLimitExceeded)), - 482 => Some(EventType::Smtp(SmtpEvent::TooManyInvalidRcpt)), - 483 => Some(EventType::Smtp(SmtpEvent::TooManyMessages)), - 484 => Some(EventType::Smtp(SmtpEvent::TooManyRecipients)), - 485 => Some(EventType::Smtp(SmtpEvent::TransferLimitExceeded)), - 486 => Some(EventType::Smtp(SmtpEvent::UnsupportedParameter)), - 487 => Some(EventType::Smtp(SmtpEvent::Vrfy)), - 488 => Some(EventType::Smtp(SmtpEvent::VrfyDisabled)), - 489 => Some(EventType::Smtp(SmtpEvent::VrfyNotFound)), - 490 => Some(EventType::Spam(SpamEvent::Classify)), - 491 => Some(EventType::Spam(SpamEvent::TrainSampleNotFound)), - 492 => Some(EventType::Store(StoreEvent::HttpStoreFetch)), - 493 => Some(EventType::Store(StoreEvent::HttpStoreError)), - 494 => Some(EventType::Spam(SpamEvent::PyzorError)), - 495 => Some(EventType::Spam(SpamEvent::TrainCompleted)), - 496 => Some(EventType::Spam(SpamEvent::ModelNotReady)), - 497 => Some(EventType::Spam(SpamEvent::ModelNotFound)), - 498 => Some(EventType::Spf(SpfEvent::Fail)), - 499 => Some(EventType::Spf(SpfEvent::Neutral)), - 500 => Some(EventType::Spf(SpfEvent::None)), - 501 => Some(EventType::Spf(SpfEvent::Pass)), - 502 => Some(EventType::Spf(SpfEvent::PermError)), - 503 => Some(EventType::Spf(SpfEvent::SoftFail)), - 504 => Some(EventType::Spf(SpfEvent::TempError)), - 505 => Some(EventType::Store(StoreEvent::AssertValueFailed)), - 506 => Some(EventType::Store(StoreEvent::BlobDelete)), - 507 => Some(EventType::Store(StoreEvent::BlobMissingMarker)), - 508 => Some(EventType::Store(StoreEvent::BlobRead)), - 509 => Some(EventType::Store(StoreEvent::BlobWrite)), - 510 => Some(EventType::Store(StoreEvent::CryptoError)), - 511 => Some(EventType::Store(StoreEvent::DataCorruption)), - 512 => Some(EventType::Store(StoreEvent::DataIterate)), - 513 => Some(EventType::Store(StoreEvent::DataWrite)), - 514 => Some(EventType::Store(StoreEvent::DecompressError)), - 515 => Some(EventType::Store(StoreEvent::DeserializeError)), - 516 => Some(EventType::Store(StoreEvent::ElasticsearchError)), - 517 => Some(EventType::Store(StoreEvent::FilesystemError)), - 518 => Some(EventType::Store(StoreEvent::FoundationdbError)), - 519 => Some(EventType::Store(StoreEvent::LdapWarning)), - 520 => Some(EventType::Store(StoreEvent::LdapError)), - 521 => Some(EventType::Store(StoreEvent::LdapQuery)), - 522 => Some(EventType::Store(StoreEvent::MysqlError)), - 523 => Some(EventType::Store(StoreEvent::NotConfigured)), - 524 => Some(EventType::Store(StoreEvent::NotFound)), - 525 => Some(EventType::Store(StoreEvent::NotSupported)), - 526 => Some(EventType::Store(StoreEvent::PoolError)), - 527 => Some(EventType::Store(StoreEvent::PostgresqlError)), - 528 => Some(EventType::Store(StoreEvent::RedisError)), - 529 => Some(EventType::Store(StoreEvent::RocksdbError)), - 530 => Some(EventType::Store(StoreEvent::S3Error)), - 531 => Some(EventType::Store(StoreEvent::SqlQuery)), - 532 => Some(EventType::Store(StoreEvent::SqliteError)), - 533 => Some(EventType::Store(StoreEvent::UnexpectedError)), - 534 => Some(EventType::Telemetry(TelemetryEvent::JournalError)), - 535 => Some(EventType::Telemetry(TelemetryEvent::LogError)), - 536 => Some(EventType::Telemetry(TelemetryEvent::OtelExporterError)), - 537 => Some(EventType::Telemetry( - TelemetryEvent::OtelMetricsExporterError, - )), - 538 => Some(EventType::Telemetry( - TelemetryEvent::PrometheusExporterError, - )), - 539 => Some(EventType::Telemetry(TelemetryEvent::WebhookError)), - 540 => Some(EventType::TlsRpt(TlsRptEvent::RecordFetch)), - 541 => Some(EventType::TlsRpt(TlsRptEvent::RecordFetchError)), - 542 => Some(EventType::Tls(TlsEvent::CertificateNotFound)), - 543 => Some(EventType::Tls(TlsEvent::Handshake)), - 544 => Some(EventType::Tls(TlsEvent::HandshakeError)), - 545 => Some(EventType::Tls(TlsEvent::MultipleCertificatesAvailable)), - 546 => Some(EventType::Tls(TlsEvent::NoCertificatesAvailable)), - 547 => Some(EventType::Tls(TlsEvent::NotConfigured)), - 548 => Some(EventType::Telemetry(TelemetryEvent::Alert)), - 549 => Some(EventType::Security(SecurityEvent::AbuseBan)), - 550 => Some(EventType::Security(SecurityEvent::LoiterBan)), - 551 => Some(EventType::Smtp(SmtpEvent::MailFromNotAllowed)), - 552 => Some(EventType::Security(SecurityEvent::Unauthorized)), - 553 => Some(EventType::Limit(LimitEvent::TenantQuota)), - 554 => Some(EventType::Auth(AuthEvent::TokenExpired)), - 555 => Some(EventType::Auth(AuthEvent::ClientRegistration)), - 556 => Some(EventType::Ai(AiEvent::LlmResponse)), - 557 => Some(EventType::Ai(AiEvent::ApiError)), - 558 => Some(EventType::Security(SecurityEvent::ScanBan)), - 559 => Some(EventType::Store(StoreEvent::AzureError)), - 560 => Some(EventType::TlsRpt(TlsRptEvent::RecordNotFound)), - 561 => Some(EventType::Smtp(SmtpEvent::RcptToGreylisted)), - 562 => Some(EventType::Spam(SpamEvent::Dnsbl)), - 563 => Some(EventType::Spam(SpamEvent::DnsblError)), - 564 => Some(EventType::Spam(SpamEvent::Pyzor)), - 48 => Some(EventType::Queue(QueueEvent::BackPressure)), - 57 => Some(EventType::Imap(ImapEvent::GetQuota)), - 147 => Some(EventType::WebDav(WebDavEvent::Propfind)), - 148 => Some(EventType::WebDav(WebDavEvent::Proppatch)), - 335 => Some(EventType::WebDav(WebDavEvent::Get)), - 336 => Some(EventType::WebDav(WebDavEvent::Report)), - 376 => Some(EventType::WebDav(WebDavEvent::Mkcol)), - 458 => Some(EventType::WebDav(WebDavEvent::Delete)), - 459 => Some(EventType::WebDav(WebDavEvent::Put)), - 565 => Some(EventType::WebDav(WebDavEvent::Post)), - 566 => Some(EventType::WebDav(WebDavEvent::Patch)), - 567 => Some(EventType::WebDav(WebDavEvent::Copy)), - 568 => Some(EventType::WebDav(WebDavEvent::Move)), - 569 => Some(EventType::WebDav(WebDavEvent::Lock)), - 570 => Some(EventType::WebDav(WebDavEvent::Unlock)), - 571 => Some(EventType::WebDav(WebDavEvent::Acl)), - 572 => Some(EventType::WebDav(WebDavEvent::Error)), - 573 => Some(EventType::WebDav(WebDavEvent::Options)), - 574 => Some(EventType::WebDav(WebDavEvent::Head)), - 575 => Some(EventType::WebDav(WebDavEvent::Mkcalendar)), - 576 => Some(EventType::Calendar(CalendarEvent::RuleExpansionError)), - 50 => Some(EventType::Store(StoreEvent::CacheMiss)), - 51 => Some(EventType::Store(StoreEvent::CacheHit)), - 52 => Some(EventType::Store(StoreEvent::CacheStale)), - 577 => Some(EventType::Store(StoreEvent::CacheUpdate)), - 578 => Some(EventType::TaskQueue(TaskQueueEvent::TaskAcquired)), - 579 => Some(EventType::Calendar(CalendarEvent::AlarmSent)), - 580 => Some(EventType::Calendar(CalendarEvent::AlarmSkipped)), - 581 => Some(EventType::Calendar(CalendarEvent::AlarmRecipientOverride)), - 582 => Some(EventType::Calendar(CalendarEvent::AlarmFailed)), - 583 => Some(EventType::Calendar(CalendarEvent::ItipMessageSent)), - 584 => Some(EventType::Calendar(CalendarEvent::ItipMessageReceived)), - 585 => Some(EventType::Calendar(CalendarEvent::ItipMessageError)), - 586 => Some(EventType::TaskQueue(TaskQueueEvent::TaskIgnored)), - 587 => Some(EventType::TaskQueue(TaskQueueEvent::TaskFailed)), - 588 => Some(EventType::Spam(SpamEvent::TrainStarted)), - 589 => Some(EventType::Spam(SpamEvent::ModelLoaded)), - 590 => Some(EventType::Store(StoreEvent::MeilisearchError)), - 591 => Some(EventType::Dns(DnsEvent::BuildError)), - 592 => Some(EventType::Dkim(DkimEvent::BuildError)), - _ => None, - } - } -} - impl Key { fn code(&self) -> u64 { match self { diff --git a/crates/trc/src/serializers/json.rs b/crates/trc/src/serializers/json.rs index 8c328343..8a0035de 100644 --- a/crates/trc/src/serializers/json.rs +++ b/crates/trc/src/serializers/json.rs @@ -4,7 +4,7 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ -use crate::{Error, Event, EventDetails, Key, Value}; +use crate::{Error, Event, EventDetails, EventType, Key, MetricType, Value}; use ahash::AHashSet; use base64::{Engine, engine::general_purpose::STANDARD}; use mail_parser::DateTime; @@ -91,7 +91,7 @@ impl>> Serialize for JsonEventSerializer { if self.with_id { map.serialize_entry( "id", - &format!("{}{}", event.inner.timestamp, event.inner.typ.id()), + &format!("{}{}", event.inner.timestamp, event.inner.typ.to_id()), )?; } if self.with_description { @@ -104,7 +104,7 @@ impl>> Serialize for JsonEventSerializer { "createdAt", &DateTime::from_timestamp(event.inner.timestamp as i64).to_rfc3339(), )?; - map.serialize_entry("type", event.inner.typ.name())?; + map.serialize_entry("type", event.inner.typ.as_str())?; map.serialize_entry( "data", &JsonEventSerializer { @@ -162,7 +162,7 @@ impl Serialize for JsonEventSerializer<&Error> { S: Serializer, { let mut map = serializer.serialize_map(None)?; - map.serialize_entry("type", self.inner.0.inner.name())?; + map.serialize_entry("type", self.inner.0.inner.as_str())?; if self.with_description { map.serialize_entry("text", self.inner.0.inner.description())?; } @@ -243,3 +243,41 @@ impl Serialize for JsonEventSerializer<&Vec> { seq.end() } } + +impl serde::Serialize for EventType { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(self.as_str()) + } +} + +impl<'de> serde::Deserialize<'de> for EventType { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let s = <&str>::deserialize(deserializer)?; + Self::parse(s).ok_or_else(|| serde::de::Error::unknown_variant(s, &[])) + } +} + +impl serde::Serialize for MetricType { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(self.as_str()) + } +} + +impl<'de> serde::Deserialize<'de> for MetricType { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let s = <&str>::deserialize(deserializer)?; + Self::parse(s).ok_or_else(|| serde::de::Error::unknown_variant(s, &[])) + } +} diff --git a/crates/trc/src/serializers/text.rs b/crates/trc/src/serializers/text.rs index 405bf799..1ac88117 100644 --- a/crates/trc/src/serializers/text.rs +++ b/crates/trc/src/serializers/text.rs @@ -105,7 +105,7 @@ impl FmtWriter { } self.writer.write_all(" (".as_bytes()).await?; self.writer - .write_all(event.inner.typ.name().as_bytes()) + .write_all(event.inner.typ.as_str().as_bytes()) .await?; self.writer @@ -240,7 +240,7 @@ impl FmtWriter { .write_all(e.0.inner.description().as_bytes()) .await?; self.writer.write_all(" (".as_bytes()).await?; - self.writer.write_all(e.0.inner.name().as_bytes()).await?; + self.writer.write_all(e.0.inner.as_str().as_bytes()).await?; self.writer.write_all(")".as_bytes()).await?; if !e.0.keys.is_empty() { self.writer @@ -354,7 +354,7 @@ impl Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.0.inner.description().fmt(f)?; " (".fmt(f)?; - self.0.inner.name().fmt(f)?; + self.0.inner.as_str().fmt(f)?; ")".fmt(f)?; if !self.0.keys.is_empty() { @@ -372,79 +372,3 @@ impl Display for Error { Ok(()) } } - -#[cfg(test)] -mod tests { - use crate::{EventType, Level}; - - #[allow(dead_code)] - fn to_camel_case(name: &str) -> String { - let mut out = String::with_capacity(name.len()); - let mut upper = true; - for ch in name.chars() { - if ch.is_alphanumeric() { - if upper { - out.push(ch.to_ascii_uppercase()); - upper = false; - } else { - out.push(ch); - } - } else { - upper = true; - } - } - out - } - - #[allow(dead_code)] - fn event_to_class(name: &str) -> String { - let (group, name) = name.split_once('.').unwrap(); - let group = to_camel_case(group); - format!( - "EventType::{}({}Event::{})", - group, - group, - to_camel_case(name) - ) - } - - #[allow(dead_code)] - fn event_to_webadmin_class(name: &str) -> String { - let (group, name) = name.split_once('.').unwrap(); - format!("{}{}", to_camel_case(group), to_camel_case(name)) - } - - #[test] - fn print_all_events() { - assert!(!Level::Disable.is_contained(Level::Warn)); - assert!(Level::Trace.is_contained(Level::Error)); - assert!(Level::Trace.is_contained(Level::Debug)); - assert!(!Level::Error.is_contained(Level::Trace)); - assert!(!Level::Debug.is_contained(Level::Trace)); - - let mut names = Vec::with_capacity(100); - - for event in EventType::variants() { - names.push((event.name(), event.description(), event.level().as_str())); - assert_eq!(EventType::try_parse(event.name()).unwrap(), event); - } - - // sort by name - names.sort_by(|a, b| a.0.cmp(b.0)); - - for (name, description, level) in names { - //println!("{:?},", name); - println!("|`{name}`|{description}|`{level}`|") - } - - //for (pos, (name, _, _)) in names.iter().enumerate() { - //println!("{:?},", name); - //println!("{} => Some({}),", pos, event_to_class(name)); - //println!("{} => {},", event_to_class(name), pos); - /*println!( - "#[serde(rename = \"{name}\")]\n{},", - event_to_webadmin_class(name) - );*/ - //} - } -} diff --git a/crates/utils/src/config/utils.rs b/crates/utils/src/config/utils.rs index b7611502..4616ddc6 100644 --- a/crates/utils/src/config/utils.rs +++ b/crates/utils/src/config/utils.rs @@ -642,7 +642,7 @@ impl ParseValue for trc::Level { impl ParseValue for trc::EventType { fn parse_value(value: &str) -> super::Result { - trc::EventType::try_parse(value).ok_or_else(|| format!("Unknown event type: {value}")) + trc::EventType::parse(value).ok_or_else(|| format!("Unknown event type: {value}")) } }