1{"version":3,"file":"prometheusPlugin.0e38943fa459e872fe93.js","mappings":"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","sources":["webpack://grafana/./public/app/plugins/datasource/prometheus/types.ts","webpack://grafana/./public/app/plugins/datasource/prometheus/result_transformer.ts","webpack://grafana/./public/app/plugins/datasource/prometheus/metric_find_query.ts","webpack://grafana/./public/app/plugins/datasource/prometheus/variables.ts","webpack://grafana/./public/app/plugins/datasource/prometheus/datasource.ts","webpack://grafana/./public/app/plugins/datasource/prometheus/query_hints.ts","webpack://grafana/./public/app/plugins/datasource/prometheus/components/PrometheusMetricsBrowser.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/components/monaco-query-field/MonacoQueryFieldLazy.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/components/monaco-query-field/MonacoQueryFieldWrapper.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/components/PromQueryField.tsx","webpack://grafana/./public/app/core/utils/CancelablePromise.ts","webpack://grafana/./public/app/plugins/datasource/prometheus/components/PromLink.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/components/PromExemplarField.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/components/PromQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/components/PromQueryEditorForAlerting.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/components/PromQueryEditorByApp.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/components/PromCheatSheet.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/components/PromExploreExtraField.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/components/PromExploreQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/configuration/AzureCredentials.ts","webpack://grafana/./public/app/plugins/datasource/prometheus/configuration/AzureCredentialsConfig.ts","webpack://grafana/./public/app/plugins/datasource/prometheus/configuration/AzureCredentialsForm.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/configuration/AzureAuthSettings.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/configuration/ExemplarSetting.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/configuration/ExemplarsSettings.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/configuration/PromSettings.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/module.ts","webpack://grafana/./public/app/plugins/datasource/prometheus/configuration/ConfigEditor.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/promql.ts"],"sourcesContent":["import { DataQuery, DataSourceJsonData, QueryResultMeta, ScopedVars } from '@grafana/data';\n\nexport interface PromQuery extends DataQuery {\n  expr: string;\n  format?: string;\n  instant?: boolean;\n  range?: boolean;\n  exemplar?: boolean;\n  hinting?: boolean;\n  interval?: string;\n  intervalFactor?: number;\n  // Timezone offset to align start & end time on backend\n  utcOffsetSec?: number;\n  legendFormat?: string;\n  valueWithRefId?: boolean;\n  requestId?: string;\n  showingGraph?: boolean;\n  showingTable?: boolean;\n}\n\nexport interface PromOptions extends DataSourceJsonData {\n  timeInterval?: string;\n  queryTimeout?: string;\n  httpMethod?: string;\n  directUrl?: string;\n  customQueryParameters?: string;\n  disableMetricsLookup?: boolean;\n  exemplarTraceIdDestinations?: ExemplarTraceIdDestination[];\n}\n\nexport enum PromQueryType {\n  timeSeriesQuery = 'timeSeriesQuery',\n}\n\nexport type ExemplarTraceIdDestination = {\n  name: string;\n  url?: string;\n  datasourceUid?: string;\n};\n\nexport interface PromQueryRequest extends PromQuery {\n  step?: number;\n  requestId?: string;\n  start: number;\n  end: number;\n  headers?: any;\n}\n\nexport interface PromMetricsMetadataItem {\n  type: string;\n  help: string;\n  unit?: string;\n}\n\nexport interface PromMetricsMetadata {\n  [metric: string]: PromMetricsMetadataItem;\n}\n\nexport interface PromDataSuccessResponse<T = PromData> {\n  status: 'success';\n  data: T;\n}\n\nexport interface PromDataErrorResponse<T = PromData> {\n  status: 'error';\n  errorType: string;\n  error: string;\n  data: T;\n}\n\nexport type PromData = PromMatrixData | PromVectorData | PromScalarData | PromExemplarData[];\n\nexport interface Labels {\n  [index: string]: any;\n}\n\nexport interface Exemplar {\n  labels: Labels;\n  value: number;\n  timestamp: number;\n}\n\nexport interface PromExemplarData {\n  seriesLabels: PromMetric;\n  exemplars: Exemplar[];\n}\n\nexport interface PromVectorData {\n  resultType: 'vector';\n  result: Array<{\n    metric: PromMetric;\n    value: PromValue;\n  }>;\n}\n\nexport interface PromMatrixData {\n  resultType: 'matrix';\n  result: Array<{\n    metric: PromMetric;\n    values: PromValue[];\n  }>;\n}\n\nexport interface PromScalarData {\n  resultType: 'scalar';\n  result: PromValue;\n}\n\nexport type PromValue = [number, any];\n\nexport interface PromMetric {\n  __name__?: string;\n  [index: string]: any;\n}\n\nexport function isMatrixData(result: MatrixOrVectorResult): result is PromMatrixData['result'][0] {\n  return 'values' in result;\n}\n\nexport function isExemplarData(result: PromData): result is PromExemplarData[] {\n  if (result == null || !Array.isArray(result)) {\n    return false;\n  }\n  return result.length ? 'exemplars' in result[0] : false;\n}\n\nexport type MatrixOrVectorResult = PromMatrixData['result'][0] | PromVectorData['result'][0];\n\nexport interface TransformOptions {\n  format?: string;\n  step?: number;\n  legendFormat?: string;\n  start: number;\n  end: number;\n  query: string;\n  responseListLength: number;\n  scopedVars?: ScopedVars;\n  refId: string;\n  valueWithRefId?: boolean;\n  meta: QueryResultMeta;\n}\n\nexport interface PromLabelQueryResponse {\n  data: {\n    status: string;\n    data: string[];\n  };\n  cancelled?: boolean;\n}\n","import {\n  ArrayDataFrame,\n  ArrayVector,\n  DataFrame,\n  DataLink,\n  DataTopic,\n  Field,\n  FieldType,\n  formatLabels,\n  getDisplayProcessor,\n  Labels,\n  MutableField,\n  ScopedVars,\n  TIME_SERIES_TIME_FIELD_NAME,\n  TIME_SERIES_VALUE_FIELD_NAME,\n  DataQueryResponse,\n  DataQueryRequest,\n  PreferredVisualisationType,\n  CoreApp,\n} from '@grafana/data';\nimport { FetchResponse, getDataSourceSrv, getTemplateSrv } from '@grafana/runtime';\nimport { partition, groupBy } from 'lodash';\nimport { descending, deviation } from 'd3';\nimport {\n  ExemplarTraceIdDestination,\n  isExemplarData,\n  isMatrixData,\n  MatrixOrVectorResult,\n  PromDataSuccessResponse,\n  PromMetric,\n  PromQuery,\n  PromQueryRequest,\n  PromValue,\n  TransformOptions,\n} from './types';\n\nconst POSITIVE_INFINITY_SAMPLE_VALUE = '+Inf';\nconst NEGATIVE_INFINITY_SAMPLE_VALUE = '-Inf';\n\ninterface TimeAndValue {\n  [TIME_SERIES_TIME_FIELD_NAME]: number;\n  [TIME_SERIES_VALUE_FIELD_NAME]: number;\n}\n\nconst isTableResult = (dataFrame: DataFrame, options: DataQueryRequest<PromQuery>): boolean => {\n  // We want to process vector and scalar results in Explore as table\n  if (\n    options.app === CoreApp.Explore &&\n    (dataFrame.meta?.custom?.resultType === 'vector' || dataFrame.meta?.custom?.resultType === 'scalar')\n  ) {\n    return true;\n  }\n\n  // We want to process all dataFrames with target.format === 'table' as table\n  const target = options.targets.find((target) => target.refId === dataFrame.refId);\n  return target?.format === 'table';\n};\n\nconst isHeatmapResult = (dataFrame: DataFrame, options: DataQueryRequest<PromQuery>): boolean => {\n  const target = options.targets.find((target) => target.refId === dataFrame.refId);\n  return target?.format === 'heatmap';\n};\n\n// V2 result trasnformer used to transform query results from queries that were run trough prometheus backend\nexport function transformV2(\n  response: DataQueryResponse,\n  request: DataQueryRequest<PromQuery>,\n  options: { exemplarTraceIdDestinations?: ExemplarTraceIdDestination[] }\n) {\n  const [tableFrames, framesWithoutTable] = partition<DataFrame>(response.data, (df) => isTableResult(df, request));\n  const processedTableFrames = transformDFToTable(tableFrames);\n\n  const [heatmapResults, framesWithoutTableAndHeatmaps] = partition<DataFrame>(framesWithoutTable, (df) =>\n    isHeatmapResult(df, request)\n  );\n  const processedHeatmapFrames = transformToHistogramOverTime(heatmapResults.sort(sortSeriesByLabel));\n\n  const [exemplarFrames, framesWithoutTableHeatmapsAndExemplars] = partition<DataFrame>(\n    framesWithoutTableAndHeatmaps,\n    (df) => df.meta?.custom?.resultType === 'exemplar'\n  );\n\n  // EXEMPLAR FRAMES: We enrich exemplar frames with data links and add dataTopic meta info\n  const { exemplarTraceIdDestinations: destinations } = options;\n  const processedExemplarFrames = exemplarFrames.map((dataFrame) => {\n    if (destinations?.length) {\n      for (const exemplarTraceIdDestination of destinations) {\n        const traceIDField = dataFrame.fields.find((field) => field.name === exemplarTraceIdDestination.name);\n        if (traceIDField) {\n          const links = getDataLinks(exemplarTraceIdDestination);\n          traceIDField.config.links = traceIDField.config.links?.length\n            ? [...traceIDField.config.links, ...links]\n            : links;\n        }\n      }\n    }\n\n    return { ...dataFrame, meta: { ...dataFrame.meta, dataTopic: DataTopic.Annotations } };\n  });\n\n  // Everything else is processed as time_series result and graph preferredVisualisationType\n  const otherFrames = framesWithoutTableHeatmapsAndExemplars.map((dataFrame) => {\n    const df = {\n      ...dataFrame,\n      meta: {\n        ...dataFrame.meta,\n        preferredVisualisationType: 'graph',\n      },\n    } as DataFrame;\n    return df;\n  });\n\n  return {\n    ...response,\n    data: [...otherFrames, ...processedTableFrames, ...processedHeatmapFrames, ...processedExemplarFrames],\n  };\n}\n\nexport function transformDFToTable(dfs: DataFrame[]): DataFrame[] {\n  // If no dataFrames or if 1 dataFrames with no values, return original dataFrame\n  if (dfs.length === 0 || (dfs.length === 1 && dfs[0].length === 0)) {\n    return dfs;\n  }\n\n  // Group results by refId and process dataFrames with the same refId as 1 dataFrame\n  const dataFramesByRefId = groupBy(dfs, 'refId');\n  const refIds = Object.keys(dataFramesByRefId);\n\n  const frames = refIds.map((refId) => {\n    // Create timeField, valueField and labelFields\n    const valueText = getValueText(refIds.length, refId);\n    const valueField = getValueField({ data: [], valueName: valueText });\n    const timeField = getTimeField([]);\n    const labelFields: MutableField[] = [];\n\n    // Fill labelsFields with labels from dataFrames\n    dataFramesByRefId[refId].forEach((df) => {\n      const frameValueField = df.fields[1];\n      const promLabels = frameValueField.labels ?? {};\n\n      Object.keys(promLabels)\n        .sort()\n        .forEach((label) => {\n          // If we don't have label in labelFields, add it\n          if (!labelFields.some((l) => l.name === label)) {\n            const numberField = label === 'le';\n            labelFields.push({\n              name: label,\n              config: { filterable: true },\n              type: numberField ? FieldType.number : FieldType.string,\n              values: new ArrayVector(),\n            });\n          }\n        });\n    });\n\n    // Fill valueField, timeField and labelFields with values\n    dataFramesByRefId[refId].forEach((df) => {\n      df.fields[0].values.toArray().forEach((value) => timeField.values.add(value));\n      df.fields[1].values.toArray().forEach((value) => {\n        valueField.values.add(parseSampleValue(value));\n        const labelsForField = df.fields[1].labels ?? {};\n        labelFields.forEach((field) => field.values.add(getLabelValue(labelsForField, field.name)));\n      });\n    });\n\n    const fields = [timeField, ...labelFields, valueField];\n    return {\n      refId,\n      fields,\n      meta: { ...dfs[0].meta, preferredVisualisationType: 'table' as PreferredVisualisationType },\n      length: timeField.values.length,\n    };\n  });\n  return frames;\n}\n\nfunction getValueText(responseLength: number, refId = '') {\n  return responseLength > 1 ? `Value #${refId}` : 'Value';\n}\n\nexport function transform(\n  response: FetchResponse<PromDataSuccessResponse>,\n  transformOptions: {\n    query: PromQueryRequest;\n    exemplarTraceIdDestinations?: ExemplarTraceIdDestination[];\n    target: PromQuery;\n    responseListLength: number;\n    scopedVars?: ScopedVars;\n  }\n) {\n  // Create options object from transformOptions\n  const options: TransformOptions = {\n    format: transformOptions.target.format,\n    step: transformOptions.query.step,\n    legendFormat: transformOptions.target.legendFormat,\n    start: transformOptions.query.start,\n    end: transformOptions.query.end,\n    query: transformOptions.query.expr,\n    responseListLength: transformOptions.responseListLength,\n    scopedVars: transformOptions.scopedVars,\n    refId: transformOptions.target.refId,\n    valueWithRefId: transformOptions.target.valueWithRefId,\n    meta: {\n      // Fix for showing of Prometheus results in Explore table\n      preferredVisualisationType: transformOptions.query.instant ? 'table' : 'graph',\n    },\n  };\n  const prometheusResult = response.data.data;\n\n  if (isExemplarData(prometheusResult)) {\n    const events: TimeAndValue[] = [];\n    prometheusResult.forEach((exemplarData) => {\n      const data = exemplarData.exemplars.map((exemplar) => {\n        return {\n          [TIME_SERIES_TIME_FIELD_NAME]: exemplar.timestamp * 1000,\n          [TIME_SERIES_VALUE_FIELD_NAME]: exemplar.value,\n          ...exemplar.labels,\n          ...exemplarData.seriesLabels,\n        };\n      });\n      events.push(...data);\n    });\n\n    // Grouping exemplars by step\n    const sampledExemplars = sampleExemplars(events, options);\n\n    const dataFrame = new ArrayDataFrame(sampledExemplars);\n    dataFrame.meta = { dataTopic: DataTopic.Annotations };\n\n    // Add data links if configured\n    if (transformOptions.exemplarTraceIdDestinations?.length) {\n      for (const exemplarTraceIdDestination of transformOptions.exemplarTraceIdDestinations) {\n        const traceIDField = dataFrame.fields.find((field) => field.name === exemplarTraceIdDestination.name);\n        if (traceIDField) {\n          const links = getDataLinks(exemplarTraceIdDestination);\n          traceIDField.config.links = traceIDField.config.links?.length\n            ? [...traceIDField.config.links, ...links]\n            : links;\n        }\n      }\n    }\n    return [dataFrame];\n  }\n\n  if (!prometheusResult?.result) {\n    return [];\n  }\n\n  // Return early if result type is scalar\n  if (prometheusResult.resultType === 'scalar') {\n    return [\n      {\n        meta: options.meta,\n        refId: options.refId,\n        length: 1,\n        fields: [getTimeField([prometheusResult.result]), getValueField({ data: [prometheusResult.result] })],\n      },\n    ];\n  }\n\n  // Return early again if the format is table, this needs special transformation.\n  if (options.format === 'table') {\n    const tableData = transformMetricDataToTable(prometheusResult.result, options);\n    return [tableData];\n  }\n\n  // Process matrix and vector results to DataFrame\n  const dataFrame: DataFrame[] = [];\n  prometheusResult.result.forEach((data: MatrixOrVectorResult) => dataFrame.push(transformToDataFrame(data, options)));\n\n  // When format is heatmap use the already created data frames and transform it more\n  if (options.format === 'heatmap') {\n    dataFrame.sort(sortSeriesByLabel);\n    const seriesList = transformToHistogramOverTime(dataFrame);\n    return seriesList;\n  }\n\n  // Return matrix or vector result as DataFrame[]\n  return dataFrame;\n}\n\nfunction getDataLinks(options: ExemplarTraceIdDestination): DataLink[] {\n  const dataLinks: DataLink[] = [];\n\n  if (options.datasourceUid) {\n    const dataSourceSrv = getDataSourceSrv();\n    const dsSettings = dataSourceSrv.getInstanceSettings(options.datasourceUid);\n\n    dataLinks.push({\n      title: `Query with ${dsSettings?.name}`,\n      url: '',\n      internal: {\n        query: { query: '${__value.raw}', queryType: 'traceId' },\n        datasourceUid: options.datasourceUid,\n        datasourceName: dsSettings?.name ?? 'Data source not found',\n      },\n    });\n  }\n\n  if (options.url) {\n    dataLinks.push({\n      title: `Go to ${options.url}`,\n      url: options.url,\n      targetBlank: true,\n    });\n  }\n  return dataLinks;\n}\n\n/**\n * Reduce the density of the exemplars by making sure that the highest value exemplar is included\n * and then only the ones that are 2 times the standard deviation of the all the values.\n * This makes sure not to show too many dots near each other.\n */\nfunction sampleExemplars(events: TimeAndValue[], options: TransformOptions) {\n  const step = options.step || 15;\n  const bucketedExemplars: { [ts: string]: TimeAndValue[] } = {};\n  const values: number[] = [];\n  for (const exemplar of events) {\n    // Align exemplar timestamp to nearest step second\n    const alignedTs = String(Math.floor(exemplar[TIME_SERIES_TIME_FIELD_NAME] / 1000 / step) * step * 1000);\n    if (!bucketedExemplars[alignedTs]) {\n      // New bucket found\n      bucketedExemplars[alignedTs] = [];\n    }\n    bucketedExemplars[alignedTs].push(exemplar);\n    values.push(exemplar[TIME_SERIES_VALUE_FIELD_NAME]);\n  }\n\n  // Getting exemplars from each bucket\n  const standardDeviation = deviation(values);\n  const sampledBuckets = Object.keys(bucketedExemplars).sort();\n  const sampledExemplars = [];\n  for (const ts of sampledBuckets) {\n    const exemplarsInBucket = bucketedExemplars[ts];\n    if (exemplarsInBucket.length === 1) {\n      sampledExemplars.push(exemplarsInBucket[0]);\n    } else {\n      // Choose which values to sample\n      const bucketValues = exemplarsInBucket.map((ex) => ex[TIME_SERIES_VALUE_FIELD_NAME]).sort(descending);\n      const sampledBucketValues = bucketValues.reduce((acc: number[], curr) => {\n        if (acc.length === 0) {\n          // First value is max and is always added\n          acc.push(curr);\n        } else {\n          // Then take values only when at least 2 standard deviation distance to previously taken value\n          const prev = acc[acc.length - 1];\n          if (standardDeviation && prev - curr >= 2 * standardDeviation) {\n            acc.push(curr);\n          }\n        }\n        return acc;\n      }, []);\n      // Find the exemplars for the sampled values\n      sampledExemplars.push(\n        ...sampledBucketValues.map(\n          (value) => exemplarsInBucket.find((ex) => ex[TIME_SERIES_VALUE_FIELD_NAME] === value)!\n        )\n      );\n    }\n  }\n  return sampledExemplars;\n}\n\n/**\n * Transforms matrix and vector result from Prometheus result to DataFrame\n */\nfunction transformToDataFrame(data: MatrixOrVectorResult, options: TransformOptions): DataFrame {\n  const { name, labels } = createLabelInfo(data.metric, options);\n\n  const fields: Field[] = [];\n\n  if (isMatrixData(data)) {\n    const stepMs = options.step ? options.step * 1000 : NaN;\n    let baseTimestamp = options.start * 1000;\n    const dps: PromValue[] = [];\n\n    for (const value of data.values) {\n      let dpValue: number | null = parseSampleValue(value[1]);\n\n      if (isNaN(dpValue)) {\n        dpValue = null;\n      }\n\n      const timestamp = value[0] * 1000;\n      for (let t = baseTimestamp; t < timestamp; t += stepMs) {\n        dps.push([t, null]);\n      }\n      baseTimestamp = timestamp + stepMs;\n      dps.push([timestamp, dpValue]);\n    }\n\n    const endTimestamp = options.end * 1000;\n    for (let t = baseTimestamp; t <= endTimestamp; t += stepMs) {\n      dps.push([t, null]);\n    }\n    fields.push(getTimeField(dps, true));\n    fields.push(getValueField({ data: dps, parseValue: false, labels, displayNameFromDS: name }));\n  } else {\n    fields.push(getTimeField([data.value]));\n    fields.push(getValueField({ data: [data.value], labels, displayNameFromDS: name }));\n  }\n\n  return {\n    meta: options.meta,\n    refId: options.refId,\n    length: fields[0].values.length,\n    fields,\n    name,\n  };\n}\n\nfunction transformMetricDataToTable(md: MatrixOrVectorResult[], options: TransformOptions): DataFrame {\n  if (!md || md.length === 0) {\n    return {\n      meta: options.meta,\n      refId: options.refId,\n      length: 0,\n      fields: [],\n    };\n  }\n\n  const valueText = options.responseListLength > 1 || options.valueWithRefId ? `Value #${options.refId}` : 'Value';\n\n  const timeField = getTimeField([]);\n  const metricFields = Object.keys(md.reduce((acc, series) => ({ ...acc, ...series.metric }), {}))\n    .sort()\n    .map((label) => {\n      // Labels have string field type, otherwise table tries to figure out the type which can result in unexpected results\n      // Only \"le\" label has a number field type\n      const numberField = label === 'le';\n      return {\n        name: label,\n        config: { filterable: true },\n        type: numberField ? FieldType.number : FieldType.string,\n        values: new ArrayVector(),\n      };\n    });\n  const valueField = getValueField({ data: [], valueName: valueText });\n\n  md.forEach((d) => {\n    if (isMatrixData(d)) {\n      d.values.forEach((val) => {\n        timeField.values.add(val[0] * 1000);\n        metricFields.forEach((metricField) => metricField.values.add(getLabelValue(d.metric, metricField.name)));\n        valueField.values.add(parseSampleValue(val[1]));\n      });\n    } else {\n      timeField.values.add(d.value[0] * 1000);\n      metricFields.forEach((metricField) => metricField.values.add(getLabelValue(d.metric, metricField.name)));\n      valueField.values.add(parseSampleValue(d.value[1]));\n    }\n  });\n\n  return {\n    meta: options.meta,\n    refId: options.refId,\n    length: timeField.values.length,\n    fields: [timeField, ...metricFields, valueField],\n  };\n}\n\nfunction getLabelValue(metric: PromMetric, label: string): string | number {\n  if (metric.hasOwnProperty(label)) {\n    if (label === 'le') {\n      return parseSampleValue(metric[label]);\n    }\n    return metric[label];\n  }\n  return '';\n}\n\nfunction getTimeField(data: PromValue[], isMs = false): MutableField {\n  return {\n    name: TIME_SERIES_TIME_FIELD_NAME,\n    type: FieldType.time,\n    config: {},\n    values: new ArrayVector<number>(data.map((val) => (isMs ? val[0] : val[0] * 1000))),\n  };\n}\ntype ValueFieldOptions = {\n  data: PromValue[];\n  valueName?: string;\n  parseValue?: boolean;\n  labels?: Labels;\n  displayNameFromDS?: string;\n};\n\nfunction getValueField({\n  data,\n  valueName = TIME_SERIES_VALUE_FIELD_NAME,\n  parseValue = true,\n  labels,\n  displayNameFromDS,\n}: ValueFieldOptions): MutableField {\n  return {\n    name: valueName,\n    type: FieldType.number,\n    display: getDisplayProcessor(),\n    config: {\n      displayNameFromDS,\n    },\n    labels,\n    values: new ArrayVector<number | null>(data.map((val) => (parseValue ? parseSampleValue(val[1]) : val[1]))),\n  };\n}\n\nfunction createLabelInfo(labels: { [key: string]: string }, options: TransformOptions) {\n  if (options?.legendFormat) {\n    const title = renderTemplate(getTemplateSrv().replace(options.legendFormat, options?.scopedVars), labels);\n    return { name: title, labels };\n  }\n\n  const { __name__, ...labelsWithoutName } = labels;\n  const labelPart = formatLabels(labelsWithoutName);\n  let title = `${__name__ ?? ''}${labelPart}`;\n\n  if (!title) {\n    title = options.query;\n  }\n\n  return { name: title, labels: labelsWithoutName };\n}\n\nexport function getOriginalMetricName(labelData: { [key: string]: string }) {\n  const metricName = labelData.__name__ || '';\n  delete labelData.__name__;\n  const labelPart = Object.entries(labelData)\n    .map((label) => `${label[0]}=\"${label[1]}\"`)\n    .join(',');\n  return `${metricName}{${labelPart}}`;\n}\n\nexport function renderTemplate(aliasPattern: string, aliasData: { [key: string]: string }) {\n  const aliasRegex = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\n  return aliasPattern.replace(aliasRegex, (_match, g1) => {\n    if (aliasData[g1]) {\n      return aliasData[g1];\n    }\n    return '';\n  });\n}\n\nfunction transformToHistogramOverTime(seriesList: DataFrame[]) {\n  /*      t1 = timestamp1, t2 = timestamp2 etc.\n            t1  t2  t3          t1  t2  t3\n    le10    10  10  0     =>    10  10  0\n    le20    20  10  30    =>    10  0   30\n    le30    30  10  35    =>    10  0   5\n    */\n  for (let i = seriesList.length - 1; i > 0; i--) {\n    const topSeries = seriesList[i].fields.find((s) => s.name === TIME_SERIES_VALUE_FIELD_NAME);\n    const bottomSeries = seriesList[i - 1].fields.find((s) => s.name === TIME_SERIES_VALUE_FIELD_NAME);\n    if (!topSeries || !bottomSeries) {\n      throw new Error('Prometheus heatmap transform error: data should be a time series');\n    }\n\n    for (let j = 0; j < topSeries.values.length; j++) {\n      const bottomPoint = bottomSeries.values.get(j) || [0];\n      topSeries.values.toArray()[j] -= bottomPoint;\n    }\n  }\n\n  return seriesList;\n}\n\nfunction sortSeriesByLabel(s1: DataFrame, s2: DataFrame): number {\n  let le1, le2;\n\n  try {\n    // fail if not integer. might happen with bad queries\n    le1 = parseSampleValue(s1.name ?? '');\n    le2 = parseSampleValue(s2.name ?? '');\n  } catch (err) {\n    console.error(err);\n    return 0;\n  }\n\n  if (le1 > le2) {\n    return 1;\n  }\n\n  if (le1 < le2) {\n    return -1;\n  }\n\n  return 0;\n}\n\nfunction parseSampleValue(value: string): number {\n  switch (value) {\n    case POSITIVE_INFINITY_SAMPLE_VALUE:\n      return Number.POSITIVE_INFINITY;\n    case NEGATIVE_INFINITY_SAMPLE_VALUE:\n      return Number.NEGATIVE_INFINITY;\n    default:\n      return parseFloat(value);\n  }\n}\n","import { chain, map as _map, uniq } from 'lodash';\nimport { lastValueFrom } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { MetricFindValue, TimeRange } from '@grafana/data';\n\nimport { PrometheusDatasource } from './datasource';\nimport { PromQueryRequest } from './types';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\n\nexport default class PrometheusMetricFindQuery {\n  range: TimeRange;\n\n  constructor(private datasource: PrometheusDatasource, private query: string) {\n    this.datasource = datasource;\n    this.query = query;\n    this.range = getTimeSrv().timeRange();\n  }\n\n  process(): Promise<MetricFindValue[]> {\n    const labelNamesRegex = /^label_names\\(\\)\\s*$/;\n    const labelValuesRegex = /^label_values\\((?:(.+),\\s*)?([a-zA-Z_][a-zA-Z0-9_]*)\\)\\s*$/;\n    const metricNamesRegex = /^metrics\\((.+)\\)\\s*$/;\n    const queryResultRegex = /^query_result\\((.+)\\)\\s*$/;\n    const labelNamesQuery = this.query.match(labelNamesRegex);\n    if (labelNamesQuery) {\n      return this.labelNamesQuery();\n    }\n\n    const labelValuesQuery = this.query.match(labelValuesRegex);\n    if (labelValuesQuery) {\n      if (labelValuesQuery[1]) {\n        return this.labelValuesQuery(labelValuesQuery[2], labelValuesQuery[1]);\n      } else {\n        return this.labelValuesQuery(labelValuesQuery[2]);\n      }\n    }\n\n    const metricNamesQuery = this.query.match(metricNamesRegex);\n    if (metricNamesQuery) {\n      return this.metricNameQuery(metricNamesQuery[1]);\n    }\n\n    const queryResultQuery = this.query.match(queryResultRegex);\n    if (queryResultQuery) {\n      return lastValueFrom(this.queryResultQuery(queryResultQuery[1]));\n    }\n\n    // if query contains full metric name, return metric name and label list\n    return this.metricNameAndLabelsQuery(this.query);\n  }\n\n  labelNamesQuery() {\n    const start = this.datasource.getPrometheusTime(this.range.from, false);\n    const end = this.datasource.getPrometheusTime(this.range.to, true);\n    const params = {\n      start: start.toString(),\n      end: end.toString(),\n    };\n\n    const url = `/api/v1/labels`;\n\n    return this.datasource.metadataRequest(url, params).then((result: any) => {\n      return _map(result.data.data, (value) => {\n        return { text: value };\n      });\n    });\n  }\n\n  labelValuesQuery(label: string, metric?: string) {\n    const start = this.datasource.getPrometheusTime(this.range.from, false);\n    const end = this.datasource.getPrometheusTime(this.range.to, true);\n\n    let url: string;\n\n    if (!metric) {\n      const params = {\n        start: start.toString(),\n        end: end.toString(),\n      };\n      // return label values globally\n      url = `/api/v1/label/${label}/values`;\n\n      return this.datasource.metadataRequest(url, params).then((result: any) => {\n        return _map(result.data.data, (value) => {\n          return { text: value };\n        });\n      });\n    } else {\n      const params = {\n        'match[]': metric,\n        start: start.toString(),\n        end: end.toString(),\n      };\n      url = `/api/v1/series`;\n\n      return this.datasource.metadataRequest(url, params).then((result: any) => {\n        const _labels = _map(result.data.data, (metric) => {\n          return metric[label] || '';\n        }).filter((label) => {\n          return label !== '';\n        });\n\n        return uniq(_labels).map((metric) => {\n          return {\n            text: metric,\n            expandable: true,\n          };\n        });\n      });\n    }\n  }\n\n  metricNameQuery(metricFilterPattern: string) {\n    const start = this.datasource.getPrometheusTime(this.range.from, false);\n    const end = this.datasource.getPrometheusTime(this.range.to, true);\n    const params = {\n      start: start.toString(),\n      end: end.toString(),\n    };\n    const url = `/api/v1/label/__name__/values`;\n\n    return this.datasource.metadataRequest(url, params).then((result: any) => {\n      return chain(result.data.data)\n        .filter((metricName) => {\n          const r = new RegExp(metricFilterPattern);\n          return r.test(metricName);\n        })\n        .map((matchedMetricName) => {\n          return {\n            text: matchedMetricName,\n            expandable: true,\n          };\n        })\n        .value();\n    });\n  }\n\n  queryResultQuery(query: string) {\n    const end = this.datasource.getPrometheusTime(this.range.to, true);\n    const instantQuery: PromQueryRequest = { expr: query } as PromQueryRequest;\n    return this.datasource.performInstantQuery(instantQuery, end).pipe(\n      map((result) => {\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      })\n    );\n  }\n\n  metricNameAndLabelsQuery(query: string): Promise<MetricFindValue[]> {\n    const start = this.datasource.getPrometheusTime(this.range.from, false);\n    const end = this.datasource.getPrometheusTime(this.range.to, true);\n    const params = {\n      'match[]': query,\n      start: start.toString(),\n      end: end.toString(),\n    };\n\n    const url = `/api/v1/series`;\n    const self = this;\n\n    return this.datasource.metadataRequest(url, params).then((result: any) => {\n      return _map(result.data.data, (metric: { [key: string]: string }) => {\n        return {\n          text: self.datasource.getOriginalMetricName(metric),\n          expandable: true,\n        };\n      });\n    });\n  }\n}\n","import { from, Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport {\n  DataQueryRequest,\n  DataQueryResponse,\n  rangeUtil,\n  StandardVariableQuery,\n  StandardVariableSupport,\n} from '@grafana/data';\nimport { getTemplateSrv, TemplateSrv } from '@grafana/runtime';\n\nimport { PrometheusDatasource } from './datasource';\nimport { PromQuery } from './types';\nimport PrometheusMetricFindQuery from './metric_find_query';\nimport { getTimeSrv, TimeSrv } from '../../../features/dashboard/services/TimeSrv';\n\nexport class PrometheusVariableSupport extends StandardVariableSupport<PrometheusDatasource> {\n  constructor(\n    private readonly datasource: PrometheusDatasource,\n    private readonly templateSrv: TemplateSrv = getTemplateSrv(),\n    private readonly timeSrv: TimeSrv = getTimeSrv()\n  ) {\n    super();\n    this.query = this.query.bind(this);\n  }\n\n  query(request: DataQueryRequest<PromQuery>): Observable<DataQueryResponse> {\n    const query = request.targets[0].expr;\n    if (!query) {\n      return of({ data: [] });\n    }\n\n    const scopedVars = {\n      ...request.scopedVars,\n      __interval: { text: this.datasource.interval, value: this.datasource.interval },\n      __interval_ms: {\n        text: rangeUtil.intervalToMs(this.datasource.interval),\n        value: rangeUtil.intervalToMs(this.datasource.interval),\n      },\n      ...this.datasource.getRangeScopedVars(this.timeSrv.timeRange()),\n    };\n\n    const interpolated = this.templateSrv.replace(query, scopedVars, this.datasource.interpolateQueryExpr);\n    const metricFindQuery = new PrometheusMetricFindQuery(this.datasource, interpolated);\n    const metricFindStream = from(metricFindQuery.process());\n\n    return metricFindStream.pipe(map((results) => ({ data: results })));\n  }\n\n  toDataQuery(query: StandardVariableQuery): PromQuery {\n    return {\n      refId: 'PrometheusDatasource-VariableQuery',\n      expr: query.query,\n    };\n  }\n}\n","import { cloneDeep, defaults } from 'lodash';\nimport { forkJoin, lastValueFrom, merge, Observable, of, OperatorFunction, pipe, throwError } from 'rxjs';\nimport { catchError, filter, map, tap } from 'rxjs/operators';\nimport LRU from 'lru-cache';\nimport {\n  AnnotationEvent,\n  CoreApp,\n  DataQueryError,\n  DataQueryRequest,\n  DataQueryResponse,\n  DataSourceInstanceSettings,\n  dateMath,\n  DateTime,\n  LoadingState,\n  rangeUtil,\n  ScopedVars,\n  TimeRange,\n  DataFrame,\n  dateTime,\n} from '@grafana/data';\nimport {\n  BackendSrvRequest,\n  FetchError,\n  FetchResponse,\n  getBackendSrv,\n  DataSourceWithBackend,\n  BackendDataSourceResponse,\n  toDataQueryResponse,\n} from '@grafana/runtime';\n\nimport { safeStringifyValue } from 'app/core/utils/explore';\nimport { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_srv';\nimport addLabelToQuery from './add_label_to_query';\nimport PrometheusLanguageProvider from './language_provider';\nimport { expandRecordingRules } from './language_utils';\nimport { getInitHints, getQueryHints } from './query_hints';\nimport { getOriginalMetricName, renderTemplate, transform, transformV2 } from './result_transformer';\nimport {\n  ExemplarTraceIdDestination,\n  PromDataErrorResponse,\n  PromDataSuccessResponse,\n  PromExemplarData,\n  PromMatrixData,\n  PromOptions,\n  PromQuery,\n  PromQueryRequest,\n  PromQueryType,\n  PromScalarData,\n  PromVectorData,\n} from './types';\nimport { PrometheusVariableSupport } from './variables';\nimport PrometheusMetricFindQuery from './metric_find_query';\n\nexport const ANNOTATION_QUERY_STEP_DEFAULT = '60s';\nconst GET_AND_POST_METADATA_ENDPOINTS = ['api/v1/query', 'api/v1/query_range', 'api/v1/series', 'api/v1/labels'];\n\nexport class PrometheusDatasource extends DataSourceWithBackend<PromQuery, PromOptions> {\n  type: string;\n  editorSrc: string;\n  ruleMappings: { [index: string]: string };\n  url: string;\n  id: number;\n  directUrl: string;\n  access: 'direct' | 'proxy';\n  basicAuth: any;\n  withCredentials: any;\n  metricsNameCache = new LRU<string, string[]>(10);\n  interval: string;\n  queryTimeout: string | undefined;\n  httpMethod: string;\n  languageProvider: PrometheusLanguageProvider;\n  exemplarTraceIdDestinations: ExemplarTraceIdDestination[] | undefined;\n  lookupsDisabled: boolean;\n  customQueryParameters: any;\n  exemplarsAvailable: boolean;\n\n  constructor(\n    instanceSettings: DataSourceInstanceSettings<PromOptions>,\n    private readonly templateSrv: TemplateSrv = getTemplateSrv(),\n    private readonly timeSrv: TimeSrv = getTimeSrv()\n  ) {\n    super(instanceSettings);\n\n    this.type = 'prometheus';\n    this.editorSrc = 'app/features/prometheus/partials/query.editor.html';\n    this.id = instanceSettings.id;\n    this.url = instanceSettings.url!;\n    this.access = instanceSettings.access;\n    this.basicAuth = instanceSettings.basicAuth;\n    this.withCredentials = instanceSettings.withCredentials;\n    this.interval = instanceSettings.jsonData.timeInterval || '15s';\n    this.queryTimeout = instanceSettings.jsonData.queryTimeout;\n    this.httpMethod = instanceSettings.jsonData.httpMethod || 'POST';\n    // `directUrl` is never undefined, we set it at https://github.com/grafana/grafana/blob/main/pkg/api/frontendsettings.go#L108\n    // here we \"fall back\" to this.url to make typescript happy, but it should never happen\n    this.directUrl = instanceSettings.jsonData.directUrl ?? this.url;\n    this.exemplarTraceIdDestinations = instanceSettings.jsonData.exemplarTraceIdDestinations;\n    this.ruleMappings = {};\n    this.languageProvider = new PrometheusLanguageProvider(this);\n    this.lookupsDisabled = instanceSettings.jsonData.disableMetricsLookup ?? false;\n    this.customQueryParameters = new URLSearchParams(instanceSettings.jsonData.customQueryParameters);\n    this.variables = new PrometheusVariableSupport(this, this.templateSrv, this.timeSrv);\n    this.exemplarsAvailable = true;\n  }\n\n  init = async () => {\n    this.loadRules();\n    this.exemplarsAvailable = await this.areExemplarsAvailable();\n  };\n\n  getQueryDisplayText(query: PromQuery) {\n    return query.expr;\n  }\n\n  _addTracingHeaders(httpOptions: PromQueryRequest, options: DataQueryRequest<PromQuery>) {\n    httpOptions.headers = {};\n    const proxyMode = !this.url.match(/^http/);\n    if (proxyMode) {\n      httpOptions.headers['X-Dashboard-Id'] = options.dashboardId;\n      httpOptions.headers['X-Panel-Id'] = options.panelId;\n    }\n  }\n\n  /**\n   * Any request done from this data source should go through here as it contains some common processing for the\n   * request. Any processing done here needs to be also copied on the backend as this goes through data source proxy\n   * but not through the same code as alerting.\n   */\n  _request<T = any>(\n    url: string,\n    data: Record<string, string> | null,\n    overrides: Partial<BackendSrvRequest> = {}\n  ): Observable<FetchResponse<T>> {\n    data = data || {};\n    for (const [key, value] of this.customQueryParameters) {\n      if (data[key] == null) {\n        data[key] = value;\n      }\n    }\n\n    const options: BackendSrvRequest = defaults(overrides, {\n      url: this.url + url,\n      method: this.httpMethod,\n      headers: {},\n    });\n\n    if (options.method === 'GET') {\n      if (data && Object.keys(data).length) {\n        options.url =\n          options.url +\n          (options.url.search(/\\?/) >= 0 ? '&' : '?') +\n          Object.entries(data)\n            .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\n            .join('&');\n      }\n    } else {\n      options.headers!['Content-Type'] = 'application/x-www-form-urlencoded';\n      options.data = data;\n    }\n\n    if (this.basicAuth || this.withCredentials) {\n      options.withCredentials = true;\n    }\n\n    if (this.basicAuth) {\n      options.headers!.Authorization = this.basicAuth;\n    }\n\n    return getBackendSrv().fetch<T>(options);\n  }\n\n  // Use this for tab completion features, wont publish response to other components\n  async metadataRequest<T = any>(url: string, params = {}) {\n    // If URL includes endpoint that supports POST and GET method, try to use configured method. This might fail as POST is supported only in v2.10+.\n    if (GET_AND_POST_METADATA_ENDPOINTS.some((endpoint) => url.includes(endpoint))) {\n      try {\n        return await lastValueFrom(\n          this._request<T>(url, params, { method: this.httpMethod, hideFromInspector: true })\n        );\n      } catch (err) {\n        // If status code of error is Method Not Allowed (405) and HTTP method is POST, retry with GET\n        if (this.httpMethod === 'POST' && err.status === 405) {\n          console.warn(`Couldn't use configured POST HTTP method for this request. Trying to use GET method instead.`);\n        } else {\n          throw err;\n        }\n      }\n    }\n\n    return await lastValueFrom(\n      this._request<T>(url, params, { method: 'GET', hideFromInspector: true })\n    ); // toPromise until we change getTagValues, getTagKeys to Observable\n  }\n\n  interpolateQueryExpr(value: string | string[] = [], variable: any) {\n    // if no multi or include all do not regexEscape\n    if (!variable.multi && !variable.includeAll) {\n      return prometheusRegularEscape(value);\n    }\n\n    if (typeof value === 'string') {\n      return prometheusSpecialRegexEscape(value);\n    }\n\n    const escapedValues = value.map((val) => prometheusSpecialRegexEscape(val));\n\n    if (escapedValues.length === 1) {\n      return escapedValues[0];\n    }\n\n    return '(' + escapedValues.join('|') + ')';\n  }\n\n  targetContainsTemplate(target: PromQuery) {\n    return this.templateSrv.variableExists(target.expr);\n  }\n\n  prepareTargets = (options: DataQueryRequest<PromQuery>, start: number, end: number) => {\n    const queries: PromQueryRequest[] = [];\n    const activeTargets: PromQuery[] = [];\n    const clonedTargets = cloneDeep(options.targets);\n\n    for (const target of clonedTargets) {\n      if (!target.expr || target.hide) {\n        continue;\n      }\n\n      target.requestId = options.panelId + target.refId;\n      const metricName = this.languageProvider.histogramMetrics.find((m) => target.expr.includes(m));\n\n      // In Explore, we run both (instant and range) queries if both are true (selected) or both are undefined (legacy Explore queries)\n      if (options.app === CoreApp.Explore && target.range === target.instant) {\n        // Create instant target\n        const instantTarget: any = cloneDeep(target);\n        instantTarget.format = 'table';\n        instantTarget.instant = true;\n        instantTarget.range = false;\n        instantTarget.valueWithRefId = true;\n        delete instantTarget.maxDataPoints;\n        instantTarget.requestId += '_instant';\n\n        // Create range target\n        const rangeTarget: any = cloneDeep(target);\n        rangeTarget.format = 'time_series';\n        rangeTarget.instant = false;\n        instantTarget.range = true;\n\n        // Create exemplar query\n        if (target.exemplar) {\n          // Only create exemplar target for different metric names\n          if (\n            !metricName ||\n            (metricName && !activeTargets.some((activeTarget) => activeTarget.expr.includes(metricName)))\n          ) {\n            const exemplarTarget = cloneDeep(target);\n            exemplarTarget.instant = false;\n            exemplarTarget.requestId += '_exemplar';\n            queries.push(this.createQuery(exemplarTarget, options, start, end));\n            activeTargets.push(exemplarTarget);\n          }\n          instantTarget.exemplar = false;\n          rangeTarget.exemplar = false;\n        }\n\n        // Add both targets to activeTargets and queries arrays\n        activeTargets.push(instantTarget, rangeTarget);\n        queries.push(\n          this.createQuery(instantTarget, options, start, end),\n          this.createQuery(rangeTarget, options, start, end)\n        );\n        // If running only instant query in Explore, format as table\n      } else if (target.instant && options.app === CoreApp.Explore) {\n        const instantTarget: any = cloneDeep(target);\n        instantTarget.format = 'table';\n        queries.push(this.createQuery(instantTarget, options, start, end));\n        activeTargets.push(instantTarget);\n      } else {\n        // It doesn't make sense to query for exemplars in dashboard if only instant is selected\n        if (target.exemplar && !target.instant) {\n          if (\n            !metricName ||\n            (metricName && !activeTargets.some((activeTarget) => activeTarget.expr.includes(metricName)))\n          ) {\n            const exemplarTarget = cloneDeep(target);\n            exemplarTarget.requestId += '_exemplar';\n            queries.push(this.createQuery(exemplarTarget, options, start, end));\n            activeTargets.push(exemplarTarget);\n          }\n          target.exemplar = false;\n        }\n        queries.push(this.createQuery(target, options, start, end));\n        activeTargets.push(target);\n      }\n    }\n\n    return {\n      queries,\n      activeTargets,\n    };\n  };\n\n  shouldRunExemplarQuery(target: PromQuery, request: DataQueryRequest<PromQuery>): boolean {\n    if (target.exemplar) {\n      // We check all already processed targets and only create exemplar target for not used metric names\n      const metricName = this.languageProvider.histogramMetrics.find((m) => target.expr.includes(m));\n      // Remove targets that weren't processed yet (in targets array they are after current target)\n      const currentTargetIdx = request.targets.findIndex((t) => t.refId === target.refId);\n      const targets = request.targets.slice(0, currentTargetIdx);\n\n      if (!metricName || (metricName && !targets.some((t) => t.expr.includes(metricName)))) {\n        return true;\n      }\n      return false;\n    }\n    return false;\n  }\n\n  processTargetV2(target: PromQuery, request: DataQueryRequest<PromQuery>) {\n    const processedTarget = {\n      ...target,\n      queryType: PromQueryType.timeSeriesQuery,\n      exemplar: this.shouldRunExemplarQuery(target, request),\n      requestId: request.panelId + target.refId,\n      // We need to pass utcOffsetSec to backend to calculate aligned range\n      utcOffsetSec: this.timeSrv.timeRange().to.utcOffset() * 60,\n    };\n    return processedTarget;\n  }\n\n  query(request: DataQueryRequest<PromQuery>): Observable<DataQueryResponse> {\n    if (this.access === 'proxy') {\n      const targets = request.targets.map((target) => this.processTargetV2(target, request));\n      return super\n        .query({ ...request, targets })\n        .pipe(\n          map((response) =>\n            transformV2(response, request, { exemplarTraceIdDestinations: this.exemplarTraceIdDestinations })\n          )\n        );\n      // Run queries trough browser/proxy\n    } else {\n      const start = this.getPrometheusTime(request.range.from, false);\n      const end = this.getPrometheusTime(request.range.to, true);\n      const { queries, activeTargets } = this.prepareTargets(request, start, end);\n\n      // No valid targets, return the empty result to save a round trip.\n      if (!queries || !queries.length) {\n        return of({\n          data: [],\n          state: LoadingState.Done,\n        });\n      }\n\n      if (request.app === CoreApp.Explore) {\n        return this.exploreQuery(queries, activeTargets, end);\n      }\n\n      return this.panelsQuery(queries, activeTargets, end, request.requestId, request.scopedVars);\n    }\n  }\n\n  private exploreQuery(queries: PromQueryRequest[], activeTargets: PromQuery[], end: number) {\n    let runningQueriesCount = queries.length;\n\n    const subQueries = queries.map((query, index) => {\n      const target = activeTargets[index];\n\n      const filterAndMapResponse = pipe(\n        // Decrease the counter here. We assume that each request returns only single value and then completes\n        // (should hold until there is some streaming requests involved).\n        tap(() => runningQueriesCount--),\n        filter((response: any) => (response.cancelled ? false : true)),\n        map((response: any) => {\n          const data = transform(response, {\n            query,\n            target,\n            responseListLength: queries.length,\n            exemplarTraceIdDestinations: this.exemplarTraceIdDestinations,\n          });\n          return {\n            data,\n            key: query.requestId,\n            state: runningQueriesCount === 0 ? LoadingState.Done : LoadingState.Loading,\n          } as DataQueryResponse;\n        })\n      );\n\n      return this.runQuery(query, end, filterAndMapResponse);\n    });\n\n    return merge(...subQueries);\n  }\n\n  private panelsQuery(\n    queries: PromQueryRequest[],\n    activeTargets: PromQuery[],\n    end: number,\n    requestId: string,\n    scopedVars: ScopedVars\n  ) {\n    const observables = queries.map((query, index) => {\n      const target = activeTargets[index];\n\n      const filterAndMapResponse = pipe(\n        filter((response: any) => (response.cancelled ? false : true)),\n        map((response: any) => {\n          const data = transform(response, {\n            query,\n            target,\n            responseListLength: queries.length,\n            scopedVars,\n            exemplarTraceIdDestinations: this.exemplarTraceIdDestinations,\n          });\n          return data;\n        })\n      );\n\n      return this.runQuery(query, end, filterAndMapResponse);\n    });\n\n    return forkJoin(observables).pipe(\n      map((results) => {\n        const data = results.reduce((result, current) => {\n          return [...result, ...current];\n        }, []);\n        return {\n          data,\n          key: requestId,\n          state: LoadingState.Done,\n        };\n      })\n    );\n  }\n\n  private runQuery<T>(query: PromQueryRequest, end: number, filter: OperatorFunction<any, T>): Observable<T> {\n    if (query.instant) {\n      return this.performInstantQuery(query, end).pipe(filter);\n    }\n\n    if (query.exemplar) {\n      return this.getExemplars(query).pipe(\n        catchError(() => {\n          return of({\n            data: [],\n            state: LoadingState.Done,\n          });\n        }),\n        filter\n      );\n    }\n\n    return this.performTimeSeriesQuery(query, query.start, query.end).pipe(filter);\n  }\n\n  createQuery(target: PromQuery, options: DataQueryRequest<PromQuery>, start: number, end: number) {\n    const query: PromQueryRequest = {\n      hinting: target.hinting,\n      instant: target.instant,\n      exemplar: target.exemplar,\n      step: 0,\n      expr: '',\n      requestId: target.requestId,\n      refId: target.refId,\n      start: 0,\n      end: 0,\n    };\n    const range = Math.ceil(end - start);\n\n    // options.interval is the dynamically calculated interval\n    let interval: number = rangeUtil.intervalToSeconds(options.interval);\n    // Minimum interval (\"Min step\"), if specified for the query, or same as interval otherwise.\n    const minInterval = rangeUtil.intervalToSeconds(\n      this.templateSrv.replace(target.interval || options.interval, options.scopedVars)\n    );\n    // Scrape interval as specified for the query (\"Min step\") or otherwise taken from the datasource.\n    // Min step field can have template variables in it, make sure to replace it.\n    const scrapeInterval = target.interval\n      ? rangeUtil.intervalToSeconds(this.templateSrv.replace(target.interval, options.scopedVars))\n      : rangeUtil.intervalToSeconds(this.interval);\n\n    const intervalFactor = target.intervalFactor || 1;\n    // Adjust the interval to take into account any specified minimum and interval factor plus Prometheus limits\n    const adjustedInterval = this.adjustInterval(interval, minInterval, range, intervalFactor);\n    let scopedVars = {\n      ...options.scopedVars,\n      ...this.getRangeScopedVars(options.range),\n      ...this.getRateIntervalScopedVariable(adjustedInterval, scrapeInterval),\n    };\n    // If the interval was adjusted, make a shallow copy of scopedVars with updated interval vars\n    if (interval !== adjustedInterval) {\n      interval = adjustedInterval;\n      scopedVars = Object.assign({}, options.scopedVars, {\n        __interval: { text: interval + 's', value: interval + 's' },\n        __interval_ms: { text: interval * 1000, value: interval * 1000 },\n        ...this.getRateIntervalScopedVariable(interval, scrapeInterval),\n        ...this.getRangeScopedVars(options.range),\n      });\n    }\n    query.step = interval;\n\n    let expr = target.expr;\n\n    // Apply adhoc filters\n    expr = this.enhanceExprWithAdHocFilters(expr);\n\n    // Only replace vars in expression after having (possibly) updated interval vars\n    query.expr = this.templateSrv.replace(expr, scopedVars, this.interpolateQueryExpr);\n\n    // Align query interval with step to allow query caching and to ensure\n    // that about-same-time query results look the same.\n    const adjusted = alignRange(start, end, query.step, this.timeSrv.timeRange().to.utcOffset() * 60);\n    query.start = adjusted.start;\n    query.end = adjusted.end;\n    this._addTracingHeaders(query, options);\n\n    return query;\n  }\n\n  getRateIntervalScopedVariable(interval: number, scrapeInterval: number) {\n    // Fall back to the default scrape interval of 15s if scrapeInterval is 0 for some reason.\n    if (scrapeInterval === 0) {\n      scrapeInterval = 15;\n    }\n    const rateInterval = Math.max(interval + scrapeInterval, 4 * scrapeInterval);\n    return { __rate_interval: { text: rateInterval + 's', value: rateInterval + 's' } };\n  }\n\n  adjustInterval(interval: number, minInterval: number, range: number, intervalFactor: number) {\n    // Prometheus will drop queries that might return more than 11000 data points.\n    // Calculate a safe interval as an additional minimum to take into account.\n    // Fractional safeIntervals are allowed, however serve little purpose if the interval is greater than 1\n    // If this is the case take the ceil of the value.\n    let safeInterval = range / 11000;\n    if (safeInterval > 1) {\n      safeInterval = Math.ceil(safeInterval);\n    }\n    return Math.max(interval * intervalFactor, minInterval, safeInterval);\n  }\n\n  performTimeSeriesQuery(query: PromQueryRequest, start: number, end: number) {\n    if (start > end) {\n      throw { message: 'Invalid time range' };\n    }\n\n    const url = '/api/v1/query_range';\n    const data: any = {\n      query: query.expr,\n      start,\n      end,\n      step: query.step,\n    };\n\n    if (this.queryTimeout) {\n      data['timeout'] = this.queryTimeout;\n    }\n\n    return this._request<PromDataSuccessResponse<PromMatrixData>>(url, data, {\n      requestId: query.requestId,\n      headers: query.headers,\n    }).pipe(\n      catchError((err: FetchError<PromDataErrorResponse<PromMatrixData>>) => {\n        if (err.cancelled) {\n          return of(err);\n        }\n\n        return throwError(this.handleErrors(err, query));\n      })\n    );\n  }\n\n  performInstantQuery(\n    query: PromQueryRequest,\n    time: number\n  ): Observable<FetchResponse<PromDataSuccessResponse<PromVectorData | PromScalarData>> | FetchError> {\n    const url = '/api/v1/query';\n    const data: any = {\n      query: query.expr,\n      time,\n    };\n\n    if (this.queryTimeout) {\n      data['timeout'] = this.queryTimeout;\n    }\n\n    return this._request<PromDataSuccessResponse<PromVectorData | PromScalarData>>(url, data, {\n      requestId: query.requestId,\n      headers: query.headers,\n    }).pipe(\n      catchError((err: FetchError<PromDataErrorResponse<PromVectorData | PromScalarData>>) => {\n        if (err.cancelled) {\n          return of(err);\n        }\n\n        return throwError(this.handleErrors(err, query));\n      })\n    );\n  }\n\n  handleErrors = (err: any, target: PromQuery) => {\n    const error: DataQueryError = {\n      message: (err && err.statusText) || 'Unknown error during query transaction. Please check JS console logs.',\n      refId: target.refId,\n    };\n\n    if (err.data) {\n      if (typeof err.data === 'string') {\n        error.message = err.data;\n      } else if (err.data.error) {\n        error.message = safeStringifyValue(err.data.error);\n      }\n    } else if (err.message) {\n      error.message = err.message;\n    } else if (typeof err === 'string') {\n      error.message = err;\n    }\n\n    error.status = err.status;\n    error.statusText = err.statusText;\n\n    return error;\n  };\n\n  metricFindQuery(query: string) {\n    if (!query) {\n      return Promise.resolve([]);\n    }\n\n    const scopedVars = {\n      __interval: { text: this.interval, value: this.interval },\n      __interval_ms: { text: rangeUtil.intervalToMs(this.interval), value: rangeUtil.intervalToMs(this.interval) },\n      ...this.getRangeScopedVars(this.timeSrv.timeRange()),\n    };\n    const interpolated = this.templateSrv.replace(query, scopedVars, this.interpolateQueryExpr);\n    const metricFindQuery = new PrometheusMetricFindQuery(this, interpolated);\n    return metricFindQuery.process();\n  }\n\n  getRangeScopedVars(range: TimeRange = this.timeSrv.timeRange()) {\n    const msRange = range.to.diff(range.from);\n    const sRange = Math.round(msRange / 1000);\n    return {\n      __range_ms: { text: msRange, value: msRange },\n      __range_s: { text: sRange, value: sRange },\n      __range: { text: sRange + 's', value: sRange + 's' },\n    };\n  }\n\n  async annotationQuery(options: any): Promise<AnnotationEvent[]> {\n    const annotation = options.annotation;\n    const { expr = '' } = annotation;\n\n    if (!expr) {\n      return Promise.resolve([]);\n    }\n\n    const step = options.annotation.step || ANNOTATION_QUERY_STEP_DEFAULT;\n    const queryModel = {\n      expr,\n      range: true,\n      instant: false,\n      exemplar: false,\n      interval: step,\n      queryType: PromQueryType.timeSeriesQuery,\n      refId: 'X',\n      datasource: this.getRef(),\n    };\n\n    return await lastValueFrom(\n      getBackendSrv()\n        .fetch<BackendDataSourceResponse>({\n          url: '/api/ds/query',\n          method: 'POST',\n          data: {\n            from: (this.getPrometheusTime(options.range.from, false) * 1000).toString(),\n            to: (this.getPrometheusTime(options.range.to, true) * 1000).toString(),\n            queries: [this.applyTemplateVariables(queryModel, {})],\n          },\n          requestId: `prom-query-${annotation.name}`,\n        })\n        .pipe(\n          map((rsp: FetchResponse<BackendDataSourceResponse>) => {\n            return this.processAnnotationResponse(options, rsp.data);\n          })\n        )\n    );\n  }\n\n  processAnnotationResponse = (options: any, data: BackendDataSourceResponse) => {\n    const frames: DataFrame[] = toDataQueryResponse({ data: data }).data;\n    if (!frames || !frames.length) {\n      return [];\n    }\n\n    const annotation = options.annotation;\n    const { tagKeys = '', titleFormat = '', textFormat = '' } = annotation;\n\n    const step = rangeUtil.intervalToSeconds(annotation.step || ANNOTATION_QUERY_STEP_DEFAULT) * 1000;\n    const tagKeysArray = tagKeys.split(',');\n\n    const eventList: AnnotationEvent[] = [];\n\n    for (const frame of frames) {\n      const timeField = frame.fields[0];\n      const valueField = frame.fields[1];\n      const labels = valueField?.labels || {};\n\n      const tags = Object.keys(labels)\n        .filter((label) => tagKeysArray.includes(label))\n        .map((label) => labels[label]);\n\n      const timeValueTuple: Array<[number, number]> = [];\n\n      let idx = 0;\n      valueField.values.toArray().forEach((value: string) => {\n        let timeStampValue: number;\n        let valueValue: number;\n        const time = timeField.values.get(idx);\n\n        // If we want to use value as a time, we use value as timeStampValue and valueValue will be 1\n        if (options.annotation.useValueForTime) {\n          timeStampValue = Math.floor(parseFloat(value));\n          valueValue = 1;\n        } else {\n          timeStampValue = Math.floor(parseFloat(time));\n          valueValue = parseFloat(value);\n        }\n\n        idx++;\n        timeValueTuple.push([timeStampValue, valueValue]);\n      });\n\n      const activeValues = timeValueTuple.filter((value) => value[1] >= 1);\n      const activeValuesTimestamps = activeValues.map((value) => value[0]);\n\n      // Instead of creating singular annotation for each active event we group events into region if they are less\n      // or equal to `step` apart.\n      let latestEvent: AnnotationEvent | null = null;\n\n      for (const timestamp of activeValuesTimestamps) {\n        // We already have event `open` and we have new event that is inside the `step` so we just update the end.\n        if (latestEvent && (latestEvent.timeEnd ?? 0) + step >= timestamp) {\n          latestEvent.timeEnd = timestamp;\n          continue;\n        }\n\n        // Event exists but new one is outside of the `step` so we add it to eventList.\n        if (latestEvent) {\n          eventList.push(latestEvent);\n        }\n\n        // We start a new region.\n        latestEvent = {\n          time: timestamp,\n          timeEnd: timestamp,\n          annotation,\n          title: renderTemplate(titleFormat, labels),\n          tags,\n          text: renderTemplate(textFormat, labels),\n        };\n      }\n\n      if (latestEvent) {\n        // Finish up last point if we have one\n        latestEvent.timeEnd = activeValuesTimestamps[activeValuesTimestamps.length - 1];\n        eventList.push(latestEvent);\n      }\n    }\n\n    return eventList;\n  };\n\n  getExemplars(query: PromQueryRequest) {\n    const url = '/api/v1/query_exemplars';\n    return this._request<PromDataSuccessResponse<PromExemplarData>>(\n      url,\n      { query: query.expr, start: query.start.toString(), end: query.end.toString() },\n      { requestId: query.requestId, headers: query.headers }\n    );\n  }\n\n  async getTagKeys() {\n    const result = await this.metadataRequest('/api/v1/labels');\n    return result?.data?.data?.map((value: any) => ({ text: value })) ?? [];\n  }\n\n  async getTagValues(options: { key?: string } = {}) {\n    const result = await this.metadataRequest(`/api/v1/label/${options.key}/values`);\n    return result?.data?.data?.map((value: any) => ({ text: value })) ?? [];\n  }\n\n  async testDatasource() {\n    const now = new Date().getTime();\n    const request: DataQueryRequest<PromQuery> = {\n      targets: [{ refId: 'test', expr: '1+1', instant: true }],\n      requestId: `${this.id}-health`,\n      scopedVars: {},\n      dashboardId: 0,\n      panelId: 0,\n      interval: '1m',\n      intervalMs: 60000,\n      maxDataPoints: 1,\n      range: {\n        from: dateTime(now - 1000),\n        to: dateTime(now),\n      },\n    } as DataQueryRequest<PromQuery>;\n\n    return lastValueFrom(this.query(request))\n      .then((res: DataQueryResponse) => {\n        if (!res || !res.data || res.state !== LoadingState.Done) {\n          return { status: 'error', message: `Error reading Prometheus: ${res?.error?.message}` };\n        } else {\n          return { status: 'success', message: 'Data source is working' };\n        }\n      })\n      .catch((err: any) => {\n        console.error('Prometheus Error', err);\n        return { status: 'error', message: err.message };\n      });\n  }\n\n  interpolateVariablesInQueries(queries: PromQuery[], scopedVars: ScopedVars): PromQuery[] {\n    let expandedQueries = queries;\n    if (queries && queries.length) {\n      expandedQueries = queries.map((query) => {\n        const expandedQuery = {\n          ...query,\n          datasource: this.getRef(),\n          expr: this.templateSrv.replace(query.expr, scopedVars, this.interpolateQueryExpr),\n          interval: this.templateSrv.replace(query.interval, scopedVars),\n        };\n        return expandedQuery;\n      });\n    }\n    return expandedQueries;\n  }\n\n  getQueryHints(query: PromQuery, result: any[]) {\n    return getQueryHints(query.expr ?? '', result, this);\n  }\n\n  getInitHints() {\n    return getInitHints(this);\n  }\n\n  async loadRules() {\n    try {\n      const res = await this.metadataRequest('/api/v1/rules');\n      const groups = res.data?.data?.groups;\n\n      if (groups) {\n        this.ruleMappings = extractRuleMappingFromGroups(groups);\n      }\n    } catch (e) {\n      console.log('Rules API is experimental. Ignore next error.');\n      console.error(e);\n    }\n  }\n\n  async areExemplarsAvailable() {\n    try {\n      const res = await this.metadataRequest('/api/v1/query_exemplars', { query: 'test' });\n      if (res.data.status === 'success') {\n        return true;\n      }\n      return false;\n    } catch (err) {\n      return false;\n    }\n  }\n\n  modifyQuery(query: PromQuery, action: any): PromQuery {\n    let expression = query.expr ?? '';\n    switch (action.type) {\n      case 'ADD_FILTER': {\n        expression = addLabelToQuery(expression, action.key, action.value);\n        break;\n      }\n      case 'ADD_FILTER_OUT': {\n        expression = addLabelToQuery(expression, action.key, action.value, '!=');\n        break;\n      }\n      case 'ADD_HISTOGRAM_QUANTILE': {\n        expression = `histogram_quantile(0.95, sum(rate(${expression}[5m])) by (le))`;\n        break;\n      }\n      case 'ADD_RATE': {\n        expression = `rate(${expression}[5m])`;\n        break;\n      }\n      case 'ADD_SUM': {\n        expression = `sum(${expression.trim()}) by ($1)`;\n        break;\n      }\n      case 'EXPAND_RULES': {\n        if (action.mapping) {\n          expression = expandRecordingRules(expression, action.mapping);\n        }\n        break;\n      }\n      default:\n        break;\n    }\n    return { ...query, expr: expression };\n  }\n\n  getPrometheusTime(date: string | DateTime, roundUp: boolean) {\n    if (typeof date === 'string') {\n      date = dateMath.parse(date, roundUp)!;\n    }\n\n    return Math.ceil(date.valueOf() / 1000);\n  }\n\n  getTimeRangeParams(): { start: string; end: string } {\n    const range = this.timeSrv.timeRange();\n    return {\n      start: this.getPrometheusTime(range.from, false).toString(),\n      end: this.getPrometheusTime(range.to, true).toString(),\n    };\n  }\n\n  getOriginalMetricName(labelData: { [key: string]: string }) {\n    return getOriginalMetricName(labelData);\n  }\n\n  enhanceExprWithAdHocFilters(expr: string) {\n    const adhocFilters = this.templateSrv.getAdhocFilters(this.name);\n    let finalQuery = expr;\n    finalQuery = adhocFilters.reduce((acc: string, filter: { key?: any; operator?: any; value?: any }) => {\n      const { key, operator } = filter;\n      let { value } = filter;\n      if (operator === '=~' || operator === '!~') {\n        value = prometheusRegularEscape(value);\n      }\n      return addLabelToQuery(acc, key, value, operator);\n    }, finalQuery);\n    return finalQuery;\n  }\n\n  // Used when running queries trough backend\n  filterQuery(query: PromQuery): boolean {\n    if (query.hide || !query.expr) {\n      return false;\n    }\n    return true;\n  }\n\n  // Used when running queries trough backend\n  applyTemplateVariables(target: PromQuery, scopedVars: ScopedVars): Record<string, any> {\n    const variables = cloneDeep(scopedVars);\n\n    // We want to interpolate these variables on backend\n    delete variables.__interval;\n    delete variables.__interval_ms;\n\n    //Add ad hoc filters\n    const expr = this.enhanceExprWithAdHocFilters(target.expr);\n\n    return {\n      ...target,\n      legendFormat: this.templateSrv.replace(target.legendFormat, variables),\n      expr: this.templateSrv.replace(expr, variables, this.interpolateQueryExpr),\n      interval: this.templateSrv.replace(target.interval, variables),\n    };\n  }\n}\n\n/**\n * Align query range to step.\n * Rounds start and end down to a multiple of step.\n * @param start Timestamp marking the beginning of the range.\n * @param end Timestamp marking the end of the range.\n * @param step Interval to align start and end with.\n * @param utcOffsetSec Number of seconds current timezone is offset from UTC\n */\nexport function alignRange(\n  start: number,\n  end: number,\n  step: number,\n  utcOffsetSec: number\n): { end: number; start: number } {\n  const alignedEnd = Math.floor((end + utcOffsetSec) / step) * step - utcOffsetSec;\n  const alignedStart = Math.floor((start + utcOffsetSec) / step) * step - utcOffsetSec;\n  return {\n    end: alignedEnd,\n    start: alignedStart,\n  };\n}\n\nexport function extractRuleMappingFromGroups(groups: any[]) {\n  return groups.reduce(\n    (mapping, group) =>\n      group.rules\n        .filter((rule: any) => rule.type === 'recording')\n        .reduce(\n          (acc: { [key: string]: string }, rule: any) => ({\n            ...acc,\n            [rule.name]: rule.query,\n          }),\n          mapping\n        ),\n    {}\n  );\n}\n\n// NOTE: these two functions are very similar to the escapeLabelValueIn* functions\n// in language_utils.ts, but they are not exactly the same algorithm, and we found\n// no way to reuse one in the another or vice versa.\nexport function prometheusRegularEscape(value: any) {\n  return typeof value === 'string' ? value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\\\\\'\") : value;\n}\n\nexport function prometheusSpecialRegexEscape(value: any) {\n  return typeof value === 'string' ? value.replace(/\\\\/g, '\\\\\\\\\\\\\\\\').replace(/[$^*{}\\[\\]\\'+?.()|]/g, '\\\\\\\\$&') : value;\n}\n","import { size } from 'lodash';\nimport { QueryHint, QueryFix } from '@grafana/data';\nimport { PrometheusDatasource } from './datasource';\n\n/**\n * Number of time series results needed before starting to suggest sum aggregation hints\n */\nexport const SUM_HINT_THRESHOLD_COUNT = 20;\n\nexport function getQueryHints(query: string, series?: any[], datasource?: PrometheusDatasource): QueryHint[] {\n  const hints = [];\n\n  // ..._bucket metric needs a histogram_quantile()\n  const histogramMetric = query.trim().match(/^\\w+_bucket$/);\n  if (histogramMetric) {\n    const label = 'Time series has buckets, you probably wanted a histogram.';\n    hints.push({\n      type: 'HISTOGRAM_QUANTILE',\n      label,\n      fix: {\n        label: 'Fix by adding histogram_quantile().',\n        action: {\n          type: 'ADD_HISTOGRAM_QUANTILE',\n          query,\n        },\n      } as QueryFix,\n    });\n  }\n\n  // Check for need of rate()\n  if (query.indexOf('rate(') === -1 && query.indexOf('increase(') === -1) {\n    // Use metric metadata for exact types\n    const nameMatch = query.match(/\\b(\\w+_(total|sum|count))\\b/);\n    let counterNameMetric = nameMatch ? nameMatch[1] : '';\n    const metricsMetadata = datasource?.languageProvider?.metricsMetadata ?? {};\n    const metricMetadataKeys = Object.keys(metricsMetadata);\n    let certain = false;\n\n    if (metricMetadataKeys.length > 0) {\n      counterNameMetric =\n        metricMetadataKeys.find((metricName) => {\n          // Only considering first type information, could be non-deterministic\n          const metadata = metricsMetadata[metricName];\n          if (metadata.type.toLowerCase() === 'counter') {\n            const metricRegex = new RegExp(`\\\\b${metricName}\\\\b`);\n            if (query.match(metricRegex)) {\n              certain = true;\n              return true;\n            }\n          }\n          return false;\n        }) ?? '';\n    }\n\n    if (counterNameMetric) {\n      const simpleMetric = query.trim().match(/^\\w+$/);\n      const verb = certain ? 'is' : 'looks like';\n      let label = `Metric ${counterNameMetric} ${verb} a counter.`;\n      let fix: QueryFix | undefined;\n\n      if (simpleMetric) {\n        fix = {\n          label: 'Fix by adding rate().',\n          action: {\n            type: 'ADD_RATE',\n            query,\n          },\n        };\n      } else {\n        label = `${label} Try applying a rate() function.`;\n      }\n\n      hints.push({\n        type: 'APPLY_RATE',\n        label,\n        fix,\n      });\n    }\n  }\n\n  // Check for recording rules expansion\n  if (datasource && datasource.ruleMappings) {\n    const mapping = datasource.ruleMappings;\n    const mappingForQuery = Object.keys(mapping).reduce((acc, ruleName) => {\n      if (query.search(ruleName) > -1) {\n        return {\n          ...acc,\n          [ruleName]: mapping[ruleName],\n        };\n      }\n      return acc;\n    }, {});\n    if (size(mappingForQuery) > 0) {\n      const label = 'Query contains recording rules.';\n      hints.push({\n        type: 'EXPAND_RULES',\n        label,\n        fix: ({\n          label: 'Expand rules',\n          action: {\n            type: 'EXPAND_RULES',\n            query,\n            mapping: mappingForQuery,\n          },\n        } as any) as QueryFix,\n      });\n    }\n  }\n\n  if (series && series.length >= SUM_HINT_THRESHOLD_COUNT) {\n    const simpleMetric = query.trim().match(/^\\w+$/);\n    if (simpleMetric) {\n      hints.push({\n        type: 'ADD_SUM',\n        label: 'Many time series results returned.',\n        fix: {\n          label: 'Consider aggregating with sum().',\n          action: {\n            type: 'ADD_SUM',\n            query: query,\n            preventSubmit: true,\n          },\n        } as QueryFix,\n      });\n    }\n  }\n\n  return hints;\n}\n\nexport function getInitHints(datasource: PrometheusDatasource): QueryHint[] {\n  const hints = [];\n  // Hint if using Loki as Prometheus data source\n  if (datasource.directUrl.includes('/loki') && !datasource.languageProvider.metrics.length) {\n    hints.push({\n      label: `Using Loki as a Prometheus data source is no longer supported. You must use the Loki data source for your Loki instance.`,\n      type: 'INFO',\n    });\n  }\n\n  // Hint for big disabled lookups\n  if (datasource.lookupsDisabled) {\n    hints.push({\n      label: `Labels and metrics lookup was disabled in data source settings.`,\n      type: 'INFO',\n    });\n  }\n\n  return hints;\n}\n","import React, { ChangeEvent } from 'react';\nimport {\n  Button,\n  HorizontalGroup,\n  Input,\n  Label,\n  LoadingPlaceholder,\n  stylesFactory,\n  withTheme,\n  BrowserLabel as PromLabel,\n} from '@grafana/ui';\nimport PromQlLanguageProvider from '../language_provider';\nimport { escapeLabelValueInExactSelector, escapeLabelValueInRegexSelector } from '../language_utils';\nimport { css, cx } from '@emotion/css';\nimport { FixedSizeList } from 'react-window';\n\nimport { GrafanaTheme } from '@grafana/data';\n\n// Hard limit on labels to render\nconst EMPTY_SELECTOR = '{}';\nconst METRIC_LABEL = '__name__';\nconst LIST_ITEM_SIZE = 25;\n\nexport interface BrowserProps {\n  languageProvider: PromQlLanguageProvider;\n  onChange: (selector: string) => void;\n  theme: GrafanaTheme;\n  autoSelect?: number;\n  hide?: () => void;\n  lastUsedLabels: string[];\n  storeLastUsedLabels: (labels: string[]) => void;\n  deleteLastUsedLabels: () => void;\n}\n\ninterface BrowserState {\n  labels: SelectableLabel[];\n  labelSearchTerm: string;\n  metricSearchTerm: string;\n  status: string;\n  error: string;\n  validationStatus: string;\n  valueSearchTerm: string;\n}\n\ninterface FacettableValue {\n  name: string;\n  selected?: boolean;\n  details?: string;\n}\n\nexport interface SelectableLabel {\n  name: string;\n  selected?: boolean;\n  loading?: boolean;\n  values?: FacettableValue[];\n  hidden?: boolean;\n  facets?: number;\n}\n\nexport function buildSelector(labels: SelectableLabel[]): string {\n  let singleMetric = '';\n  const selectedLabels = [];\n  for (const label of labels) {\n    if ((label.name === METRIC_LABEL || label.selected) && label.values && label.values.length > 0) {\n      const selectedValues = label.values.filter((value) => value.selected).map((value) => value.name);\n      if (selectedValues.length > 1) {\n        selectedLabels.push(`${label.name}=~\"${selectedValues.map(escapeLabelValueInRegexSelector).join('|')}\"`);\n      } else if (selectedValues.length === 1) {\n        if (label.name === METRIC_LABEL) {\n          singleMetric = selectedValues[0];\n        } else {\n          selectedLabels.push(`${label.name}=\"${escapeLabelValueInExactSelector(selectedValues[0])}\"`);\n        }\n      }\n    }\n  }\n  return [singleMetric, '{', selectedLabels.join(','), '}'].join('');\n}\n\nexport function facetLabels(\n  labels: SelectableLabel[],\n  possibleLabels: Record<string, string[]>,\n  lastFacetted?: string\n): SelectableLabel[] {\n  return labels.map((label) => {\n    const possibleValues = possibleLabels[label.name];\n    if (possibleValues) {\n      let existingValues: FacettableValue[];\n      if (label.name === lastFacetted && label.values) {\n        // Facetting this label, show all values\n        existingValues = label.values;\n      } else {\n        // Keep selection in other facets\n        const selectedValues: Set<string> = new Set(\n          label.values?.filter((value) => value.selected).map((value) => value.name) || []\n        );\n        // Values for this label have not been requested yet, let's use the facetted ones as the initial values\n        existingValues = possibleValues.map((value) => ({ name: value, selected: selectedValues.has(value) }));\n      }\n      return {\n        ...label,\n        loading: false,\n        values: existingValues,\n        hidden: !possibleValues,\n        facets: existingValues.length,\n      };\n    }\n\n    // Label is facetted out, hide all values\n    return { ...label, loading: false, hidden: !possibleValues, values: undefined, facets: 0 };\n  });\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n  wrapper: css`\n    background-color: ${theme.colors.bg2};\n    padding: ${theme.spacing.sm};\n    width: 100%;\n  `,\n  list: css`\n    margin-top: ${theme.spacing.sm};\n    display: flex;\n    flex-wrap: wrap;\n    max-height: 200px;\n    overflow: auto;\n    align-content: flex-start;\n  `,\n  section: css`\n    & + & {\n      margin: ${theme.spacing.md} 0;\n    }\n    position: relative;\n  `,\n  selector: css`\n    font-family: ${theme.typography.fontFamily.monospace};\n    margin-bottom: ${theme.spacing.sm};\n  `,\n  status: css`\n    padding: ${theme.spacing.xs};\n    color: ${theme.colors.textSemiWeak};\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    /* using absolute positioning because flex interferes with ellipsis */\n    position: absolute;\n    width: 50%;\n    right: 0;\n    text-align: right;\n    transition: opacity 100ms linear;\n    opacity: 0;\n  `,\n  statusShowing: css`\n    opacity: 1;\n  `,\n  error: css`\n    color: ${theme.palette.brandDanger};\n  `,\n  valueList: css`\n    margin-right: ${theme.spacing.sm};\n  `,\n  valueListWrapper: css`\n    border-left: 1px solid ${theme.colors.border2};\n    margin: ${theme.spacing.sm} 0;\n    padding: ${theme.spacing.sm} 0 ${theme.spacing.sm} ${theme.spacing.sm};\n  `,\n  valueListArea: css`\n    display: flex;\n    flex-wrap: wrap;\n    margin-top: ${theme.spacing.sm};\n  `,\n  valueTitle: css`\n    margin-left: -${theme.spacing.xs};\n    margin-bottom: ${theme.spacing.sm};\n  `,\n  validationStatus: css`\n    padding: ${theme.spacing.xs};\n    margin-bottom: ${theme.spacing.sm};\n    color: ${theme.colors.textStrong};\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n  `,\n}));\n\n/**\n * TODO #33976: Remove duplicated code. The component is very similar to LokiLabelBrowser.tsx. Check if it's possible\n *              to create a single, generic component.\n */\nexport class UnthemedPrometheusMetricsBrowser extends React.Component<BrowserProps, BrowserState> {\n  valueListsRef = React.createRef<HTMLDivElement>();\n  state: BrowserState = {\n    labels: [] as SelectableLabel[],\n    labelSearchTerm: '',\n    metricSearchTerm: '',\n    status: 'Ready',\n    error: '',\n    validationStatus: '',\n    valueSearchTerm: '',\n  };\n\n  onChangeLabelSearch = (event: ChangeEvent<HTMLInputElement>) => {\n    this.setState({ labelSearchTerm: event.target.value });\n  };\n\n  onChangeMetricSearch = (event: ChangeEvent<HTMLInputElement>) => {\n    this.setState({ metricSearchTerm: event.target.value });\n  };\n\n  onChangeValueSearch = (event: ChangeEvent<HTMLInputElement>) => {\n    this.setState({ valueSearchTerm: event.target.value });\n  };\n\n  onClickRunQuery = () => {\n    const selector = buildSelector(this.state.labels);\n    this.props.onChange(selector);\n  };\n\n  onClickRunRateQuery = () => {\n    const selector = buildSelector(this.state.labels);\n    const query = `rate(${selector}[$__interval])`;\n    this.props.onChange(query);\n  };\n\n  onClickClear = () => {\n    this.setState((state) => {\n      const labels: SelectableLabel[] = state.labels.map((label) => ({\n        ...label,\n        values: undefined,\n        selected: false,\n        loading: false,\n        hidden: false,\n        facets: undefined,\n      }));\n      return {\n        labels,\n        labelSearchTerm: '',\n        metricSearchTerm: '',\n        status: '',\n        error: '',\n        validationStatus: '',\n        valueSearchTerm: '',\n      };\n    });\n    this.props.deleteLastUsedLabels();\n    // Get metrics\n    this.fetchValues(METRIC_LABEL, EMPTY_SELECTOR);\n  };\n\n  onClickLabel = (name: string, value: string | undefined, event: React.MouseEvent<HTMLElement>) => {\n    const label = this.state.labels.find((l) => l.name === name);\n    if (!label) {\n      return;\n    }\n    // Toggle selected state\n    const selected = !label.selected;\n    let nextValue: Partial<SelectableLabel> = { selected };\n    if (label.values && !selected) {\n      // Deselect all values if label was deselected\n      const values = label.values.map((value) => ({ ...value, selected: false }));\n      nextValue = { ...nextValue, facets: 0, values };\n    }\n    // Resetting search to prevent empty results\n    this.setState({ labelSearchTerm: '' });\n    this.updateLabelState(name, nextValue, '', () => this.doFacettingForLabel(name));\n  };\n\n  onClickValue = (name: string, value: string | undefined, event: React.MouseEvent<HTMLElement>) => {\n    const label = this.state.labels.find((l) => l.name === name);\n    if (!label || !label.values) {\n      return;\n    }\n    // Resetting search to prevent empty results\n    this.setState({ labelSearchTerm: '' });\n    // Toggling value for selected label, leaving other values intact\n    const values = label.values.map((v) => ({ ...v, selected: v.name === value ? !v.selected : v.selected }));\n    this.updateLabelState(name, { values }, '', () => this.doFacetting(name));\n  };\n\n  onClickMetric = (name: string, value: string | undefined, event: React.MouseEvent<HTMLElement>) => {\n    // Finding special metric label\n    const label = this.state.labels.find((l) => l.name === name);\n    if (!label || !label.values) {\n      return;\n    }\n    // Resetting search to prevent empty results\n    this.setState({ metricSearchTerm: '' });\n    // Toggling value for selected label, leaving other values intact\n    const values = label.values.map((v) => ({\n      ...v,\n      selected: v.name === value || v.selected ? !v.selected : v.selected,\n    }));\n    // Toggle selected state of special metrics label\n    const selected = values.some((v) => v.selected);\n    this.updateLabelState(name, { selected, values }, '', () => this.doFacetting(name));\n  };\n\n  onClickValidate = () => {\n    const selector = buildSelector(this.state.labels);\n    this.validateSelector(selector);\n  };\n\n  updateLabelState(name: string, updatedFields: Partial<SelectableLabel>, status = '', cb?: () => void) {\n    this.setState((state) => {\n      const labels: SelectableLabel[] = state.labels.map((label) => {\n        if (label.name === name) {\n          return { ...label, ...updatedFields };\n        }\n        return label;\n      });\n      // New status overrides errors\n      const error = status ? '' : state.error;\n      return { labels, status, error, validationStatus: '' };\n    }, cb);\n  }\n\n  componentDidMount() {\n    const { languageProvider, lastUsedLabels } = this.props;\n    if (languageProvider) {\n      const selectedLabels: string[] = lastUsedLabels;\n      languageProvider.start().then(() => {\n        let rawLabels: string[] = languageProvider.getLabelKeys();\n        // Get metrics\n        this.fetchValues(METRIC_LABEL, EMPTY_SELECTOR);\n        // Auto-select previously selected labels\n        const labels: SelectableLabel[] = rawLabels.map((label, i, arr) => ({\n          name: label,\n          selected: selectedLabels.includes(label),\n          loading: false,\n        }));\n        // Pre-fetch values for selected labels\n        this.setState({ labels }, () => {\n          this.state.labels.forEach((label) => {\n            if (label.selected) {\n              this.fetchValues(label.name, EMPTY_SELECTOR);\n            }\n          });\n        });\n      });\n    }\n  }\n\n  doFacettingForLabel(name: string) {\n    const label = this.state.labels.find((l) => l.name === name);\n    if (!label) {\n      return;\n    }\n    const selectedLabels = this.state.labels.filter((label) => label.selected).map((label) => label.name);\n    this.props.storeLastUsedLabels(selectedLabels);\n    if (label.selected) {\n      // Refetch values for newly selected label...\n      if (!label.values) {\n        this.fetchValues(name, buildSelector(this.state.labels));\n      }\n    } else {\n      // Only need to facet when deselecting labels\n      this.doFacetting();\n    }\n  }\n\n  doFacetting = (lastFacetted?: string) => {\n    const selector = buildSelector(this.state.labels);\n    if (selector === EMPTY_SELECTOR) {\n      // Clear up facetting\n      const labels: SelectableLabel[] = this.state.labels.map((label) => {\n        return { ...label, facets: 0, values: undefined, hidden: false };\n      });\n      this.setState({ labels }, () => {\n        // Get fresh set of values\n        this.state.labels.forEach(\n          (label) => (label.selected || label.name === METRIC_LABEL) && this.fetchValues(label.name, selector)\n        );\n      });\n    } else {\n      // Do facetting\n      this.fetchSeries(selector, lastFacetted);\n    }\n  };\n\n  async fetchValues(name: string, selector: string) {\n    const { languageProvider } = this.props;\n    this.updateLabelState(name, { loading: true }, `Fetching values for ${name}`);\n    try {\n      let rawValues = await languageProvider.getLabelValues(name);\n      // If selector changed, clear loading state and discard result by returning early\n      if (selector !== buildSelector(this.state.labels)) {\n        this.updateLabelState(name, { loading: false });\n        return;\n      }\n      const values: FacettableValue[] = [];\n      const { metricsMetadata } = languageProvider;\n      for (const labelValue of rawValues) {\n        const value: FacettableValue = { name: labelValue };\n        // Adding type/help text to metrics\n        if (name === METRIC_LABEL && metricsMetadata) {\n          const meta = metricsMetadata[labelValue];\n          if (meta) {\n            value.details = `(${meta.type}) ${meta.help}`;\n          }\n        }\n        values.push(value);\n      }\n      this.updateLabelState(name, { values, loading: false });\n    } catch (error) {\n      console.error(error);\n    }\n  }\n\n  async fetchSeries(selector: string, lastFacetted?: string) {\n    const { languageProvider } = this.props;\n    if (lastFacetted) {\n      this.updateLabelState(lastFacetted, { loading: true }, `Facetting labels for ${selector}`);\n    }\n    try {\n      const possibleLabels = await languageProvider.fetchSeriesLabels(selector, true);\n      // If selector changed, clear loading state and discard result by returning early\n      if (selector !== buildSelector(this.state.labels)) {\n        if (lastFacetted) {\n          this.updateLabelState(lastFacetted, { loading: false });\n        }\n        return;\n      }\n      if (Object.keys(possibleLabels).length === 0) {\n        this.setState({ error: `Empty results, no matching label for ${selector}` });\n        return;\n      }\n      const labels: SelectableLabel[] = facetLabels(this.state.labels, possibleLabels, lastFacetted);\n      this.setState({ labels, error: '' });\n      if (lastFacetted) {\n        this.updateLabelState(lastFacetted, { loading: false });\n      }\n    } catch (error) {\n      console.error(error);\n    }\n  }\n\n  async validateSelector(selector: string) {\n    const { languageProvider } = this.props;\n    this.setState({ validationStatus: `Validating selector ${selector}`, error: '' });\n    const streams = await languageProvider.fetchSeries(selector);\n    this.setState({ validationStatus: `Selector is valid (${streams.length} series found)` });\n  }\n\n  render() {\n    const { theme } = this.props;\n    const { labels, labelSearchTerm, metricSearchTerm, status, error, validationStatus, valueSearchTerm } = this.state;\n    const styles = getStyles(theme);\n    if (labels.length === 0) {\n      return (\n        <div className={styles.wrapper}>\n          <LoadingPlaceholder text=\"Loading labels...\" />\n        </div>\n      );\n    }\n\n    // Filter metrics\n    let metrics = labels.find((label) => label.name === METRIC_LABEL);\n    if (metrics && metricSearchTerm) {\n      metrics = {\n        ...metrics,\n        values: metrics.values?.filter((value) => value.selected || value.name.includes(metricSearchTerm)),\n      };\n    }\n\n    // Filter labels\n    let nonMetricLabels = labels.filter((label) => !label.hidden && label.name !== METRIC_LABEL);\n    if (labelSearchTerm) {\n      nonMetricLabels = nonMetricLabels.filter((label) => label.selected || label.name.includes(labelSearchTerm));\n    }\n\n    // Filter non-metric label values\n    let selectedLabels = nonMetricLabels.filter((label) => label.selected && label.values);\n    if (valueSearchTerm) {\n      selectedLabels = selectedLabels.map((label) => ({\n        ...label,\n        values: label.values?.filter((value) => value.selected || value.name.includes(valueSearchTerm)),\n      }));\n    }\n    const selector = buildSelector(this.state.labels);\n    const empty = selector === EMPTY_SELECTOR;\n    const metricCount = metrics?.values?.length || 0;\n\n    return (\n      <div className={styles.wrapper}>\n        <HorizontalGroup align=\"flex-start\" spacing=\"lg\">\n          <div>\n            <div className={styles.section}>\n              <Label description=\"Once a metric is selected only possible labels are shown.\">1. Select a metric</Label>\n              <div>\n                <Input\n                  onChange={this.onChangeMetricSearch}\n                  aria-label=\"Filter expression for metric\"\n                  value={metricSearchTerm}\n                />\n              </div>\n              <div role=\"list\" className={styles.valueListWrapper}>\n                <FixedSizeList\n                  height={Math.min(450, metricCount * LIST_ITEM_SIZE)}\n                  itemCount={metricCount}\n                  itemSize={LIST_ITEM_SIZE}\n                  itemKey={(i) => (metrics!.values as FacettableValue[])[i].name}\n                  width={300}\n                  className={styles.valueList}\n                >\n                  {({ index, style }) => {\n                    const value = metrics?.values?.[index];\n                    if (!value) {\n                      return null;\n                    }\n                    return (\n                      <div style={style}>\n                        <PromLabel\n                          name={metrics!.name}\n                          value={value?.name}\n                          title={value.details}\n                          active={value?.selected}\n                          onClick={this.onClickMetric}\n                          searchTerm={metricSearchTerm}\n                        />\n                      </div>\n                    );\n                  }}\n                </FixedSizeList>\n              </div>\n            </div>\n          </div>\n\n          <div>\n            <div className={styles.section}>\n              <Label description=\"Once label values are selected, only possible label combinations are shown.\">\n                2. Select labels to search in\n              </Label>\n              <div>\n                <Input\n                  onChange={this.onChangeLabelSearch}\n                  aria-label=\"Filter expression for label\"\n                  value={labelSearchTerm}\n                />\n              </div>\n              {/* Using fixed height here to prevent jumpy layout */}\n              <div className={styles.list} style={{ height: 120 }}>\n                {nonMetricLabels.map((label) => (\n                  <PromLabel\n                    key={label.name}\n                    name={label.name}\n                    loading={label.loading}\n                    active={label.selected}\n                    hidden={label.hidden}\n                    facets={label.facets}\n                    onClick={this.onClickLabel}\n                    searchTerm={labelSearchTerm}\n                  />\n                ))}\n              </div>\n            </div>\n            <div className={styles.section}>\n              <Label description=\"Use the search field to find values across selected labels.\">\n                3. Select (multiple) values for your labels\n              </Label>\n              <div>\n                <Input\n                  onChange={this.onChangeValueSearch}\n                  aria-label=\"Filter expression for label values\"\n                  value={valueSearchTerm}\n                />\n              </div>\n              <div className={styles.valueListArea} ref={this.valueListsRef}>\n                {selectedLabels.map((label) => (\n                  <div\n                    role=\"list\"\n                    key={label.name}\n                    aria-label={`Values for ${label.name}`}\n                    className={styles.valueListWrapper}\n                  >\n                    <div className={styles.valueTitle}>\n                      <PromLabel\n                        name={label.name}\n                        loading={label.loading}\n                        active={label.selected}\n                        hidden={label.hidden}\n                        //If no facets, we want to show number of all label values\n                        facets={label.facets || label.values?.length}\n                        onClick={this.onClickLabel}\n                      />\n                    </div>\n                    <FixedSizeList\n                      height={Math.min(200, LIST_ITEM_SIZE * (label.values?.length || 0))}\n                      itemCount={label.values?.length || 0}\n                      itemSize={28}\n                      itemKey={(i) => (label.values as FacettableValue[])[i].name}\n                      width={200}\n                      className={styles.valueList}\n                    >\n                      {({ index, style }) => {\n                        const value = label.values?.[index];\n                        if (!value) {\n                          return null;\n                        }\n                        return (\n                          <div style={style}>\n                            <PromLabel\n                              name={label.name}\n                              value={value?.name}\n                              active={value?.selected}\n                              onClick={this.onClickValue}\n                              searchTerm={valueSearchTerm}\n                            />\n                          </div>\n                        );\n                      }}\n                    </FixedSizeList>\n                  </div>\n                ))}\n              </div>\n            </div>\n          </div>\n        </HorizontalGroup>\n\n        <div className={styles.section}>\n          <Label>4. Resulting selector</Label>\n          <div aria-label=\"selector\" className={styles.selector}>\n            {selector}\n          </div>\n          {validationStatus && <div className={styles.validationStatus}>{validationStatus}</div>}\n          <HorizontalGroup>\n            <Button aria-label=\"Use selector for query button\" disabled={empty} onClick={this.onClickRunQuery}>\n              Use query\n            </Button>\n            <Button\n              aria-label=\"Use selector as metrics button\"\n              variant=\"secondary\"\n              disabled={empty}\n              onClick={this.onClickRunRateQuery}\n            >\n              Use as rate query\n            </Button>\n            <Button\n              aria-label=\"Validate submit button\"\n              variant=\"secondary\"\n              disabled={empty}\n              onClick={this.onClickValidate}\n            >\n              Validate selector\n            </Button>\n            <Button aria-label=\"Selector clear button\" variant=\"secondary\" onClick={this.onClickClear}>\n              Clear\n            </Button>\n            <div className={cx(styles.status, (status || error) && styles.statusShowing)}>\n              <span className={error ? styles.error : ''}>{error || status}</span>\n            </div>\n          </HorizontalGroup>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport const PrometheusMetricsBrowser = withTheme(UnthemedPrometheusMetricsBrowser);\n","import React, { Suspense } from 'react';\nimport { Props } from './MonacoQueryFieldProps';\n\nconst Field = React.lazy(() => import(/* webpackChunkName: \"prom-query-field\" */ './MonacoQueryField'));\n\nexport const MonacoQueryFieldLazy = (props: Props) => {\n  return (\n    <Suspense fallback={null}>\n      <Field {...props} />\n    </Suspense>\n  );\n};\n","import React, { useRef } from 'react';\nimport { MonacoQueryFieldLazy } from './MonacoQueryFieldLazy';\nimport { Props as MonacoProps } from './MonacoQueryFieldProps';\n\ntype Props = Omit<MonacoProps, 'onRunQuery' | 'onBlur'> & {\n  onChange: (query: string) => void;\n  onRunQuery: () => void;\n  runQueryOnBlur: boolean;\n};\n\nexport const MonacoQueryFieldWrapper = (props: Props) => {\n  const lastRunValueRef = useRef<string | null>(null);\n  const { runQueryOnBlur, onRunQuery, onChange, ...rest } = props;\n\n  const handleRunQuery = (value: string) => {\n    lastRunValueRef.current = value;\n    onChange(value);\n    onRunQuery();\n  };\n\n  const handleBlur = (value: string) => {\n    if (runQueryOnBlur) {\n      // run handleRunQuery only if the current value is different from the last-time-executed value\n      if (value !== lastRunValueRef.current) {\n        handleRunQuery(value);\n      }\n    } else {\n      onChange(value);\n    }\n  };\n\n  return <MonacoQueryFieldLazy onRunQuery={handleRunQuery} onBlur={handleBlur} {...rest} />;\n};\n","import React, { ReactNode } from 'react';\n\nimport { Plugin } from 'slate';\nimport {\n  SlatePrism,\n  TypeaheadInput,\n  TypeaheadOutput,\n  BracesPlugin,\n  DOMUtil,\n  SuggestionsState,\n  Icon,\n} from '@grafana/ui';\n\nimport { LanguageMap, languages as prismLanguages } from 'prismjs';\n\n// dom also includes Element polyfills\nimport { PromQuery, PromOptions } from '../types';\nimport { roundMsToMin } from '../language_utils';\nimport { CancelablePromise, makePromiseCancelable } from 'app/core/utils/CancelablePromise';\nimport { QueryEditorProps, QueryHint, isDataFrame, toLegacyResponseData, TimeRange, CoreApp } from '@grafana/data';\nimport { PrometheusDatasource } from '../datasource';\nimport { PrometheusMetricsBrowser } from './PrometheusMetricsBrowser';\nimport { MonacoQueryFieldWrapper } from './monaco-query-field/MonacoQueryFieldWrapper';\nimport { LocalStorageValueProvider } from 'app/core/components/LocalStorageValueProvider';\n\nexport const RECORDING_RULES_GROUP = '__recording_rules__';\nconst LAST_USED_LABELS_KEY = 'grafana.datasources.prometheus.browser.labels';\n\nfunction getChooserText(metricsLookupDisabled: boolean, hasSyntax: boolean, hasMetrics: boolean) {\n  if (metricsLookupDisabled) {\n    return '(Disabled)';\n  }\n\n  if (!hasSyntax) {\n    return 'Loading metrics...';\n  }\n\n  if (!hasMetrics) {\n    return '(No metrics found)';\n  }\n\n  return 'Metrics browser';\n}\n\nexport function willApplySuggestion(suggestion: string, { typeaheadContext, typeaheadText }: SuggestionsState): string {\n  // Modify suggestion based on context\n  switch (typeaheadContext) {\n    case 'context-labels': {\n      const nextChar = DOMUtil.getNextCharacter();\n      if (!nextChar || nextChar === '}' || nextChar === ',') {\n        suggestion += '=';\n      }\n      break;\n    }\n\n    case 'context-label-values': {\n      // Always add quotes and remove existing ones instead\n      if (!typeaheadText.match(/^(!?=~?\"|\")/)) {\n        suggestion = `\"${suggestion}`;\n      }\n      if (DOMUtil.getNextCharacter() !== '\"') {\n        suggestion = `${suggestion}\"`;\n      }\n      break;\n    }\n\n    default:\n  }\n  return suggestion;\n}\n\ninterface PromQueryFieldProps extends QueryEditorProps<PrometheusDatasource, PromQuery, PromOptions> {\n  ExtraFieldElement?: ReactNode;\n  'data-testid'?: string;\n}\n\ninterface PromQueryFieldState {\n  labelBrowserVisible: boolean;\n  syntaxLoaded: boolean;\n  hint: QueryHint | null;\n}\n\nclass PromQueryField extends React.PureComponent<PromQueryFieldProps, PromQueryFieldState> {\n  plugins: Plugin[];\n  declare languageProviderInitializationPromise: CancelablePromise<any>;\n\n  constructor(props: PromQueryFieldProps, context: React.Context<any>) {\n    super(props, context);\n\n    this.plugins = [\n      BracesPlugin(),\n      SlatePrism(\n        {\n          onlyIn: (node: any) => node.type === 'code_block',\n          getSyntax: (node: any) => 'promql',\n        },\n        { ...(prismLanguages as LanguageMap), promql: this.props.datasource.languageProvider.syntax }\n      ),\n    ];\n\n    this.state = {\n      labelBrowserVisible: false,\n      syntaxLoaded: false,\n      hint: null,\n    };\n  }\n\n  componentDidMount() {\n    if (this.props.datasource.languageProvider) {\n      this.refreshMetrics();\n    }\n    this.refreshHint();\n  }\n\n  componentWillUnmount() {\n    if (this.languageProviderInitializationPromise) {\n      this.languageProviderInitializationPromise.cancel();\n    }\n  }\n\n  componentDidUpdate(prevProps: PromQueryFieldProps) {\n    const {\n      data,\n      datasource: { languageProvider },\n      range,\n    } = this.props;\n\n    if (languageProvider !== prevProps.datasource.languageProvider) {\n      // We reset this only on DS change so we do not flesh loading state on every rangeChange which happens on every\n      // query run if using relative range.\n      this.setState({\n        syntaxLoaded: false,\n      });\n    }\n\n    const changedRangeToRefresh = this.rangeChangedToRefresh(range, prevProps.range);\n    // We want to refresh metrics when language provider changes and/or when range changes (we round up intervals to a minute)\n    if (languageProvider !== prevProps.datasource.languageProvider || changedRangeToRefresh) {\n      this.refreshMetrics();\n    }\n\n    if (data && prevProps.data && prevProps.data.series !== data.series) {\n      this.refreshHint();\n    }\n  }\n\n  refreshHint = () => {\n    const { datasource, query, data } = this.props;\n    const initHints = datasource.getInitHints();\n    const initHint = initHints.length > 0 ? initHints[0] : null;\n\n    if (!data || data.series.length === 0) {\n      this.setState({\n        hint: initHint,\n      });\n      return;\n    }\n\n    const result = isDataFrame(data.series[0]) ? data.series.map(toLegacyResponseData) : data.series;\n    const queryHints = datasource.getQueryHints(query, result);\n    let queryHint = queryHints.length > 0 ? queryHints[0] : null;\n\n    this.setState({ hint: queryHint ?? initHint });\n  };\n\n  refreshMetrics = async () => {\n    const {\n      datasource: { languageProvider },\n    } = this.props;\n\n    this.languageProviderInitializationPromise = makePromiseCancelable(languageProvider.start());\n\n    try {\n      const remainingTasks = await this.languageProviderInitializationPromise.promise;\n      await Promise.all(remainingTasks);\n      this.onUpdateLanguage();\n    } catch (err) {\n      if (!err.isCanceled) {\n        throw err;\n      }\n    }\n  };\n\n  rangeChangedToRefresh(range?: TimeRange, prevRange?: TimeRange): boolean {\n    if (range && prevRange) {\n      const sameMinuteFrom = roundMsToMin(range.from.valueOf()) === roundMsToMin(prevRange.from.valueOf());\n      const sameMinuteTo = roundMsToMin(range.to.valueOf()) === roundMsToMin(prevRange.to.valueOf());\n      // If both are same, don't need to refresh.\n      return !(sameMinuteFrom && sameMinuteTo);\n    }\n    return false;\n  }\n\n  /**\n   * TODO #33976: Remove this, add histogram group (query = `histogram_quantile(0.95, sum(rate(${metric}[5m])) by (le))`;)\n   */\n  onChangeLabelBrowser = (selector: string) => {\n    this.onChangeQuery(selector, true);\n    this.setState({ labelBrowserVisible: false });\n  };\n\n  onChangeQuery = (value: string, override?: boolean) => {\n    // Send text change to parent\n    const { query, onChange, onRunQuery } = this.props;\n    if (onChange) {\n      const nextQuery: PromQuery = { ...query, expr: value };\n      onChange(nextQuery);\n\n      if (override && onRunQuery) {\n        onRunQuery();\n      }\n    }\n  };\n\n  onClickChooserButton = () => {\n    this.setState((state) => ({ labelBrowserVisible: !state.labelBrowserVisible }));\n  };\n\n  onClickHintFix = () => {\n    const { datasource, query, onChange, onRunQuery } = this.props;\n    const { hint } = this.state;\n\n    onChange(datasource.modifyQuery(query, hint!.fix!.action));\n    onRunQuery();\n  };\n\n  onUpdateLanguage = () => {\n    const {\n      datasource: { languageProvider },\n    } = this.props;\n    const { metrics } = languageProvider;\n\n    if (!metrics) {\n      return;\n    }\n\n    this.setState({ syntaxLoaded: true });\n  };\n\n  onTypeahead = async (typeahead: TypeaheadInput): Promise<TypeaheadOutput> => {\n    const {\n      datasource: { languageProvider },\n    } = this.props;\n\n    if (!languageProvider) {\n      return { suggestions: [] };\n    }\n\n    const { history } = this.props;\n    const { prefix, text, value, wrapperClasses, labelKey } = typeahead;\n\n    const result = await languageProvider.provideCompletionItems(\n      { text, value, prefix, wrapperClasses, labelKey },\n      { history }\n    );\n\n    return result;\n  };\n\n  render() {\n    const {\n      datasource,\n      datasource: { languageProvider },\n      query,\n      ExtraFieldElement,\n      history = [],\n    } = this.props;\n\n    const { labelBrowserVisible, syntaxLoaded, hint } = this.state;\n    const hasMetrics = languageProvider.metrics.length > 0;\n    const chooserText = getChooserText(datasource.lookupsDisabled, syntaxLoaded, hasMetrics);\n    const buttonDisabled = !(syntaxLoaded && hasMetrics);\n\n    return (\n      <LocalStorageValueProvider<string[]> storageKey={LAST_USED_LABELS_KEY} defaultValue={[]}>\n        {(lastUsedLabels, onLastUsedLabelsSave, onLastUsedLabelsDelete) => {\n          return (\n            <>\n              <div\n                className=\"gf-form-inline gf-form-inline--xs-view-flex-column flex-grow-1\"\n                data-testid={this.props['data-testid']}\n              >\n                <button\n                  className=\"gf-form-label query-keyword pointer\"\n                  onClick={this.onClickChooserButton}\n                  disabled={buttonDisabled}\n                >\n                  {chooserText}\n                  <Icon name={labelBrowserVisible ? 'angle-down' : 'angle-right'} />\n                </button>\n\n                <div className=\"gf-form gf-form--grow flex-shrink-1 min-width-15\">\n                  <MonacoQueryFieldWrapper\n                    runQueryOnBlur={this.props.app !== CoreApp.Explore}\n                    languageProvider={languageProvider}\n                    history={history}\n                    onChange={this.onChangeQuery}\n                    onRunQuery={this.props.onRunQuery}\n                    initialValue={query.expr ?? ''}\n                  />\n                </div>\n              </div>\n              {labelBrowserVisible && (\n                <div className=\"gf-form\">\n                  <PrometheusMetricsBrowser\n                    languageProvider={languageProvider}\n                    onChange={this.onChangeLabelBrowser}\n                    lastUsedLabels={lastUsedLabels || []}\n                    storeLastUsedLabels={onLastUsedLabelsSave}\n                    deleteLastUsedLabels={onLastUsedLabelsDelete}\n                  />\n                </div>\n              )}\n\n              {ExtraFieldElement}\n              {hint ? (\n                <div className=\"query-row-break\">\n                  <div className=\"prom-query-field-info text-warning\">\n                    {hint.label}{' '}\n                    {hint.fix ? (\n                      <a className=\"text-link muted\" onClick={this.onClickHintFix}>\n                        {hint.fix.label}\n                      </a>\n                    ) : null}\n                  </div>\n                </div>\n              ) : null}\n            </>\n          );\n        }}\n      </LocalStorageValueProvider>\n    );\n  }\n}\n\nexport default PromQueryField;\n","// https://github.com/facebook/react/issues/5465\n\nexport interface CancelablePromise<T> {\n  promise: Promise<T>;\n  cancel: () => void;\n}\n\nexport const makePromiseCancelable = <T>(promise: Promise<T>): CancelablePromise<T> => {\n  let hasCanceled_ = false;\n\n  const wrappedPromise = new Promise<T>((resolve, reject) => {\n    promise.then((val) => (hasCanceled_ ? reject({ isCanceled: true }) : resolve(val)));\n    promise.catch((error) => (hasCanceled_ ? reject({ isCanceled: true }) : reject(error)));\n  });\n\n  return {\n    promise: wrappedPromise,\n    cancel() {\n      hasCanceled_ = true;\n    },\n  };\n};\n","import { map } from 'lodash';\nimport React, { FC, useEffect, useState, memo } from 'react';\n\nimport { PrometheusDatasource } from '../datasource';\nimport { PromQuery } from '../types';\nimport { DataQueryRequest, PanelData, ScopedVars, textUtil, rangeUtil } from '@grafana/data';\n\ninterface Props {\n  datasource: PrometheusDatasource;\n  query: PromQuery;\n  panelData?: PanelData;\n}\n\nconst PromLink: FC<Props> = ({ panelData, query, datasource }) => {\n  const [href, setHref] = useState('');\n\n  useEffect(() => {\n    if (panelData) {\n      const getExternalLink = () => {\n        if (!panelData.request) {\n          return '';\n        }\n\n        const {\n          request: { range, interval, scopedVars },\n        } = panelData;\n\n        const start = datasource.getPrometheusTime(range.from, false);\n        const end = datasource.getPrometheusTime(range.to, true);\n        const rangeDiff = Math.ceil(end - start);\n        const endTime = range.to.utc().format('YYYY-MM-DD HH:mm');\n\n        const enrichedScopedVars: ScopedVars = {\n          ...scopedVars,\n          // As we support $__rate_interval variable in min step, we need add it to scopedVars\n          ...datasource.getRateIntervalScopedVariable(\n            rangeUtil.intervalToSeconds(interval),\n            rangeUtil.intervalToSeconds(datasource.interval)\n          ),\n        };\n\n        const options = {\n          interval,\n          scopedVars: enrichedScopedVars,\n        } as DataQueryRequest<PromQuery>;\n\n        const customQueryParameters: { [key: string]: string } = {};\n        if (datasource.customQueryParameters) {\n          for (const [k, v] of datasource.customQueryParameters) {\n            customQueryParameters[k] = v;\n          }\n        }\n\n        const queryOptions = datasource.createQuery(query, options, start, end);\n\n        const expr = {\n          ...customQueryParameters,\n          'g0.expr': queryOptions.expr,\n          'g0.range_input': rangeDiff + 's',\n          'g0.end_input': endTime,\n          'g0.step_input': queryOptions.step,\n          'g0.tab': 0,\n        };\n\n        const args = map(expr, (v: string, k: string) => {\n          return k + '=' + encodeURIComponent(v);\n        }).join('&');\n        return `${datasource.directUrl}/graph?${args}`;\n      };\n\n      setHref(getExternalLink());\n    }\n  }, [datasource, panelData, query]);\n\n  return (\n    <a href={textUtil.sanitizeUrl(href)} target=\"_blank\" rel=\"noopener noreferrer\">\n      Prometheus\n    </a>\n  );\n};\n\nexport default memo(PromLink);\n","import { GrafanaTheme2 } from '@grafana/data';\nimport { IconButton, InlineLabel, Tooltip, useStyles2 } from '@grafana/ui';\nimport { css, cx } from '@emotion/css';\nimport React, { useEffect, useState } from 'react';\nimport { usePrevious } from 'react-use';\nimport { PrometheusDatasource } from '../datasource';\nimport { PromQuery } from '../types';\n\ninterface Props {\n  onChange: (exemplar: boolean) => void;\n  datasource: PrometheusDatasource;\n  query: PromQuery;\n  'data-testid'?: string;\n}\n\nexport function PromExemplarField({ datasource, onChange, query, ...rest }: Props) {\n  const [error, setError] = useState<string | null>(null);\n  const styles = useStyles2(getStyles);\n  const prevError = usePrevious(error);\n\n  useEffect(() => {\n    if (!datasource.exemplarsAvailable) {\n      setError('Exemplars for this query are not available');\n      onChange(false);\n    } else if (query.instant && !query.range) {\n      setError('Exemplars are not available for instant queries');\n      onChange(false);\n    } else {\n      setError(null);\n      // If error is cleared, we want to change exemplar to true\n      if (prevError && !error) {\n        onChange(true);\n      }\n    }\n  }, [datasource.exemplarsAvailable, query.instant, query.range, onChange, prevError, error]);\n\n  const iconButtonStyles = cx(\n    {\n      [styles.activeIcon]: !!query.exemplar,\n    },\n    styles.eyeIcon\n  );\n\n  return (\n    <InlineLabel width=\"auto\" data-testid={rest['data-testid']}>\n      <Tooltip content={error ?? ''}>\n        <div className={styles.iconWrapper}>\n          Exemplars\n          <IconButton\n            name=\"eye\"\n            tooltip={!!query.exemplar ? 'Disable query with exemplars' : 'Enable query with exemplars'}\n            disabled={!!error}\n            className={iconButtonStyles}\n            onClick={() => {\n              onChange(!query.exemplar);\n            }}\n          />\n        </div>\n      </Tooltip>\n    </InlineLabel>\n  );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n  return {\n    eyeIcon: css`\n      margin-left: ${theme.spacing(2)};\n    `,\n    activeIcon: css`\n      color: ${theme.colors.primary.main};\n    `,\n    iconWrapper: css`\n      display: flex;\n      align-items: center;\n    `,\n  };\n}\n","import { map } from 'lodash';\nimport React, { PureComponent } from 'react';\n\n// Types\nimport { InlineFormLabel, LegacyForms, Select } from '@grafana/ui';\nimport { CoreApp, SelectableValue } from '@grafana/data';\nimport { PromQuery } from '../types';\n\nimport PromQueryField from './PromQueryField';\nimport PromLink from './PromLink';\nimport { PromExemplarField } from './PromExemplarField';\nimport { PromQueryEditorProps } from './types';\n\nconst { Switch } = LegacyForms;\n\nconst FORMAT_OPTIONS: Array<SelectableValue<string>> = [\n  { label: 'Time series', value: 'time_series' },\n  { label: 'Table', value: 'table' },\n  { label: 'Heatmap', value: 'heatmap' },\n];\n\nconst INTERVAL_FACTOR_OPTIONS: Array<SelectableValue<number>> = map([1, 2, 3, 4, 5, 10], (value: number) => ({\n  value,\n  label: '1/' + value,\n}));\n\ninterface State {\n  legendFormat?: string;\n  formatOption: SelectableValue<string>;\n  interval?: string;\n  intervalFactorOption: SelectableValue<number>;\n  instant: boolean;\n  exemplar: boolean;\n}\n\nexport class PromQueryEditor extends PureComponent<PromQueryEditorProps, State> {\n  // Query target to be modified and used for queries\n  query: PromQuery;\n\n  constructor(props: PromQueryEditorProps) {\n    super(props);\n    // Use default query to prevent undefined input values\n    const defaultQuery: Partial<PromQuery> = {\n      expr: '',\n      legendFormat: '',\n      interval: '',\n      // Set exemplar to false for alerting queries\n      exemplar: props.app === CoreApp.UnifiedAlerting ? false : true,\n    };\n    const query = Object.assign({}, defaultQuery, props.query);\n    this.query = query;\n    // Query target properties that are fully controlled inputs\n    this.state = {\n      // Fully controlled text inputs\n      interval: query.interval,\n      legendFormat: query.legendFormat,\n      // Select options\n      formatOption: FORMAT_OPTIONS.find((option) => option.value === query.format) || FORMAT_OPTIONS[0],\n      intervalFactorOption:\n        INTERVAL_FACTOR_OPTIONS.find((option) => option.value === query.intervalFactor) || INTERVAL_FACTOR_OPTIONS[0],\n      // Switch options\n      instant: Boolean(query.instant),\n      exemplar: Boolean(query.exemplar),\n    };\n  }\n\n  onFieldChange = (query: PromQuery, override?: any) => {\n    this.query.expr = query.expr;\n  };\n\n  onFormatChange = (option: SelectableValue<string>) => {\n    this.query.format = option.value;\n    this.setState({ formatOption: option }, this.onRunQuery);\n  };\n\n  onInstantChange = (e: React.SyntheticEvent<HTMLInputElement>) => {\n    const instant = (e.target as HTMLInputElement).checked;\n    this.query.instant = instant;\n    this.setState({ instant }, this.onRunQuery);\n  };\n\n  onIntervalChange = (e: React.SyntheticEvent<HTMLInputElement>) => {\n    const interval = e.currentTarget.value;\n    this.query.interval = interval;\n    this.setState({ interval });\n  };\n\n  onIntervalFactorChange = (option: SelectableValue<number>) => {\n    this.query.intervalFactor = option.value;\n    this.setState({ intervalFactorOption: option }, this.onRunQuery);\n  };\n\n  onLegendChange = (e: React.SyntheticEvent<HTMLInputElement>) => {\n    const legendFormat = e.currentTarget.value;\n    this.query.legendFormat = legendFormat;\n    this.setState({ legendFormat });\n  };\n\n  onExemplarChange = (isEnabled: boolean) => {\n    this.query.exemplar = isEnabled;\n    this.setState({ exemplar: isEnabled }, this.onRunQuery);\n  };\n\n  onRunQuery = () => {\n    const { query } = this;\n    // Change of query.hide happens outside of this component and is just passed as prop. We have to update it when running queries.\n    const { hide } = this.props.query;\n    this.props.onChange({ ...query, hide });\n    this.props.onRunQuery();\n  };\n\n  render() {\n    const { datasource, query, range, data } = this.props;\n    const { formatOption, instant, interval, intervalFactorOption, legendFormat } = this.state;\n    //We want to hide exemplar field for unified alerting as exemplars in alerting don't make sense and are source of confusion\n    const showExemplarField = this.props.app !== CoreApp.UnifiedAlerting;\n\n    return (\n      <PromQueryField\n        datasource={datasource}\n        query={query}\n        range={range}\n        onRunQuery={this.onRunQuery}\n        onChange={this.onFieldChange}\n        history={[]}\n        data={data}\n        data-testid={testIds.editor}\n        ExtraFieldElement={\n          <div className=\"gf-form-inline\">\n            <div className=\"gf-form\">\n              <InlineFormLabel\n                width={7}\n                tooltip=\"Controls the name of the time series, using name or pattern. For example\n        {{hostname}} will be replaced with label value for the label hostname.\"\n              >\n                Legend\n              </InlineFormLabel>\n              <input\n                type=\"text\"\n                className=\"gf-form-input\"\n                placeholder=\"legend format\"\n                value={legendFormat}\n                onChange={this.onLegendChange}\n                onBlur={this.onRunQuery}\n              />\n            </div>\n\n            <div className=\"gf-form\">\n              <InlineFormLabel\n                width={7}\n                tooltip={\n                  <>\n                    An additional lower limit for the step parameter of the Prometheus query and for the{' '}\n                    <code>$__interval</code> and <code>$__rate_interval</code> variables. The limit is absolute and not\n                    modified by the &quot;Resolution&quot; setting.\n                  </>\n                }\n              >\n                Min step\n              </InlineFormLabel>\n              <input\n                type=\"text\"\n                className=\"gf-form-input width-8\"\n                aria-label=\"Set lower limit for the step parameter\"\n                placeholder={interval}\n                onChange={this.onIntervalChange}\n                onBlur={this.onRunQuery}\n                value={interval}\n              />\n            </div>\n\n            <div className=\"gf-form\">\n              <div className=\"gf-form-label\">Resolution</div>\n              <Select\n                aria-label=\"Select resolution\"\n                menuShouldPortal\n                isSearchable={false}\n                options={INTERVAL_FACTOR_OPTIONS}\n                onChange={this.onIntervalFactorChange}\n                value={intervalFactorOption}\n              />\n            </div>\n\n            <div className=\"gf-form\">\n              <div className=\"gf-form-label width-7\">Format</div>\n              <Select\n                menuShouldPortal\n                className=\"select-container\"\n                width={16}\n                isSearchable={false}\n                options={FORMAT_OPTIONS}\n                onChange={this.onFormatChange}\n                value={formatOption}\n                aria-label=\"Select format\"\n              />\n              <Switch label=\"Instant\" checked={instant} onChange={this.onInstantChange} />\n\n              <InlineFormLabel width={10} tooltip=\"Link to Graph in Prometheus\">\n                <PromLink\n                  datasource={datasource}\n                  query={this.query} // Use modified query\n                  panelData={data}\n                />\n              </InlineFormLabel>\n            </div>\n            {showExemplarField && (\n              <PromExemplarField\n                onChange={this.onExemplarChange}\n                datasource={datasource}\n                query={this.query}\n                data-testid={testIds.exemplar}\n              />\n            )}\n          </div>\n        }\n      />\n    );\n  }\n}\n\nexport const testIds = {\n  editor: 'prom-editor',\n  exemplar: 'exemplar-editor',\n};\n","import React from 'react';\nimport PromQueryField from './PromQueryField';\nimport { PromQueryEditorProps } from './types';\n\nexport function PromQueryEditorForAlerting(props: PromQueryEditorProps) {\n  const { datasource, query, range, data, onChange, onRunQuery } = props;\n\n  return (\n    <PromQueryField\n      datasource={datasource}\n      query={query}\n      onRunQuery={onRunQuery}\n      onChange={onChange}\n      history={[]}\n      range={range}\n      data={data}\n      data-testid={testIds.editor}\n    />\n  );\n}\n\nexport const testIds = {\n  editor: 'prom-editor-cloud-alerting',\n};\n","import React, { memo } from 'react';\nimport { CoreApp } from '@grafana/data';\nimport { PromQueryEditorProps } from './types';\nimport { PromQueryEditor } from './PromQueryEditor';\nimport { PromQueryEditorForAlerting } from './PromQueryEditorForAlerting';\n\nexport function PromQueryEditorByApp(props: PromQueryEditorProps) {\n  const { app } = props;\n\n  switch (app) {\n    case CoreApp.CloudAlerting:\n      return <PromQueryEditorForAlerting {...props} />;\n    default:\n      return <PromQueryEditor {...props} />;\n  }\n}\n\nexport default memo(PromQueryEditorByApp);\n","import React from 'react';\nimport { QueryEditorHelpProps } from '@grafana/data';\nimport { PromQuery } from '../types';\n\nconst CHEAT_SHEET_ITEMS = [\n  {\n    title: 'Request Rate',\n    expression: 'rate(http_request_total[5m])',\n    label:\n      'Given an HTTP request counter, this query calculates the per-second average request rate over the last 5 minutes.',\n  },\n  {\n    title: '95th Percentile of Request Latencies',\n    expression: 'histogram_quantile(0.95, sum(rate(prometheus_http_request_duration_seconds_bucket[5m])) by (le))',\n    label: 'Calculates the 95th percentile of HTTP request rate over 5 minute windows.',\n  },\n  {\n    title: 'Alerts Firing',\n    expression: 'sort_desc(sum(sum_over_time(ALERTS{alertstate=\"firing\"}[24h])) by (alertname))',\n    label: 'Sums up the alerts that have been firing over the last 24 hours.',\n  },\n  {\n    title: 'Step',\n    label:\n      'Defines the graph resolution using a duration format (15s, 1m, 3h, ...). Small steps create high-resolution graphs but can be slow over larger time ranges. Using a longer step lowers the resolution and smooths the graph by producing fewer datapoints. If no step is given the resolution is calculated automatically.',\n  },\n];\n\nconst PromCheatSheet = (props: QueryEditorHelpProps<PromQuery>) => (\n  <div>\n    <h2>PromQL Cheat Sheet</h2>\n    {CHEAT_SHEET_ITEMS.map((item, index) => (\n      <div className=\"cheat-sheet-item\" key={index}>\n        <div className=\"cheat-sheet-item__title\">{item.title}</div>\n        {item.expression ? (\n          <div\n            className=\"cheat-sheet-item__example\"\n            onClick={(e) => props.onClickExample({ refId: 'A', expr: item.expression })}\n          >\n            <code>{item.expression}</code>\n          </div>\n        ) : null}\n        <div className=\"cheat-sheet-item__label\">{item.label}</div>\n      </div>\n    ))}\n  </div>\n);\n\nexport default PromCheatSheet;\n","import React, { memo, useCallback } from 'react';\nimport { usePrevious } from 'react-use';\nimport { isEqual } from 'lodash';\nimport { css, cx } from '@emotion/css';\nimport { InlineFormLabel, RadioButtonGroup } from '@grafana/ui';\nimport { PromQuery } from '../types';\nimport { PromExemplarField } from './PromExemplarField';\nimport { PrometheusDatasource } from '../datasource';\n\nexport interface PromExploreExtraFieldProps {\n  query: PromQuery;\n  onChange: (value: PromQuery) => void;\n  onRunQuery: () => void;\n  datasource: PrometheusDatasource;\n}\n\nexport const PromExploreExtraField: React.FC<PromExploreExtraFieldProps> = memo(\n  ({ query, datasource, onChange, onRunQuery }) => {\n    const rangeOptions = [\n      { value: 'range', label: 'Range', description: 'Run query over a range of time.' },\n      {\n        value: 'instant',\n        label: 'Instant',\n        description: 'Run query against a single point in time. For this query, the \"To\" time is used.',\n      },\n      { value: 'both', label: 'Both', description: 'Run an Instant query and a Range query.' },\n    ];\n\n    const prevQuery = usePrevious(query);\n\n    const onExemplarChange = useCallback(\n      (exemplar: boolean) => {\n        if (!isEqual(query, prevQuery) || exemplar !== query.exemplar) {\n          onChange({ ...query, exemplar });\n        }\n      },\n      [prevQuery, query, onChange]\n    );\n\n    function onChangeQueryStep(interval: string) {\n      onChange({ ...query, interval });\n    }\n\n    function onStepChange(e: React.SyntheticEvent<HTMLInputElement>) {\n      if (e.currentTarget.value !== query.interval) {\n        onChangeQueryStep(e.currentTarget.value);\n      }\n    }\n\n    function onReturnKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n      if (e.key === 'Enter' && e.shiftKey) {\n        onRunQuery();\n      }\n    }\n\n    function onQueryTypeChange(queryType: string) {\n      let nextQuery;\n      if (queryType === 'instant') {\n        nextQuery = { ...query, instant: true, range: false };\n      } else if (queryType === 'range') {\n        nextQuery = { ...query, instant: false, range: true };\n      } else {\n        nextQuery = { ...query, instant: true, range: true };\n      }\n      onChange(nextQuery);\n    }\n\n    return (\n      <div aria-label=\"Prometheus extra field\" className=\"gf-form-inline\" data-testid={testIds.extraFieldEditor}>\n        {/*Query type field*/}\n        <div\n          data-testid={testIds.queryTypeField}\n          className={cx(\n            'gf-form explore-input-margin',\n            css`\n              flex-wrap: nowrap;\n            `\n          )}\n          aria-label=\"Query type field\"\n        >\n          <InlineFormLabel width=\"auto\">Query type</InlineFormLabel>\n\n          <RadioButtonGroup\n            options={rangeOptions}\n            value={query.range && query.instant ? 'both' : query.instant ? 'instant' : 'range'}\n            onChange={onQueryTypeChange}\n          />\n        </div>\n        {/*Step field*/}\n        <div\n          data-testid={testIds.stepField}\n          className={cx(\n            'gf-form',\n            css`\n              flex-wrap: nowrap;\n            `\n          )}\n          aria-label=\"Step field\"\n        >\n          <InlineFormLabel\n            width={6}\n            tooltip={\n              'Time units and built-in variables can be used here, for example: $__interval, $__rate_interval, 5s, 1m, 3h, 1d, 1y (Default if no unit is specified: s)'\n            }\n          >\n            Min step\n          </InlineFormLabel>\n          <input\n            type={'text'}\n            className=\"gf-form-input width-4\"\n            placeholder={'auto'}\n            onChange={onStepChange}\n            onKeyDown={onReturnKeyDown}\n            value={query.interval ?? ''}\n          />\n        </div>\n\n        <PromExemplarField onChange={onExemplarChange} datasource={datasource} query={query} />\n      </div>\n    );\n  }\n);\n\nexport const testIds = {\n  extraFieldEditor: 'prom-editor-extra-field',\n  stepField: 'prom-editor-extra-field-step',\n  queryTypeField: 'prom-editor-extra-field-query-type',\n};\n","import React, { memo, FC, useEffect } from 'react';\nimport { QueryEditorProps, CoreApp } from '@grafana/data';\nimport { PrometheusDatasource } from '../datasource';\nimport { PromQuery, PromOptions } from '../types';\nimport PromQueryField from './PromQueryField';\nimport { PromExploreExtraField } from './PromExploreExtraField';\n\nexport type Props = QueryEditorProps<PrometheusDatasource, PromQuery, PromOptions>;\n\nexport const PromExploreQueryEditor: FC<Props> = (props: Props) => {\n  const { range, query, data, datasource, history, onChange, onRunQuery } = props;\n\n  // Setting default values\n  useEffect(() => {\n    if (query.expr === undefined) {\n      onChange({ ...query, expr: '' });\n    }\n    if (query.exemplar === undefined) {\n      onChange({ ...query, exemplar: true });\n    }\n\n    // Override query type to \"Both\" only for new queries (no query.expr).\n    if (!query.instant && !query.range && !query.expr) {\n      onChange({ ...query, instant: true, range: true });\n    }\n  }, [onChange, query]);\n\n  return (\n    <PromQueryField\n      app={CoreApp.Explore}\n      datasource={datasource}\n      query={query}\n      range={range}\n      onRunQuery={onRunQuery}\n      onChange={onChange}\n      onBlur={() => {}}\n      history={history}\n      data={data}\n      data-testid={testIds.editor}\n      ExtraFieldElement={\n        <PromExploreExtraField query={query} onChange={onChange} datasource={datasource} onRunQuery={onRunQuery} />\n      }\n    />\n  );\n};\n\nexport default memo(PromExploreQueryEditor);\n\nexport const testIds = {\n  editor: 'prom-editor-explore',\n};\n","import { SelectableValue } from '@grafana/data';\n\nexport enum AzureCloud {\n  Public = 'AzureCloud',\n  China = 'AzureChinaCloud',\n  USGovernment = 'AzureUSGovernment',\n  Germany = 'AzureGermanCloud',\n  None = '',\n}\n\nexport const KnownAzureClouds = [\n  { value: AzureCloud.Public, label: 'Azure' },\n  { value: AzureCloud.China, label: 'Azure China' },\n  { value: AzureCloud.USGovernment, label: 'Azure US Government' },\n  { value: AzureCloud.Germany, label: 'Azure Germany' },\n] as SelectableValue[];\n\nexport type AzureAuthType = 'msi' | 'clientsecret';\n\nexport type ConcealedSecret = symbol;\n\ninterface AzureCredentialsBase {\n  authType: AzureAuthType;\n  defaultSubscriptionId?: string;\n}\n\nexport interface AzureManagedIdentityCredentials extends AzureCredentialsBase {\n  authType: 'msi';\n}\n\nexport interface AzureClientSecretCredentials extends AzureCredentialsBase {\n  authType: 'clientsecret';\n  azureCloud?: string;\n  tenantId?: string;\n  clientId?: string;\n  clientSecret?: string | ConcealedSecret;\n}\n\nexport type AzureCredentials = AzureManagedIdentityCredentials | AzureClientSecretCredentials;\n\nexport function isCredentialsComplete(credentials: AzureCredentials): boolean {\n  switch (credentials.authType) {\n    case 'msi':\n      return true;\n    case 'clientsecret':\n      return !!(credentials.azureCloud && credentials.tenantId && credentials.clientId && credentials.clientSecret);\n  }\n}\n","import { DataSourceSettings } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { AzureCloud, AzureCredentials, ConcealedSecret } from './AzureCredentials';\n\nconst concealed: ConcealedSecret = Symbol('Concealed client secret');\n\nfunction getDefaultAzureCloud(): string {\n  return config.azure.cloud || AzureCloud.Public;\n}\n\nfunction getSecret(options: DataSourceSettings<any, any>): undefined | string | ConcealedSecret {\n  if (options.secureJsonFields.azureClientSecret) {\n    // The secret is concealed on server\n    return concealed;\n  } else {\n    const secret = options.secureJsonData?.azureClientSecret;\n    return typeof secret === 'string' && secret.length > 0 ? secret : undefined;\n  }\n}\n\nexport function getCredentials(options: DataSourceSettings<any, any>): AzureCredentials {\n  const credentials = options.jsonData.azureCredentials as AzureCredentials | undefined;\n\n  // If no credentials saved, then return empty credentials\n  // of type based on whether the managed identity enabled\n  if (!credentials) {\n    return {\n      authType: config.azure.managedIdentityEnabled ? 'msi' : 'clientsecret',\n      azureCloud: getDefaultAzureCloud(),\n    };\n  }\n\n  switch (credentials.authType) {\n    case 'msi':\n      if (config.azure.managedIdentityEnabled) {\n        return {\n          authType: 'msi',\n        };\n      } else {\n        // If authentication type is managed identity but managed identities were disabled in Grafana config,\n        // then we should fallback to an empty app registration (client secret) configuration\n        return {\n          authType: 'clientsecret',\n          azureCloud: getDefaultAzureCloud(),\n        };\n      }\n    case 'clientsecret':\n      return {\n        authType: 'clientsecret',\n        azureCloud: credentials.azureCloud || getDefaultAzureCloud(),\n        tenantId: credentials.tenantId,\n        clientId: credentials.clientId,\n        clientSecret: getSecret(options),\n      };\n  }\n}\n\nexport function updateCredentials(\n  options: DataSourceSettings<any, any>,\n  credentials: AzureCredentials\n): DataSourceSettings<any, any> {\n  switch (credentials.authType) {\n    case 'msi':\n      if (!config.azure.managedIdentityEnabled) {\n        throw new Error('Managed Identity authentication is not enabled in Grafana config.');\n      }\n\n      options = {\n        ...options,\n        jsonData: {\n          ...options.jsonData,\n          azureCredentials: {\n            authType: 'msi',\n          },\n        },\n      };\n\n      return options;\n\n    case 'clientsecret':\n      options = {\n        ...options,\n        jsonData: {\n          ...options.jsonData,\n          azureCredentials: {\n            authType: 'clientsecret',\n            azureCloud: credentials.azureCloud || getDefaultAzureCloud(),\n            tenantId: credentials.tenantId,\n            clientId: credentials.clientId,\n          },\n        },\n        secureJsonData: {\n          ...options.secureJsonData,\n          azureClientSecret:\n            typeof credentials.clientSecret === 'string' && credentials.clientSecret.length > 0\n              ? credentials.clientSecret\n              : undefined,\n        },\n        secureJsonFields: {\n          ...options.secureJsonFields,\n          azureClientSecret: typeof credentials.clientSecret === 'symbol',\n        },\n      };\n\n      return options;\n  }\n}\n","import React, { ChangeEvent, FunctionComponent, useEffect, useReducer, useState } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { InlineFormLabel, Button } from '@grafana/ui/src/components';\nimport { Select } from '@grafana/ui/src/components/Forms/Legacy/Select/Select';\nimport { Input } from '@grafana/ui/src/components/Forms/Legacy/Input/Input';\nimport { AzureAuthType, AzureCredentials, isCredentialsComplete } from './AzureCredentials';\n\nexport interface Props {\n  managedIdentityEnabled: boolean;\n  credentials: AzureCredentials;\n  azureCloudOptions?: SelectableValue[];\n  onCredentialsChange: (updatedCredentials: AzureCredentials) => void;\n  getSubscriptions?: () => Promise<SelectableValue[]>;\n}\n\nconst authTypeOptions: Array<SelectableValue<AzureAuthType>> = [\n  {\n    value: 'msi',\n    label: 'Managed Identity',\n  },\n  {\n    value: 'clientsecret',\n    label: 'App Registration',\n  },\n];\n\nexport const AzureCredentialsForm: FunctionComponent<Props> = (props: Props) => {\n  const { credentials, azureCloudOptions, onCredentialsChange, getSubscriptions } = props;\n  const hasRequiredFields = isCredentialsComplete(credentials);\n\n  const [subscriptions, setSubscriptions] = useState<Array<SelectableValue<string>>>([]);\n  const [loadSubscriptionsClicked, onLoadSubscriptions] = useReducer((val) => val + 1, 0);\n  useEffect(() => {\n    if (!getSubscriptions || !hasRequiredFields) {\n      updateSubscriptions([]);\n      return;\n    }\n    let canceled = false;\n    getSubscriptions().then((result) => {\n      if (!canceled) {\n        updateSubscriptions(result, loadSubscriptionsClicked);\n      }\n    });\n    return () => {\n      canceled = true;\n    };\n    // This effect is intended to be called only once initially and on Load Subscriptions click\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [loadSubscriptionsClicked]);\n\n  const updateSubscriptions = (received: Array<SelectableValue<string>>, autoSelect = false) => {\n    setSubscriptions(received);\n    if (getSubscriptions) {\n      if (autoSelect && !credentials.defaultSubscriptionId && received.length > 0) {\n        // Selecting the default subscription if subscriptions received but no default subscription selected\n        onSubscriptionChange(received[0]);\n      } else if (credentials.defaultSubscriptionId) {\n        const found = received.find((opt) => opt.value === credentials.defaultSubscriptionId);\n        if (!found) {\n          // Unselecting the default subscription if it isn't found among the received subscriptions\n          onSubscriptionChange(undefined);\n        }\n      }\n    }\n  };\n\n  const onAuthTypeChange = (selected: SelectableValue<AzureAuthType>) => {\n    if (onCredentialsChange) {\n      setSubscriptions([]);\n      const updated: AzureCredentials = {\n        ...credentials,\n        authType: selected.value || 'msi',\n        defaultSubscriptionId: undefined,\n      };\n      onCredentialsChange(updated);\n    }\n  };\n\n  const onAzureCloudChange = (selected: SelectableValue<string>) => {\n    if (onCredentialsChange && credentials.authType === 'clientsecret') {\n      setSubscriptions([]);\n      const updated: AzureCredentials = {\n        ...credentials,\n        azureCloud: selected.value,\n        defaultSubscriptionId: undefined,\n      };\n      onCredentialsChange(updated);\n    }\n  };\n\n  const onTenantIdChange = (event: ChangeEvent<HTMLInputElement>) => {\n    if (onCredentialsChange && credentials.authType === 'clientsecret') {\n      setSubscriptions([]);\n      const updated: AzureCredentials = {\n        ...credentials,\n        tenantId: event.target.value,\n        defaultSubscriptionId: undefined,\n      };\n      onCredentialsChange(updated);\n    }\n  };\n\n  const onClientIdChange = (event: ChangeEvent<HTMLInputElement>) => {\n    if (onCredentialsChange && credentials.authType === 'clientsecret') {\n      setSubscriptions([]);\n      const updated: AzureCredentials = {\n        ...credentials,\n        clientId: event.target.value,\n        defaultSubscriptionId: undefined,\n      };\n      onCredentialsChange(updated);\n    }\n  };\n\n  const onClientSecretChange = (event: ChangeEvent<HTMLInputElement>) => {\n    if (onCredentialsChange && credentials.authType === 'clientsecret') {\n      setSubscriptions([]);\n      const updated: AzureCredentials = {\n        ...credentials,\n        clientSecret: event.target.value,\n        defaultSubscriptionId: undefined,\n      };\n      onCredentialsChange(updated);\n    }\n  };\n\n  const onClientSecretReset = () => {\n    if (onCredentialsChange && credentials.authType === 'clientsecret') {\n      setSubscriptions([]);\n      const updated: AzureCredentials = {\n        ...credentials,\n        clientSecret: '',\n        defaultSubscriptionId: undefined,\n      };\n      onCredentialsChange(updated);\n    }\n  };\n\n  const onSubscriptionChange = (selected: SelectableValue<string> | undefined) => {\n    if (onCredentialsChange) {\n      const updated: AzureCredentials = {\n        ...credentials,\n        defaultSubscriptionId: selected?.value,\n      };\n      onCredentialsChange(updated);\n    }\n  };\n\n  return (\n    <div className=\"gf-form-group\">\n      {props.managedIdentityEnabled && (\n        <div className=\"gf-form-inline\">\n          <div className=\"gf-form\">\n            <InlineFormLabel className=\"width-12\" tooltip=\"Choose the type of authentication to Azure services\">\n              Authentication\n            </InlineFormLabel>\n            <Select\n              menuShouldPortal\n              className=\"width-15\"\n              value={authTypeOptions.find((opt) => opt.value === credentials.authType)}\n              options={authTypeOptions}\n              onChange={onAuthTypeChange}\n            />\n          </div>\n        </div>\n      )}\n      {credentials.authType === 'clientsecret' && (\n        <>\n          {azureCloudOptions && (\n            <div className=\"gf-form-inline\">\n              <div className=\"gf-form\">\n                <InlineFormLabel className=\"width-12\" tooltip=\"Choose an Azure Cloud\">\n                  Azure Cloud\n                </InlineFormLabel>\n                <Select\n                  menuShouldPortal\n                  className=\"width-15\"\n                  value={azureCloudOptions.find((opt) => opt.value === credentials.azureCloud)}\n                  options={azureCloudOptions}\n                  onChange={onAzureCloudChange}\n                />\n              </div>\n            </div>\n          )}\n          <div className=\"gf-form-inline\">\n            <div className=\"gf-form\">\n              <InlineFormLabel className=\"width-12\">Directory (tenant) ID</InlineFormLabel>\n              <div className=\"width-15\">\n                <Input\n                  className=\"width-30\"\n                  placeholder=\"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\"\n                  value={credentials.tenantId || ''}\n                  onChange={onTenantIdChange}\n                />\n              </div>\n            </div>\n          </div>\n          <div className=\"gf-form-inline\">\n            <div className=\"gf-form\">\n              <InlineFormLabel className=\"width-12\">Application (client) ID</InlineFormLabel>\n              <div className=\"width-15\">\n                <Input\n                  className=\"width-30\"\n                  placeholder=\"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\"\n                  value={credentials.clientId || ''}\n                  onChange={onClientIdChange}\n                />\n              </div>\n            </div>\n          </div>\n          {typeof credentials.clientSecret === 'symbol' ? (\n            <div className=\"gf-form-inline\">\n              <div className=\"gf-form\">\n                <InlineFormLabel className=\"width-12\">Client Secret</InlineFormLabel>\n                <Input className=\"width-25\" placeholder=\"configured\" disabled={true} />\n              </div>\n              <div className=\"gf-form\">\n                <div className=\"max-width-30 gf-form-inline\">\n                  <Button variant=\"secondary\" type=\"button\" onClick={onClientSecretReset}>\n                    reset\n                  </Button>\n                </div>\n              </div>\n            </div>\n          ) : (\n            <div className=\"gf-form-inline\">\n              <div className=\"gf-form\">\n                <InlineFormLabel className=\"width-12\">Client Secret</InlineFormLabel>\n                <div className=\"width-15\">\n                  <Input\n                    className=\"width-30\"\n                    placeholder=\"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\"\n                    value={credentials.clientSecret || ''}\n                    onChange={onClientSecretChange}\n                  />\n                </div>\n              </div>\n            </div>\n          )}\n        </>\n      )}\n      {getSubscriptions && (\n        <>\n          <div className=\"gf-form-inline\">\n            <div className=\"gf-form\">\n              <InlineFormLabel className=\"width-12\">Default Subscription</InlineFormLabel>\n              <div className=\"width-25\">\n                <Select\n                  menuShouldPortal\n                  value={\n                    credentials.defaultSubscriptionId\n                      ? subscriptions.find((opt) => opt.value === credentials.defaultSubscriptionId)\n                      : undefined\n                  }\n                  options={subscriptions}\n                  onChange={onSubscriptionChange}\n                />\n              </div>\n            </div>\n          </div>\n          <div className=\"gf-form-inline\">\n            <div className=\"gf-form\">\n              <div className=\"max-width-30 gf-form-inline\">\n                <Button\n                  variant=\"secondary\"\n                  size=\"sm\"\n                  type=\"button\"\n                  onClick={onLoadSubscriptions}\n                  disabled={!hasRequiredFields}\n                >\n                  Load Subscriptions\n                </Button>\n              </div>\n            </div>\n          </div>\n        </>\n      )}\n    </div>\n  );\n};\n\nexport default AzureCredentialsForm;\n","import React, { FunctionComponent, useMemo } from 'react';\nimport { InlineFormLabel, Input } from '@grafana/ui';\nimport { config } from '@grafana/runtime';\nimport { KnownAzureClouds, AzureCredentials } from './AzureCredentials';\nimport { getCredentials, updateCredentials } from './AzureCredentialsConfig';\nimport { AzureCredentialsForm } from './AzureCredentialsForm';\nimport { HttpSettingsBaseProps } from '@grafana/ui/src/components/DataSourceSettings/types';\n\nexport const AzureAuthSettings: FunctionComponent<HttpSettingsBaseProps> = (props: HttpSettingsBaseProps) => {\n  const { dataSourceConfig, onChange } = props;\n\n  const credentials = useMemo(() => getCredentials(dataSourceConfig), [dataSourceConfig]);\n\n  const onCredentialsChange = (credentials: AzureCredentials): void => {\n    onChange(updateCredentials(dataSourceConfig, credentials));\n  };\n\n  return (\n    <>\n      <h6>Azure Authentication</h6>\n      <AzureCredentialsForm\n        managedIdentityEnabled={config.azure.managedIdentityEnabled}\n        credentials={credentials}\n        azureCloudOptions={KnownAzureClouds}\n        onCredentialsChange={onCredentialsChange}\n      />\n      <h6>Azure Configuration</h6>\n      <div className=\"gf-form-group\">\n        <div className=\"gf-form-inline\">\n          <div className=\"gf-form\">\n            <InlineFormLabel className=\"width-12\">AAD resource ID</InlineFormLabel>\n            <div className=\"width-15\">\n              <Input\n                className=\"width-30\"\n                value={dataSourceConfig.jsonData.azureEndpointResourceId || ''}\n                onChange={(event) =>\n                  onChange({\n                    ...dataSourceConfig,\n                    jsonData: { ...dataSourceConfig.jsonData, azureEndpointResourceId: event.currentTarget.value },\n                  })\n                }\n              />\n            </div>\n          </div>\n        </div>\n      </div>\n    </>\n  );\n};\n\nexport default AzureAuthSettings;\n","import { css } from '@emotion/css';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { DataSourcePicker } from '@grafana/runtime';\nimport { Button, InlineField, InlineSwitch, Input } from '@grafana/ui';\nimport React, { useState } from 'react';\nimport { ExemplarTraceIdDestination } from '../types';\n\ntype Props = {\n  value: ExemplarTraceIdDestination;\n  onChange: (value: ExemplarTraceIdDestination) => void;\n  onDelete: () => void;\n};\n\nexport default function ExemplarSetting({ value, onChange, onDelete }: Props) {\n  const [isInternalLink, setIsInternalLink] = useState(Boolean(value.datasourceUid));\n\n  return (\n    <div className=\"gf-form-group\">\n      <InlineField label=\"Internal link\" labelWidth={24}>\n        <>\n          <InlineSwitch\n            value={isInternalLink}\n            aria-label={selectors.components.DataSource.Prometheus.configPage.internalLinkSwitch}\n            onChange={(ev) => setIsInternalLink(ev.currentTarget.checked)}\n          />\n          <Button\n            variant=\"destructive\"\n            title=\"Remove link\"\n            icon=\"times\"\n            onClick={(event) => {\n              event.preventDefault();\n              onDelete();\n            }}\n            className={css`\n              margin-left: 8px;\n            `}\n          />\n        </>\n      </InlineField>\n\n      {isInternalLink ? (\n        <InlineField\n          label=\"Data source\"\n          labelWidth={24}\n          tooltip=\"The data source the exemplar is going to navigate to.\"\n        >\n          <DataSourcePicker\n            tracing={true}\n            current={value.datasourceUid}\n            noDefault={true}\n            width={40}\n            onChange={(ds) =>\n              onChange({\n                datasourceUid: ds.uid,\n                name: value.name,\n                url: undefined,\n              })\n            }\n          />\n        </InlineField>\n      ) : (\n        <InlineField\n          label=\"URL\"\n          labelWidth={24}\n          tooltip=\"The URL of the trace backend the user would go to see its trace.\"\n        >\n          <Input\n            placeholder=\"https://example.com/${__value.raw}\"\n            spellCheck={false}\n            width={40}\n            value={value.url}\n            onChange={(event) =>\n              onChange({\n                datasourceUid: undefined,\n                name: value.name,\n                url: event.currentTarget.value,\n              })\n            }\n          />\n        </InlineField>\n      )}\n\n      <InlineField\n        label=\"Label name\"\n        labelWidth={24}\n        tooltip=\"The name of the field in the labels object that should be used to get the traceID.\"\n      >\n        <Input\n          placeholder=\"traceID\"\n          spellCheck={false}\n          width={40}\n          value={value.name}\n          onChange={(event) =>\n            onChange({\n              ...value,\n              name: event.currentTarget.value,\n            })\n          }\n        />\n      </InlineField>\n    </div>\n  );\n}\n","import { css } from '@emotion/css';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Button } from '@grafana/ui';\nimport React from 'react';\nimport { ExemplarTraceIdDestination } from '../types';\nimport ExemplarSetting from './ExemplarSetting';\n\ntype Props = {\n  options?: ExemplarTraceIdDestination[];\n  onChange: (value: ExemplarTraceIdDestination[]) => void;\n};\n\nexport function ExemplarsSettings({ options, onChange }: Props) {\n  return (\n    <>\n      <h3 className=\"page-heading\">Exemplars</h3>\n\n      {options &&\n        options.map((option, index) => {\n          return (\n            <ExemplarSetting\n              key={index}\n              value={option}\n              onChange={(newField) => {\n                const newOptions = [...options];\n                newOptions.splice(index, 1, newField);\n                onChange(newOptions);\n              }}\n              onDelete={() => {\n                const newOptions = [...options];\n                newOptions.splice(index, 1);\n                onChange(newOptions);\n              }}\n            />\n          );\n        })}\n\n      <Button\n        variant=\"secondary\"\n        aria-label={selectors.components.DataSource.Prometheus.configPage.exemplarsAddButton}\n        className={css`\n          margin-bottom: 10px;\n        `}\n        icon=\"plus\"\n        onClick={(event) => {\n          event.preventDefault();\n          const newOptions = [...(options || []), { name: 'traceID' }];\n          onChange(newOptions);\n        }}\n      >\n        Add\n      </Button>\n    </>\n  );\n}\n","import {\n  DataSourcePluginOptionsEditorProps,\n  onUpdateDatasourceJsonDataOptionChecked,\n  SelectableValue,\n  updateDatasourcePluginJsonDataOption,\n} from '@grafana/data';\nimport { EventsWithValidation, InlineFormLabel, LegacyForms, regexValidation } from '@grafana/ui';\nimport React, { SyntheticEvent } from 'react';\nimport { PromOptions } from '../types';\nimport { ExemplarsSettings } from './ExemplarsSettings';\nconst { Select, Input, FormField, Switch } = LegacyForms;\n\nconst httpOptions = [\n  { value: 'POST', label: 'POST' },\n  { value: 'GET', label: 'GET' },\n];\n\ntype Props = Pick<DataSourcePluginOptionsEditorProps<PromOptions>, 'options' | 'onOptionsChange'>;\n\nexport const PromSettings = (props: Props) => {\n  const { options, onOptionsChange } = props;\n\n  // We are explicitly adding httpMethod so it is correctly displayed in dropdown. This way, it is more predictable for users.\n\n  if (!options.jsonData.httpMethod) {\n    options.jsonData.httpMethod = 'POST';\n  }\n\n  return (\n    <>\n      <div className=\"gf-form-group\">\n        <div className=\"gf-form-inline\">\n          <div className=\"gf-form\">\n            <FormField\n              label=\"Scrape interval\"\n              labelWidth={13}\n              inputEl={\n                <Input\n                  className=\"width-6\"\n                  value={options.jsonData.timeInterval}\n                  spellCheck={false}\n                  placeholder=\"15s\"\n                  onChange={onChangeHandler('timeInterval', options, onOptionsChange)}\n                  validationEvents={promSettingsValidationEvents}\n                />\n              }\n              tooltip=\"Set this to the typical scrape and evaluation interval configured in Prometheus. Defaults to 15s.\"\n            />\n          </div>\n        </div>\n        <div className=\"gf-form-inline\">\n          <div className=\"gf-form\">\n            <FormField\n              label=\"Query timeout\"\n              labelWidth={13}\n              inputEl={\n                <Input\n                  className=\"width-6\"\n                  value={options.jsonData.queryTimeout}\n                  onChange={onChangeHandler('queryTimeout', options, onOptionsChange)}\n                  spellCheck={false}\n                  placeholder=\"60s\"\n                  validationEvents={promSettingsValidationEvents}\n                />\n              }\n              tooltip=\"Set the Prometheus query timeout.\"\n            />\n          </div>\n        </div>\n        <div className=\"gf-form\">\n          <InlineFormLabel\n            width={13}\n            tooltip=\"You can use either POST or GET HTTP method to query your Prometheus data source. POST is the recommended method as it allows bigger queries. Change this to GET if you have a Prometheus version older than 2.1 or if POST requests are restricted in your network.\"\n          >\n            HTTP Method\n          </InlineFormLabel>\n          <Select\n            aria-label=\"Select HTTP method\"\n            menuShouldPortal\n            options={httpOptions}\n            value={httpOptions.find((o) => o.value === options.jsonData.httpMethod)}\n            onChange={onChangeHandler('httpMethod', options, onOptionsChange)}\n            width={7}\n          />\n        </div>\n      </div>\n      <h3 className=\"page-heading\">Misc</h3>\n      <div className=\"gf-form-group\">\n        <div className=\"gf-form\">\n          <Switch\n            checked={options.jsonData.disableMetricsLookup ?? false}\n            label=\"Disable metrics lookup\"\n            labelClass=\"width-14\"\n            onChange={onUpdateDatasourceJsonDataOptionChecked(props, 'disableMetricsLookup')}\n            tooltip=\"Checking this option will disable the metrics chooser and metric/label support in the query field's autocomplete. This helps if you have performance issues with bigger Prometheus instances.\"\n          />\n        </div>\n        <div className=\"gf-form-inline\">\n          <div className=\"gf-form max-width-30\">\n            <FormField\n              label=\"Custom query parameters\"\n              labelWidth={14}\n              tooltip=\"Add Custom parameters to all Prometheus or Thanos queries.\"\n              inputEl={\n                <Input\n                  className=\"width-25\"\n                  value={options.jsonData.customQueryParameters}\n                  onChange={onChangeHandler('customQueryParameters', options, onOptionsChange)}\n                  spellCheck={false}\n                  placeholder=\"Example: max_source_resolution=5m&timeout=10\"\n                />\n              }\n            />\n          </div>\n        </div>\n      </div>\n      <ExemplarsSettings\n        options={options.jsonData.exemplarTraceIdDestinations}\n        onChange={(exemplarOptions) =>\n          updateDatasourcePluginJsonDataOption(\n            { onOptionsChange, options },\n            'exemplarTraceIdDestinations',\n            exemplarOptions\n          )\n        }\n      />\n    </>\n  );\n};\n\nexport const promSettingsValidationEvents = {\n  [EventsWithValidation.onBlur]: [\n    regexValidation(\n      /^$|^\\d+(ms|[Mwdhmsy])$/,\n      'Value is not valid, you can use number with time unit specifier: y, M, w, d, h, m, s'\n    ),\n  ],\n};\n\nexport const getValueFromEventItem = (eventItem: SyntheticEvent<HTMLInputElement> | SelectableValue<string>) => {\n  if (!eventItem) {\n    return '';\n  }\n\n  if (eventItem.hasOwnProperty('currentTarget')) {\n    return eventItem.currentTarget.value;\n  }\n\n  return (eventItem as SelectableValue<string>).value;\n};\n\nconst onChangeHandler = (\n  key: keyof PromOptions,\n  options: Props['options'],\n  onOptionsChange: Props['onOptionsChange']\n) => (eventItem: SyntheticEvent<HTMLInputElement> | SelectableValue<string>) => {\n  onOptionsChange({\n    ...options,\n    jsonData: {\n      ...options.jsonData,\n      [key]: getValueFromEventItem(eventItem),\n    },\n  });\n};\n","import { DataSourcePlugin } from '@grafana/data';\nimport { ANNOTATION_QUERY_STEP_DEFAULT, PrometheusDatasource } from './datasource';\n\nimport PromQueryEditorByApp from './components/PromQueryEditorByApp';\nimport PromCheatSheet from './components/PromCheatSheet';\nimport PromExploreQueryEditor from './components/PromExploreQueryEditor';\n\nimport { ConfigEditor } from './configuration/ConfigEditor';\n\nclass PrometheusAnnotationsQueryCtrl {\n  static templateUrl = 'partials/annotations.editor.html';\n  stepDefaultValuePlaceholder = ANNOTATION_QUERY_STEP_DEFAULT;\n}\n\nexport const plugin = new DataSourcePlugin(PrometheusDatasource)\n  .setQueryEditor(PromQueryEditorByApp)\n  .setConfigEditor(ConfigEditor)\n  .setExploreMetricsQueryField(PromExploreQueryEditor)\n  .setAnnotationQueryCtrl(PrometheusAnnotationsQueryCtrl)\n  .setQueryEditorHelp(PromCheatSheet);\n","import React from 'react';\nimport { AlertingSettings, DataSourceHttpSettings, Alert } from '@grafana/ui';\nimport { DataSourcePluginOptionsEditorProps } from '@grafana/data';\nimport { config } from 'app/core/config';\nimport { PromOptions } from '../types';\nimport { AzureAuthSettings } from './AzureAuthSettings';\nimport { PromSettings } from './PromSettings';\nimport { getAllAlertmanagerDataSources } from 'app/features/alerting/unified/utils/alertmanager';\n\nexport type Props = DataSourcePluginOptionsEditorProps<PromOptions>;\nexport const ConfigEditor = (props: Props) => {\n  const { options, onOptionsChange } = props;\n  const alertmanagers = getAllAlertmanagerDataSources();\n\n  const azureAuthSettings = {\n    azureAuthEnabled: config.featureToggles['prometheus_azure_auth'] ?? false,\n    azureSettingsUI: AzureAuthSettings,\n  };\n\n  return (\n    <>\n      {options.access === 'direct' && (\n        <Alert title=\"Deprecation Notice\" severity=\"warning\">\n          Browser access mode in the Prometheus datasource is deprecated and will be removed in a future release.\n        </Alert>\n      )}\n\n      <DataSourceHttpSettings\n        defaultUrl=\"http://localhost:9090\"\n        dataSourceConfig={options}\n        showAccessOptions={true}\n        onChange={onOptionsChange}\n        sigV4AuthToggleEnabled={config.sigV4AuthEnabled}\n        azureAuthSettings={azureAuthSettings}\n      />\n\n      <AlertingSettings<PromOptions>\n        alertmanagerDataSources={alertmanagers}\n        options={options}\n        onOptionsChange={onOptionsChange}\n      />\n\n      <PromSettings options={options} onOptionsChange={onOptionsChange} />\n    </>\n  );\n};\n","import { Grammar } from 'prismjs';\nimport { CompletionItem } from '@grafana/ui';\n\n// When changing RATE_RANGES, check if Loki/LogQL ranges should be changed too\n// @see public/app/plugins/datasource/loki/language_provider.ts\nexport const RATE_RANGES: CompletionItem[] = [\n  { label: '$__interval', sortValue: '$__interval' },\n  { label: '$__rate_interval', sortValue: '$__rate_interval' },\n  { label: '$__range', sortValue: '$__range' },\n  { label: '1m', sortValue: '00:01:00' },\n  { label: '5m', sortValue: '00:05:00' },\n  { label: '10m', sortValue: '00:10:00' },\n  { label: '30m', sortValue: '00:30:00' },\n  { label: '1h', sortValue: '01:00:00' },\n  { label: '1d', sortValue: '24:00:00' },\n];\n\nexport const OPERATORS = ['by', 'group_left', 'group_right', 'ignoring', 'on', 'offset', 'without'];\nexport const LOGICAL_OPERATORS = ['or', 'and', 'unless'];\n\nconst AGGREGATION_OPERATORS: CompletionItem[] = [\n  {\n    label: 'sum',\n    insertText: 'sum',\n    documentation: 'Calculate sum over dimensions',\n  },\n  {\n    label: 'min',\n    insertText: 'min',\n    documentation: 'Select minimum over dimensions',\n  },\n  {\n    label: 'max',\n    insertText: 'max',\n    documentation: 'Select maximum over dimensions',\n  },\n  {\n    label: 'avg',\n    insertText: 'avg',\n    documentation: 'Calculate the average over dimensions',\n  },\n  {\n    label: 'group',\n    insertText: 'group',\n    documentation: 'All values in the resulting vector are 1',\n  },\n  {\n    label: 'stddev',\n    insertText: 'stddev',\n    documentation: 'Calculate population standard deviation over dimensions',\n  },\n  {\n    label: 'stdvar',\n    insertText: 'stdvar',\n    documentation: 'Calculate population standard variance over dimensions',\n  },\n  {\n    label: 'count',\n    insertText: 'count',\n    documentation: 'Count number of elements in the vector',\n  },\n  {\n    label: 'count_values',\n    insertText: 'count_values',\n    documentation: 'Count number of elements with the same value',\n  },\n  {\n    label: 'bottomk',\n    insertText: 'bottomk',\n    documentation: 'Smallest k elements by sample value',\n  },\n  {\n    label: 'topk',\n    insertText: 'topk',\n    documentation: 'Largest k elements by sample value',\n  },\n  {\n    label: 'quantile',\n    insertText: 'quantile',\n    documentation: 'Calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions',\n  },\n];\n\nexport const FUNCTIONS = [\n  ...AGGREGATION_OPERATORS,\n  {\n    insertText: 'abs',\n    label: 'abs',\n    detail: 'abs(v instant-vector)',\n    documentation: 'Returns the input vector with all sample values converted to their absolute value.',\n  },\n  {\n    insertText: 'absent',\n    label: 'absent',\n    detail: 'absent(v instant-vector)',\n    documentation:\n      'Returns an empty vector if the vector passed to it has any elements and a 1-element vector with the value 1 if the vector passed to it has no elements. This is useful for alerting on when no time series exist for a given metric name and label combination.',\n  },\n  {\n    insertText: 'absent_over_time',\n    label: 'absent_over_time',\n    detail: 'absent(v range-vector)',\n    documentation:\n      'Returns an empty vector if the range vector passed to it has any elements and a 1-element vector with the value 1 if the range vector passed to it has no elements.',\n  },\n  {\n    insertText: 'ceil',\n    label: 'ceil',\n    detail: 'ceil(v instant-vector)',\n    documentation: 'Rounds the sample values of all elements in `v` up to the nearest integer.',\n  },\n  {\n    insertText: 'changes',\n    label: 'changes',\n    detail: 'changes(v range-vector)',\n    documentation:\n      'For each input time series, `changes(v range-vector)` returns the number of times its value has changed within the provided time range as an instant vector.',\n  },\n  {\n    insertText: 'clamp',\n    label: 'clamp',\n    detail: 'clamp(v instant-vector, min scalar, max scalar)',\n    documentation:\n      'Clamps the sample values of all elements in `v` to have a lower limit of `min` and an upper limit of `max`.',\n  },\n  {\n    insertText: 'clamp_max',\n    label: 'clamp_max',\n    detail: 'clamp_max(v instant-vector, max scalar)',\n    documentation: 'Clamps the sample values of all elements in `v` to have an upper limit of `max`.',\n  },\n  {\n    insertText: 'clamp_min',\n    label: 'clamp_min',\n    detail: 'clamp_min(v instant-vector, min scalar)',\n    documentation: 'Clamps the sample values of all elements in `v` to have a lower limit of `min`.',\n  },\n  {\n    insertText: 'count_scalar',\n    label: 'count_scalar',\n    detail: 'count_scalar(v instant-vector)',\n    documentation:\n      'Returns the number of elements in a time series vector as a scalar. This is in contrast to the `count()` aggregation operator, which always returns a vector (an empty one if the input vector is empty) and allows grouping by labels via a `by` clause.',\n  },\n  {\n    insertText: 'day_of_month',\n    label: 'day_of_month',\n    detail: 'day_of_month(v=vector(time()) instant-vector)',\n    documentation: 'Returns the day of the month for each of the given times in UTC. Returned values are from 1 to 31.',\n  },\n  {\n    insertText: 'day_of_week',\n    label: 'day_of_week',\n    detail: 'day_of_week(v=vector(time()) instant-vector)',\n    documentation:\n      'Returns the day of the week for each of the given times in UTC. Returned values are from 0 to 6, where 0 means Sunday etc.',\n  },\n  {\n    insertText: 'days_in_month',\n    label: 'days_in_month',\n    detail: 'days_in_month(v=vector(time()) instant-vector)',\n    documentation:\n      'Returns number of days in the month for each of the given times in UTC. Returned values are from 28 to 31.',\n  },\n  {\n    insertText: 'delta',\n    label: 'delta',\n    detail: 'delta(v range-vector)',\n    documentation:\n      'Calculates the difference between the first and last value of each time series element in a range vector `v`, returning an instant vector with the given deltas and equivalent labels. The delta is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if the sample values are all integers.',\n  },\n  {\n    insertText: 'deriv',\n    label: 'deriv',\n    detail: 'deriv(v range-vector)',\n    documentation:\n      'Calculates the per-second derivative of the time series in a range vector `v`, using simple linear regression.',\n  },\n  {\n    insertText: 'drop_common_labels',\n    label: 'drop_common_labels',\n    detail: 'drop_common_labels(instant-vector)',\n    documentation: 'Drops all labels that have the same name and value across all series in the input vector.',\n  },\n  {\n    insertText: 'exp',\n    label: 'exp',\n    detail: 'exp(v instant-vector)',\n    documentation:\n      'Calculates the exponential function for all elements in `v`.\\nSpecial cases are:\\n* `Exp(+Inf) = +Inf` \\n* `Exp(NaN) = NaN`',\n  },\n  {\n    insertText: 'floor',\n    label: 'floor',\n    detail: 'floor(v instant-vector)',\n    documentation: 'Rounds the sample values of all elements in `v` down to the nearest integer.',\n  },\n  {\n    insertText: 'histogram_quantile',\n    label: 'histogram_quantile',\n    detail: 'histogram_quantile(φ float, b instant-vector)',\n    documentation:\n      'Calculates the φ-quantile (0 ≤ φ ≤ 1) from the buckets `b` of a histogram. The samples in `b` are the counts of observations in each bucket. Each sample must have a label `le` where the label value denotes the inclusive upper bound of the bucket. (Samples without such a label are silently ignored.) The histogram metric type automatically provides time series with the `_bucket` suffix and the appropriate labels.',\n  },\n  {\n    insertText: 'holt_winters',\n    label: 'holt_winters',\n    detail: 'holt_winters(v range-vector, sf scalar, tf scalar)',\n    documentation:\n      'Produces a smoothed value for time series based on the range in `v`. The lower the smoothing factor `sf`, the more importance is given to old data. The higher the trend factor `tf`, the more trends in the data is considered. Both `sf` and `tf` must be between 0 and 1.',\n  },\n  {\n    insertText: 'hour',\n    label: 'hour',\n    detail: 'hour(v=vector(time()) instant-vector)',\n    documentation: 'Returns the hour of the day for each of the given times in UTC. Returned values are from 0 to 23.',\n  },\n  {\n    insertText: 'idelta',\n    label: 'idelta',\n    detail: 'idelta(v range-vector)',\n    documentation:\n      'Calculates the difference between the last two samples in the range vector `v`, returning an instant vector with the given deltas and equivalent labels.',\n  },\n  {\n    insertText: 'increase',\n    label: 'increase',\n    detail: 'increase(v range-vector)',\n    documentation:\n      'Calculates the increase in the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. The increase is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if a counter increases only by integer increments.',\n  },\n  {\n    insertText: 'irate',\n    label: 'irate',\n    detail: 'irate(v range-vector)',\n    documentation:\n      'Calculates the per-second instant rate of increase of the time series in the range vector. This is based on the last two data points. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for.',\n  },\n  {\n    insertText: 'label_join',\n    label: 'label_join',\n    detail:\n      'label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...)',\n    documentation:\n      'For each timeseries in `v`, joins all the values of all the `src_labels` using `separator` and returns the timeseries with the label `dst_label` containing the joined value. There can be any number of `src_labels` in this function.',\n  },\n  {\n    insertText: 'label_replace',\n    label: 'label_replace',\n    detail: 'label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)',\n    documentation:\n      \"For each timeseries in `v`, `label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)`  matches the regular expression `regex` against the label `src_label`.  If it matches, then the timeseries is returned with the label `dst_label` replaced by the expansion of `replacement`. `$1` is replaced with the first matching subgroup, `$2` with the second etc. If the regular expression doesn't match then the timeseries is returned unchanged.\",\n  },\n  {\n    insertText: 'ln',\n    label: 'ln',\n    detail: 'ln(v instant-vector)',\n    documentation:\n      'Calculates the natural logarithm for all elements in `v`.\\nSpecial cases are:\\n * `ln(+Inf) = +Inf`\\n * `ln(0) = -Inf`\\n * `ln(x < 0) = NaN`\\n * `ln(NaN) = NaN`',\n  },\n  {\n    insertText: 'log2',\n    label: 'log2',\n    detail: 'log2(v instant-vector)',\n    documentation:\n      'Calculates the binary logarithm for all elements in `v`. The special cases are equivalent to those in `ln`.',\n  },\n  {\n    insertText: 'log10',\n    label: 'log10',\n    detail: 'log10(v instant-vector)',\n    documentation:\n      'Calculates the decimal logarithm for all elements in `v`. The special cases are equivalent to those in `ln`.',\n  },\n  {\n    insertText: 'minute',\n    label: 'minute',\n    detail: 'minute(v=vector(time()) instant-vector)',\n    documentation:\n      'Returns the minute of the hour for each of the given times in UTC. Returned values are from 0 to 59.',\n  },\n  {\n    insertText: 'month',\n    label: 'month',\n    detail: 'month(v=vector(time()) instant-vector)',\n    documentation:\n      'Returns the month of the year for each of the given times in UTC. Returned values are from 1 to 12, where 1 means January etc.',\n  },\n  {\n    insertText: 'predict_linear',\n    label: 'predict_linear',\n    detail: 'predict_linear(v range-vector, t scalar)',\n    documentation:\n      'Predicts the value of time series `t` seconds from now, based on the range vector `v`, using simple linear regression.',\n  },\n  {\n    insertText: 'rate',\n    label: 'rate',\n    detail: 'rate(v range-vector)',\n    documentation:\n      \"Calculates the per-second average rate of increase of the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. Also, the calculation extrapolates to the ends of the time range, allowing for missed scrapes or imperfect alignment of scrape cycles with the range's time period.\",\n  },\n  {\n    insertText: 'resets',\n    label: 'resets',\n    detail: 'resets(v range-vector)',\n    documentation:\n      'For each input time series, `resets(v range-vector)` returns the number of counter resets within the provided time range as an instant vector. Any decrease in the value between two consecutive samples is interpreted as a counter reset.',\n  },\n  {\n    insertText: 'round',\n    label: 'round',\n    detail: 'round(v instant-vector, to_nearest=1 scalar)',\n    documentation:\n      'Rounds the sample values of all elements in `v` to the nearest integer. Ties are resolved by rounding up. The optional `to_nearest` argument allows specifying the nearest multiple to which the sample values should be rounded. This multiple may also be a fraction.',\n  },\n  {\n    insertText: 'scalar',\n    label: 'scalar',\n    detail: 'scalar(v instant-vector)',\n    documentation:\n      'Given a single-element input vector, `scalar(v instant-vector)` returns the sample value of that single element as a scalar. If the input vector does not have exactly one element, `scalar` will return `NaN`.',\n  },\n  {\n    insertText: 'sgn',\n    label: 'sgn',\n    detail: 'sgn(v instant-vector)',\n    documentation:\n      'Returns a vector with all sample values converted to their sign, defined as this: 1 if v is positive, -1 if v is negative and 0 if v is equal to zero.',\n  },\n  {\n    insertText: 'sort',\n    label: 'sort',\n    detail: 'sort(v instant-vector)',\n    documentation: 'Returns vector elements sorted by their sample values, in ascending order.',\n  },\n  {\n    insertText: 'sort_desc',\n    label: 'sort_desc',\n    detail: 'sort_desc(v instant-vector)',\n    documentation: 'Returns vector elements sorted by their sample values, in descending order.',\n  },\n  {\n    insertText: 'sqrt',\n    label: 'sqrt',\n    detail: 'sqrt(v instant-vector)',\n    documentation: 'Calculates the square root of all elements in `v`.',\n  },\n  {\n    insertText: 'time',\n    label: 'time',\n    detail: 'time()',\n    documentation:\n      'Returns the number of seconds since January 1, 1970 UTC. Note that this does not actually return the current time, but the time at which the expression is to be evaluated.',\n  },\n  {\n    insertText: 'timestamp',\n    label: 'timestamp',\n    detail: 'timestamp(v instant-vector)',\n    documentation:\n      'Returns the timestamp of each of the samples of the given vector as the number of seconds since January 1, 1970 UTC.',\n  },\n  {\n    insertText: 'vector',\n    label: 'vector',\n    detail: 'vector(s scalar)',\n    documentation: 'Returns the scalar `s` as a vector with no labels.',\n  },\n  {\n    insertText: 'year',\n    label: 'year',\n    detail: 'year(v=vector(time()) instant-vector)',\n    documentation: 'Returns the year for each of the given times in UTC.',\n  },\n  {\n    insertText: 'avg_over_time',\n    label: 'avg_over_time',\n    detail: 'avg_over_time(range-vector)',\n    documentation: 'The average value of all points in the specified interval.',\n  },\n  {\n    insertText: 'min_over_time',\n    label: 'min_over_time',\n    detail: 'min_over_time(range-vector)',\n    documentation: 'The minimum value of all points in the specified interval.',\n  },\n  {\n    insertText: 'max_over_time',\n    label: 'max_over_time',\n    detail: 'max_over_time(range-vector)',\n    documentation: 'The maximum value of all points in the specified interval.',\n  },\n  {\n    insertText: 'sum_over_time',\n    label: 'sum_over_time',\n    detail: 'sum_over_time(range-vector)',\n    documentation: 'The sum of all values in the specified interval.',\n  },\n  {\n    insertText: 'count_over_time',\n    label: 'count_over_time',\n    detail: 'count_over_time(range-vector)',\n    documentation: 'The count of all values in the specified interval.',\n  },\n  {\n    insertText: 'quantile_over_time',\n    label: 'quantile_over_time',\n    detail: 'quantile_over_time(scalar, range-vector)',\n    documentation: 'The φ-quantile (0 ≤ φ ≤ 1) of the values in the specified interval.',\n  },\n  {\n    insertText: 'stddev_over_time',\n    label: 'stddev_over_time',\n    detail: 'stddev_over_time(range-vector)',\n    documentation: 'The population standard deviation of the values in the specified interval.',\n  },\n  {\n    insertText: 'stdvar_over_time',\n    label: 'stdvar_over_time',\n    detail: 'stdvar_over_time(range-vector)',\n    documentation: 'The population standard variance of the values in the specified interval.',\n  },\n  {\n    insertText: 'last_over_time',\n    label: 'last_over_time',\n    detail: 'last_over_time(range-vector)',\n    documentation: 'The most recent point value in specified interval.',\n  },\n];\n\nexport const PROM_KEYWORDS = FUNCTIONS.map((keyword) => keyword.label);\n\nconst tokenizer: Grammar = {\n  comment: {\n    pattern: /#.*/,\n  },\n  'context-aggregation': {\n    pattern: /((by|without)\\s*)\\([^)]*\\)/, // by ()\n    lookbehind: true,\n    inside: {\n      'label-key': {\n        pattern: /[^(),\\s][^,)]*[^),\\s]*/,\n        alias: 'attr-name',\n      },\n      punctuation: /[()]/,\n    },\n  },\n  'context-labels': {\n    pattern: /\\{[^}]*(?=}?)/,\n    greedy: true,\n    inside: {\n      comment: {\n        pattern: /#.*/,\n      },\n      'label-key': {\n        pattern: /[a-z_]\\w*(?=\\s*(=|!=|=~|!~))/,\n        alias: 'attr-name',\n        greedy: true,\n      },\n      'label-value': {\n        pattern: /\"(?:\\\\.|[^\\\\\"])*\"/,\n        greedy: true,\n        alias: 'attr-value',\n      },\n      punctuation: /[{]/,\n    },\n  },\n  function: new RegExp(`\\\\b(?:${FUNCTIONS.map((f) => f.label).join('|')})(?=\\\\s*\\\\()`, 'i'),\n  'context-range': [\n    {\n      pattern: /\\[[^\\]]*(?=])/, // [1m]\n      inside: {\n        'range-duration': {\n          pattern: /\\b\\d+[smhdwy]\\b/i,\n          alias: 'number',\n        },\n      },\n    },\n    {\n      pattern: /(offset\\s+)\\w+/, // offset 1m\n      lookbehind: true,\n      inside: {\n        'range-duration': {\n          pattern: /\\b\\d+[smhdwy]\\b/i,\n          alias: 'number',\n        },\n      },\n    },\n  ],\n  idList: {\n    pattern: /\\d+(\\|\\d+)+/,\n    alias: 'number',\n  },\n  number: /\\b-?\\d+((\\.\\d*)?([eE][+-]?\\d+)?)?\\b/,\n  operator: new RegExp(`/[-+*/=%^~]|&&?|\\\\|?\\\\||!=?|<(?:=>?|<|>)?|>[>=]?|\\\\b(?:${OPERATORS.join('|')})\\\\b`, 'i'),\n  punctuation: /[{};()`,.]/,\n};\n\nexport default tokenizer;\n"],"names":["PromQueryType","isMatrixData","result","transformV2","response","request","options","tableFrames","framesWithoutTable","partition","data","df","dataFrame","app","CoreApp","meta","custom","resultType","target","targets","find","refId","format","isTableResult","processedTableFrames","dfs","length","dataFramesByRefId","groupBy","refIds","Object","keys","map","valueText","responseLength","getValueText","valueField","getValueField","valueName","timeField","getTimeField","labelFields","forEach","promLabels","fields","labels","sort","label","some","l","name","numberField","push","config","filterable","type","FieldType","values","ArrayVector","toArray","value","add","parseSampleValue","labelsForField","field","getLabelValue","preferredVisualisationType","transformDFToTable","heatmapResults","framesWithoutTableAndHeatmaps","isHeatmapResult","processedHeatmapFrames","transformToHistogramOverTime","sortSeriesByLabel","exemplarFrames","framesWithoutTableHeatmapsAndExemplars","exemplarTraceIdDestinations","destinations","processedExemplarFrames","exemplarTraceIdDestination","traceIDField","links","getDataLinks","dataTopic","DataTopic","otherFrames","transform","transformOptions","step","query","legendFormat","start","end","expr","responseListLength","scopedVars","valueWithRefId","instant","prometheusResult","Array","isArray","events","exemplarData","exemplars","exemplar","TIME_SERIES_TIME_FIELD_NAME","timestamp","TIME_SERIES_VALUE_FIELD_NAME","seriesLabels","sampledExemplars","bucketedExemplars","alignedTs","String","Math","floor","standardDeviation","deviation","sampledBuckets","ts","exemplarsInBucket","sampledBucketValues","ex","descending","reduce","acc","curr","prev","sampleExemplars","ArrayDataFrame","tableData","md","metricFields","series","metric","d","val","metricField","transformMetricDataToTable","renderTemplate","getTemplateSrv","replace","__name__","labelsWithoutName","labelPart","formatLabels","title","createLabelInfo","stepMs","NaN","baseTimestamp","dps","dpValue","isNaN","t","endTimestamp","parseValue","displayNameFromDS","transformToDataFrame","dataLinks","datasourceUid","dsSettings","getDataSourceSrv","getInstanceSettings","url","internal","queryType","datasourceName","targetBlank","hasOwnProperty","isMs","display","getDisplayProcessor","aliasPattern","aliasData","_match","g1","seriesList","i","topSeries","s","bottomSeries","Error","j","bottomPoint","get","s1","s2","le1","le2","err","console","error","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","parseFloat","PrometheusMetricFindQuery","constructor","datasource","this","range","getTimeSrv","timeRange","process","match","labelNamesQuery","labelValuesQuery","metricNamesQuery","metricNameQuery","queryResultQuery","lastValueFrom","metricNameAndLabelsQuery","getPrometheusTime","from","to","params","toString","metadataRequest","then","_map","text","_labels","filter","uniq","expandable","metricFilterPattern","chain","metricName","RegExp","test","matchedMetricName","instantQuery","performInstantQuery","pipe","metricData","v","k","join","self","getOriginalMetricName","PrometheusVariableSupport","StandardVariableSupport","templateSrv","timeSrv","super","bind","of","__interval","interval","__interval_ms","rangeUtil","getRangeScopedVars","interpolated","interpolateQueryExpr","metricFindQuery","results","toDataQuery","ANNOTATION_QUERY_STEP_DEFAULT","GET_AND_POST_METADATA_ENDPOINTS","PrometheusDatasource","DataSourceWithBackend","instanceSettings","LRU","async","loadRules","exemplarsAvailable","areExemplarsAvailable","queries","activeTargets","clonedTargets","cloneDeep","hide","requestId","panelId","languageProvider","histogramMetrics","m","includes","instantTarget","maxDataPoints","rangeTarget","activeTarget","exemplarTarget","createQuery","message","statusText","safeStringifyValue","status","frames","toDataQueryResponse","annotation","tagKeys","titleFormat","textFormat","tagKeysArray","split","eventList","frame","tags","timeValueTuple","idx","timeStampValue","valueValue","time","useValueForTime","activeValuesTimestamps","latestEvent","timeEnd","editorSrc","id","access","basicAuth","withCredentials","jsonData","timeInterval","queryTimeout","httpMethod","directUrl","ruleMappings","PrometheusLanguageProvider","lookupsDisabled","disableMetricsLookup","customQueryParameters","URLSearchParams","variables","getQueryDisplayText","_addTracingHeaders","httpOptions","headers","dashboardId","_request","overrides","key","defaults","method","search","entries","encodeURIComponent","Authorization","getBackendSrv","fetch","endpoint","hideFromInspector","warn","variable","multi","includeAll","prometheusRegularEscape","prometheusSpecialRegexEscape","escapedValues","targetContainsTemplate","variableExists","shouldRunExemplarQuery","currentTargetIdx","findIndex","slice","processTargetV2","timeSeriesQuery","utcOffsetSec","utcOffset","prepareTargets","exploreQuery","panelsQuery","state","LoadingState","runningQueriesCount","subQueries","index","filterAndMapResponse","tap","cancelled","runQuery","merge","observables","forkJoin","current","getExemplars","catchError","performTimeSeriesQuery","hinting","ceil","minInterval","scrapeInterval","intervalFactor","adjustedInterval","adjustInterval","getRateIntervalScopedVariable","assign","enhanceExprWithAdHocFilters","adjusted","alignedEnd","alignedStart","alignRange","rateInterval","max","__rate_interval","safeInterval","throwError","handleErrors","Promise","resolve","msRange","diff","sRange","round","__range_ms","__range_s","__range","queryModel","getRef","applyTemplateVariables","rsp","processAnnotationResponse","now","Date","getTime","intervalMs","dateTime","res","catch","interpolateVariablesInQueries","expandedQueries","getQueryHints","hints","trim","fix","action","indexOf","nameMatch","counterNameMetric","metricsMetadata","metricMetadataKeys","certain","toLowerCase","metricRegex","simpleMetric","mapping","mappingForQuery","ruleName","size","preventSubmit","getInitHints","metrics","groups","group","rules","rule","extractRuleMappingFromGroups","e","log","modifyQuery","expression","addLabelToQuery","expandRecordingRules","date","roundUp","dateMath","valueOf","getTimeRangeParams","labelData","finalQuery","getAdhocFilters","operator","filterQuery","EMPTY_SELECTOR","METRIC_LABEL","buildSelector","singleMetric","selectedLabels","selected","selectedValues","escapeLabelValueInRegexSelector","escapeLabelValueInExactSelector","getStyles","stylesFactory","theme","wrapper","css","colors","bg2","spacing","sm","list","section","selector","typography","fontFamily","monospace","xs","textSemiWeak","statusShowing","palette","brandDanger","valueList","valueListWrapper","border2","valueListArea","valueTitle","validationStatus","textStrong","UnthemedPrometheusMetricsBrowser","React","labelSearchTerm","metricSearchTerm","valueSearchTerm","event","setState","props","onChange","undefined","loading","hidden","facets","deleteLastUsedLabels","fetchValues","nextValue","updateLabelState","doFacettingForLabel","doFacetting","validateSelector","lastFacetted","fetchSeries","updatedFields","cb","componentDidMount","lastUsedLabels","rawLabels","getLabelKeys","arr","storeLastUsedLabels","rawValues","getLabelValues","labelValue","details","help","possibleLabels","fetchSeriesLabels","possibleValues","existingValues","Set","has","facetLabels","streams","render","styles","className","LoadingPlaceholder","nonMetricLabels","empty","metricCount","HorizontalGroup","align","Label","description","Input","onChangeMetricSearch","role","height","min","itemCount","itemSize","itemKey","width","style","active","onClick","onClickMetric","searchTerm","onChangeLabelSearch","onClickLabel","onChangeValueSearch","ref","valueListsRef","onClickValue","Button","disabled","onClickRunQuery","variant","onClickRunRateQuery","onClickValidate","onClickClear","cx","PrometheusMetricsBrowser","withTheme","Field","MonacoQueryFieldLazy","Suspense","fallback","MonacoQueryFieldWrapper","lastRunValueRef","useRef","runQueryOnBlur","onRunQuery","rest","handleRunQuery","onBlur","PromQueryField","context","initHints","initHint","hint","isDataFrame","toLegacyResponseData","queryHints","queryHint","languageProviderInitializationPromise","promise","hasCanceled_","reject","isCanceled","cancel","makePromiseCancelable","remainingTasks","all","onUpdateLanguage","onChangeQuery","labelBrowserVisible","override","syntaxLoaded","suggestions","history","prefix","wrapperClasses","labelKey","typeahead","provideCompletionItems","plugins","BracesPlugin","SlatePrism","onlyIn","node","getSyntax","prismLanguages","promql","syntax","refreshMetrics","refreshHint","componentWillUnmount","componentDidUpdate","prevProps","changedRangeToRefresh","rangeChangedToRefresh","prevRange","sameMinuteFrom","roundMsToMin","sameMinuteTo","ExtraFieldElement","hasMetrics","chooserText","metricsLookupDisabled","hasSyntax","getChooserText","buttonDisabled","LocalStorageValueProvider","storageKey","defaultValue","onLastUsedLabelsSave","onLastUsedLabelsDelete","onClickChooserButton","Icon","initialValue","onChangeLabelBrowser","onClickHintFix","PromLink","panelData","href","setHref","useState","useEffect","rangeDiff","endTime","utc","queryOptions","args","getExternalLink","textUtil","rel","memo","PromExemplarField","setError","useStyles2","prevError","usePrevious","iconButtonStyles","activeIcon","eyeIcon","InlineLabel","Tooltip","content","iconWrapper","IconButton","tooltip","primary","main","Switch","LegacyForms","FORMAT_OPTIONS","INTERVAL_FACTOR_OPTIONS","PromQueryEditor","PureComponent","option","formatOption","checked","currentTarget","intervalFactorOption","isEnabled","defaultQuery","Boolean","showExemplarField","onFieldChange","testIds","editor","InlineFormLabel","placeholder","onLegendChange","onIntervalChange","Select","menuShouldPortal","isSearchable","onIntervalFactorChange","onFormatChange","onInstantChange","onExemplarChange","PromQueryEditorForAlerting","PromQueryEditorByApp","CHEAT_SHEET_ITEMS","item","onClickExample","PromExploreExtraField","prevQuery","useCallback","isEqual","extraFieldEditor","queryTypeField","RadioButtonGroup","nextQuery","stepField","onKeyDown","shiftKey","PromExploreQueryEditor","AzureCloud","KnownAzureClouds","Public","China","USGovernment","Germany","concealed","Symbol","getDefaultAzureCloud","getSecret","secureJsonFields","azureClientSecret","secret","secureJsonData","authTypeOptions","AzureCredentialsForm","credentials","azureCloudOptions","onCredentialsChange","getSubscriptions","hasRequiredFields","authType","azureCloud","tenantId","clientId","clientSecret","isCredentialsComplete","subscriptions","setSubscriptions","loadSubscriptionsClicked","onLoadSubscriptions","useReducer","updateSubscriptions","canceled","received","autoSelect","defaultSubscriptionId","onSubscriptionChange","opt","updated","managedIdentityEnabled","I","AzureAuthSettings","dataSourceConfig","useMemo","azureCredentials","getCredentials","updateCredentials","azureEndpointResourceId","ExemplarSetting","onDelete","isInternalLink","setIsInternalLink","InlineField","labelWidth","InlineSwitch","selectors","ev","icon","preventDefault","DataSourcePicker","tracing","noDefault","ds","uid","spellCheck","ExemplarsSettings","newField","newOptions","splice","FormField","PromSettings","onOptionsChange","inputEl","onChangeHandler","validationEvents","promSettingsValidationEvents","o","labelClass","onUpdateDatasourceJsonDataOptionChecked","exemplarOptions","updateDatasourcePluginJsonDataOption","EventsWithValidation","regexValidation","getValueFromEventItem","eventItem","PrometheusAnnotationsQueryCtrl","plugin","DataSourcePlugin","setQueryEditor","setConfigEditor","alertmanagers","getAllAlertmanagerDataSources","azureAuthSettings","azureAuthEnabled","azureSettingsUI","Alert","severity","DataSourceHttpSettings","defaultUrl","showAccessOptions","sigV4AuthToggleEnabled","AlertingSettings","alertmanagerDataSources","setExploreMetricsQueryField","setAnnotationQueryCtrl","setQueryEditorHelp","PromCheatSheet","RATE_RANGES","sortValue","OPERATORS","LOGICAL_OPERATORS","FUNCTIONS","insertText","documentation","detail","PROM_KEYWORDS","keyword","comment","pattern","lookbehind","inside","alias","punctuation","greedy","function","f","idList","number"],"sourceRoot":""}