// Copyright 2016 Google Inc.
//
// 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 = "proto3";

package google.monitoring.v3;

import "google/api/distribution.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";

option csharp_namespace = "Google.Cloud.Monitoring.V3";
option go_package = "google.golang.org/genproto/googleapis/monitoring/v3;monitoring";
option java_multiple_files = true;
option java_outer_classname = "CommonProto";
option java_package = "com.google.monitoring.v3";


// A single strongly-typed value.
message TypedValue {
  // The typed value field.
  oneof value {
    // A Boolean value: `true` or `false`.
    bool bool_value = 1;

    // A 64-bit integer. Its range is approximately &plusmn;9.2x10<sup>18</sup>.
    int64 int64_value = 2;

    // A 64-bit double-precision floating-point number. Its magnitude
    // is approximately &plusmn;10<sup>&plusmn;300</sup> and it has 16
    // significant digits of precision.
    double double_value = 3;

    // A variable-length string value.
    string string_value = 4;

    // A distribution value.
    google.api.Distribution distribution_value = 5;
  }
}

// A time interval extending just after a start time through an end time.
// If the start time is the same as the end time, then the interval
// represents a single point in time.
message TimeInterval {
  // Required. The end of the time interval.
  google.protobuf.Timestamp end_time = 2;

  // Optional. The beginning of the time interval.  The default value
  // for the start time is the end time. The start time must not be
  // later than the end time.
  google.protobuf.Timestamp start_time = 1;
}

