From 04ad4035f95bdeed708dbae1faedac8971a038bf Mon Sep 17 00:00:00 2001 From: Chris Beck Date: Fri, 5 Dec 2025 22:16:31 -0700 Subject: [PATCH] alternative summary specification --- signal-gateway/src/gateway/log_handler.rs | 4 +-- signal-gateway/src/gateway/mod.rs | 40 ++++++++++++++++++----- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/signal-gateway/src/gateway/log_handler.rs b/signal-gateway/src/gateway/log_handler.rs index 425bff8..526e9f1 100644 --- a/signal-gateway/src/gateway/log_handler.rs +++ b/signal-gateway/src/gateway/log_handler.rs @@ -1,6 +1,6 @@ use super::log_buffer::LogBuffer; use super::route::{Destination, Limit, Route}; -use super::{LimitResult, Limiter, LimiterSet, SignalAlertMessage}; +use super::{LimitResult, Limiter, LimiterSet, SignalAlertMessage, Summary}; use crate::{ concurrent_map::ConcurrentMap, log_format::LogFormatConfig, @@ -203,7 +203,7 @@ impl LogHandler { origin: Some(origin), text, attachment_paths: Default::default(), - summary: None, + summary: Summary::Prefix(512), destination_override, }) { error!("Could not send alert message, queue is closed"); diff --git a/signal-gateway/src/gateway/mod.rs b/signal-gateway/src/gateway/mod.rs index d42de3e..5ad361e 100644 --- a/signal-gateway/src/gateway/mod.rs +++ b/signal-gateway/src/gateway/mod.rs @@ -159,6 +159,21 @@ fn parse_gateway_command(s: &str) -> Result { .map_err(|e| e.to_string()) } +/// Summary for logging an alert message. +#[derive(Clone, Debug)] +enum Summary { + /// Use a prefix of the message text (capped at 512 chars). + Prefix(usize), + /// Use an owned summary string. + Owned(Box), +} + +impl Default for Summary { + fn default() -> Self { + Summary::Prefix(512) + } +} + /// A message queued to be sent to all admins. /// This is generally an alert message, which may have attached images. #[derive(Clone, Debug, Default)] @@ -168,13 +183,25 @@ struct SignalAlertMessage { text: String, attachment_paths: Vec, /// Short summary for logging (e.g., alert names for prometheus). - /// If None, the consumer will use a truncated slice of `text` for logging. - summary: Option, + summary: Summary, /// Optional destination override from route configuration. /// If present, overrides the default alert destination. destination_override: Option, } +impl SignalAlertMessage { + /// Get the summary string for logging. + fn get_summary(&self) -> &str { + match &self.summary { + Summary::Owned(s) => s, + Summary::Prefix(n) => { + let len = self.text.len().min(*n).min(512); + &self.text[..len] + } + } + } +} + /// The gateway manages sending messages to signal-cli and receiving messages from signal-cli. /// It maintains a queue of messages to be sent to all admins, generated by alerts etc. /// It also subscribes to messages received from signal and processes them one-by-one, @@ -380,12 +407,7 @@ impl Gateway { }, outbound_admin_msg = signal_alert_mq_rx.recv() => { if let Some(msg) = outbound_admin_msg { - // Log summary, or first 500 bytes of text if no summary provided - let summary = msg.summary.as_deref().unwrap_or_else(|| { - let len = msg.text.len().min(500); - &msg.text[..len] - }); - info!("Sending alert: {summary}"); + info!("Sending alert: {}", msg.get_summary()); // Prepend origin line if present let message = if let Some(origin) = &msg.origin { format!("[{origin}]\n{}", msg.text) @@ -767,7 +789,7 @@ impl Gateway { origin: None, // Prometheus alerts don't have a syslog origin text, attachment_paths, - summary: Some(summary), + summary: Summary::Owned(summary.into()), destination_override: None, }) .map_err(|_err| {