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
8pub struct TraceServiceImpl {
10 state: Arc<RwLock<State>>,
11}
12
13impl TraceServiceImpl {
14 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}