blob: b9abdc64c734c5b2b6f0a9eed653102da85eb5cf [file] [log] [blame]
// Copyright 2023 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use {
fidl_fuchsia_metrics::{
MetricEventLoggerFactoryRequest, MetricEventLoggerFactoryRequestStream,
MetricEventLoggerRequestStream,
},
fuchsia_component_test::LocalComponentHandles,
futures::StreamExt as _,
};
/// Registers a discoverable endpoint for connecting to `fuchsia.metrics.MetricEventLoggerFactory`.
///
/// Requests to create a logger will always succeed, and the metrics reported via those loggers
/// will always succeed, silently discarding the metrics provided to
/// `fuchsia.metrics.MetricEventLogger`.
pub(crate) async fn serve_metric_event_logger_factory(
handles: LocalComponentHandles,
) -> Result<(), anyhow::Error> {
let mut fs = fuchsia_component::server::ServiceFs::new();
fs.dir("svc").add_fidl_service(|stream: MetricEventLoggerFactoryRequestStream| stream);
fs.serve_connection(handles.outgoing_dir)?;
fs.for_each_concurrent(0, handle_metric_event_logger_factory_request_stream).await;
Ok(())
}
async fn handle_metric_event_logger_factory_request_stream(
mut stream: MetricEventLoggerFactoryRequestStream,
) {
while let Some(request) = stream.next().await {
match request {
Ok(MetricEventLoggerFactoryRequest::CreateMetricEventLogger {
logger,
responder,
..
}) => {
// `ok()`: Bad logger channel is fine.
logger.into_stream().ok().map(|s| {
fuchsia_async::Task::local(handle_metric_event_logger_client(s)).detach();
});
responder.send(Ok(())).ok();
}
Ok(MetricEventLoggerFactoryRequest::CreateMetricEventLoggerWithExperiments {
logger,
responder,
..
}) => {
// `ok()`: Bad logger channel is fine.
logger.into_stream().ok().map(|s| {
fuchsia_async::Task::local(handle_metric_event_logger_client(s)).detach();
});
responder.send(Ok(())).ok();
}
Err(_) => (), // Causing errors on the metrics logger factory is fine
}
}
}
async fn handle_metric_event_logger_client(mut stream: MetricEventLoggerRequestStream) {
use fidl_fuchsia_metrics::MetricEventLoggerRequest::*;
while let Some(request) = stream.next().await {
match request {
Ok(LogOccurrence { responder, .. }) => {
responder.send(Ok(())).ok();
}
Ok(LogInteger { responder, .. }) => {
responder.send(Ok(())).ok();
}
Ok(LogIntegerHistogram { responder, .. }) => {
responder.send(Ok(())).ok();
}
Ok(LogString { responder, .. }) => {
responder.send(Ok(())).ok();
}
Ok(LogMetricEvents { responder, .. }) => {
responder.send(Ok(())).ok();
}
Err(_) => (), // Causing errors on the metrics logger is fine
}
}
}