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
  // "<code 42>", where `42` is the numeric event code observed.
  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
  // "<code 42>", where `42` is the numeric event code observed.
  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
  // "<code 42>", where `42` is the numeric event code observed.
  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
  // "<code 42>", where `42` is the numeric event code observed.
  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 of the squares of the differences from the mean.
  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
  // "<code 42>", where `42` is the numeric event code observed.
  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
  // "<code 42>", where `42` is the numeric event code observed.
  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 "<code 42>", where `42` is the numeric event code observed.
  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 "<code 42>", where `42` is the numeric event code observed.
  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 "<code 42>", where `42` is the numeric event code observed.
  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 "<code 42>", where `42` is the numeric event code observed.
  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 "<code 42>", where `42` is the numeric event code observed.
  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 "<code 42>", where `42` is the numeric event code observed.
  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;
}
