// Copyright 2020 Google LLC
//
// 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.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/monitoring/v3/common.proto

package monitoring

import (
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	duration "github.com/golang/protobuf/ptypes/duration"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	distribution "google.golang.org/genproto/googleapis/api/distribution"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// Specifies an ordering relationship on two arguments, called `left` and
// `right`.
type ComparisonType int32

const (
	// No ordering relationship is specified.
	ComparisonType_COMPARISON_UNSPECIFIED ComparisonType = 0
	// True if the left argument is greater than the right argument.
	ComparisonType_COMPARISON_GT ComparisonType = 1
	// True if the left argument is greater than or equal to the right argument.
	ComparisonType_COMPARISON_GE ComparisonType = 2
	// True if the left argument is less than the right argument.
	ComparisonType_COMPARISON_LT ComparisonType = 3
	// True if the left argument is less than or equal to the right argument.
	ComparisonType_COMPARISON_LE ComparisonType = 4
	// True if the left argument is equal to the right argument.
	ComparisonType_COMPARISON_EQ ComparisonType = 5
	// True if the left argument is not equal to the right argument.
	ComparisonType_COMPARISON_NE ComparisonType = 6
)

// Enum value maps for ComparisonType.
var (
	ComparisonType_name = map[int32]string{
		0: "COMPARISON_UNSPECIFIED",
		1: "COMPARISON_GT",
		2: "COMPARISON_GE",
		3: "COMPARISON_LT",
		4: "COMPARISON_LE",
		5: "COMPARISON_EQ",
		6: "COMPARISON_NE",
	}
	ComparisonType_value = map[string]int32{
		"COMPARISON_UNSPECIFIED": 0,
		"COMPARISON_GT":          1,
		"COMPARISON_GE":          2,
		"COMPARISON_LT":          3,
		"COMPARISON_LE":          4,
		"COMPARISON_EQ":          5,
		"COMPARISON_NE":          6,
	}
)

func (x ComparisonType) Enum() *ComparisonType {
	p := new(ComparisonType)
	*p = x
	return p
}

func (x ComparisonType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ComparisonType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_monitoring_v3_common_proto_enumTypes[0].Descriptor()
}

func (ComparisonType) Type() protoreflect.EnumType {
	return &file_google_monitoring_v3_common_proto_enumTypes[0]
}

func (x ComparisonType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ComparisonType.Descriptor instead.
func (ComparisonType) EnumDescriptor() ([]byte, []int) {
	return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{0}
}

// The tier of service for a Workspace. Please see the
// [service tiers
// documentation](https://cloud.google.com/monitoring/workspaces/tiers) for more
// details.
//
// Deprecated: Do not use.
type ServiceTier int32

const (
	// An invalid sentinel value, used to indicate that a tier has not
	// been provided explicitly.
	ServiceTier_SERVICE_TIER_UNSPECIFIED ServiceTier = 0
	// The Stackdriver Basic tier, a free tier of service that provides basic
	// features, a moderate allotment of logs, and access to built-in metrics.
	// A number of features are not available in this tier. For more details,
	// see [the service tiers
	// documentation](https://cloud.google.com/monitoring/workspaces/tiers).
	ServiceTier_SERVICE_TIER_BASIC ServiceTier = 1
	// The Stackdriver Premium tier, a higher, more expensive tier of service
	// that provides access to all Stackdriver features, lets you use Stackdriver
	// with AWS accounts, and has a larger allotments for logs and metrics. For
	// more details, see [the service tiers
	// documentation](https://cloud.google.com/monitoring/workspaces/tiers).
	ServiceTier_SERVICE_TIER_PREMIUM ServiceTier = 2
)

// Enum value maps for ServiceTier.
var (
	ServiceTier_name = map[int32]string{
		0: "SERVICE_TIER_UNSPECIFIED",
		1: "SERVICE_TIER_BASIC",
		2: "SERVICE_TIER_PREMIUM",
	}
	ServiceTier_value = map[string]int32{
		"SERVICE_TIER_UNSPECIFIED": 0,
		"SERVICE_TIER_BASIC":       1,
		"SERVICE_TIER_PREMIUM":     2,
	}
)

func (x ServiceTier) Enum() *ServiceTier {
	p := new(ServiceTier)
	*p = x
	return p
}

func (x ServiceTier) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ServiceTier) Descriptor() protoreflect.EnumDescriptor {
	return file_google_monitoring_v3_common_proto_enumTypes[1].Descriptor()
}

func (ServiceTier) Type() protoreflect.EnumType {
	return &file_google_monitoring_v3_common_proto_enumTypes[1]
}

func (x ServiceTier) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ServiceTier.Descriptor instead.
func (ServiceTier) EnumDescriptor() ([]byte, []int) {
	return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{1}
}

// The `Aligner` specifies the operation that will be applied to the data
// points in each alignment period in a time series. Except for
// `ALIGN_NONE`, which specifies that no operation be applied, each alignment
// operation replaces the set of data values in each alignment period with
// a single value: the result of applying the operation to the data values.
// An aligned time series has a single data value at the end of each
// `alignment_period`.
//
// An alignment operation can change the data type of the values, too. For
// example, if you apply a counting operation to boolean values, the data
// `value_type` in the original time series is `BOOLEAN`, but the `value_type`
// in the aligned result is `INT64`.
type Aggregation_Aligner int32

const (
	// No alignment. Raw data is returned. Not valid if cross-series reduction
	// is requested. The `value_type` of the result is the same as the
	// `value_type` of the input.
	Aggregation_ALIGN_NONE Aggregation_Aligner = 0
	// Align and convert to
	// [DELTA][google.api.MetricDescriptor.MetricKind.DELTA].
	// The output is `delta = y1 - y0`.
	//
	// This alignment is valid for
	// [CUMULATIVE][google.api.MetricDescriptor.MetricKind.CUMULATIVE] and
	// `DELTA` metrics. If the selected alignment period results in periods
	// with no data, then the aligned value for such a period is created by
	// interpolation. The `value_type`  of the aligned result is the same as
	// the `value_type` of the input.
	Aggregation_ALIGN_DELTA Aggregation_Aligner = 1
	// Align and convert to a rate. The result is computed as
	// `rate = (y1 - y0)/(t1 - t0)`, or "delta over time".
	// Think of this aligner as providing the slope of the line that passes
	// through the value at the start and at the end of the `alignment_period`.
	//
	// This aligner is valid for `CUMULATIVE`
	// and `DELTA` metrics with numeric values. If the selected alignment
	// period results in periods with no data, then the aligned value for
	// such a period is created by interpolation. The output is a `GAUGE`
	// metric with `value_type` `DOUBLE`.
	//
	// If, by "rate", you mean "percentage change", see the
	// `ALIGN_PERCENT_CHANGE` aligner instead.
	Aggregation_ALIGN_RATE Aggregation_Aligner = 2
	// Align by interpolating between adjacent points around the alignment
	// period boundary. This aligner is valid for `GAUGE` metrics with
	// numeric values. The `value_type` of the aligned result is the same as the
	// `value_type` of the input.
	Aggregation_ALIGN_INTERPOLATE Aggregation_Aligner = 3
	// Align by moving the most recent data point before the end of the
	// alignment period to the boundary at the end of the alignment
	// period. This aligner is valid for `GAUGE` metrics. The `value_type` of
	// the aligned result is the same as the `value_type` of the input.
	Aggregation_ALIGN_NEXT_OLDER Aggregation_Aligner = 4
	// Align the time series by returning the minimum value in each alignment
	// period. This aligner is valid for `GAUGE` and `DELTA` metrics with
	// numeric values. The `value_type` of the aligned result is the same as
	// the `value_type` of the input.
	Aggregation_ALIGN_MIN Aggregation_Aligner = 10
	// Align the time series by returning the maximum value in each alignment
	// period. This aligner is valid for `GAUGE` and `DELTA` metrics with
	// numeric values. The `value_type` of the aligned result is the same as
	// the `value_type` of the input.
	Aggregation_ALIGN_MAX Aggregation_Aligner = 11
	// Align the time series by returning the mean value in each alignment
	// period. This aligner is valid for `GAUGE` and `DELTA` metrics with
	// numeric values. The `value_type` of the aligned result is `DOUBLE`.
	Aggregation_ALIGN_MEAN Aggregation_Aligner = 12
	// Align the time series by returning the number of values in each alignment
	// period. This aligner is valid for `GAUGE` and `DELTA` metrics with
	// numeric or Boolean values. The `value_type` of the aligned result is
	// `INT64`.
	Aggregation_ALIGN_COUNT Aggregation_Aligner = 13
	// Align the time series by returning the sum of the values in each
	// alignment period. This aligner is valid for `GAUGE` and `DELTA`
	// metrics with numeric and distribution values. The `value_type` of the
	// aligned result is the same as the `value_type` of the input.
	Aggregation_ALIGN_SUM Aggregation_Aligner = 14
	// Align the time series by returning the standard deviation of the values
	// in each alignment period. This aligner is valid for `GAUGE` and
	// `DELTA` metrics with numeric values. The `value_type` of the output is
	// `DOUBLE`.
	Aggregation_ALIGN_STDDEV Aggregation_Aligner = 15
	// Align the time series by returning the number of `True` values in
	// each alignment period. This aligner is valid for `GAUGE` metrics with
	// Boolean values. The `value_type` of the output is `INT64`.
	Aggregation_ALIGN_COUNT_TRUE Aggregation_Aligner = 16
	// Align the time series by returning the number of `False` values in
	// each alignment period. This aligner is valid for `GAUGE` metrics with
	// Boolean values. The `value_type` of the output is `INT64`.
	Aggregation_ALIGN_COUNT_FALSE Aggregation_Aligner = 24
	// Align the time series by returning the ratio of the number of `True`
	// values to the total number of values in each alignment period. This
	// aligner is valid for `GAUGE` metrics with Boolean values. The output
	// value is in the range [0.0, 1.0] and has `value_type` `DOUBLE`.
	Aggregation_ALIGN_FRACTION_TRUE Aggregation_Aligner = 17
	// Align the time series by using [percentile
	// aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting
	// data point in each alignment period is the 99th percentile of all data
	// points in the period. This aligner is valid for `GAUGE` and `DELTA`
	// metrics with distribution values. The output is a `GAUGE` metric with
	// `value_type` `DOUBLE`.
	Aggregation_ALIGN_PERCENTILE_99 Aggregation_Aligner = 18
	// Align the time series by using [percentile
	// aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting
	// data point in each alignment period is the 95th percentile of all data
	// points in the period. This aligner is valid for `GAUGE` and `DELTA`
	// metrics with distribution values. The output is a `GAUGE` metric with
	// `value_type` `DOUBLE`.
	Aggregation_ALIGN_PERCENTILE_95 Aggregation_Aligner = 19
	// Align the time series by using [percentile
	// aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting
	// data point in each alignment period is the 50th percentile of all data
	// points in the period. This aligner is valid for `GAUGE` and `DELTA`
	// metrics with distribution values. The output is a `GAUGE` metric with
	// `value_type` `DOUBLE`.
	Aggregation_ALIGN_PERCENTILE_50 Aggregation_Aligner = 20
	// Align the time series by using [percentile
	// aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting
	// data point in each alignment period is the 5th percentile of all data
	// points in the period. This aligner is valid for `GAUGE` and `DELTA`
	// metrics with distribution values. The output is a `GAUGE` metric with
	// `value_type` `DOUBLE`.
	Aggregation_ALIGN_PERCENTILE_05 Aggregation_Aligner = 21
	// Align and convert to a percentage change. This aligner is valid for
	// `GAUGE` and `DELTA` metrics with numeric values. This alignment returns
	// `((current - previous)/previous) * 100`, where the value of `previous` is
	// determined based on the `alignment_period`.
	//
	// If the values of `current` and `previous` are both 0, then the returned
	// value is 0. If only `previous` is 0, the returned value is infinity.
	//
	// A 10-minute moving mean is computed at each point of the alignment period
	// prior to the above calculation to smooth the metric and prevent false
	// positives from very short-lived spikes. The moving mean is only
	// applicable for data whose values are `>= 0`. Any values `< 0` are
	// treated as a missing datapoint, and are ignored. While `DELTA`
	// metrics are accepted by this alignment, special care should be taken that
	// the values for the metric will always be positive. The output is a
	// `GAUGE` metric with `value_type` `DOUBLE`.
	Aggregation_ALIGN_PERCENT_CHANGE Aggregation_Aligner = 23
)

// Enum value maps for Aggregation_Aligner.
var (
	Aggregation_Aligner_name = map[int32]string{
		0:  "ALIGN_NONE",
		1:  "ALIGN_DELTA",
		2:  "ALIGN_RATE",
		3:  "ALIGN_INTERPOLATE",
		4:  "ALIGN_NEXT_OLDER",
		10: "ALIGN_MIN",
		11: "ALIGN_MAX",
		12: "ALIGN_MEAN",
		13: "ALIGN_COUNT",
		14: "ALIGN_SUM",
		15: "ALIGN_STDDEV",
		16: "ALIGN_COUNT_TRUE",
		24: "ALIGN_COUNT_FALSE",
		17: "ALIGN_FRACTION_TRUE",
		18: "ALIGN_PERCENTILE_99",
		19: "ALIGN_PERCENTILE_95",
		20: "ALIGN_PERCENTILE_50",
		21: "ALIGN_PERCENTILE_05",
		23: "ALIGN_PERCENT_CHANGE",
	}
	Aggregation_Aligner_value = map[string]int32{
		"ALIGN_NONE":           0,
		"ALIGN_DELTA":          1,
		"ALIGN_RATE":           2,
		"ALIGN_INTERPOLATE":    3,
		"ALIGN_NEXT_OLDER":     4,
		"ALIGN_MIN":            10,
		"ALIGN_MAX":            11,
		"ALIGN_MEAN":           12,
		"ALIGN_COUNT":          13,
		"ALIGN_SUM":            14,
		"ALIGN_STDDEV":         15,
		"ALIGN_COUNT_TRUE":     16,
		"ALIGN_COUNT_FALSE":    24,
		"ALIGN_FRACTION_TRUE":  17,
		"ALIGN_PERCENTILE_99":  18,
		"ALIGN_PERCENTILE_95":  19,
		"ALIGN_PERCENTILE_50":  20,
		"ALIGN_PERCENTILE_05":  21,
		"ALIGN_PERCENT_CHANGE": 23,
	}
)

func (x Aggregation_Aligner) Enum() *Aggregation_Aligner {
	p := new(Aggregation_Aligner)
	*p = x
	return p
}

func (x Aggregation_Aligner) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Aggregation_Aligner) Descriptor() protoreflect.EnumDescriptor {
	return file_google_monitoring_v3_common_proto_enumTypes[2].Descriptor()
}

