// Copyright 2020 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.

library fuchsia.legacymetrics;

/// Accepts metrics events and uploads them to UMA servers for analysis. Metrics
/// events are batched and uploaded at a regular interval. If this service is
/// unable to upload events, it will try persisting them for later re-upload.
/// For similar behavior, see Chromium's MetricsService:
/// https://chromium.googlesource.com/chromium/src.git/+/refs/heads/master/components/metrics/metrics_service.cc
[Discoverable]
protocol MetricsRecorder {
    /// Processes and enqueues a batch of events for upload. Returns after the
    /// provided metrics are successfully processed by the service. Clients
    /// should wait for a completion callback before sending subsequent Record()
    /// requests.
    Record(vector<Event>:MAX events) -> ();

    /// Indicates that this service will close all connections soon. Upon
    /// receiving this event, each client should call Record() once for any
    /// available metrics and close its connection to this sevice. Otherwise,
    /// this service will close all incoming connections after a predefined
    /// timeout starting from the moment it broadcasts this event.
    -> OnCloseSoon();
};
