rama_http/layer/trace/
on_failure.rs1use super::{DEFAULT_ERROR_LEVEL, Latency};
2use rama_core::telemetry::tracing::{Level, Span};
3use rama_utils::latency::LatencyUnit;
4use std::{fmt, time::Duration};
5
6pub trait OnFailure<FailureClass>: Send + Sync + 'static {
13 fn on_failure(&self, failure_classification: FailureClass, latency: Duration, span: &Span);
25}
26
27impl<FailureClass> OnFailure<FailureClass> for () {
28 #[inline]
29 fn on_failure(&self, _: FailureClass, _: Duration, _: &Span) {}
30}
31
32impl<F, FailureClass> OnFailure<FailureClass> for F
33where
34 F: Fn(FailureClass, Duration, &Span) + Send + Sync + 'static,
35{
36 fn on_failure(&self, failure_classification: FailureClass, latency: Duration, span: &Span) {
37 self(failure_classification, latency, span)
38 }
39}
40
41#[derive(Clone, Debug)]
45pub struct DefaultOnFailure {
46 level: Level,
47 latency_unit: LatencyUnit,
48}
49
50impl Default for DefaultOnFailure {
51 fn default() -> Self {
52 Self {
53 level: DEFAULT_ERROR_LEVEL,
54 latency_unit: LatencyUnit::Millis,
55 }
56 }
57}
58
59impl DefaultOnFailure {
60 #[must_use]
62 pub fn new() -> Self {
63 Self::default()
64 }
65
66 rama_utils::macros::generate_set_and_with! {
67 pub fn level(mut self, level: Level) -> Self {
73 self.level = level;
74 self
75 }
76 }
77
78 rama_utils::macros::generate_set_and_with! {
79 pub fn latency_unit(mut self, latency_unit: LatencyUnit) -> Self {
83 self.latency_unit = latency_unit;
84 self
85 }
86 }
87}
88
89impl<FailureClass> OnFailure<FailureClass> for DefaultOnFailure
90where
91 FailureClass: fmt::Display,
92{
93 fn on_failure(&self, failure_classification: FailureClass, latency: Duration, span: &Span) {
94 let latency = Latency {
95 unit: self.latency_unit,
96 duration: latency,
97 };
98 event_dynamic_lvl!(
99 parent: span,
100 self.level,
101 classification = %failure_classification,
102 %latency,
103 "response failed"
104 );
105 }
106}