func (Aggregation_Aligner) Type() protoreflect.EnumType {
	return &file_google_monitoring_v3_common_proto_enumTypes[2]
}

func (x Aggregation_Aligner) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Aggregation_Aligner.Descriptor instead.
func (Aggregation_Aligner) EnumDescriptor() ([]byte, []int) {
	return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{2, 0}
}

// A Reducer operation describes how to aggregate data points from multiple
// time series into a single time series, where the value of each data point
// in the resulting series is a function of all the already aligned values in
// the input time series.
type Aggregation_Reducer int32

const (
	// No cross-time series reduction. The output of the `Aligner` is
	// returned.
	Aggregation_REDUCE_NONE Aggregation_Reducer = 0
	// Reduce by computing the mean value across time series for each
	// alignment period. This reducer is valid for
	// [DELTA][google.api.MetricDescriptor.MetricKind.DELTA] and
	// [GAUGE][google.api.MetricDescriptor.MetricKind.GAUGE] metrics with
	// numeric or distribution values. The `value_type` of the output is
	// [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
	Aggregation_REDUCE_MEAN Aggregation_Reducer = 1
	// Reduce by computing the minimum value 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.
	Aggregation_REDUCE_MIN Aggregation_Reducer = 2
	// Reduce by computing the maximum value 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.
	Aggregation_REDUCE_MAX Aggregation_Reducer = 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.
	Aggregation_REDUCE_SUM Aggregation_Reducer = 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`.
	Aggregation_REDUCE_STDDEV Aggregation_Reducer = 5
	// Reduce by computing the number 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`.
	Aggregation_REDUCE_COUNT Aggregation_Reducer = 6
	// Reduce by computing the number 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`.
	Aggregation_REDUCE_COUNT_TRUE Aggregation_Reducer = 7
	// Reduce by computing the number of `False`-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`.
	Aggregation_REDUCE_COUNT_FALSE Aggregation_Reducer = 15
	// Reduce by computing the ratio of the number of `True`-valued data points
	// to the total number of data points 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.0, 1.0] and has `value_type`
	// `DOUBLE`.
	Aggregation_REDUCE_FRACTION_TRUE Aggregation_Reducer = 8
	// Reduce by computing the [99th
	// percentile](https://en.wikipedia.org/wiki/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`.
	Aggregation_REDUCE_PERCENTILE_99 Aggregation_Reducer = 9
	// Reduce by computing the [95th
	// percentile](https://en.wikipedia.org/wiki/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`.
	Aggregation_REDUCE_PERCENTILE_95 Aggregation_Reducer = 10
	// Reduce by computing the [50th
	// percentile](https://en.wikipedia.org/wiki/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`.
	Aggregation_REDUCE_PERCENTILE_50 Aggregation_Reducer = 11
	// Reduce by computing the [5th
	// percentile](https://en.wikipedia.org/wiki/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`.
	Aggregation_REDUCE_PERCENTILE_05 Aggregation_Reducer = 12
)

