/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

syntax = "proto2";
option optimize_for = LITE_RUNTIME;

package android.os.statsd;

option java_package = "com.android.os";
option java_outer_classname = "StatsLog";

import "frameworks/base/cmds/statsd/src/atoms.proto";

message DimensionsValue {
  optional int32 field = 1;

  oneof value {
    string value_str = 2;
    int32 value_int = 3;
    int64 value_long = 4;
    bool value_bool = 5;
    float value_float = 6;
    DimensionsValueTuple value_tuple = 7;
  }
}

message DimensionsValueTuple {
  repeated DimensionsValue dimensions_value = 1;
}

message EventMetricData {
  optional int64 timestamp_nanos = 1;

  optional Atom atom = 2;
}

message CountBucketInfo {
  optional int64 start_bucket_nanos = 1;

  optional int64 end_bucket_nanos = 2;

  optional int64 count = 3;
}

message CountMetricData {
  optional DimensionsValue dimensions_in_what = 1;

  optional DimensionsValue dimensions_in_condition = 2;

  repeated CountBucketInfo bucket_info = 3;
}

message DurationBucketInfo {
  optional int64 start_bucket_nanos = 1;

  optional int64 end_bucket_nanos = 2;

  optional int64 duration_nanos = 3;
}

message DurationMetricData {
  optional DimensionsValue dimensions_in_what = 1;

  optional DimensionsValue dimensions_in_condition = 2;

  repeated DurationBucketInfo bucket_info = 3;
}

message ValueBucketInfo {
  optional int64 start_bucket_nanos = 1;

  optional int64 end_bucket_nanos = 2;

  optional int64 value = 3;
}

message ValueMetricData {
  optional DimensionsValue dimensions_in_what = 1;

  optional DimensionsValue dimensions_in_condition = 2;

  repeated ValueBucketInfo bucket_info = 3;
}

message GaugeBucketInfo {
  optional int64 start_bucket_nanos = 1;

  optional int64 end_bucket_nanos = 2;

  repeated Atom atom = 3;

  repeated int64 timestamp_nanos = 4;
}

message GaugeMetricData {
  optional DimensionsValue dimensions_in_what = 1;

  optional DimensionsValue dimensions_in_condition = 2;

  repeated GaugeBucketInfo bucket_info = 3;
}

message UidMapping {
  message PackageInfoSnapshot {
    message PackageInfo {
      optional string name = 1;

      optional int64 version = 2;

      optional int32 uid = 3;
    }
    optional int64 timestamp_nanos = 1;

    repeated PackageInfo package_info = 2;
  }
  repeated PackageInfoSnapshot snapshots = 1;

  message Change {
    optional bool deletion = 1;

    optional int64 timestamp_nanos = 2;
    optional string app = 3;
    optional int32 uid = 4;

    optional int64 version = 5;
  }
  repeated Change changes = 2;
}

message StatsLogReport {
  optional int64 metric_id = 1;

  optional int64 start_report_nanos = 2;

  optional int64 end_report_nanos = 3;

  message EventMetricDataWrapper {
    repeated EventMetricData data = 1;
  }
  message CountMetricDataWrapper {
    repeated CountMetricData data = 1;
  }
  message DurationMetricDataWrapper {
    repeated DurationMetricData data = 1;
  }
  message ValueMetricDataWrapper {
    repeated ValueMetricData data = 1;
  }

  message GaugeMetricDataWrapper {
    repeated GaugeMetricData data = 1;
  }

  oneof data {
    EventMetricDataWrapper event_metrics = 4;
    CountMetricDataWrapper count_metrics = 5;
    DurationMetricDataWrapper duration_metrics = 6;
    ValueMetricDataWrapper value_metrics = 7;
    GaugeMetricDataWrapper gauge_metrics = 8;
  }
}

message ConfigMetricsReport {
  repeated StatsLogReport metrics = 1;

  optional UidMapping uid_map = 2;
}

message ConfigMetricsReportList {
  message ConfigKey {
    optional int32 uid = 1;
    optional int64 id = 2;
  }
  optional ConfigKey config_key = 1;

  repeated ConfigMetricsReport reports = 2;
}

message StatsdStatsReport {
  optional int32 stats_begin_time_sec = 1;

  optional int32 stats_end_time_sec = 2;

  message MatcherStats {
    optional int64 id = 1;
    optional int32 matched_times = 2;
  }

  message ConditionStats {
    optional int64 id = 1;
    optional int32 max_tuple_counts = 2;
  }

  message MetricStats {
    optional int64 id = 1;
    optional int32 max_tuple_counts = 2;
  }

  message AlertStats {
    optional int64 id = 1;
    optional int32 alerted_times = 2;
  }

  message ConfigStats {
    optional int32 uid = 1;
    optional int64 id = 2;
    optional int32 creation_time_sec = 3;
    optional int32 deletion_time_sec = 4;
    optional int32 metric_count = 5;
    optional int32 condition_count = 6;
    optional int32 matcher_count = 7;
    optional int32 alert_count = 8;
    optional bool is_valid = 9;

    repeated int32 broadcast_sent_time_sec = 10;
    repeated int32 data_drop_time_sec = 11;
    repeated int32 dump_report_time_sec = 12;
    repeated MatcherStats matcher_stats = 13;
    repeated ConditionStats condition_stats = 14;
    repeated MetricStats metric_stats = 15;
    repeated AlertStats alert_stats = 16;
  }

  repeated ConfigStats config_stats = 3;

  message AtomStats {
    optional int32 tag = 1;
    optional int32 count = 2;
  }

  repeated AtomStats atom_stats = 7;

  message UidMapStats {
    optional int32 snapshots = 1;
    optional int32 changes = 2;
    optional int32 bytes_used = 3;
    optional int32 dropped_snapshots = 4;
    optional int32 dropped_changes = 5;
  }
  optional UidMapStats uidmap_stats = 8;

  message AnomalyAlarmStats {
    optional int32 alarms_registered = 1;
  }
  optional AnomalyAlarmStats anomaly_alarm_stats = 9;

  message PulledAtomStats {
    optional int32 atom_id = 1;
    optional int64 total_pull = 2;
    optional int64 total_pull_from_cache = 3;
    optional int64 min_pull_interval_sec = 4;
  }
  repeated PulledAtomStats pulled_atom_stats = 10;

  message LoggerErrorStats {
    optional int32 logger_disconnection_sec = 1;
    optional int32 error_code = 2;
  }
  repeated LoggerErrorStats logger_error_stats = 11;
}