cronback_lib/
grpc_helpers.rs

1use tonic::service::Interceptor;
2
3use crate::model::ValidShardedId;
4use crate::prelude::*;
5use crate::types::{ProjectId, RequestId};
6
7#[derive(Debug, Clone)]
8pub struct RequestContext {
9    pub request_id: RequestId,
10    pub project_id: ValidShardedId<ProjectId>,
11}
12
13impl RequestContext {
14    pub fn new(
15        request_id: RequestId,
16        project_id: ValidShardedId<ProjectId>,
17    ) -> Self {
18        Self {
19            request_id,
20            project_id,
21        }
22    }
23}
24
25// Injects tracing headers (x-parent-span-id, and x-cronback-request-id) into
26// outgoing gRPC requests
27pub struct GrpcRequestInterceptor {
28    pub project_id: Option<ValidShardedId<ProjectId>>,
29    pub request_id: Option<RequestId>,
30}
31
32impl Interceptor for GrpcRequestInterceptor {
33    fn call(
34        &mut self,
35        mut req: tonic::Request<()>,
36    ) -> Result<tonic::Request<()>, tonic::Status> {
37        if let Some(span_id) = tracing::Span::current().id() {
38            let span_id = format!("{}", span_id.into_u64());
39            req.metadata_mut()
40                .insert(PARENT_SPAN_HEADER, span_id.parse().unwrap());
41        }
42
43        if let Some(ref request_id) = self.request_id {
44            // Injects request-id to request metadata to avoid sending in every
45            // message payload.
46            req.metadata_mut().set_request_id(request_id.clone());
47        }
48
49        if let Some(ref project_id) = self.project_id {
50            // Injects project-id to request metadata to avoid sending in every
51            // message payload.
52            req.metadata_mut().set_project_id(project_id.clone());
53        }
54        Ok(req)
55    }
56}