syntax = "proto3";

package cobalt;

import "src/pb/common.proto";

////////////////////////////////////////////////////////////////////////////////
// NOTE: This file is used by the Cobalt server and not by the client. It is
// included in the client repo only for reference. The canonical version of this
// file is located in Google's internal code repository, and the file is
// automatically copied to Cobalt's open source Git repo.  Do
// not edit the copy of this file in the open-source Cobalt Git repo as those
// edits will be overwritten when the file is next copied.
////////////////////////////////////////////////////////////////////////////////

// A row of output for reports that use the OCCURRENCE_COUNTS global aggregation
// procedure: FLEETWIDE_OCCURRENCE_COUNTS and UNIQUE_DEVICE_COUNTS.
//
// This row gives a total count that is associated with a date, a system_profile
// and an event_vector.
//
// This is part of Cobalt 1.1.
message OccurrenceCountReportRow {
  // The report date. This is the date on which the local aggregation period
  // ended, as measured on the device. This is a string in yyyy-mm-dd format.
  string date = 1;

  // A profile of the system from which the events were logged. This will be
  // populated with only the fields that are specified in the
  // |system_profile_field| entry in the ReportDefinition for this report.
  SystemProfile system_profile = 2;

  // The event_vector labels for this row.
  // There will be one event_label for each metric dimension
  // that was included in the report, in the order the dimensions are declared
  // in the ReportDefinition. If the ReportDefinition specifies no metric
  // dimensions should be included then this repeated field will be empty.
  //
  // For each dimension, if the event_code in that dimension of the event_vector
  // has not been assigned a label, then this will be a string of the form
  // "<event-code-42>".
  repeated string event_labels = 3;

  // The sum of the |counts|s associated with this row's event_vector, from all
  // Observations included in the report from devices with the |system_profile|.
  // Unless the report is configured to not use any local differential privacy
  // noise, this value is an estimate. Also the value is truncated to
  // MAX_DOUBLE.
  double count = 4;
}

// A row of output for reports that use the INTEGER_HISTOGRAMS global
// aggregation procedure: FLEETWIDE_HISTOGRAMS, UNIQUE_DEVICE_HISTOGRAMS,
// HOURLY_VALUE_HISTOGRAMS.
//
// This row gives the count for one bucket of an int-range histogram
// associated with a date, a system_profile and an event_vector.
//
// This is part of Cobalt 1.1.
message IntegerHistogramReportRow {
  // The report date. This is the date on which the local aggregation period
  // ended, as measured on the device. This is a string in yyyy-mm-dd format.
  string date = 1;

  // A profile of the system from which the events were logged. This will be
  // populated with only the fields that are specified in the
  // |system_profile_field| entry in the ReportDefinition for this report.
  SystemProfile system_profile = 2;

  // The event_vector labels for this row.
  // There will be one event_label for each metric dimension
  // that was included in the report, in the order the dimensions are declared
  // in the ReportDefinition. If the ReportDefinition specifies no metric
  // dimensions should be included then this repeated field will be empty.
  //
  // For each dimension, if the event_code in that dimension of the event_vector
  // has not been assigned a label, then this will be a string of the form
  // "<event-code-42>".
  repeated string event_labels = 3;

  // The *inclusive* upper and lower bounds for this bucket.
  // required: bucket_min_value <= bucket_max_value. The bucket consists
  // of integers in the interval [bucket_min_value, bucket_max_value].
  int64 bucket_min_value = 4;
  int64 bucket_max_value = 5;

  // The bucket index, which is useful for sorting the data in visualizations.
  int32 bucket_index = 6;

  // The number of values that fall in this bucket. Unless the report is
  // configured to not use any local differential privacy noise, this value is
  // an estimate. Also the value is truncated to MAX_DOUBLE.
  double count = 7;
}

