From 96453c6e69caa37488cc44c844a754eaff56eea2 Mon Sep 17 00:00:00 2001 From: Kevin Yu Date: Mon, 3 Apr 2023 06:31:14 -0700 Subject: [PATCH] CloudWatch: Fix cachedQueries insights not being updated for metric queries (#65495) --- .../CloudWatchLogsLanguageProvider.ts | 5 +++-- .../CloudWatchAnnotationQueryRunner.ts | 2 +- .../query-runner/CloudWatchLogsQueryRunner.ts | 2 +- .../query-runner/CloudWatchMetricsQueryRunner.ts | 4 ++-- .../cloudwatch/query-runner/CloudWatchRequest.ts | 16 +++++++++------- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/public/app/plugins/datasource/cloudwatch/language/cloudwatch-logs/CloudWatchLogsLanguageProvider.ts b/public/app/plugins/datasource/cloudwatch/language/cloudwatch-logs/CloudWatchLogsLanguageProvider.ts index 376aa817e5b..f2dfa350b8e 100644 --- a/public/app/plugins/datasource/cloudwatch/language/cloudwatch-logs/CloudWatchLogsLanguageProvider.ts +++ b/public/app/plugins/datasource/cloudwatch/language/cloudwatch-logs/CloudWatchLogsLanguageProvider.ts @@ -2,11 +2,12 @@ import Prism, { Grammar } from 'prismjs'; import { lastValueFrom } from 'rxjs'; import { AbsoluteTimeRange, HistoryItem, LanguageProvider } from '@grafana/data'; +import { BackendDataSourceResponse, FetchResponse } from '@grafana/runtime'; import { CompletionItemGroup, SearchFunctionType, Token, TypeaheadInput, TypeaheadOutput } from '@grafana/ui'; import { getTemplateSrv } from 'app/features/templating/template_srv'; import { CloudWatchDatasource } from '../../datasource'; -import { CloudWatchQuery, LogGroup, TSDBResponse } from '../../types'; +import { CloudWatchQuery, LogGroup } from '../../types'; import { interpolateStringArrayUsingSingleOrMultiValuedVariable } from '../../utils/templateVariableUtils'; import syntax, { @@ -49,7 +50,7 @@ export class CloudWatchLogsLanguageProvider extends LanguageProvider { return syntax; } - request = (url: string, params?: any): Promise => { + request = (url: string, params?: any): Promise> => { return lastValueFrom(this.datasource.logsQueryRunner.awsRequest(url, params)); }; diff --git a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchAnnotationQueryRunner.ts b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchAnnotationQueryRunner.ts index 52132782075..a055a3a1740 100644 --- a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchAnnotationQueryRunner.ts +++ b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchAnnotationQueryRunner.ts @@ -36,7 +36,7 @@ export class CloudWatchAnnotationQueryRunner extends CloudWatchRequest { })), }).pipe( map((r) => { - const frames = toDataQueryResponse({ data: r }).data; + const frames = toDataQueryResponse(r).data; return { data: frames }; }) ); diff --git a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchLogsQueryRunner.ts b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchLogsQueryRunner.ts index 81d90f26900..439b925341d 100644 --- a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchLogsQueryRunner.ts +++ b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchLogsQueryRunner.ts @@ -301,7 +301,7 @@ export class CloudWatchLogsQueryRunner extends CloudWatchRequest { return this.awsRequest(this.dsQueryEndpoint, requestParams, { 'X-Cache-Skip': 'true', }).pipe( - map((response) => resultsToDataFrames({ data: response })), + map((response) => resultsToDataFrames(response)), catchError((err: FetchError) => { if (config.featureToggles.datasourceQueryMultiStatus && err.status === 207) { throw err; diff --git a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.ts b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.ts index 5efe8dcfd81..8b7f4ca7d5a 100644 --- a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.ts +++ b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.ts @@ -117,12 +117,12 @@ export class CloudWatchMetricsQueryRunner extends CloudWatchRequest { performTimeSeriesQuery(request: MetricRequest, { from, to }: TimeRange): Observable { return this.awsRequest(this.dsQueryEndpoint, request).pipe( map((res) => { - const dataframes: DataFrame[] = toDataQueryResponse({ data: res }).data; + const dataframes: DataFrame[] = toDataQueryResponse(res).data; if (!dataframes || dataframes.length <= 0) { return { data: [] }; } - const lastError = findLast(res.results, (v) => !!v.error); + const lastError = findLast(res.data.results, (v) => !!v.error); dataframes.forEach((frame) => { frame.fields.forEach((field) => { diff --git a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchRequest.ts b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchRequest.ts index 9b344b767d2..beaf0424414 100644 --- a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchRequest.ts +++ b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchRequest.ts @@ -1,7 +1,7 @@ -import { Observable, map } from 'rxjs'; +import { Observable } from 'rxjs'; import { DataSourceInstanceSettings, DataSourceRef, getDataSourceRef, ScopedVars } from '@grafana/data'; -import { getBackendSrv } from '@grafana/runtime'; +import { BackendDataSourceResponse, FetchResponse, getBackendSrv } from '@grafana/runtime'; import { notifyApp } from 'app/core/actions'; import { createErrorNotification } from 'app/core/copy/appNotification'; import { TemplateSrv } from 'app/features/templating/template_srv'; @@ -9,7 +9,7 @@ import { store } from 'app/store/store'; import { AppNotificationTimeout } from 'app/types'; import memoizedDebounce from '../memoizedDebounce'; -import { CloudWatchJsonData, Dimensions, MetricRequest, MultiFilters, TSDBResponse } from '../types'; +import { CloudWatchJsonData, Dimensions, MetricRequest, MultiFilters } from '../types'; export abstract class CloudWatchRequest { templateSrv: TemplateSrv; @@ -25,7 +25,11 @@ export abstract class CloudWatchRequest { this.ref = getDataSourceRef(instanceSettings); } - awsRequest(url: string, data: MetricRequest, headers: Record = {}): Observable { + awsRequest( + url: string, + data: MetricRequest, + headers: Record = {} + ): Observable> { const options = { method: 'POST', url, @@ -33,9 +37,7 @@ export abstract class CloudWatchRequest { headers, }; - return getBackendSrv() - .fetch(options) - .pipe(map((result) => result.data)); + return getBackendSrv().fetch(options); } convertDimensionFormat(dimensions: Dimensions, scopedVars: ScopedVars): Dimensions {