blob: e2584795c5dadf62cc94f28743f2ef5de147c1e7 [file] [log] [blame]
// Copyright 2022 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.
#ifndef SRC_LIB_METRICS_BUFFER_METRICS_IMPL_H_
#define SRC_LIB_METRICS_BUFFER_METRICS_IMPL_H_
#include <fidl/fuchsia.io/cpp/fidl.h>
#include <fidl/fuchsia.metrics/cpp/fidl.h>
namespace cobalt {
// This class connects to the MetricsEventLoggerFactory and MetricsEventLogger fidl endpoints, and
// will re-connect starting with the fuchsia.io.Directory if an error occurs. The failing call is
// not retried.
class MetricsImpl {
public:
// called on dispatcher thread
explicit MetricsImpl(async_dispatcher_t* dispatcher,
fidl::ClientEnd<fuchsia_io::Directory> directory, uint32_t project_id);
// This is called on the dispatcher thread, with guarantee that anything queued to the dispatcher
// during LogMetricEvents will run before ~MetricsImpl.
~MetricsImpl() = default;
// This is called on an arbitrary thread which is not the dispatcher thread, with guarantee that
// ~MetricsImpl will be queued to the dispatcher after anything queued to the dispatcher by this
// call.
void LogMetricEvents(std::vector<fuchsia_metrics::MetricEvent> events);
private:
const uint32_t project_id_ = 0;
async_dispatcher_t* dispatcher_ = nullptr;
fidl::ClientEnd<fuchsia_io::Directory> directory_;
// These are wrapped in std::optional<> because destruction is (as of this comment) the only way
// to unbind even if there's an async response in flight.
std::optional<fidl::Client<fuchsia_metrics::MetricEventLoggerFactory>> logger_factory_;
std::optional<fidl::Client<fuchsia_metrics::MetricEventLogger>> logger_;
// called on dispatcher thread
bool EnsureConnected();
// called on dispatcher thread
void Connect();
};
} // namespace cobalt
#endif // SRC_LIB_METRICS_BUFFER_METRICS_IMPL_H_