From 2d2e665589a7ff7c32c2aac6041514d273376ed6 Mon Sep 17 00:00:00 2001 From: Iris Scholten Date: Fri, 25 May 2018 13:45:20 -0700 Subject: [PATCH 1/6] Add and ensure upper time bound in querytext when query is not parseable into a query config --- ui/src/utils/buildQueriesForLayouts.ts | 46 ++++++++++++++++++++------ 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/ui/src/utils/buildQueriesForLayouts.ts b/ui/src/utils/buildQueriesForLayouts.ts index cb13fc8b9..fcc1a0607 100644 --- a/ui/src/utils/buildQueriesForLayouts.ts +++ b/ui/src/utils/buildQueriesForLayouts.ts @@ -1,3 +1,5 @@ +import _ from 'lodash' + import {buildQuery} from 'src/utils/influxql' import {TYPE_SHIFTED, TYPE_QUERY_CONFIG} from 'src/dashboards/constants' import { @@ -5,19 +7,21 @@ import { TEMP_VAR_UPPER_DASHBOARD_TIME, } from 'src/shared/constants' import {timeRanges} from 'src/shared/data/timeRanges' -import {Source, LayoutQuery, TimeRange} from 'src/types' + +import {Cell, CellQuery, LayoutQuery, Source, TimeRange} from 'src/types' const buildCannedDashboardQuery = ( - query: LayoutQuery, + query: LayoutQuery | CellQuery, {lower, upper}: TimeRange, host: string ): string => { const {defaultGroupBy} = timeRanges.find(range => range.lower === lower) || { defaultGroupBy: '5m', } - const {wheres, groupbys} = query let text = query.query + const wheres = _.get(query, 'wheres') + const groupbys = _.get(query, 'gropubys') if (upper) { text += ` where time > '${lower}' AND time < '${upper}'` @@ -48,30 +52,52 @@ const buildCannedDashboardQuery = ( return text } +const addTimeBoundsToRawText = (rawText: string): string => { + if (!rawText) { + return + } + + const dashboardTimeText: string = `time > ${TEMP_VAR_DASHBOARD_TIME}` + if (rawText.indexOf(dashboardTimeText) !== -1) { + if ( + rawText.indexOf(TEMP_VAR_UPPER_DASHBOARD_TIME) === -1 && + rawText.indexOf('time <') === -1 + ) { + const upperDashboardTimeText = `time < ${TEMP_VAR_UPPER_DASHBOARD_TIME}` + const fullTimeText = `${dashboardTimeText} AND ${upperDashboardTimeText}` + const boundedQueryText = rawText.replace(dashboardTimeText, fullTimeText) + return boundedQueryText + } + } + return rawText +} + export const buildQueriesForLayouts = ( - cell, + cell: Cell, source: Source, timeRange: TimeRange, host: string -) => { +): CellQuery[] => { return cell.queries.map(query => { - let queryText + let queryText: string // Canned dashboards use an different a schema different from queryConfig. if (query.queryConfig) { const { queryConfig: {database, measurement, fields, shifts, rawText, range}, } = query - const tR = range || { + const tR: TimeRange = range || { upper: TEMP_VAR_UPPER_DASHBOARD_TIME, lower: TEMP_VAR_DASHBOARD_TIME, } queryText = - rawText || buildQuery(TYPE_QUERY_CONFIG, tR, query.queryConfig) - const isParsable = database && measurement && fields.length + addTimeBoundsToRawText(rawText) || + buildQuery(TYPE_QUERY_CONFIG, tR, query.queryConfig) + const isParsable: boolean = + !_.isEmpty(database) && !_.isEmpty(measurement) && fields.length > 0 if (shifts && shifts.length && isParsable) { - const shiftedQueries = shifts + const shiftedQueries: string[] = shifts .filter(s => s.unit) .map(s => buildQuery(TYPE_SHIFTED, timeRange, query.queryConfig, s)) From 8a73a53669e0dc90502bd92347b2af1baa5fb993 Mon Sep 17 00:00:00 2001 From: Iris Scholten Date: Fri, 25 May 2018 14:33:39 -0700 Subject: [PATCH 2/6] Convert ui/src/shared/data/timeRanges to typescript --- ui/src/shared/data/{timeRanges.js => timeRanges.ts} | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) rename ui/src/shared/data/{timeRanges.js => timeRanges.ts} (87%) diff --git a/ui/src/shared/data/timeRanges.js b/ui/src/shared/data/timeRanges.ts similarity index 87% rename from ui/src/shared/data/timeRanges.js rename to ui/src/shared/data/timeRanges.ts index 1631bcd93..027ec1349 100644 --- a/ui/src/shared/data/timeRanges.js +++ b/ui/src/shared/data/timeRanges.ts @@ -1,4 +1,13 @@ -export const timeRanges = [ +interface TimeRange { + defaultGroupBy: string + seconds: number + inputValue: string + lower: string + upper: string | null + menuOption: string +} + +export const timeRanges: TimeRange[] = [ { defaultGroupBy: '10s', seconds: 300, From 3b8e60872230e9f649ba8f918c44645df68265df Mon Sep 17 00:00:00 2001 From: Iris Scholten Date: Fri, 25 May 2018 15:05:09 -0700 Subject: [PATCH 3/6] Update Changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62948dea5..9205d9fec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,17 @@ ## v1.5.1.0 [unreleased] ### Features + 1. [#3522](https://github.com/influxdata/chronograf/pull/3522): Add support for Template Variables in Cell Titles ### UI Improvements 1. [#3474](https://github.com/influxdata/chronograf/pull/3474): Sort task table on Manage Alert page alphabetically + ### Bug Fixes +1. [#3527](https://github.com/influxdata/chronograf/pull/3527): Ensure cell queries use constraints from TimeSelector + ## v1.5.0.0 [2018-05-15-RC] ### Features From 5eb8904d0021aba140cc57040eee43e2cec398ec Mon Sep 17 00:00:00 2001 From: Iris Scholten Date: Tue, 29 May 2018 13:16:35 -0700 Subject: [PATCH 4/6] Update type in timeRanges.ts to extend TimeRange type from src/types/query --- ui/src/shared/data/timeRanges.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ui/src/shared/data/timeRanges.ts b/ui/src/shared/data/timeRanges.ts index 027ec1349..f31c1899a 100644 --- a/ui/src/shared/data/timeRanges.ts +++ b/ui/src/shared/data/timeRanges.ts @@ -1,13 +1,12 @@ -interface TimeRange { +import {TimeRange} from 'src/types/query' +interface TimeRangeOption extends TimeRange { defaultGroupBy: string seconds: number inputValue: string - lower: string - upper: string | null menuOption: string } -export const timeRanges: TimeRange[] = [ +export const timeRanges: TimeRangeOption[] = [ { defaultGroupBy: '10s', seconds: 300, From c84389556e2939ffbacf36a1ba27d71fd142a4bb Mon Sep 17 00:00:00 2001 From: Iris Scholten Date: Tue, 29 May 2018 13:17:42 -0700 Subject: [PATCH 5/6] Fix typo in buildCannedDashboardQuery --- ui/src/utils/buildQueriesForLayouts.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/utils/buildQueriesForLayouts.ts b/ui/src/utils/buildQueriesForLayouts.ts index fcc1a0607..d8389f45b 100644 --- a/ui/src/utils/buildQueriesForLayouts.ts +++ b/ui/src/utils/buildQueriesForLayouts.ts @@ -21,7 +21,7 @@ const buildCannedDashboardQuery = ( let text = query.query const wheres = _.get(query, 'wheres') - const groupbys = _.get(query, 'gropubys') + const groupbys = _.get(query, 'groupbys') if (upper) { text += ` where time > '${lower}' AND time < '${upper}'` From 896f049524d31bba2a53ca2fc9b54c21748ba053 Mon Sep 17 00:00:00 2001 From: Iris Scholten Date: Tue, 29 May 2018 13:55:16 -0700 Subject: [PATCH 6/6] Update addTimeBoundsToRawText to use regex in its string matching checks instead of strings --- ui/src/utils/buildQueriesForLayouts.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/ui/src/utils/buildQueriesForLayouts.ts b/ui/src/utils/buildQueriesForLayouts.ts index d8389f45b..24f84c584 100644 --- a/ui/src/utils/buildQueriesForLayouts.ts +++ b/ui/src/utils/buildQueriesForLayouts.ts @@ -57,15 +57,25 @@ const addTimeBoundsToRawText = (rawText: string): string => { return } + const dashboardTimeRegex = new RegExp( + `time( )?>( )?${TEMP_VAR_DASHBOARD_TIME}`, + 'g' + ) const dashboardTimeText: string = `time > ${TEMP_VAR_DASHBOARD_TIME}` - if (rawText.indexOf(dashboardTimeText) !== -1) { + const isUsingTimeSelectorBounds: boolean = !_.isEmpty( + rawText.match(dashboardTimeRegex) + ) + + if (isUsingTimeSelectorBounds) { + const upperTimeBoundRegex = new RegExp('time( )?<', 'g') + const hasUpperTimeBound = !_.isEmpty(rawText.match(upperTimeBoundRegex)) if ( rawText.indexOf(TEMP_VAR_UPPER_DASHBOARD_TIME) === -1 && - rawText.indexOf('time <') === -1 + !hasUpperTimeBound ) { const upperDashboardTimeText = `time < ${TEMP_VAR_UPPER_DASHBOARD_TIME}` const fullTimeText = `${dashboardTimeText} AND ${upperDashboardTimeText}` - const boundedQueryText = rawText.replace(dashboardTimeText, fullTimeText) + const boundedQueryText = rawText.replace(dashboardTimeRegex, fullTimeText) return boundedQueryText } }