/*
 * 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";

package android.os.statsd;

option java_package = "com.android.internal.os";
option java_outer_classname = "StatsdConfigProto";

enum Position {
  POSITION_UNKNOWN = 0;

  FIRST = 1;

  LAST = 2;

  ANY = 3;

  ALL = 4;
}

enum TimeUnit {
  TIME_UNIT_UNSPECIFIED = 0;
  ONE_MINUTE = 1;  // WILL BE GUARDRAILED TO 5 MINS UNLESS UID = SHELL OR ROOT
  FIVE_MINUTES = 2;
  TEN_MINUTES = 3;
  THIRTY_MINUTES = 4;
  ONE_HOUR = 5;
  THREE_HOURS = 6;
  SIX_HOURS = 7;
  TWELVE_HOURS = 8;
  ONE_DAY = 9;
  ONE_WEEK = 10;
  CTS = 1000;
}

message FieldMatcher {
  optional int32 field = 1;

  optional Position position = 2;

  repeated FieldMatcher child = 3;
}

message FieldValueMatcher {
  optional int32 field = 1;

  optional Position position = 2;

  oneof value_matcher {
    bool eq_bool = 3;
    string eq_string = 4;
    int64 eq_int = 5;

    int64 lt_int = 6;
    int64 gt_int = 7;
    float lt_float = 8;
    float gt_float = 9;

    int64 lte_int = 10;
    int64 gte_int = 11;

    MessageMatcher matches_tuple = 12;

    StringListMatcher eq_any_string = 13;
    StringListMatcher neq_any_string = 14;
  }
}

message MessageMatcher {
  repeated FieldValueMatcher field_value_matcher = 1;
}

message StringListMatcher {
    repeated string str_value = 1;
}

enum LogicalOperation {
  LOGICAL_OPERATION_UNSPECIFIED = 0;
  AND = 1;
  OR = 2;
  NOT = 3;
  NAND = 4;
  NOR = 5;
}

message SimpleAtomMatcher {
  optional int32 atom_id = 1;

  repeated FieldValueMatcher field_value_matcher = 2;
}

message AtomMatcher {
  optional int64 id = 1;

  message Combination {
    optional LogicalOperation operation = 1;

    repeated int64 matcher = 2;
  }
  oneof contents {
    SimpleAtomMatcher simple_atom_matcher = 2;
    Combination combination = 3;
  }
}

message SimplePredicate {
  optional int64 start = 1;

  optional int64 stop = 2;

  optional bool count_nesting = 3 [default = true];

  optional int64 stop_all = 4;

  enum InitialValue {
    UNKNOWN = 0;
    FALSE = 1;
  }
  optional InitialValue initial_value = 5 [default = UNKNOWN];

  optional FieldMatcher dimensions = 6;
}

message Predicate {
  optional int64 id = 1;

  message Combination {
    optional LogicalOperation operation = 1;

    repeated int64 predicate = 2;
  }

  oneof contents {
    SimplePredicate simple_predicate = 2;
    Combination combination = 3;
  }
}

message StateMap {
  message StateGroup {
    optional int64 group_id = 1;

    repeated int32 value = 2;
  }

  repeated StateGroup group = 1;
}

message State {
  optional int64 id = 1;

  optional int32 atom_id = 2;

  optional StateMap map = 3;
}

message MetricConditionLink {
  optional int64 condition = 1;

  optional FieldMatcher fields_in_what = 2;

  optional FieldMatcher fields_in_condition = 3;
}

message MetricStateLink {
  optional int32 state_atom_id = 1;

  optional FieldMatcher fields_in_what = 2;

  optional FieldMatcher fields_in_state = 3;
}

message FieldFilter {
  optional bool include_all = 1 [default = false];
  optional FieldMatcher fields = 2;
}

message UploadThreshold {
    oneof value_comparison {
        int64 lt_int = 1;
        int64 gt_int = 2;
        float lt_float = 3;
        float gt_float = 4;
        int64 lte_int = 5;
        int64 gte_int = 6;
    }
}

message EventMetric {
  optional int64 id = 1;

  optional int64 what = 2;

  optional int64 condition = 3;

  repeated MetricConditionLink links = 4;

  reserved 100;
  reserved 101;
}

message CountMetric {
  optional int64 id = 1;

  optional int64 what = 2;

  optional int64 condition = 3;

  optional FieldMatcher dimensions_in_what = 4;

  repeated int64 slice_by_state = 8;

  optional TimeUnit bucket = 5;

  repeated MetricConditionLink links = 6;

  repeated MetricStateLink state_link = 9;

  optional UploadThreshold threshold = 10;

  optional FieldMatcher dimensions_in_condition = 7 [deprecated = true];

  reserved 100;
  reserved 101;
}

message DurationMetric {
  optional int64 id = 1;

  optional int64 what = 2;

  optional int64 condition = 3;

  repeated int64 slice_by_state = 9;

  repeated MetricConditionLink links = 4;

  repeated MetricStateLink state_link = 10;

  enum AggregationType {
    SUM = 1;

    MAX_SPARSE = 2;
  }
  optional AggregationType aggregation_type = 5 [default = SUM];

  optional FieldMatcher dimensions_in_what = 6;

  optional TimeUnit bucket = 7;

  optional UploadThreshold threshold = 11;

  optional FieldMatcher dimensions_in_condition = 8 [deprecated = true];

  reserved 100;
  reserved 101;
}

message GaugeMetric {
  optional int64 id = 1;

  optional int64 what = 2;

  optional int64 trigger_event = 12;

  optional FieldFilter gauge_fields_filter = 3;

  optional int64 condition = 4;

  optional FieldMatcher dimensions_in_what = 5;

  optional FieldMatcher dimensions_in_condition = 8 [deprecated = true];

  optional TimeUnit bucket = 6;

  repeated MetricConditionLink links = 7;

  enum SamplingType {
    RANDOM_ONE_SAMPLE = 1;
    ALL_CONDITION_CHANGES = 2 [deprecated = true];
    CONDITION_CHANGE_TO_TRUE = 3;
    FIRST_N_SAMPLES = 4;
  }
  optional SamplingType sampling_type = 9 [default = RANDOM_ONE_SAMPLE] ;

  optional int64 min_bucket_size_nanos = 10;

  optional int64 max_num_gauge_atoms_per_bucket = 11 [default = 10];

  optional int32 max_pull_delay_sec = 13 [default = 30];

  optional bool split_bucket_for_app_upgrade = 14 [default = true];

  reserved 100;
  reserved 101;
}

message ValueMetric {
  optional int64 id = 1;

  optional int64 what = 2;

  optional FieldMatcher value_field = 3;

  optional int64 condition = 4;

  optional FieldMatcher dimensions_in_what = 5;

  repeated int64 slice_by_state = 18;

  optional TimeUnit bucket = 6;

  repeated MetricConditionLink links = 7;

  repeated MetricStateLink state_link = 19;

  optional UploadThreshold threshold = 20;

  enum AggregationType {
    SUM = 1;
    MIN = 2;
    MAX = 3;
    AVG = 4;
  }
  optional AggregationType aggregation_type = 8 [default = SUM];

  optional int64 min_bucket_size_nanos = 10;

  optional bool use_absolute_value_on_reset = 11 [default = false];

  optional bool use_diff = 12;

  optional bool use_zero_default_base = 15 [default = false];

  enum ValueDirection {
      UNKNOWN = 0;
      INCREASING = 1;
      DECREASING = 2;
      ANY = 3;
  }
  optional ValueDirection value_direction = 13 [default = INCREASING];

  optional bool skip_zero_diff_output = 14 [default = true];

  optional int32 max_pull_delay_sec = 16 [default = 30];

  optional bool split_bucket_for_app_upgrade = 17 [default = true];

  optional FieldMatcher dimensions_in_condition = 9 [deprecated = true];

  reserved 100;
  reserved 101;
}

message Alert {
  optional int64 id = 1;

  optional int64 metric_id = 2;

  optional int32 num_buckets = 3;

  optional int32 refractory_period_secs = 4;

  optional double trigger_if_sum_gt = 5;
}

message Alarm {
  optional int64 id = 1;

  optional int64 offset_millis = 2;

  optional int64 period_millis = 3;
}

message IncidentdDetails {
  repeated int32 section = 1;

  enum Destination {
    AUTOMATIC = 0;
    EXPLICIT = 1;
  }
  optional Destination dest = 2;

  // Package name of the incident report receiver.
  optional string receiver_pkg = 3;

  // Class name of the incident report receiver.
  optional string receiver_cls = 4;

  optional string alert_description = 5;
}

message PerfettoDetails {
  // The |trace_config| field is a proto-encoded message of type
  // perfetto.protos.TraceConfig defined in
  // //external/perfetto/protos/perfetto/config/. On device,
  // statsd doesn't need to deserialize the message as it's just
  // passed binary-encoded to the perfetto cmdline client.
  optional bytes trace_config = 1;
}

message BroadcastSubscriberDetails {
  optional int64 subscriber_id = 1;
  repeated string cookie = 2;
}

message Subscription {
  optional int64 id = 1;

  enum RuleType {
    RULE_TYPE_UNSPECIFIED = 0;
    ALARM = 1;
    ALERT = 2;
  }
  optional RuleType rule_type = 2;

  optional int64 rule_id = 3;

  oneof subscriber_information {
    IncidentdDetails incidentd_details = 4;
    PerfettoDetails perfetto_details = 5;
    BroadcastSubscriberDetails broadcast_subscriber_details = 6;
  }

  optional float probability_of_informing = 7 [default = 1.1];

  // This was used for perfprofd historically.
  reserved 8;
}

enum ActivationType {
  ACTIVATION_TYPE_UNKNOWN = 0;
  ACTIVATE_IMMEDIATELY = 1;
  ACTIVATE_ON_BOOT = 2;
}

message EventActivation {
  optional int64 atom_matcher_id = 1;
  optional int64 ttl_seconds = 2;
  optional int64 deactivation_atom_matcher_id = 3;
  optional ActivationType activation_type = 4;
}

message MetricActivation {
  optional int64 metric_id = 1;

  optional ActivationType activation_type = 3 [deprecated = true];

  repeated EventActivation event_activation = 2;
}

message PullAtomPackages {
    optional int32 atom_id = 1;

    repeated string packages = 2;
}

message StatsdConfig {
  optional int64 id = 1;

  repeated EventMetric event_metric = 2;

  repeated CountMetric count_metric = 3;

  repeated ValueMetric value_metric = 4;

  repeated GaugeMetric gauge_metric = 5;

  repeated DurationMetric duration_metric = 6;

  repeated AtomMatcher atom_matcher = 7;

  repeated Predicate predicate = 8;

  repeated Alert alert = 9;

  repeated Alarm alarm = 10;

  repeated Subscription subscription = 11;

  repeated string allowed_log_source = 12;

  repeated int64 no_report_metric = 13;

  message Annotation {
    optional int64 field_int64 = 1;
    optional int32 field_int32 = 2;
  }
  repeated Annotation annotation = 14;

  optional int64 ttl_in_seconds = 15;

  optional bool hash_strings_in_metric_report = 16 [default = true];

  repeated MetricActivation metric_activation = 17;

  optional bool version_strings_in_metric_report = 18;

  optional bool installer_in_metric_report = 19;

  optional bool persist_locally = 20 [default = false];

  repeated State state = 21;

  repeated string default_pull_packages = 22;

  repeated PullAtomPackages pull_atom_packages = 23;

  repeated int32 whitelisted_atom_ids = 24;

  // Field number 1000 is reserved for later use.
  reserved 1000;
}