// A row of output for reports that use the SUM_AND_COUNTS global aggregation
// procedure, namely reports of type FLEETWIDE_MEAN. The goal of such a report
// is to compute the mean of a set of event values when each device in the fleet
// contributues a different number of event values. The fleetwide mean is
// given by sum/count. We emit sum and count separately so that a
// post-processing step (such as within a dashboard) may compute the mean over
// larger populations such as multiple days, multiple system_profiles, or
// multiple event_vectors.
//
// This row gives the sum and count associated with a date, a system_profile
// and an event_vector.
//
// This is part of Cobalt 1.1.
message SumAndCountReportRow {
  // The report date. This is the date on which the local aggregation period
  // ended, as measured on the device. This is a string in yyyy-mm-dd format.
  string date = 1;

  // A profile of the system from which the events were logged. This will be
  // populated with only the fields that are specified in the
  // |system_profile_field| entry in the ReportDefinition for this report.
  SystemProfile system_profile = 2;

  // The event_vector labels for this row.
  // There will be one event_label for each metric dimension
  // that was included in the report, in the order the dimensions are declared
  // in the ReportDefinition. If the ReportDefinition specifies no metric
  // dimensions should be included then this repeated field will be empty.
  //
  // For each dimension, if the event_code in that dimension of the event_vector
  // has not been assigned a label, then this will be a string of the form
  // "<event-code-42>".
  repeated string event_labels = 3;

  // The sum of all of the |sum| fields from all of the Observations included
  // in the report that are associated with this row's event_vector and from
  // devices with the |system_profile|.
  //
  // Unless the report is configured to not use any local differential privacy
  // noise, this value is an estimate. Also the value is truncated to
  // MAX_DOUBLE.
  double sum = 4;

  // The sum of all of the |count| fields from all of the Observations included
  // in the report that are associated with this row's event_vector and from
  // devices with the |system_profile|.
  //
  // Unless the report is configured to not use any local differential privacy
  // noise, this value is an estimate. Also the value is truncated to
  // MAX_DOUBLE.
  double count = 5;
}

// A row of output for reports that use the NUMERIC_STATS global aggregation
// procedure: HOURLY_VALUE_NUMERIC_STATS and UNIQUE_DEVICE_NUMERIC_STATS.
//
// This row gives the numeric statistics associated with a date, a
// system_profile and an event_vector.
//
// This is part of Cobalt 1.1.
message NumericStatsReportRow {
  // The report date. This is the date on which the local aggregation period
  // ended, as measured on the device. This is a string in yyyy-mm-dd format.
  string date = 1;

  // A profile of the system from which the events were logged. This will be
  // populated with only the fields that are specified in the
  // |system_profile_field| entry in the ReportDefinition for this report.
  SystemProfile system_profile = 2;

  // The event_vector labels for this row.
  // There will be one event_label for each metric dimension
  // that was included in the report, in the order the dimensions are declared
  // in the ReportDefinition. If the ReportDefinition specifies no metric
  // dimensions should be included then this repeated field will be empty.
  //
  // For each dimension, if the event_code in that dimension of the event_vector
  // has not been assigned a label, then this will be a string of the form
  // "<event-code-42>".
  repeated string event_labels = 3;

  // Each of the statistics below are computed over the set of all values
  // that are associated with the event_vector for this row
  // from all Observations that contributed to the report that are
  // from devices with the |system_profile|. Unless the report is
  // configured to not use any local differential privacy noise, each of these
  // value is an estimate and has been truncated to fit in a double.

  // The sum of all the values.
  double sum = 4;

  // The sum the squares of all of the values.
  double sum_of_squares = 5;

  // The count of the number of values.
  double count = 6;

  // The count of the number of values (already included in |count|) that are
  // zero.
  double zero_count = 7;

  // 1st percentile.
  double percentile_1 = 101;

  // 5th percentile.
  double percentile_5 = 105;

  // 10th percentile.
  double percentile_10 = 110;

  // 25th percentile.
  double percentile_25 = 125;

  // 50th percentile.
  double percentile_50 = 150;

  // 75th percentile.
  double percentile_75 = 175;

  // 90th percentile.
  double percentile_90 = 190;

  // 95th percentile.
  double percentile_95 = 195;

  // 99th percentile.
  double percentile_99 = 199;
}

