// Copyright 2017 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.cobalt;

/// A specification to identify a single Cobalt report.
type ReportSpec = table {
    /// The customer ID, as specified in Cobalt's metrics registry.
    1: customer_id uint32;

    /// The ID of the project, as specified in Cobalt's metrics registry.
    2: project_id uint32;

    /// The ID of the metric, as specified in Cobalt's metrics registry.
    3: metric_id uint32;

    /// The ID of the report, as specified in Cobalt's metrics registry.
    4: report_id uint32;
};

/// The Controller is primarily useful for testing the Cobalt service.
/// Cobalt clients should use the Logger.
@discoverable
protocol Controller {
    /// Requests that the collection of Observations that are currently cached
    /// locally be sent to the Cobalt server soon. Cobalt will send the
    /// Observations in one or more batches and will retry several times upon
    /// failure. The response occurs only after that procedure is completed. A
    /// return value of true indicates that all Observations were successfully
    /// sent. A return value of false indicates otherwise.
    RequestSendSoon() -> (struct {
        success bool;
    });

    /// The Cobalt FIDL service will block, not processing any further FIDL
    /// requests or responses, on either this interface or the Logger interface,
    /// until either `max_wait_seconds` have elapsed or the Cobalt service's
    /// worker thread has successfully sent all previously added Observations to
    /// the Shuffler. The response will be returned after the blocking period has
    /// ended. Note that this method does not request an expedited send and so it
    /// is possible that the worker thread is currently waiting for the next
    /// scheduled send time and so the empty state will not be achieved prior
    /// that time.
    BlockUntilEmpty(struct {
        max_wait_seconds uint32;
    }) -> ();

    /// These diagnostic stats are mostly useful in a testing environment but
    /// may possibly prove useful in production also.
    GetNumSendAttempts() -> (struct {
        num uint32;
    });
    GetFailedSendAttempts() -> (struct {
        num uint32;
    });
    GetNumObservationsAdded() -> (struct {
        num_obs uint64;
    });
    GetNumEventAggregatorRuns() -> (struct {
        num_runs uint64;
    });

    /// Triggers Cobalt to generate Observations based on locally aggregated
    /// event data and write them to the local ObservationStore. In a non-test
    /// environment this would normally be done periodically by a background
    /// thread. In a test environment this method should be invoked against an
    /// instance of the Cobalt FIDL service that was passed the flag
    /// --start_event_aggregator_worker=false.
    ///
    /// `day_index` The index of the day for which locally aggregated
    ///             Observations should be generated.
    ///
    /// `report_specs` A vector of specifications identifying the reports to
    ///                return the number of observations for.
    ///
    /// Returns a vector whose k-th element is the number of observations
    /// generated for the k-th element of `report_specs`. If `report_specs`
    /// is the empty vector, then an empty vector is returned.
    GenerateAggregatedObservations(struct {
        day_index uint32;
        report_specs vector<ReportSpec>:MAX;
    }) -> (struct {
        num_obs vector<uint64>:MAX;
    });

    /// Requests that the caller be notified after the Cobalt FIDL service
    /// is in the fully-initialized state.
    ///
    /// Cobalt starts serving requests before it is fully initialized. In this
    /// pre-initialized state it will buffer incoming log events in memory
    /// but not complete their processing. After Cobalt becomes fully
    /// initialized the events in the bufer are fully processed.
    ///
    /// A partial list of things that must happen before Cobalt enters the
    /// fully-initialized state are:
    ///
    /// - Cobalt must by notified by the timekeeper service that the system
    ///   clock has become accurate--usually because the time has been
    ///   fetched from a trusted network resource.
    ///
    /// The callback to this method will be invoked after Cobalt transistions
    // to the fully-initialized state. This may never happen.
    ListenForInitialized() -> ();
};
