use osproxy_core::{
ClusterId, EndpointKind, Epoch, ErrorContext, FieldName, IndexName, PartitionId, TraceContext,
};
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct IngressInfo {
pub protocol: &'static str,
pub tls_suite: Option<&'static str>,
pub tls_reused: Option<bool>,
}
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct ClassifyInfo {
pub endpoint: EndpointKind,
pub logical_index: IndexName,
}
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct ResolveInfo {
pub partition: PartitionId,
pub placement_kind: &'static str,
pub cluster: ClusterId,
pub index: IndexName,
pub epoch: Epoch,
pub inject_fields: Vec<FieldName>,
pub routing: bool,
pub migration: &'static str,
}
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct RewriteInfo {
pub transform_kind: &'static str,
pub body_bytes: usize,
}
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct DispatchInfo {
pub cluster: ClusterId,
pub upstream_status: u16,
pub pool_reuse: bool,
}
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct EgressInfo {
pub status: u16,
pub response_bytes: usize,
}
#[derive(Clone, PartialEq, Eq, Debug, Default)]
pub struct RequestTrace {
pub(crate) context: Option<TraceContext>,
pub(crate) ingress: Option<IngressInfo>,
pub(crate) classify: Option<ClassifyInfo>,
pub(crate) resolve: Option<ResolveInfo>,
pub(crate) rewrite: Option<RewriteInfo>,
pub(crate) dispatch: Option<DispatchInfo>,
pub(crate) egress: Option<EgressInfo>,
pub(crate) error: Option<ErrorContext>,
}
impl RequestTrace {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn record_context(&mut self, context: TraceContext) {
self.context = Some(context);
}
#[must_use]
pub fn context(&self) -> Option<&TraceContext> {
self.context.as_ref()
}
#[must_use]
pub fn resolved_partition(&self) -> Option<&PartitionId> {
self.resolve.as_ref().map(|r| &r.partition)
}
pub fn record_ingress(&mut self, info: IngressInfo) {
self.ingress = Some(info);
}
pub fn record_classify(&mut self, info: ClassifyInfo) {
self.classify = Some(info);
}
pub fn record_resolve(&mut self, info: ResolveInfo) {
self.resolve = Some(info);
}
pub fn record_rewrite(&mut self, info: RewriteInfo) {
self.rewrite = Some(info);
}
pub fn record_dispatch(&mut self, info: DispatchInfo) {
self.dispatch = Some(info);
}
pub fn record_egress(&mut self, info: EgressInfo) {
self.egress = Some(info);
}
pub fn record_error(&mut self, error: ErrorContext) {
self.error = Some(error);
}
#[must_use]
pub fn failed(&self) -> bool {
self.error.is_some()
}
}