// A row of output for reports that utilize the STRING_HISTOGRAMS global
// aggregation procedure, namely the STRING_COUNTS report type.
//
// This row gives one string and its associated count of occurrences for the
// string associated with a date, a system_profile and an event_vector.
//
// This is part of Cobalt 1.1.
message StringCountReportRow {
  // The report date. This is the date on which the local aggregation period
  // ended, as measured on the device. This is a string in yyyy-mm-dd format.
  string date = 1;

  // A profile of the system from which the events were logged. This will be
  // populated with only the fields that are specified in the
  // |system_profile_field| entry in the ReportDefinition for this report.
  SystemProfile system_profile = 2;

  // The event_vector labels for this row.
  // There will be one event_label for each metric dimension
  // that was included in the report, in the order the dimensions are declared
  // in the ReportDefinition. If the ReportDefinition specifies no metric
  // dimensions should be included then this repeated field will be empty.
  //
  // For each dimension, if the event_code in that dimension of the event_vector
  // has not been assigned a label, then this will be a string of the form
  // "<event-code-42>".
  repeated string event_labels = 3;

  // The string value. One of the candidate strings, or the string "<other>".
  string string_value = 4;

  // The count for this string.  Unless the report is
  // configured to not use any local differential privacy noise, each of these
  // value is an estimate and has been truncated to fit in a double. Also the
  // value is truncated to MAX_DOUBLE.
  double count = 5;
}

// A row of output for a report of type SIMPLE_OCCURRENCE_COUNT.
//
// Gives the total daily, fleet-wide count of the number of occurrences of an
// event with a particular event code, on a particular day, considering only
// devices matching a particular system profile.
//
// TODO(b/148809626) Delete when all users are switched to Cobalt 1.1.
message SimpleOccurrenceCountReportRow {
  // The date on which the logged events occurred, as measured on the device.
  // This is a string in yyyy-mm-dd format.
  string date = 1;

  // A profile of the system from which the events were logged. This will be
  // populated with only the fields that are specified in the
  // |system_profile_field| entry in the ReportDefinition for this report.
  SystemProfile system_profile = 2;

  // The label for the event code associated with the events that occurred. If
  // the event_code has not been assigned a label (in the event_codes field of
  // the MetricDefinition) then this will be a string of the form
  // "<event-code-42>".
  string event_code = 3;

  // The total count of the event occurrence on the |date|, over all reporting
  // devices with the |system_profile|. Unless |local_privacy_noise_level| in
  // the Reportdefintion is set to NONE, this value is an estimate.
  float count = 4;

  // An estimate of the standard error in the value of the |count|. This will
  // be zero if |local_privacy_noise_level| in the Reportdefintion is NONE.
  // Multiply this value by z_{alpha/2} to obtain the radius of an approximate
  // 100(1 - alpha)% confidence interval. For example an approximate 95%
  // confidence interval for the count is given by
  // (count_estimate - 1.96*std_error, count_estimate + 1.96 * std_error)
  // because 1.96 ~= z_{.025} meaning that P(Z > 1.96) ~= 0.025 where
  // Z ~ Normal(0, 1).
  float std_err = 5;
}

// A row of output for a report of type EVENT_COMPONENT_OCCURRENCE_COUNT.
//
// Gives the total daily fleet-wide count of the number of occurrences of an
// event with a particular event code, for a particular component, on a
// particular day, considering only devices matching a particular system
// profile.
//
// TODO(b/148809626) Delete when all users are switched to Cobalt 1.1.
message EventComponentOccurrenceCountReportRow {
  // The date on which the logged events occurred, as measured on the device.
  // This is a string in yyyy-mm-dd format.
  string date = 1;

  // A profile of the system from which the events were logged. This will be
  // populated with only the fields that are specified in the
  // |system_profile_field| entry in the ReportDefinition for this report.
  SystemProfile system_profile = 2;

  // The labels for the event codes associated with the events that occurred.
  // There is one label for each metric_dimension in the metric definition. If
  // an event code has not been assigned a label this will be a string of the
  // form "<event-code-0-42>" where 0 is the dimension index, and 42 is the
  // event code.
  repeated string event_code = 3;

  // The component string associated with the events that occurred. This string
  // must have been pre-registered in the ReportDefinition (using the
  // |candidate_list| or |candidate_file| fields). There are also two special
  // values of |component|.
  // "<NONE>" is the component associated with logged events that
  // contained an empty component string.
  // "<OTHER>" is the component associated with logged events that contained
  // a non-empty component string that was not pre-registered.
  string component = 4;

  // The total sum of the event occurrence counts for events with the
  // |event_code| and |component|, on the |date|, over all
  // reporting devices with the |system_profile|.
  int64 sum = 5;

  // The count of Observations that contributed to the |sum|.
  int64 count = 6;
}