// Enum value maps for Aggregation_Reducer.
var (
	Aggregation_Reducer_name = map[int32]string{
		0:  "REDUCE_NONE",
		1:  "REDUCE_MEAN",
		2:  "REDUCE_MIN",
		3:  "REDUCE_MAX",
		4:  "REDUCE_SUM",
		5:  "REDUCE_STDDEV",
		6:  "REDUCE_COUNT",
		7:  "REDUCE_COUNT_TRUE",
		15: "REDUCE_COUNT_FALSE",
		8:  "REDUCE_FRACTION_TRUE",
		9:  "REDUCE_PERCENTILE_99",
		10: "REDUCE_PERCENTILE_95",
		11: "REDUCE_PERCENTILE_50",
		12: "REDUCE_PERCENTILE_05",
	}
	Aggregation_Reducer_value = map[string]int32{
		"REDUCE_NONE":          0,
		"REDUCE_MEAN":          1,
		"REDUCE_MIN":           2,
		"REDUCE_MAX":           3,
		"REDUCE_SUM":           4,
		"REDUCE_STDDEV":        5,
		"REDUCE_COUNT":         6,
		"REDUCE_COUNT_TRUE":    7,
		"REDUCE_COUNT_FALSE":   15,
		"REDUCE_FRACTION_TRUE": 8,
		"REDUCE_PERCENTILE_99": 9,
		"REDUCE_PERCENTILE_95": 10,
		"REDUCE_PERCENTILE_50": 11,
		"REDUCE_PERCENTILE_05": 12,
	}
)

