/*
 * 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.internal.os";
option java_outer_classname = "StatsdConfigProto";

enum Position {
    POSITION_UNKNOWN = 0;
    FIRST = 1;
    LAST = 2;
    ANY = 3;
}

message FieldMatcher {
    optional int32 field = 1;

    optional Position position = 2;

    repeated FieldMatcher child = 3;
}

message FieldValueMatcher {
    // Field id, as specified in the atom proto message.
    optional int32 field = 1;

    // For repeated fields, specifies the position in the array.
    // FIRST and LAST mean that if the values are found at the first
    // or last position, it's a match. ANY means that if the values are found
    // anywhere in the array, then it's a match.
    optional Position position = 2;

    oneof value_matcher {
        bool eq_bool = 3;
        string eq_string = 4;
        int32 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;
    }
}

message MessageMatcher {
    repeated FieldValueMatcher field_value_matcher = 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 = FALSE];

    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 Bucket {
    optional int64 bucket_size_millis = 1;
}

message MetricConditionLink {
    optional int64 condition = 1;

    optional FieldMatcher dimensions_in_what = 2;

    optional FieldMatcher dimensions_in_condition = 3;
}

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

message EventMetric {
    optional int64 id = 1;

    optional int64 what = 2;

    optional int64 condition = 3;

    repeated MetricConditionLink links = 4;
}

message CountMetric {
    optional int64 id = 1;

    optional int64 what = 2;

    optional int64 condition = 3;

    optional FieldMatcher dimensions = 4;

    optional Bucket bucket = 5;

    repeated MetricConditionLink links = 6;
}

message DurationMetric {
    optional int64 id = 1;

    optional int64 what = 2;

    optional int64 condition = 3;

    repeated MetricConditionLink links = 4;

    enum AggregationType {
        SUM = 1;

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

    optional FieldMatcher dimensions = 6;

    optional Bucket bucket = 7;
}

message GaugeMetric {
    optional int64 id = 1;

    optional int64 what = 2;

    optional FieldFilter gauge_fields_filter = 3;

    optional int64 condition = 4;

    optional FieldMatcher dimensions = 5;

    optional Bucket bucket = 6;

    repeated MetricConditionLink links = 7;
}

message ValueMetric {
    optional int64 id = 1;

    optional int64 what = 2;

    optional int32 value_field = 3;

    optional int64 condition = 4;

    optional FieldMatcher dimensions = 5;

    optional Bucket bucket = 6;

    repeated MetricConditionLink links = 7;

    enum AggregationType { SUM = 1; }
    optional AggregationType aggregation_type = 8 [default = SUM];
}

message Alert {
    optional int64 id = 1;

    optional int64 metric_id = 2;

    optional int32 number_of_buckets = 3;

    optional int32 refractory_period_secs = 4;

    optional int64 trigger_if_sum_gt = 5;
}

message AllowedLogSource {
    repeated int32 uid = 1;
    repeated string package = 2;
}

message Alarm {
    optional int64 id = 1;
    optional int64 offset_millis = 2;
    optional int64 period_millis = 3;
}

message IncidentdDetails {
    repeated int32 section = 1;
}

message PerfettoDetails {
    optional int32 perfetto_stuff = 1;
}

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;
    }
}

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;

    optional AllowedLogSource log_source = 12;

    repeated int64 no_report_metric = 13;
}
