mirror of https://github.com/grafana/grafana.git
				
				
				
			Datasource/CloudWatch: Fix CloudWatch logs dataframe transformation (#24327)
* Datasource/CloudWatch: Fix CloudWatch logs dataframe transformation
This commit is contained in:
		
							parent
							
								
									3a2c844a8a
								
							
						
					
					
						commit
						dbac77d239
					
				| 
						 | 
					@ -238,8 +238,8 @@ export class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery, CloudWa
 | 
				
			||||||
  async describeLogGroups(params: DescribeLogGroupsRequest): Promise<string[]> {
 | 
					  async describeLogGroups(params: DescribeLogGroupsRequest): Promise<string[]> {
 | 
				
			||||||
    const dataFrames = await this.makeLogActionRequest('DescribeLogGroups', [params]).toPromise();
 | 
					    const dataFrames = await this.makeLogActionRequest('DescribeLogGroups', [params]).toPromise();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const logGroupNames = dataFrames[0].fields[0].values.toArray();
 | 
					    const logGroupNames = dataFrames[0]?.fields[0]?.values.toArray() ?? [];
 | 
				
			||||||
    return logGroupNames && logGroupNames.length > 0 ? logGroupNames : [];
 | 
					    return logGroupNames;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async getLogGroupFields(params: GetLogGroupFieldsRequest): Promise<GetLogGroupFieldsResponse> {
 | 
					  async getLogGroupFields(params: GetLogGroupFieldsRequest): Promise<GetLogGroupFieldsResponse> {
 | 
				
			||||||
| 
						 | 
					@ -495,14 +495,10 @@ export class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery, CloudWa
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const resultsToDataFrames = (val: any): DataFrame[] => {
 | 
					    const resultsToDataFrames = (val: any): DataFrame[] => toDataQueryResponse(val).data || [];
 | 
				
			||||||
      // NOTE: this function currently only processes binary results from:
 | 
					 | 
				
			||||||
      // /api/ds/query -- it will retrun empty results most of the time
 | 
					 | 
				
			||||||
      return toDataQueryResponse(val).data || [];
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return from(this.awsRequest(TSDB_QUERY_ENDPOINT, requestParams)).pipe(
 | 
					    return from(this.awsRequest(TSDB_QUERY_ENDPOINT, requestParams)).pipe(
 | 
				
			||||||
      map(response => resultsToDataFrames(response)),
 | 
					      map(response => resultsToDataFrames({ data: response })),
 | 
				
			||||||
      catchError(err => {
 | 
					      catchError(err => {
 | 
				
			||||||
        if (err.data?.error) {
 | 
					        if (err.data?.error) {
 | 
				
			||||||
          throw err.data.error;
 | 
					          throw err.data.error;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,6 +46,65 @@ describe('CloudWatchDatasource', () => {
 | 
				
			||||||
    jest.clearAllMocks();
 | 
					    jest.clearAllMocks();
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('When getting log groups', () => {
 | 
				
			||||||
 | 
					    beforeEach(() => {
 | 
				
			||||||
 | 
					      datasourceRequestMock.mockImplementation(() =>
 | 
				
			||||||
 | 
					        Promise.resolve({
 | 
				
			||||||
 | 
					          data: {
 | 
				
			||||||
 | 
					            results: {
 | 
				
			||||||
 | 
					              A: {
 | 
				
			||||||
 | 
					                dataframes: [
 | 
				
			||||||
 | 
					                  'QVJST1cxAAD/////GAEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEDAAoADAAAAAgABAAKAAAACAAAAFgAAAACAAAAKAAAAAQAAAB8////CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAJz///8IAAAAFAAAAAkAAABsb2dHcm91cHMAAAAEAAAAbmFtZQAAAAABAAAAGAAAAAAAEgAYABQAEwASAAwAAAAIAAQAEgAAABQAAABMAAAAUAAAAAAABQFMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAGAAAAAwAAABsb2dHcm91cE5hbWUAAAAABAAAAG5hbWUAAAAAAAAAAAQABAAEAAAADAAAAGxvZ0dyb3VwTmFtZQAAAAD/////mAAAABQAAAAAAAAADAAWABQAEwAMAAQADAAAAGAGAAAAAAAAFAAAAAAAAAMDAAoAGAAMAAgABAAKAAAAFAAAAEgAAAAhAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAAAAAAACIAAAAAAAAANgFAAAAAAAAAAAAAAEAAAAhAAAAAAAAAAAAAAAAAAAAAAAAADIAAABiAAAAkQAAALwAAADuAAAAHwEAAFQBAACHAQAAtQEAAOoBAAAbAgAASgIAAHQCAAClAgAA1QIAABADAABEAwAAdgMAAKMDAADXAwAACQQAAEAEAAB3BAAAlwQAAK0EAAC8BAAA+wQAAEIFAABhBQAAeAUAAJIFAAC0BQAA1gUAAC9hd3MvY29udGFpbmVyaW5zaWdodHMvZGV2MzAzLXdvcmtzaG9wL2FwcGxpY2F0aW9uL2F3cy9jb250YWluZXJpbnNpZ2h0cy9kZXYzMDMtd29ya3Nob3AvZGF0YXBsYW5lL2F3cy9jb250YWluZXJpbnNpZ2h0cy9kZXYzMDMtd29ya3Nob3AvZmxvd2xvZ3MvYXdzL2NvbnRhaW5lcmluc2lnaHRzL2RldjMwMy13b3Jrc2hvcC9ob3N0L2F3cy9jb250YWluZXJpbnNpZ2h0cy9kZXYzMDMtd29ya3Nob3AvcGVyZm9ybWFuY2UvYXdzL2NvbnRhaW5lcmluc2lnaHRzL2RldjMwMy13b3Jrc2hvcC9wcm9tZXRoZXVzL2F3cy9jb250YWluZXJpbnNpZ2h0cy9lY29tbWVyY2Utc29ja3Nob3AvYXBwbGljYXRpb24vYXdzL2NvbnRhaW5lcmluc2lnaHRzL2Vjb21tZXJjZS1zb2Nrc2hvcC9kYXRhcGxhbmUvYXdzL2NvbnRhaW5lcmluc2lnaHRzL2Vjb21tZXJjZS1zb2Nrc2hvcC9ob3N0L2F3cy9jb250YWluZXJpbnNpZ2h0cy9lY29tbWVyY2Utc29ja3Nob3AvcGVyZm9ybWFuY2UvYXdzL2NvbnRhaW5lcmluc2lnaHRzL3dhdGNoZGVtby1wZXJmL2FwcGxpY2F0aW9uL2F3cy9jb250YWluZXJpbnNpZ2h0cy93YXRjaGRlbW8tcGVyZi9kYXRhcGxhbmUvYXdzL2NvbnRhaW5lcmluc2lnaHRzL3dhdGNoZGVtby1wZXJmL2hvc3QvYXdzL2NvbnRhaW5lcmluc2lnaHRzL3dhdGNoZGVtby1wZXJmL3BlcmZvcm1hbmNlL2F3cy9jb250YWluZXJpbnNpZ2h0cy93YXRjaGRlbW8tcGVyZi9wcm9tZXRoZXVzL2F3cy9jb250YWluZXJpbnNpZ2h0cy93YXRjaGRlbW8tcHJvZC11cy1lYXN0LTEvcGVyZm9ybWFuY2UvYXdzL2NvbnRhaW5lcmluc2lnaHRzL3dhdGNoZGVtby1zdGFnaW5nL2FwcGxpY2F0aW9uL2F3cy9jb250YWluZXJpbnNpZ2h0cy93YXRjaGRlbW8tc3RhZ2luZy9kYXRhcGxhbmUvYXdzL2NvbnRhaW5lcmluc2lnaHRzL3dhdGNoZGVtby1zdGFnaW5nL2hvc3QvYXdzL2NvbnRhaW5lcmluc2lnaHRzL3dhdGNoZGVtby1zdGFnaW5nL3BlcmZvcm1hbmNlL2F3cy9lY3MvY29udGFpbmVyaW5zaWdodHMvYnVnYmFzaC1lYzIvcGVyZm9ybWFuY2UvYXdzL2Vjcy9jb250YWluZXJpbnNpZ2h0cy9lY3MtZGVtb3dvcmtzaG9wL3BlcmZvcm1hbmNlL2F3cy9lY3MvY29udGFpbmVyaW5zaWdodHMvZWNzLXdvcmtzaG9wLWRldi9wZXJmb3JtYW5jZS9hd3MvZWtzL2RldjMwMy13b3Jrc2hvcC9jbHVzdGVyL2F3cy9ldmVudHMvY2xvdWR0cmFpbC9hd3MvZXZlbnRzL2Vjcy9hd3MvbGFtYmRhL2N3c3luLW15Y2FuYXJ5LWZhYzk3ZGVkLWYxMzQtNDk5YS05ZDcxLTRjM2JlMWY2MzE4Mi9hd3MvbGFtYmRhL2N3c3luLXdhdGNoLWxpbmtjaGVja3MtZWY3ZWYyNzMtNWRhMi00NjYzLWFmNTQtZDJmNTJkNTViMDYwL2Vjcy9lY3MtY3dhZ2VudC1kYWVtb24tc2VydmljZS9lY3MvZWNzLWRlbW8tbGltaXRUYXNrQ2xvdWRUcmFpbC9EZWZhdWx0TG9nR3JvdXBjb250YWluZXItaW5zaWdodHMtcHJvbWV0aGV1cy1iZXRhY29udGFpbmVyLWluc2lnaHRzLXByb21ldGhldXMtZGVtbwAAEAAAAAwAFAASAAwACAAEAAwAAAAQAAAALAAAADwAAAAAAAMAAQAAACgBAAAAAAAAoAAAAAAAAABgBgAAAAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAWAAAAAIAAAAoAAAABAAAAHz///8IAAAADAAAAAAAAAAAAAAABQAAAHJlZklkAAAAnP///wgAAAAUAAAACQAAAGxvZ0dyb3VwcwAAAAQAAABuYW1lAAAAAAEAAAAYAAAAAAASABgAFAATABIADAAAAAgABAASAAAAFAAAAEwAAABQAAAAAAAFAUwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAYAAAADAAAAGxvZ0dyb3VwTmFtZQAAAAAEAAAAbmFtZQAAAAAAAAAABAAEAAQAAAAMAAAAbG9nR3JvdXBOYW1lAAAAAEgBAABBUlJPVzE=',
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					                refId: 'A',
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it('should return log groups as an array of strings', async () => {
 | 
				
			||||||
 | 
					      const logGroups = await ctx.ds.describeLogGroups();
 | 
				
			||||||
 | 
					      const expectedLogGroups = [
 | 
				
			||||||
 | 
					        '/aws/containerinsights/dev303-workshop/application',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/dev303-workshop/dataplane',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/dev303-workshop/flowlogs',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/dev303-workshop/host',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/dev303-workshop/performance',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/dev303-workshop/prometheus',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/ecommerce-sockshop/application',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/ecommerce-sockshop/dataplane',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/ecommerce-sockshop/host',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/ecommerce-sockshop/performance',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/watchdemo-perf/application',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/watchdemo-perf/dataplane',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/watchdemo-perf/host',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/watchdemo-perf/performance',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/watchdemo-perf/prometheus',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/watchdemo-prod-us-east-1/performance',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/watchdemo-staging/application',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/watchdemo-staging/dataplane',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/watchdemo-staging/host',
 | 
				
			||||||
 | 
					        '/aws/containerinsights/watchdemo-staging/performance',
 | 
				
			||||||
 | 
					        '/aws/ecs/containerinsights/bugbash-ec2/performance',
 | 
				
			||||||
 | 
					        '/aws/ecs/containerinsights/ecs-demoworkshop/performance',
 | 
				
			||||||
 | 
					        '/aws/ecs/containerinsights/ecs-workshop-dev/performance',
 | 
				
			||||||
 | 
					        '/aws/eks/dev303-workshop/cluster',
 | 
				
			||||||
 | 
					        '/aws/events/cloudtrail',
 | 
				
			||||||
 | 
					        '/aws/events/ecs',
 | 
				
			||||||
 | 
					        '/aws/lambda/cwsyn-mycanary-fac97ded-f134-499a-9d71-4c3be1f63182',
 | 
				
			||||||
 | 
					        '/aws/lambda/cwsyn-watch-linkchecks-ef7ef273-5da2-4663-af54-d2f52d55b060',
 | 
				
			||||||
 | 
					        '/ecs/ecs-cwagent-daemon-service',
 | 
				
			||||||
 | 
					        '/ecs/ecs-demo-limitTask',
 | 
				
			||||||
 | 
					        'CloudTrail/DefaultLogGroup',
 | 
				
			||||||
 | 
					        'container-insights-prometheus-beta',
 | 
				
			||||||
 | 
					        'container-insights-prometheus-demo',
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					      expect(logGroups).toEqual(expectedLogGroups);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('When performing CloudWatch metrics query', () => {
 | 
					  describe('When performing CloudWatch metrics query', () => {
 | 
				
			||||||
    const query = {
 | 
					    const query = {
 | 
				
			||||||
      range: defaultTimeRange,
 | 
					      range: defaultTimeRange,
 | 
				
			||||||
| 
						 | 
					@ -741,7 +800,6 @@ describe('CloudWatchDatasource', () => {
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it('should call __GetDimensions and return result', () => {
 | 
					    it('should call __GetDimensions and return result', () => {
 | 
				
			||||||
      console.log({ a: scenario.requestResponse.results });
 | 
					 | 
				
			||||||
      expect(scenario.result[0].text).toBe('InstanceId');
 | 
					      expect(scenario.result[0].text).toBe('InstanceId');
 | 
				
			||||||
      expect(scenario.request.queries[0].type).toBe('metricFindQuery');
 | 
					      expect(scenario.request.queries[0].type).toBe('metricFindQuery');
 | 
				
			||||||
      expect(scenario.request.queries[0].subtype).toBe('dimension_keys');
 | 
					      expect(scenario.request.queries[0].subtype).toBe('dimension_keys');
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue