CORE: added prom metrics on /metrics
Build and Publish / Build and Publish Docker Image (push) Successful in 2m2s

This commit is contained in:
2026-06-01 16:08:49 +03:00
parent 88b5c7f7d1
commit 27ee56c5b7
14 changed files with 1097 additions and 16 deletions
+11 -1
View File
@@ -128,13 +128,21 @@ pub async fn find_best_cover(folder: &Path, audio_files: &[PathBuf]) -> Option<C
match tokio::fs::read(img_path).await {
Ok(data) if !data.is_empty() => {
let mime = mime_for_image(img_path);
crate::metrics::record_agent_cover_lookup("folder", "ok", data.len());
return Some(CoverImage {
data,
mime_type: mime,
source: CoverSource::FolderFile(img_path.clone()),
});
}
_ => continue,
Ok(_) => {
crate::metrics::record_agent_cover_lookup("folder", "empty", 0);
continue;
}
Err(_) => {
crate::metrics::record_agent_cover_lookup("folder", "error", 0);
continue;
}
}
}
@@ -143,10 +151,12 @@ pub async fn find_best_cover(folder: &Path, audio_files: &[PathBuf]) -> Option<C
let path = audio_path.to_path_buf();
let result = tokio::task::spawn_blocking(move || extract_embedded_cover(&path)).await;
if let Ok(Some(cover)) = result {
crate::metrics::record_agent_cover_lookup("embedded", "ok", cover.data.len());
return Some(cover);
}
}
crate::metrics::record_agent_cover_lookup("none", "not_found", 0);
None
}
+18 -2
View File
@@ -74,6 +74,7 @@ fn generate_missing_variants_sync(
let mut created = 0usize;
for variant in variants {
let start = std::time::Instant::now();
let path = variant_path(original_path, *variant);
if path.exists() {
continue;
@@ -88,12 +89,27 @@ fn generate_missing_variants_sync(
.to_rgb8();
let mut output = Vec::new();
let mut encoder = JpegEncoder::new_with_quality(&mut output, variant.quality);
encoder.encode(
let result = encoder.encode(
&resized,
resized.width(),
resized.height(),
image::ExtendedColorType::Rgb8,
)?;
);
match result {
Ok(()) => crate::metrics::record_agent_cover_variant(
variant.name,
"ok",
start.elapsed(),
),
Err(err) => {
crate::metrics::record_agent_cover_variant(
variant.name,
"error",
start.elapsed(),
);
return Err(err.into());
}
}
std::fs::write(path, output)?;
created += 1;
}
+30 -2
View File
@@ -330,6 +330,7 @@ pub async fn normalize_batch(
// If over 80% of context limit and more than 1 file, split
let limit_80 = context_limit * 80 / 100;
if estimated > limit_80 && files.len() > 1 {
crate::metrics::record_agent_llm_split("estimated_context");
tracing::info!(
estimated_tokens = estimated,
context_limit,
@@ -419,6 +420,7 @@ pub async fn normalize_batch(
|| err_str.contains("length")
|| err_str.contains("token");
if is_context_error {
crate::metrics::record_agent_llm_split("context_error");
tracing::warn!(
file_count = files.len(),
"LLM error suggests context overflow, splitting batch: {e}"
@@ -466,14 +468,40 @@ pub async fn normalize_batch(
}
return Err(e);
}
Err(e) => return Err(e),
Err(e) => {
crate::metrics::record_agent_llm(
llm_model,
"error",
std::time::Duration::from_millis(duration_ms),
0,
0,
files.len(),
Some(estimated),
);
return Err(e);
}
};
let prompt_tokens = usage.prompt_tokens.unwrap_or(0) as u64;
let completion_tokens = usage.completion_tokens.unwrap_or(0) as u64;
crate::metrics::record_agent_llm(
&resp_model,
"ok",
std::time::Duration::from_millis(duration_ms),
prompt_tokens,
completion_tokens,
files.len(),
Some(estimated),
);
// Parse batch response
let results = parse_batch_response(&response_text, &files)?;
let results = match parse_batch_response(&response_text, &files) {
Ok(results) => results,
Err(error) => {
crate::metrics::record_agent_llm_parse_failure(&resp_model);
return Err(error);
}
};
Ok(BatchNormalizeResult {
results,