// Copyright 2018 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.
syntax = "proto3";

package cobalt;

import "config/metrics.proto";
import "config/report_configs.proto";
import "config/window_size.proto";
import "config/annotations.proto";

option go_package = "config";

// A Report analyzes Events that were logged to Cobalt and emits an aggregated
// output that may then be queried or visualized by an analyst user of Cobalt.
//
// A Report is associated with a Metric and this means that the Report analyzes
// the Events that were logged to that Metric. The first step occurs on a
// Fuchsia device where Cobalt analyzes the logged Events in order to form
// Observations.
//
// An Observation is built for a particular Report. The type of observation,
// including which of several privacy-oriented Encodings is used or not, depends
// on the Report type.
//
// The Observations are sent to the Cobalt Shuffler which shuffles them in order
// to break linkability between Observations and linkability with the
// originating device. Next the shuffled Observations are sent to the Analyzer
// which aggregates Observations from all Fuchsia devices in order to generate
// a report.
//
// There are multiple types of Metrics and multiple types of Reports. Each
// Report type is compatible with only some of the Metric types.
//
// A ReportDefinition defines a Cobalt Report to be generated.
// An instance of ReportDefinition is always associated with an instance of
// MetricDefinition called the owning MetricDefinition.
message ReportDefinition {
  // Next id: 14

  // Unique name for this Report within its owning MetricDefinition.
  // The name must obey the syntax of a C variable name and must have length
  // at most 64. The name must not be changed once data collection has
  // begun. Changing the name constitutes declaring a different
  // ReportDefinition.
  string report_name = 1;

  // The unique numerical identifier for this Report used internally by Cobalt.
  // Normally an instance of ReportDefinition is created by the Cobalt config
  // YAML parser and this value will be automatically set to the hash of the
  // |name| field. If an instance of ReportDefinition is created by some means
  // other than the YAML parser then this should be set to a value that is
  // unique within this ReportDefinition's owning MetricDefinition.
  uint32 id = 2;

  // A Report has one of the following types.
  enum ReportType {
    REPORT_TYPE_UNSET = 0;

    // Gives the total, daily, fleet-wide count of the number of occurrences of
    // each of a set of event types. Supports the use of local differential
    // privacy.
    //
    // Supported Input Types:
    //   - Metric type: EVENT_OCCURRED
    //     Encoding: Basic RAPPOR
    //     Observation type: BasicRapporObservation
    //
    // ReportDefinition fields particular to this type:
    //   - local_privacy_noise_level # Gives Basic RAPPOR parameters
    //
    // Report row type: SimpleOccurrenceCountReportRow. (See report_row.proto)
    SIMPLE_OCCURRENCE_COUNT = 1;

    // Gives the total, daily, fleet-wide count of the number of occurrences of
    // each of a set of event types, for each of a set of components.
    //
    // Supported Input Types:
    //   - Metric type: EVENT_COUNT
    //     Encoding: component name is hashed
    //     Observation type: IntegerEventObservation
    //     Observation value field: count
    //
    // ReportDefinition fields particular to this type:
    //   - candidate_list # All known component names
    //   - candidate_file # File with all known component names
    //
    // Report row type: EventComponentOccurrenceCountReportRow.
    // (See report_row.proto)
    EVENT_COMPONENT_OCCURRENCE_COUNT = 2;

    // Gives daily, fleet-wide aggregate statistics of a numerical metric of one
    // or more event types, associated with one or more components
    //
    // Supported Input Types:
    //   - Metric types: ELAPSED_TIME, FRAME_RATE, MEMORY_USAGE
    //     Encoding: component name is hashed
    //     Observation type: IntegerEventObservation
    //     Observation value field: Respectively, duration_microseconds
    //                              round(fps * 100), bytes
    //
    // ReportDefinition fields particular to this type:
    //   - candidate_list # All known component names
    //   - candidate_file # File with all known component names
    //
    // Report fields:
    //   - date
    //   - system_profile # One or more fields from the SystemProfile message
    //                      type (cobalt/observation.proto) describing the
    //                      system on which the events occurred.
    //   - event
    //   - component
    //   - count
    //   - mean, median, etc # Aggregate numerical statistics for that event
    //                       # type for that component, on that date, over
    //                       # devices with that system profile.
    //
    // Example report:
    //
    // Date, SystemProfile, Component, Event, Count, Mean, Median, Min, Max, ...
    // -------------------------------------------------------------------------
    // 2018-7-25,<sys-prof 1>,"Component 1","Event 1",12345,123.4,123.4,123.4,..
    // 2018-7-25,<sys-prof 2>,"Component 1","Event 2",34567,123.4,123.4,123.4,..
    // 2018-7-25,<sys-prof 1>,"Component 2","Event 1",12345,123.4,123.4,123.4,..
    // 2018-7-25,<sys-prof 1>,"Component 2","Event 2",23456,123.4,123.4,123.4,..
    NUMERIC_AGGREGATION = 3;

    // Gives daily, fleet-wide histograms of an integer-valued metric of one or
    // more event types, associated with one or more components
    //
    // Supported Input Types:
    //   - Metric types: ELAPSED_TIME, FRAME_RATE, MEMORY_USAGE
    //     Encoding, Observation type, Observation value field: Same as
    //         NUMERIC_AGGREGATION above.
    //   - Metric type: INT_HISTOGRAM
    //     Encoding: Component name is hashed, values are bucketed
    //     Observation type: HistogramObservation
    //
    // ReportDefinition fields particular to this type:
    //   - candidate_list # All known component names
    //   - candidate_file # File with all known component names
    //   - int_buckets # Definition of integer-range buckets for histogram
    //                 # Not used for Metric type INT_HISTOGRAM because the
    //                 # Metric already contains this field.
    //
    // Report row type: IntRangeHistogramReportRow
    // (See report_row.proto)
    INT_RANGE_HISTOGRAM = 4;

    // Gives the approximate distribution of the most commonly used strings in a
    // specific context specified by comments in the owning MetricDefinition.
    // Supports the use of local differential privacy.
    //
    // Supported Input Types:
    //   - Metric types: STRING_USED
    //     Encoding: String RAPPOR
    //     Observation type: StringRapporObservation
    //
    // ReportDefinition fields particular to this type:
    //   - local_privacy_noise_level # Gives RAPPOR parameters p,q
    //   - expected_population_size  # Hint for RAPPOR num cohorts
    //   - expected_string_set_size  # Hint for RAPPOR num bits
    //   - candidate_list # All known string values
    //   - candidate_file # File with all known string values
    //
    // Report fields:
    //   - date
    //   - system_profile # One or more fields from the SystemProfile message
    //                      type (cobalt/observation.proto) describing the
    //                      system on which the events occurred.
    //   - string # The string that was used
    //   - count # An estimate of the total number of times the string was used
    //           # for the given date, over devices with that system profile.
    //   - std_err: # Estimate of the std err in the value of Count estimate.
    //
    // Example report:
    //
    // Date, SystemProfile, String, Count, std_err
    // ------------------------------------------
    // 2018-7-25,<sys-prof 1>,"www.alpha.com", 12345, 1.3
    // 2018-7-25,<sys-prof 1>,"www.beta.com", 23456, 1.3
    // 2018-7-25,<sys-prof 2>,"www.gamma.com", 34567, 1.3
    // 2018-7-25,<sys-prof 2>,"www.delta.com", 78901, 1.3
    //
    // Note that the report will only include the most frequently used strings,
    // the so-called "heavy-hitters."
    HIGH_FREQUENCY_STRING_COUNTS = 5;

    // Gives the counts of sufficiently frequently used strings in a specific
    // context specified by comments in the owning MetricDefinition.
    //
    // This report type uses threshold encryption to protect sensitive strings
    // that are logged by too few client devices. The strings are transmitted
    // as ciphertext. The ciphertext may only be decrypted on the Cobalt server
    // if the number of distinct devices that have logged that string reaches
    // a specified threshold. This Report type is appropriate to use in
    // contexts in which the set of strings being logged exhibits high entropy.
    //
    // Supported Input Types:
    //   - Metric types: STRING_USED
    //     Encoding: Forculus threshold encryption
    //     Observation type: ForculusObservation
    //
    // ReportDefinition fields particular to this type:
    //   - threshold # The number of distinct devices that must log a string
    //               # before that string my be decrypted on the server.
    //
    // Report fields:
    //   - date
    //   - system_profile # One or more fields from the SystemProfile message
    //                      type (cobalt/observation.proto) describing the
    //                      system on which the events occurred.
    //   - string # The string that was used
    //   - count # The total number of times the string was used
    //           # for the given date, over devices with that system profile.
    //
    // Example report:
    //
    // Date, SystemProfile, String, Count, std_err
    // ------------------------------------------
    // 2018-7-25,<sys-prof 1>,"xhyeijly" ,12345
    // 2018-7-25,<sys-prof 1>,"oywmhdyoj"  ,23456
    // 2018-7-25,<sys-prof 2>,"25dj#^&" ,34567
    // 2018-7-25,<sys-prof 2>,"dhaukkdi" ,8901
    STRING_COUNTS_WITH_THRESHOLD = 6;

    // Gives a raw dump of the Observations for a day of one of the numeric
    // performance metrics.
    //
    // Supported Input Types:
    //   - Metric types: ELAPSED_TIME, FRAME_RATE, MEMORY_USAGE
    //     Encoding: component name is hashed
    //     Observation type: IntegerEventObservation
    //     Observation value field: Respectively, duration_microseconds
    //                              round(fps * 100), bytes
    //
    // ReportDefinition fields particular to this type:
    //   - candidate_list # All known component names
    //   - candidate_file # File with all known component names
    //
    // Report fields:
    //   - date
    //   - system_profile # One or more fields from the SystemProfile message
    //                      type (cobalt/observation.proto) describing the
    //                      system on which the events occurred.
    //   - event
    //   - component
    //   - value # The integer value from the Observation
    //
    // Example report:
    //
    // Date, SystemProfile, Component, Event, Value
    // -------------------------------------------------------------------------
    // 2018-7-25,<sys-prof 1>,"Component 1","Event 1",12345
    // 2018-7-25,<sys-prof 2>,"Component 1","Event 2",34567
    // 2018-7-25,<sys-prof 1>,"Component 2","Event 1",12345
    // 2018-7-25,<sys-prof 2>,"Component 2","Event 3",78901
    NUMERIC_PERF_RAW_DUMP = 7;

    ////////////////////// Locally aggregated ReportTypes //////////////////////
    //
    // Report types for which logged Events are aggregated on each device over a
    // specified number of days. Each day, each device sends an Observation of
    // the aggregate of the Events over the rolling window ending on that day.
    //
    ////////////////////////////////////////////////////////////////////////////

    // For each of a set of events, gives an estimate of the number of unique
    // devices on which that event occurred at least once during a rolling
    // window. Supports the use of local differential privacy with Basic RAPPOR.
    //
    // Each device sends an observation each day for each window size registered
    // in a ReportDefinition of this type, whether or not any of the associated
    // events occurred in the window ending on that day.
    //
    // Supported Input Types:
    //   - Metric type: EVENT_OCCURRED
    //   - Encoding: Basic RAPPOR. In the decoding step one should not assume
    //               that the true bit vector has exactly 1 bit set, but rather
    //               can have any number of bits set. This encoding/decoding
    //               scheme is the same as the Instantanous Randomized Response
    //               in the RAPPOR paper (https://arxiv.org/pdf/1407.6981.pdf).
    //   - Observation type: UniqueActivesObservation
    //
    // ReportDefinition fields particular to this type:
    //   - local_privacy_noise_level # Gives Basic RAPPOR parameters.
    //   - window_size # A list of window sizes in days.
    //
    // Report row type: UniqueActivesReportRow.
    // (see report_row.proto)
    UNIQUE_N_DAY_ACTIVES = 8;

    // For each of a set of events, for each of a set of component labels, for
    // a rolling window of a particular number of days, gives summary statistics
    // of the number of occurrences on individual devices of that event, with
    // that component, during the window.
    //
    // Supported Input Types:
    //    - Metric type: EVENT_COUNT
    //    - Encoding: component name is hashed
    //    - Observation type: PerDeviceCountObservation
    //
    // ReportDefinition fields particular to this type:
    //    - candidate_list # All known component names.
    //    - candidate_file # File with all known component names.
    //    - window_size # A list of window sizes in days
    //
    // Report row type: PerDeviceCountStatsReportRow.
    // (See report_row.proto)
    PER_DEVICE_COUNT_STATS = 9;

    /////////////////////// Custom Raw Dump Report /////////////////////////////

    // Gives a raw dump of the Observations for a CustomMetric for a day.
    //
    // Supported Input Types:
    //   - Metric types: CUSTOM
    //     Encoding: none
    //     Observation type: CustomObservation
    //
    // ReportDefinition fields particular to this type: none
    //
    // Report fields:
    //   - date
    //   - system_profile # One or more fields from the SystemProfile message
    //                      type (cobalt/observation.proto) describing the
    //                      system on which the events occurred.
    //   - event
    //   - component
    //   - part-1, part-2, ... # The values of the custom parts
    //
    // Example report:
    //
    // Date, SystemProfile, Component, Event,  part-1, part-2, part-3, ...
    // -------------------------------------------------------------------------
    // 2018-7-25,<sys-prof 1>,"Part 1","value1"
    // 2018-7-25,<sys-prof 2>,"Part 1","value1"
    // 2018-7-25,<sys-prof 1>,"Part 2","value2"
    //
    // A report of this type must be associated with a MetricDefinition of type
    // CustomMetric. Observations for the Report will be of type
    // CustomObservation
    CUSTOM_RAW_DUMP = 9999;
  }
  ReportType report_type = 3;

  ////////////////  Fields specific to some metric types /////////////////

  // A level of random noise to use when encoding observations for RAPPOR.
  enum LocalPrivacyNoiseLevel {
    // local_privacy_noise_level must be explicitly set when using
    // Basic RAPPOR or String RAPPOR.
    NOISE_LEVEL_UNSET = 0;

    // p = 0.0, q = 1.0
    NONE = 1;

    // p = 0.01, q = 0.99
    SMALL = 2;

    // p = 0.1, q = 0.9
    MEDIUM = 3;

    // p = 0.25, q = 0.75
    LARGE = 4;
  }

  // This field is used only with Report types SIMPLE_OCCURRENCE_COUNT and
  // HIGH_FREQUENCY_STRING_COUNTS. Its value must not be changed
  // after data collection has begun or the data will become corrupted.
  LocalPrivacyNoiseLevel local_privacy_noise_level = 4;

  // This field is used only with Report type
  // HIGH_FREQUENCY_STRING_COUNTS.
  // An estimate of the number of different devices that will be participating
  // in collecting data for the report. This helps to tune the RAPPOR
  // algorithm. This must not be changed after data collection has
  // begun or the data may become corrupted.
  uint32 expected_population_size = 5;

  // This field is used only with Report type
  // HIGH_FREQUENCY_STRING_COUNTS.
  // An estimate of the size of the set of all strings that are likely to
  // be logged. This helps to tune the RAPPOR algorithm. This
  // must not be changed after data collection has begun or the data may
  // become corrupted.
  uint32 expected_string_set_size = 6;

  // This field is used only with Report type STRING_COUNTS_WITH_THRESHOLD.
  // The threshold. Only strings that have been used by at least this many
  // distinct clients will appear in the report.
  // Must satisfy 2 <= threshold <= 1,000,000
  // This must not be changed after data collection has begun or the data may
  // become corrupted.
  uint32 threshold = 7;

  // Explicit list of known string values. Either this or |candidate_file|
  // should be used, not both. Used for the hashed |component_name|
  // field for several Report types and the encoded |string| field for the
  // HIGH_FREQUENCY_STRING_COUNTS Report type.
  repeated string candidate_list = 8 [(cobalt_options).hide_on_client = true];

  // Simple name or full path to file containing known string values.
  // Either this or |candidate_list| should be used, not both. Used for the
  // hashed |component_name| field for several report types and the encoded
  // |string| field for the
  // HIGH_FREQUENCY_STRING_COUNTS Report type.
  string candidate_file = 9;

  // This field is used only with the INT_RANGE_HISTOGRAM Report type, but
  // not used when the Metric type is INT_HISTOGRAM because in that case the
  // MetricDefinition already contains an instance of IntegerBuckets.
  IntegerBuckets int_buckets = 10;

  // This field is used only with the UNIQUE_N_DAY_ACTIVES Report type.
  // Used to specify the length in days of the rolling window for that
  // report type. Cobalt will send a separate Observation for each
  // WindowSize specified.
  repeated WindowSize window_size = 11;

  // This field is used only with CUSTOM_RAW_DUMP Report type. Used to
  // specify the path to the location the metrics should be written to.
  string output_location = 12;

  ///////////////////  Fields used by all metric types ///////////////////

  // The list of SystemProfileFields to include in each row of the report.
  // Optional. If not specified a reasonable default will be used.
  repeated SystemProfileField system_profile_field = 100;

  // Configuration of differentially private release for this report.
  DifferentialPrivacyConfig dp_release_config = 101;

  // Overrides the location to where Cobalt exports this Report.
  // This field is implementation-specific. If omitted Cobalt will use its
  // default settings to determine the location of the exported report.
  string export_location_override = 102;
}
