use opentelemetry_proto::tonic::collector::trace::v1::{
ExportTraceServiceRequest, ExportTraceServiceResponse,
};
use re_protos::trace_id_layer::RERUN_HTTP_HEADER_REQUEST_TRACE_ID;
use re_uri::Origin;
const EXPORT_PATH: &str = "/opentelemetry.proto.collector.trace.v1.TraceService/Export";
#[derive(Clone, Debug)]
pub struct ConnectionAnalyticsExporter {
origin: Origin,
service: crate::grpc::RedapClientStack,
}
impl ConnectionAnalyticsExporter {
pub(crate) fn from_remote_service(
origin: Origin,
service: crate::grpc::RedapClientStack,
) -> Self {
Self { origin, service }
}
pub fn origin(&self) -> &Origin {
&self.origin
}
pub async fn export_trace(
&self,
request: ExportTraceServiceRequest,
trace_id: Option<opentelemetry::TraceId>,
) -> tonic::Result<()> {
let mut grpc = tonic::client::Grpc::new(self.service.clone());
let mut request = tonic::Request::new(request);
if let Some(trace_id) = trace_id
&& let Ok(value) = trace_id.to_string().parse()
{
request
.metadata_mut()
.insert(RERUN_HTTP_HEADER_REQUEST_TRACE_ID, value);
}
grpc.ready().await.map_err(|err| {
tonic::Status::unavailable(format!("analytics channel not ready: {err}"))
})?;
let path = http::uri::PathAndQuery::from_static(EXPORT_PATH);
let codec = tonic_prost::ProstCodec::default();
let _response: tonic::Response<ExportTraceServiceResponse> =
grpc.unary(request, path, codec).await?;
Ok(())
}
}