Improve error logging

This commit is contained in:
Aode (lion) 2021-09-20 13:19:50 -05:00
parent 14ef8162c7
commit 0048248f32
3 changed files with 40 additions and 8 deletions

2
Cargo.lock generated
View file

@ -1265,7 +1265,7 @@ dependencies = [
[[package]] [[package]]
name = "pict-rs-aggregator" name = "pict-rs-aggregator"
version = "0.1.10" version = "0.1.11"
dependencies = [ dependencies = [
"actix-rt", "actix-rt",
"actix-web", "actix-web",

View file

@ -1,7 +1,7 @@
[package] [package]
name = "pict-rs-aggregator" name = "pict-rs-aggregator"
description = "A simple image aggregation service for pict-rs" description = "A simple image aggregation service for pict-rs"
version = "0.1.10" version = "0.1.11"
authors = ["asonix <asonix@asonix.dog>"] authors = ["asonix <asonix@asonix.dog>"]
license = "AGPL-3.0" license = "AGPL-3.0"
readme = "README.md" readme = "README.md"

View file

@ -14,6 +14,7 @@ use std::{
time::SystemTime, time::SystemTime,
}; };
use structopt::StructOpt; use structopt::StructOpt;
use tracing_error::SpanTrace;
use url::Url; use url::Url;
use uuid::Uuid; use uuid::Uuid;
@ -339,19 +340,50 @@ impl ResponseError for StateError {
fn error_response(&self) -> HttpResponse { fn error_response(&self) -> HttpResponse {
match rendered( match rendered(
|cursor| self::templates::error(cursor, &self.error.to_string(), &self.state), |cursor| self::templates::error(cursor, &self.error.kind.to_string(), &self.state),
HttpResponse::build(self.status_code()), HttpResponse::build(self.status_code()),
) { ) {
Ok(res) => res, Ok(res) => res,
Err(_) => HttpResponse::build(self.status_code()) Err(_) => HttpResponse::build(self.status_code())
.content_type(mime::TEXT_PLAIN.essence_str()) .content_type(mime::TEXT_PLAIN.essence_str())
.body(self.error.to_string()), .body(self.error.kind.to_string()),
}
}
}
#[derive(Debug)]
struct Error {
context: SpanTrace,
kind: ErrorKind,
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}\n", self.kind)?;
std::fmt::Display::fmt(&self.context, f)
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
self.kind.source()
}
}
impl<T> From<T> for Error
where
ErrorKind: From<T>,
{
fn from(error: T) -> Self {
Error {
context: SpanTrace::capture(),
kind: error.into(),
} }
} }
} }
#[derive(Debug, thiserror::Error)] #[derive(Debug, thiserror::Error)]
enum Error { enum ErrorKind {
#[error("{0}")] #[error("{0}")]
Render(#[from] std::io::Error), Render(#[from] std::io::Error),
@ -455,13 +487,13 @@ async fn upload(
let images = conn.upload(&req, pl).await.stateful(&state)?; let images = conn.upload(&req, pl).await.stateful(&state)?;
if images.is_err() { if images.is_err() {
return Err(Error::UploadString(images.message().to_owned())).stateful(&state); return Err(ErrorKind::UploadString(images.message().to_owned())).stateful(&state);
} }
let image = images let image = images
.files() .files()
.next() .next()
.ok_or_else(|| Error::UploadString("Missing file".to_owned())) .ok_or_else(|| ErrorKind::UploadString("Missing file".to_owned()))
.stateful(&state)?; .stateful(&state)?;
let entry = Entry { let entry = Entry {
@ -762,7 +794,7 @@ async fn delete_collection(
for rx in future_vec { for rx in future_vec {
results.push( results.push(
rx.await rx.await
.map_err(|_| Error::UploadString("Canceled".to_string())) .map_err(|_| ErrorKind::UploadString("Canceled".to_string()))
.stateful(&state)?, .stateful(&state)?,
); );
} }