// Copyright 2019 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.
@available(added=7)
library fuchsia.metricbroker;

using fuchsia.mem;
using zx;

// Provides a service for components to register themselves as metric providers.
// When the Broker service comes up(if it comes up), it will request the
// provider's info.
@discoverable
protocol Registry {
    // Register `provider` with the metric registry. If and when the Registry service comes up,
    // will perform IPC to request the provider's `ProjectInfo`.
    RegisterMetricProvider(resource struct {
        provider client_end:Provider;
    }) -> (struct {
        status zx.status;
    });
};

// Represents a service that is interested in providing metrics to the Registry,
// such that at a later stage these will be mapped to consuming services based
// on the project configuration.
protocol Provider {
    // Returns a `ProjectInfo` with enough information for the metrics to be processed.
    GetProviderInfo() -> (resource struct {
        info ProviderInfo;
    }) error zx.status;
};

// Describes a collection of Inspect metrics, both where to read them from, and how to export them.
type InspectCollectionConfig = resource struct {
    inspect_config InspectConfig;
    inspect_source InspectSource;
};

// Information for identifying a metric provider and how should it be
// handled by the broker.
type ProviderInfo = resource struct {
    // Configuration data for connecting to the Cobalt service.
    // If empty, defaults are used from the calling program *somehow*.
    // TODO(gevalentino): fxbug.dev/4556
    cobalt_configuration box<CobaltProjectConfig>;

    // Configuration data for reading inspect data and passing it along over Cobalt.
    // May be empty, in which case no inspect data is collected.
    inspect_configuration box<InspectCollectionConfig>;
};

// Data needed for forwarding cobalt metrics.
type CobaltProjectConfig = resource struct {
    // Serialized cobalt project configuration.
    // If this is set, it will override the usage of project name.
    cobalt_configuration box<fuchsia.mem.Buffer>;

    // Project Name as expected by Cobalt Service.
    project_name string:<100, optional>;
};

type InspectSource = resource struct {
    // Inspection data served over a VMO.
    vmo zx.handle:VMO;
};

// The configuration that actually describes where to find data in the InspectSource and turn it
// into Cobalt metrics
type InspectConfig = flexible resource union {
    // Inline configuration information.
    1: buffer fuchsia.mem.Buffer;

    // Reference to a broker built-in project ID that contains the config data. This is useful
    // for components that do not have access to filesystems.
    2: project_name string:100;
};
