// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.

package cloudwatch

import (
	"fmt"
	"time"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/internal/awsutil"
)

var _ aws.Config
var _ = awsutil.Prettify

// Represents the history of a specific alarm.
type AlarmHistoryItem struct {
	_ struct{} `type:"structure"`

	// The descriptive name for the alarm.
	AlarmName *string `min:"1" type:"string"`

	// Data about the alarm, in JSON format.
	HistoryData *string `min:"1" type:"string"`

	// The type of alarm history item.
	HistoryItemType HistoryItemType `type:"string" enum:"true"`

	// A summary of the alarm history, in text format.
	HistorySummary *string `min:"1" type:"string"`

	// The time stamp for the alarm history item.
	Timestamp *time.Time `type:"timestamp"`
}

// String returns the string representation
func (s AlarmHistoryItem) String() string {
	return awsutil.Prettify(s)
}

// An anomaly detection model associated with a particular CloudWatch metric
// and statistic. You can use the model to display a band of expected normal
// values when the metric is graphed.
type AnomalyDetector struct {
	_ struct{} `type:"structure"`

	// The configuration specifies details about how the anomaly detection model
	// is to be trained, including time ranges to exclude from use for training
	// the model, and the time zone to use for the metric.
	Configuration *AnomalyDetectorConfiguration `type:"structure"`

	// The metric dimensions associated with the anomaly detection model.
	Dimensions []Dimension `type:"list"`

	// The name of the metric associated with the anomaly detection model.
	MetricName *string `min:"1" type:"string"`

	// The namespace of the metric associated with the anomaly detection model.
	Namespace *string `min:"1" type:"string"`

	// The statistic associated with the anomaly detection model.
	Stat *string `type:"string"`
}

// String returns the string representation
func (s AnomalyDetector) String() string {
	return awsutil.Prettify(s)
}

// The configuration specifies details about how the anomaly detection model
// is to be trained, including time ranges to exclude from use for training
// the model and the time zone to use for the metric.
type AnomalyDetectorConfiguration struct {
	_ struct{} `type:"structure"`

	// An array of time ranges to exclude from use when the anomaly detection model
	// is trained. Use this to make sure that events that could cause unusual values
	// for the metric, such as deployments, aren't used when CloudWatch creates
	// the model.
	ExcludedTimeRanges []Range `type:"list"`

	// The time zone to use for the metric. This is useful to enable the model to
	// automatically account for daylight savings time changes if the metric is
	// sensitive to such time changes.
	//
	// To specify a time zone, use the name of the time zone as specified in the
	// standard tz database. For more information, see tz database (https://en.wikipedia.org/wiki/Tz_database).
	MetricTimezone *string `type:"string"`
}

// String returns the string representation
func (s AnomalyDetectorConfiguration) String() string {
	return awsutil.Prettify(s)
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AnomalyDetectorConfiguration) Validate() error {
	invalidParams := aws.ErrInvalidParams{Context: "AnomalyDetectorConfiguration"}
	if s.ExcludedTimeRanges != nil {
		for i, v := range s.ExcludedTimeRanges {
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "ExcludedTimeRanges", i), err.(aws.ErrInvalidParams))
			}
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// Represents a specific dashboard.
type DashboardEntry struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Name (ARN) of the dashboard.
	DashboardArn *string `type:"string"`

	// The name of the dashboard.
	DashboardName *string `type:"string"`

	// The time stamp of when the dashboard was last modified, either by an API
	// call or through the console. This number is expressed as the number of milliseconds
	// since Jan 1, 1970 00:00:00 UTC.
	LastModified *time.Time `type:"timestamp"`

	// The size of the dashboard, in bytes.
	Size *int64 `type:"long"`
}

// String returns the string representation
func (s DashboardEntry) String() string {
	return awsutil.Prettify(s)
}

// An error or warning for the operation.
type DashboardValidationMessage struct {
	_ struct{} `type:"structure"`

	// The data path related to the message.
	DataPath *string `type:"string"`

	// A message describing the error or warning.
	Message *string `type:"string"`
}

// String returns the string representation
func (s DashboardValidationMessage) String() string {
	return awsutil.Prettify(s)
}