// A row of output for a report of type NUMERIC_AGGREGATION.
//
// Gives the total daily fleet-wide statistics of a numerical metric, for a
// particular event code, for a particular component, on a particular day,
// considering only devices matching a particular system profile.  The
// statistics include the number of observations, the mean, median, minimum,
// maximum, and sum.
//
// TODO(b/148809626) Delete when all users are switched to Cobalt 1.1.
message NumericAggregationReportRow {
  // The date on which the logged events occurred, as measured on the device.
  // This is a string in yyyy-mm-dd format.
  string date = 1;

  // A profile of the system from which the events were logged. This will be
  // populated with only the fields that are specified in the
  // |system_profile_field| entry in the ReportDefinition for this report.
  SystemProfile system_profile = 2;

  // The labels for the event codes associated with the events that occurred.
  // There is one label for each metric_dimension in the metric definition. If
  // an event code has not been assigned a label this will be a string of the
  // form "<event-code-0-42>" where 0 is the dimension index, and 42 is the
  // event code.
  repeated string event_code = 3;

  // The component string associated with the events that occurred. This string
  // must have been pre-registered in the ReportDefinition (using the
  // |candidate_list| or |candidate_file| fields). There are also two special
  // values of |component|.
  // "<NONE>" is the component associated with logged events that
  // contained an empty component string.
  // "<OTHER>" is the component associated with logged events that contained
  // a non-empty component string that was not pre-registered.
  string component = 4;

  // The count of Observations that contributed to the statistics.
  int64 count = 5;

  // The mean value of the collected Observation values for events with the
  // |event_code| and |component|, on the |date|, over all reporting devices
  // with the |system_profile|.
  float mean = 6;

  // The median value of the collected Observation values for events with the
  // |event_code| and |component|, on the |date|, over all reporting devices
  // with the |system_profile|.
  int64 median = 7;

  // The minimum value of the collected Observation values for events with the
  // |event_code| and |component|, on the |date|, over all reporting devices
  // with the |system_profile|.
  int64 min = 8;

  // The maximum value of the collected Observation values for events with the
  // |event_code| and |component|, on the |date|, over all reporting devices
  // with the |system_profile|.
  int64 max = 9;

  // The total sum of the collected Observation values for events with the
  // |event_code| and |component|, on the |date|, over all reporting devices
  // with the |system_profile|.
  int64 sum = 10;

  // A mapping of percentiles of the collected Observation values for events
  // with the |event_code| and |component|, on the |date|, over all reporting
  // devices with the |system_profile|.  The key is a percentile between 0 and
  // 100, and the value is the fleet-wide observed value at that percentile.
  map<uint32, int64> percentiles = 11;
}

// A row of output for a report of type INT_RANGE_HISTOGRAM.
//
// Gives the value for one bucket of an integer range histogram, aggregated
// over the fleet, for a particular event code, a particular component, on a
// particular day, considering only devices matching a particular system
// profile.
//
// TODO(b/148809626) Delete when all users are switched to Cobalt 1.1.
message IntRangeHistogramReportRow {
  // The date on which the logged events occurred, as measured on the device.
  // This is a string in yyyy-mm-dd format.
  string date = 1;

  // A profile of the system from which the events were logged. This will be
  // populated with only the fields that are specified in the
  // |system_profile_field| entry in the ReportDefinition for this report.
  SystemProfile system_profile = 2;

  // The labels for the event codes associated with the events that occurred.
  // There is one label for each metric_dimension in the metric definition. If
  // an event code has not been assigned a label this will be a string of the
  // form "<event-code-0-42>" where 0 is the dimension index, and 42 is the
  // event code.
  repeated string event_code = 3;

  // The component string associated with the events that occurred. This string
  // must have been pre-registered in the ReportDefinition (using the
  // |candidate_list| or |candidate_file| fields). There are also two special
  // values of |component|.
  // "<NONE>" is the component associated with logged events that
  // contained an empty component string.
  // "<OTHER>" is the component associated with logged events that contained
  // a non-empty component string that was not pre-registered.
  string component = 4;

  // String describing the interval of integers for this bucket, such as
  // "10-15".
  string bucket_name = 5;

  // The count for this bucket.
  int64 bucket_count = 6;

  // The bucket index, which is useful for sorting the data in visualizations.
  int32 bucket_index = 7;
}

