influxdbPlugin.b76d815b7be79e3aa808.js.map 197 KB

1
  1. {"version":3,"file":"influxdbPlugin.b76d815b7be79e3aa808.js","mappings":"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","sources":["webpack://grafana/./public/app/plugins/datasource/influxdb/types.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/ConfigEditor.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/InfluxCheatSheet.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/InfluxStartPage.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/query_part.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/influx_query_model.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/queryUtils.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/FluxQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/QueryEditorModeSwitcher.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/constants.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/useShadowedState.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/RawInfluxQLEditor.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/query_builder.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/influxQLMetadataQuery.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/styles.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/unwrap.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/FormatAsSection.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/Seg.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/toSelectableValue.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/FromSection.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/InputSection.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/OrderByTimeSection.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/AddButton.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/PartListSection.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/tagUtils.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/TagsSection.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/partListUtils.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/Editor.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VariableQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/influx_series.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/response_parser.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/datasource.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/module.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/QueryEditor.tsx","webpack://grafana/./.yarn/__virtual__/react-use-virtual-00326e70ba/3/opt/drone/yarncache/react-use-npm-17.3.2-a032cbeb01-7379460f51.zip/node_modules/react-use/esm/usePrevious.js"],"sourcesContent":["import { DataQuery, DataSourceJsonData } from '@grafana/data';\n\nexport enum InfluxVersion {\n InfluxQL = 'InfluxQL',\n Flux = 'Flux',\n}\n\nexport interface InfluxOptions extends DataSourceJsonData {\n version?: InfluxVersion;\n\n timeInterval?: string;\n httpMode?: string;\n\n // With Flux\n organization?: string;\n defaultBucket?: string;\n maxSeries?: number;\n}\n\nexport interface InfluxSecureJsonData {\n // For Flux\n token?: string;\n\n // In 1x a different password can be sent than then HTTP auth\n password?: string;\n}\n\nexport interface InfluxQueryPart {\n type: string;\n params?: Array<string | number>;\n // FIXME: `interval` does not seem to be used.\n // check all the influxdb parts (query-generation etc.),\n // if it is really so, and if yes, remove it\n interval?: string;\n}\n\nexport interface InfluxQueryTag {\n key: string;\n operator?: string;\n condition?: string;\n value: string;\n}\n\nexport type ResultFormat = 'time_series' | 'table' | 'logs';\n\nexport interface InfluxQuery extends DataQuery {\n policy?: string;\n measurement?: string;\n resultFormat?: ResultFormat;\n orderByTime?: string;\n tags?: InfluxQueryTag[];\n groupBy?: InfluxQueryPart[];\n select?: InfluxQueryPart[][];\n limit?: string | number;\n slimit?: string | number;\n tz?: string;\n // NOTE: `fill` is not used in the query-editor anymore, and is removed\n // if any change happens in the query-editor. the query-generation still\n // supports it for now.\n fill?: string;\n rawQuery?: boolean;\n query?: string;\n alias?: string;\n}\n","import { uniqueId } from 'lodash';\nimport React, { PureComponent } from 'react';\n\nimport {\n DataSourcePluginOptionsEditorProps,\n SelectableValue,\n onUpdateDatasourceOption,\n updateDatasourcePluginResetOption,\n onUpdateDatasourceJsonDataOption,\n onUpdateDatasourceJsonDataOptionSelect,\n onUpdateDatasourceSecureJsonDataOption,\n updateDatasourcePluginJsonDataOption,\n} from '@grafana/data';\nimport { Alert, DataSourceHttpSettings, InfoBox, InlineField, InlineFormLabel, LegacyForms, Select } from '@grafana/ui';\n\nconst { Input, SecretFormField } = LegacyForms;\nimport { InfluxOptions, InfluxSecureJsonData, InfluxVersion } from '../types';\n\nconst httpModes = [\n { label: 'GET', value: 'GET' },\n { label: 'POST', value: 'POST' },\n] as SelectableValue[];\n\nconst versions = [\n {\n label: 'InfluxQL',\n value: InfluxVersion.InfluxQL,\n description: 'The InfluxDB SQL-like query language.',\n },\n {\n label: 'Flux',\n value: InfluxVersion.Flux,\n description: 'Advanced data scripting and query language. Supported in InfluxDB 2.x and 1.8+',\n },\n] as Array<SelectableValue<InfluxVersion>>;\n\nexport type Props = DataSourcePluginOptionsEditorProps<InfluxOptions>;\ntype State = {\n maxSeries: string | undefined;\n};\n\nexport class ConfigEditor extends PureComponent<Props, State> {\n state = {\n maxSeries: '',\n };\n\n htmlPrefix: string;\n\n constructor(props: Props) {\n super(props);\n this.state.maxSeries = props.options.jsonData.maxSeries?.toString() || '';\n this.htmlPrefix = uniqueId('influxdb-config');\n }\n\n // 1x\n onResetPassword = () => {\n updateDatasourcePluginResetOption(this.props, 'password');\n };\n\n // 2x\n onResetToken = () => {\n updateDatasourcePluginResetOption(this.props, 'token');\n };\n\n onVersionChanged = (selected: SelectableValue<InfluxVersion>) => {\n const { options, onOptionsChange } = this.props;\n\n const copy: any = {\n ...options,\n jsonData: {\n ...options.jsonData,\n version: selected.value,\n },\n };\n if (selected.value === InfluxVersion.Flux) {\n copy.access = 'proxy';\n copy.basicAuth = true;\n copy.jsonData.httpMode = 'POST';\n\n // Remove old 1x configs\n delete copy.user;\n delete copy.database;\n }\n\n onOptionsChange(copy);\n };\n\n renderInflux2x() {\n const { options } = this.props;\n const { secureJsonFields } = options;\n const secureJsonData = (options.secureJsonData || {}) as InfluxSecureJsonData;\n const { htmlPrefix } = this;\n\n return (\n <>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel htmlFor={`${htmlPrefix}-org`} className=\"width-10\">\n Organization\n </InlineFormLabel>\n <div className=\"width-10\">\n <Input\n id={`${htmlPrefix}-org`}\n className=\"width-20\"\n value={options.jsonData.organization || ''}\n onChange={onUpdateDatasourceJsonDataOption(this.props, 'organization')}\n />\n </div>\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <SecretFormField\n isConfigured={(secureJsonFields && secureJsonFields.token) as boolean}\n value={secureJsonData.token || ''}\n label=\"Token\"\n aria-label=\"Token\"\n labelWidth={10}\n inputWidth={20}\n onReset={this.onResetToken}\n onChange={onUpdateDatasourceSecureJsonDataOption(this.props, 'token')}\n />\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel className=\"width-10\">Default Bucket</InlineFormLabel>\n <div className=\"width-10\">\n <Input\n className=\"width-20\"\n placeholder=\"default bucket\"\n value={options.jsonData.defaultBucket || ''}\n onChange={onUpdateDatasourceJsonDataOption(this.props, 'defaultBucket')}\n />\n </div>\n </div>\n </div>\n\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel\n className=\"width-10\"\n tooltip=\"A lower limit for the auto group by time interval. Recommended to be set to write frequency,\n\t\t\t\tfor example 1m if your data is written every minute.\"\n >\n Min time interval\n </InlineFormLabel>\n <div className=\"width-10\">\n <Input\n className=\"width-10\"\n placeholder=\"10s\"\n value={options.jsonData.timeInterval || ''}\n onChange={onUpdateDatasourceJsonDataOption(this.props, 'timeInterval')}\n />\n </div>\n </div>\n </div>\n </>\n );\n }\n\n renderInflux1x() {\n const { options } = this.props;\n const { secureJsonFields } = options;\n const secureJsonData = (options.secureJsonData || {}) as InfluxSecureJsonData;\n const { htmlPrefix } = this;\n\n return (\n <>\n <InfoBox>\n <h5>Database Access</h5>\n <p>\n Setting the database for this datasource does not deny access to other databases. The InfluxDB query syntax\n allows switching the database in the query. For example:\n <code>SHOW MEASUREMENTS ON _internal</code> or\n <code>SELECT * FROM &quot;_internal&quot;..&quot;database&quot; LIMIT 10</code>\n <br />\n <br />\n To support data isolation and security, make sure appropriate permissions are configured in InfluxDB.\n </p>\n </InfoBox>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel htmlFor={`${htmlPrefix}-db`} className=\"width-10\">\n Database\n </InlineFormLabel>\n <div className=\"width-20\">\n <Input\n id={`${htmlPrefix}-db`}\n className=\"width-20\"\n value={options.database || ''}\n onChange={onUpdateDatasourceOption(this.props, 'database')}\n />\n </div>\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel htmlFor={`${htmlPrefix}-user`} className=\"width-10\">\n User\n </InlineFormLabel>\n <div className=\"width-10\">\n <Input\n id={`${htmlPrefix}-user`}\n className=\"width-20\"\n value={options.user || ''}\n onChange={onUpdateDatasourceOption(this.props, 'user')}\n />\n </div>\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <SecretFormField\n isConfigured={(secureJsonFields && secureJsonFields.password) as boolean}\n value={secureJsonData.password || ''}\n label=\"Password\"\n aria-label=\"Password\"\n labelWidth={10}\n inputWidth={20}\n onReset={this.onResetPassword}\n onChange={onUpdateDatasourceSecureJsonDataOption(this.props, 'password')}\n />\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel\n htmlFor={`${htmlPrefix}-http-method`}\n className=\"width-10\"\n tooltip=\"You can use either GET or POST HTTP method to query your InfluxDB database. The POST\n method allows you to perform heavy requests (with a lots of WHERE clause) while the GET method\n will restrict you and return an error if the query is too large.\"\n >\n HTTP Method\n </InlineFormLabel>\n <Select\n inputId={`${htmlPrefix}-http-method`}\n className=\"width-10\"\n value={httpModes.find((httpMode) => httpMode.value === options.jsonData.httpMode)}\n options={httpModes}\n defaultValue={options.jsonData.httpMode}\n onChange={onUpdateDatasourceJsonDataOptionSelect(this.props, 'httpMode')}\n />\n </div>\n </div>\n\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel\n className=\"width-10\"\n tooltip=\"A lower limit for the auto group by time interval. Recommended to be set to write frequency,\n\t\t\t\tfor example 1m if your data is written every minute.\"\n >\n Min time interval\n </InlineFormLabel>\n <div className=\"width-10\">\n <Input\n className=\"width-10\"\n placeholder=\"10s\"\n value={options.jsonData.timeInterval || ''}\n onChange={onUpdateDatasourceJsonDataOption(this.props, 'timeInterval')}\n />\n </div>\n </div>\n </div>\n </>\n );\n }\n\n render() {\n const { options, onOptionsChange } = this.props;\n\n return (\n <>\n <h3 className=\"page-heading\">Query Language</h3>\n <div className=\"gf-form-group\">\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <Select\n aria-label=\"Query language\"\n className=\"width-30\"\n value={options.jsonData.version === InfluxVersion.Flux ? versions[1] : versions[0]}\n options={versions}\n defaultValue={versions[0]}\n onChange={this.onVersionChanged}\n />\n </div>\n </div>\n </div>\n\n {options.jsonData.version === InfluxVersion.Flux && (\n <InfoBox>\n <h5>Support for Flux in Grafana is currently in beta</h5>\n <p>\n Please report any issues to: <br />\n <a href=\"https://github.com/grafana/grafana/issues/new/choose\">\n https://github.com/grafana/grafana/issues\n </a>\n </p>\n </InfoBox>\n )}\n\n {options.access === 'direct' && (\n <Alert title=\"Deprecation Notice\" severity=\"warning\">\n Browser access mode in the InfluxDB datasource is deprecated and will be removed in a future release.\n </Alert>\n )}\n\n <DataSourceHttpSettings\n showAccessOptions={true}\n dataSourceConfig={options}\n defaultUrl=\"http://localhost:8086\"\n onChange={onOptionsChange}\n />\n\n <div className=\"gf-form-group\">\n <div>\n <h3 className=\"page-heading\">InfluxDB Details</h3>\n </div>\n {options.jsonData.version === InfluxVersion.Flux ? this.renderInflux2x() : this.renderInflux1x()}\n <div className=\"gf-form-inline\">\n <InlineField\n labelWidth={20}\n label=\"Max series\"\n tooltip=\"Limit the number of series/tables that Grafana will process. Lower this number to prevent abuse, and increase it if you have lots of small time series and not all are shown. Defaults to 1000.\"\n >\n <Input\n placeholder=\"1000\"\n type=\"number\"\n className=\"width-10\"\n value={this.state.maxSeries}\n onChange={(event) => {\n // We duplicate this state so that we allow to write freely inside the input. We don't have\n // any influence over saving so this seems to be only way to do this.\n this.setState({ maxSeries: event.currentTarget.value });\n const val = parseInt(event.currentTarget.value, 10);\n updateDatasourcePluginJsonDataOption(this.props, 'maxSeries', Number.isFinite(val) ? val : undefined);\n }}\n />\n </InlineField>\n </div>\n </div>\n </>\n );\n }\n}\n\nexport default ConfigEditor;\n","import React from 'react';\n\nconst CHEAT_SHEET_ITEMS = [\n {\n title: 'Getting started',\n label:\n 'Start by selecting a measurement and field from the dropdown above. You can then use the tag selector to further narrow your search.',\n },\n];\n\nconst InfluxCheatSheet = (props: any) => (\n <div>\n <h2>InfluxDB Cheat Sheet</h2>\n {CHEAT_SHEET_ITEMS.map((item) => (\n <div className=\"cheat-sheet-item\" key={item.title}>\n <div className=\"cheat-sheet-item__title\">{item.title}</div>\n <div className=\"cheat-sheet-item__label\">{item.label}</div>\n </div>\n ))}\n </div>\n);\n\nexport default InfluxCheatSheet;\n","import React, { PureComponent } from 'react';\n\nimport { QueryEditorHelpProps } from '@grafana/data';\n\nimport InfluxCheatSheet from './InfluxCheatSheet';\n\nexport default class InfluxStartPage extends PureComponent<QueryEditorHelpProps> {\n render() {\n return <InfluxCheatSheet onClickExample={this.props.onClickExample} />;\n }\n}\n","import { map, clone } from 'lodash';\n\nimport { QueryPartDef, QueryPart, functionRenderer, suffixRenderer } from 'app/features/alerting/state/query_part';\n\nconst index: any[] = [];\nconst categories: any = {\n Aggregations: [],\n Selectors: [],\n Transformations: [],\n Predictors: [],\n Math: [],\n Aliasing: [],\n Fields: [],\n};\n\nfunction createPart(part: any): any {\n const def = index[part.type];\n if (!def) {\n throw { message: 'Could not find query part ' + part.type };\n }\n\n return new QueryPart(part, def);\n}\n\nfunction register(options: any) {\n index[options.type] = new QueryPartDef(options);\n options.category.push(index[options.type]);\n}\n\nconst groupByTimeFunctions: any[] = [];\n\nfunction aliasRenderer(part: { params: string[] }, innerExpr: string) {\n return innerExpr + ' AS ' + '\"' + part.params[0] + '\"';\n}\n\nfunction fieldRenderer(part: { params: string[] }, innerExpr: any) {\n if (part.params[0] === '*') {\n return '*';\n }\n return '\"' + part.params[0] + '\"';\n}\n\nfunction replaceAggregationAddStrategy(selectParts: any[], partModel: { def: { type: string } }) {\n // look for existing aggregation\n for (let i = 0; i < selectParts.length; i++) {\n const part = selectParts[i];\n if (part.def.category === categories.Aggregations) {\n if (part.def.type === partModel.def.type) {\n return;\n }\n // count distinct is allowed\n if (part.def.type === 'count' && partModel.def.type === 'distinct') {\n break;\n }\n // remove next aggregation if distinct was replaced\n if (part.def.type === 'distinct') {\n const morePartsAvailable = selectParts.length >= i + 2;\n if (partModel.def.type !== 'count' && morePartsAvailable) {\n const nextPart = selectParts[i + 1];\n if (nextPart.def.category === categories.Aggregations) {\n selectParts.splice(i + 1, 1);\n }\n } else if (partModel.def.type === 'count') {\n if (!morePartsAvailable || selectParts[i + 1].def.type !== 'count') {\n selectParts.splice(i + 1, 0, partModel);\n }\n return;\n }\n }\n selectParts[i] = partModel;\n return;\n }\n if (part.def.category === categories.Selectors) {\n selectParts[i] = partModel;\n return;\n }\n }\n\n selectParts.splice(1, 0, partModel);\n}\n\nfunction addTransformationStrategy(selectParts: any[], partModel: any) {\n let i;\n // look for index to add transformation\n for (i = 0; i < selectParts.length; i++) {\n const part = selectParts[i];\n if (part.def.category === categories.Math || part.def.category === categories.Aliasing) {\n break;\n }\n }\n\n selectParts.splice(i, 0, partModel);\n}\n\nfunction addMathStrategy(selectParts: any[], partModel: any) {\n const partCount = selectParts.length;\n if (partCount > 0) {\n // if last is math, replace it\n if (selectParts[partCount - 1].def.type === 'math') {\n selectParts[partCount - 1] = partModel;\n return;\n }\n // if next to last is math, replace it\n if (partCount > 1 && selectParts[partCount - 2].def.type === 'math') {\n selectParts[partCount - 2] = partModel;\n return;\n } else if (selectParts[partCount - 1].def.type === 'alias') {\n // if last is alias add it before\n selectParts.splice(partCount - 1, 0, partModel);\n return;\n }\n }\n selectParts.push(partModel);\n}\n\nfunction addAliasStrategy(selectParts: any[], partModel: any) {\n const partCount = selectParts.length;\n if (partCount > 0) {\n // if last is alias, replace it\n if (selectParts[partCount - 1].def.type === 'alias') {\n selectParts[partCount - 1] = partModel;\n return;\n }\n }\n selectParts.push(partModel);\n}\n\nfunction addFieldStrategy(selectParts: any, partModel: any, query: { selectModels: any[][] }) {\n // copy all parts\n const parts = map(selectParts, (part: any) => {\n return createPart({ type: part.def.type, params: clone(part.params) });\n });\n\n query.selectModels.push(parts);\n}\n\nregister({\n type: 'field',\n addStrategy: addFieldStrategy,\n category: categories.Fields,\n params: [{ type: 'field', dynamicLookup: true }],\n defaultParams: ['value'],\n renderer: fieldRenderer,\n});\n\n// Aggregations\nregister({\n type: 'count',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'distinct',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'integral',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'mean',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'median',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'mode',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'sum',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\n// transformations\n\nregister({\n type: 'derivative',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [\n {\n name: 'duration',\n type: 'interval',\n options: ['1s', '10s', '1m', '5m', '10m', '15m', '1h'],\n },\n ],\n defaultParams: ['10s'],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'spread',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'non_negative_derivative',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [\n {\n name: 'duration',\n type: 'interval',\n options: ['1s', '10s', '1m', '5m', '10m', '15m', '1h'],\n },\n ],\n defaultParams: ['10s'],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'difference',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'non_negative_difference',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'moving_average',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [{ name: 'window', type: 'int', options: [5, 10, 20, 30, 40] }],\n defaultParams: [10],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'cumulative_sum',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'stddev',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'time',\n category: groupByTimeFunctions,\n params: [\n {\n name: 'interval',\n type: 'time',\n options: ['$__interval', '1s', '10s', '1m', '5m', '10m', '15m', '1h'],\n },\n ],\n defaultParams: ['$__interval'],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'fill',\n category: groupByTimeFunctions,\n params: [\n {\n name: 'fill',\n type: 'string',\n options: ['none', 'null', '0', 'previous', 'linear'],\n },\n ],\n defaultParams: ['null'],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'elapsed',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [\n {\n name: 'duration',\n type: 'interval',\n options: ['1s', '10s', '1m', '5m', '10m', '15m', '1h'],\n },\n ],\n defaultParams: ['10s'],\n renderer: functionRenderer,\n});\n\n// predictions\nregister({\n type: 'holt_winters',\n addStrategy: addTransformationStrategy,\n category: categories.Predictors,\n params: [\n { name: 'number', type: 'int', options: [5, 10, 20, 30, 40] },\n { name: 'season', type: 'int', options: [0, 1, 2, 5, 10] },\n ],\n defaultParams: [10, 2],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'holt_winters_with_fit',\n addStrategy: addTransformationStrategy,\n category: categories.Predictors,\n params: [\n { name: 'number', type: 'int', options: [5, 10, 20, 30, 40] },\n { name: 'season', type: 'int', options: [0, 1, 2, 5, 10] },\n ],\n defaultParams: [10, 2],\n renderer: functionRenderer,\n});\n\n// Selectors\nregister({\n type: 'bottom',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [{ name: 'count', type: 'int' }],\n defaultParams: [3],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'first',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'last',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'max',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'min',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'percentile',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [{ name: 'nth', type: 'int' }],\n defaultParams: [95],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'top',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [{ name: 'count', type: 'int' }],\n defaultParams: [3],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'tag',\n category: groupByTimeFunctions,\n params: [{ name: 'tag', type: 'string', dynamicLookup: true }],\n defaultParams: ['tag'],\n renderer: fieldRenderer,\n});\n\nregister({\n type: 'math',\n addStrategy: addMathStrategy,\n category: categories.Math,\n params: [{ name: 'expr', type: 'string' }],\n defaultParams: [' / 100'],\n renderer: suffixRenderer,\n});\n\nregister({\n type: 'alias',\n addStrategy: addAliasStrategy,\n category: categories.Aliasing,\n params: [{ name: 'name', type: 'string', quote: 'double' }],\n defaultParams: ['alias'],\n renderMode: 'suffix',\n renderer: aliasRenderer,\n});\n\nexport default {\n create: createPart,\n getCategories: () => {\n return categories;\n },\n replaceAggregationAdd: replaceAggregationAddStrategy,\n};\n","import { map, find, filter, indexOf } from 'lodash';\n\nimport { ScopedVars } from '@grafana/data';\nimport { TemplateSrv } from '@grafana/runtime';\nimport kbn from 'app/core/utils/kbn';\n\nimport queryPart from './query_part';\nimport { InfluxQuery, InfluxQueryTag } from './types';\n\nexport default class InfluxQueryModel {\n target: InfluxQuery;\n selectModels: any[] = [];\n queryBuilder: any;\n groupByParts: any;\n templateSrv: any;\n scopedVars: any;\n refId?: string;\n\n /** @ngInject */\n constructor(target: InfluxQuery, templateSrv?: TemplateSrv, scopedVars?: ScopedVars) {\n this.target = target;\n this.templateSrv = templateSrv;\n this.scopedVars = scopedVars;\n\n target.policy = target.policy || 'default';\n target.resultFormat = target.resultFormat || 'time_series';\n target.orderByTime = target.orderByTime || 'ASC';\n target.tags = target.tags || [];\n target.groupBy = target.groupBy || [\n { type: 'time', params: ['$__interval'] },\n { type: 'fill', params: ['null'] },\n ];\n target.select = target.select || [\n [\n { type: 'field', params: ['value'] },\n { type: 'mean', params: [] },\n ],\n ];\n\n this.updateProjection();\n }\n\n updateProjection() {\n this.selectModels = map(this.target.select, (parts: any) => {\n return map(parts, queryPart.create);\n });\n this.groupByParts = map(this.target.groupBy, queryPart.create);\n }\n\n updatePersistedParts() {\n this.target.select = map(this.selectModels, (selectParts) => {\n return map(selectParts, (part: any) => {\n return { type: part.def.type, params: part.params };\n });\n });\n }\n\n hasGroupByTime() {\n return find(this.target.groupBy, (g: any) => g.type === 'time');\n }\n\n hasFill() {\n return find(this.target.groupBy, (g: any) => g.type === 'fill');\n }\n\n addGroupBy(value: string) {\n let stringParts = value.match(/^(\\w+)\\((.*)\\)$/);\n\n if (!stringParts || !this.target.groupBy) {\n return;\n }\n\n const typePart = stringParts[1];\n const arg = stringParts[2];\n const partModel = queryPart.create({ type: typePart, params: [arg] });\n const partCount = this.target.groupBy.length;\n\n if (partCount === 0) {\n this.target.groupBy.push(partModel.part);\n } else if (typePart === 'time') {\n this.target.groupBy.splice(0, 0, partModel.part);\n } else if (typePart === 'tag') {\n if (this.target.groupBy[partCount - 1].type === 'fill') {\n this.target.groupBy.splice(partCount - 1, 0, partModel.part);\n } else {\n this.target.groupBy.push(partModel.part);\n }\n } else {\n this.target.groupBy.push(partModel.part);\n }\n\n this.updateProjection();\n }\n\n removeGroupByPart(part: { def: { type: string } }, index: number) {\n const categories = queryPart.getCategories();\n\n if (part.def.type === 'time') {\n // remove fill\n this.target.groupBy = filter(this.target.groupBy, (g: any) => g.type !== 'fill');\n // remove aggregations\n this.target.select = map(this.target.select, (s: any) => {\n return filter(s, (part: any) => {\n const partModel = queryPart.create(part);\n if (partModel.def.category === categories.Aggregations) {\n return false;\n }\n if (partModel.def.category === categories.Selectors) {\n return false;\n }\n return true;\n });\n });\n }\n\n this.target.groupBy!.splice(index, 1);\n this.updateProjection();\n }\n\n removeSelect(index: number) {\n this.target.select!.splice(index, 1);\n this.updateProjection();\n }\n\n removeSelectPart(selectParts: any[], part: any) {\n // if we remove the field remove the whole statement\n if (part.def.type === 'field') {\n if (this.selectModels.length > 1) {\n const modelsIndex = indexOf(this.selectModels, selectParts);\n this.selectModels.splice(modelsIndex, 1);\n }\n } else {\n const partIndex = indexOf(selectParts, part);\n selectParts.splice(partIndex, 1);\n }\n\n this.updatePersistedParts();\n }\n\n addSelectPart(selectParts: any[], type: string) {\n const partModel = queryPart.create({ type: type });\n partModel.def.addStrategy(selectParts, partModel, this);\n this.updatePersistedParts();\n }\n\n private renderTagCondition(tag: InfluxQueryTag, index: number, interpolate?: boolean) {\n // FIXME: merge this function with query_builder/renderTagCondition\n let str = '';\n let operator = tag.operator;\n let value = tag.value;\n if (index > 0) {\n str = (tag.condition || 'AND') + ' ';\n }\n\n if (!operator) {\n if (/^\\/.*\\/$/.test(value)) {\n operator = '=~';\n } else {\n operator = '=';\n }\n }\n\n // quote value unless regex\n if (operator !== '=~' && operator !== '!~') {\n if (interpolate) {\n value = this.templateSrv.replace(value, this.scopedVars);\n }\n if (operator !== '>' && operator !== '<') {\n value = \"'\" + value.replace(/\\\\/g, '\\\\\\\\').replace(/\\'/g, \"\\\\'\") + \"'\";\n }\n } else if (interpolate) {\n value = this.templateSrv.replace(value, this.scopedVars, 'regex');\n }\n\n return str + '\"' + tag.key + '\" ' + operator + ' ' + value;\n }\n\n getMeasurementAndPolicy(interpolate: any) {\n let policy = this.target.policy;\n let measurement = this.target.measurement || 'measurement';\n\n if (!measurement.match('^/.*/$')) {\n measurement = '\"' + measurement + '\"';\n } else if (interpolate) {\n measurement = this.templateSrv.replace(measurement, this.scopedVars, 'regex');\n }\n\n if (policy !== 'default') {\n policy = '\"' + this.target.policy + '\".';\n } else {\n policy = '';\n }\n\n return policy + measurement;\n }\n\n interpolateQueryStr(value: any[], variable: { multi: any; includeAll: any }, defaultFormatFn: any) {\n // if no multi or include all do not regexEscape\n if (!variable.multi && !variable.includeAll) {\n return value;\n }\n\n if (typeof value === 'string') {\n return kbn.regexEscape(value);\n }\n\n const escapedValues = map(value, kbn.regexEscape);\n return '(' + escapedValues.join('|') + ')';\n }\n\n render(interpolate?: boolean) {\n const target = this.target;\n\n if (target.rawQuery) {\n if (interpolate) {\n return this.templateSrv.replace(target.query, this.scopedVars, this.interpolateQueryStr);\n } else {\n return target.query;\n }\n }\n\n let query = 'SELECT ';\n let i, y;\n for (i = 0; i < this.selectModels.length; i++) {\n const parts = this.selectModels[i];\n let selectText = '';\n for (y = 0; y < parts.length; y++) {\n const part = parts[y];\n selectText = part.render(selectText);\n }\n\n if (i > 0) {\n query += ', ';\n }\n query += selectText;\n }\n\n query += ' FROM ' + this.getMeasurementAndPolicy(interpolate) + ' WHERE ';\n const conditions = map(target.tags, (tag, index) => {\n return this.renderTagCondition(tag, index, interpolate);\n });\n\n if (conditions.length > 0) {\n query += '(' + conditions.join(' ') + ') AND ';\n }\n\n query += '$timeFilter';\n\n let groupBySection = '';\n for (i = 0; i < this.groupByParts.length; i++) {\n const part = this.groupByParts[i];\n if (i > 0) {\n // for some reason fill has no separator\n groupBySection += part.def.type === 'fill' ? ' ' : ', ';\n }\n groupBySection += part.render('');\n }\n\n if (groupBySection.length) {\n query += ' GROUP BY ' + groupBySection;\n }\n\n if (target.fill) {\n query += ' fill(' + target.fill + ')';\n }\n\n if (target.orderByTime === 'DESC') {\n query += ' ORDER BY time DESC';\n }\n\n if (target.limit) {\n query += ' LIMIT ' + target.limit;\n }\n\n if (target.slimit) {\n query += ' SLIMIT ' + target.slimit;\n }\n\n if (target.tz) {\n query += \" tz('\" + target.tz + \"')\";\n }\n\n return query;\n }\n\n renderAdhocFilters(filters: any[]) {\n const conditions = map(filters, (tag, index) => {\n return this.renderTagCondition(tag, index, true);\n });\n return conditions.join(' ');\n }\n}\n","import { cloneDeep } from 'lodash';\n\nimport InfluxQueryModel from './influx_query_model';\nimport { InfluxQuery } from './types';\n\n// FIXME: these functions are a beginning of a refactoring of influx_query_model.ts\n// into a simpler approach with full typescript types.\n// later we should be able to migrate the unit-tests\n// that relate to these functions here, and then perhaps even move the implementation\n// to this place\n\nexport function buildRawQuery(query: InfluxQuery): string {\n const queryCopy = cloneDeep(query); // the query-model mutates the query\n const model = new InfluxQueryModel(queryCopy);\n return model.render(false);\n}\n\nexport function normalizeQuery(query: InfluxQuery): InfluxQuery {\n // we return the original query if there is no need to update it\n if (\n query.policy !== undefined &&\n query.resultFormat !== undefined &&\n query.orderByTime !== undefined &&\n query.tags !== undefined &&\n query.groupBy !== undefined &&\n query.select !== undefined\n ) {\n return query;\n }\n\n // FIXME: we should move the whole normalizeQuery logic here,\n // and then have influxQueryModel call this function,\n // to concentrate the whole logic here\n\n const queryCopy = cloneDeep(query); // the query-model mutates the query\n return new InfluxQueryModel(queryCopy).target;\n}\n\nexport function addNewSelectPart(query: InfluxQuery, type: string, index: number): InfluxQuery {\n const queryCopy = cloneDeep(query); // the query-model mutates the query\n const model = new InfluxQueryModel(queryCopy);\n model.addSelectPart(model.selectModels[index], type);\n return model.target;\n}\n\nexport function removeSelectPart(query: InfluxQuery, partIndex: number, index: number): InfluxQuery {\n const queryCopy = cloneDeep(query); // the query-model mutates the query\n const model = new InfluxQueryModel(queryCopy);\n const selectModel = model.selectModels[index];\n model.removeSelectPart(selectModel, selectModel[partIndex]);\n return model.target;\n}\n\nexport function changeSelectPart(\n query: InfluxQuery,\n listIndex: number,\n partIndex: number,\n newParams: string[]\n): InfluxQuery {\n // we need to make shallow copy of `query.select` down to `query.select[listIndex][partIndex]`\n const newSel = [...(query.select ?? [])];\n newSel[listIndex] = [...newSel[listIndex]];\n newSel[listIndex][partIndex] = {\n ...newSel[listIndex][partIndex],\n params: newParams,\n };\n return { ...query, select: newSel };\n}\n\nexport function addNewGroupByPart(query: InfluxQuery, type: string): InfluxQuery {\n const queryCopy = cloneDeep(query); // the query-model mutates the query\n const model = new InfluxQueryModel(queryCopy);\n model.addGroupBy(type);\n return model.target;\n}\n\nexport function removeGroupByPart(query: InfluxQuery, partIndex: number): InfluxQuery {\n const queryCopy = cloneDeep(query); // the query-model mutates the query\n const model = new InfluxQueryModel(queryCopy);\n model.removeGroupByPart(model.groupByParts[partIndex], partIndex);\n return model.target;\n}\n\nexport function changeGroupByPart(query: InfluxQuery, partIndex: number, newParams: string[]): InfluxQuery {\n // we need to make shallow copy of `query.groupBy` down to `query.groupBy[partIndex]`\n const newGroupBy = [...(query.groupBy ?? [])];\n newGroupBy[partIndex] = {\n ...newGroupBy[partIndex],\n params: newParams,\n };\n return { ...query, groupBy: newGroupBy };\n}\n","import { cx, css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport {\n InlineFormLabel,\n LinkButton,\n Segment,\n CodeEditor,\n MonacoEditor,\n CodeEditorSuggestionItem,\n CodeEditorSuggestionItemKind,\n} from '@grafana/ui';\n\nimport InfluxDatasource from '../datasource';\nimport { InfluxQuery } from '../types';\n\ntype Props = {\n onChange: (query: InfluxQuery) => void;\n onRunQuery: () => void;\n query: InfluxQuery;\n // `datasource` is not used internally, but this component is used at some places\n // directly, where the `datasource` prop has to exist. later, when the whole\n // query-editor gets converted to react we can stop using this component directly\n // and then we can probably remove the datasource attribute.\n datasource: InfluxDatasource;\n};\n\nconst samples: Array<SelectableValue<string>> = [\n { label: 'Show buckets', description: 'List the available buckets (table)', value: 'buckets()' },\n {\n label: 'Simple query',\n description: 'filter by measurement and field',\n value: `from(bucket: \"db/rp\")\n |> range(start: v.timeRangeStart, stop:v.timeRangeStop)\n |> filter(fn: (r) =>\n r._measurement == \"example-measurement\" and\n r._field == \"example-field\"\n )`,\n },\n {\n label: 'Grouped Query',\n description: 'Group by (min/max/sum/median)',\n value: `// v.windowPeriod is a variable referring to the current optimized window period (currently: $interval)\nfrom(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"measurement1\" or r[\"_measurement\"] =~ /^.*?regex.*$/)\n |> filter(fn: (r) => r[\"_field\"] == \"field2\" or r[\"_field\"] =~ /^.*?regex.*$/)\n |> aggregateWindow(every: v.windowPeriod, fn: mean|median|max|count|derivative|sum)\n |> yield(name: \"some-name\")`,\n },\n {\n label: 'Filter by value',\n description: 'Results between a min/max',\n value: `// v.bucket, v.timeRangeStart, and v.timeRange stop are all variables supported by the flux plugin and influxdb\nfrom(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_value\"] >= 10 and r[\"_value\"] <= 20)`,\n },\n {\n label: 'Schema Exploration: (measurements)',\n description: 'Get a list of measurement using flux',\n value: `import \"influxdata/influxdb/v1\"\nv1.measurements(bucket: v.bucket)`,\n },\n {\n label: 'Schema Exploration: (fields)',\n description: 'Return every possible key in a single table',\n value: `from(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop:v.timeRangeStop)\n |> keys()\n |> keep(columns: [\"_value\"])\n |> group()\n |> distinct()`,\n },\n {\n label: 'Schema Exploration: (tag keys)',\n description: 'Get a list of tag keys using flux',\n value: `import \"influxdata/influxdb/v1\"\nv1.tagKeys(bucket: v.bucket)`,\n },\n {\n label: 'Schema Exploration: (tag values)',\n description: 'Get a list of tag values using flux',\n value: `import \"influxdata/influxdb/v1\"\nv1.tagValues(\n bucket: v.bucket,\n tag: \"host\",\n predicate: (r) => true,\n start: -1d\n)`,\n },\n];\n\nexport class FluxQueryEditor extends PureComponent<Props> {\n onFluxQueryChange = (query: string) => {\n this.props.onChange({ ...this.props.query, query });\n this.props.onRunQuery();\n };\n\n onSampleChange = (val: SelectableValue<string>) => {\n this.props.onChange({\n ...this.props.query,\n query: val.value!,\n });\n\n // Angular HACK: Since the target does not actually change!\n this.forceUpdate();\n this.props.onRunQuery();\n };\n\n getSuggestions = (): CodeEditorSuggestionItem[] => {\n const sugs: CodeEditorSuggestionItem[] = [\n {\n label: 'v.timeRangeStart',\n kind: CodeEditorSuggestionItemKind.Property,\n detail: 'The start time',\n },\n {\n label: 'v.timeRangeStop',\n kind: CodeEditorSuggestionItemKind.Property,\n detail: 'The stop time',\n },\n {\n label: 'v.windowPeriod',\n kind: CodeEditorSuggestionItemKind.Property,\n detail: 'based on max data points',\n },\n {\n label: 'v.defaultBucket',\n kind: CodeEditorSuggestionItemKind.Property,\n detail: 'bucket configured in the datsource',\n },\n {\n label: 'v.organization',\n kind: CodeEditorSuggestionItemKind.Property,\n detail: 'org configured for the datsource',\n },\n ];\n\n const templateSrv = getTemplateSrv();\n templateSrv.getVariables().forEach((variable) => {\n const label = '${' + variable.name + '}';\n let val = templateSrv.replace(label);\n if (val === label) {\n val = '';\n }\n sugs.push({\n label,\n kind: CodeEditorSuggestionItemKind.Text,\n detail: `(Template Variable) ${val}`,\n });\n });\n\n return sugs;\n };\n\n // For some reason in angular, when this component gets re-mounted, the width\n // is not set properly. This forces the layout shortly after mount so that it\n // displays OK. Note: this is not an issue when used directly in react\n editorDidMountCallbackHack = (editor: MonacoEditor) => {\n setTimeout(() => editor.layout(), 100);\n };\n\n render() {\n const { query } = this.props;\n\n const helpTooltip = (\n <div>\n Type: <i>ctrl+space</i> to show template variable suggestions <br />\n Many queries can be copied from Chronograf\n </div>\n );\n\n return (\n <>\n <CodeEditor\n height={'200px'}\n language=\"sql\"\n value={query.query || ''}\n onBlur={this.onFluxQueryChange}\n onSave={this.onFluxQueryChange}\n showMiniMap={false}\n showLineNumbers={true}\n getSuggestions={this.getSuggestions}\n onEditorDidMount={this.editorDidMountCallbackHack}\n />\n <div\n className={cx(\n 'gf-form-inline',\n css`\n margin-top: 6px;\n `\n )}\n >\n <LinkButton\n icon=\"external-link-alt\"\n variant=\"secondary\"\n target=\"blank\"\n href=\"https://docs.influxdata.com/influxdb/latest/query-data/get-started/\"\n >\n Flux language syntax\n </LinkButton>\n <Segment options={samples} value=\"Sample Query\" onChange={this.onSampleChange} />\n <div className=\"gf-form gf-form--grow\">\n <div className=\"gf-form-label gf-form-label--grow\"></div>\n </div>\n <InlineFormLabel width={5} tooltip={helpTooltip}>\n Help\n </InlineFormLabel>\n </div>\n </>\n );\n }\n}\n","import React, { useEffect, useState } from 'react';\n\nimport { Button, ConfirmModal } from '@grafana/ui';\n\ntype Props = {\n isRaw: boolean;\n onChange: (newIsRaw: boolean) => void;\n};\n\nexport const QueryEditorModeSwitcher = ({ isRaw, onChange }: Props): JSX.Element => {\n const [isModalOpen, setModalOpen] = useState(false);\n\n useEffect(() => {\n // if the isRaw changes, we hide the modal\n setModalOpen(false);\n }, [isRaw]);\n\n if (isRaw) {\n return (\n <>\n <Button\n aria-label=\"Switch to visual editor\"\n icon=\"pen\"\n variant=\"secondary\"\n type=\"button\"\n onClick={() => {\n // we show the are-you-sure modal\n setModalOpen(true);\n }}\n ></Button>\n <ConfirmModal\n isOpen={isModalOpen}\n title=\"Switch to visual editor mode\"\n body=\"Are you sure to switch to visual editor mode? You will lose the changes done in raw query mode.\"\n confirmText=\"Yes, switch to editor mode\"\n dismissText=\"No, stay in raw query mode\"\n onConfirm={() => {\n onChange(false);\n }}\n onDismiss={() => {\n setModalOpen(false);\n }}\n />\n </>\n );\n } else {\n return (\n <Button\n aria-label=\"Switch to text editor\"\n icon=\"pen\"\n variant=\"secondary\"\n type=\"button\"\n onClick={() => {\n onChange(true);\n }}\n ></Button>\n );\n }\n};\n","import { SelectableValue } from '@grafana/data';\n\nimport { ResultFormat } from '../types';\n\nexport const RESULT_FORMATS: Array<SelectableValue<ResultFormat>> = [\n { label: 'Time series', value: 'time_series' },\n { label: 'Table', value: 'table' },\n { label: 'Logs', value: 'logs' },\n];\n\nexport const DEFAULT_RESULT_FORMAT: ResultFormat = 'time_series';\n","import { useState, useEffect } from 'react';\nimport { usePrevious } from 'react-use';\n\nexport function useShadowedState<T>(outsideVal: T): [T, (newVal: T) => void] {\n const [currentVal, setCurrentVal] = useState(outsideVal);\n const prevOutsideVal = usePrevious(outsideVal);\n\n useEffect(() => {\n const isOutsideValChanged = prevOutsideVal !== outsideVal;\n // if the value changes from the outside, we accept it into the state\n // (we only set it if it is different from the current value)\n if (isOutsideValChanged && currentVal !== outsideVal) {\n setCurrentVal(outsideVal);\n }\n }, [outsideVal, currentVal, prevOutsideVal]);\n\n return [currentVal, setCurrentVal];\n}\n","import React from 'react';\n\nimport { TextArea, InlineFormLabel, Input, Select, HorizontalGroup } from '@grafana/ui';\n\nimport { InfluxQuery } from '../types';\n\nimport { RESULT_FORMATS, DEFAULT_RESULT_FORMAT } from './constants';\nimport { useShadowedState } from './useShadowedState';\nimport { useUniqueId } from './useUniqueId';\n\ntype Props = {\n query: InfluxQuery;\n onChange: (query: InfluxQuery) => void;\n onRunQuery: () => void;\n};\n\n// we handle 3 fields: \"query\", \"alias\", \"resultFormat\"\n// \"resultFormat\" changes are applied immediately\n// \"query\" and \"alias\" changes only happen on onblur\nexport const RawInfluxQLEditor = ({ query, onChange, onRunQuery }: Props): JSX.Element => {\n const [currentQuery, setCurrentQuery] = useShadowedState(query.query);\n const [currentAlias, setCurrentAlias] = useShadowedState(query.alias);\n const aliasElementId = useUniqueId();\n const selectElementId = useUniqueId();\n\n const resultFormat = query.resultFormat ?? DEFAULT_RESULT_FORMAT;\n\n const applyDelayedChangesAndRunQuery = () => {\n onChange({\n ...query,\n query: currentQuery,\n alias: currentAlias,\n resultFormat,\n });\n onRunQuery();\n };\n\n return (\n <div>\n <TextArea\n aria-label=\"query\"\n rows={3}\n spellCheck={false}\n placeholder=\"InfluxDB Query\"\n onBlur={applyDelayedChangesAndRunQuery}\n onChange={(e) => {\n setCurrentQuery(e.currentTarget.value);\n }}\n value={currentQuery ?? ''}\n />\n <HorizontalGroup>\n <InlineFormLabel htmlFor={selectElementId}>Format as</InlineFormLabel>\n <Select\n inputId={selectElementId}\n onChange={(v) => {\n onChange({ ...query, resultFormat: v.value });\n onRunQuery();\n }}\n value={resultFormat}\n options={RESULT_FORMATS}\n />\n <InlineFormLabel htmlFor={aliasElementId}>Alias by</InlineFormLabel>\n <Input\n id={aliasElementId}\n type=\"text\"\n spellCheck={false}\n placeholder=\"Naming pattern\"\n onBlur={applyDelayedChangesAndRunQuery}\n onChange={(e) => {\n setCurrentAlias(e.currentTarget.value);\n }}\n value={currentAlias ?? ''}\n />\n </HorizontalGroup>\n </div>\n );\n};\n","import { reduce } from 'lodash';\n\nimport kbn from 'app/core/utils/kbn';\n\nfunction renderTagCondition(tag: { operator: any; value: string; condition: any; key: string }, index: number) {\n // FIXME: merge this function with influx_query_model/renderTagCondition\n let str = '';\n let operator = tag.operator;\n let value = tag.value;\n if (index > 0) {\n str = (tag.condition || 'AND') + ' ';\n }\n\n if (!operator) {\n if (/^\\/.*\\/$/.test(tag.value)) {\n operator = '=~';\n } else {\n operator = '=';\n }\n }\n\n // quote value unless regex or number, or if empty-string\n if (value === '' || (operator !== '=~' && operator !== '!~' && isNaN(+value))) {\n value = \"'\" + value.replace(/\\\\/g, '\\\\\\\\').replace(/\\'/g, \"\\\\'\") + \"'\";\n }\n\n return str + '\"' + tag.key + '\" ' + operator + ' ' + value;\n}\n\nexport class InfluxQueryBuilder {\n constructor(private target: { measurement: any; tags: any; policy?: any }, private database?: string) {}\n\n buildExploreQuery(type: string, withKey?: string, withMeasurementFilter?: string): string {\n let query = '';\n let measurement;\n let policy;\n\n if (type === 'TAG_KEYS') {\n query = 'SHOW TAG KEYS';\n measurement = this.target.measurement;\n policy = this.target.policy;\n } else if (type === 'TAG_VALUES') {\n query = 'SHOW TAG VALUES';\n measurement = this.target.measurement;\n policy = this.target.policy;\n } else if (type === 'MEASUREMENTS') {\n query = 'SHOW MEASUREMENTS';\n if (withMeasurementFilter) {\n // we do a case-insensitive regex-based lookup\n query += ' WITH MEASUREMENT =~ /(?i)' + kbn.regexEscape(withMeasurementFilter) + '/';\n }\n } else if (type === 'FIELDS') {\n measurement = this.target.measurement;\n policy = this.target.policy;\n\n if (!measurement.match('^/.*/')) {\n measurement = '\"' + measurement + '\"';\n\n if (policy && policy !== 'default') {\n policy = '\"' + policy + '\"';\n measurement = policy + '.' + measurement;\n }\n }\n\n return 'SHOW FIELD KEYS FROM ' + measurement;\n } else if (type === 'RETENTION POLICIES') {\n query = 'SHOW RETENTION POLICIES on \"' + this.database + '\"';\n return query;\n }\n\n if (measurement) {\n if (!measurement.match('^/.*/') && !measurement.match(/^merge\\(.*\\)/)) {\n measurement = '\"' + measurement + '\"';\n }\n\n if (policy && policy !== 'default') {\n policy = '\"' + policy + '\"';\n measurement = policy + '.' + measurement;\n }\n\n query += ' FROM ' + measurement;\n }\n\n if (withKey) {\n query += ' WITH KEY = \"' + withKey + '\"';\n }\n\n if (this.target.tags && this.target.tags.length > 0) {\n const whereConditions = reduce(\n this.target.tags,\n (memo, tag) => {\n // do not add a condition for the key we want to explore for\n if (tag.key === withKey) {\n return memo;\n }\n\n // value operators not supported in these types of queries\n if (tag.operator === '>' || tag.operator === '<') {\n return memo;\n }\n\n memo.push(renderTagCondition(tag, memo.length));\n return memo;\n },\n [] as string[]\n );\n\n if (whereConditions.length > 0) {\n query += ' WHERE ' + whereConditions.join(' ');\n }\n }\n\n if (type === 'MEASUREMENTS') {\n query += ' LIMIT 100';\n //Solve issue #2524 by limiting the number of measurements returned\n //LIMIT must be after WITH MEASUREMENT and WHERE clauses\n //This also could be used for TAG KEYS and TAG VALUES, if desired\n }\n\n return query;\n }\n}\n","import InfluxDatasource from './datasource';\nimport { InfluxQueryBuilder } from './query_builder';\nimport { InfluxQueryTag } from './types';\n\nconst runExploreQuery = (\n type: string,\n withKey: string | undefined,\n withMeasurementFilter: string | undefined,\n target: { measurement: string | undefined; tags: InfluxQueryTag[]; policy: string | undefined },\n datasource: InfluxDatasource\n): Promise<Array<{ text: string }>> => {\n const builder = new InfluxQueryBuilder(target, datasource.database);\n const q = builder.buildExploreQuery(type, withKey, withMeasurementFilter);\n return datasource.metricFindQuery(q);\n};\n\nexport async function getAllPolicies(datasource: InfluxDatasource): Promise<string[]> {\n const target = { tags: [], measurement: undefined, policy: undefined };\n const data = await runExploreQuery('RETENTION POLICIES', undefined, undefined, target, datasource);\n return data.map((item) => item.text);\n}\n\nexport async function getAllMeasurementsForTags(\n measurementFilter: string | undefined,\n tags: InfluxQueryTag[],\n datasource: InfluxDatasource\n): Promise<string[]> {\n const target = { tags, measurement: undefined, policy: undefined };\n const data = await runExploreQuery('MEASUREMENTS', undefined, measurementFilter, target, datasource);\n return data.map((item) => item.text);\n}\n\nexport async function getTagKeysForMeasurementAndTags(\n measurement: string | undefined,\n policy: string | undefined,\n tags: InfluxQueryTag[],\n datasource: InfluxDatasource\n): Promise<string[]> {\n const target = { tags, measurement, policy };\n const data = await runExploreQuery('TAG_KEYS', undefined, undefined, target, datasource);\n return data.map((item) => item.text);\n}\n\nexport async function getTagValues(\n tagKey: string,\n measurement: string | undefined,\n policy: string | undefined,\n tags: InfluxQueryTag[],\n datasource: InfluxDatasource\n): Promise<string[]> {\n const target = { tags, measurement, policy };\n const data = await runExploreQuery('TAG_VALUES', tagKey, undefined, target, datasource);\n return data.map((item) => item.text);\n}\n\nexport async function getFieldKeysForMeasurement(\n measurement: string,\n policy: string | undefined,\n datasource: InfluxDatasource\n): Promise<string[]> {\n const target = { tags: [], measurement, policy };\n const data = await runExploreQuery('FIELDS', undefined, undefined, target, datasource);\n return data.map((item) => item.text);\n}\n","import { css } from '@emotion/css';\n\nexport const paddingRightClass = css({\n paddingRight: '4px',\n});\n","export function unwrap<T>(value: T | null | undefined): T {\n if (value == null) {\n throw new Error('value must not be nullish');\n }\n return value;\n}\n","import { cx } from '@emotion/css';\nimport React from 'react';\n\nimport { Select } from '@grafana/ui';\n\nimport { ResultFormat } from '../../types';\nimport { RESULT_FORMATS } from '../constants';\n\nimport { paddingRightClass } from './styles';\nimport { unwrap } from './unwrap';\n\ntype Props = {\n inputId?: string;\n format: ResultFormat;\n onChange: (newFormat: ResultFormat) => void;\n};\n\nconst className = cx('width-8', paddingRightClass);\n\nexport const FormatAsSection = ({ format, inputId, onChange }: Props): JSX.Element => {\n return (\n <Select<ResultFormat>\n inputId={inputId}\n className={className}\n onChange={(v) => {\n onChange(unwrap(v.value));\n }}\n value={format}\n options={RESULT_FORMATS}\n />\n );\n};\n","import { cx, css } from '@emotion/css';\nimport debouncePromise from 'debounce-promise';\nimport React, { useState, useEffect } from 'react';\nimport { useAsyncFn } from 'react-use';\n\nimport { SelectableValue } from '@grafana/data';\nimport { InlineLabel, Select, AsyncSelect, Input } from '@grafana/ui';\n\nimport { useShadowedState } from '../useShadowedState';\n\n// this file is a simpler version of `grafana-ui / SegmentAsync.tsx`\n// with some changes:\n// 1. click-outside does not select the value. i think it's better to be explicit here.\n// 2. we set a min-width on the select-element to handle cases where the `value`\n// is very short, like \"x\", and then you click on it and the select opens,\n// and it tries to be as short as \"x\" and it does not work well.\n\n// NOTE: maybe these changes could be migrated into the SegmentAsync later\n\ntype SelVal = SelectableValue<string>;\n\n// when allowCustomValue is true, there is no way to enforce the selectableValue\n// enum-type, so i just go with `string`\n\ntype LoadOptions = (filter: string) => Promise<SelVal[]>;\n\ntype Props = {\n value: string;\n buttonClassName?: string;\n loadOptions?: LoadOptions;\n // if filterByLoadOptions is false,\n // loadOptions is only executed once,\n // when the select-box opens,\n // and as you write, the list gets filtered\n // by the select-box.\n // if filterByLoadOptions is true,\n // as you write the loadOptions is executed again and again,\n // and it is relied on to filter the results.\n filterByLoadOptions?: boolean;\n onChange: (v: SelVal) => void;\n allowCustomValue?: boolean;\n};\n\nconst selectClass = css({\n minWidth: '160px',\n});\n\ntype SelProps = {\n loadOptions: LoadOptions;\n filterByLoadOptions?: boolean;\n onClose: () => void;\n onChange: (v: SelVal) => void;\n allowCustomValue?: boolean;\n};\n\ntype SelReloadProps = {\n loadOptions: (filter: string) => Promise<SelVal[]>;\n onClose: () => void;\n onChange: (v: SelVal) => void;\n allowCustomValue?: boolean;\n};\n\n// when a custom value is written into a select-box,\n// by default the new value is prefixed with \"Create:\",\n// and that sounds confusing because here we do not create\n// anything. we change this to just be the entered string.\nconst formatCreateLabel = (v: string) => v;\n\nconst SelReload = ({ loadOptions, allowCustomValue, onChange, onClose }: SelReloadProps): JSX.Element => {\n // here we rely on the fact that writing text into the <AsyncSelect/>\n // does not cause a re-render of the current react component.\n // this way there is only a single render-call,\n // so there is only a single `debouncedLoadOptions`.\n // if we want ot make this \"re-render safe,\n // we will have to put the debounced call into an useRef,\n // and probably have an useEffect\n const debouncedLoadOptions = debouncePromise(loadOptions, 1000, { leading: true });\n return (\n <div className={selectClass}>\n <AsyncSelect\n formatCreateLabel={formatCreateLabel}\n defaultOptions\n autoFocus\n isOpen\n onCloseMenu={onClose}\n allowCustomValue={allowCustomValue}\n loadOptions={debouncedLoadOptions}\n onChange={onChange}\n />\n </div>\n );\n};\n\ntype SelSingleLoadProps = {\n loadOptions: (filter: string) => Promise<SelVal[]>;\n onClose: () => void;\n onChange: (v: SelVal) => void;\n allowCustomValue?: boolean;\n};\n\nconst SelSingleLoad = ({ loadOptions, allowCustomValue, onChange, onClose }: SelSingleLoadProps): JSX.Element => {\n const [loadState, doLoad] = useAsyncFn(loadOptions, [loadOptions]);\n\n useEffect(() => {\n doLoad('');\n }, [doLoad, loadOptions]);\n\n return (\n <div className={selectClass}>\n <Select\n isLoading={loadState.loading}\n formatCreateLabel={formatCreateLabel}\n autoFocus\n isOpen\n onCloseMenu={onClose}\n allowCustomValue={allowCustomValue}\n options={loadState.value ?? []}\n onChange={onChange}\n />\n </div>\n );\n};\n\nconst Sel = ({ loadOptions, filterByLoadOptions, allowCustomValue, onChange, onClose }: SelProps): JSX.Element => {\n // unfortunately <Segment/> and <SegmentAsync/> have somewhat different behavior,\n // so the simplest approach was to just create two separate wrapper-components\n return filterByLoadOptions ? (\n <SelReload loadOptions={loadOptions} allowCustomValue={allowCustomValue} onChange={onChange} onClose={onClose} />\n ) : (\n <SelSingleLoad\n loadOptions={loadOptions}\n allowCustomValue={allowCustomValue}\n onChange={onChange}\n onClose={onClose}\n />\n );\n};\n\ntype InpProps = {\n initialValue: string;\n onChange: (newVal: string) => void;\n onClose: () => void;\n};\n\nconst Inp = ({ initialValue, onChange, onClose }: InpProps): JSX.Element => {\n const [currentValue, setCurrentValue] = useShadowedState(initialValue);\n\n return (\n <Input\n autoFocus\n type=\"text\"\n spellCheck={false}\n onBlur={onClose}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onChange(currentValue);\n }\n }}\n onChange={(e) => {\n setCurrentValue(e.currentTarget.value);\n }}\n value={currentValue}\n />\n );\n};\n\nconst defaultButtonClass = css({\n width: 'auto',\n cursor: 'pointer',\n});\n\nexport const Seg = ({\n value,\n buttonClassName,\n loadOptions,\n filterByLoadOptions,\n allowCustomValue,\n onChange,\n}: Props): JSX.Element => {\n const [isOpen, setOpen] = useState(false);\n if (!isOpen) {\n const className = cx(defaultButtonClass, buttonClassName);\n return (\n <InlineLabel\n as=\"button\"\n className={className}\n onClick={() => {\n setOpen(true);\n }}\n >\n {value}\n </InlineLabel>\n );\n } else {\n if (loadOptions !== undefined) {\n return (\n <Sel\n loadOptions={loadOptions}\n filterByLoadOptions={filterByLoadOptions ?? false}\n allowCustomValue={allowCustomValue}\n onChange={(v) => {\n setOpen(false);\n onChange(v);\n }}\n onClose={() => {\n setOpen(false);\n }}\n />\n );\n } else {\n return (\n <Inp\n initialValue={value}\n onClose={() => {\n setOpen(false);\n }}\n onChange={(v) => {\n setOpen(false);\n onChange({ value: v, label: v });\n }}\n />\n );\n }\n }\n};\n","import { SelectableValue } from '@grafana/data';\n\nexport function toSelectableValue<T extends string>(t: T): SelectableValue<T> {\n return { label: t, value: t };\n}\n","import React from 'react';\n\nimport { Seg } from './Seg';\nimport { toSelectableValue } from './toSelectableValue';\n\nconst DEFAULT_POLICY = 'default';\n\n// we use the value \"default\" as a magic-value, it means\n// we use the default retention-policy.\n// unfortunately, IF the user has a retention-policy named \"default\",\n// and it is not the default-retention-policy in influxdb,\n// bad things will happen.\n// https://github.com/grafana/grafana/issues/4347 :-(\n// FIXME: we could maybe at least detect here that problem-is-happening,\n// and show an error message or something.\n// unfortunately, currently the ResponseParser does not return the\n// is-default info for the retention-policies, so that should change first.\n\ntype Props = {\n onChange: (policy: string | undefined, measurement: string | undefined) => void;\n policy: string | undefined;\n measurement: string | undefined;\n getPolicyOptions: () => Promise<string[]>;\n getMeasurementOptions: (filter: string) => Promise<string[]>;\n};\n\nexport const FromSection = ({\n policy,\n measurement,\n onChange,\n getPolicyOptions,\n getMeasurementOptions,\n}: Props): JSX.Element => {\n const handlePolicyLoadOptions = async () => {\n const allPolicies = await getPolicyOptions();\n // if `default` does not exist in the list of policies, we add it\n const allPoliciesWithDefault = allPolicies.some((p) => p === 'default')\n ? allPolicies\n : [DEFAULT_POLICY, ...allPolicies];\n\n return allPoliciesWithDefault.map(toSelectableValue);\n };\n\n const handleMeasurementLoadOptions = async (filter: string) => {\n const allMeasurements = await getMeasurementOptions(filter);\n return allMeasurements.map(toSelectableValue);\n };\n\n return (\n <>\n <Seg\n allowCustomValue\n value={policy ?? 'using default policy'}\n loadOptions={handlePolicyLoadOptions}\n onChange={(v) => {\n onChange(v.value, measurement);\n }}\n />\n <Seg\n allowCustomValue\n value={measurement ?? 'select measurement'}\n loadOptions={handleMeasurementLoadOptions}\n filterByLoadOptions\n onChange={(v) => {\n onChange(policy, v.value);\n }}\n />\n </>\n );\n};\n","import { cx } from '@emotion/css';\nimport React from 'react';\n\nimport { Input } from '@grafana/ui';\n\nimport { useShadowedState } from '../useShadowedState';\n\nimport { paddingRightClass } from './styles';\n\ntype Props = {\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n isWide?: boolean;\n placeholder?: string;\n};\n\nexport const InputSection = ({ value, onChange, isWide, placeholder }: Props): JSX.Element => {\n const [currentValue, setCurrentValue] = useShadowedState(value);\n\n const onBlur = () => {\n // we send empty-string as undefined\n const newValue = currentValue === '' ? undefined : currentValue;\n onChange(newValue);\n };\n\n return (\n <>\n <Input\n placeholder={placeholder}\n className={cx(isWide ?? false ? 'width-14' : 'width-8', paddingRightClass)}\n type=\"text\"\n spellCheck={false}\n onBlur={onBlur}\n onChange={(e) => {\n setCurrentValue(e.currentTarget.value);\n }}\n value={currentValue ?? ''}\n />\n </>\n );\n};\n","import { cx } from '@emotion/css';\nimport React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Select } from '@grafana/ui';\n\nimport { paddingRightClass } from './styles';\nimport { unwrap } from './unwrap';\n\ntype Mode = 'ASC' | 'DESC';\n\nconst OPTIONS: Array<SelectableValue<Mode>> = [\n { label: 'ascending', value: 'ASC' },\n { label: 'descending', value: 'DESC' },\n];\n\nconst className = cx('width-9', paddingRightClass);\n\ntype Props = {\n value: Mode;\n onChange: (value: Mode) => void;\n inputId?: string;\n};\n\nexport const OrderByTimeSection = ({ value, onChange, inputId }: Props): JSX.Element => {\n return (\n <>\n <Select<Mode>\n inputId={inputId}\n className={className}\n onChange={(v) => {\n onChange(unwrap(v.value));\n }}\n value={value}\n options={OPTIONS}\n />\n </>\n );\n};\n","import React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\n\nimport { Seg } from './Seg';\nimport { unwrap } from './unwrap';\n\ntype Props = {\n loadOptions: () => Promise<SelectableValue[]>;\n allowCustomValue?: boolean;\n onAdd: (v: string) => void;\n};\n\nexport const AddButton = ({ loadOptions, allowCustomValue, onAdd }: Props): JSX.Element => {\n return (\n <Seg\n value=\"+\"\n loadOptions={loadOptions}\n allowCustomValue={allowCustomValue}\n onChange={(v) => {\n onAdd(unwrap(v.value));\n }}\n />\n );\n};\n","import { cx, css } from '@emotion/css';\nimport React, { useMemo } from 'react';\n\nimport { SelectableValue, GrafanaTheme2 } from '@grafana/data';\nimport { MenuItem, WithContextMenu, MenuGroup, useTheme2 } from '@grafana/ui';\n\nimport { AddButton } from './AddButton';\nimport { Seg } from './Seg';\nimport { toSelectableValue } from './toSelectableValue';\nimport { unwrap } from './unwrap';\n\nexport type PartParams = Array<{\n value: string;\n options: (() => Promise<string[]>) | null;\n}>;\n\ntype Props = {\n parts: Array<{\n name: string;\n params: PartParams;\n }>;\n getNewPartOptions: () => Promise<SelectableValue[]>;\n onChange: (partIndex: number, paramValues: string[]) => void;\n onRemovePart: (index: number) => void;\n onAddNewPart: (type: string) => void;\n};\n\nconst renderRemovableNameMenuItems = (onClick: () => void) => {\n return (\n <MenuGroup label=\"\">\n <MenuItem label=\"remove\" onClick={onClick} />\n </MenuGroup>\n );\n};\n\nconst noRightMarginPaddingClass = css({\n paddingRight: '0',\n marginRight: '0',\n});\n\nconst RemovableName = ({ name, onRemove }: { name: string; onRemove: () => void }) => {\n return (\n <WithContextMenu renderMenuItems={() => renderRemovableNameMenuItems(onRemove)}>\n {({ openMenu }) => (\n <button className={cx('gf-form-label', noRightMarginPaddingClass)} onClick={openMenu}>\n {name}\n </button>\n )}\n </WithContextMenu>\n );\n};\n\ntype PartProps = {\n name: string;\n params: PartParams;\n onRemove: () => void;\n onChange: (paramValues: string[]) => void;\n};\n\nconst noHorizMarginPaddingClass = css({\n paddingLeft: '0',\n paddingRight: '0',\n marginLeft: '0',\n marginRight: '0',\n});\n\nconst getPartClass = (theme: GrafanaTheme2) => {\n return cx(\n 'gf-form-label',\n css({\n paddingLeft: '0',\n // gf-form-label class makes certain css attributes incorrect\n // for the selectbox-dropdown, so we have to \"reset\" them back\n lineHeight: theme.typography.body.lineHeight,\n fontSize: theme.typography.body.fontSize,\n })\n );\n};\n\nconst Part = ({ name, params, onChange, onRemove }: PartProps): JSX.Element => {\n const theme = useTheme2();\n const partClass = useMemo(() => getPartClass(theme), [theme]);\n\n const onParamChange = (par: string, i: number) => {\n const newParams = params.map((p) => p.value);\n newParams[i] = par;\n onChange(newParams);\n };\n return (\n <div className={partClass}>\n <RemovableName name={name} onRemove={onRemove} />(\n {params.map((p, i) => {\n const { value, options } = p;\n const isLast = i === params.length - 1;\n const loadOptions =\n options !== null ? () => options().then((items) => items.map(toSelectableValue)) : undefined;\n return (\n <React.Fragment key={i}>\n <Seg\n allowCustomValue\n value={value}\n buttonClassName={noHorizMarginPaddingClass}\n loadOptions={loadOptions}\n onChange={(v) => {\n onParamChange(unwrap(v.value), i);\n }}\n />\n {!isLast && ','}\n </React.Fragment>\n );\n })}\n )\n </div>\n );\n};\n\nexport const PartListSection = ({\n parts,\n getNewPartOptions,\n onAddNewPart,\n onRemovePart,\n onChange,\n}: Props): JSX.Element => {\n return (\n <>\n {parts.map((part, index) => (\n <Part\n key={index}\n name={part.name}\n params={part.params}\n onRemove={() => {\n onRemovePart(index);\n }}\n onChange={(pars) => {\n onChange(index, pars);\n }}\n />\n ))}\n <AddButton loadOptions={getNewPartOptions} onAdd={onAddNewPart} />\n </>\n );\n};\n","import { InfluxQueryTag } from '../../types';\n\nfunction isRegex(text: string): boolean {\n return /^\\/.*\\/$/.test(text);\n}\n\n// FIXME: sync these to the query-string-generation-code\n// probably it's in influx_query_model.ts\nexport function getOperator(tag: InfluxQueryTag): string {\n return tag.operator ?? (isRegex(tag.value) ? '=~' : '=');\n}\n\n// FIXME: sync these to the query-string-generation-code\n// probably it's in influx_query_model.ts\nexport function getCondition(tag: InfluxQueryTag, isFirst: boolean): string | undefined {\n return isFirst ? undefined : tag.condition ?? 'AND';\n}\n\nexport function adjustOperatorIfNeeded(currentOperator: string, newTagValue: string): string {\n const isCurrentOperatorRegex = currentOperator === '=~' || currentOperator === '!~';\n const isNewTagValueRegex = isRegex(newTagValue);\n\n if (isNewTagValueRegex) {\n return isCurrentOperatorRegex ? currentOperator : '=~';\n } else {\n return isCurrentOperatorRegex ? '=' : currentOperator;\n }\n}\n","import React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\n\nimport { InfluxQueryTag } from '../../types';\n\nimport { AddButton } from './AddButton';\nimport { Seg } from './Seg';\nimport { adjustOperatorIfNeeded, getCondition, getOperator } from './tagUtils';\nimport { toSelectableValue } from './toSelectableValue';\n\ntype KnownOperator = '=' | '!=' | '<>' | '<' | '>' | '=~' | '!~';\nconst knownOperators: KnownOperator[] = ['=', '!=', '<>', '<', '>', '=~', '!~'];\n\ntype KnownCondition = 'AND' | 'OR';\nconst knownConditions: KnownCondition[] = ['AND', 'OR'];\n\nconst operatorOptions: Array<SelectableValue<KnownOperator>> = knownOperators.map(toSelectableValue);\nconst condititonOptions: Array<SelectableValue<KnownCondition>> = knownConditions.map(toSelectableValue);\n\ntype Props = {\n tags: InfluxQueryTag[];\n onChange: (tags: InfluxQueryTag[]) => void;\n getTagKeyOptions: () => Promise<string[]>;\n getTagValueOptions: (key: string) => Promise<string[]>;\n};\n\ntype TagProps = {\n tag: InfluxQueryTag;\n isFirst: boolean;\n onRemove: () => void;\n onChange: (tag: InfluxQueryTag) => void;\n getTagKeyOptions: () => Promise<string[]>;\n getTagValueOptions: (key: string) => Promise<string[]>;\n};\n\nconst loadConditionOptions = () => Promise.resolve(condititonOptions);\n\nconst loadOperatorOptions = () => Promise.resolve(operatorOptions);\n\nconst Tag = ({ tag, isFirst, onRemove, onChange, getTagKeyOptions, getTagValueOptions }: TagProps): JSX.Element => {\n const operator = getOperator(tag);\n const condition = getCondition(tag, isFirst);\n\n const getTagKeySegmentOptions = () => {\n return getTagKeyOptions()\n .catch((err) => {\n // in this UI element we add a special item to the list of options,\n // that is used to remove the element.\n // this causes a problem: if `getTagKeyOptions` fails with an error,\n // the remove-filter option is never added to the list,\n // and the UI element can not be removed.\n // to avoid it, we catch any potential errors coming from `getTagKeyOptions`,\n // log the error, and pretend that the list of options is an empty list.\n // this way the remove-item option can always be added to the list.\n console.error(err);\n return [];\n })\n .then((tags) => [{ label: '-- remove filter --', value: undefined }, ...tags.map(toSelectableValue)]);\n };\n\n const getTagValueSegmentOptions = () => {\n return getTagValueOptions(tag.key).then((tags) => tags.map(toSelectableValue));\n };\n\n return (\n <div className=\"gf-form\">\n {condition != null && (\n <Seg\n value={condition}\n loadOptions={loadConditionOptions}\n onChange={(v) => {\n onChange({ ...tag, condition: v.value });\n }}\n />\n )}\n <Seg\n allowCustomValue\n value={tag.key}\n loadOptions={getTagKeySegmentOptions}\n onChange={(v) => {\n const { value } = v;\n if (value === undefined) {\n onRemove();\n } else {\n onChange({ ...tag, key: value ?? '' });\n }\n }}\n />\n <Seg\n value={operator}\n loadOptions={loadOperatorOptions}\n onChange={(op) => {\n onChange({ ...tag, operator: op.value });\n }}\n />\n <Seg\n allowCustomValue\n value={tag.value}\n loadOptions={getTagValueSegmentOptions}\n onChange={(v) => {\n const value = v.value ?? '';\n onChange({ ...tag, value, operator: adjustOperatorIfNeeded(operator, value) });\n }}\n />\n </div>\n );\n};\n\nexport const TagsSection = ({ tags, onChange, getTagKeyOptions, getTagValueOptions }: Props): JSX.Element => {\n const onTagChange = (newTag: InfluxQueryTag, index: number) => {\n const newTags = tags.map((tag, i) => {\n return index === i ? newTag : tag;\n });\n onChange(newTags);\n };\n\n const onTagRemove = (index: number) => {\n const newTags = tags.filter((t, i) => i !== index);\n onChange(newTags);\n };\n\n const getTagKeySegmentOptions = () => {\n return getTagKeyOptions().then((tags) => tags.map(toSelectableValue));\n };\n\n const addNewTag = (tagKey: string, isFirst: boolean) => {\n const minimalTag: InfluxQueryTag = {\n key: tagKey,\n value: 'select tag value',\n };\n\n const newTag: InfluxQueryTag = {\n key: minimalTag.key,\n value: minimalTag.value,\n operator: getOperator(minimalTag),\n condition: getCondition(minimalTag, isFirst),\n };\n\n onChange([...tags, newTag]);\n };\n\n return (\n <>\n {tags.map((t, i) => (\n <Tag\n tag={t}\n isFirst={i === 0}\n key={i}\n onChange={(newT) => {\n onTagChange(newT, i);\n }}\n onRemove={() => {\n onTagRemove(i);\n }}\n getTagKeyOptions={getTagKeyOptions}\n getTagValueOptions={getTagValueOptions}\n />\n ))}\n <AddButton\n allowCustomValue\n loadOptions={getTagKeySegmentOptions}\n onAdd={(v) => {\n addNewTag(v, tags.length === 0);\n }}\n />\n </>\n );\n};\n","import { SelectableValue } from '@grafana/data';\nimport { QueryPartDef } from 'app/features/alerting/state/query_part';\n\nimport InfluxQueryModel from '../../influx_query_model';\nimport queryPart from '../../query_part';\nimport { InfluxQuery, InfluxQueryPart } from '../../types';\n\nimport { PartParams } from './PartListSection';\nimport { toSelectableValue } from './toSelectableValue';\nimport { unwrap } from './unwrap';\n\ntype Categories = Record<string, QueryPartDef[]>;\n\nexport function getNewSelectPartOptions(): SelectableValue[] {\n const categories: Categories = queryPart.getCategories();\n const options: SelectableValue[] = [];\n\n const keys = Object.keys(categories);\n\n keys.forEach((key) => {\n const children: SelectableValue[] = categories[key].map((x) => toSelectableValue(x.type));\n\n options.push({\n label: key,\n options: children,\n });\n });\n\n return options;\n}\n\nexport async function getNewGroupByPartOptions(\n query: InfluxQuery,\n getTagKeys: () => Promise<string[]>\n): Promise<Array<SelectableValue<string>>> {\n const tagKeys = await getTagKeys();\n const queryCopy = { ...query }; // the query-model mutates the query\n const model = new InfluxQueryModel(queryCopy);\n const options: Array<SelectableValue<string>> = [];\n if (!model.hasFill()) {\n options.push(toSelectableValue('fill(null)'));\n }\n if (!model.hasGroupByTime()) {\n options.push(toSelectableValue('time($interval)'));\n }\n tagKeys.forEach((key) => {\n options.push(toSelectableValue(`tag(${key})`));\n });\n return options;\n}\n\ntype Part = {\n name: string;\n params: PartParams;\n};\n\nfunction getPartParams(part: InfluxQueryPart, dynamicParamOptions: Map<string, () => Promise<string[]>>): PartParams {\n // NOTE: the way the system is constructed,\n // there always can only be one possible dynamic-lookup\n // field. in case of select it is the field,\n // in case of group-by it is the tag\n const def = queryPart.create(part).def;\n\n // we switch the numbers to strings, it will work that way too,\n // and it makes the code simpler\n const paramValues = (part.params ?? []).map((p) => p.toString());\n\n if (paramValues.length !== def.params.length) {\n throw new Error('Invalid query-segment');\n }\n\n return paramValues.map((val, index) => {\n const defParam = def.params[index];\n if (defParam.dynamicLookup) {\n return {\n value: val,\n options: unwrap(dynamicParamOptions.get(`${def.type}_${index}`)),\n };\n }\n\n if (defParam.options != null) {\n return {\n value: val,\n options: () => Promise.resolve(defParam.options),\n };\n }\n\n return {\n value: val,\n options: null,\n };\n });\n}\n\nexport function makePartList(\n queryParts: InfluxQueryPart[],\n dynamicParamOptions: Map<string, () => Promise<string[]>>\n): Part[] {\n return queryParts.map((qp) => {\n return {\n name: qp.type,\n params: getPartParams(qp, dynamicParamOptions),\n };\n });\n}\n","import { css } from '@emotion/css';\nimport React, { useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { InlineLabel, SegmentSection, useStyles2 } from '@grafana/ui';\n\nimport InfluxDatasource from '../../datasource';\nimport {\n getAllMeasurementsForTags,\n getAllPolicies,\n getFieldKeysForMeasurement,\n getTagKeysForMeasurementAndTags,\n getTagValues,\n} from '../../influxQLMetadataQuery';\nimport {\n normalizeQuery,\n addNewSelectPart,\n removeSelectPart,\n addNewGroupByPart,\n removeGroupByPart,\n changeSelectPart,\n changeGroupByPart,\n} from '../../queryUtils';\nimport { InfluxQuery, InfluxQueryTag } from '../../types';\nimport { DEFAULT_RESULT_FORMAT } from '../constants';\nimport { useUniqueId } from '../useUniqueId';\n\nimport { FormatAsSection } from './FormatAsSection';\nimport { FromSection } from './FromSection';\nimport { InputSection } from './InputSection';\nimport { OrderByTimeSection } from './OrderByTimeSection';\nimport { PartListSection } from './PartListSection';\nimport { TagsSection } from './TagsSection';\nimport { getNewSelectPartOptions, getNewGroupByPartOptions, makePartList } from './partListUtils';\n\ntype Props = {\n query: InfluxQuery;\n onChange: (query: InfluxQuery) => void;\n onRunQuery: () => void;\n datasource: InfluxDatasource;\n};\n\nfunction getTemplateVariableOptions() {\n return (\n getTemplateSrv()\n .getVariables()\n // we make them regex-params, i'm not 100% sure why.\n // probably because this way multi-value variables work ok too.\n .map((v) => `/^$${v.name}$/`)\n );\n}\n\n// helper function to make it easy to call this from the widget-render-code\nfunction withTemplateVariableOptions(optionsPromise: Promise<string[]>): Promise<string[]> {\n return optionsPromise.then((options) => [...getTemplateVariableOptions(), ...options]);\n}\n\n// it is possible to add fields into the `InfluxQueryTag` structures, and they do work,\n// but in some cases, when we do metadata queries, we have to remove them from the queries.\nfunction filterTags(parts: InfluxQueryTag[], allTagKeys: Set<string>): InfluxQueryTag[] {\n return parts.filter((t) => allTagKeys.has(t.key));\n}\n\nexport const Editor = (props: Props): JSX.Element => {\n const uniqueId = useUniqueId();\n const formatAsId = `influxdb-qe-format-as-${uniqueId}`;\n const orderByTimeId = `influxdb-qe-order-by${uniqueId}`;\n\n const styles = useStyles2(getStyles);\n const query = normalizeQuery(props.query);\n const { datasource } = props;\n const { measurement, policy } = query;\n\n const allTagKeys = useMemo(() => {\n return getTagKeysForMeasurementAndTags(measurement, policy, [], datasource).then((tags) => {\n return new Set(tags);\n });\n }, [measurement, policy, datasource]);\n\n const selectLists = useMemo(() => {\n const dynamicSelectPartOptions = new Map([\n [\n 'field_0',\n () => {\n return measurement !== undefined\n ? getFieldKeysForMeasurement(measurement, policy, datasource)\n : Promise.resolve([]);\n },\n ],\n ]);\n return (query.select ?? []).map((sel) => makePartList(sel, dynamicSelectPartOptions));\n }, [measurement, policy, query.select, datasource]);\n\n // the following function is not complicated enough to memoize, but it's result\n // is used in both memoized and un-memoized parts, so we have no choice\n const getTagKeys = useMemo(() => {\n return () =>\n allTagKeys.then((keys) =>\n getTagKeysForMeasurementAndTags(measurement, policy, filterTags(query.tags ?? [], keys), datasource)\n );\n }, [measurement, policy, query.tags, datasource, allTagKeys]);\n\n const groupByList = useMemo(() => {\n const dynamicGroupByPartOptions = new Map([['tag_0', getTagKeys]]);\n\n return makePartList(query.groupBy ?? [], dynamicGroupByPartOptions);\n }, [getTagKeys, query.groupBy]);\n\n const onAppliedChange = (newQuery: InfluxQuery) => {\n props.onChange(newQuery);\n props.onRunQuery();\n };\n const handleFromSectionChange = (p: string | undefined, m: string | undefined) => {\n onAppliedChange({\n ...query,\n policy: p,\n measurement: m,\n });\n };\n\n const handleTagsSectionChange = (tags: InfluxQueryTag[]) => {\n // we set empty-arrays to undefined\n onAppliedChange({\n ...query,\n tags: tags.length === 0 ? undefined : tags,\n });\n };\n\n return (\n <div>\n <SegmentSection label=\"FROM\" fill={true}>\n <FromSection\n policy={policy}\n measurement={measurement}\n getPolicyOptions={() => getAllPolicies(datasource)}\n getMeasurementOptions={(filter) =>\n withTemplateVariableOptions(\n allTagKeys.then((keys) =>\n getAllMeasurementsForTags(\n filter === '' ? undefined : filter,\n filterTags(query.tags ?? [], keys),\n datasource\n )\n )\n )\n }\n onChange={handleFromSectionChange}\n />\n <InlineLabel width=\"auto\" className={styles.inlineLabel}>\n WHERE\n </InlineLabel>\n <TagsSection\n tags={query.tags ?? []}\n onChange={handleTagsSectionChange}\n getTagKeyOptions={getTagKeys}\n getTagValueOptions={(key: string) =>\n withTemplateVariableOptions(\n allTagKeys.then((keys) =>\n getTagValues(key, measurement, policy, filterTags(query.tags ?? [], keys), datasource)\n )\n )\n }\n />\n </SegmentSection>\n {selectLists.map((sel, index) => (\n <SegmentSection key={index} label={index === 0 ? 'SELECT' : ''} fill={true}>\n <PartListSection\n parts={sel}\n getNewPartOptions={() => Promise.resolve(getNewSelectPartOptions())}\n onChange={(partIndex, newParams) => {\n const newQuery = changeSelectPart(query, index, partIndex, newParams);\n onAppliedChange(newQuery);\n }}\n onAddNewPart={(type) => {\n onAppliedChange(addNewSelectPart(query, type, index));\n }}\n onRemovePart={(partIndex) => {\n onAppliedChange(removeSelectPart(query, partIndex, index));\n }}\n />\n </SegmentSection>\n ))}\n <SegmentSection label=\"GROUP BY\" fill={true}>\n <PartListSection\n parts={groupByList}\n getNewPartOptions={() => getNewGroupByPartOptions(query, getTagKeys)}\n onChange={(partIndex, newParams) => {\n const newQuery = changeGroupByPart(query, partIndex, newParams);\n onAppliedChange(newQuery);\n }}\n onAddNewPart={(type) => {\n onAppliedChange(addNewGroupByPart(query, type));\n }}\n onRemovePart={(partIndex) => {\n onAppliedChange(removeGroupByPart(query, partIndex));\n }}\n />\n </SegmentSection>\n <SegmentSection label=\"TIMEZONE\" fill={true}>\n <InputSection\n placeholder=\"(optional)\"\n value={query.tz}\n onChange={(tz) => {\n onAppliedChange({ ...query, tz });\n }}\n />\n <InlineLabel htmlFor={orderByTimeId} width=\"auto\" className={styles.inlineLabel}>\n ORDER BY TIME\n </InlineLabel>\n <OrderByTimeSection\n inputId={orderByTimeId}\n value={query.orderByTime === 'DESC' ? 'DESC' : 'ASC' /* FIXME: make this shared with influx_query_model */}\n onChange={(v) => {\n onAppliedChange({ ...query, orderByTime: v });\n }}\n />\n </SegmentSection>\n {/* query.fill is ignored in the query-editor, and it is deleted whenever\n query-editor changes. the influx_query_model still handles it, but the new\n approach seem to be to handle \"fill\" inside query.groupBy. so, if you\n have a panel where in the json you have query.fill, it will be applied,\n as long as you do not edit that query. */}\n <SegmentSection label=\"LIMIT\" fill={true}>\n <InputSection\n placeholder=\"(optional)\"\n value={query.limit?.toString()}\n onChange={(limit) => {\n onAppliedChange({ ...query, limit });\n }}\n />\n <InlineLabel width=\"auto\" className={styles.inlineLabel}>\n SLIMIT\n </InlineLabel>\n <InputSection\n placeholder=\"(optional)\"\n value={query.slimit?.toString()}\n onChange={(slimit) => {\n onAppliedChange({ ...query, slimit });\n }}\n />\n </SegmentSection>\n <SegmentSection htmlFor={formatAsId} label=\"FORMAT AS\" fill={true}>\n <FormatAsSection\n inputId={formatAsId}\n format={query.resultFormat ?? DEFAULT_RESULT_FORMAT}\n onChange={(format) => {\n onAppliedChange({ ...query, resultFormat: format });\n }}\n />\n {query.resultFormat !== 'table' && (\n <>\n <InlineLabel width=\"auto\" className={styles.inlineLabel}>\n ALIAS\n </InlineLabel>\n <InputSection\n isWide\n placeholder=\"Naming pattern\"\n value={query.alias}\n onChange={(alias) => {\n onAppliedChange({ ...query, alias });\n }}\n />\n </>\n )}\n </SegmentSection>\n </div>\n );\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n inlineLabel: css`\n color: ${theme.colors.primary.text};\n `,\n };\n}\n","import React, { PureComponent } from 'react';\n\nimport { InlineFormLabel, TextArea } from '@grafana/ui';\n\nimport InfluxDatasource from '../datasource';\n\nimport { FluxQueryEditor } from './FluxQueryEditor';\n\ninterface Props {\n query: string; // before flux, it was always a string\n onChange: (query?: string) => void;\n datasource: InfluxDatasource;\n}\n\nexport default class VariableQueryEditor extends PureComponent<Props> {\n onRefresh = () => {\n // noop\n };\n\n render() {\n let { query, datasource, onChange } = this.props;\n if (datasource.isFlux) {\n return (\n <FluxQueryEditor\n datasource={datasource}\n query={{\n refId: 'A',\n query,\n }}\n onRunQuery={this.onRefresh}\n onChange={(v) => onChange(v.query)}\n />\n );\n }\n\n return (\n <div className=\"gf-form-inline\">\n <InlineFormLabel width={10}>Query</InlineFormLabel>\n <div className=\"gf-form-inline gf-form--grow\">\n <TextArea\n defaultValue={query || ''}\n placeholder=\"metric name or tags query\"\n rows={1}\n className=\"gf-form-input\"\n onBlur={(e) => onChange(e.currentTarget.value)}\n />\n </div>\n </div>\n );\n }\n}\n","import { each, map, includes, flatten, keys } from 'lodash';\n\nimport { FieldType, QueryResultMeta, TimeSeries, TableData } from '@grafana/data';\nimport TableModel from 'app/core/table_model';\n\nexport default class InfluxSeries {\n refId?: string;\n series: any;\n alias: any;\n annotation: any;\n meta?: QueryResultMeta;\n\n constructor(options: { series: any; alias?: any; annotation?: any; meta?: QueryResultMeta; refId?: string }) {\n this.series = options.series;\n this.alias = options.alias;\n this.annotation = options.annotation;\n this.meta = options.meta;\n this.refId = options.refId;\n }\n\n getTimeSeries(): TimeSeries[] {\n const output: TimeSeries[] = [];\n let i, j;\n\n if (this.series.length === 0) {\n return output;\n }\n\n each(this.series, (series) => {\n const columns = series.columns.length;\n const tags = map(series.tags, (value, key) => {\n return key + ': ' + value;\n });\n\n for (j = 1; j < columns; j++) {\n let seriesName = series.name;\n const columnName = series.columns[j];\n if (columnName !== 'value') {\n seriesName = seriesName + '.' + columnName;\n }\n\n if (this.alias) {\n seriesName = this._getSeriesName(series, j);\n } else if (series.tags) {\n seriesName = seriesName + ' {' + tags.join(', ') + '}';\n }\n\n const datapoints = [];\n if (series.values) {\n for (i = 0; i < series.values.length; i++) {\n datapoints[i] = [series.values[i][j], series.values[i][0]];\n }\n }\n\n output.push({\n title: seriesName,\n target: seriesName,\n datapoints: datapoints,\n tags: series.tags,\n meta: this.meta,\n refId: this.refId,\n });\n }\n });\n\n return output;\n }\n\n _getSeriesName(series: any, index: number) {\n const regex = /\\$(\\w+)|\\[\\[([\\s\\S]+?)\\]\\]/g;\n const segments = series.name.split('.');\n\n return this.alias.replace(regex, (match: any, g1: any, g2: any) => {\n const group = g1 || g2;\n const segIndex = parseInt(group, 10);\n\n if (group === 'm' || group === 'measurement') {\n return series.name;\n }\n if (group === 'col') {\n return series.columns[index];\n }\n if (!isNaN(segIndex)) {\n return segments[segIndex] ?? match;\n }\n if (group.indexOf('tag_') !== 0) {\n return match;\n }\n\n const tag = group.replace('tag_', '');\n if (!series.tags) {\n return match;\n }\n return series.tags[tag];\n });\n }\n\n getAnnotations() {\n const list: any[] = [];\n\n each(this.series, (series) => {\n let titleCol: any = null;\n let timeCol: any = null;\n let timeEndCol: any = null;\n const tagsCol: any = [];\n let textCol: any = null;\n\n each(series.columns, (column, index) => {\n if (column === 'time') {\n timeCol = index;\n return;\n }\n if (column === 'sequence_number') {\n return;\n }\n if (column === this.annotation.titleColumn) {\n titleCol = index;\n return;\n }\n if (includes((this.annotation.tagsColumn || '').replace(' ', '').split(','), column)) {\n tagsCol.push(index);\n return;\n }\n if (column === this.annotation.textColumn) {\n textCol = index;\n return;\n }\n if (column === this.annotation.timeEndColumn) {\n timeEndCol = index;\n return;\n }\n // legacy case\n if (!titleCol && textCol !== index) {\n titleCol = index;\n }\n });\n\n each(series.values, (value) => {\n const data = {\n annotation: this.annotation,\n time: +new Date(value[timeCol]),\n title: value[titleCol],\n timeEnd: value[timeEndCol],\n // Remove empty values, then split in different tags for comma separated values\n tags: flatten(\n tagsCol\n .filter((t: any) => {\n return value[t];\n })\n .map((t: any) => {\n return value[t].split(',');\n })\n ),\n text: value[textCol],\n };\n\n list.push(data);\n });\n });\n\n return list;\n }\n\n getTable(): TableData {\n const table = new TableModel();\n let i, j;\n\n table.refId = this.refId;\n table.meta = this.meta;\n\n if (this.series.length === 0) {\n return table;\n }\n\n // the order is:\n // - first the first item from the value-array (this is often (always?) the timestamp)\n // - then all the tag-values\n // - then the rest of the value-array\n //\n // we have to keep this order both in table.columns and table.rows\n\n each(this.series, (series: any, seriesIndex: number) => {\n if (seriesIndex === 0) {\n const firstCol = series.columns[0];\n // Check the first column's name, if it is `time`, we\n // mark it as having the type time\n const firstTableCol = firstCol === 'time' ? { text: 'Time', type: FieldType.time } : { text: firstCol };\n table.columns.push(firstTableCol);\n each(keys(series.tags), (key) => {\n table.columns.push({ text: key });\n });\n for (j = 1; j < series.columns.length; j++) {\n table.columns.push({ text: series.columns[j] });\n }\n }\n\n if (series.values) {\n for (i = 0; i < series.values.length; i++) {\n const values = series.values[i];\n const reordered = [values[0]];\n if (series.tags) {\n for (const key in series.tags) {\n if (series.tags.hasOwnProperty(key)) {\n reordered.push(series.tags[key]);\n }\n }\n }\n for (j = 1; j < values.length; j++) {\n reordered.push(values[j]);\n }\n table.rows.push(reordered);\n }\n }\n });\n\n return table;\n }\n}\n","import { each, flatten, groupBy, isArray } from 'lodash';\n\nimport { AnnotationEvent, DataFrame, DataQuery, FieldType, QueryResultMeta } from '@grafana/data';\nimport { toDataQueryResponse } from '@grafana/runtime';\nimport TableModel from 'app/core/table_model';\n\nimport { InfluxQuery } from './types';\n\nexport default class ResponseParser {\n parse(query: string, results: { results: any }) {\n if (!results?.results || results.results.length === 0) {\n return [];\n }\n\n const influxResults = results.results[0];\n if (!influxResults.series) {\n return [];\n }\n\n const normalizedQuery = query.toLowerCase();\n const isValueFirst =\n normalizedQuery.indexOf('show field keys') >= 0 || normalizedQuery.indexOf('show retention policies') >= 0;\n\n const res = new Set<string>();\n each(influxResults.series, (serie) => {\n each(serie.values, (value) => {\n if (isArray(value)) {\n // In general, there are 2 possible shapes for the returned value.\n // The first one is a two-element array,\n // where the first element is somewhat a metadata value:\n // the tag name for SHOW TAG VALUES queries,\n // the time field for SELECT queries, etc.\n // The second shape is an one-element array,\n // that is containing an immediate value.\n // For example, SHOW FIELD KEYS queries return such shape.\n // Note, pre-0.11 versions return\n // the second shape for SHOW TAG VALUES queries\n // (while the newer versions—first).\n\n if (isValueFirst) {\n addUnique(res, value[0]);\n } else if (value[1] !== undefined) {\n addUnique(res, value[1]);\n } else {\n addUnique(res, value[0]);\n }\n } else {\n addUnique(res, value);\n }\n });\n });\n\n // NOTE: it is important to keep the order of items in the parsed output\n // the same as it was in the influxdb-response.\n // we use a `Set` to collect the unique-results, and `Set` iteration\n // order is insertion-order, so this should be ok.\n return Array.from(res).map((v) => ({ text: v }));\n }\n\n getTable(dfs: DataFrame[], target: InfluxQuery, meta: QueryResultMeta): TableModel {\n let table = new TableModel();\n\n if (dfs.length > 0) {\n table.meta = {\n ...meta,\n executedQueryString: dfs[0].meta?.executedQueryString,\n };\n\n table.refId = target.refId;\n table = getTableCols(dfs, table, target);\n\n // if group by tag(s) added\n if (dfs[0].fields[1] && dfs[0].fields[1].labels) {\n let dfsByLabels: any = groupBy(dfs, (df: DataFrame) =>\n df.fields[1].labels ? Object.values(df.fields[1].labels!) : null\n );\n const labels = Object.keys(dfsByLabels);\n dfsByLabels = Object.values(dfsByLabels);\n\n for (let i = 0; i < dfsByLabels.length; i++) {\n table = getTableRows(dfsByLabels[i], table, [...labels[i].split(',')]);\n }\n } else {\n table = getTableRows(dfs, table, []);\n }\n }\n\n return table;\n }\n\n async transformAnnotationResponse(options: any, data: any, target: InfluxQuery): Promise<AnnotationEvent[]> {\n const rsp = toDataQueryResponse(data, [target] as DataQuery[]);\n\n if (rsp) {\n const table = this.getTable(rsp.data, target, {});\n const list: any[] = [];\n let titleCol: any = null;\n let timeCol: any = null;\n let timeEndCol: any = null;\n const tagsCol: any = [];\n let textCol: any = null;\n\n each(table.columns, (column, index) => {\n if (column.text.toLowerCase() === 'time') {\n timeCol = index;\n return;\n }\n if (column.text === options.annotation.titleColumn) {\n titleCol = index;\n return;\n }\n if (colContainsTag(column.text, options.annotation.tagsColumn)) {\n tagsCol.push(index);\n return;\n }\n if (column.text.includes(options.annotation.textColumn)) {\n textCol = index;\n return;\n }\n if (column.text === options.annotation.timeEndColumn) {\n timeEndCol = index;\n return;\n }\n // legacy case\n if (!titleCol && textCol !== index) {\n titleCol = index;\n }\n });\n\n each(table.rows, (value) => {\n const data = {\n annotation: options.annotation,\n time: +new Date(value[timeCol]),\n title: value[titleCol],\n timeEnd: value[timeEndCol],\n // Remove empty values, then split in different tags for comma separated values\n tags: flatten(\n tagsCol\n .filter((t: any) => {\n return value[t];\n })\n .map((t: any) => {\n return value[t].split(',');\n })\n ),\n text: value[textCol],\n };\n\n list.push(data);\n });\n\n return list;\n }\n return [];\n }\n}\n\nfunction colContainsTag(colText: string, tagsColumn: string): boolean {\n const tags = (tagsColumn || '').replace(' ', '').split(',');\n for (var tag of tags) {\n if (colText.includes(tag)) {\n return true;\n }\n }\n return false;\n}\n\nfunction getTableCols(dfs: DataFrame[], table: TableModel, target: InfluxQuery): TableModel {\n const selectedParams = getSelectedParams(target);\n\n dfs[0].fields.forEach((field) => {\n // Time col\n if (field.name === 'time') {\n table.columns.push({ text: 'Time', type: FieldType.time });\n }\n\n // Group by (label) column(s)\n else if (field.name === 'value') {\n if (field.labels) {\n Object.keys(field.labels).forEach((key) => {\n table.columns.push({ text: key });\n });\n }\n }\n });\n\n // Get cols for annotationQuery\n if (dfs[0].refId === 'metricFindQuery') {\n dfs.forEach((field) => {\n if (field.name) {\n table.columns.push({ text: field.name });\n }\n });\n }\n\n // Select (metric) column(s)\n for (let i = 0; i < selectedParams.length; i++) {\n table.columns.push({ text: selectedParams[i] });\n }\n\n return table;\n}\n\nfunction getTableRows(dfs: DataFrame[], table: TableModel, labels: string[]): TableModel {\n const values = dfs[0].fields[0].values.toArray();\n\n for (let i = 0; i < values.length; i++) {\n const time = values[i];\n const metrics = dfs.map((df: DataFrame) => {\n return df.fields[1] ? df.fields[1].values.toArray()[i] : null;\n });\n if (metrics.indexOf(null) < 0) {\n table.rows.push([time, ...labels, ...metrics]);\n }\n }\n return table;\n}\n\nexport function getSelectedParams(target: InfluxQuery): string[] {\n let allParams: string[] = [];\n target.select?.forEach((select) => {\n const selector = select.filter((x) => x.type !== 'field');\n if (selector.length > 0) {\n allParams.push(selector[0].type);\n } else {\n if (select[0] && select[0].params && select[0].params[0]) {\n allParams.push(select[0].params[0].toString());\n }\n }\n });\n\n let uniqueParams: string[] = [];\n allParams.forEach((param) => {\n uniqueParams.push(incrementName(param, param, uniqueParams, 0));\n });\n\n return uniqueParams;\n}\n\nfunction incrementName(name: string, nameIncremenet: string, params: string[], index: number): string {\n if (params.indexOf(nameIncremenet) > -1) {\n index++;\n return incrementName(name, name + '_' + index, params, index);\n }\n return nameIncremenet;\n}\n\nfunction addUnique(s: Set<string>, value: string | number) {\n s.add(value.toString());\n}\n","import { cloneDeep, extend, get, groupBy, has, isString, map as _map, omit, pick, reduce } from 'lodash';\nimport { lastValueFrom, Observable, of, throwError } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n AnnotationEvent,\n AnnotationQueryRequest,\n ArrayVector,\n DataFrame,\n DataQueryError,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n dateMath,\n dateTime,\n FieldType,\n LoadingState,\n MetricFindValue,\n QueryResultMeta,\n ScopedVars,\n TIME_SERIES_TIME_FIELD_NAME,\n TIME_SERIES_VALUE_FIELD_NAME,\n TimeSeries,\n} from '@grafana/data';\nimport {\n BackendDataSourceResponse,\n DataSourceWithBackend,\n FetchResponse,\n frameToMetricFindValue,\n getBackendSrv,\n} from '@grafana/runtime';\nimport config from 'app/core/config';\nimport { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_srv';\n\nimport { FluxQueryEditor } from './components/FluxQueryEditor';\nimport InfluxQueryModel from './influx_query_model';\nimport InfluxSeries from './influx_series';\nimport { buildRawQuery } from './queryUtils';\nimport { InfluxQueryBuilder } from './query_builder';\nimport ResponseParser from './response_parser';\nimport { InfluxOptions, InfluxQuery, InfluxVersion } from './types';\n\n// we detect the field type based on the value-array\nfunction getFieldType(values: unknown[]): FieldType {\n // the values-array may contain a lot of nulls.\n // we need the first not-null item\n const firstNotNull = values.find((v) => v !== null);\n\n if (firstNotNull === undefined) {\n // we could not find any not-null values\n return FieldType.number;\n }\n\n const valueType = typeof firstNotNull;\n\n switch (valueType) {\n case 'string':\n return FieldType.string;\n case 'boolean':\n return FieldType.boolean;\n case 'number':\n return FieldType.number;\n default:\n // this should never happen, influxql values\n // can only be numbers, strings and booleans.\n throw new Error(`InfluxQL: invalid value type ${valueType}`);\n }\n}\n\n// this conversion function is specialized to work with the timeseries\n// data returned by InfluxDatasource.getTimeSeries()\nfunction timeSeriesToDataFrame(timeSeries: TimeSeries): DataFrame {\n const times: number[] = [];\n const values: unknown[] = [];\n\n // the data we process here is not correctly typed.\n // the typescript types say every data-point is number|null,\n // but in fact it can be string or boolean too.\n\n const points = timeSeries.datapoints;\n for (const point of points) {\n values.push(point[0]);\n times.push(point[1] as number);\n }\n\n const timeField = {\n name: TIME_SERIES_TIME_FIELD_NAME,\n type: FieldType.time,\n config: {},\n values: new ArrayVector<number>(times),\n };\n\n const valueField = {\n name: TIME_SERIES_VALUE_FIELD_NAME,\n type: getFieldType(values),\n config: {\n displayNameFromDS: timeSeries.title,\n },\n values: new ArrayVector<unknown>(values),\n labels: timeSeries.tags,\n };\n\n const fields = [timeField, valueField];\n\n return {\n name: timeSeries.target,\n refId: timeSeries.refId,\n meta: timeSeries.meta,\n fields,\n length: values.length,\n };\n}\n\nexport default class InfluxDatasource extends DataSourceWithBackend<InfluxQuery, InfluxOptions> {\n type: string;\n urls: string[];\n username: string;\n password: string;\n name: string;\n database: any;\n basicAuth: any;\n withCredentials: any;\n access: 'direct' | 'proxy';\n interval: any;\n responseParser: any;\n httpMode: string;\n isFlux: boolean;\n\n constructor(\n instanceSettings: DataSourceInstanceSettings<InfluxOptions>,\n private readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n\n this.type = 'influxdb';\n this.urls = (instanceSettings.url ?? '').split(',').map((url) => {\n return url.trim();\n });\n\n this.username = instanceSettings.username ?? '';\n this.password = instanceSettings.password ?? '';\n this.name = instanceSettings.name;\n this.database = instanceSettings.database;\n this.basicAuth = instanceSettings.basicAuth;\n this.withCredentials = instanceSettings.withCredentials;\n this.access = instanceSettings.access;\n const settingsData = instanceSettings.jsonData || ({} as InfluxOptions);\n this.interval = settingsData.timeInterval;\n this.httpMode = settingsData.httpMode || 'GET';\n this.responseParser = new ResponseParser();\n this.isFlux = settingsData.version === InfluxVersion.Flux;\n\n if (this.isFlux) {\n // When flux, use an annotation processor rather than the `annotationQuery` lifecycle\n this.annotations = {\n QueryEditor: FluxQueryEditor,\n };\n }\n }\n\n query(request: DataQueryRequest<InfluxQuery>): Observable<DataQueryResponse> {\n // for not-flux queries we call `this.classicQuery`, and that\n // handles the is-hidden situation.\n // for the flux-case, we do the filtering here\n const filteredRequest = {\n ...request,\n targets: request.targets.filter((t) => t.hide !== true),\n };\n\n if (this.isFlux) {\n return super.query(filteredRequest);\n }\n\n if (this.isMigrationToggleOnAndIsAccessProxy()) {\n return super.query(filteredRequest).pipe(\n map((res) => {\n if (res.error) {\n throw {\n message: 'InfluxDB Error: ' + res.error.message,\n res,\n };\n }\n\n const seriesList: any[] = [];\n\n const groupedFrames = groupBy(res.data, (x) => x.refId);\n if (Object.keys(groupedFrames).length > 0) {\n filteredRequest.targets.forEach((target) => {\n const filteredFrames = groupedFrames[target.refId] ?? [];\n switch (target.resultFormat) {\n case 'logs':\n case 'table':\n seriesList.push(\n this.responseParser.getTable(filteredFrames, target, {\n preferredVisualisationType: target.resultFormat,\n })\n );\n break;\n default: {\n for (let i = 0; i < filteredFrames.length; i++) {\n seriesList.push(filteredFrames[i]);\n }\n break;\n }\n }\n });\n }\n\n return { data: seriesList };\n })\n );\n }\n\n // Fallback to classic query support\n return this.classicQuery(request);\n }\n\n getQueryDisplayText(query: InfluxQuery) {\n if (this.isFlux) {\n return query.query;\n }\n return new InfluxQueryModel(query).render(false);\n }\n\n /**\n * Returns false if the query should be skipped\n */\n filterQuery(query: InfluxQuery): boolean {\n if (this.isFlux) {\n return !!query.query;\n }\n return true;\n }\n\n applyTemplateVariables(query: InfluxQuery, scopedVars: ScopedVars): Record<string, any> {\n // We want to interpolate these variables on backend\n const { __interval, __interval_ms, ...rest } = scopedVars;\n\n if (this.isFlux) {\n return {\n ...query,\n query: this.templateSrv.replace(query.query ?? '', rest), // The raw query text\n };\n }\n\n if (config.featureToggles.influxdbBackendMigration && this.access === 'proxy') {\n query = this.applyVariables(query, scopedVars, rest);\n }\n\n return query;\n }\n\n /**\n * The unchanged pre 7.1 query implementation\n */\n classicQuery(options: any): Observable<DataQueryResponse> {\n let timeFilter = this.getTimeFilter(options);\n const scopedVars = options.scopedVars;\n const targets = cloneDeep(options.targets);\n const queryTargets: any[] = [];\n\n let i, y;\n\n let allQueries = _map(targets, (target) => {\n if (target.hide) {\n return '';\n }\n\n queryTargets.push(target);\n\n // backward compatibility\n scopedVars.interval = scopedVars.__interval;\n\n return new InfluxQueryModel(target, this.templateSrv, scopedVars).render(true);\n }).reduce((acc, current) => {\n if (current !== '') {\n acc += ';' + current;\n }\n return acc;\n });\n\n if (allQueries === '') {\n return of({ data: [] });\n }\n\n // add global adhoc filters to timeFilter\n const adhocFilters = this.templateSrv.getAdhocFilters(this.name);\n if (adhocFilters.length > 0) {\n const tmpQuery = new InfluxQueryModel({ refId: 'A' }, this.templateSrv, scopedVars);\n timeFilter += ' AND ' + tmpQuery.renderAdhocFilters(adhocFilters);\n }\n\n // replace grafana variables\n scopedVars.timeFilter = { value: timeFilter };\n\n // replace templated variables\n allQueries = this.templateSrv.replace(allQueries, scopedVars);\n\n return this._seriesQuery(allQueries, options).pipe(\n map((data: any) => {\n if (!data || !data.results) {\n return { data: [] };\n }\n\n const seriesList = [];\n for (i = 0; i < data.results.length; i++) {\n const result = data.results[i];\n if (!result || !result.series) {\n continue;\n }\n\n const target = queryTargets[i];\n let alias = target.alias;\n if (alias) {\n alias = this.templateSrv.replace(target.alias, options.scopedVars);\n }\n\n const meta: QueryResultMeta = {\n executedQueryString: data.executedQueryString,\n };\n\n const influxSeries = new InfluxSeries({\n refId: target.refId,\n series: data.results[i].series,\n alias: alias,\n meta,\n });\n\n switch (target.resultFormat) {\n case 'logs':\n meta.preferredVisualisationType = 'logs';\n case 'table': {\n seriesList.push(influxSeries.getTable());\n break;\n }\n default: {\n const timeSeries = influxSeries.getTimeSeries();\n for (y = 0; y < timeSeries.length; y++) {\n seriesList.push(timeSeriesToDataFrame(timeSeries[y]));\n }\n break;\n }\n }\n }\n\n return { data: seriesList };\n })\n );\n }\n\n async annotationQuery(options: AnnotationQueryRequest<any>): Promise<AnnotationEvent[]> {\n if (this.isFlux) {\n return Promise.reject({\n message: 'Flux requires the standard annotation query',\n });\n }\n\n // InfluxQL puts a query string on the annotation\n if (!options.annotation.query) {\n return Promise.reject({\n message: 'Query missing in annotation definition',\n });\n }\n\n if (config.featureToggles.influxdbBackendMigration && this.access === 'proxy') {\n // We want to send our query to the backend as a raw query\n const target: InfluxQuery = {\n refId: 'metricFindQuery',\n datasource: this.getRef(),\n query: this.templateSrv.replace(options.annotation.query ?? '', undefined, 'regex'),\n rawQuery: true,\n };\n\n return lastValueFrom(\n getBackendSrv()\n .fetch<BackendDataSourceResponse>({\n url: '/api/ds/query',\n method: 'POST',\n data: {\n from: options.range.from.valueOf().toString(),\n to: options.range.to.valueOf().toString(),\n queries: [target],\n },\n requestId: options.annotation.name,\n })\n .pipe(\n map(\n async (res: FetchResponse<BackendDataSourceResponse>) =>\n await this.responseParser.transformAnnotationResponse(options, res, target)\n )\n )\n );\n }\n\n const timeFilter = this.getTimeFilter({ rangeRaw: options.rangeRaw, timezone: options.dashboard.timezone });\n let query = options.annotation.query.replace('$timeFilter', timeFilter);\n query = this.templateSrv.replace(query, undefined, 'regex');\n\n return lastValueFrom(this._seriesQuery(query, options)).then((data: any) => {\n if (!data || !data.results || !data.results[0]) {\n throw { message: 'No results in response from InfluxDB' };\n }\n return new InfluxSeries({\n series: data.results[0].series,\n annotation: options.annotation,\n }).getAnnotations();\n });\n }\n\n targetContainsTemplate(target: any) {\n // for flux-mode we just take target.query,\n // for influxql-mode we use InfluxQueryModel to create the text-representation\n const queryText = this.isFlux ? target.query : buildRawQuery(target);\n\n return this.templateSrv.containsTemplate(queryText);\n }\n\n interpolateVariablesInQueries(queries: InfluxQuery[], scopedVars: ScopedVars): InfluxQuery[] {\n if (!queries || queries.length === 0) {\n return [];\n }\n\n return queries.map((query) => {\n if (this.isFlux) {\n return {\n ...query,\n datasource: this.getRef(),\n query: this.templateSrv.replace(query.query ?? '', scopedVars, 'regex'), // The raw query text\n };\n }\n\n return {\n ...query,\n datasource: this.getRef(),\n ...this.applyVariables(query, scopedVars, scopedVars),\n };\n });\n }\n\n applyVariables(query: InfluxQuery, scopedVars: ScopedVars, rest: ScopedVars) {\n const expandedQuery = { ...query };\n if (query.groupBy) {\n expandedQuery.groupBy = query.groupBy.map((groupBy) => {\n return {\n ...groupBy,\n params: groupBy.params?.map((param) => {\n return this.templateSrv.replace(param.toString(), undefined, 'regex');\n }),\n };\n });\n }\n\n if (query.select) {\n expandedQuery.select = query.select.map((selects) => {\n return selects.map((select: any) => {\n return {\n ...select,\n params: select.params?.map((param: any) => {\n return this.templateSrv.replace(param.toString(), undefined, 'regex');\n }),\n };\n });\n });\n }\n\n if (query.tags) {\n expandedQuery.tags = query.tags.map((tag) => {\n return {\n ...tag,\n value: this.templateSrv.replace(tag.value, undefined, 'regex'),\n };\n });\n }\n\n return {\n ...expandedQuery,\n query: this.templateSrv.replace(query.query ?? '', rest, 'regex'), // The raw query text\n alias: this.templateSrv.replace(query.alias ?? '', scopedVars),\n limit: this.templateSrv.replace(query.limit?.toString() ?? '', scopedVars, 'regex'),\n measurement: this.templateSrv.replace(query.measurement ?? '', scopedVars, 'regex'),\n policy: this.templateSrv.replace(query.policy ?? '', scopedVars, 'regex'),\n slimit: this.templateSrv.replace(query.slimit?.toString() ?? '', scopedVars, 'regex'),\n tz: this.templateSrv.replace(query.tz ?? '', scopedVars),\n };\n }\n\n async metricFindQuery(query: string, options?: any): Promise<MetricFindValue[]> {\n if (this.isFlux || this.isMigrationToggleOnAndIsAccessProxy()) {\n const target: InfluxQuery = {\n refId: 'metricFindQuery',\n query,\n rawQuery: true,\n };\n return lastValueFrom(\n super.query({\n ...options, // includes 'range'\n targets: [target],\n } as DataQueryRequest)\n ).then((rsp) => {\n if (rsp.data?.length) {\n return frameToMetricFindValue(rsp.data[0]);\n }\n return [];\n });\n }\n\n const interpolated = this.templateSrv.replace(query, undefined, 'regex');\n\n return lastValueFrom(this._seriesQuery(interpolated, options)).then((resp) => {\n return this.responseParser.parse(query, resp);\n });\n }\n\n getTagKeys(options: any = {}) {\n const queryBuilder = new InfluxQueryBuilder({ measurement: options.measurement || '', tags: [] }, this.database);\n const query = queryBuilder.buildExploreQuery('TAG_KEYS');\n return this.metricFindQuery(query, options);\n }\n\n getTagValues(options: any = {}) {\n const queryBuilder = new InfluxQueryBuilder({ measurement: options.measurement || '', tags: [] }, this.database);\n const query = queryBuilder.buildExploreQuery('TAG_VALUES', options.key);\n return this.metricFindQuery(query, options);\n }\n\n _seriesQuery(query: string, options?: any) {\n if (!query) {\n return of({ results: [] });\n }\n\n if (options && options.range) {\n const timeFilter = this.getTimeFilter({ rangeRaw: options.range, timezone: options.timezone });\n query = query.replace('$timeFilter', timeFilter);\n }\n\n return this._influxRequest(this.httpMode, '/query', { q: query, epoch: 'ms' }, options);\n }\n\n serializeParams(params: any) {\n if (!params) {\n return '';\n }\n\n return reduce(\n params,\n (memo, value, key) => {\n if (value === null || value === undefined) {\n return memo;\n }\n memo.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n return memo;\n },\n [] as string[]\n ).join('&');\n }\n\n testDatasource() {\n if (this.isFlux) {\n // TODO: eventually use the real /health endpoint\n const request: DataQueryRequest<InfluxQuery> = {\n targets: [{ refId: 'test', query: 'buckets()' }],\n requestId: `${this.id}-health-${uuidv4()}`,\n dashboardId: 0,\n panelId: 0,\n interval: '1m',\n intervalMs: 60000,\n maxDataPoints: 423,\n range: {\n from: dateTime(1000),\n to: dateTime(2000),\n },\n } as DataQueryRequest<InfluxQuery>;\n\n return lastValueFrom(super.query(request))\n .then((res: DataQueryResponse) => {\n if (!res || !res.data || res.state !== LoadingState.Done) {\n console.error('InfluxDB Error', res);\n return { status: 'error', message: 'Error reading InfluxDB' };\n }\n const first = res.data[0];\n if (first && first.length) {\n return { status: 'success', message: `${first.length} buckets found` };\n }\n console.error('InfluxDB Error', res);\n return { status: 'error', message: 'Error reading buckets' };\n })\n .catch((err: any) => {\n console.error('InfluxDB Error', err);\n return { status: 'error', message: err.message };\n });\n }\n\n if (this.isMigrationToggleOnAndIsAccessProxy()) {\n const target: InfluxQuery = {\n refId: 'metricFindQuery',\n query: 'SHOW TAG KEYS',\n rawQuery: true,\n };\n return lastValueFrom(super.query({ targets: [target] } as DataQueryRequest))\n .then((res: DataQueryResponse) => {\n if (!res || !res.data || res.state !== LoadingState.Done) {\n return {\n status: 'error',\n message: 'Error reading InfluxDB.',\n };\n }\n if (res.data?.length) {\n return { status: 'success', message: 'Data source is working.' };\n }\n return {\n status: 'error',\n message: 'Successfully connected to InfluxDB, but no tags found.',\n };\n })\n .catch((err: any) => {\n return { status: 'error', message: err.message };\n });\n }\n\n const queryBuilder = new InfluxQueryBuilder({ measurement: '', tags: [] }, this.database);\n const query = queryBuilder.buildExploreQuery('RETENTION POLICIES');\n\n return lastValueFrom(this._seriesQuery(query))\n .then((res: any) => {\n const error = get(res, 'results[0].error');\n if (error) {\n return { status: 'error', message: error };\n }\n return { status: 'success', message: 'Data source is working' };\n })\n .catch((err: any) => {\n return { status: 'error', message: err.message };\n });\n }\n\n _influxRequest(method: string, url: string, data: any, options?: any) {\n const currentUrl = this.urls.shift()!;\n this.urls.push(currentUrl);\n\n const params: any = {};\n\n if (this.username) {\n params.u = this.username;\n params.p = this.password;\n }\n\n if (options && options.database) {\n params.db = options.database;\n } else if (this.database) {\n params.db = this.database;\n }\n\n const { q } = data;\n\n if (method === 'POST' && has(data, 'q')) {\n // verb is POST and 'q' param is defined\n extend(params, omit(data, ['q']));\n data = this.serializeParams(pick(data, ['q']));\n } else if (method === 'GET' || method === 'POST') {\n // verb is GET, or POST without 'q' param\n extend(params, data);\n data = null;\n }\n\n const req: any = {\n method: method,\n url: currentUrl + url,\n params: params,\n data: data,\n precision: 'ms',\n inspect: { type: 'influxdb' },\n paramSerializer: this.serializeParams,\n };\n\n req.headers = req.headers || {};\n if (this.basicAuth || this.withCredentials) {\n req.withCredentials = true;\n }\n if (this.basicAuth) {\n req.headers.Authorization = this.basicAuth;\n }\n\n if (method === 'POST') {\n req.headers['Content-type'] = 'application/x-www-form-urlencoded';\n }\n\n return getBackendSrv()\n .fetch(req)\n .pipe(\n map((result: any) => {\n const { data } = result;\n if (data) {\n data.executedQueryString = q;\n if (data.results) {\n const errors = result.data.results.filter((elem: any) => elem.error);\n\n if (errors.length > 0) {\n throw {\n message: 'InfluxDB Error: ' + errors[0].error,\n data,\n };\n }\n }\n }\n return data;\n }),\n catchError((err) => {\n if (err.cancelled) {\n return of(err);\n }\n\n return throwError(this.handleErrors(err));\n })\n );\n }\n\n handleErrors(err: any) {\n const error: DataQueryError = {\n message:\n (err && err.status) ||\n (err && err.message) ||\n 'Unknown error during query transaction. Please check JS console logs.',\n };\n\n if ((Number.isInteger(err.status) && err.status !== 0) || err.status >= 300) {\n if (err.data && err.data.error) {\n error.message = 'InfluxDB Error: ' + err.data.error;\n error.data = err.data;\n // @ts-ignore\n error.config = err.config;\n } else {\n error.message = 'Network Error: ' + err.statusText + '(' + err.status + ')';\n error.data = err.data;\n // @ts-ignore\n error.config = err.config;\n }\n }\n\n return error;\n }\n\n getTimeFilter(options: any) {\n const from = this.getInfluxTime(options.rangeRaw.from, false, options.timezone);\n const until = this.getInfluxTime(options.rangeRaw.to, true, options.timezone);\n\n return 'time >= ' + from + ' and time <= ' + until;\n }\n\n getInfluxTime(date: any, roundUp: any, timezone: any) {\n if (isString(date)) {\n if (date === 'now') {\n return 'now()';\n }\n\n const parts = /^now-(\\d+)([dhms])$/.exec(date);\n if (parts) {\n const amount = parseInt(parts[1], 10);\n const unit = parts[2];\n return 'now() - ' + amount + unit;\n }\n date = dateMath.parse(date, roundUp, timezone);\n }\n\n return date.valueOf() + 'ms';\n }\n\n isMigrationToggleOnAndIsAccessProxy() {\n return config.featureToggles.influxdbBackendMigration && this.access === 'proxy';\n }\n}\n","import { DataSourcePlugin } from '@grafana/data';\n\nimport ConfigEditor from './components/ConfigEditor';\nimport InfluxStartPage from './components/InfluxStartPage';\nimport { QueryEditor } from './components/QueryEditor';\nimport VariableQueryEditor from './components/VariableQueryEditor';\nimport InfluxDatasource from './datasource';\n\nclass InfluxAnnotationsQueryCtrl {\n static templateUrl = 'partials/annotations.editor.html';\n}\n\nexport const plugin = new DataSourcePlugin(InfluxDatasource)\n .setConfigEditor(ConfigEditor)\n .setQueryEditor(QueryEditor)\n .setAnnotationQueryCtrl(InfluxAnnotationsQueryCtrl)\n .setVariableQueryEditor(VariableQueryEditor)\n .setQueryEditorHelp(InfluxStartPage);\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { QueryEditorProps } from '@grafana/data';\n\nimport InfluxDatasource from '../datasource';\nimport { buildRawQuery } from '../queryUtils';\nimport { InfluxOptions, InfluxQuery } from '../types';\n\nimport { FluxQueryEditor } from './FluxQueryEditor';\nimport { QueryEditorModeSwitcher } from './QueryEditorModeSwitcher';\nimport { RawInfluxQLEditor } from './RawInfluxQLEditor';\nimport { Editor as VisualInfluxQLEditor } from './VisualInfluxQLEditor/Editor';\n\ntype Props = QueryEditorProps<InfluxDatasource, InfluxQuery, InfluxOptions>;\n\nexport const QueryEditor = ({ query, onChange, onRunQuery, datasource, range, data }: Props): JSX.Element => {\n if (datasource.isFlux) {\n return (\n <div className=\"gf-form-query-content\">\n <FluxQueryEditor query={query} onChange={onChange} onRunQuery={onRunQuery} datasource={datasource} />\n </div>\n );\n }\n\n return (\n <div className={css({ display: 'flex' })}>\n <div className={css({ flexGrow: 1 })}>\n {query.rawQuery ? (\n <RawInfluxQLEditor query={query} onChange={onChange} onRunQuery={onRunQuery} />\n ) : (\n <VisualInfluxQLEditor query={query} onChange={onChange} onRunQuery={onRunQuery} datasource={datasource} />\n )}\n </div>\n <QueryEditorModeSwitcher\n isRaw={query.rawQuery ?? false}\n onChange={(value) => {\n onChange({ ...query, query: buildRawQuery(query), rawQuery: value });\n onRunQuery();\n }}\n />\n </div>\n );\n};\n","import { useEffect, useRef } from 'react';\nexport default function usePrevious(state) {\n var ref = useRef();\n useEffect(function () {\n ref.current = state;\n });\n return ref.current;\n}\n"],"names":["InfluxVersion","Input","SecretFormField","LegacyForms","httpModes","label","value","versions","InfluxQL","description","Flux","ConfigEditor","PureComponent","constructor","props","super","maxSeries","updateDatasourcePluginResetOption","this","selected","options","onOptionsChange","copy","jsonData","version","access","basicAuth","httpMode","user","database","state","toString","htmlPrefix","uniqueId","renderInflux2x","secureJsonFields","secureJsonData","className","InlineFormLabel","htmlFor","id","organization","onChange","onUpdateDatasourceJsonDataOption","isConfigured","token","labelWidth","inputWidth","onReset","onResetToken","onUpdateDatasourceSecureJsonDataOption","placeholder","defaultBucket","tooltip","timeInterval","renderInflux1x","InfoBox","onUpdateDatasourceOption","password","onResetPassword","Select","inputId","find","defaultValue","onUpdateDatasourceJsonDataOptionSelect","render","onVersionChanged","href","Alert","title","severity","DataSourceHttpSettings","showAccessOptions","dataSourceConfig","defaultUrl","InlineField","type","event","setState","currentTarget","val","parseInt","updateDatasourcePluginJsonDataOption","Number","isFinite","undefined","CHEAT_SHEET_ITEMS","map","item","InfluxStartPage","onClickExample","index","categories","Aggregations","Selectors","Transformations","Predictors","Math","Aliasing","Fields","createPart","part","def","message","QueryPart","register","QueryPartDef","category","push","groupByTimeFunctions","fieldRenderer","innerExpr","params","replaceAggregationAddStrategy","selectParts","partModel","i","length","morePartsAvailable","splice","addTransformationStrategy","addStrategy","query","parts","clone","selectModels","dynamicLookup","defaultParams","renderer","functionRenderer","name","partCount","suffixRenderer","quote","renderMode","create","getCategories","replaceAggregationAdd","InfluxQueryModel","target","templateSrv","scopedVars","policy","resultFormat","orderByTime","tags","groupBy","select","updateProjection","queryPart","groupByParts","updatePersistedParts","hasGroupByTime","g","hasFill","addGroupBy","stringParts","match","typePart","arg","removeGroupByPart","filter","s","removeSelect","removeSelectPart","modelsIndex","indexOf","partIndex","addSelectPart","renderTagCondition","tag","interpolate","str","operator","condition","test","replace","key","getMeasurementAndPolicy","measurement","interpolateQueryStr","variable","defaultFormatFn","multi","includeAll","kbn","join","rawQuery","y","selectText","conditions","groupBySection","fill","limit","slimit","tz","renderAdhocFilters","filters","buildRawQuery","queryCopy","cloneDeep","samples","FluxQueryEditor","onRunQuery","forceUpdate","sugs","kind","CodeEditorSuggestionItemKind","detail","getTemplateSrv","getVariables","forEach","editor","setTimeout","layout","helpTooltip","CodeEditor","height","language","onBlur","onFluxQueryChange","onSave","showMiniMap","showLineNumbers","getSuggestions","onEditorDidMount","editorDidMountCallbackHack","cx","css","LinkButton","icon","variant","Segment","onSampleChange","width","QueryEditorModeSwitcher","isRaw","isModalOpen","setModalOpen","useState","useEffect","Button","onClick","ConfirmModal","isOpen","body","confirmText","dismissText","onConfirm","onDismiss","RESULT_FORMATS","DEFAULT_RESULT_FORMAT","useShadowedState","outsideVal","currentVal","setCurrentVal","prevOutsideVal","usePrevious","RawInfluxQLEditor","currentQuery","setCurrentQuery","currentAlias","setCurrentAlias","alias","aliasElementId","useUniqueId","selectElementId","applyDelayedChangesAndRunQuery","TextArea","rows","spellCheck","e","HorizontalGroup","v","InfluxQueryBuilder","buildExploreQuery","withKey","withMeasurementFilter","whereConditions","reduce","memo","isNaN","runExploreQuery","datasource","q","metricFindQuery","async","getTagKeysForMeasurementAndTags","text","paddingRightClass","paddingRight","unwrap","Error","FormatAsSection","format","selectClass","minWidth","formatCreateLabel","SelReload","loadOptions","allowCustomValue","onClose","debouncedLoadOptions","debouncePromise","leading","AsyncSelect","defaultOptions","autoFocus","onCloseMenu","SelSingleLoad","loadState","doLoad","useAsyncFn","isLoading","loading","Sel","filterByLoadOptions","Inp","initialValue","currentValue","setCurrentValue","onKeyDown","defaultButtonClass","cursor","Seg","buttonClassName","setOpen","InlineLabel","as","toSelectableValue","t","FromSection","getPolicyOptions","getMeasurementOptions","allPolicies","some","p","InputSection","isWide","OPTIONS","OrderByTimeSection","AddButton","onAdd","noRightMarginPaddingClass","marginRight","RemovableName","onRemove","WithContextMenu","renderMenuItems","renderRemovableNameMenuItems","MenuGroup","MenuItem","openMenu","noHorizMarginPaddingClass","paddingLeft","marginLeft","Part","theme","useTheme2","partClass","useMemo","lineHeight","typography","fontSize","getPartClass","isLast","then","items","par","newParams","onParamChange","PartListSection","getNewPartOptions","onAddNewPart","onRemovePart","pars","isRegex","getOperator","getCondition","isFirst","adjustOperatorIfNeeded","currentOperator","newTagValue","isCurrentOperatorRegex","operatorOptions","condititonOptions","loadConditionOptions","Promise","resolve","loadOperatorOptions","Tag","getTagKeyOptions","getTagValueOptions","catch","err","console","error","op","TagsSection","newT","newTag","newTags","onTagChange","onTagRemove","tagKey","minimalTag","addNewTag","getPartParams","dynamicParamOptions","paramValues","defParam","get","makePartList","queryParts","qp","withTemplateVariableOptions","optionsPromise","filterTags","allTagKeys","has","Editor","formatAsId","orderByTimeId","styles","useStyles2","getStyles","normalizeQuery","Set","selectLists","dynamicSelectPartOptions","Map","getFieldKeysForMeasurement","sel","getTagKeys","keys","groupByList","dynamicGroupByPartOptions","onAppliedChange","newQuery","SegmentSection","getAllPolicies","measurementFilter","getAllMeasurementsForTags","m","inlineLabel","getTagValues","Object","children","x","getNewSelectPartOptions","listIndex","newSel","changeSelectPart","model","addNewSelectPart","selectModel","tagKeys","getNewGroupByPartOptions","newGroupBy","changeGroupByPart","addNewGroupByPart","colors","primary","VariableQueryEditor","isFlux","refId","onRefresh","InfluxSeries","series","annotation","meta","getTimeSeries","output","j","each","columns","seriesName","columnName","_getSeriesName","datapoints","values","segments","split","g1","g2","group","segIndex","getAnnotations","list","titleCol","timeCol","timeEndCol","tagsCol","textCol","column","titleColumn","includes","tagsColumn","textColumn","timeEndColumn","data","time","Date","timeEnd","flatten","getTable","table","TableModel","seriesIndex","firstCol","firstTableCol","FieldType","reordered","hasOwnProperty","ResponseParser","parse","results","influxResults","normalizedQuery","toLowerCase","isValueFirst","res","serie","isArray","addUnique","Array","from","dfs","executedQueryString","selectedParams","allParams","selector","uniqueParams","param","incrementName","getSelectedParams","fields","field","labels","getTableCols","dfsByLabels","df","getTableRows","rsp","toDataQueryResponse","colText","colContainsTag","toArray","metrics","nameIncremenet","add","getFieldType","firstNotNull","valueType","timeSeriesToDataFrame","timeSeries","times","points","point","TIME_SERIES_TIME_FIELD_NAME","config","ArrayVector","TIME_SERIES_VALUE_FIELD_NAME","displayNameFromDS","InfluxDatasource","DataSourceWithBackend","instanceSettings","urls","url","trim","username","withCredentials","settingsData","interval","responseParser","annotations","QueryEditor","request","filteredRequest","targets","hide","isMigrationToggleOnAndIsAccessProxy","pipe","seriesList","groupedFrames","filteredFrames","preferredVisualisationType","classicQuery","getQueryDisplayText","filterQuery","applyTemplateVariables","rest","applyVariables","timeFilter","getTimeFilter","queryTargets","allQueries","_map","__interval","acc","current","of","adhocFilters","getAdhocFilters","_seriesQuery","result","influxSeries","reject","getRef","lastValueFrom","getBackendSrv","fetch","method","range","valueOf","to","queries","requestId","transformAnnotationResponse","rangeRaw","timezone","dashboard","targetContainsTemplate","queryText","containsTemplate","interpolateVariablesInQueries","expandedQuery","selects","frameToMetricFindValue","interpolated","resp","_influxRequest","epoch","serializeParams","encodeURIComponent","testDatasource","uuidv4","dashboardId","panelId","intervalMs","maxDataPoints","dateTime","LoadingState","status","first","currentUrl","shift","u","db","extend","omit","pick","req","precision","inspect","paramSerializer","headers","Authorization","errors","elem","catchError","cancelled","throwError","handleErrors","isInteger","statusText","getInfluxTime","date","roundUp","isString","exec","dateMath","InfluxAnnotationsQueryCtrl","plugin","DataSourcePlugin","setConfigEditor","setQueryEditor","display","flexGrow","setAnnotationQueryCtrl","setVariableQueryEditor","setQueryEditorHelp","ref","useRef"],"sourceRoot":""}