Skip to main content

otlp_embedded/
service.rs

1use crate::proto::collector::trace::v1::{trace_service_server::TraceService, *};
2use std::sync::Arc;
3use tokio::sync::RwLock;
4use tonic::{Request, Response, Status};
5
6use crate::State;
7
8/// The implementation of [`TraceService`].
9pub struct TraceServiceImpl {
10    state: Arc<RwLock<State>>,
11}
12
13impl TraceServiceImpl {
14    /// Create a new [`TraceServiceImpl`] with the given [`State`] reference.
15    pub fn new(state: Arc<RwLock<State>>) -> Self {
16        Self { state }
17    }
18}
19
20#[tonic::async_trait]
21impl TraceService for TraceServiceImpl {
22    async fn export(
23        &self,
24        request: Request<ExportTraceServiceRequest>,
25    ) -> std::result::Result<Response<ExportTraceServiceResponse>, Status> {
26        let request = request.into_inner();
27
28        let mut state = self.state.write().await;
29        for resource_spans in request.resource_spans {
30            state.apply(resource_spans);
31        }
32
33        Ok(Response::new(ExportTraceServiceResponse {
34            partial_success: None,
35        }))
36    }
37}