func (x Aggregation_Reducer) Enum() *Aggregation_Reducer {
	p := new(Aggregation_Reducer)
	*p = x
	return p
}

func (x Aggregation_Reducer) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Aggregation_Reducer) Descriptor() protoreflect.EnumDescriptor {
	return file_google_monitoring_v3_common_proto_enumTypes[3].Descriptor()
}

func (Aggregation_Reducer) Type() protoreflect.EnumType {
	return &file_google_monitoring_v3_common_proto_enumTypes[3]
}

func (x Aggregation_Reducer) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Aggregation_Reducer.Descriptor instead.
func (Aggregation_Reducer) EnumDescriptor() ([]byte, []int) {
	return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{2, 1}
}

// A single strongly-typed value.
type TypedValue struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The typed value field.
	//
	// Types that are assignable to Value:
	//	*TypedValue_BoolValue
	//	*TypedValue_Int64Value
	//	*TypedValue_DoubleValue
	//	*TypedValue_StringValue
	//	*TypedValue_DistributionValue
	Value isTypedValue_Value `protobuf_oneof:"value"`
}

func (x *TypedValue) Reset() {
	*x = TypedValue{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_monitoring_v3_common_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TypedValue) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TypedValue) ProtoMessage() {}

func (x *TypedValue) ProtoReflect() protoreflect.Message {
	mi := &file_google_monitoring_v3_common_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TypedValue.ProtoReflect.Descriptor instead.
func (*TypedValue) Descriptor() ([]byte, []int) {
	return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{0}
}

func (m *TypedValue) GetValue() isTypedValue_Value {
	if m != nil {
		return m.Value
	}
	return nil
}

func (x *TypedValue) GetBoolValue() bool {
	if x, ok := x.GetValue().(*TypedValue_BoolValue); ok {
		return x.BoolValue
	}
	return false
}

func (x *TypedValue) GetInt64Value() int64 {
	if x, ok := x.GetValue().(*TypedValue_Int64Value); ok {
		return x.Int64Value
	}
	return 0
}

func (x *TypedValue) GetDoubleValue() float64 {
	if x, ok := x.GetValue().(*TypedValue_DoubleValue); ok {
		return x.DoubleValue
	}
	return 0
}

func (x *TypedValue) GetStringValue() string {
	if x, ok := x.GetValue().(*TypedValue_StringValue); ok {
		return x.StringValue
	}
	return ""
}

func (x *TypedValue) GetDistributionValue() *distribution.Distribution {
	if x, ok := x.GetValue().(*TypedValue_DistributionValue); ok {
		return x.DistributionValue
	}
	return nil
}

type isTypedValue_Value interface {
	isTypedValue_Value()
}

type TypedValue_BoolValue struct {
	// A Boolean value: `true` or `false`.
	BoolValue bool `protobuf:"varint,1,opt,name=bool_value,json=boolValue,proto3,oneof"`
}

type TypedValue_Int64Value struct {
	// A 64-bit integer. Its range is approximately &plusmn;9.2x10<sup>18</sup>.
	Int64Value int64 `protobuf:"varint,2,opt,name=int64_value,json=int64Value,proto3,oneof"`
}

type TypedValue_DoubleValue struct {
	// 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.
	DoubleValue float64 `protobuf:"fixed64,3,opt,name=double_value,json=doubleValue,proto3,oneof"`
}

type TypedValue_StringValue struct {
	// A variable-length string value.
	StringValue string `protobuf:"bytes,4,opt,name=string_value,json=stringValue,proto3,oneof"`
}

type TypedValue_DistributionValue struct {
	// A distribution value.
	DistributionValue *distribution.Distribution `protobuf:"bytes,5,opt,name=distribution_value,json=distributionValue,proto3,oneof"`
}

func (*TypedValue_BoolValue) isTypedValue_Value() {}

func (*TypedValue_Int64Value) isTypedValue_Value() {}

func (*TypedValue_DoubleValue) isTypedValue_Value() {}

func (*TypedValue_StringValue) isTypedValue_Value() {}

func (*TypedValue_DistributionValue) isTypedValue_Value() {}

// A closed time interval. It extends from the start time to the end time, and includes both: `[startTime, endTime]`. Valid time intervals depend on the [`MetricKind`](/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors#MetricKind) of the metric value. In no case can the end time be earlier than the start time.
//
// * For a `GAUGE` metric, the `startTime` value is technically optional; if
//   no value is specified, the start time defaults to the value of the
//   end time, and the interval represents a single point in time. If both
//   start and end times are specified, they must be identical. Such an
//   interval is valid only for `GAUGE` metrics, which are point-in-time
//   measurements.
//
// * For `DELTA` and `CUMULATIVE` metrics, the start time must be earlier
//   than the end time.
//
// * In all cases, the start time of the next interval must be
//   at least a millisecond after the end time of the previous interval.
//   Because the interval is closed, if the start time of a new interval
//   is the same as the end time of the previous interval, data written
//   at the new start time could overwrite data written at the previous
//   end time.
type TimeInterval struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The end of the time interval.
	EndTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
	// 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.
	StartTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
}

