Skip to content

Commit ad026eb

Browse files
chore: server side improvements
1. increase dataset fields limit to 1000 2. add hostname to manifest file path 3. update hostname handling 4. list alerts to be sorted on state and then on severity
1 parent ecdb27f commit ad026eb

File tree

4 files changed

+60
-5
lines changed

4 files changed

+60
-5
lines changed

src/cli.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use crate::{
3535
pub const DEFAULT_USERNAME: &str = "admin";
3636
pub const DEFAULT_PASSWORD: &str = "admin";
3737

38-
pub const DATASET_FIELD_COUNT_LIMIT: usize = 250;
38+
pub const DATASET_FIELD_COUNT_LIMIT: usize = 1000;
3939
#[derive(Parser)]
4040
#[command(
4141
name = "parseable",

src/handlers/http/alerts.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,42 @@ pub async fn list(req: HttpRequest) -> Result<impl Responder, AlertError> {
6161
};
6262

6363
let alerts = alerts.list_alerts_for_user(session_key, tags_list).await?;
64-
let alerts_summary = alerts
64+
let mut alerts_summary = alerts
6565
.iter()
6666
.map(|alert| alert.to_summary())
6767
.collect::<Vec<_>>();
68+
69+
// Sort by state priority (Triggered > Silenced > Resolved) then by severity (Critical > High > Medium > Low)
70+
alerts_summary.sort_by(|a, b| {
71+
// Helper function to convert state to priority number (lower number = higher priority)
72+
let state_priority = |state: &str| match state {
73+
"Triggered" => 0,
74+
"Silenced" => 1,
75+
"Resolved" => 2,
76+
_ => 3, // Unknown state gets lowest priority
77+
};
78+
79+
// Helper function to convert severity to priority number (lower number = higher priority)
80+
let severity_priority = |severity: &str| match severity {
81+
"Critical" => 0,
82+
"High" => 1,
83+
"Medium" => 2,
84+
"Low" => 3,
85+
_ => 4, // Unknown severity gets lowest priority
86+
};
87+
88+
let state_a = a.get("state").and_then(|v| v.as_str()).unwrap_or("");
89+
let state_b = b.get("state").and_then(|v| v.as_str()).unwrap_or("");
90+
91+
let severity_a = a.get("severity").and_then(|v| v.as_str()).unwrap_or("");
92+
let severity_b = b.get("severity").and_then(|v| v.as_str()).unwrap_or("");
93+
94+
// First sort by state, then by severity
95+
state_priority(state_a)
96+
.cmp(&state_priority(state_b))
97+
.then_with(|| severity_priority(severity_a).cmp(&severity_priority(severity_b)))
98+
});
99+
68100
Ok(web::Json(alerts_summary))
69101
}
70102

src/parseable/streams.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ use parquet::{
4141
use relative_path::RelativePathBuf;
4242
use tokio::task::JoinSet;
4343
use tracing::{error, info, trace, warn};
44+
use ulid::Ulid;
4445

4546
use crate::{
4647
LOCK_EXPECT, OBJECT_STORE_DATA_GRANULARITY,
@@ -185,7 +186,15 @@ impl Stream {
185186
parsed_timestamp: NaiveDateTime,
186187
custom_partition_values: &HashMap<String, String>,
187188
) -> String {
188-
let mut hostname = hostname::get().unwrap().into_string().unwrap();
189+
let mut hostname = hostname::get()
190+
.unwrap_or_else(|_| std::ffi::OsString::from(&Ulid::new().to_string()))
191+
.into_string()
192+
.unwrap_or_else(|_| Ulid::new().to_string())
193+
.chars()
194+
.filter(|c| c.is_alphanumeric() || *c == '-' || *c == '_')
195+
.collect::<String>()
196+
.chars()
197+
.collect::<String>();
189198
if let Some(id) = &self.ingestor_id {
190199
hostname.push_str(id);
191200
}

src/storage/object_storage.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,15 +1011,29 @@ pub fn target_json_path(target_id: &Ulid) -> RelativePathBuf {
10111011

10121012
#[inline(always)]
10131013
pub fn manifest_path(prefix: &str) -> RelativePathBuf {
1014+
let hostname = hostname::get()
1015+
.unwrap_or_else(|_| std::ffi::OsString::from(&Ulid::new().to_string()))
1016+
.into_string()
1017+
.unwrap_or_else(|_| Ulid::new().to_string())
1018+
.chars()
1019+
.filter(|c| c.is_alphanumeric() || *c == '-' || *c == '_')
1020+
.collect::<String>()
1021+
.chars()
1022+
.collect::<String>();
1023+
10141024
match &PARSEABLE.options.mode {
10151025
Mode::Ingest => {
10161026
let id = INGESTOR_META
10171027
.get()
10181028
.unwrap_or_else(|| panic!("{}", INGESTOR_EXPECT))
10191029
.get_node_id();
1020-
let manifest_file_name = format!("ingestor.{id}.{MANIFEST_FILE}");
1030+
1031+
let manifest_file_name = format!("ingestor.{hostname}.{id}.{MANIFEST_FILE}");
1032+
RelativePathBuf::from_iter([prefix, &manifest_file_name])
1033+
}
1034+
_ => {
1035+
let manifest_file_name = format!("{hostname}.{MANIFEST_FILE}");
10211036
RelativePathBuf::from_iter([prefix, &manifest_file_name])
10221037
}
1023-
_ => RelativePathBuf::from_iter([prefix, MANIFEST_FILE]),
10241038
}
10251039
}

0 commit comments

Comments
 (0)