// Encapsulates the statistical data that CloudWatch computes from metric data.
type Datapoint struct {
	_ struct{} `type:"structure"`

	// The average of the metric values that correspond to the data point.
	Average *float64 `type:"double"`

	// The percentile statistic for the data point.
	ExtendedStatistics map[string]float64 `type:"map"`

	// The maximum metric value for the data point.
	Maximum *float64 `type:"double"`

	// The minimum metric value for the data point.
	Minimum *float64 `type:"double"`

	// The number of metric values that contributed to the aggregate value of this
	// data point.
	SampleCount *float64 `type:"double"`

	// The sum of the metric values for the data point.
	Sum *float64 `type:"double"`

	// The time stamp used for the data point.
	Timestamp *time.Time `type:"timestamp"`

	// The standard unit for the data point.
	Unit StandardUnit `type:"string" enum:"true"`
}

// String returns the string representation
func (s Datapoint) String() string {
	return awsutil.Prettify(s)
}

// Expands the identity of a metric.
type Dimension struct {
	_ struct{} `type:"structure"`

	// The name of the dimension.
	//
	// Name is a required field
	Name *string `min:"1" type:"string" required:"true"`

	// The value representing the dimension measurement.
	//
	// Value is a required field
	Value *string `min:"1" type:"string" required:"true"`
}