func (x *TimeInterval) Reset() {
	*x = TimeInterval{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_monitoring_v3_common_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TimeInterval) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TimeInterval) ProtoMessage() {}

func (x *TimeInterval) ProtoReflect() protoreflect.Message {
	mi := &file_google_monitoring_v3_common_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TimeInterval.ProtoReflect.Descriptor instead.
func (*TimeInterval) Descriptor() ([]byte, []int) {
	return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{1}
}

func (x *TimeInterval) GetEndTime() *timestamp.Timestamp {
	if x != nil {
		return x.EndTime
	}
	return nil
}

func (x *TimeInterval) GetStartTime() *timestamp.Timestamp {
	if x != nil {
		return x.StartTime
	}
	return nil
}

// Describes how to combine multiple time series to provide a different view of
// the data.  Aggregation of time series is done in two steps. First, each time
// series in the set is _aligned_ to the same time interval boundaries, then the
// set of time series is optionally _reduced_ in number.
//
// Alignment consists of applying the `per_series_aligner` operation
// to each time series after its data has been divided into regular
// `alignment_period` time intervals. This process takes _all_ of the data
// points in an alignment period, applies a mathematical transformation such as
// averaging, minimum, maximum, delta, etc., and converts them into a single
// data point per period.
//
// Reduction is when the aligned and transformed time series can optionally be
// combined, reducing the number of time series through similar mathematical
// transformations. Reduction involves applying a `cross_series_reducer` to
// all the time series, optionally sorting the time series into subsets with
// `group_by_fields`, and applying the reducer to each subset.
//
// The raw time series data can contain a huge amount of information from
// multiple sources. Alignment and reduction transforms this mass of data into
// a more manageable and representative collection of data, for example "the
// 95% latency across the average of all tasks in a cluster". This
// representative data can be more easily graphed and comprehended, and the
// individual time series data is still available for later drilldown. For more
// details, see [Filtering and
// aggregation](https://cloud.google.com/monitoring/api/v3/aggregation).
type Aggregation struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The `alignment_period` specifies a time interval, in seconds, that is used
	// to divide the data in all the
	// [time series][google.monitoring.v3.TimeSeries] into consistent blocks of
	// time. This will be done before the per-series aligner can be applied to
	// the data.
	//
	// The value must be at least 60 seconds. If a per-series aligner other than
	// `ALIGN_NONE` is specified, this field is required or an error is returned.
	// If no per-series aligner is specified, or the aligner `ALIGN_NONE` is
	// specified, then this field is ignored.
	AlignmentPeriod *duration.Duration `protobuf:"bytes,1,opt,name=alignment_period,json=alignmentPeriod,proto3" json:"alignment_period,omitempty"`
	// An `Aligner` describes how to bring the data points in a single
	// time series into temporal alignment. Except for `ALIGN_NONE`, all
	// alignments cause all the data points in an `alignment_period` to be
	// mathematically grouped together, resulting in a single data point for
	// each `alignment_period` with end timestamp at the end of the period.
	//
	// Not all alignment operations may be applied to all time series. The valid
	// choices depend on the `metric_kind` and `value_type` of the original time
	// series. Alignment can change the `metric_kind` or the `value_type` of
	// the time series.
	//
	// Time series data must be aligned in order to perform cross-time
	// series reduction. If `cross_series_reducer` is specified, then
	// `per_series_aligner` must be specified and not equal to `ALIGN_NONE`
	// and `alignment_period` must be specified; otherwise, an error is
	// returned.
	PerSeriesAligner Aggregation_Aligner `protobuf:"varint,2,opt,name=per_series_aligner,json=perSeriesAligner,proto3,enum=google.monitoring.v3.Aggregation_Aligner" json:"per_series_aligner,omitempty"`
	// The reduction operation to be used to combine time series into a single
	// time series, where the value of each data point in the resulting series is
	// a function of all the already aligned values in the input time series.
	//
	// Not all reducer operations can be applied to all time series. The valid
	// choices depend on the `metric_kind` and the `value_type` of the original
	// time series. Reduction can yield a time series with a different
	// `metric_kind` or `value_type` than the input time series.
	//
	// Time series data must first be aligned (see `per_series_aligner`) in order
	// to perform cross-time series reduction. If `cross_series_reducer` is
	// specified, then `per_series_aligner` must be specified, and must not be
	// `ALIGN_NONE`. An `alignment_period` must also be specified; otherwise, an
	// error is returned.
	CrossSeriesReducer Aggregation_Reducer `protobuf:"varint,4,opt,name=cross_series_reducer,json=crossSeriesReducer,proto3,enum=google.monitoring.v3.Aggregation_Reducer" json:"cross_series_reducer,omitempty"`
	// The set of fields to preserve when `cross_series_reducer` is
	// specified. The `group_by_fields` determine how the time series are
	// partitioned into subsets prior to applying the aggregation
	// operation. 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
	// `cross_series_reducer` 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 `group_by_fields` are aggregated away.  If
	// `group_by_fields` 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 `cross_series_reducer` is not
	// defined, this field is ignored.
	GroupByFields []string `protobuf:"bytes,5,rep,name=group_by_fields,json=groupByFields,proto3" json:"group_by_fields,omitempty"`
}

