CloudMonitoring: Initial GCM Schema (#67739)

* Initial GCM schema work

- Split types for convenience
- Update conditionals where needed
- Update type references

* Add additional supporting types

* Add some more accessory and legacy types

* Add missing type

* Rename backend folder

* Add missing generated file

* Review
This commit is contained in:
Andreas Christou
2023-05-22 17:19:54 +01:00
committed by GitHub
parent 2f74d0c6a9
commit 108acee08e
80 changed files with 1264 additions and 325 deletions

View File

@ -3774,7 +3774,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
],
"public/app/plugins/datasource/cloud-monitoring/types.ts:5381": [
"public/app/plugins/datasource/cloud-monitoring/types/types.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/plugins/datasource/cloudwatch/components/ConfigEditor.test.tsx:5381": [

2
.github/CODEOWNERS vendored
View File

@ -233,7 +233,7 @@
# OSS Plugin Partnerships backend code
/pkg/tsdb/cloudwatch/ @grafana/aws-datasources
/pkg/tsdb/azuremonitor/ @grafana/partner-datasources
/pkg/tsdb/cloudmonitoring/ @grafana/partner-datasources
/pkg/tsdb/cloud-monitoring/ @grafana/partner-datasources
# Observability backend code
/pkg/tsdb/prometheus/ @grafana/observability-metrics

View File

@ -89,7 +89,7 @@
},
{
"type": "changedfiles",
"matches": [ "public/app/plugins/datasource/cloud-monitoring/**/*", "pkg/tsdb/cloudmonitoring/**/*"],
"matches": [ "public/app/plugins/datasource/cloud-monitoring/**/*", "pkg/tsdb/cloud-monitoring/**/*"],
"action": "updateLabel",
"addLabel": "datasource/GoogleCloudMonitoring"
},

View File

@ -4,7 +4,7 @@ on:
paths:
- 'pkg/tsdb/azuremonitor/**'
- 'pkg/tsdb/cloudwatch/**'
- 'pkg/tsdb/cloudmonitoring/**'
- 'pkg/tsdb/cloud-monitoring/**'
- 'public/app/plugins/datasource/azuremonitor/**'
- 'public/app/plugins/datasource/cloudwatch/**'
- 'public/app/plugins/datasource/cloud-monitoring/**'
@ -17,4 +17,4 @@ jobs:
uses: grafana/code-coverage/.github/workflows/code-coverage.yml@v0.1.19
with:
frontend-path-regexp: public\/app\/plugins\/datasource\/(azuremonitor|cloud-monitoring|cloudwatch)
backend-path-regexp: pkg\/tsdb\/(azuremonitor|cloudmonitoring|cloudwatch)
backend-path-regexp: pkg\/tsdb\/(azuremonitor|cloud-monitoring|cloudwatch)

View File

@ -0,0 +1,19 @@
---
keywords:
- grafana
- schema
title: GoogleCloudMonitoringDataQuery kind
---
> Both documentation generation and kinds schemas are in active development and subject to change without prior notice.
## GoogleCloudMonitoringDataQuery
#### Maturity: [merged](../../../maturity/#merged)
#### Version: 0.0
| Property | Type | Required | Default | Description |
|----------|------|----------|---------|-------------|

View File

@ -10,7 +10,7 @@ import (
"github.com/grafana/grafana/pkg/plugins/backendplugin"
"github.com/grafana/grafana/pkg/plugins/log"
"github.com/grafana/grafana/pkg/tsdb/azuremonitor"
"github.com/grafana/grafana/pkg/tsdb/cloudmonitoring"
cloudmonitoring "github.com/grafana/grafana/pkg/tsdb/cloud-monitoring"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch"
"github.com/grafana/grafana/pkg/tsdb/elasticsearch"
"github.com/grafana/grafana/pkg/tsdb/grafanads"

View File

@ -37,7 +37,7 @@ import (
"github.com/grafana/grafana/pkg/services/searchV2"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tsdb/azuremonitor"
"github.com/grafana/grafana/pkg/tsdb/cloudmonitoring"
cloudmonitoring "github.com/grafana/grafana/pkg/tsdb/cloud-monitoring"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch"
"github.com/grafana/grafana/pkg/tsdb/elasticsearch"
"github.com/grafana/grafana/pkg/tsdb/grafanads"

View File

@ -142,7 +142,7 @@ import (
"github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tsdb/azuremonitor"
"github.com/grafana/grafana/pkg/tsdb/cloudmonitoring"
"github.com/grafana/grafana/pkg/tsdb/cloud-monitoring"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch"
"github.com/grafana/grafana/pkg/tsdb/elasticsearch"
"github.com/grafana/grafana/pkg/tsdb/grafanads"

View File

@ -0,0 +1,504 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// public/app/plugins/gen.go
// Using jennies:
// PluginGoTypesJenny
//
// Run 'make gen-cue' from repository root to regenerate.
package dataquery
import (
"encoding/json"
)
// Defines values for AlignmentTypes.
const (
AlignmentTypesALIGNCOUNT AlignmentTypes = "ALIGN_COUNT"
AlignmentTypesALIGNCOUNTFALSE AlignmentTypes = "ALIGN_COUNT_FALSE"
AlignmentTypesALIGNCOUNTTRUE AlignmentTypes = "ALIGN_COUNT_TRUE"
AlignmentTypesALIGNDELTA AlignmentTypes = "ALIGN_DELTA"
AlignmentTypesALIGNFRACTIONTRUE AlignmentTypes = "ALIGN_FRACTION_TRUE"
AlignmentTypesALIGNINTERPOLATE AlignmentTypes = "ALIGN_INTERPOLATE"
AlignmentTypesALIGNMAX AlignmentTypes = "ALIGN_MAX"
AlignmentTypesALIGNMEAN AlignmentTypes = "ALIGN_MEAN"
AlignmentTypesALIGNMIN AlignmentTypes = "ALIGN_MIN"
AlignmentTypesALIGNNEXTOLDER AlignmentTypes = "ALIGN_NEXT_OLDER"
AlignmentTypesALIGNNONE AlignmentTypes = "ALIGN_NONE"
AlignmentTypesALIGNPERCENTCHANGE AlignmentTypes = "ALIGN_PERCENT_CHANGE"
AlignmentTypesALIGNPERCENTILE05 AlignmentTypes = "ALIGN_PERCENTILE_05"
AlignmentTypesALIGNPERCENTILE50 AlignmentTypes = "ALIGN_PERCENTILE_50"
AlignmentTypesALIGNPERCENTILE95 AlignmentTypes = "ALIGN_PERCENTILE_95"
AlignmentTypesALIGNPERCENTILE99 AlignmentTypes = "ALIGN_PERCENTILE_99"
AlignmentTypesALIGNRATE AlignmentTypes = "ALIGN_RATE"
AlignmentTypesALIGNSTDDEV AlignmentTypes = "ALIGN_STDDEV"
AlignmentTypesALIGNSUM AlignmentTypes = "ALIGN_SUM"
)
// Defines values for AnnotationQueryPreprocessor.
const (
AnnotationQueryPreprocessorDelta AnnotationQueryPreprocessor = "delta"
AnnotationQueryPreprocessorNone AnnotationQueryPreprocessor = "none"
AnnotationQueryPreprocessorRate AnnotationQueryPreprocessor = "rate"
)
// Defines values for CloudMonitoringQueryTimeSeriesListPreprocessor.
const (
CloudMonitoringQueryTimeSeriesListPreprocessorDelta CloudMonitoringQueryTimeSeriesListPreprocessor = "delta"
CloudMonitoringQueryTimeSeriesListPreprocessorNone CloudMonitoringQueryTimeSeriesListPreprocessor = "none"
CloudMonitoringQueryTimeSeriesListPreprocessorRate CloudMonitoringQueryTimeSeriesListPreprocessor = "rate"
)
// Defines values for LegacyCloudMonitoringAnnotationQueryMetricKind.
const (
LegacyCloudMonitoringAnnotationQueryMetricKindCUMULATIVE LegacyCloudMonitoringAnnotationQueryMetricKind = "CUMULATIVE"
LegacyCloudMonitoringAnnotationQueryMetricKindDELTA LegacyCloudMonitoringAnnotationQueryMetricKind = "DELTA"
LegacyCloudMonitoringAnnotationQueryMetricKindGAUGE LegacyCloudMonitoringAnnotationQueryMetricKind = "GAUGE"
LegacyCloudMonitoringAnnotationQueryMetricKindMETRICKINDUNSPECIFIED LegacyCloudMonitoringAnnotationQueryMetricKind = "METRIC_KIND_UNSPECIFIED"
)
// Defines values for MetricFindQueryTypes.
const (
MetricFindQueryTypesAggregations MetricFindQueryTypes = "aggregations"
MetricFindQueryTypesAligners MetricFindQueryTypes = "aligners"
MetricFindQueryTypesAlignmentPeriods MetricFindQueryTypes = "alignmentPeriods"
MetricFindQueryTypesDefaultProject MetricFindQueryTypes = "defaultProject"
MetricFindQueryTypesLabelKeys MetricFindQueryTypes = "labelKeys"
MetricFindQueryTypesLabelValues MetricFindQueryTypes = "labelValues"
MetricFindQueryTypesMetricTypes MetricFindQueryTypes = "metricTypes"
MetricFindQueryTypesProjects MetricFindQueryTypes = "projects"
MetricFindQueryTypesResourceTypes MetricFindQueryTypes = "resourceTypes"
MetricFindQueryTypesSelectors MetricFindQueryTypes = "selectors"
MetricFindQueryTypesServices MetricFindQueryTypes = "services"
MetricFindQueryTypesSlo MetricFindQueryTypes = "slo"
MetricFindQueryTypesSloServices MetricFindQueryTypes = "sloServices"
)
// Defines values for MetricKind.
const (
MetricKindCUMULATIVE MetricKind = "CUMULATIVE"
MetricKindDELTA MetricKind = "DELTA"
MetricKindGAUGE MetricKind = "GAUGE"
MetricKindMETRICKINDUNSPECIFIED MetricKind = "METRIC_KIND_UNSPECIFIED"
)
// Defines values for MetricQueryMetricKind.
const (
MetricQueryMetricKindCUMULATIVE MetricQueryMetricKind = "CUMULATIVE"
MetricQueryMetricKindDELTA MetricQueryMetricKind = "DELTA"
MetricQueryMetricKindGAUGE MetricQueryMetricKind = "GAUGE"
MetricQueryMetricKindMETRICKINDUNSPECIFIED MetricQueryMetricKind = "METRIC_KIND_UNSPECIFIED"
)
// Defines values for MetricQueryPreprocessor.
const (
MetricQueryPreprocessorDelta MetricQueryPreprocessor = "delta"
MetricQueryPreprocessorNone MetricQueryPreprocessor = "none"
MetricQueryPreprocessorRate MetricQueryPreprocessor = "rate"
)
// Defines values for PreprocessorType.
const (
PreprocessorTypeDelta PreprocessorType = "delta"
PreprocessorTypeNone PreprocessorType = "none"
PreprocessorTypeRate PreprocessorType = "rate"
)
// Defines values for QueryType.
const (
QueryTypeAnnotation QueryType = "annotation"
QueryTypeSlo QueryType = "slo"
QueryTypeTimeSeriesList QueryType = "timeSeriesList"
QueryTypeTimeSeriesQuery QueryType = "timeSeriesQuery"
)
// Defines values for TimeSeriesListPreprocessor.
const (
TimeSeriesListPreprocessorDelta TimeSeriesListPreprocessor = "delta"
TimeSeriesListPreprocessorNone TimeSeriesListPreprocessor = "none"
TimeSeriesListPreprocessorRate TimeSeriesListPreprocessor = "rate"
)
// Defines values for ValueTypes.
const (
ValueTypesBOOL ValueTypes = "BOOL"
ValueTypesDISTRIBUTION ValueTypes = "DISTRIBUTION"
ValueTypesDOUBLE ValueTypes = "DOUBLE"
ValueTypesINT64 ValueTypes = "INT64"
ValueTypesMONEY ValueTypes = "MONEY"
ValueTypesSTRING ValueTypes = "STRING"
ValueTypesVALUETYPEUNSPECIFIED ValueTypes = "VALUE_TYPE_UNSPECIFIED"
)
// AlignmentTypes defines model for AlignmentTypes.
type AlignmentTypes string
// Annotation sub-query properties.
type AnnotationQuery struct {
// Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
AlignmentPeriod *string `json:"alignmentPeriod,omitempty"`
// Reducer applied across a set of time-series values. Defaults to REDUCE_NONE.
CrossSeriesReducer string `json:"crossSeriesReducer"`
// Array of filters to query data by. Labels that can be filtered on are defined by the metric.
Filters []string `json:"filters,omitempty"`
// Array of labels to group data by.
GroupBys []string `json:"groupBys,omitempty"`
// Alignment function to be used. Defaults to ALIGN_MEAN.
PerSeriesAligner *string `json:"perSeriesAligner,omitempty"`
// Preprocessor is not part of the API, but is used to store the preprocessor and not affect the UI for the rest of parameters
Preprocessor *AnnotationQueryPreprocessor `json:"preprocessor,omitempty"`
// GCP project to execute the query against.
ProjectName string `json:"projectName"`
// Only present if a preprocessor is selected. Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
SecondaryAlignmentPeriod *string `json:"secondaryAlignmentPeriod,omitempty"`
// Only present if a preprocessor is selected. Reducer applied across a set of time-series values. Defaults to REDUCE_NONE.
SecondaryCrossSeriesReducer *string `json:"secondaryCrossSeriesReducer,omitempty"`
// Only present if a preprocessor is selected. Array of labels to group data by.
SecondaryGroupBys []string `json:"secondaryGroupBys,omitempty"`
// Only present if a preprocessor is selected. Alignment function to be used. Defaults to ALIGN_MEAN.
SecondaryPerSeriesAligner *string `json:"secondaryPerSeriesAligner,omitempty"`
// Annotation text.
Text *string `json:"text,omitempty"`
// Annotation title.
Title *string `json:"title,omitempty"`
// Data view, defaults to FULL.
View *string `json:"view,omitempty"`
AdditionalProperties map[string]interface{} `json:"-"`
}
// Preprocessor is not part of the API, but is used to store the preprocessor and not affect the UI for the rest of parameters
type AnnotationQueryPreprocessor string
// CloudMonitoringQuery defines model for CloudMonitoringQuery.
type CloudMonitoringQuery struct {
// Aliases can be set to modify the legend labels. e.g. {{metric.label.xxx}}. See docs for more detail.
AliasBy *string `json:"aliasBy,omitempty"`
// For mixed data sources the selected datasource is on the query level.
// For non mixed scenarios this is undefined.
// TODO find a better way to do this ^ that's friendly to schema
// TODO this shouldn't be unknown but DataSourceRef | null
Datasource *interface{} `json:"datasource,omitempty"`
// Hide true if query is disabled (ie should not be returned to the dashboard)
// Note this does not always imply that the query should not be executed since
// the results from a hidden query may be used as the input to other queries (SSE etc)
Hide *bool `json:"hide,omitempty"`
// Time interval in milliseconds.
IntervalMs *float32 `json:"intervalMs,omitempty"`
// Specify the query flavor
// TODO make this required and give it a default
QueryType *string `json:"queryType,omitempty"`
// A unique identifier for the query within the list of targets.
// In server side expressions, the refId is used as a variable name to identify results.
// By default, the UI will assign A->Z; however setting meaningful names may be useful.
RefId string `json:"refId"`
// SLO sub-query properties.
SloQuery *struct {
// Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
AlignmentPeriod *string `json:"alignmentPeriod,omitempty"`
// SLO goal value.
Goal *float32 `json:"goal,omitempty"`
// Specific lookback period for the SLO.
LookbackPeriod *string `json:"lookbackPeriod,omitempty"`
// Alignment function to be used. Defaults to ALIGN_MEAN.
PerSeriesAligner *string `json:"perSeriesAligner,omitempty"`
// GCP project to execute the query against.
ProjectName string `json:"projectName"`
// SLO selector.
SelectorName string `json:"selectorName"`
// ID for the service the SLO is in.
ServiceId string `json:"serviceId"`
// Name for the service the SLO is in.
ServiceName string `json:"serviceName"`
// ID for the SLO.
SloId string `json:"sloId"`
// Name of the SLO.
SloName string `json:"sloName"`
} `json:"sloQuery,omitempty"`
// GCM query type.
// queryType: #QueryType
// Time Series List sub-query properties.
TimeSeriesList *CloudMonitoringQueryTimeSeriesList `json:"timeSeriesList,omitempty"`
// Time Series sub-query properties.
TimeSeriesQuery *struct {
// To disable the graphPeriod, it should explictly be set to 'disabled'.
GraphPeriod *string `json:"graphPeriod,omitempty"`
// GCP project to execute the query against.
ProjectName string `json:"projectName"`
// MQL query to be executed.
Query string `json:"query"`
} `json:"timeSeriesQuery,omitempty"`
}
// Preprocessor is not part of the API, but is used to store the preprocessor and not affect the UI for the rest of parameters
type CloudMonitoringQueryTimeSeriesListPreprocessor string
// GCM query type.
// queryType: #QueryType
// Time Series List sub-query properties.
type CloudMonitoringQueryTimeSeriesList struct {
// Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
AlignmentPeriod *string `json:"alignmentPeriod,omitempty"`
// Reducer applied across a set of time-series values. Defaults to REDUCE_NONE.
CrossSeriesReducer *string `json:"crossSeriesReducer,omitempty"`
// Array of filters to query data by. Labels that can be filtered on are defined by the metric.
Filters []string `json:"filters,omitempty"`
// Array of labels to group data by.
GroupBys []string `json:"groupBys,omitempty"`
// Alignment function to be used. Defaults to ALIGN_MEAN.
PerSeriesAligner *string `json:"perSeriesAligner,omitempty"`
// Preprocessor is not part of the API, but is used to store the preprocessor and not affect the UI for the rest of parameters
Preprocessor *CloudMonitoringQueryTimeSeriesListPreprocessor `json:"preprocessor,omitempty"`
// GCP project to execute the query against.
ProjectName *string `json:"projectName,omitempty"`
// Only present if a preprocessor is selected. Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
SecondaryAlignmentPeriod *string `json:"secondaryAlignmentPeriod,omitempty"`
// Only present if a preprocessor is selected. Reducer applied across a set of time-series values. Defaults to REDUCE_NONE.
SecondaryCrossSeriesReducer *string `json:"secondaryCrossSeriesReducer,omitempty"`
// Only present if a preprocessor is selected. Array of labels to group data by.
SecondaryGroupBys []string `json:"secondaryGroupBys,omitempty"`
// Only present if a preprocessor is selected. Alignment function to be used. Defaults to ALIGN_MEAN.
SecondaryPerSeriesAligner *string `json:"secondaryPerSeriesAligner,omitempty"`
// Annotation text.
Text *string `json:"text,omitempty"`
// Annotation title.
Title *string `json:"title,omitempty"`
// Data view, defaults to FULL.
View *string `json:"view,omitempty"`
AdditionalProperties map[string]interface{} `json:"-"`
union json.RawMessage
}
// Query filter representation.
type Filter struct {
// Filter condition.
Condition *string `json:"condition,omitempty"`
// Filter key.
Key string `json:"key"`
// Filter operator.
Operator string `json:"operator"`
// Filter value.
Value string `json:"value"`
}
// GoogleCloudMonitoringDataQuery defines model for GoogleCloudMonitoringDataQuery.
type GoogleCloudMonitoringDataQuery = map[string]interface{}
// @deprecated Use AnnotationQuery instead. Legacy annotation query properties for migration purposes.
type LegacyCloudMonitoringAnnotationQuery struct {
// Array of filters to query data by. Labels that can be filtered on are defined by the metric.
Filters []string `json:"filters"`
MetricKind LegacyCloudMonitoringAnnotationQueryMetricKind `json:"metricKind"`
MetricType string `json:"metricType"`
// GCP project to execute the query against.
ProjectName string `json:"projectName"`
// Query refId.
RefId string `json:"refId"`
// Annotation text.
Text string `json:"text"`
// Annotation title.
Title string `json:"title"`
ValueType string `json:"valueType"`
}
// LegacyCloudMonitoringAnnotationQueryMetricKind defines model for LegacyCloudMonitoringAnnotationQuery.MetricKind.
type LegacyCloudMonitoringAnnotationQueryMetricKind string
// MetricFindQueryTypes defines model for MetricFindQueryTypes.
type MetricFindQueryTypes string
// MetricKind defines model for MetricKind.
type MetricKind string
// @deprecated This type is for migration purposes only. Replaced by TimeSeriesList Metric sub-query properties.
type MetricQuery struct {
// Aliases can be set to modify the legend labels. e.g. {{metric.label.xxx}}. See docs for more detail.
AliasBy *string `json:"aliasBy,omitempty"`
// Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
AlignmentPeriod *string `json:"alignmentPeriod,omitempty"`
// Reducer applied across a set of time-series values. Defaults to REDUCE_NONE.
CrossSeriesReducer string `json:"crossSeriesReducer"`
EditorMode string `json:"editorMode"`
// Array of filters to query data by. Labels that can be filtered on are defined by the metric.
Filters []string `json:"filters,omitempty"`
// To disable the graphPeriod, it should explictly be set to 'disabled'.
GraphPeriod *string `json:"graphPeriod,omitempty"`
// Array of labels to group data by.
GroupBys []string `json:"groupBys,omitempty"`
MetricKind *MetricQueryMetricKind `json:"metricKind,omitempty"`
MetricType string `json:"metricType"`
// Alignment function to be used. Defaults to ALIGN_MEAN.
PerSeriesAligner *string `json:"perSeriesAligner,omitempty"`
// Preprocessor is not part of the API, but is used to store the preprocessor and not affect the UI for the rest of parameters
Preprocessor *MetricQueryPreprocessor `json:"preprocessor,omitempty"`
// GCP project to execute the query against.
ProjectName string `json:"projectName"`
// MQL query to be executed.
Query string `json:"query"`
ValueType *string `json:"valueType,omitempty"`
View *string `json:"view,omitempty"`
}
// MetricQueryMetricKind defines model for MetricQuery.MetricKind.
type MetricQueryMetricKind string
// Preprocessor is not part of the API, but is used to store the preprocessor and not affect the UI for the rest of parameters
type MetricQueryPreprocessor string
// Types of pre-processor available. Defined by the metric.
type PreprocessorType string
// Defines the supported queryTypes.
type QueryType string
// SLO sub-query properties.
type SLOQuery struct {
// Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
AlignmentPeriod *string `json:"alignmentPeriod,omitempty"`
// SLO goal value.
Goal *float32 `json:"goal,omitempty"`
// Specific lookback period for the SLO.
LookbackPeriod *string `json:"lookbackPeriod,omitempty"`
// Alignment function to be used. Defaults to ALIGN_MEAN.
PerSeriesAligner *string `json:"perSeriesAligner,omitempty"`
// GCP project to execute the query against.
ProjectName string `json:"projectName"`
// SLO selector.
SelectorName string `json:"selectorName"`
// ID for the service the SLO is in.
ServiceId string `json:"serviceId"`
// Name for the service the SLO is in.
ServiceName string `json:"serviceName"`
// ID for the SLO.
SloId string `json:"sloId"`
// Name of the SLO.
SloName string `json:"sloName"`
}
// Time Series List sub-query properties.
type TimeSeriesList struct {
// Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
AlignmentPeriod *string `json:"alignmentPeriod,omitempty"`
// Reducer applied across a set of time-series values. Defaults to REDUCE_NONE.
CrossSeriesReducer string `json:"crossSeriesReducer"`
// Array of filters to query data by. Labels that can be filtered on are defined by the metric.
Filters []string `json:"filters,omitempty"`
// Array of labels to group data by.
GroupBys []string `json:"groupBys,omitempty"`
// Alignment function to be used. Defaults to ALIGN_MEAN.
PerSeriesAligner *string `json:"perSeriesAligner,omitempty"`
// Preprocessor is not part of the API, but is used to store the preprocessor and not affect the UI for the rest of parameters
Preprocessor *TimeSeriesListPreprocessor `json:"preprocessor,omitempty"`
// GCP project to execute the query against.
ProjectName string `json:"projectName"`
// Only present if a preprocessor is selected. Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
SecondaryAlignmentPeriod *string `json:"secondaryAlignmentPeriod,omitempty"`
// Only present if a preprocessor is selected. Reducer applied across a set of time-series values. Defaults to REDUCE_NONE.
SecondaryCrossSeriesReducer *string `json:"secondaryCrossSeriesReducer,omitempty"`
// Only present if a preprocessor is selected. Array of labels to group data by.
SecondaryGroupBys []string `json:"secondaryGroupBys,omitempty"`
// Only present if a preprocessor is selected. Alignment function to be used. Defaults to ALIGN_MEAN.
SecondaryPerSeriesAligner *string `json:"secondaryPerSeriesAligner,omitempty"`
// Data view, defaults to FULL.
View *string `json:"view,omitempty"`
AdditionalProperties map[string]interface{} `json:"-"`
}
// Preprocessor is not part of the API, but is used to store the preprocessor and not affect the UI for the rest of parameters
type TimeSeriesListPreprocessor string
// Time Series sub-query properties.
type TimeSeriesQuery struct {
// To disable the graphPeriod, it should explictly be set to 'disabled'.
GraphPeriod *string `json:"graphPeriod,omitempty"`
// GCP project to execute the query against.
ProjectName string `json:"projectName"`
// MQL query to be executed.
Query string `json:"query"`
}
// ValueTypes defines model for ValueTypes.
type ValueTypes string

View File

@ -11,7 +11,8 @@ import {
getLabelKeys,
getMetricTypesByService,
} from './functions';
import { CloudMonitoringVariableQuery, MetricDescriptor, MetricFindQueryTypes, MetricKind, ValueTypes } from './types';
import { MetricKind, ValueTypes, MetricFindQueryTypes } from './types/query';
import { CloudMonitoringVariableQuery, MetricDescriptor } from './types/types';
export default class CloudMonitoringMetricFindQuery {
constructor(private datasource: CloudMonitoringDatasource) {}

View File

@ -1,7 +1,7 @@
import { DataSourceInstanceSettings, DataSourcePluginMeta } from '@grafana/data';
import { GoogleAuthType } from '@grafana/google-sdk';
import { CloudMonitoringOptions } from '../types';
import { CloudMonitoringOptions } from '../types/types';
export const createMockInstanceSetttings = (
overrides?: Partial<DataSourceInstanceSettings<CloudMonitoringOptions>>

View File

@ -1,4 +1,5 @@
import { MetricDescriptor, MetricKind, ValueTypes } from '../types';
import { MetricKind, ValueTypes } from '../types/query';
import { MetricDescriptor } from '../types/types';
export const createMockMetricDescriptor = (overrides?: Partial<MetricDescriptor>): MetricDescriptor => {
return {

View File

@ -1,4 +1,11 @@
import { AlignmentTypes, CloudMonitoringQuery, QueryType, SLOQuery, TimeSeriesList, TimeSeriesQuery } from '../types';
import {
AlignmentTypes,
CloudMonitoringQuery,
QueryType,
SLOQuery,
TimeSeriesList,
TimeSeriesQuery,
} from '../types/query';
type Subset<K> = {
[attr in keyof K]?: K[attr] extends object ? Subset<K[attr]> : K[attr];

View File

@ -5,10 +5,10 @@ import { CloudMonitoringAnnotationSupport } from './annotationSupport';
import {
AlignmentTypes,
CloudMonitoringQuery,
LegacyCloudMonitoringAnnotationQuery,
MetricKind,
QueryType,
} from './types';
MetricKind,
LegacyCloudMonitoringAnnotationQuery,
} from './types/query';
const query: CloudMonitoringQuery = {
refId: 'query',

View File

@ -2,7 +2,7 @@ import { AnnotationSupport, AnnotationQuery } from '@grafana/data';
import { AnnotationQueryEditor } from './components/AnnotationQueryEditor';
import CloudMonitoringDatasource from './datasource';
import { AlignmentTypes, CloudMonitoringQuery, LegacyCloudMonitoringAnnotationQuery, QueryType } from './types';
import { AlignmentTypes, CloudMonitoringQuery, QueryType, LegacyCloudMonitoringAnnotationQuery } from './types/query';
// The legacy query format sets the title and text values to empty strings by default.
// If the title or text is not undefined at the top-level of the annotation target,

View File

@ -3,7 +3,8 @@ import React from 'react';
import { openMenu } from 'react-select-event';
import { TemplateSrvStub } from 'test/specs/helpers';
import { ValueTypes, MetricKind, MetricDescriptor } from '../types';
import { MetricKind, ValueTypes } from '../types/query';
import { MetricDescriptor } from '../types/types';
import { Aggregation, Props } from './Aggregation';

View File

@ -5,7 +5,8 @@ import { EditorField } from '@grafana/experimental';
import { Select } from '@grafana/ui';
import { getAggregationOptionsByMetric } from '../functions';
import { MetricDescriptor, MetricKind, ValueTypes } from '../types';
import { MetricKind, ValueTypes } from '../types/query';
import { MetricDescriptor } from '../types/types';
export interface Props {
refId: string;

View File

@ -8,7 +8,7 @@ import { TemplateSrvMock } from 'app/features/templating/template_srv.mock';
import { createMockDatasource } from '../__mocks__/cloudMonitoringDatasource';
import { createMockMetricDescriptor } from '../__mocks__/cloudMonitoringMetricDescriptor';
import { createMockTimeSeriesList } from '../__mocks__/cloudMonitoringQuery';
import { MetricKind, ValueTypes } from '../types';
import { MetricKind, ValueTypes } from '../types/query';
import { Alignment } from './Alignment';

View File

@ -6,7 +6,8 @@ import { EditorField, EditorFieldGroup } from '@grafana/experimental';
import { ALIGNMENT_PERIODS } from '../constants';
import CloudMonitoringDatasource from '../datasource';
import { alignmentPeriodLabel } from '../functions';
import { CustomMetaData, MetricDescriptor, PreprocessorType, TimeSeriesList } from '../types';
import { PreprocessorType, TimeSeriesList } from '../types/query';
import { CustomMetaData, MetricDescriptor } from '../types/types';
import { AlignmentFunction } from './AlignmentFunction';
import { PeriodSelect } from './PeriodSelect';

View File

@ -4,7 +4,8 @@ import { SelectableValue } from '@grafana/data';
import { Select } from '@grafana/ui';
import { getAlignmentPickerData } from '../functions';
import { MetricDescriptor, PreprocessorType, SLOQuery, TimeSeriesList } from '../types';
import { PreprocessorType, SLOQuery, TimeSeriesList } from '../types/query';
import { MetricDescriptor } from '../types/types';
export interface Props {
inputId: string;

View File

@ -6,7 +6,8 @@ import { EditorField, EditorRows } from '@grafana/experimental';
import { Input } from '@grafana/ui';
import CloudMonitoringDatasource from '../datasource';
import { AnnotationQuery, CloudMonitoringOptions, CloudMonitoringQuery, QueryType } from '../types';
import { AnnotationQuery, CloudMonitoringQuery, QueryType } from '../types/query';
import { CloudMonitoringOptions } from '../types/types';
import { MetricQueryEditor, defaultTimeSeriesList } from './MetricQueryEditor';
@ -56,7 +57,7 @@ export const AnnotationQueryEditor = (props: Props) => {
// Use a known query type
useEffect(() => {
if (!Object.values(QueryType).includes(query.queryType)) {
if (!query.queryType || !Object.values(QueryType).includes(query.queryType)) {
onChange({ ...query, queryType: QueryType.TIME_SERIES_LIST });
}
});

View File

@ -3,7 +3,7 @@ import React, { PureComponent } from 'react';
import { QueryEditorHelpProps } from '@grafana/data';
import { CloudMonitoringQuery } from '../types';
import { CloudMonitoringQuery } from '../types/query';
export default class CloudMonitoringCheatSheet extends PureComponent<
QueryEditorHelpProps<CloudMonitoringQuery>,

View File

@ -6,7 +6,7 @@ import { reportInteraction } from '@grafana/runtime';
import { SecureSocksProxySettings } from '@grafana/ui';
import { config } from 'app/core/config';
import { CloudMonitoringOptions, CloudMonitoringSecureJsonData } from '../../types';
import { CloudMonitoringOptions, CloudMonitoringSecureJsonData } from '../../types/types';
export type Props = DataSourcePluginOptionsEditorProps<CloudMonitoringOptions, CloudMonitoringSecureJsonData>;

View File

@ -3,7 +3,7 @@ import React from 'react';
import { openMenu, select } from 'react-select-event';
import { createMockTimeSeriesList } from '../__mocks__/cloudMonitoringQuery';
import { MetricDescriptor } from '../types';
import { MetricDescriptor } from '../types/types';
import { GroupBy, Props } from './GroupBy';

View File

@ -6,7 +6,8 @@ import { MultiSelect } from '@grafana/ui';
import { SYSTEM_LABELS } from '../constants';
import { labelsToGroupedOptions } from '../functions';
import { MetricDescriptor, TimeSeriesList } from '../types';
import { TimeSeriesList } from '../types/query';
import { MetricDescriptor } from '../types/types';
import { Aggregation } from './Aggregation';

View File

@ -3,7 +3,7 @@ import React from 'react';
import { createMockDatasource } from '../__mocks__/cloudMonitoringDatasource';
import { createMockQuery } from '../__mocks__/cloudMonitoringQuery';
import { QueryType } from '../types';
import { QueryType } from '../types/query';
import { MetricQueryEditor } from './MetricQueryEditor';

View File

@ -4,14 +4,8 @@ import { SelectableValue } from '@grafana/data';
import { EditorRows } from '@grafana/experimental';
import CloudMonitoringDatasource from '../datasource';
import {
AlignmentTypes,
CloudMonitoringQuery,
CustomMetaData,
QueryType,
TimeSeriesList,
TimeSeriesQuery,
} from '../types';
import { AlignmentTypes, CloudMonitoringQuery, QueryType, TimeSeriesList, TimeSeriesQuery } from '../types/query';
import { CustomMetaData } from '../types/types';
import { GraphPeriod } from './GraphPeriod';
import { MQLQueryEditor } from './MQLQueryEditor';
@ -85,7 +79,8 @@ function Editor({
return (
<EditorRows>
{[QueryType.TIME_SERIES_LIST, QueryType.ANNOTATION].includes(query.queryType) && query.timeSeriesList && (
{(query.queryType === QueryType.ANNOTATION || query.queryType === QueryType.TIME_SERIES_LIST) &&
query.timeSeriesList && (
<VisualMetricQueryEditor
refId={refId}
variableOptionGroup={variableOptionGroup}

View File

@ -6,7 +6,7 @@ import { TemplateSrvMock } from 'app/features/templating/template_srv.mock';
import { createMockMetricDescriptor } from '../__mocks__/cloudMonitoringMetricDescriptor';
import { createMockTimeSeriesList } from '../__mocks__/cloudMonitoringQuery';
import { MetricKind, ValueTypes } from '../types';
import { MetricKind, ValueTypes } from '../types/query';
import { Preprocessor } from './Preprocessor';

View File

@ -5,7 +5,8 @@ import { EditorField } from '@grafana/experimental';
import { RadioButtonGroup } from '@grafana/ui';
import { getAlignmentPickerData } from '../functions';
import { MetricDescriptor, MetricKind, PreprocessorType, TimeSeriesList, ValueTypes } from '../types';
import { PreprocessorType, TimeSeriesList, MetricKind, ValueTypes } from '../types/query';
import { MetricDescriptor } from '../types/types';
const NONE_OPTION = { label: 'None', value: PreprocessorType.None };

View File

@ -3,7 +3,7 @@ import React from 'react';
import { createMockDatasource } from '../__mocks__/cloudMonitoringDatasource';
import { createMockQuery } from '../__mocks__/cloudMonitoringQuery';
import { QueryType } from '../types';
import { QueryType } from '../types/query';
import { QueryEditor } from './QueryEditor';

View File

@ -4,7 +4,8 @@ import { QueryEditorProps, toOption } from '@grafana/data';
import { EditorRows } from '@grafana/experimental';
import CloudMonitoringDatasource from '../datasource';
import { CloudMonitoringQuery, QueryType, SLOQuery, CloudMonitoringOptions } from '../types';
import { CloudMonitoringQuery, QueryType, SLOQuery } from '../types/query';
import { CloudMonitoringOptions } from '../types/types';
import { QueryHeader } from './QueryHeader';
import { defaultQuery as defaultSLOQuery } from './SLOQueryEditor';
@ -44,7 +45,7 @@ export const QueryEditor = (props: Props) => {
// Use a known query type
useEffect(() => {
if (!Object.values(QueryType).includes(query.queryType)) {
if (!query.queryType || !Object.values(QueryType).includes(query.queryType)) {
onChange({ ...query, queryType: QueryType.TIME_SERIES_LIST });
}
});

View File

@ -3,7 +3,7 @@ import React from 'react';
import { openMenu, select } from 'react-select-event';
import { createMockQuery } from '../__mocks__/cloudMonitoringQuery';
import { QueryType } from '../types';
import { QueryType } from '../types/query';
import { QueryHeader } from './QueryHeader';

View File

@ -3,7 +3,7 @@ import React from 'react';
import { EditorHeader, FlexItem, InlineSelect } from '@grafana/experimental';
import { QUERY_TYPES } from '../constants';
import { CloudMonitoringQuery } from '../types';
import { CloudMonitoringQuery } from '../types/query';
export interface QueryEditorHeaderProps {
query: CloudMonitoringQuery;

View File

@ -5,7 +5,7 @@ import { EditorField } from '@grafana/experimental';
import { Select } from '@grafana/ui';
import CloudMonitoringDatasource from '../datasource';
import { SLOQuery } from '../types';
import { SLOQuery } from '../types/query';
export interface Props {
refId: string;

View File

@ -6,7 +6,8 @@ import { EditorField, EditorFieldGroup, EditorRow } from '@grafana/experimental'
import { ALIGNMENT_PERIODS, SLO_BURN_RATE_SELECTOR_NAME } from '../constants';
import CloudMonitoringDatasource from '../datasource';
import { alignmentPeriodLabel } from '../functions';
import { AlignmentTypes, CustomMetaData, SLOQuery } from '../types';
import { AlignmentTypes, SLOQuery } from '../types/query';
import { CustomMetaData } from '../types/types';
import { AliasBy } from './AliasBy';
import { LookbackPeriodSelect } from './LookbackPeriodSelect';

View File

@ -6,7 +6,7 @@ import { Select } from '@grafana/ui';
import { SELECTORS } from '../constants';
import CloudMonitoringDatasource from '../datasource';
import { SLOQuery } from '../types';
import { SLOQuery } from '../types/query';
export interface Props {
refId: string;

View File

@ -5,7 +5,7 @@ import { EditorField } from '@grafana/experimental';
import { Select } from '@grafana/ui';
import CloudMonitoringDatasource from '../datasource';
import { SLOQuery } from '../types';
import { SLOQuery } from '../types/query';
export interface Props {
refId: string;

View File

@ -5,7 +5,8 @@ import renderer from 'react-test-renderer';
import { VariableModel } from '@grafana/data';
import CloudMonitoringDatasource from '../datasource';
import { CloudMonitoringVariableQuery, MetricFindQueryTypes } from '../types';
import { MetricFindQueryTypes } from '../types/query';
import { CloudMonitoringVariableQuery } from '../types/types';
import { CloudMonitoringVariableQueryEditor, Props } from './VariableQueryEditor';

View File

@ -5,14 +5,13 @@ import { getTemplateSrv } from '@grafana/runtime';
import CloudMonitoringDatasource from '../datasource';
import { extractServicesFromMetricDescriptors, getLabelKeys, getMetricTypes } from '../functions';
import { CloudMonitoringQuery, MetricFindQueryTypes } from '../types/query';
import {
CloudMonitoringOptions,
CloudMonitoringQuery,
CloudMonitoringVariableQuery,
MetricDescriptor,
MetricFindQueryTypes,
VariableQueryData,
} from '../types';
} from '../types/types';
import { VariableQueryField } from './';

View File

@ -9,7 +9,7 @@ import { TemplateSrv } from 'app/features/templating/template_srv';
import { createMockDatasource } from '../__mocks__/cloudMonitoringDatasource';
import { createMockMetricDescriptor } from '../__mocks__/cloudMonitoringMetricDescriptor';
import { createMockTimeSeriesList } from '../__mocks__/cloudMonitoringQuery';
import { MetricKind, PreprocessorType } from '../types';
import { PreprocessorType, MetricKind } from '../types/query';
import { defaultTimeSeriesList } from './MetricQueryEditor';
import { VisualMetricQueryEditor } from './VisualMetricQueryEditor';

View File

@ -10,7 +10,8 @@ import { getSelectStyles, Select, AsyncSelect, useStyles2, useTheme2 } from '@gr
import CloudMonitoringDatasource from '../datasource';
import { getAlignmentPickerData, getMetricType, setMetricType } from '../functions';
import { CustomMetaData, MetricDescriptor, MetricKind, PreprocessorType, TimeSeriesList, ValueTypes } from '../types';
import { PreprocessorType, TimeSeriesList, MetricKind, ValueTypes } from '../types/query';
import { CustomMetaData, MetricDescriptor } from '../types/types';
import { AliasBy } from './AliasBy';
import { Alignment } from './Alignment';

View File

@ -1,4 +1,4 @@
import { MetricKind, QueryType, ValueTypes } from './types';
import { QueryType, MetricKind, ValueTypes } from './types/query';
// not super excited about using uneven numbers, but this makes it align perfectly with rows that has two fields
export const INPUT_WIDTH = 71;

View File

@ -0,0 +1,197 @@
// Copyright 2023 Grafana Labs
//
// 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.
package grafanaplugin
import (
"github.com/grafana/grafana/packages/grafana-schema/src/common"
"github.com/grafana/grafana/pkg/plugins/pfs"
)
pfs.GrafanaPlugin
composableKinds: DataQuery: {
maturity: "merged"
lineage: {
seqs: [
{
schemas: [
{
#CloudMonitoringQuery: common.DataQuery & {
// Aliases can be set to modify the legend labels. e.g. {{metric.label.xxx}}. See docs for more detail.
aliasBy?: string
// GCM query type.
// queryType: #QueryType
// Time Series List sub-query properties.
timeSeriesList?: #TimeSeriesList | #AnnotationQuery
// Time Series sub-query properties.
timeSeriesQuery?: #TimeSeriesQuery
// SLO sub-query properties.
sloQuery?: #SLOQuery
// Time interval in milliseconds.
intervalMs?: number
} @cuetsy(kind="interface")
// Defines the supported queryTypes.
#QueryType: "timeSeriesList" | "timeSeriesQuery" | "slo" | "annotation" @cuetsy(kind="enum", memberNames="TIME_SERIES_LIST|TIME_SERIES_QUERY|SLO|ANNOTATION")
// Time Series List sub-query properties.
#TimeSeriesList: {
// GCP project to execute the query against.
projectName: string
// Reducer applied across a set of time-series values. Defaults to REDUCE_NONE.
crossSeriesReducer: string
// Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
alignmentPeriod?: string
// Alignment function to be used. Defaults to ALIGN_MEAN.
perSeriesAligner?: string
// Array of labels to group data by.
groupBys?: [...string]
// Array of filters to query data by. Labels that can be filtered on are defined by the metric.
filters?: [...string]
// Data view, defaults to FULL.
view?: string
// Only present if a preprocessor is selected. Reducer applied across a set of time-series values. Defaults to REDUCE_NONE.
secondaryCrossSeriesReducer?: string
// Only present if a preprocessor is selected. Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
secondaryAlignmentPeriod?: string
// Only present if a preprocessor is selected. Alignment function to be used. Defaults to ALIGN_MEAN.
secondaryPerSeriesAligner?: string
// Only present if a preprocessor is selected. Array of labels to group data by.
secondaryGroupBys?: [...string]
// Preprocessor is not part of the API, but is used to store the preprocessor and not affect the UI for the rest of parameters
preprocessor?: #PreprocessorType
...
} @cuetsy(kind="interface")
// Types of pre-processor available. Defined by the metric.
#PreprocessorType: "none" | "rate" | "delta" @cuetsy(kind="enum")
// Annotation sub-query properties.
#AnnotationQuery: #TimeSeriesList & {
// Annotation title.
title?: string
// Annotation text.
text?: string
} @cuetsy(kind="interface")
// Time Series sub-query properties.
#TimeSeriesQuery: {
// GCP project to execute the query against.
projectName: string
// MQL query to be executed.
query: string
// To disable the graphPeriod, it should explictly be set to 'disabled'.
graphPeriod?: "disabled" | string
} @cuetsy(kind="interface")
// SLO sub-query properties.
#SLOQuery: {
// GCP project to execute the query against.
projectName: string
// Alignment function to be used. Defaults to ALIGN_MEAN.
perSeriesAligner?: string
// Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
alignmentPeriod?: string
// SLO selector.
selectorName: string
// ID for the service the SLO is in.
serviceId: string
// Name for the service the SLO is in.
serviceName: string
// ID for the SLO.
sloId: string
// Name of the SLO.
sloName: string
// SLO goal value.
goal?: number
// Specific lookback period for the SLO.
lookbackPeriod?: string
} @cuetsy(kind="interface")
// @deprecated This type is for migration purposes only. Replaced by TimeSeriesList Metric sub-query properties.
#MetricQuery: {
// GCP project to execute the query against.
projectName: string
// Alignment function to be used. Defaults to ALIGN_MEAN.
perSeriesAligner?: string
// Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
alignmentPeriod?: string
// Aliases can be set to modify the legend labels. e.g. {{metric.label.xxx}}. See docs for more detail.
aliasBy?: string
editorMode: string
metricType: string
// Reducer applied across a set of time-series values. Defaults to REDUCE_NONE.
crossSeriesReducer: string
// Array of labels to group data by.
groupBys?: [...string]
// Array of filters to query data by. Labels that can be filtered on are defined by the metric.
filters?: [...string]
metricKind?: #MetricKind
valueType?: string
view?: string
// MQL query to be executed.
query: string
// Preprocessor is not part of the API, but is used to store the preprocessor and not affect the UI for the rest of parameters
preprocessor?: #PreprocessorType
// To disable the graphPeriod, it should explictly be set to 'disabled'.
graphPeriod?: "disabled" | string
} @cuetsy(kind="interface")
#MetricKind: "METRIC_KIND_UNSPECIFIED" | "GAUGE" | "DELTA" | "CUMULATIVE" @cuetsy(kind="enum")
#ValueTypes: "VALUE_TYPE_UNSPECIFIED" | "BOOL" | "INT64" | "DOUBLE" | "STRING" | "DISTRIBUTION" | "MONEY" @cuetsy(kind="enum")
#AlignmentTypes: "ALIGN_DELTA" | "ALIGN_RATE" | "ALIGN_INTERPOLATE" | "ALIGN_NEXT_OLDER" | "ALIGN_MIN" | "ALIGN_MAX" | "ALIGN_MEAN" | "ALIGN_COUNT" | "ALIGN_SUM" | "ALIGN_STDDEV" | "ALIGN_COUNT_TRUE" | "ALIGN_COUNT_FALSE" | "ALIGN_FRACTION_TRUE" | "ALIGN_PERCENTILE_99" | "ALIGN_PERCENTILE_95" | "ALIGN_PERCENTILE_50" | "ALIGN_PERCENTILE_05" | "ALIGN_PERCENT_CHANGE" | "ALIGN_NONE" @cuetsy(kind="enum")
// @deprecated Use AnnotationQuery instead. Legacy annotation query properties for migration purposes.
#LegacyCloudMonitoringAnnotationQuery: {
// GCP project to execute the query against.
projectName: string
metricType: string
// Query refId.
refId: string
// Array of filters to query data by. Labels that can be filtered on are defined by the metric.
filters: [...string]
metricKind: #MetricKind
valueType: string
// Annotation title.
title: string
// Annotation text.
text: string
} @cuetsy(kind="interface")
// Query filter representation.
#Filter: {
// Filter key.
key: string
// Filter operator.
operator: string
// Filter value.
value: string
// Filter condition.
condition?: string
} @cuetsy(kind="interface")
#MetricFindQueryTypes: "projects" | "services" | "defaultProject" | "metricTypes" | "labelKeys" | "labelValues" | "resourceTypes" | "aggregations" | "aligners" | "alignmentPeriods" | "selectors" | "sloServices" | "slo" @cuetsy(kind="enum", memberNames="Projects|Services|DefaultProject|MetricTypes|LabelKeys|LabelValues|ResourceTypes|Aggregations|Aligners|AlignmentPeriods|Selectors|SLOServices|SLO")
},
]
},
]
}
}

View File

@ -0,0 +1,363 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
//
// Generated by:
// public/app/plugins/gen.go
// Using jennies:
// TSTypesJenny
// PluginTSTypesJenny
//
// Run 'make gen-cue' from repository root to regenerate.
import * as common from '@grafana/schema';
export const DataQueryModelVersion = Object.freeze([0, 0]);
export interface CloudMonitoringQuery extends common.DataQuery {
/**
* Aliases can be set to modify the legend labels. e.g. {{metric.label.xxx}}. See docs for more detail.
*/
aliasBy?: string;
/**
* Time interval in milliseconds.
*/
intervalMs?: number;
/**
* SLO sub-query properties.
*/
sloQuery?: SLOQuery;
/**
* GCM query type.
* queryType: #QueryType
* Time Series List sub-query properties.
*/
timeSeriesList?: (TimeSeriesList | AnnotationQuery);
/**
* Time Series sub-query properties.
*/
timeSeriesQuery?: TimeSeriesQuery;
}
/**
* Defines the supported queryTypes.
*/
export enum QueryType {
ANNOTATION = 'annotation',
SLO = 'slo',
TIME_SERIES_LIST = 'timeSeriesList',
TIME_SERIES_QUERY = 'timeSeriesQuery',
}
/**
* Time Series List sub-query properties.
*/
export interface TimeSeriesList {
/**
* Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
*/
alignmentPeriod?: string;
/**
* Reducer applied across a set of time-series values. Defaults to REDUCE_NONE.
*/
crossSeriesReducer: string;
/**
* Array of filters to query data by. Labels that can be filtered on are defined by the metric.
*/
filters?: Array<string>;
/**
* Array of labels to group data by.
*/
groupBys?: Array<string>;
/**
* Alignment function to be used. Defaults to ALIGN_MEAN.
*/
perSeriesAligner?: string;
/**
* Preprocessor is not part of the API, but is used to store the preprocessor and not affect the UI for the rest of parameters
*/
preprocessor?: PreprocessorType;
/**
* GCP project to execute the query against.
*/
projectName: string;
/**
* Only present if a preprocessor is selected. Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
*/
secondaryAlignmentPeriod?: string;
/**
* Only present if a preprocessor is selected. Reducer applied across a set of time-series values. Defaults to REDUCE_NONE.
*/
secondaryCrossSeriesReducer?: string;
/**
* Only present if a preprocessor is selected. Array of labels to group data by.
*/
secondaryGroupBys?: Array<string>;
/**
* Only present if a preprocessor is selected. Alignment function to be used. Defaults to ALIGN_MEAN.
*/
secondaryPerSeriesAligner?: string;
/**
* Data view, defaults to FULL.
*/
view?: string;
}
export const defaultTimeSeriesList: Partial<TimeSeriesList> = {
filters: [],
groupBys: [],
secondaryGroupBys: [],
};
/**
* Types of pre-processor available. Defined by the metric.
*/
export enum PreprocessorType {
Delta = 'delta',
None = 'none',
Rate = 'rate',
}
/**
* Annotation sub-query properties.
*/
export interface AnnotationQuery extends TimeSeriesList {
/**
* Annotation text.
*/
text?: string;
/**
* Annotation title.
*/
title?: string;
}
/**
* Time Series sub-query properties.
*/
export interface TimeSeriesQuery {
/**
* To disable the graphPeriod, it should explictly be set to 'disabled'.
*/
graphPeriod?: ('disabled' | string);
/**
* GCP project to execute the query against.
*/
projectName: string;
/**
* MQL query to be executed.
*/
query: string;
}
/**
* SLO sub-query properties.
*/
export interface SLOQuery {
/**
* Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
*/
alignmentPeriod?: string;
/**
* SLO goal value.
*/
goal?: number;
/**
* Specific lookback period for the SLO.
*/
lookbackPeriod?: string;
/**
* Alignment function to be used. Defaults to ALIGN_MEAN.
*/
perSeriesAligner?: string;
/**
* GCP project to execute the query against.
*/
projectName: string;
/**
* SLO selector.
*/
selectorName: string;
/**
* ID for the service the SLO is in.
*/
serviceId: string;
/**
* Name for the service the SLO is in.
*/
serviceName: string;
/**
* ID for the SLO.
*/
sloId: string;
/**
* Name of the SLO.
*/
sloName: string;
}
/**
* @deprecated This type is for migration purposes only. Replaced by TimeSeriesList Metric sub-query properties.
*/
export interface MetricQuery {
/**
* Aliases can be set to modify the legend labels. e.g. {{metric.label.xxx}}. See docs for more detail.
*/
aliasBy?: string;
/**
* Alignment period to use when regularizing data. Defaults to cloud-monitoring-auto.
*/
alignmentPeriod?: string;
/**
* Reducer applied across a set of time-series values. Defaults to REDUCE_NONE.
*/
crossSeriesReducer: string;
editorMode: string;
/**
* Array of filters to query data by. Labels that can be filtered on are defined by the metric.
*/
filters?: Array<string>;
/**
* To disable the graphPeriod, it should explictly be set to 'disabled'.
*/
graphPeriod?: ('disabled' | string);
/**
* Array of labels to group data by.
*/
groupBys?: Array<string>;
metricKind?: MetricKind;
metricType: string;
/**
* Alignment function to be used. Defaults to ALIGN_MEAN.
*/
perSeriesAligner?: string;
/**
* Preprocessor is not part of the API, but is used to store the preprocessor and not affect the UI for the rest of parameters
*/
preprocessor?: PreprocessorType;
/**
* GCP project to execute the query against.
*/
projectName: string;
/**
* MQL query to be executed.
*/
query: string;
valueType?: string;
view?: string;
}
export const defaultMetricQuery: Partial<MetricQuery> = {
filters: [],
groupBys: [],
};
export enum MetricKind {
CUMULATIVE = 'CUMULATIVE',
DELTA = 'DELTA',
GAUGE = 'GAUGE',
METRIC_KIND_UNSPECIFIED = 'METRIC_KIND_UNSPECIFIED',
}
export enum ValueTypes {
BOOL = 'BOOL',
DISTRIBUTION = 'DISTRIBUTION',
DOUBLE = 'DOUBLE',
INT64 = 'INT64',
MONEY = 'MONEY',
STRING = 'STRING',
VALUE_TYPE_UNSPECIFIED = 'VALUE_TYPE_UNSPECIFIED',
}
export enum AlignmentTypes {
ALIGN_COUNT = 'ALIGN_COUNT',
ALIGN_COUNT_FALSE = 'ALIGN_COUNT_FALSE',
ALIGN_COUNT_TRUE = 'ALIGN_COUNT_TRUE',
ALIGN_DELTA = 'ALIGN_DELTA',
ALIGN_FRACTION_TRUE = 'ALIGN_FRACTION_TRUE',
ALIGN_INTERPOLATE = 'ALIGN_INTERPOLATE',
ALIGN_MAX = 'ALIGN_MAX',
ALIGN_MEAN = 'ALIGN_MEAN',
ALIGN_MIN = 'ALIGN_MIN',
ALIGN_NEXT_OLDER = 'ALIGN_NEXT_OLDER',
ALIGN_NONE = 'ALIGN_NONE',
ALIGN_PERCENTILE_05 = 'ALIGN_PERCENTILE_05',
ALIGN_PERCENTILE_50 = 'ALIGN_PERCENTILE_50',
ALIGN_PERCENTILE_95 = 'ALIGN_PERCENTILE_95',
ALIGN_PERCENTILE_99 = 'ALIGN_PERCENTILE_99',
ALIGN_PERCENT_CHANGE = 'ALIGN_PERCENT_CHANGE',
ALIGN_RATE = 'ALIGN_RATE',
ALIGN_STDDEV = 'ALIGN_STDDEV',
ALIGN_SUM = 'ALIGN_SUM',
}
/**
* @deprecated Use AnnotationQuery instead. Legacy annotation query properties for migration purposes.
*/
export interface LegacyCloudMonitoringAnnotationQuery {
/**
* Array of filters to query data by. Labels that can be filtered on are defined by the metric.
*/
filters: Array<string>;
metricKind: MetricKind;
metricType: string;
/**
* GCP project to execute the query against.
*/
projectName: string;
/**
* Query refId.
*/
refId: string;
/**
* Annotation text.
*/
text: string;
/**
* Annotation title.
*/
title: string;
valueType: string;
}
export const defaultLegacyCloudMonitoringAnnotationQuery: Partial<LegacyCloudMonitoringAnnotationQuery> = {
filters: [],
};
/**
* Query filter representation.
*/
export interface Filter {
/**
* Filter condition.
*/
condition?: string;
/**
* Filter key.
*/
key: string;
/**
* Filter operator.
*/
operator: string;
/**
* Filter value.
*/
value: string;
}
export enum MetricFindQueryTypes {
Aggregations = 'aggregations',
Aligners = 'aligners',
AlignmentPeriods = 'alignmentPeriods',
DefaultProject = 'defaultProject',
LabelKeys = 'labelKeys',
LabelValues = 'labelValues',
MetricTypes = 'metricTypes',
Projects = 'projects',
ResourceTypes = 'resourceTypes',
SLO = 'slo',
SLOServices = 'sloServices',
Selectors = 'selectors',
Services = 'services',
}
export interface GoogleCloudMonitoring {}

View File

@ -6,7 +6,7 @@ import { TemplateSrv } from 'app/features/templating/template_srv';
import { createMockInstanceSetttings } from './__mocks__/cloudMonitoringInstanceSettings';
import { createMockQuery } from './__mocks__/cloudMonitoringQuery';
import Datasource from './datasource';
import { CloudMonitoringQuery, MetricKind, PreprocessorType, QueryType } from './types';
import { CloudMonitoringQuery, PreprocessorType, QueryType, MetricKind } from './types/query';
describe('Cloud Monitoring Datasource', () => {
describe('interpolateVariablesInQueries', () => {

View File

@ -17,16 +17,8 @@ import { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_sr
import { CloudMonitoringAnnotationSupport } from './annotationSupport';
import { SLO_BURN_RATE_SELECTOR_NAME } from './constants';
import { getMetricType, setMetricType } from './functions';
import {
CloudMonitoringOptions,
CloudMonitoringQuery,
Filter,
MetricDescriptor,
QueryType,
PostResponse,
Aggregation,
MetricQuery,
} from './types';
import { CloudMonitoringQuery, QueryType, MetricQuery, Filter } from './types/query';
import { CloudMonitoringOptions, MetricDescriptor, PostResponse, Aggregation } from './types/types';
import { CloudMonitoringVariableSupport } from './variables';
export default class CloudMonitoringDatasource extends DataSourceWithBackend<
@ -255,7 +247,7 @@ export default class CloudMonitoringDatasource extends DataSourceWithBackend<
};
}
if (has(query, 'metricQuery') && ['metrics', QueryType.ANNOTATION].includes(query.queryType)) {
if (has(query, 'metricQuery') && ['metrics', QueryType.ANNOTATION].includes(query.queryType ?? '')) {
const metricQuery: MetricQuery = get(query, 'metricQuery')!;
if (metricQuery.editorMode === 'mql') {
query.timeSeriesQuery = {
@ -327,7 +319,7 @@ export default class CloudMonitoringDatasource extends DataSourceWithBackend<
return !!query.timeSeriesQuery && !!query.timeSeriesQuery.projectName && !!query.timeSeriesQuery.query;
}
if ([QueryType.TIME_SERIES_LIST, QueryType.ANNOTATION].includes(query.queryType)) {
if (query.queryType && [QueryType.TIME_SERIES_LIST, QueryType.ANNOTATION].includes(query.queryType)) {
return !!query.timeSeriesList && !!query.timeSeriesList.projectName && !!getMetricType(query.timeSeriesList);
}

View File

@ -14,7 +14,8 @@ import {
setMetricType,
} from './functions';
import { newMockDatasource } from './specs/testData';
import { AlignmentTypes, MetricDescriptor, MetricKind, TimeSeriesList, ValueTypes } from './types';
import { AlignmentTypes, TimeSeriesList, MetricKind, ValueTypes } from './types/query';
import { MetricDescriptor } from './types/types';
jest.mock('@grafana/runtime', () => ({
...jest.requireActual('@grafana/runtime'),

View File

@ -5,15 +5,8 @@ import { getTemplateSrv, TemplateSrv } from '@grafana/runtime';
import { AGGREGATIONS, ALIGNMENTS, SYSTEM_LABELS } from './constants';
import CloudMonitoringDatasource from './datasource';
import {
AlignmentTypes,
CustomMetaData,
MetricDescriptor,
MetricKind,
PreprocessorType,
TimeSeriesList,
ValueTypes,
} from './types';
import { AlignmentTypes, PreprocessorType, TimeSeriesList, MetricKind, ValueTypes } from './types/query';
import { CustomMetaData, MetricDescriptor } from './types/types';
export const extractServicesFromMetricDescriptors = (metricDescriptors: MetricDescriptor[]) =>
uniqBy(metricDescriptors, 'service');

View File

@ -10,7 +10,7 @@ import { CloudMonitoringVariableQueryEditor } from './components/VariableQueryEd
import CloudMonitoringDatasource from './datasource';
import pluginJson from './plugin.json';
import { trackCloudMonitoringDashboardLoaded } from './tracking';
import { CloudMonitoringQuery, QueryType } from './types';
import { CloudMonitoringQuery, QueryType } from './types/query';
export const plugin = new DataSourcePlugin<CloudMonitoringDatasource, CloudMonitoringQuery>(CloudMonitoringDatasource)
.setQueryEditorHelp(CloudMonitoringCheatSheet)

View File

@ -9,7 +9,8 @@ import { TemplateSrv } from 'app/features/templating/template_srv';
import { initialCustomVariableModelState } from '../../../../features/variables/custom/reducer';
import { CustomVariableModel } from '../../../../features/variables/types';
import CloudMonitoringDataSource from '../datasource';
import { CloudMonitoringOptions, CloudMonitoringQuery } from '../types';
import { CloudMonitoringQuery } from '../types/query';
import { CloudMonitoringOptions } from '../types/types';
jest.mock('@grafana/runtime', () => ({
...jest.requireActual('@grafana/runtime'),

View File

@ -1,233 +0,0 @@
import { DataQuery, SelectableValue } from '@grafana/data';
import { DataSourceOptions, DataSourceSecureJsonData } from '@grafana/google-sdk';
export enum MetricFindQueryTypes {
Projects = 'projects',
Services = 'services',
DefaultProject = 'defaultProject',
MetricTypes = 'metricTypes',
LabelKeys = 'labelKeys',
LabelValues = 'labelValues',
ResourceTypes = 'resourceTypes',
Aggregations = 'aggregations',
Aligners = 'aligners',
AlignmentPeriods = 'alignmentPeriods',
Selectors = 'selectors',
SLOServices = 'sloServices',
SLO = 'slo',
}
export interface CloudMonitoringVariableQuery extends DataQuery {
selectedQueryType: string;
selectedService: string;
selectedMetricType: string;
selectedSLOService: string;
labelKey: string;
projects: SelectableValue[];
sloServices: SelectableValue[];
projectName: string;
}
export interface VariableQueryData {
selectedQueryType: string;
metricDescriptors: MetricDescriptor[];
selectedService: string;
selectedMetricType: string;
selectedSLOService: string;
labels: string[];
labelKey: string;
metricTypes: Array<{ value: string; name: string }>;
services: SelectableValue[];
projects: SelectableValue[];
sloServices: SelectableValue[];
projectName: string;
loading: boolean;
}
export interface Aggregation {
crossSeriesReducer?: string;
groupBys?: string[];
}
export enum QueryType {
TIME_SERIES_LIST = 'timeSeriesList',
TIME_SERIES_QUERY = 'timeSeriesQuery',
SLO = 'slo',
ANNOTATION = 'annotation',
}
export enum PreprocessorType {
None = 'none',
Rate = 'rate',
Delta = 'delta',
}
export enum MetricKind {
METRIC_KIND_UNSPECIFIED = 'METRIC_KIND_UNSPECIFIED',
GAUGE = 'GAUGE',
DELTA = 'DELTA',
CUMULATIVE = 'CUMULATIVE',
}
export enum ValueTypes {
VALUE_TYPE_UNSPECIFIED = 'VALUE_TYPE_UNSPECIFIED',
BOOL = 'BOOL',
INT64 = 'INT64',
DOUBLE = 'DOUBLE',
STRING = 'STRING',
DISTRIBUTION = 'DISTRIBUTION',
MONEY = 'MONEY',
}
export enum AlignmentTypes {
ALIGN_DELTA = 'ALIGN_DELTA',
ALIGN_RATE = 'ALIGN_RATE',
ALIGN_INTERPOLATE = 'ALIGN_INTERPOLATE',
ALIGN_NEXT_OLDER = 'ALIGN_NEXT_OLDER',
ALIGN_MIN = 'ALIGN_MIN',
ALIGN_MAX = 'ALIGN_MAX',
ALIGN_MEAN = 'ALIGN_MEAN',
ALIGN_COUNT = 'ALIGN_COUNT',
ALIGN_SUM = 'ALIGN_SUM',
ALIGN_STDDEV = 'ALIGN_STDDEV',
ALIGN_COUNT_TRUE = 'ALIGN_COUNT_TRUE',
ALIGN_COUNT_FALSE = 'ALIGN_COUNT_FALSE',
ALIGN_FRACTION_TRUE = 'ALIGN_FRACTION_TRUE',
ALIGN_PERCENTILE_99 = 'ALIGN_PERCENTILE_99',
ALIGN_PERCENTILE_95 = 'ALIGN_PERCENTILE_95',
ALIGN_PERCENTILE_50 = 'ALIGN_PERCENTILE_50',
ALIGN_PERCENTILE_05 = 'ALIGN_PERCENTILE_05',
ALIGN_PERCENT_CHANGE = 'ALIGN_PERCENT_CHANGE',
ALIGN_NONE = 'ALIGN_NONE',
}
// deprecated: use TimeSeriesList instead
// left here for migration purposes
export interface MetricQuery {
projectName: string;
perSeriesAligner?: string;
alignmentPeriod?: string;
aliasBy?: string;
editorMode: string;
metricType: string;
crossSeriesReducer: string;
groupBys?: string[];
filters?: string[];
metricKind?: MetricKind;
valueType?: string;
view?: string;
query: string;
preprocessor?: PreprocessorType;
// To disable the graphPeriod, it should explictly be set to 'disabled'
graphPeriod?: 'disabled' | string;
}
export interface TimeSeriesList {
projectName: string;
crossSeriesReducer: string;
alignmentPeriod?: string;
perSeriesAligner?: string;
groupBys?: string[];
filters?: string[];
view?: string;
secondaryCrossSeriesReducer?: string;
secondaryAlignmentPeriod?: string;
secondaryPerSeriesAligner?: string;
secondaryGroupBys?: string[];
// preprocessor is not part of the API, but is used to store the preprocessor
// and not affect the UI for the rest of parameters
preprocessor?: PreprocessorType;
}
export interface TimeSeriesQuery {
projectName: string;
query: string;
// To disable the graphPeriod, it should explictly be set to 'disabled'
graphPeriod?: 'disabled' | string;
}
export interface AnnotationQuery extends TimeSeriesList {
title?: string;
text?: string;
}
export interface SLOQuery {
projectName: string;
perSeriesAligner?: string;
alignmentPeriod?: string;
selectorName: string;
serviceId: string;
serviceName: string;
sloId: string;
sloName: string;
goal?: number;
lookbackPeriod?: string;
}
export interface CloudMonitoringQuery extends DataQuery {
aliasBy?: string;
datasourceId?: number; // Should not be necessary anymore
queryType: QueryType;
timeSeriesList?: TimeSeriesList | AnnotationQuery;
timeSeriesQuery?: TimeSeriesQuery;
sloQuery?: SLOQuery;
intervalMs: number;
}
export interface CloudMonitoringOptions extends DataSourceOptions {
gceDefaultProject?: string;
}
export interface CloudMonitoringSecureJsonData extends DataSourceSecureJsonData {}
export interface LegacyCloudMonitoringAnnotationQuery {
projectName: string;
metricType: string;
refId: string;
filters: string[];
metricKind: MetricKind;
valueType: string;
title: string;
text: string;
}
export interface QueryMeta {
alignmentPeriod: string;
rawQuery: string;
rawQueryString: string;
metricLabels: { [key: string]: string[] };
resourceLabels: { [key: string]: string[] };
resourceTypes: string[];
}
export interface MetricDescriptor {
valueType: string;
metricKind: MetricKind;
type: string;
unit: string;
service: string;
serviceShortName: string;
displayName: string;
description: string;
}
export interface Segment {
type: string;
value: string;
}
export interface Filter {
key: string;
operator: string;
value: string;
condition?: string;
}
export interface CustomMetaData {
perSeriesAligner?: string;
alignmentPeriod?: string;
}
export interface PostResponse {
results: Record<string, any>;
}

View File

@ -0,0 +1,26 @@
import { CloudMonitoringQuery as CloudMonitoringQueryBase, QueryType } from '../dataquery.gen';
export { QueryType };
export {
TimeSeriesList,
PreprocessorType,
AnnotationQuery,
TimeSeriesQuery,
SLOQuery,
MetricQuery,
MetricKind,
LegacyCloudMonitoringAnnotationQuery,
Filter,
AlignmentTypes,
ValueTypes,
MetricFindQueryTypes,
} from '../dataquery.gen';
/**
* Represents the query as it moves through the frontend query editor and datasource files.
* It can represent new queries that are still being edited, so all properties are optional
*/
// TODO: This is a workaround until the type extensions issue is resolved in CUE
export interface CloudMonitoringQuery extends CloudMonitoringQueryBase {
queryType?: QueryType;
}

View File

@ -0,0 +1,62 @@
import { DataQuery, SelectableValue } from '@grafana/data';
import { DataSourceOptions, DataSourceSecureJsonData } from '@grafana/google-sdk';
import { MetricKind } from './query';
export interface CloudMonitoringVariableQuery extends DataQuery {
selectedQueryType: string;
selectedService: string;
selectedMetricType: string;
selectedSLOService: string;
labelKey: string;
projects: SelectableValue[];
sloServices: SelectableValue[];
projectName: string;
}
export interface VariableQueryData {
selectedQueryType: string;
metricDescriptors: MetricDescriptor[];
selectedService: string;
selectedMetricType: string;
selectedSLOService: string;
labels: string[];
labelKey: string;
metricTypes: Array<{ value: string; name: string }>;
services: SelectableValue[];
projects: SelectableValue[];
sloServices: SelectableValue[];
projectName: string;
loading: boolean;
}
export interface Aggregation {
crossSeriesReducer?: string;
groupBys?: string[];
}
export interface CloudMonitoringOptions extends DataSourceOptions {
gceDefaultProject?: string;
}
export interface CloudMonitoringSecureJsonData extends DataSourceSecureJsonData {}
export interface MetricDescriptor {
valueType: string;
metricKind: MetricKind;
type: string;
unit: string;
service: string;
serviceShortName: string;
displayName: string;
description: string;
}
export interface CustomMetaData {
perSeriesAligner?: string;
alignmentPeriod?: string;
}
export interface PostResponse {
results: Record<string, any>;
}

View File

@ -6,7 +6,7 @@ import { CustomVariableSupport, DataQueryRequest, DataQueryResponse } from '@gra
import CloudMonitoringMetricFindQuery from './CloudMonitoringMetricFindQuery';
import { CloudMonitoringVariableQueryEditor } from './components/VariableQueryEditor';
import CloudMonitoringDatasource from './datasource';
import { CloudMonitoringVariableQuery } from './types';
import { CloudMonitoringVariableQuery } from './types/types';
export class CloudMonitoringVariableSupport extends CustomVariableSupport<
CloudMonitoringDatasource,