{"version":3,"file":"metric_find_query.cjs","sources":["../../src/metric_find_query.ts"],"sourcesContent":["// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/metric_find_query.ts\nimport { map as _map } from 'lodash';\n\nimport { type MetricFindValue, type TimeRange } from '@grafana/data';\n\nimport { METRIC_LABEL } from './constants';\nimport { type PrometheusDatasource } from './datasource';\nimport { getPrometheusTime } from './language_utils';\nimport {\n  PrometheusLabelNamesRegex,\n  PrometheusLabelNamesRegexWithMatch,\n  PrometheusLabelValuesRegex,\n  PrometheusMetricNamesRegex,\n  PrometheusQueryResultRegex,\n} from './migrations/variableMigration';\nimport { getOriginalMetricName } from './result_transformer';\n\nexport class PrometheusMetricFindQuery {\n  constructor(\n    private datasource: PrometheusDatasource,\n    private query: string\n  ) {\n    this.datasource = datasource;\n    this.query = query;\n  }\n\n  async process(timeRange: TimeRange): Promise<MetricFindValue[]> {\n    const labelNamesRegex = PrometheusLabelNamesRegex;\n    const labelNamesRegexWithMatch = PrometheusLabelNamesRegexWithMatch;\n    const labelValuesRegex = PrometheusLabelValuesRegex;\n    const metricNamesRegex = PrometheusMetricNamesRegex;\n    const queryResultRegex = PrometheusQueryResultRegex;\n    const labelNamesQuery = this.query.match(labelNamesRegex);\n    const labelNamesMatchQuery = this.query.match(labelNamesRegexWithMatch);\n\n    if (labelNamesMatchQuery) {\n      const selector = `{__name__=~\".*${labelNamesMatchQuery[1]}.*\"}`;\n      const keys = await this.datasource.languageProvider.queryLabelKeys(timeRange, selector);\n      return keys.filter((key) => key !== METRIC_LABEL).map((result) => ({ text: result }));\n    }\n\n    if (labelNamesQuery) {\n      return this.datasource.getTagKeys({ filters: [], timeRange });\n    }\n\n    const labelValuesQuery = this.query.match(labelValuesRegex);\n    if (labelValuesQuery) {\n      const filter = labelValuesQuery[1];\n      const label = labelValuesQuery[2];\n      if (isFilterDefined(filter)) {\n        return await this.labelValuesQuery(label, timeRange, filter);\n      } else {\n        // Exclude the filter part of the expression because it is blank or empty\n        return await this.labelValuesQuery(label, timeRange);\n      }\n    }\n\n    const metricNamesQuery = this.query.match(metricNamesRegex);\n    if (metricNamesQuery) {\n      return await this.metricNameQuery(metricNamesQuery[1], timeRange);\n    }\n\n    const queryResultQuery = this.query.match(queryResultRegex);\n    if (queryResultQuery) {\n      return this.queryResultQuery(queryResultQuery[1], timeRange);\n    }\n\n    // if query contains full metric name, return metric name and label list\n    const expressions = ['label_values()', 'metrics()', 'query_result()'];\n    if (!expressions.includes(this.query)) {\n      return await this.metricNameAndLabelsQuery(this.query, timeRange);\n    }\n\n    return Promise.resolve([]);\n  }\n\n  async labelValuesQuery(label: string, range: TimeRange, metric?: string) {\n    const values = await this.datasource.languageProvider.queryLabelValues(range, label, metric);\n    return values.map((value) => ({ text: value }));\n  }\n\n  async metricNameQuery(metricFilterPattern: string, range: TimeRange) {\n    const names = await this.datasource.languageProvider.queryLabelValues(\n      range,\n      METRIC_LABEL,\n      `{__name__=~\"${metricFilterPattern}\"}`\n    );\n    return names.map((n) => ({ text: n, expandable: true }));\n  }\n\n  queryResultQuery(query: string, range: TimeRange) {\n    const url = '/api/v1/query';\n    const params = {\n      query,\n      time: getPrometheusTime(range.to, true).toString(),\n    };\n    return this.datasource.metadataRequest(url, params).then((result) => {\n      switch (result.data.data.resultType) {\n        case 'scalar': // [ <unix_time>, \"<scalar_value>\" ]\n        case 'string': // [ <unix_time>, \"<string_value>\" ]\n          return [\n            {\n              text: result.data.data.result[1] || '',\n              expandable: false,\n            },\n          ];\n        case 'vector':\n          return _map(result.data.data.result, (metricData) => {\n            let text = metricData.metric.__name__ || '';\n            delete metricData.metric.__name__;\n            text +=\n              '{' +\n              _map(metricData.metric, (v, k) => {\n                return k + '=\"' + v + '\"';\n              }).join(',') +\n              '}';\n            text += ' ' + metricData.value[1] + ' ' + metricData.value[0] * 1000;\n\n            return {\n              text: text,\n              expandable: true,\n            };\n          });\n        default:\n          throw Error(`Unknown/Unhandled result type: [${result.data.data.resultType}]`);\n      }\n    });\n  }\n\n  async metricNameAndLabelsQuery(query: string, range: TimeRange): Promise<MetricFindValue[]> {\n    const start = getPrometheusTime(range.from, false);\n    const end = getPrometheusTime(range.to, true);\n    const params = {\n      'match[]': query,\n      start: start.toString(),\n      end: end.toString(),\n    };\n\n    const result = await this.datasource.metadataRequest(`/api/v1/series`, params);\n    return result.data.data.map((metric: Record<string, string>) => ({\n      text: getOriginalMetricName(metric),\n      expandable: true,\n    }));\n  }\n}\n\nfunction isFilterDefined(filter: string) {\n  // We consider blank strings or the empty filter {} as an undefined filter\n  return filter && filter.split(' ').join('') !== '{}';\n}\n"],"names":["PrometheusLabelNamesRegex","PrometheusLabelNamesRegexWithMatch","PrometheusLabelValuesRegex","PrometheusMetricNamesRegex","PrometheusQueryResultRegex","METRIC_LABEL","getPrometheusTime","_map","getOriginalMetricName"],"mappings":"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"}