// A row of output for a report of type UNIQUE_N_DAY_ACTIVES.
//
// Gives an estimate of the number of devices with a particular system profile
// which experienced at least one event with a particular event code, during a
// particular time window.
//
// TODO(b/148809626) Delete when all users are switched to Cobalt 1.1.
message UniqueActivesReportRow {
  // The date of the last day of the aggregation window, as measured on the
  // device. This is a string in yyyy-mm-dd format.
  string date = 1;

  // A profile of the system from which the events were logged. This will be
  // populated with only the fields that are specified in the
  // |system_profile_field| entry in the ReportDefinition for this report.
  SystemProfile system_profile = 2;

  // The labels for the event codes associated with the events that occurred.
  // There is one label for each metric_dimension in the metric definition. If
  // an event code has not been assigned a label this will be a string of the
  // form "<event-code-0-42>" where 0 is the dimension index, and 42 is the
  // event code.
  repeated string event_code = 3;

  // The size in days of the aggregation window (deprecated).
  // TODO(pesk): remove this field once the transition to aggregation_window is
  // complete.
  uint32 window_size = 4;

  // A string describing the aggregation window, with units in hours or days.
  // The format is Nh (for a window of N hours) or Nd (for a window of N days).
  string aggregation_window = 8;

  // The total count of active devices over the aggregation window, over all
  // reporting devices with the |system_profile|. Unless
  // |local_privacy_noise_level| in the Reportdefintion is set to NONE, this
  // value is an estimate.
  float active_count = 5;

  // An estimate of the standard error in the value of |active_count|. This will
  // be zero if |local_privacy_noise_level| in the ReportDefinition is NONE.
  // Multiply this value by z_{alpha/2} to obtain the radius of an approximate
  // 100(1 - alpha)% confidence interval. For example an approximate 95%
  // confidence interval for the count is given by
  // (count_estimate - 1.96*std_error, count_estimate + 1.96 * std_error)
  // because 1.96 ~= z_{.025} meaning that P(Z > 1.96) ~= 0.025 where
  // Z ~ Normal(0, 1).
  float std_err = 6;

  // The total number of Observations received for the aggregation window,
  // over all reporting devices with the |system_profile|. This is equal to
  // the total number of Fuchsia devices with |system_profile| which were
  // awake at a time that locally aggregated Observations for this
  // ReportDefinition and this aggregation window were created and uploaded,
  // whether or not |event_code| occurred on the device during the window.
  int64 sample_size = 7;
}