func (x *Aggregation) Reset() {
	*x = Aggregation{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_monitoring_v3_common_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Aggregation) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Aggregation) ProtoMessage() {}

func (x *Aggregation) ProtoReflect() protoreflect.Message {
	mi := &file_google_monitoring_v3_common_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Aggregation.ProtoReflect.Descriptor instead.
func (*Aggregation) Descriptor() ([]byte, []int) {
	return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{2}
}

func (x *Aggregation) GetAlignmentPeriod() *duration.Duration {
	if x != nil {
		return x.AlignmentPeriod
	}
	return nil
}

func (x *Aggregation) GetPerSeriesAligner() Aggregation_Aligner {
	if x != nil {
		return x.PerSeriesAligner
	}
	return Aggregation_ALIGN_NONE
}

func (x *Aggregation) GetCrossSeriesReducer() Aggregation_Reducer {
	if x != nil {
		return x.CrossSeriesReducer
	}
	return Aggregation_REDUCE_NONE
}

func (x *Aggregation) GetGroupByFields() []string {
	if x != nil {
		return x.GroupByFields
	}
	return nil
}

var File_google_monitoring_v3_common_proto protoreflect.FileDescriptor

var file_google_monitoring_v3_common_proto_rawDesc = []byte{
	0x0a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,
	0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,
	0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1d, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69,
	0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
	0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xee, 0x01, 0x0a, 0x0a, 0x54, 0x79,
	0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c,
	0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09,
	0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x74,
	0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00,
	0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c,
	0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01,
	0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75,
	0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75,
	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e,
	0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x49, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69,
	0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11,
	0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75,
	0x65, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x0c, 0x54,
	0x69, 0x6d, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x35, 0x0a, 0x08, 0x65,
	0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69,
	0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
	0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xf3, 0x07,
	0x0a, 0x0b, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a,
	0x10, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f,
	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x52, 0x0f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x72,
	0x69, 0x6f, 0x64, 0x12, 0x57, 0x0a, 0x12, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65,
	0x73, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,
	0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x2e, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x10, 0x70, 0x65, 0x72, 0x53,
	0x65, 0x72, 0x69, 0x65, 0x73, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x14,
	0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x64,
	0x75, 0x63, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,
	0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65,
	0x64, 0x75, 0x63, 0x65, 0x72, 0x52, 0x12, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x53, 0x65, 0x72, 0x69,
	0x65, 0x73, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x67, 0x72, 0x6f,
	0x75, 0x70, 0x5f, 0x62, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03,
	0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64,
	0x73, 0x22, 0x8b, 0x03, 0x0a, 0x07, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x0e, 0x0a,
	0x0a, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a,
	0x0b, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x10, 0x01, 0x12, 0x0e,
	0x0a, 0x0a, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x15,
	0x0a, 0x11, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x50, 0x4f, 0x4c,
	0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x4e,
	0x45, 0x58, 0x54, 0x5f, 0x4f, 0x4c, 0x44, 0x45, 0x52, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x41,
	0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x4d, 0x49, 0x4e, 0x10, 0x0a, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x4c,
	0x49, 0x47, 0x4e, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x4c, 0x49,
	0x47, 0x4e, 0x5f, 0x4d, 0x45, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x4c, 0x49,
	0x47, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x4c,
	0x49, 0x47, 0x4e, 0x5f, 0x53, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x4c, 0x49,
	0x47, 0x4e, 0x5f, 0x53, 0x54, 0x44, 0x44, 0x45, 0x56, 0x10, 0x0f, 0x12, 0x14, 0x0a, 0x10, 0x41,
	0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x52, 0x55, 0x45, 0x10,
	0x10, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54,
	0x5f, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10, 0x18, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c, 0x49, 0x47,
	0x4e, 0x5f, 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x55, 0x45, 0x10,
	0x11, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45,
	0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x39, 0x39, 0x10, 0x12, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c,
	0x49, 0x47, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x39,
	0x35, 0x10, 0x13, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x50, 0x45, 0x52,
	0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x35, 0x30, 0x10, 0x14, 0x12, 0x17, 0x0a, 0x13,
	0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45,
	0x5f, 0x30, 0x35, 0x10, 0x15, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x50,
	0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x17, 0x22,
	0xb1, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x72, 0x12, 0x0f, 0x0a, 0x0b, 0x52,
	0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b,
	0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4d, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a,
	0x0a, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4d, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0e, 0x0a,
	0x0a, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0x03, 0x12, 0x0e, 0x0a,
	0x0a, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x53, 0x55, 0x4d, 0x10, 0x04, 0x12, 0x11, 0x0a,
	0x0d, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x44, 0x44, 0x45, 0x56, 0x10, 0x05,
	0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54,
	0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x55,
	0x4e, 0x54, 0x5f, 0x54, 0x52, 0x55, 0x45, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x44,
	0x55, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10,
	0x0f, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x46, 0x52, 0x41, 0x43,
	0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x55, 0x45, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x52,
	0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45,
	0x5f, 0x39, 0x39, 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f,
	0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x39, 0x35, 0x10, 0x0a, 0x12,
	0x18, 0x0a, 0x14, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e,
	0x54, 0x49, 0x4c, 0x45, 0x5f, 0x35, 0x30, 0x10, 0x0b, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x44,
	0x55, 0x43, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x30,
	0x35, 0x10, 0x0c, 0x2a, 0x9e, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73,
	0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52,
	0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,
	0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e,
	0x5f, 0x47, 0x54, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49,
	0x53, 0x4f, 0x4e, 0x5f, 0x47, 0x45, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50,
	0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x43,
	0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x11,
	0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x45, 0x51, 0x10,
	0x05, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f,
	0x4e, 0x45, 0x10, 0x06, 0x2a, 0x61, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54,
	0x69, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54,
	0x49, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
	0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x49, 0x45,
	0x52, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x52,
	0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x49, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x45, 0x4d, 0x49, 0x55,
	0x4d, 0x10, 0x02, 0x1a, 0x02, 0x18, 0x01, 0x42, 0xc3, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,
	0x67, 0x2e, 0x76, 0x33, 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74,
	0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61,
	0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74,
	0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,
	0x69, 0x6e, 0x67, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f,
	0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33,
	0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c,
	0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d,
	0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d,
	0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_monitoring_v3_common_proto_rawDescOnce sync.Once
	file_google_monitoring_v3_common_proto_rawDescData = file_google_monitoring_v3_common_proto_rawDesc
)

func file_google_monitoring_v3_common_proto_rawDescGZIP() []byte {
	file_google_monitoring_v3_common_proto_rawDescOnce.Do(func() {
		file_google_monitoring_v3_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_common_proto_rawDescData)
	})
	return file_google_monitoring_v3_common_proto_rawDescData
}

