{"version":3,"file":"MetricsLabelsSection.cjs","sources":["../../../../src/querybuilder/components/MetricsLabelsSection.tsx"],"sourcesContent":["// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/MetricsLabelsSection.tsx\nimport { useCallback } from 'react';\n\nimport { type SelectableValue, type TimeRange } from '@grafana/data';\n\nimport { getDebounceTimeInMilliseconds } from '../../caching';\nimport { type PrometheusDatasource } from '../../datasource';\nimport { truncateResult } from '../../language_utils';\nimport { type PromMetricsMetadata } from '../../types';\nimport { regexifyLabelValuesQueryString } from '../parsingUtils';\nimport { promQueryModeller } from '../shared/modeller_instance';\nimport { type QueryBuilderLabelFilter } from '../shared/types';\nimport { type PromVisualQuery } from '../types';\n\nimport { LabelFilters } from './LabelFilters';\nimport { MetricCombobox } from './MetricCombobox';\n\ninterface MetricsLabelsSectionProps {\n  query: PromVisualQuery;\n  datasource: PrometheusDatasource;\n  onChange: (update: PromVisualQuery) => void;\n  variableEditor?: boolean;\n  onBlur?: () => void;\n  timeRange: TimeRange;\n}\n\nexport function MetricsLabelsSection({\n  datasource,\n  query,\n  onChange,\n  onBlur,\n  variableEditor,\n  timeRange,\n}: MetricsLabelsSectionProps) {\n  // fixing the use of 'as' from refactoring\n  // @ts-ignore\n  const onChangeLabels = (labels) => {\n    onChange({ ...query, labels });\n  };\n  /**\n   * Map metric metadata to SelectableValue for Select component and also adds defined template variables to the list.\n   */\n  const withTemplateVariableOptions = useCallback(\n    async (optionsPromise: Promise<SelectableValue[]>): Promise<SelectableValue[]> => {\n      const variables = datasource.getVariables();\n      const options = await optionsPromise;\n      return [\n        ...variables.map((value: string) => ({ label: value, value })),\n        ...options.map((option: SelectableValue) => ({\n          label: option.value,\n          value: option.value,\n          title: option.description,\n        })),\n      ];\n    },\n    [datasource]\n  );\n\n  /**\n   * Function kicked off when user interacts with label in label filters.\n   * Formats a promQL expression and passes that off to helper functions depending on API support\n   * @param forLabel\n   */\n  const onGetLabelNames = async (forLabel: Partial<QueryBuilderLabelFilter>): Promise<SelectableValue[]> => {\n    // If no metric we need to use a different method\n    if (!query.metric) {\n      await datasource.languageProvider.queryLabelKeys(timeRange);\n      return datasource.languageProvider.retrieveLabelKeys().map((k) => ({ value: k }));\n    }\n\n    const labelsToConsider = query.labels.filter((x) => x !== forLabel);\n    // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n    labelsToConsider.push({ label: '__name__', op: '=', value: query.metric });\n    const expr = promQueryModeller.renderLabels(labelsToConsider);\n\n    let labelsIndex: string[] = await datasource.languageProvider.queryLabelKeys(timeRange, expr);\n\n    // filter out already used labels\n    return labelsIndex\n      .filter((labelName) => !labelsToConsider.find((filter) => filter.label === labelName))\n      .map((k) => ({ value: k }));\n  };\n\n  const getLabelValuesAutocompleteSuggestions = async (\n    queryString?: string,\n    labelName?: string\n  ): Promise<SelectableValue[]> => {\n    const forLabel = {\n      label: labelName ?? '__name__',\n      op: '=~',\n      value: regexifyLabelValuesQueryString(`.*${queryString}`),\n    };\n    const labelsToConsider = query.labels.filter((x) => x.label !== forLabel.label);\n    labelsToConsider.push(forLabel);\n    if (query.metric) {\n      // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n      labelsToConsider.push({ label: '__name__', op: '=', value: query.metric });\n    }\n    const interpolatedLabelsToConsider = labelsToConsider.map((labelObject) => ({\n      ...labelObject,\n      label: datasource.interpolateString(labelObject.label),\n      value: datasource.interpolateString(labelObject.value),\n    }));\n    const expr = promQueryModeller.renderLabels(interpolatedLabelsToConsider);\n    const values = await datasource.languageProvider.queryLabelValues(timeRange, forLabel.label, expr);\n    return truncateResult(values).map(toSelectableValue);\n  };\n\n  /**\n   * Function kicked off when users interact with the value of the label filters\n   * Formats a promQL expression and passes that into helper functions depending on API support\n   * @param forLabel\n   */\n  const onGetLabelValues = async (forLabel: Partial<QueryBuilderLabelFilter>): Promise<SelectableValue[]> => {\n    if (!forLabel.label) {\n      return [];\n    }\n    // If no metric is selected, we can get the raw list of labels\n    if (!query.metric) {\n      return (await datasource.languageProvider.queryLabelValues(timeRange, forLabel.label)).map((v) => ({ value: v }));\n    }\n\n    const labelsToConsider = query.labels.filter((x) => x !== forLabel);\n    // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n    labelsToConsider.push({ label: '__name__', op: '=', value: query.metric });\n\n    const interpolatedLabelsToConsider = labelsToConsider.map((labelObject) => ({\n      ...labelObject,\n      label: datasource.interpolateString(labelObject.label),\n      value: datasource.interpolateString(labelObject.value),\n    }));\n\n    const expr = promQueryModeller.renderLabels(interpolatedLabelsToConsider);\n    return (await datasource.languageProvider.queryLabelValues(timeRange, forLabel.label, expr)).map(toSelectableValue);\n  };\n\n  const onGetMetrics = useCallback(() => {\n    return withTemplateVariableOptions(getMetrics(datasource, query, timeRange));\n  }, [datasource, query, timeRange, withTemplateVariableOptions]);\n\n  return (\n    <>\n      <MetricCombobox\n        query={query}\n        onChange={onChange}\n        onGetMetrics={onGetMetrics}\n        datasource={datasource}\n        labelsFilters={query.labels}\n        metricLookupDisabled={datasource.lookupsDisabled}\n        onBlur={onBlur ? onBlur : () => {}}\n        variableEditor={variableEditor}\n        timeRange={timeRange}\n      />\n      <LabelFilters\n        debounceDuration={getDebounceTimeInMilliseconds(datasource.cacheLevel)}\n        getLabelValuesAutofillSuggestions={getLabelValuesAutocompleteSuggestions}\n        labelsFilters={query.labels}\n        onChange={onChangeLabels}\n        onGetLabelNames={(forLabel) => withTemplateVariableOptions(onGetLabelNames(forLabel))}\n        onGetLabelValues={(forLabel) => withTemplateVariableOptions(onGetLabelValues(forLabel))}\n        variableEditor={variableEditor}\n      />\n    </>\n  );\n}\n\n/**\n * Returns list of metrics, either all or filtered by query param. It also adds description string to each metric if it\n * exists.\n * @param datasource\n * @param query\n * @param timeRange\n */\nasync function getMetrics(\n  datasource: PrometheusDatasource,\n  query: PromVisualQuery,\n  timeRange: TimeRange\n): Promise<Array<{ value: string; description?: string }>> {\n  // Makes sure we loaded the metadata for metrics. Usually this is done in the start() method of the provider but we\n  // don't use it with the visual builder and there is no need to run all the start() setup anyway.\n  const metadata = datasource.languageProvider.retrieveMetricsMetadata();\n  if (Object.keys(metadata).length === 0) {\n    await datasource.languageProvider.queryMetricsMetadata();\n  }\n\n  let metrics: string[];\n  const expr = promQueryModeller.renderLabels(query.labels);\n  metrics =\n    (await datasource.languageProvider.queryLabelValues(timeRange, '__name__', expr === '' ? undefined : expr)) ?? [];\n\n  return metrics.map((m) => ({\n    value: m,\n    description: getMetadataString(m, datasource.languageProvider.retrieveMetricsMetadata()),\n  }));\n}\n\nfunction getMetadataString(metric: string, metadata: PromMetricsMetadata): string | undefined {\n  if (!metadata[metric]) {\n    return;\n  }\n  const { type, help } = metadata[metric];\n  return `${type.toUpperCase()}: ${help}`;\n}\n\nfunction toSelectableValue(lv: string) {\n  return {\n    label: lv,\n    value: lv,\n  };\n}\n"],"names":["useCallback","promQueryModeller","regexifyLabelValuesQueryString","truncateResult","jsxs","Fragment","jsx","MetricCombobox","LabelFilters","getDebounceTimeInMilliseconds"],"mappings":"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"}