{"version":3,"file":"datasource.mjs","sources":["../../src/datasource.ts"],"sourcesContent":["import { defaults } from 'lodash';\nimport { tz } from 'moment-timezone';\nimport { lastValueFrom, type Observable, throwError } from 'rxjs';\nimport { map, tap } from 'rxjs/operators';\nimport { gte } from 'semver';\n\nimport {\n  type AbstractQuery,\n  type AdHocVariableFilter,\n  CoreApp,\n  type CustomVariableModel,\n  type DataQueryRequest,\n  type DataQueryResponse,\n  type DataSourceGetTagKeysOptions,\n  type DataSourceGetTagValuesOptions,\n  type DataSourceInstanceSettings,\n  type DataSourceWithQueryExportSupport,\n  type DataSourceWithQueryImportSupport,\n  dateTime,\n  getDefaultTimeRange,\n  type LegacyMetricFindQueryOptions,\n  type MetricFindValue,\n  type QueryFixAction,\n  type QueryVariableModel,\n  rangeUtil,\n  type ScopedVars,\n  scopeFilterOperatorMap,\n  type ScopeSpecFilter,\n  type TimeRange,\n} from '@grafana/data';\nimport {\n  type BackendSrvRequest,\n  config,\n  DataSourceWithBackend,\n  type FetchResponse,\n  getBackendSrv,\n  getTemplateSrv,\n  isFetchError,\n  type TemplateSrv,\n} from '@grafana/runtime';\n\nimport { addLabelToQuery } from './add_label_to_query';\nimport { PrometheusAnnotationSupport } from './annotations';\nimport { DEFAULT_SERIES_LIMIT, GET_AND_POST_METADATA_ENDPOINTS, InstantQueryRefIdIndex } from './constants';\nimport { interpolateQueryExpr, prometheusRegularEscape } from './escaping';\nimport {\n  exportToAbstractQuery,\n  importFromAbstractQuery,\n  populateMatchParamsFromQueries,\n  PrometheusLanguageProvider,\n  type PrometheusLanguageProviderInterface,\n} from './language_provider';\nimport { expandRecordingRules, getPrometheusTime, getRangeSnapInterval } from './language_utils';\nimport { PrometheusMetricFindQuery } from './metric_find_query';\nimport { getQueryHints } from './query_hints';\nimport { renderLabelsWithoutBrackets } from './querybuilder/shared/rendering/labels';\nimport { type QueryBuilderLabelFilter, type QueryEditorMode } from './querybuilder/shared/types';\nimport { type CacheRequestInfo, defaultPrometheusQueryOverlapWindow, QueryCache } from './querycache/QueryCache';\nimport { transformV2 } from './result_transformer';\nimport { trackQuery } from './tracking';\nimport {\n  type ExemplarTraceIdDestination,\n  PromApplication,\n  PrometheusCacheLevel,\n  type PromOptions,\n  type PromQuery,\n  type PromQueryRequest,\n  type RawRecordingRules,\n  type RuleQueryMapping,\n} from './types';\nimport { utf8Support, wrapUtf8Filters } from './utf8_support';\nimport { PrometheusVariableSupport } from './variables';\n\nexport class PrometheusDatasource\n  extends DataSourceWithBackend<PromQuery, PromOptions>\n  implements DataSourceWithQueryImportSupport<PromQuery>, DataSourceWithQueryExportSupport<PromQuery>\n{\n  access: 'direct' | 'proxy';\n  basicAuth: any;\n  cache: QueryCache<PromQuery>;\n  cacheLevel: PrometheusCacheLevel;\n  customQueryParameters: URLSearchParams;\n  datasourceConfigurationPrometheusFlavor?: PromApplication;\n  datasourceConfigurationPrometheusVersion?: string;\n  disableRecordingRules: boolean;\n  exemplarTraceIdDestinations: ExemplarTraceIdDestination[] | undefined;\n  exemplarsAvailable: boolean;\n  hasIncrementalQuery: boolean;\n  httpMethod: string;\n  interval: string;\n  languageProvider: PrometheusLanguageProviderInterface;\n  lookupsDisabled: boolean;\n  ruleMappings: RuleQueryMapping;\n  seriesEndpoint: boolean;\n  seriesLimit: number;\n  type: string;\n  url: string;\n  withCredentials: boolean;\n  defaultEditor?: QueryEditorMode;\n\n  constructor(\n    public readonly instanceSettings: DataSourceInstanceSettings<PromOptions>,\n    private readonly templateSrv: TemplateSrv = getTemplateSrv(),\n    languageProvider?: PrometheusLanguageProviderInterface\n  ) {\n    super(instanceSettings);\n\n    // DATASOURCE CONFIGURATION PROPERTIES\n    this.access = instanceSettings.access;\n    this.basicAuth = instanceSettings.basicAuth;\n    this.cache = new QueryCache({\n      getTargetSignature: this.getPrometheusTargetSignature.bind(this),\n      overlapString: instanceSettings.jsonData.incrementalQueryOverlapWindow ?? defaultPrometheusQueryOverlapWindow,\n      applyInterpolation: this.interpolateString.bind(this),\n    });\n    this.cacheLevel = instanceSettings.jsonData.cacheLevel ?? PrometheusCacheLevel.Low;\n    this.customQueryParameters = new URLSearchParams(instanceSettings.jsonData.customQueryParameters);\n    this.datasourceConfigurationPrometheusFlavor = instanceSettings.jsonData.prometheusType;\n    this.datasourceConfigurationPrometheusVersion = instanceSettings.jsonData.prometheusVersion;\n    this.disableRecordingRules = instanceSettings.jsonData.disableRecordingRules ?? false;\n    this.exemplarTraceIdDestinations = instanceSettings.jsonData.exemplarTraceIdDestinations;\n    this.exemplarsAvailable = true;\n    this.hasIncrementalQuery = instanceSettings.jsonData.incrementalQuerying ?? false;\n    this.httpMethod = instanceSettings.jsonData.httpMethod || 'GET';\n    this.interval = instanceSettings.jsonData.timeInterval || '15s';\n    this.lookupsDisabled = instanceSettings.jsonData.disableMetricsLookup ?? false;\n    this.ruleMappings = {};\n    this.seriesEndpoint = instanceSettings.jsonData.seriesEndpoint ?? false;\n    this.seriesLimit = instanceSettings.jsonData.seriesLimit ?? DEFAULT_SERIES_LIMIT;\n    this.type = 'prometheus';\n    this.url = instanceSettings.url!;\n    this.withCredentials = Boolean(instanceSettings.withCredentials);\n    this.defaultEditor = instanceSettings.jsonData.defaultEditor;\n\n    // INHERITED PROPERTIES\n    this.annotations = PrometheusAnnotationSupport(this);\n    this.variables = new PrometheusVariableSupport(this, this.templateSrv);\n\n    // LANGUAGE PROVIDER\n    // This needs to be the last thing we initialize.\n    this.languageProvider = languageProvider ?? new PrometheusLanguageProvider(this);\n  }\n\n  /**\n   * Initializes the Prometheus datasource by loading recording rules and checking exemplar availability.\n   *\n   * This method performs two key initialization tasks: Loads recording rules from the\n   * Prometheus API and checks if exemplars are available by testing the exemplars API endpoint.\n   */\n  init = async (): Promise<void> => {\n    if (!this.disableRecordingRules) {\n      this.loadRules();\n    }\n    this.exemplarsAvailable = await this.areExemplarsAvailable();\n  };\n\n  /**\n   * Loads recording rules from the Prometheus API and extracts rule mappings.\n   *\n   * This method fetches rules from the `/api/v1/rules` endpoint and processes\n   * them to create a mapping of rule names to their corresponding queries and labels.\n   * The rules API is experimental, so errors are logged but not thrown.\n   */\n  private async loadRules(): Promise<void> {\n    try {\n      const params = {};\n      const options = { showErrorAlert: false };\n      const res = await this.metadataRequest('/api/v1/rules', params, options);\n      const ruleGroups = res.data?.data?.groups;\n\n      if (ruleGroups) {\n        this.ruleMappings = extractRuleMappingFromGroups(ruleGroups);\n      }\n    } catch (err) {\n      console.log('Rules API is experimental. Ignore next error.');\n      console.error(err);\n    }\n  }\n\n  /**\n   * Checks if exemplars are available by testing the exemplars API endpoint.\n   *\n   * This method makes a test request to the `/api/v1/query_exemplars` endpoint to determine\n   * if the Prometheus instance supports exemplars. The test uses a simple query with a\n   * 30-minute time range. If the request succeeds with a 'success' status, exemplars\n   * are considered available. Errors are caught and return false to avoid breaking\n   * the datasource initialization.\n   */\n  private async areExemplarsAvailable(): Promise<boolean> {\n    try {\n      const params = {\n        query: 'test',\n        start: dateTime().subtract(30, 'minutes').valueOf().toString(),\n        end: dateTime().valueOf().toString(),\n      };\n      const options = { showErrorAlert: false };\n      const res = await this.metadataRequest('/api/v1/query_exemplars', params, options);\n\n      return res.data.status === 'success';\n    } catch (err) {\n      return false;\n    }\n  }\n\n  getQueryDisplayText(query: PromQuery) {\n    return query.expr;\n  }\n\n  /**\n   * Get target signature for query caching\n   * @param request\n   * @param query\n   */\n  getPrometheusTargetSignature(request: DataQueryRequest<PromQuery>, query: PromQuery) {\n    const targExpr = this.interpolateString(query.expr);\n    return `${targExpr}|${query.interval ?? request.interval}|${JSON.stringify(request.rangeRaw ?? '')}|${\n      query.exemplar\n    }`;\n  }\n\n  hasLabelsMatchAPISupport(): boolean {\n    // users may choose the series endpoint as it has a POST method\n    // while the label values is only GET\n    if (this.seriesEndpoint) {\n      return false;\n    }\n\n    return (\n      // https://github.com/prometheus/prometheus/releases/tag/v2.24.0\n      this._isDatasourceVersionGreaterOrEqualTo('2.24.0', PromApplication.Prometheus) ||\n      // All versions of Mimir support matchers for labels API\n      this._isDatasourceVersionGreaterOrEqualTo('2.0.0', PromApplication.Mimir) ||\n      // https://github.com/cortexproject/cortex/discussions/4542\n      this._isDatasourceVersionGreaterOrEqualTo('1.11.0', PromApplication.Cortex) ||\n      // https://github.com/thanos-io/thanos/pull/3566\n      //https://github.com/thanos-io/thanos/releases/tag/v0.18.0\n      this._isDatasourceVersionGreaterOrEqualTo('0.18.0', PromApplication.Thanos)\n    );\n  }\n\n  _isDatasourceVersionGreaterOrEqualTo(targetVersion: string, targetFlavor: PromApplication): boolean {\n    // User hasn't configured flavor/version yet, default behavior is to support labels match api support\n    if (!this.datasourceConfigurationPrometheusVersion || !this.datasourceConfigurationPrometheusFlavor) {\n      return true;\n    }\n\n    if (targetFlavor !== this.datasourceConfigurationPrometheusFlavor) {\n      return false;\n    }\n\n    return gte(this.datasourceConfigurationPrometheusVersion, targetVersion);\n  }\n\n  _addTracingHeaders(httpOptions: PromQueryRequest, options: DataQueryRequest<PromQuery>) {\n    httpOptions.headers = {};\n    if (this.access === 'proxy') {\n      httpOptions.headers['X-Dashboard-UID'] = options.dashboardUID;\n      httpOptions.headers['X-Panel-Id'] = options.panelId;\n    }\n  }\n\n  directAccessError() {\n    return throwError(\n      () =>\n        new Error(\n          'Browser access mode in the Prometheus datasource is no longer available. Switch to server access mode.'\n        )\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 = unknown>(\n    url: string,\n    data: Record<string, string> | null,\n    overrides: Partial<BackendSrvRequest> = {}\n  ): Observable<FetchResponse<T>> {\n    if (this.access === 'direct') {\n      return this.directAccessError();\n    }\n\n    data = data || {};\n    for (const [key, value] of this.customQueryParameters) {\n      if (data[key] == null) {\n        data[key] = value;\n      }\n    }\n\n    let queryUrl = this.url + url;\n    if (url.startsWith(`/api/datasources/uid/${this.uid}`)) {\n      // This url is meant to be a replacement for the whole URL. Replace the entire URL\n      queryUrl = url;\n    }\n\n    const options: BackendSrvRequest = defaults(overrides, {\n      url: queryUrl,\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      if (!options.headers!['Content-Type']) {\n        options.headers!['Content-Type'] = 'application/x-www-form-urlencoded';\n      }\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  async importFromAbstractQueries(abstractQueries: AbstractQuery[]): Promise<PromQuery[]> {\n    return abstractQueries.map((abstractQuery) => importFromAbstractQuery(abstractQuery));\n  }\n\n  async exportToAbstractQueries(queries: PromQuery[]): Promise<AbstractQuery[]> {\n    return queries.map((query) => exportToAbstractQuery(query));\n  }\n\n  // Use this for tab completion features, wont publish response to other components\n  async metadataRequest<T = any>(url: string, params = {}, options?: Partial<BackendSrvRequest>) {\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>(`/api/datasources/uid/${this.uid}/resources${url}`, params, {\n            method: this.httpMethod,\n            hideFromInspector: true,\n            showErrorAlert: false,\n            ...options,\n          })\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' && isFetchError(err) && (err.status === 405 || err.status === 400)) {\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>(`/api/datasources/uid/${this.uid}/resources${url}`, params, {\n        method: 'GET',\n        hideFromInspector: true,\n        ...options,\n      })\n    ); // toPromise until we change getTagValues, getLabelNames to Observable\n  }\n\n  interpolateQueryExpr(value: string | string[] = [], variable: QueryVariableModel | CustomVariableModel) {\n    return interpolateQueryExpr(value, variable);\n  }\n\n  targetContainsTemplate(target: PromQuery) {\n    return this.templateSrv.containsTemplate(target.expr);\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.retrieveHistogramMetrics().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).filter((t) => !t.hide);\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    // The `utcOffsetSec` parameter is required by the backend to correctly align time ranges.\n    // This alignment ensures that relative time ranges (e.g., \"Last N hours/days/years\") are adjusted\n    // according to the user's selected time zone, rather than defaulting to UTC.\n    //\n    // Example: If the user selects \"Last 5 days,\" each day should begin at 00:00 in the chosen time zone,\n    // rather than at 00:00 UTC, ensuring an accurate breakdown.\n    //\n    // This adjustment does not apply to absolute time ranges, where users explicitly set\n    // the start and end timestamps.\n    //\n    // Handling `utcOffsetSec`:\n    // - When using the browser's time zone, the UTC offset is derived from the request range object.\n    // - When the user selects a custom time zone, the UTC offset must be calculated accordingly.\n    // More details:\n    // - Issue that led to the introduction of utcOffsetSec: https://github.com/grafana/grafana/issues/17278\n    // - Implementation PR: https://github.com/grafana/grafana/pull/17477\n    let utcOffset = request.range.to.utcOffset();\n    if (request.timezone === 'browser') {\n      // we need to check if the request is a relative or absolute range.\n      // if it is absolute time range then utcOffset must be 0. we don't care the offset\n      // because we are already sending the from and to values in utc. we don't need to adjust them again\n      // for relative ranges we need utcOffset to adjust query range.\n      utcOffset = this.isUsingRelativeTimeRange(request.range) ? utcOffset : 0;\n    } else {\n      utcOffset = tz(request.timezone).utcOffset();\n    }\n\n    const processedTargets: PromQuery[] = [];\n    const processedTarget = {\n      ...target,\n      exemplar: this.shouldRunExemplarQuery(target, request),\n      requestId: request.panelId + target.refId,\n      utcOffsetSec: utcOffset * 60,\n    };\n\n    if (request.scopes) {\n      processedTarget.scopes = (request.scopes ?? []).map((scope) => ({\n        name: scope.metadata.name,\n        ...scope.spec,\n      }));\n    }\n\n    if (config.featureToggles.groupByVariable || config.featureToggles.dashboardUnifiedDrilldownControls) {\n      processedTarget.groupByKeys = request.groupByKeys;\n    }\n\n    if (target.instant && target.range) {\n      // We have query type \"Both\" selected\n      // We should send separate queries with different refId\n      processedTargets.push(\n        {\n          ...processedTarget,\n          refId: processedTarget.refId,\n          instant: false,\n        },\n        {\n          ...processedTarget,\n          refId: processedTarget.refId + InstantQueryRefIdIndex,\n          range: false,\n          exemplar: false,\n        }\n      );\n    } else {\n      processedTargets.push(processedTarget);\n    }\n\n    return processedTargets;\n  }\n\n  query(request: DataQueryRequest<PromQuery>): Observable<DataQueryResponse> {\n    if (this.access === 'direct') {\n      return this.directAccessError();\n    }\n\n    // Use incremental query only if enabled and no instant queries or no $__range variables\n    const shouldUseIncrementalQuery =\n      this.hasIncrementalQuery &&\n      !config.publicDashboardAccessToken &&\n      !request.targets.some((target) => target.instant || target.expr?.includes('$__range'));\n\n    let fullOrPartialRequest: DataQueryRequest<PromQuery> = request;\n    let requestInfo: CacheRequestInfo<PromQuery> | undefined = undefined;\n\n    if (shouldUseIncrementalQuery) {\n      requestInfo = this.cache.requestInfo(request);\n      fullOrPartialRequest = requestInfo.requests[0];\n    }\n\n    const targets = fullOrPartialRequest.targets.map((target) => this.processTargetV2(target, fullOrPartialRequest));\n    const startTime = new Date();\n    return super.query({ ...fullOrPartialRequest, targets: targets.flat() }).pipe(\n      map((response) => {\n        const amendedResponse = {\n          ...response,\n          data: this.cache.procFrames(request, requestInfo, response.data),\n        };\n        return transformV2(amendedResponse, request, {\n          exemplarTraceIdDestinations: this.exemplarTraceIdDestinations,\n        });\n      }),\n      tap((response: DataQueryResponse) => {\n        trackQuery(response, request, startTime);\n      })\n    );\n  }\n\n  metricFindQuery(query: string, options?: LegacyMetricFindQueryOptions) {\n    if (!query) {\n      return Promise.resolve([]);\n    }\n\n    const timeRange = options?.range ?? getDefaultTimeRange();\n\n    const scopedVars = {\n      ...this.getIntervalVars(),\n      ...this.getRangeScopedVars(timeRange),\n    };\n    const interpolated = this.templateSrv.replace(query, scopedVars, this.interpolateQueryExpr);\n    const metricFindQuery = new PrometheusMetricFindQuery(this, interpolated);\n    return metricFindQuery.process(timeRange);\n  }\n\n  getIntervalVars() {\n    return {\n      __interval: { text: this.interval, value: this.interval },\n      __interval_ms: { text: rangeUtil.intervalToMs(this.interval), value: rangeUtil.intervalToMs(this.interval) },\n    };\n  }\n\n  getRangeScopedVars(range: 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  // By implementing getTagKeys and getTagValues we add ad-hoc filters functionality\n  // this is used to get label keys, a.k.a label names\n  // it is used in metric_find_query.ts\n  // and in Tempo here grafana/public/app/plugins/datasource/tempo/QueryEditor/ServiceGraphSection.tsx\n  async getTagKeys(options: DataSourceGetTagKeysOptions<PromQuery>): Promise<MetricFindValue[]> {\n    if (!options.timeRange) {\n      options.timeRange = getDefaultTimeRange();\n    }\n\n    if ((options?.scopes?.length ?? 0) > 0) {\n      const suggestions = await this.languageProvider.fetchSuggestions(\n        options.timeRange,\n        options.queries,\n        options.scopes,\n        options.filters\n      );\n\n      // filter out already used labels and empty labels\n      return suggestions\n        .filter((labelName) => !!labelName && !options.filters.find((filter) => filter.key === labelName))\n        .map((k) => ({ value: k, text: k }));\n    }\n\n    const match = extractResourceMatcher(options.queries ?? [], options.filters);\n\n    let labelKeys: string[] = await this.languageProvider.queryLabelKeys(options.timeRange, match);\n\n    // filter out already used labels\n    return labelKeys\n      .filter((labelName) => !options.filters.find((filter) => filter.key === labelName))\n      .map((k) => ({ value: k, text: k }));\n  }\n\n  // By implementing getGroupByKeys we add group by variable support independently from adhoc filters.\n  // It delegates to getTagKeys\n  async getGroupByKeys(options: DataSourceGetTagKeysOptions<PromQuery>): Promise<MetricFindValue[]> {\n    return this.getTagKeys(options);\n  }\n\n  // By implementing getTagKeys and getTagValues we add ad-hoc filters functionality\n  async getTagValues(options: DataSourceGetTagValuesOptions<PromQuery>): Promise<MetricFindValue[]> {\n    if (!options.timeRange) {\n      options.timeRange = getDefaultTimeRange();\n    }\n\n    const requestId = `[${this.uid}][${options.key}]`;\n    if ((options?.scopes?.length ?? 0) > 0) {\n      return (\n        await this.languageProvider.fetchSuggestions(\n          options.timeRange,\n          options.queries,\n          options.scopes,\n          options.filters,\n          options.key,\n          undefined,\n          requestId\n        )\n      ).map((v) => ({ value: v, text: v }));\n    }\n\n    const match = extractResourceMatcher(options.queries ?? [], options.filters);\n\n    return (await this.languageProvider.queryLabelValues(options.timeRange, options.key, match)).map((v) => ({\n      value: v,\n      text: v,\n    }));\n  }\n\n  interpolateVariablesInQueries(\n    queries: PromQuery[],\n    scopedVars: ScopedVars,\n    filters?: AdHocVariableFilter[]\n  ): PromQuery[] {\n    let expandedQueries = queries;\n    if (queries && queries.length) {\n      expandedQueries = queries.map((query) => {\n        const interpolatedQuery = this.templateSrv.replace(\n          query.expr,\n          scopedVars,\n          this.interpolateExploreMetrics(query.fromExploreMetrics)\n        );\n        const replacedInterpolatedQuery = targetHasScopes(query)\n          ? interpolatedQuery\n          : this.templateSrv.replace(\n              this.enhanceExprWithAdHocFilters(filters, interpolatedQuery),\n              scopedVars,\n              this.interpolateQueryExpr\n            );\n\n        const expandedQuery = {\n          ...query,\n          ...(query.scopes && query.scopes.length > 0 ? { adhocFilters: this.generateScopeFilters(filters) } : {}),\n          datasource: this.getRef(),\n          expr: replacedInterpolatedQuery,\n          interval: this.templateSrv.replace(query.interval, scopedVars),\n        };\n\n        return expandedQuery;\n      });\n    }\n    return expandedQueries;\n  }\n\n  getQueryHints(query: PromQuery, result: unknown[]) {\n    return getQueryHints(query.expr ?? '', result, this);\n  }\n\n  modifyQuery(query: PromQuery, action: QueryFixAction): PromQuery {\n    let expression = query.expr ?? '';\n    switch (action.type) {\n      case 'ADD_FILTER': {\n        const { key, value } = action.options ?? {};\n        if (key && value) {\n          expression = addLabelToQuery(expression, key, value);\n        }\n\n        break;\n      }\n      case 'ADD_FILTER_OUT': {\n        const { key, value } = action.options ?? {};\n        if (key && value) {\n          expression = addLabelToQuery(expression, key, value, '!=');\n        }\n        break;\n      }\n      case 'ADD_HISTOGRAM_QUANTILE': {\n        expression = `histogram_quantile(0.95, sum(rate(${expression}[$__rate_interval])) by (le))`;\n        break;\n      }\n      case 'ADD_HISTOGRAM_AVG': {\n        expression = `histogram_avg(rate(${expression}[$__rate_interval]))`;\n        break;\n      }\n      case 'ADD_HISTOGRAM_FRACTION': {\n        expression = `histogram_fraction(0,0.2,rate(${expression}[$__rate_interval]))`;\n        break;\n      }\n      case 'ADD_HISTOGRAM_COUNT': {\n        expression = `histogram_count(rate(${expression}[$__rate_interval]))`;\n        break;\n      }\n      case 'ADD_HISTOGRAM_SUM': {\n        expression = `histogram_sum(rate(${expression}[$__rate_interval]))`;\n        break;\n      }\n      case 'ADD_HISTOGRAM_STDDEV': {\n        expression = `histogram_stddev(rate(${expression}[$__rate_interval]))`;\n        break;\n      }\n      case 'ADD_HISTOGRAM_STDVAR': {\n        expression = `histogram_stdvar(rate(${expression}[$__rate_interval]))`;\n        break;\n      }\n      case 'ADD_RATE': {\n        expression = `rate(${expression}[$__rate_interval])`;\n        break;\n      }\n      case 'ADD_SUM': {\n        expression = `sum(${expression.trim()}) by ($1)`;\n        break;\n      }\n      case 'EXPAND_RULES': {\n        if (action.options) {\n          expression = expandRecordingRules(expression, action.options as any);\n        }\n        break;\n      }\n      default:\n        break;\n    }\n    return { ...query, expr: expression };\n  }\n\n  /**\n   * Returns the adjusted \"snapped\" interval parameters\n   */\n  getAdjustedInterval(timeRange: TimeRange): { start: string; end: string } {\n    return getRangeSnapInterval(this.cacheLevel, timeRange);\n  }\n\n  /**\n   * This will return a time range that always includes the users current time range,\n   * and then a little extra padding to round up/down to the nearest nth minute,\n   * defined by the result of the getCacheDurationInMinutes.\n   *\n   * For longer cache durations, and shorter query durations,\n   * the window we're calculating might be much bigger then the user's current window,\n   * resulting in us returning labels/values that might not be applicable for the given window,\n   * this is a necessary trade-off if we want to cache larger durations\n   */\n  getTimeRangeParams(timeRange: TimeRange): { start: string; end: string } {\n    return {\n      start: getPrometheusTime(timeRange.from, false).toString(),\n      end: getPrometheusTime(timeRange.to, true).toString(),\n    };\n  }\n\n  /**\n   * This converts the adhocVariableFilter array and converts it to scopeFilter array\n   * @param filters\n   */\n  generateScopeFilters(filters?: AdHocVariableFilter[]): ScopeSpecFilter[] {\n    if (!filters) {\n      return [];\n    }\n\n    return filters.map((f) => ({\n      key: f.key,\n      operator: scopeFilterOperatorMap[f.operator],\n      value: this.templateSrv.replace(f.value, {}, this.interpolateQueryExpr),\n      values: f.values?.map((v) => this.templateSrv.replace(v, {}, this.interpolateQueryExpr)),\n    }));\n  }\n\n  enhanceExprWithAdHocFilters(filters: AdHocVariableFilter[] | undefined, expr: string) {\n    if (!filters || filters.length === 0) {\n      return expr;\n    }\n\n    const finalQuery = filters.map(remapOneOf).reduce((acc, filter) => {\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    }, expr);\n    return finalQuery;\n  }\n\n  // Used when running queries through 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 through backend\n  applyTemplateVariables(target: PromQuery, scopedVars: ScopedVars, filters?: AdHocVariableFilter[]) {\n    const variables = { ...scopedVars };\n\n    // We want to interpolate these variables on backend.\n    // The pre-calculated values are replaced withe the variable strings.\n    variables.__interval = {\n      value: '$__interval',\n    };\n    variables.__interval_ms = {\n      value: '$__interval_ms',\n    };\n\n    // interpolate expression\n\n    // We need a first replace to evaluate variables before applying adhoc filters\n    // This is required for an expression like `metric > $VAR` where $VAR is a float to which we must not add adhoc filters\n    const expr = this.templateSrv.replace(\n      target.expr,\n      variables,\n      this.interpolateExploreMetrics(target.fromExploreMetrics)\n    );\n\n    // Apply ad-hoc filters\n    // When ad-hoc filters are applied, we replace again the variables in case the ad-hoc filters also reference a variable\n    const exprWithAdhoc = targetHasScopes(target)\n      ? expr\n      : this.templateSrv.replace(this.enhanceExprWithAdHocFilters(filters, expr), variables, this.interpolateQueryExpr);\n\n    return {\n      ...target,\n      ...(targetHasScopes(target) ? { adhocFilters: this.generateScopeFilters(filters) } : {}),\n      expr: exprWithAdhoc,\n      interval: this.templateSrv.replace(target.interval, variables),\n      legendFormat: this.templateSrv.replace(target.legendFormat, variables),\n    };\n  }\n\n  getVariables(): string[] {\n    return this.templateSrv.getVariables().map((v) => `$${v.name}`);\n  }\n\n  interpolateString(string: string, scopedVars?: ScopedVars) {\n    return this.templateSrv.replace(string, scopedVars, this.interpolateQueryExpr);\n  }\n\n  interpolateExploreMetrics(fromExploreMetrics?: boolean) {\n    return (value: string | string[] = [], variable: QueryVariableModel | CustomVariableModel) => {\n      if (typeof value === 'string' && fromExploreMetrics) {\n        if (variable.name === 'filters') {\n          return wrapUtf8Filters(value);\n        }\n        if (variable.name === 'groupby') {\n          return utf8Support(value);\n        }\n      }\n      return this.interpolateQueryExpr(value, variable);\n    };\n  }\n\n  isUsingRelativeTimeRange(range: TimeRange): boolean {\n    if (typeof range.raw.from !== 'string' || typeof range.raw.to !== 'string') {\n      return false;\n    }\n\n    return range.raw.from.includes('now') || range.raw.to.includes('now');\n  }\n\n  getDefaultQuery(app: CoreApp): PromQuery {\n    const defaults = {\n      refId: 'A',\n      expr: '',\n      range: true,\n      instant: false,\n    };\n\n    if (app === CoreApp.UnifiedAlerting) {\n      return {\n        ...defaults,\n        instant: true,\n        range: false,\n      };\n    }\n\n    if (app === CoreApp.Explore) {\n      return {\n        ...defaults,\n        instant: true,\n        range: true,\n      };\n    }\n\n    return defaults;\n  }\n}\n\nfunction targetHasScopes(target: PromQuery): boolean {\n  return !!(target.scopes && target.scopes.length > 0);\n}\n\nexport function extractRuleMappingFromGroups(groups: RawRecordingRules[]): RuleQueryMapping {\n  return groups.reduce<RuleQueryMapping>(\n    (mapping, group) =>\n      group.rules\n        .filter((rule) => rule.type === 'recording')\n        .reduce((acc, rule) => {\n          // retrieve existing record\n          const existingRule = acc[rule.name] ?? [];\n          // push a new query with labels\n          existingRule.push({\n            query: rule.query,\n            labels: rule.labels,\n          });\n          acc[rule.name] = existingRule;\n          return acc;\n        }, mapping),\n    {}\n  );\n}\n\n/**\n * It creates a matcher string for resource calls\n * @param queries\n * @param adhocFilters\n *\n * @example\n * queries<PromQuery>=[{expr:`metricName{label=\"value\"}`}]\n * adhocFilters={key:\"instance\", operator:\"=\", value:\"localhost\"}\n * returns {__name__=~\"metricName\", instance=\"localhost\"}\n */\nexport const extractResourceMatcher = (\n  queries: PromQuery[],\n  adhocFilters: AdHocVariableFilter[]\n): string | undefined => {\n  // Extract metric names from queries we have already\n  const metricMatch = populateMatchParamsFromQueries(queries);\n  const labelFilters: QueryBuilderLabelFilter[] = adhocFilters.map((f) => ({\n    label: f.key,\n    value: f.value,\n    op: f.operator,\n  }));\n  // Extract label filters from the filters we have already\n  const labelsMatch = renderLabelsWithoutBrackets(labelFilters);\n\n  if (metricMatch.length === 0 && labelsMatch.length === 0) {\n    return undefined;\n  }\n\n  // Create a matcher using metric names and label filters\n  return `{${[...metricMatch, ...labelsMatch].join(',')}}`;\n};\n\nexport function remapOneOf(filter: AdHocVariableFilter) {\n  let { operator, value, values } = filter;\n  if (operator === '=|' || operator === '!=|') {\n    operator = operator === '=|' ? '=~' : '!~';\n    value = values?.map(prometheusRegularEscape).join('|') ?? '';\n  }\n\n  return {\n    ...filter,\n    operator,\n    value,\n  };\n}\n"],"names":["defaults"],"mappings":"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"}