var file_google_monitoring_v3_common_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
var file_google_monitoring_v3_common_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_google_monitoring_v3_common_proto_goTypes = []interface{}{
	(ComparisonType)(0),               // 0: google.monitoring.v3.ComparisonType
	(ServiceTier)(0),                  // 1: google.monitoring.v3.ServiceTier
	(Aggregation_Aligner)(0),          // 2: google.monitoring.v3.Aggregation.Aligner
	(Aggregation_Reducer)(0),          // 3: google.monitoring.v3.Aggregation.Reducer
	(*TypedValue)(nil),                // 4: google.monitoring.v3.TypedValue
	(*TimeInterval)(nil),              // 5: google.monitoring.v3.TimeInterval
	(*Aggregation)(nil),               // 6: google.monitoring.v3.Aggregation
	(*distribution.Distribution)(nil), // 7: google.api.Distribution
	(*timestamp.Timestamp)(nil),       // 8: google.protobuf.Timestamp
	(*duration.Duration)(nil),         // 9: google.protobuf.Duration
}
var file_google_monitoring_v3_common_proto_depIdxs = []int32{
	7, // 0: google.monitoring.v3.TypedValue.distribution_value:type_name -> google.api.Distribution
	8, // 1: google.monitoring.v3.TimeInterval.end_time:type_name -> google.protobuf.Timestamp
	8, // 2: google.monitoring.v3.TimeInterval.start_time:type_name -> google.protobuf.Timestamp
	9, // 3: google.monitoring.v3.Aggregation.alignment_period:type_name -> google.protobuf.Duration
	2, // 4: google.monitoring.v3.Aggregation.per_series_aligner:type_name -> google.monitoring.v3.Aggregation.Aligner
	3, // 5: google.monitoring.v3.Aggregation.cross_series_reducer:type_name -> google.monitoring.v3.Aggregation.Reducer
	6, // [6:6] is the sub-list for method output_type
	6, // [6:6] is the sub-list for method input_type
	6, // [6:6] is the sub-list for extension type_name
	6, // [6:6] is the sub-list for extension extendee
	0, // [0:6] is the sub-list for field type_name
}