// A row of output for a report of type PER_DEVICE_NUMERIC_STATS.
//
// Gives statistics over all devices of the sum of the numeric values associated
// with a particular kind of event, over all occurrences of that event on
// individual devices, over a particular time window.
//
// For example, if used with an EVENT_COUNT metric, reports statistics over all
// devices of the number of occurrences of an event on each device during the
// window. If used with an ELAPSED_TIME metric, reports statistics over all
// devices of the total amount of time logged on each device during the window.
//
// TODO(b/148809626) Delete when all users are switched to Cobalt 1.1.
message PerDeviceNumericStatsReportRow {
  // The date of the last day of the on-device aggregation window, as measured
  // on the device, using the time zone policy of the report's parent metric.
  // This is a string in yyyy-mm-dd format.
  string date = 1;

  // A profile of the system from which the events were logged. This will be
  // populated with only the fields that are specified in the
  // |system_profile_field| entry in the ReportDefinition for this report.
  SystemProfile system_profile = 2;

  // The labels for the event codes associated with the events that occurred.
  // There is one label for each metric_dimension in the metric definition. If
  // an event code has not been assigned a label this will be a string of the
  // form "<event-code-0-42>" where 0 is the dimension index, and 42 is the
  // event code.
  repeated string event_code = 3;

  // The component string associated with the events that occurred. This string
  // must have been pre-registered in the ReportDefinition (using the
  // |candidate_list| or |candidate_file| fields). There are also two special
  // values of |component|:
  // "<NONE>" is the component associated with logged events that
  // contained an empty component string.
  // "<OTHER>" is the component associated with logged events that contained
  // a non-empty component string that was not pre-registered.
  string component = 4;

  // The size in days of the aggregation window (deprecated).
  // TODO(pesk): remove this field once the transition to aggregation_window is
  // complete.
  uint32 window_size = 5;

  // A string describing the aggregation window, with units in hours or days.
  // The format is Nh (for a window of N hours) or Nd (for a window of N days).
  string aggregation_window = 9;

  // The mean of the values contributing to this report row.
  float mean = 6;

  // The standard deviation of the values contributing to this report row.
  float stddev = 7;

  // The number of devices reporting a nonzero value for this report row.
  int64 unique_actives = 8;

  // Percentiles: the value of |percentile_N| is the smallest value k
  // contributed by a device to this report row such that at least N percent
  // of devices reported a value less than or equal to k.

  // 1st percentile.
  int64 percentile_1 = 101;

  // 5th percentile.
  int64 percentile_5 = 105;

  // 25th percentile.
  int64 percentile_25 = 125;

  // 50th percentile.
  int64 percentile_50 = 150;

  // 75th percentile.
  int64 percentile_75 = 175;

  // 95th percentile.
  int64 percentile_95 = 195;

  // 99th percentile.
  int64 percentile_99 = 199;

  // The number of unique devices that contributed to this report row. This is
  // equal to the number of ReportParticipationObservations received by
  // the ReportGenerator for this report, aggregation window size, and date.
  int64 sample_size = 200;
}

// A row of output for a report of type PER_DEVICE_HISTOGRAM.
//
// Gives the value for one bucket of an integer range histogram, aggregated
// over the fleet, for a particular event code, a particular component, on a
// particular day with a particular aggregation_window, considering only devices
// matching a particular system profile.
//
// TODO(b/148809626) Delete when all users are switched to Cobalt 1.1.
message PerDeviceHistogramReportRow {
  // The date on which the logged events occurred, as measured on the device.
  // This is a string in yyyy-mm-dd format.
  string date = 1;

  // A profile of the system from which the events were logged. This will be
  // populated with only the fields that are specified in the
  // |system_profile_field| entry in the ReportDefinition for this report.
  SystemProfile system_profile = 2;

  // The labels for the event codes associated with the events that occurred.
  // There is one label for each metric_dimension in the metric definition. If
  // an event code has not been assigned a label this will be a string of the
  // form "<event-code-0-42>" where 0 is the dimension index, and 42 is the
  // event code.
  repeated string event_code = 3;

  // The component string associated with the events that occurred. This string
  // must have been pre-registered in the ReportDefinition (using the
  // |candidate_list| or |candidate_file| fields). There are also two special
  // values of |component|.
  // "<NONE>" is the component associated with logged events that
  // contained an empty component string.
  // "<OTHER>" is the component associated with logged events that contained
  // a non-empty component string that was not pre-registered.
  string component = 4;

  // String describing the interval of integers for this bucket, such as
  // "10-15".
  string bucket_name = 5;

  // The count for this bucket.
  int64 bucket_count = 6;

  // The bucket index, which is useful for sorting the data in visualizations.
  int32 bucket_index = 7;

  // A string describing the aggregation window, with units in hours or days.
  // The format is Nh (for a window of N hours) or Nd (for a window of N days).
  string aggregation_window = 8;

  // The number of unique devices that contributed to this report row. This is
  // equal to the number of ReportParticipationObservations received by
  // the ReportGenerator for this report, aggregation window size, and date with
  // the same SystemProfile.
  int64 fleet_size = 9;
}