// String returns the string representation
func (s Dimension) String() string {
	return awsutil.Prettify(s)
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *Dimension) Validate() error {
	invalidParams := aws.ErrInvalidParams{Context: "Dimension"}

	if s.Name == nil {
		invalidParams.Add(aws.NewErrParamRequired("Name"))
	}
	if s.Name != nil && len(*s.Name) < 1 {
		invalidParams.Add(aws.NewErrParamMinLen("Name", 1))
	}

	if s.Value == nil {
		invalidParams.Add(aws.NewErrParamRequired("Value"))
	}
	if s.Value != nil && len(*s.Value) < 1 {
		invalidParams.Add(aws.NewErrParamMinLen("Value", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// Represents filters for a dimension.
type DimensionFilter struct {
	_ struct{} `type:"structure"`

	// The dimension name to be matched.
	//
	// Name is a required field
	Name *string `min:"1" type:"string" required:"true"`

	// The value of the dimension to be matched.
	Value *string `min:"1" type:"string"`
}

// String returns the string representation
func (s DimensionFilter) String() string {
	return awsutil.Prettify(s)
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DimensionFilter) Validate() error {
	invalidParams := aws.ErrInvalidParams{Context: "DimensionFilter"}

	if s.Name == nil {
		invalidParams.Add(aws.NewErrParamRequired("Name"))
	}
	if s.Name != nil && len(*s.Name) < 1 {
		invalidParams.Add(aws.NewErrParamMinLen("Name", 1))
	}
	if s.Value != nil && len(*s.Value) < 1 {
		invalidParams.Add(aws.NewErrParamMinLen("Value", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// This structure contains the definition for a Contributor Insights rule.
type InsightRule struct {
	_ struct{} `type:"structure"`

	// The definition of the rule, as a JSON object. The definition contains the
	// keywords used to define contributors, the value to aggregate on if this rule
	// returns a sum instead of a count, and the filters. For details on the valid
	// syntax, see Contributor Insights Rule Syntax (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ContributorInsights-RuleSyntax.html).
	//
	// Definition is a required field
	Definition *string `min:"1" type:"string" required:"true"`

	// The name of the rule.
	//
	// Name is a required field
	Name *string `min:"1" type:"string" required:"true"`

	// For rules that you create, this is always {"Name": "CloudWatchLogRule", "Version":
	// 1}. For built-in rules, this is {"Name": "ServiceLogRule", "Version": 1}
	//
	// Schema is a required field
	Schema *string `type:"string" required:"true"`

	// Indicates whether the rule is enabled or disabled.
	//
	// State is a required field
	State *string `min:"1" type:"string" required:"true"`
}

// String returns the string representation
func (s InsightRule) String() string {
	return awsutil.Prettify(s)
}

// One of the unique contributors found by a Contributor Insights rule. If the
// rule contains multiple keys, then a unique contributor is a unique combination
// of values from all the keys in the rule.
//
// If the rule contains a single key, then each unique contributor is each unique
// value for this key.
//
// For more information, see GetInsightRuleReport.
type InsightRuleContributor struct {
	_ struct{} `type:"structure"`

	// An approximation of the aggregate value that comes from this contributor.
	//
	// ApproximateAggregateValue is a required field
	ApproximateAggregateValue *float64 `type:"double" required:"true"`

	// An array of the data points where this contributor is present. Only the data
	// points when this contributor appeared are included in the array.
	//
	// Datapoints is a required field
	Datapoints []InsightRuleContributorDatapoint `type:"list" required:"true"`

	// One of the log entry field keywords that is used to define contributors for
	// this rule.
	//
	// Keys is a required field
	Keys []string `type:"list" required:"true"`
}

// String returns the string representation
func (s InsightRuleContributor) String() string {
	return awsutil.Prettify(s)
}

// One data point related to one contributor.
//
// For more information, see GetInsightRuleReport and InsightRuleContributor.
type InsightRuleContributorDatapoint struct {
	_ struct{} `type:"structure"`

	// The approximate value that this contributor added during this timestamp.
	//
	// ApproximateValue is a required field
	ApproximateValue *float64 `type:"double" required:"true"`

	// The timestamp of the data point.
	//
	// Timestamp is a required field
	Timestamp *time.Time `type:"timestamp" required:"true"`
}

// String returns the string representation
func (s InsightRuleContributorDatapoint) String() string {
	return awsutil.Prettify(s)
}

// One data point from the metric time series returned in a Contributor Insights
// rule report.
//
// For more information, see GetInsightRuleReport.
type InsightRuleMetricDatapoint struct {
	_ struct{} `type:"structure"`

	// The average value from all contributors during the time period represented
	// by that data point.
	//
	// This statistic is returned only if you included it in the Metrics array in
	// your request.
	Average *float64 `type:"double"`

	// The maximum value provided by one contributor during this timestamp. Each
	// timestamp is evaluated separately, so the identity of the max contributor
	// could be different for each timestamp.
	//
	// This statistic is returned only if you included it in the Metrics array in
	// your request.
	MaxContributorValue *float64 `type:"double"`

	// The maximum value from a single occurence from a single contributor during
	// the time period represented by that data point.
	//
	// This statistic is returned only if you included it in the Metrics array in
	// your request.
	Maximum *float64 `type:"double"`

	// The minimum value from a single contributor during the time period represented
	// by that data point.
	//
	// This statistic is returned only if you included it in the Metrics array in
	// your request.
	Minimum *float64 `type:"double"`

	// The number of occurrences that matched the rule during this data point.
	//
	// This statistic is returned only if you included it in the Metrics array in
	// your request.
	SampleCount *float64 `type:"double"`

	// The sum of the values from all contributors during the time period represented
	// by that data point.
	//
	// This statistic is returned only if you included it in the Metrics array in
	// your request.
	Sum *float64 `type:"double"`

	// The timestamp of the data point.
	//
	// Timestamp is a required field
	Timestamp *time.Time `type:"timestamp" required:"true"`

	// The number of unique contributors who published data during this timestamp.
	//
	// This statistic is returned only if you included it in the Metrics array in
	// your request.
	UniqueContributors *float64 `type:"double"`
}

// String returns the string representation
func (s InsightRuleMetricDatapoint) String() string {
	return awsutil.Prettify(s)
}

// A message returned by the GetMetricDataAPI, including a code and a description.
type MessageData struct {
	_ struct{} `type:"structure"`

	// The error code or status code associated with the message.
	Code *string `type:"string"`

	// The message text.
	Value *string `type:"string"`
}

// String returns the string representation
func (s MessageData) String() string {
	return awsutil.Prettify(s)
}

// Represents a specific metric.
type Metric struct {
	_ struct{} `type:"structure"`

	// The dimensions for the metric.
	Dimensions []Dimension `type:"list"`

	// The name of the metric. This is a required field.
	MetricName *string `min:"1" type:"string"`

	// The namespace of the metric.
	Namespace *string `min:"1" type:"string"`
}

// String returns the string representation
func (s Metric) String() string {
	return awsutil.Prettify(s)
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *Metric) Validate() error {
	invalidParams := aws.ErrInvalidParams{Context: "Metric"}
	if s.MetricName != nil && len(*s.MetricName) < 1 {
		invalidParams.Add(aws.NewErrParamMinLen("MetricName", 1))
	}
	if s.Namespace != nil && len(*s.Namespace) < 1 {
		invalidParams.Add(aws.NewErrParamMinLen("Namespace", 1))
	}
	if s.Dimensions != nil {
		for i, v := range s.Dimensions {
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "Dimensions", i), err.(aws.ErrInvalidParams))
			}
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// Represents an alarm.
type MetricAlarm struct {
	_ struct{} `type:"structure"`

	// Indicates whether actions should be executed during any changes to the alarm
	// state.
	ActionsEnabled *bool `type:"boolean"`

	// The actions to execute when this alarm transitions to the ALARM state from
	// any other state. Each action is specified as an Amazon Resource Name (ARN).
	AlarmActions []string `type:"list"`

	// The Amazon Resource Name (ARN) of the alarm.
	AlarmArn *string `min:"1" type:"string"`

	// The time stamp of the last update to the alarm configuration.
	AlarmConfigurationUpdatedTimestamp *time.Time `type:"timestamp"`

	// The description of the alarm.
	AlarmDescription *string `type:"string"`

	// The name of the alarm.
	AlarmName *string `min:"1" type:"string"`

	// The arithmetic operation to use when comparing the specified statistic and
	// threshold. The specified statistic value is used as the first operand.
	ComparisonOperator ComparisonOperator `type:"string" enum:"true"`

	// The number of data points that must be breaching to trigger the alarm.
	DatapointsToAlarm *int64 `min:"1" type:"integer"`

	// The dimensions for the metric associated with the alarm.
	Dimensions []Dimension `type:"list"`

	// Used only for alarms based on percentiles. If ignore, the alarm state does
	// not change during periods with too few data points to be statistically significant.
	// If evaluate or this parameter is not used, the alarm is always evaluated
	// and possibly changes state no matter how many data points are available.
	EvaluateLowSampleCountPercentile *string `min:"1" type:"string"`

	// The number of periods over which data is compared to the specified threshold.
	EvaluationPeriods *int64 `min:"1" type:"integer"`

	// The percentile statistic for the metric associated with the alarm. Specify
	// a value between p0.0 and p100.
	ExtendedStatistic *string `type:"string"`

	// The actions to execute when this alarm transitions to the INSUFFICIENT_DATA
	// state from any other state. Each action is specified as an Amazon Resource
	// Name (ARN).
	InsufficientDataActions []string `type:"list"`

	// The name of the metric associated with the alarm, if this is an alarm based
	// on a single metric.
	MetricName *string `min:"1" type:"string"`

	// An array of MetricDataQuery structures, used in an alarm based on a metric
	// math expression. Each structure either retrieves a metric or performs a math
	// expression. One item in the Metrics array is the math expression that the
	// alarm watches. This expression by designated by having ReturnValue set to
	// true.
	Metrics []MetricDataQuery `type:"list"`

	// The namespace of the metric associated with the alarm.
	Namespace *string `min:"1" type:"string"`

	// The actions to execute when this alarm transitions to the OK state from any
	// other state. Each action is specified as an Amazon Resource Name (ARN).
	OKActions []string `type:"list"`

	// The period, in seconds, over which the statistic is applied.
	Period *int64 `min:"1" type:"integer"`

	// An explanation for the alarm state, in text format.
	StateReason *string `type:"string"`

	// An explanation for the alarm state, in JSON format.
	StateReasonData *string `type:"string"`

	// The time stamp of the last update to the alarm state.
	StateUpdatedTimestamp *time.Time `type:"timestamp"`

	// The state value for the alarm.
	StateValue StateValue `type:"string" enum:"true"`

	// The statistic for the metric associated with the alarm, other than percentile.
	// For percentile statistics, use ExtendedStatistic.
	Statistic Statistic `type:"string" enum:"true"`

	// The value to compare with the specified statistic.
	Threshold *float64 `type:"double"`

	// In an alarm based on an anomaly detection model, this is the ID of the ANOMALY_DETECTION_BAND
	// function used as the threshold for the alarm.
	ThresholdMetricId *string `min:"1" type:"string"`

	// Sets how this alarm is to handle missing data points. If this parameter is
	// omitted, the default behavior of missing is used.
	TreatMissingData *string `min:"1" type:"string"`

	// The unit of the metric associated with the alarm.
	Unit StandardUnit `type:"string" enum:"true"`
}

// String returns the string representation
func (s MetricAlarm) String() string {
	return awsutil.Prettify(s)
}

// This structure is used in both GetMetricData and PutMetricAlarm. The supported
// use of this structure is different for those two operations.
//
// When used in GetMetricData, it indicates the metric data to return, and whether
// this call is just retrieving a batch set of data for one metric, or is performing
// a math expression on metric data. A single GetMetricData call can include
// up to 100 MetricDataQuery structures.
//
// When used in PutMetricAlarm, it enables you to create an alarm based on a
// metric math expression. Each MetricDataQuery in the array specifies either
// a metric to retrieve, or a math expression to be performed on retrieved metrics.
// A single PutMetricAlarm call can include up to 20 MetricDataQuery structures
// in the array. The 20 structures can include as many as 10 structures that
// contain a MetricStat parameter to retrieve a metric, and as many as 10 structures
// that contain the Expression parameter to perform a math expression. Of those
// Expression structures, one must have True as the value for ReturnData. The
// result of this expression is the value the alarm watches.
//
// Any expression used in a PutMetricAlarm operation must return a single time
// series. For more information, see Metric Math Syntax and Functions (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html#metric-math-syntax)
// in the Amazon CloudWatch User Guide.
//
// Some of the parameters of this structure also have different uses whether
// you are using this structure in a GetMetricData operation or a PutMetricAlarm
// operation. These differences are explained in the following parameter list.
type MetricDataQuery struct {
	_ struct{} `type:"structure"`

	// The math expression to be performed on the returned data, if this object
	// is performing a math expression. This expression can use the Id of the other
	// metrics to refer to those metrics, and can also use the Id of other expressions
	// to use the result of those expressions. For more information about metric
	// math expressions, see Metric Math Syntax and Functions (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html#metric-math-syntax)
	// in the Amazon CloudWatch User Guide.
	//
	// Within each MetricDataQuery object, you must specify either Expression or
	// MetricStat but not both.
	Expression *string `min:"1" type:"string"`

	// A short name used to tie this object to the results in the response. This
	// name must be unique within a single call to GetMetricData. If you are performing
	// math expressions on this set of data, this name represents that data and
	// can serve as a variable in the mathematical expression. The valid characters
	// are letters, numbers, and underscore. The first character must be a lowercase
	// letter.
	//
	// Id is a required field
	Id *string `min:"1" type:"string" required:"true"`

	// A human-readable label for this metric or expression. This is especially
	// useful if this is an expression, so that you know what the value represents.
	// If the metric or expression is shown in a CloudWatch dashboard widget, the
	// label is shown. If Label is omitted, CloudWatch generates a default.
	Label *string `type:"string"`

	// The metric to be returned, along with statistics, period, and units. Use
	// this parameter only if this object is retrieving a metric and not performing
	// a math expression on returned data.
	//
	// Within one MetricDataQuery object, you must specify either Expression or
	// MetricStat but not both.
	MetricStat *MetricStat `type:"structure"`

	// The granularity, in seconds, of the returned data points. For metrics with
	// regular resolution, a period can be as short as one minute (60 seconds) and
	// must be a multiple of 60. For high-resolution metrics that are collected
	// at intervals of less than one minute, the period can be 1, 5, 10, 30, 60,
	// or any multiple of 60. High-resolution metrics are those metrics stored by
	// a PutMetricData operation that includes a StorageResolution of 1 second.
	//
	// If you are performing a GetMetricData operation, use this field only if you
	// are specifying an Expression. Do not use this field when you are specifying
	// a MetricStat in a GetMetricData operation.
	Period *int64 `min:"1" type:"integer"`

	// When used in GetMetricData, this option indicates whether to return the timestamps
	// and raw data values of this metric. If you are performing this call just
	// to do math expressions and do not also need the raw data returned, you can
	// specify False. If you omit this, the default of True is used.
	//
	// When used in PutMetricAlarm, specify True for the one expression result to
	// use as the alarm. For all other metrics and expressions in the same PutMetricAlarm
	// operation, specify ReturnData as False.
	ReturnData *bool `type:"boolean"`
}

// String returns the string representation
func (s MetricDataQuery) String() string {
	return awsutil.Prettify(s)
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *MetricDataQuery) Validate() error {
	invalidParams := aws.ErrInvalidParams{Context: "MetricDataQuery"}
	if s.Expression != nil && len(*s.Expression) < 1 {
		invalidParams.Add(aws.NewErrParamMinLen("Expression", 1))
	}

	if s.Id == nil {
		invalidParams.Add(aws.NewErrParamRequired("Id"))
	}
	if s.Id != nil && len(*s.Id) < 1 {
		invalidParams.Add(aws.NewErrParamMinLen("Id", 1))
	}
	if s.Period != nil && *s.Period < 1 {
		invalidParams.Add(aws.NewErrParamMinValue("Period", 1))
	}
	if s.MetricStat != nil {
		if err := s.MetricStat.Validate(); err != nil {
			invalidParams.AddNested("MetricStat", err.(aws.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// A GetMetricData call returns an array of MetricDataResult structures. Each
// of these structures includes the data points for that metric, along with
// the timestamps of those data points and other identifying information.
type MetricDataResult struct {
	_ struct{} `type:"structure"`

	// The short name you specified to represent this metric.
	Id *string `min:"1" type:"string"`

	// The human-readable label associated with the data.
	Label *string `type:"string"`

	// A list of messages with additional information about the data returned.
	Messages []MessageData `type:"list"`

	// The status of the returned data. Complete indicates that all data points
	// in the requested time range were returned. PartialData means that an incomplete
	// set of data points were returned. You can use the NextToken value that was
	// returned and repeat your request to get more data points. NextToken is not
	// returned if you are performing a math expression. InternalError indicates
	// that an error occurred. Retry your request using NextToken, if present.
	StatusCode StatusCode `type:"string" enum:"true"`

	// The timestamps for the data points, formatted in Unix timestamp format. The
	// number of timestamps always matches the number of values and the value for
	// Timestamps[x] is Values[x].
	Timestamps []time.Time `type:"list"`

	// The data points for the metric corresponding to Timestamps. The number of
	// values always matches the number of timestamps and the timestamp for Values[x]
	// is Timestamps[x].
	Values []float64 `type:"list"`
}

// String returns the string representation
func (s MetricDataResult) String() string {
	return awsutil.Prettify(s)
}

// Encapsulates the information sent to either create a metric or add new values
// to be aggregated into an existing metric.
type MetricDatum struct {
	_ struct{} `type:"structure"`

	// Array of numbers that is used along with the Values array. Each number in
	// the Count array is the number of times the corresponding value in the Values
	// array occurred during the period.
	//
	// If you omit the Counts array, the default of 1 is used as the value for each
	// count. If you include a Counts array, it must include the same amount of
	// values as the Values array.
	Counts []float64 `type:"list"`

	// The dimensions associated with the metric.
	Dimensions []Dimension `type:"list"`

	// The name of the metric.
	//
	// MetricName is a required field
	MetricName *string `min:"1" type:"string" required:"true"`

	// The statistical values for the metric.
	StatisticValues *StatisticSet `type:"structure"`

	// Valid values are 1 and 60. Setting this to 1 specifies this metric as a high-resolution
	// metric, so that CloudWatch stores the metric with sub-minute resolution down
	// to one second. Setting this to 60 specifies this metric as a regular-resolution
	// metric, which CloudWatch stores at 1-minute resolution. Currently, high resolution
	// is available only for custom metrics. For more information about high-resolution
	// metrics, see High-Resolution Metrics (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html#high-resolution-metrics)
	// in the Amazon CloudWatch User Guide.
	//
	// This field is optional, if you do not specify it the default of 60 is used.
	StorageResolution *int64 `min:"1" type:"integer"`

	// The time the metric data was received, expressed as the number of milliseconds
	// since Jan 1, 1970 00:00:00 UTC.
	Timestamp *time.Time `type:"timestamp"`

	// When you are using a Put operation, this defines what unit you want to use
	// when storing the metric.
	//
	// In a Get operation, this displays the unit that is used for the metric.
	Unit StandardUnit `type:"string" enum:"true"`

	// The value for the metric.
	//
	// Although the parameter accepts numbers of type Double, CloudWatch rejects
	// values that are either too small or too large. Values must be in the range
	// of -2^360 to 2^360. In addition, special values (for example, NaN, +Infinity,
	// -Infinity) are not supported.
	Value *float64 `type:"double"`

	// Array of numbers representing the values for the metric during the period.
	// Each unique value is listed just once in this array, and the corresponding
	// number in the Counts array specifies the number of times that value occurred
	// during the period. You can include up to 150 unique values in each PutMetricData
	// action that specifies a Values array.
	//
	// Although the Values array accepts numbers of type Double, CloudWatch rejects
	// values that are either too small or too large. Values must be in the range
	// of -2^360 to 2^360. In addition, special values (for example, NaN, +Infinity,
	// -Infinity) are not supported.
	Values []float64 `type:"list"`
}

// String returns the string representation
func (s MetricDatum) String() string {
	return awsutil.Prettify(s)
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *MetricDatum) Validate() error {
	invalidParams := aws.ErrInvalidParams{Context: "MetricDatum"}

	if s.MetricName == nil {
		invalidParams.Add(aws.NewErrParamRequired("MetricName"))
	}
	if s.MetricName != nil && len(*s.MetricName) < 1 {
		invalidParams.Add(aws.NewErrParamMinLen("MetricName", 1))
	}
	if s.StorageResolution != nil && *s.StorageResolution < 1 {
		invalidParams.Add(aws.NewErrParamMinValue("StorageResolution", 1))
	}
	if s.Dimensions != nil {
		for i, v := range s.Dimensions {
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "Dimensions", i), err.(aws.ErrInvalidParams))
			}
		}
	}
	if s.StatisticValues != nil {
		if err := s.StatisticValues.Validate(); err != nil {
			invalidParams.AddNested("StatisticValues", err.(aws.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// This structure defines the metric to be returned, along with the statistics,
// period, and units.
type MetricStat struct {
	_ struct{} `type:"structure"`

	// The metric to return, including the metric name, namespace, and dimensions.
	//
	// Metric is a required field
	Metric *Metric `type:"structure" required:"true"`

	// The granularity, in seconds, of the returned data points. For metrics with
	// regular resolution, a period can be as short as one minute (60 seconds) and
	// must be a multiple of 60. For high-resolution metrics that are collected
	// at intervals of less than one minute, the period can be 1, 5, 10, 30, 60,
	// or any multiple of 60. High-resolution metrics are those metrics stored by
	// a PutMetricData call that includes a StorageResolution of 1 second.
	//
	// If the StartTime parameter specifies a time stamp that is greater than 3
	// hours ago, you must specify the period as follows or no data points in that
	// time range is returned:
	//
	//    * Start time between 3 hours and 15 days ago - Use a multiple of 60 seconds
	//    (1 minute).
	//
	//    * Start time between 15 and 63 days ago - Use a multiple of 300 seconds
	//    (5 minutes).
	//
	//    * Start time greater than 63 days ago - Use a multiple of 3600 seconds
	//    (1 hour).
	//
	// Period is a required field
	Period *int64 `min:"1" type:"integer" required:"true"`

	// The statistic to return. It can include any CloudWatch statistic or extended
	// statistic.
	//
	// Stat is a required field
	Stat *string `type:"string" required:"true"`

	// When you are using a Put operation, this defines what unit you want to use
	// when storing the metric.
	//
	// In a Get operation, if you omit Unit then all data that was collected with
	// any unit is returned, along with the corresponding units that were specified
	// when the data was reported to CloudWatch. If you specify a unit, the operation
	// returns only data data that was collected with that unit specified. If you
	// specify a unit that does not match the data collected, the results of the
	// operation are null. CloudWatch does not perform unit conversions.
	Unit StandardUnit `type:"string" enum:"true"`
}

// String returns the string representation
func (s MetricStat) String() string {
	return awsutil.Prettify(s)
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *MetricStat) Validate() error {
	invalidParams := aws.ErrInvalidParams{Context: "MetricStat"}

	if s.Metric == nil {
		invalidParams.Add(aws.NewErrParamRequired("Metric"))
	}

	if s.Period == nil {
		invalidParams.Add(aws.NewErrParamRequired("Period"))
	}
	if s.Period != nil && *s.Period < 1 {
		invalidParams.Add(aws.NewErrParamMinValue("Period", 1))
	}

	if s.Stat == nil {
		invalidParams.Add(aws.NewErrParamRequired("Stat"))
	}
	if s.Metric != nil {
		if err := s.Metric.Validate(); err != nil {
			invalidParams.AddNested("Metric", err.(aws.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// This array is empty if the API operation was successful for all the rules
// specified in the request. If the operation could not process one of the rules,
// the following data is returned for each of those rules.
type PartialFailure struct {
	_ struct{} `type:"structure"`

	// The type of error.
	ExceptionType *string `type:"string"`

	// The code of the error.
	FailureCode *string `type:"string"`

	// A description of the error.
	FailureDescription *string `type:"string"`

	// The specified rule that could not be deleted.
	FailureResource *string `type:"string"`
}

// String returns the string representation
func (s PartialFailure) String() string {
	return awsutil.Prettify(s)
}

// Specifies one range of days or times to exclude from use for training an
// anomaly detection model.
type Range struct {
	_ struct{} `type:"structure"`

	// The end time of the range to exclude. The format is yyyy-MM-dd'T'HH:mm:ss.
	// For example, 2019-07-01T23:59:59.
	//
	// EndTime is a required field
	EndTime *time.Time `type:"timestamp" required:"true"`

	// The start time of the range to exclude. The format is yyyy-MM-dd'T'HH:mm:ss.
	// For example, 2019-07-01T23:59:59.
	//
	// StartTime is a required field
	StartTime *time.Time `type:"timestamp" required:"true"`
}

// String returns the string representation
func (s Range) String() string {
	return awsutil.Prettify(s)
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *Range) Validate() error {
	invalidParams := aws.ErrInvalidParams{Context: "Range"}

	if s.EndTime == nil {
		invalidParams.Add(aws.NewErrParamRequired("EndTime"))
	}

	if s.StartTime == nil {
		invalidParams.Add(aws.NewErrParamRequired("StartTime"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// Represents a set of statistics that describes a specific metric.
type StatisticSet struct {
	_ struct{} `type:"structure"`

	// The maximum value of the sample set.
	//
	// Maximum is a required field
	Maximum *float64 `type:"double" required:"true"`

	// The minimum value of the sample set.
	//
	// Minimum is a required field
	Minimum *float64 `type:"double" required:"true"`

	// The number of samples used for the statistic set.
	//
	// SampleCount is a required field
	SampleCount *float64 `type:"double" required:"true"`

	// The sum of values for the sample set.
	//
	// Sum is a required field
	Sum *float64 `type:"double" required:"true"`
}

// String returns the string representation
func (s StatisticSet) String() string {
	return awsutil.Prettify(s)
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *StatisticSet) Validate() error {
	invalidParams := aws.ErrInvalidParams{Context: "StatisticSet"}

	if s.Maximum == nil {
		invalidParams.Add(aws.NewErrParamRequired("Maximum"))
	}

	if s.Minimum == nil {
		invalidParams.Add(aws.NewErrParamRequired("Minimum"))
	}

	if s.SampleCount == nil {
		invalidParams.Add(aws.NewErrParamRequired("SampleCount"))
	}

	if s.Sum == nil {
		invalidParams.Add(aws.NewErrParamRequired("Sum"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// A key-value pair associated with a CloudWatch resource.
type Tag struct {
	_ struct{} `type:"structure"`

	// A string that you can use to assign a value. The combination of tag keys
	// and values can help you organize and categorize your resources.
	//
	// Key is a required field
	Key *string `min:"1" type:"string" required:"true"`

	// The value for the specified tag key.
	//
	// Value is a required field
	Value *string `type:"string" required:"true"`
}

// String returns the string representation
func (s Tag) String() string {
	return awsutil.Prettify(s)
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *Tag) Validate() error {
	invalidParams := aws.ErrInvalidParams{Context: "Tag"}

	if s.Key == nil {
		invalidParams.Add(aws.NewErrParamRequired("Key"))
	}
	if s.Key != nil && len(*s.Key) < 1 {
		invalidParams.Add(aws.NewErrParamMinLen("Key", 1))
	}

	if s.Value == nil {
		invalidParams.Add(aws.NewErrParamRequired("Value"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}