// Describes how to combine multiple time series to provide different views of
// the data.  Aggregation consists of an alignment step on individual time
// series (`per_series_aligner`) followed by an optional reduction of the data
// across different time series (`cross_series_reducer`).  For more details, see
// [Aggregation](/monitoring/api/learn_more#aggregation).
message Aggregation {
  // The Aligner describes how to bring the data points in a single
  // time series into temporal alignment.
  enum Aligner {
    // No alignment. Raw data is returned. Not valid if cross-time
    // series reduction is requested. The value type of the result is
    // the same as the value type of the input.
    ALIGN_NONE = 0;

    // Align and convert to delta metric type. This alignment is valid
    // for cumulative metrics and delta metrics. Aligning an existing
    // delta metric to a delta metric requires that the alignment
    // period be increased. The value type of the result is the same
    // as the value type of the input.
    ALIGN_DELTA = 1;

    // Align and convert to a rate. This alignment is valid for
    // cumulative metrics and delta metrics with numeric values. The output is a
    // gauge metric with value type
    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
    ALIGN_RATE = 2;

    // Align by interpolating between adjacent points around the
    // period boundary. This alignment is valid for gauge
    // metrics with numeric values. The value type of the result is the same
    // as the value type of the input.
    ALIGN_INTERPOLATE = 3;

    // Align by shifting the oldest data point before the period
    // boundary to the boundary. This alignment is valid for gauge
    // metrics. The value type of the result is the same as the
    // value type of the input.
    ALIGN_NEXT_OLDER = 4;

    // Align time series via aggregation. The resulting data point in
    // the alignment period is the minimum of all data points in the
    // period. This alignment is valid for gauge and delta metrics with numeric
    // values. The value type of the result is the same as the value
    // type of the input.
    ALIGN_MIN = 10;

    // Align time series via aggregation. The resulting data point in
    // the alignment period is the maximum of all data points in the
    // period. This alignment is valid for gauge and delta metrics with numeric
    // values. The value type of the result is the same as the value
    // type of the input.
    ALIGN_MAX = 11;

    // Align time series via aggregation. The resulting data point in
    // the alignment period is the average or arithmetic mean of all
    // data points in the period. This alignment is valid for gauge and delta
    // metrics with numeric values. The value type of the output is
    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
    ALIGN_MEAN = 12;

    // Align time series via aggregation. The resulting data point in
    // the alignment period is the count of all data points in the
    // period. This alignment is valid for gauge and delta metrics with numeric
    // or Boolean values. The value type of the output is
    // [INT64][google.api.MetricDescriptor.ValueType.INT64].
    ALIGN_COUNT = 13;

    // Align time series via aggregation. The resulting data point in
    // the alignment period is the sum of all data points in the
    // period. This alignment is valid for gauge and delta metrics with numeric
    // and distribution values. The value type of the output is the
    // same as the value type of the input.
    ALIGN_SUM = 14;

    // Align time series via aggregation. The resulting data point in
    // the alignment period is the standard deviation of all data
    // points in the period. This alignment is valid for gauge and delta metrics
    // with numeric values. The value type of the output is
    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
    ALIGN_STDDEV = 15;

    // Align time series via aggregation. The resulting data point in
    // the alignment period is the count of True-valued data points in the
    // period. This alignment is valid for gauge metrics with
    // Boolean values. The value type of the output is
    // [INT64][google.api.MetricDescriptor.ValueType.INT64].
    ALIGN_COUNT_TRUE = 16;

    // Align time series via aggregation. The resulting data point in
    // the alignment period is the fraction of True-valued data points in the
    // period. This alignment is valid for gauge metrics with Boolean values.
    // The output value is in the range [0, 1] and has value type
    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
    ALIGN_FRACTION_TRUE = 17;

    // Align time series via aggregation. The resulting data point in
    // the alignment period is the 99th percentile of all data
    // points in the period. This alignment is valid for gauge and delta metrics
    // with distribution values. The output is a gauge metric with value type
    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
    ALIGN_PERCENTILE_99 = 18;

    // Align time series via aggregation. The resulting data point in
    // the alignment period is the 95th percentile of all data
    // points in the period. This alignment is valid for gauge and delta metrics
    // with distribution values. The output is a gauge metric with value type
    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
    ALIGN_PERCENTILE_95 = 19;

    // Align time series via aggregation. The resulting data point in
    // the alignment period is the 50th percentile of all data
    // points in the period. This alignment is valid for gauge and delta metrics
    // with distribution values. The output is a gauge metric with value type
    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
    ALIGN_PERCENTILE_50 = 20;

    // Align time series via aggregation. The resulting data point in
    // the alignment period is the 5th percentile of all data
    // points in the period. This alignment is valid for gauge and delta metrics
    // with distribution values. The output is a gauge metric with value type
    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
    ALIGN_PERCENTILE_05 = 21;
  }

  // A Reducer describes how to aggregate data points from multiple
  // time series into a single time series.
  enum Reducer {
    // No cross-time series reduction. The output of the aligner is
    // returned.
    REDUCE_NONE = 0;

    // Reduce by computing the mean across time series for each
    // alignment period. This reducer is valid for delta and
    // gauge metrics with numeric or distribution values. The value type of the
    // output is [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
    REDUCE_MEAN = 1;

    // Reduce by computing the minimum across time series for each
    // alignment period. This reducer is valid for delta and
    // gauge metrics with numeric values. The value type of the output
    // is the same as the value type of the input.
    REDUCE_MIN = 2;

    // Reduce by computing the maximum across time series for each
    // alignment period. This reducer is valid for delta and
    // gauge metrics with numeric values. The value type of the output
    // is the same as the value type of the input.
    REDUCE_MAX = 3;

    // Reduce by computing the sum across time series for each
    // alignment period. This reducer is valid for delta and
    // gauge metrics with numeric and distribution values. The value type of
    // the output is the same as the value type of the input.
    REDUCE_SUM = 4;

    // Reduce by computing the standard deviation across time series
    // for each alignment period. This reducer is valid for delta
    // and gauge metrics with numeric or distribution values. The value type of
    // the output is [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
    REDUCE_STDDEV = 5;

    // Reduce by computing the count of data points across time series
    // for each alignment period. This reducer is valid for delta
    // and gauge metrics of numeric, Boolean, distribution, and string value
    // type. The value type of the output is
    // [INT64][google.api.MetricDescriptor.ValueType.INT64].
    REDUCE_COUNT = 6;

    // Reduce by computing the count of True-valued data points across time
    // series for each alignment period. This reducer is valid for delta
    // and gauge metrics of Boolean value type. The value type of
    // the output is [INT64][google.api.MetricDescriptor.ValueType.INT64].
    REDUCE_COUNT_TRUE = 7;

    // Reduce by computing the fraction of True-valued data points across time
    // series for each alignment period. This reducer is valid for delta
    // and gauge metrics of Boolean value type. The output value is in the
    // range [0, 1] and has value type
    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
    REDUCE_FRACTION_TRUE = 8;

    // Reduce by computing 99th percentile of data points across time series
    // for each alignment period. This reducer is valid for gauge and delta
    // metrics of numeric and distribution type. The value of the output is
    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE]
    REDUCE_PERCENTILE_99 = 9;

    // Reduce by computing 95th percentile of data points across time series
    // for each alignment period. This reducer is valid for gauge and delta
    // metrics of numeric and distribution type. The value of the output is
    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE]
    REDUCE_PERCENTILE_95 = 10;

    // Reduce by computing 50th percentile of data points across time series
    // for each alignment period. This reducer is valid for gauge and delta
    // metrics of numeric and distribution type. The value of the output is
    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE]
    REDUCE_PERCENTILE_50 = 11;

    // Reduce by computing 5th percentile of data points across time series
    // for each alignment period. This reducer is valid for gauge and delta
    // metrics of numeric and distribution type. The value of the output is
    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE]
    REDUCE_PERCENTILE_05 = 12;
  }

  // The alignment period for per-[time series][google.monitoring.v3.TimeSeries]
  // alignment. If present, `alignmentPeriod` must be at least 60
  // seconds.  After per-time series alignment, each time series will
  // contain data points only on the period boundaries. If
  // `perSeriesAligner` is not specified or equals `ALIGN_NONE`, then
  // this field is ignored. If `perSeriesAligner` is specified and
  // does not equal `ALIGN_NONE`, then this field must be defined;
  // otherwise an error is returned.
  google.protobuf.Duration alignment_period = 1;

  // The approach to be used to align individual time series. Not all
  // alignment functions may be applied to all time series, depending
  // on the metric type and value type of the original time
  // series. Alignment may change the metric type or the value type of
  // the time series.
  //
  // Time series data must be aligned in order to perform cross-time
  // series reduction. If `crossSeriesReducer` is specified, then
  // `perSeriesAligner` must be specified and not equal `ALIGN_NONE`
  // and `alignmentPeriod` must be specified; otherwise, an error is
  // returned.
  Aligner per_series_aligner = 2;

  // The approach to be used to combine time series. Not all reducer
  // functions may be applied to all time series, depending on the
  // metric type and the value type of the original time
  // series. Reduction may change the metric type of value type of the
  // time series.
  //
  // Time series data must be aligned in order to perform cross-time
  // series reduction. If `crossSeriesReducer` is specified, then
  // `perSeriesAligner` must be specified and not equal `ALIGN_NONE`
  // and `alignmentPeriod` must be specified; otherwise, an error is
  // returned.
  Reducer cross_series_reducer = 4;

  // The set of fields to preserve when `crossSeriesReducer` is
  // specified. The `groupByFields` determine how the time series are
  // partitioned into subsets prior to applying the aggregation
  // function. Each subset contains time series that have the same
  // value for each of the grouping fields. Each individual time
  // series is a member of exactly one subset. The
  // `crossSeriesReducer` is applied to each subset of time series.
  // It is not possible to reduce across different resource types, so
  // this field implicitly contains `resource.type`.  Fields not
  // specified in `groupByFields` are aggregated away.  If
  // `groupByFields` is not specified and all the time series have
  // the same resource type, then the time series are aggregated into
  // a single output time series. If `crossSeriesReducer` is not
  // defined, this field is ignored.
  repeated string group_by_fields = 5;
}
