{"version":3,"file":"useMetricsLabelsValues.cjs","sources":["../../../../src/components/metrics-browser/useMetricsLabelsValues.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState, useMemo } from 'react';\nimport { useDebounce } from 'react-use';\n\nimport { type TimeRange } from '@grafana/data';\n\nimport { EMPTY_SELECTOR, LAST_USED_LABELS_KEY, METRIC_LABEL } from '../../constants';\nimport { type PrometheusLanguageProviderInterface } from '../../language_provider';\n\nimport { type Metric } from './MetricsBrowserContext';\nimport { buildSelector } from './selectorBuilder';\n\nexport const useMetricsLabelsValues = (timeRange: TimeRange, languageProvider: PrometheusLanguageProviderInterface) => {\n  const timeRangeRef = useRef<TimeRange>(timeRange);\n  const lastSeriesLimitRef = useRef(languageProvider.datasource.seriesLimit);\n  const isInitializedRef = useRef(false);\n\n  const [seriesLimit, setSeriesLimit] = useState(languageProvider.datasource.seriesLimit);\n  const [err, setErr] = useState('');\n  const [status, setStatus] = useState('Ready');\n  const [validationStatus, setValidationStatus] = useState('');\n\n  const [metrics, setMetrics] = useState<Metric[]>([]);\n  const [selectedMetric, setSelectedMetric] = useState('');\n  const [labelKeys, setLabelKeys] = useState<string[]>([]);\n  const [selectedLabelKeys, setSelectedLabelKeys] = useState<string[]>([]);\n  const [lastSelectedLabelKey, setLastSelectedLabelKey] = useState('');\n  const [labelValues, setLabelValues] = useState<Record<string, string[]>>({});\n  const [selectedLabelValues, setSelectedLabelValues] = useState<Record<string, string[]>>({});\n  const [isLoadingLabelKeys, setIsLoadingLabelKeys] = useState(false);\n  const [isLoadingLabelValues, setIsLoadingLabelValues] = useState(false);\n\n  // Memoize the effective series limit to use the default when seriesLimit is empty\n  const effectiveLimit = useMemo(() => seriesLimit, [seriesLimit]);\n\n  // We don't want to trigger fetching for small amount of time changes.\n  // When MetricsBrowser re-renders for any reason we might receive a new timerange.\n  // This particularly happens when we have relative time ranges: from: now, to: now-1h\n  useEffect(() => {\n    if (\n      timeRange.to.diff(timeRangeRef.current.to, 'second') >= 5 &&\n      timeRange.from.diff(timeRangeRef.current.from, 'second') >= 5\n    ) {\n      timeRangeRef.current = timeRange;\n    }\n  }, [timeRange]);\n\n  // Handler for error processing - logs the error and updates UI state\n  const handleError = useCallback((e: unknown, msg: string) => {\n    if (e instanceof Error) {\n      setErr(`${msg}: ${e.message}`);\n    } else {\n      setErr(`${msg}: Unknown error`);\n    }\n    setStatus('');\n  }, []);\n\n  // Get metadata details for a metric if available\n  const getMetricDetails = useCallback(\n    (metricName: string) => {\n      const meta = languageProvider.retrieveMetricsMetadata();\n      return meta && meta[metricName] ? `(${meta[metricName].type}) ${meta[metricName].help}` : undefined;\n    },\n    [languageProvider]\n  );\n\n  // Builds a safe selector string from metric name and label values\n  // Prometheus API doesn't allow empty matchers. This is bad => match[]={}\n  // Converts EMPTY_SELECTOR to undefined as some API calls need that\n  const buildSafeSelector = useCallback((metric: string, labelValues: Record<string, string[]>) => {\n    const selector = buildSelector(metric, labelValues);\n    return selector === EMPTY_SELECTOR ? undefined : selector;\n  }, []);\n\n  // Loads label keys from localStorage and filters them against available labels\n  // This ensures we only show label keys that are actually available in the current context\n  const loadSelectedLabelsFromStorage = useCallback(\n    (availableLabelKeys: string[]) => {\n      try {\n        const labelKeysInLocalStorageAsString = localStorage.getItem(LAST_USED_LABELS_KEY) || '[]';\n        const labelKeysInLocalStorage = JSON.parse(labelKeysInLocalStorageAsString);\n        return labelKeysInLocalStorage.filter((slk: string) => availableLabelKeys.includes(slk));\n      } catch (e) {\n        handleError(e, 'Failed to load saved label keys');\n        return [];\n      }\n    },\n    [handleError]\n  );\n\n  // Fetches metrics that match the given selector\n  // Transforms raw metric strings into Metric objects with metadata\n  const fetchMetrics = useCallback(\n    async (safeSelector?: string) => {\n      try {\n        const fetchedMetrics = await languageProvider.queryLabelValues(\n          timeRangeRef.current,\n          METRIC_LABEL,\n          safeSelector,\n          effectiveLimit\n        );\n        return fetchedMetrics.map((m) => ({\n          name: m,\n          details: getMetricDetails(m),\n        }));\n      } catch (e) {\n        handleError(e, 'Error fetching metrics');\n        return [];\n      }\n    },\n    [getMetricDetails, handleError, languageProvider, effectiveLimit]\n  );\n\n  // Fetches label keys based on an optional selector\n  // Uses different APIs depending on whether a selector is provided\n  const fetchLabelKeys = useCallback(\n    async (safeSelector?: string) => {\n      try {\n        return (\n          (await languageProvider.queryLabelKeys(timeRangeRef.current, safeSelector || undefined, effectiveLimit)) ?? []\n        );\n      } catch (e) {\n        handleError(e, 'Error fetching labels');\n        return [];\n      }\n    },\n    [handleError, languageProvider, effectiveLimit]\n  );\n\n  // Fetches values for multiple label keys and also prepares selected values\n  const fetchLabelValues = useCallback(\n    async (labelKeys: string[], safeSelector?: string) => {\n      const transformedLabelValues: Record<string, string[]> = {};\n      const newSelectedLabelValues: Record<string, string[]> = {};\n      for (const lk of labelKeys) {\n        try {\n          const values = await languageProvider.queryLabelValues(\n            timeRangeRef.current,\n            lk,\n            safeSelector,\n            effectiveLimit\n          );\n          transformedLabelValues[lk] = values;\n          if (selectedLabelValues[lk]) {\n            newSelectedLabelValues[lk] = [...selectedLabelValues[lk]];\n          }\n\n          setErr('');\n        } catch (e) {\n          handleError(e, 'Error fetching label values');\n        }\n      }\n      return [transformedLabelValues, newSelectedLabelValues];\n    },\n    [handleError, languageProvider, selectedLabelValues, effectiveLimit]\n  );\n\n  // Initial set up of the Metrics Browser\n  // This is called when \"Clear\" button clicked.\n  const initialize = useCallback(\n    async (metric: string, labelValues: Record<string, string[]>) => {\n      const selector = buildSelector(metric, labelValues);\n      const safeSelector = selector === EMPTY_SELECTOR ? undefined : selector;\n\n      // Metrics\n      const transformedMetrics: Metric[] = await fetchMetrics(safeSelector);\n\n      // Labels\n      setIsLoadingLabelKeys(true);\n      setIsLoadingLabelValues(true);\n      const transformedLabelKeys: string[] = await fetchLabelKeys(safeSelector);\n\n      // Selected Labels\n      const labelKeysInLocalStorage: string[] = loadSelectedLabelsFromStorage(transformedLabelKeys);\n\n      // Selected Labels' Values\n      const [transformedLabelValues] = await fetchLabelValues(labelKeysInLocalStorage, safeSelector);\n\n      setMetrics(transformedMetrics);\n      setLabelKeys(transformedLabelKeys);\n      setIsLoadingLabelKeys(false);\n      setSelectedLabelKeys(labelKeysInLocalStorage);\n      setLabelValues(transformedLabelValues);\n      setIsLoadingLabelValues(false);\n    },\n    [fetchLabelKeys, fetchLabelValues, fetchMetrics, loadSelectedLabelsFromStorage]\n  );\n\n  // Initialize the hook\n  useEffect(() => {\n    initialize(selectedMetric, selectedLabelValues);\n    isInitializedRef.current = true;\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  // We use debounce here to prevent fetching data on every keystroke\n  // We also track the seriesLimit change to prevent fetching twice right after the initialization\n  useDebounce(\n    () => {\n      if (isInitializedRef.current && lastSeriesLimitRef.current !== seriesLimit) {\n        initialize(selectedMetric, selectedLabelValues);\n        lastSeriesLimitRef.current = seriesLimit;\n      }\n    },\n    300,\n    [seriesLimit]\n  );\n\n  // Handles metric selection changes.\n  // If a metric selected it fetches the labels of that metric\n  // Otherwise it fetches all the labels.\n  // Based on the fetched labels, label value list is updated.\n  // If a label key is not present, its values are removed from the list.\n  const handleSelectedMetricChange = async (metricName: string) => {\n    const newSelectedMetric = selectedMetric !== metricName ? metricName : '';\n    const selector = buildSafeSelector(newSelectedMetric, selectedLabelValues);\n    try {\n      const fetchedMetrics = await fetchMetrics(selector);\n      setIsLoadingLabelKeys(true);\n      const fetchedLabelKeys = await fetchLabelKeys(selector);\n      const newSelectedLabelKeys = selectedLabelKeys.filter((slk) => fetchedLabelKeys.includes(slk));\n\n      setIsLoadingLabelValues(true);\n      const [transformedLabelValues, newSelectedLabelValues] = await fetchLabelValues(\n        newSelectedLabelKeys,\n        newSelectedMetric === '' ? undefined : selector\n      );\n\n      setMetrics(fetchedMetrics);\n      setSelectedMetric(newSelectedMetric);\n      setLabelKeys(fetchedLabelKeys);\n      setIsLoadingLabelKeys(false);\n      setSelectedLabelKeys(newSelectedLabelKeys);\n      setLabelValues(transformedLabelValues);\n      setIsLoadingLabelValues(false);\n      setSelectedLabelValues(newSelectedLabelValues);\n    } catch (e: unknown) {\n      handleError(e, 'Error fetching labels');\n    }\n  };\n\n  // Handles when a label key selection changed\n  // If it's a selection, it fetches the values based on the up-to-date selector\n  // If it's a de-selection, it clears the values from the list\n  const handleSelectedLabelKeyChange = async (labelKey: string) => {\n    const newSelectedLabelKeys = [...selectedLabelKeys];\n    const lkIdx = newSelectedLabelKeys.indexOf(labelKey);\n    const newLabelValues: Record<string, string[]> = { ...labelValues };\n    const newSelectedLabelValues: Record<string, string[]> = { ...selectedLabelValues };\n\n    if (lkIdx === -1) {\n      // Label key is not in the selectedLabelKeys. Let's add it.\n      newSelectedLabelKeys.push(labelKey);\n      const safeSelector = buildSafeSelector(selectedMetric, selectedLabelValues);\n      setIsLoadingLabelValues(true);\n      const [values] = await fetchLabelValues([labelKey], safeSelector);\n      newLabelValues[labelKey] = values[labelKey];\n    } else {\n      // Label key is in the selectedLabelKeys. Removing it and its values.\n      newSelectedLabelKeys.splice(lkIdx, 1);\n      delete newLabelValues[labelKey];\n      delete newSelectedLabelValues[labelKey];\n    }\n\n    localStorage.setItem(LAST_USED_LABELS_KEY, JSON.stringify(newSelectedLabelKeys));\n    setSelectedLabelKeys(newSelectedLabelKeys);\n    setLabelValues(newLabelValues);\n    setIsLoadingLabelValues(false);\n    setSelectedLabelValues(newSelectedLabelValues);\n  };\n\n  // Handle the labelValue click based on isSelected value.\n  // If it is false we need to remove it from selected values\n  // If it is true then we need to add it to selected values\n  // Then we first fetch the values of each selected label key using the up-to-date selector\n  // We merged the fetched and existing list for the list we interact.\n  // Because we might want to select more labels from the same list.\n  // For other value lists we use the intersection of fetched and selected values.\n  // Then we fetch the metrics based on new selector we have after value fetch\n  // Then we fetch the labels keys of the metrics we fetched.\n  const handleSelectedLabelValueChange = async (labelKey: string, labelValue: string, isSelected: boolean) => {\n    const newSelectedLabelValues = { ...selectedLabelValues };\n    let newLastSelectedLabelKey = lastSelectedLabelKey;\n    if (labelKey !== lastSelectedLabelKey) {\n      newLastSelectedLabelKey = labelKey;\n    }\n\n    // Label value selected\n    if (isSelected) {\n      if (!newSelectedLabelValues[labelKey]) {\n        newSelectedLabelValues[labelKey] = [];\n      }\n      newSelectedLabelValues[labelKey].push(labelValue);\n    } else {\n      newSelectedLabelValues[labelKey].splice(newSelectedLabelValues[labelKey].indexOf(labelValue), 1);\n      if (newSelectedLabelValues[labelKey].length === 0) {\n        delete newSelectedLabelValues[labelKey];\n      }\n    }\n\n    let safeSelector = buildSafeSelector(selectedMetric, newSelectedLabelValues);\n\n    // Fetch new values\n    let newLabelValues: Record<string, string[]> = {};\n    if (selectedLabelKeys.length !== 0) {\n      setIsLoadingLabelValues(true);\n      for (const lk of selectedLabelKeys) {\n        try {\n          const fetchedLabelValues = await languageProvider.queryLabelValues(\n            timeRange,\n            lk,\n            safeSelector,\n            effectiveLimit\n          );\n\n          // We don't want to discard values from last selected list.\n          // User might want to select more.\n          if (newLastSelectedLabelKey === lk) {\n            newLabelValues[lk] = Array.from(new Set([...labelValues[lk], ...fetchedLabelValues]));\n          } else {\n            // If there are already selected values merge them with the fetched values.\n            newLabelValues[lk] = fetchedLabelValues;\n            // Discard selected label values if they are not in response\n            newSelectedLabelValues[lk] = (newSelectedLabelValues[lk] ?? []).filter((item) =>\n              fetchedLabelValues.includes(item)\n            );\n          }\n\n          setErr('');\n        } catch (e: unknown) {\n          handleError(e, 'Error fetching label values');\n        }\n      }\n    }\n\n    // rebuild the selector based on the new selected label values\n    safeSelector = buildSafeSelector(selectedMetric, newSelectedLabelValues);\n\n    // Fetch metrics\n    const newMetrics: Metric[] = await fetchMetrics(safeSelector);\n\n    // Fetch label keys\n    // If there is no metric or label value selected fetch all the keys instead of creating a selector\n    setIsLoadingLabelKeys(true);\n    let newLabelKeys: string[] = [];\n    if (!safeSelector) {\n      newLabelKeys = await fetchLabelKeys(undefined);\n    } else {\n      const labelKeysSelector = `{${METRIC_LABEL}=~\"${newMetrics.map((m) => m.name).join('|')}\"}`;\n      newLabelKeys = await fetchLabelKeys(labelKeysSelector);\n    }\n    const newSelectedLabelKeys: string[] = loadSelectedLabelsFromStorage(newLabelKeys);\n\n    setMetrics(newMetrics);\n    setLabelKeys(newLabelKeys);\n    setIsLoadingLabelKeys(false);\n    setSelectedLabelKeys(newSelectedLabelKeys);\n    setLastSelectedLabelKey(newLastSelectedLabelKey);\n    setLabelValues(newLabelValues);\n    setIsLoadingLabelValues(false);\n    setSelectedLabelValues(newSelectedLabelValues);\n  };\n\n  // Validating if the selections we have can create a valid query\n  const handleValidation = async () => {\n    const selector = buildSelector(selectedMetric, selectedLabelValues);\n    setValidationStatus(`Validating selector ${selector}`);\n    setErr('');\n\n    try {\n      const results = await languageProvider.queryLabelKeys(timeRangeRef.current, selector, effectiveLimit);\n      setValidationStatus(`Selector is valid (${Object.keys(results).length} labels found)`);\n    } catch (e) {\n      handleError(e, 'Validation failed');\n      setValidationStatus('');\n    }\n  };\n\n  // Clears all the selections even the ones in localStorage\n  const handleClear = () => {\n    localStorage.setItem(LAST_USED_LABELS_KEY, '[]');\n\n    setSelectedMetric('');\n    setSelectedLabelKeys([]);\n    setSelectedLabelValues({});\n\n    setErr('');\n    setStatus('Ready');\n    setValidationStatus('');\n\n    initialize('', {});\n  };\n\n  return {\n    err,\n    setErr,\n    status,\n    setStatus,\n    seriesLimit,\n    setSeriesLimit,\n    validationStatus,\n    metrics,\n    labelKeys,\n    labelValues,\n    isLoadingLabelKeys,\n    isLoadingLabelValues,\n    selectedMetric,\n    selectedLabelKeys,\n    selectedLabelValues,\n    handleSelectedMetricChange,\n    handleSelectedLabelKeyChange,\n    handleSelectedLabelValueChange,\n    handleValidation,\n    handleClear,\n    // Helper functions - not part of the public API\n    buildSafeSelector,\n    loadSelectedLabelsFromStorage,\n    fetchMetrics,\n    fetchLabelKeys,\n    fetchLabelValues,\n  };\n};\n"],"names":["useRef","useState","useMemo","useEffect","useCallback","labelValues","buildSelector","EMPTY_SELECTOR","LAST_USED_LABELS_KEY","METRIC_LABEL","labelKeys","useDebounce"],"mappings":"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"}