func init() { file_google_monitoring_v3_common_proto_init() }
func file_google_monitoring_v3_common_proto_init() {
	if File_google_monitoring_v3_common_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_monitoring_v3_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TypedValue); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_monitoring_v3_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TimeInterval); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_monitoring_v3_common_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Aggregation); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_google_monitoring_v3_common_proto_msgTypes[0].OneofWrappers = []interface{}{
		(*TypedValue_BoolValue)(nil),
		(*TypedValue_Int64Value)(nil),
		(*TypedValue_DoubleValue)(nil),
		(*TypedValue_StringValue)(nil),
		(*TypedValue_DistributionValue)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_monitoring_v3_common_proto_rawDesc,
			NumEnums:      4,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_monitoring_v3_common_proto_goTypes,
		DependencyIndexes: file_google_monitoring_v3_common_proto_depIdxs,
		EnumInfos:         file_google_monitoring_v3_common_proto_enumTypes,
		MessageInfos:      file_google_monitoring_v3_common_proto_msgTypes,
	}.Build()
	File_google_monitoring_v3_common_proto = out.File
	file_google_monitoring_v3_common_proto_rawDesc = nil
	file_google_monitoring_v3_common_proto_goTypes = nil
	file_google_monitoring_v3_common_proto_depIdxs = nil
}
