/usr/share/grafana/public/build
{"version":3,"file":"prometheusPlugin.c3a55eb5353085fc3d2b.js","mappings":"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","sources":["webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorRows.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorHeader.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/AccessoryButton.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorList.js","webpack://grafana/./node_modules/react-use/esm/useLatest.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/FlexItem.js","webpack://grafana/./node_modules/@lezer/highlight/dist/index.js","webpack://grafana/./node_modules/@prometheus-io/lezer-promql/dist/index.es.js","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/types.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/operationUtils.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/binaryScalarOperations.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/parsingUtils.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/parsing.ts","webpack://grafana/./packages/grafana-prometheus/src/escaping.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/rendering/labels.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/rendering/operations.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/rendering/query.ts","webpack://grafana/./packages/grafana-prometheus/src/add_label_to_query.ts","webpack://grafana/./packages/grafana-prometheus/src/query_hints.ts","webpack://grafana/./packages/grafana-prometheus/src/components/metrics-browser/selectorBuilder.ts","webpack://grafana/./packages/grafana-prometheus/src/components/metrics-browser/useMetricsLabelsValues.ts","webpack://grafana/./packages/grafana-prometheus/src/components/metrics-browser/MetricsBrowserContext.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/metrics-browser/styles.ts","webpack://grafana/./packages/grafana-prometheus/src/components/metrics-browser/LabelSelector.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/metrics-browser/MetricSelector.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/metrics-browser/SelectorActions.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/metrics-browser/ValueSelector.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/metrics-browser/MetricsBrowser.tsx","webpack://grafana/./node_modules/monaco-promql/promql/promql.contribution.js","webpack://grafana/./packages/grafana-prometheus/src/components/monaco-query-field/getOverrideServices.ts","webpack://grafana/./packages/grafana-prometheus/src/types.ts","webpack://grafana/./packages/grafana-prometheus/src/caching.ts","webpack://grafana/./packages/grafana-prometheus/src/language_utils.ts","webpack://grafana/./packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/data_provider.ts","webpack://grafana/./packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/util.ts","webpack://grafana/./packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.ts","webpack://grafana/./packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/situation.ts","webpack://grafana/./packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/monaco-completion-provider.ts","webpack://grafana/./packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/validation.ts","webpack://grafana/./packages/grafana-prometheus/src/components/monaco-query-field/promql.ts","webpack://grafana/./packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryField.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldLazy.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldWrapper.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/PromQueryField.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/OperationExplainedBox.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/RawQuery.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/OperationListExplained.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/operations.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/aggregations.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/PromQueryModellerBase.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/PromQueryModeller.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/modeller_instance.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderExplained.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/PromQueryCodeEditor.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/AnnotationQueryEditor.tsx","webpack://grafana/./packages/grafana-prometheus/src/annotations.ts","webpack://grafana/./packages/grafana-prometheus/src/resource_clients.ts","webpack://grafana/./packages/grafana-prometheus/src/language_provider.ts","webpack://grafana/./packages/grafana-prometheus/src/migrations/variableMigration.ts","webpack://grafana/./packages/grafana-prometheus/src/metric_find_query.ts","webpack://grafana/./packages/grafana-prometheus/src/querycache/QueryCache.ts","webpack://grafana/./packages/grafana-prometheus/src/tracking.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/LabelFilterItem.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/LabelFilters.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/formatter.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/metrics-modal/FeedbackLink.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/metrics-modal/helpers.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/metrics-modal/uFuzzy.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/metrics-modal/MetricsModalContext.tsx","webpack://grafana/./packages/grafana-prometheus/src/configuration/shared/utils.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/metrics-modal/styles.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/metrics-modal/ResultsTable.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/metrics-modal/testIds.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/metrics-modal/MetricsModal.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/MetricCombobox.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/MetricsLabelsSection.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/VariableQueryEditor.tsx","webpack://grafana/./packages/grafana-prometheus/src/variables.ts","webpack://grafana/./packages/grafana-prometheus/src/datasource.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/QueryPattern.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/QueryPatternsModal.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/hooks/useFlag.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/types.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/QueryEditorModeToggle.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/QueryHeaderSwitch.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/state.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/OperationInfoButton.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/OperationHeader.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/param_utils.ts","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/LabelParamEditor.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/OperationParamEditorRegistry.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/OperationEditor.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/OperationList.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/OperationsEditorRow.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/QueryBuilderHints.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/QueryBuilderContent.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/NestedQuery.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/NestedQueryList.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilder.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/QueryPreview.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderContainer.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/PromExemplarField.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/PromExploreExtraField.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/shared/QueryOptionGroup.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/PromQueryLegendEditor.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderOptions.tsx","webpack://grafana/./packages/grafana-prometheus/src/querybuilder/components/PromQueryEditorSelector.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/PromQueryEditorForAlerting.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/PromQueryEditorByApp.tsx","webpack://grafana/./packages/grafana-prometheus/src/components/PromCheatSheet.tsx","webpack://grafana/./node_modules/@grafana/azure-sdk/dist/esm/clouds.js","webpack://grafana/./node_modules/@grafana/azure-sdk/dist/esm/credentials/AzureCredentials.js","webpack://grafana/./node_modules/@grafana/azure-sdk/dist/esm/credentials/AzureCredentialsConfig.js","webpack://grafana/./node_modules/@grafana/azure-sdk/dist/esm/resources/ResourceTypes.js","webpack://grafana/./node_modules/@grafana/azure-sdk/dist/esm/resources/MetricsResourceTypes.js","webpack://grafana/./packages/grafana-prometheus/src/configuration/AlertingSettingsOverhaul.tsx","webpack://grafana/./packages/grafana-prometheus/src/configuration/ExemplarSetting.tsx","webpack://grafana/./packages/grafana-prometheus/src/configuration/ExemplarsSettings.tsx","webpack://grafana/./packages/grafana-prometheus/src/configuration/PromFlavorVersions.ts","webpack://grafana/./packages/grafana-prometheus/src/configuration/PromSettings.tsx","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/DataSourceHttpSettingsOverhaulPackage.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/configuration/ConfigEditorPackage.tsx","webpack://grafana/./public/app/plugins/datasource/prometheus/module.ts","webpack://grafana/./packages/grafana-prometheus/src/result_transformer.ts","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/InputGroup.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorFieldGroup.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorSwitch.js"],"sourcesContent":["import React__default from 'react';\nimport { EditorStack } from './EditorStack.js';\n\nconst EditorRows = ({ children }) => {\n return /* @__PURE__ */ React__default.createElement(EditorStack, { gap: 0.5, direction: \"column\" }, children);\n};\n\nexport { EditorRows };\n//# sourceMappingURL=EditorRows.js.map\n","import { css } from '@emotion/css';\nimport React__default from 'react';\nimport '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nconst EditorHeader = ({ children }) => {\n const styles = useStyles2(getStyles);\n return /* @__PURE__ */ React__default.createElement(\"div\", { className: styles.root }, children);\n};\nconst getStyles = (theme) => ({\n root: css({\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: theme.spacing(3),\n minHeight: theme.spacing(4)\n })\n});\n\nexport { EditorHeader };\n//# sourceMappingURL=EditorHeader.js.map\n","import { cx, css } from '@emotion/css';\nimport React__default from 'react';\nimport '@grafana/data';\nimport { useStyles2, Button } from '@grafana/ui';\n\nconst AccessoryButton = ({ className, ...props }) => {\n const styles = useStyles2(getButtonStyles);\n return /* @__PURE__ */ React__default.createElement(Button, { ...props, className: cx(className, styles.button) });\n};\nconst getButtonStyles = (theme) => ({\n button: css({\n paddingLeft: theme.spacing(3 / 2),\n paddingRight: theme.spacing(3 / 2)\n })\n});\n\nexport { AccessoryButton };\n//# sourceMappingURL=AccessoryButton.js.map\n","import { Button } from '@grafana/ui';\nimport React__default from 'react';\nimport { EditorStack } from './EditorStack.js';\n\nconst EditorList = React__default.forwardRef(function EditorList2({ items, renderItem, onChange }, ref) {\n const onAddItem = () => {\n const newItems = [...items, {}];\n onChange(newItems);\n };\n const onChangeItem = (itemIndex, newItem) => {\n const newItems = [...items];\n newItems[itemIndex] = newItem;\n onChange(newItems);\n };\n const onDeleteItem = (itemIndex) => {\n const newItems = [...items];\n newItems.splice(itemIndex, 1);\n onChange(newItems);\n };\n return /* @__PURE__ */ React__default.createElement(EditorStack, null, items.map((item, index) => /* @__PURE__ */ React__default.createElement(\"div\", { key: index }, renderItem(\n item,\n (newItem) => onChangeItem(index, newItem),\n () => onDeleteItem(index)\n ))), /* @__PURE__ */ React__default.createElement(Button, { ref, onClick: onAddItem, variant: \"secondary\", size: \"md\", icon: \"plus\", \"aria-label\": \"Add\", type: \"button\" }));\n});\n\nexport { EditorList };\n//# sourceMappingURL=EditorList.js.map\n","import { useRef } from 'react';\nvar useLatest = function (value) {\n var ref = useRef(value);\n ref.current = value;\n return ref;\n};\nexport default useLatest;\n","import React__default from 'react';\n\nconst FlexItem = ({ grow, shrink }) => {\n return /* @__PURE__ */ React__default.createElement(\"div\", { style: { display: \"block\", flexGrow: grow, flexShrink: shrink } });\n};\n\nexport { FlexItem };\n//# sourceMappingURL=FlexItem.js.map\n","import { NodeProp } from '@lezer/common';\n\nlet nextTagID = 0;\n/**\nHighlighting tags are markers that denote a highlighting category.\nThey are [associated](#highlight.styleTags) with parts of a syntax\ntree by a language mode, and then mapped to an actual CSS style by\na [highlighter](#highlight.Highlighter).\n\nBecause syntax tree node types and highlight styles have to be\nable to talk the same language, CodeMirror uses a mostly _closed_\n[vocabulary](#highlight.tags) of syntax tags (as opposed to\ntraditional open string-based systems, which make it hard for\nhighlighting themes to cover all the tokens produced by the\nvarious languages).\n\nIt _is_ possible to [define](#highlight.Tag^define) your own\nhighlighting tags for system-internal use (where you control both\nthe language package and the highlighter), but such tags will not\nbe picked up by regular highlighters (though you can derive them\nfrom standard tags to allow highlighters to fall back to those).\n*/\nclass Tag {\n /**\n @internal\n */\n constructor(\n /**\n The optional name of the base tag @internal\n */\n name, \n /**\n The set of this tag and all its parent tags, starting with\n this one itself and sorted in order of decreasing specificity.\n */\n set, \n /**\n The base unmodified tag that this one is based on, if it's\n modified @internal\n */\n base, \n /**\n The modifiers applied to this.base @internal\n */\n modified) {\n this.name = name;\n this.set = set;\n this.base = base;\n this.modified = modified;\n /**\n @internal\n */\n this.id = nextTagID++;\n }\n toString() {\n let { name } = this;\n for (let mod of this.modified)\n if (mod.name)\n name = `${mod.name}(${name})`;\n return name;\n }\n static define(nameOrParent, parent) {\n let name = typeof nameOrParent == \"string\" ? nameOrParent : \"?\";\n if (nameOrParent instanceof Tag)\n parent = nameOrParent;\n if (parent === null || parent === void 0 ? void 0 : parent.base)\n throw new Error(\"Can not derive from a modified tag\");\n let tag = new Tag(name, [], null, []);\n tag.set.push(tag);\n if (parent)\n for (let t of parent.set)\n tag.set.push(t);\n return tag;\n }\n /**\n Define a tag _modifier_, which is a function that, given a tag,\n will return a tag that is a subtag of the original. Applying the\n same modifier to a twice tag will return the same value (`m1(t1)\n == m1(t1)`) and applying multiple modifiers will, regardless or\n order, produce the same tag (`m1(m2(t1)) == m2(m1(t1))`).\n \n When multiple modifiers are applied to a given base tag, each\n smaller set of modifiers is registered as a parent, so that for\n example `m1(m2(m3(t1)))` is a subtype of `m1(m2(t1))`,\n `m1(m3(t1)`, and so on.\n */\n static defineModifier(name) {\n let mod = new Modifier(name);\n return (tag) => {\n if (tag.modified.indexOf(mod) > -1)\n return tag;\n return Modifier.get(tag.base || tag, tag.modified.concat(mod).sort((a, b) => a.id - b.id));\n };\n }\n}\nlet nextModifierID = 0;\nclass Modifier {\n constructor(name) {\n this.name = name;\n this.instances = [];\n this.id = nextModifierID++;\n }\n static get(base, mods) {\n if (!mods.length)\n return base;\n let exists = mods[0].instances.find(t => t.base == base && sameArray(mods, t.modified));\n if (exists)\n return exists;\n let set = [], tag = new Tag(base.name, set, base, mods);\n for (let m of mods)\n m.instances.push(tag);\n let configs = powerSet(mods);\n for (let parent of base.set)\n if (!parent.modified.length)\n for (let config of configs)\n set.push(Modifier.get(parent, config));\n return tag;\n }\n}\nfunction sameArray(a, b) {\n return a.length == b.length && a.every((x, i) => x == b[i]);\n}\nfunction powerSet(array) {\n let sets = [[]];\n for (let i = 0; i < array.length; i++) {\n for (let j = 0, e = sets.length; j < e; j++) {\n sets.push(sets[j].concat(array[i]));\n }\n }\n return sets.sort((a, b) => b.length - a.length);\n}\n/**\nThis function is used to add a set of tags to a language syntax\nvia [`NodeSet.extend`](#common.NodeSet.extend) or\n[`LRParser.configure`](#lr.LRParser.configure).\n\nThe argument object maps node selectors to [highlighting\ntags](#highlight.Tag) or arrays of tags.\n\nNode selectors may hold one or more (space-separated) node paths.\nSuch a path can be a [node name](#common.NodeType.name), or\nmultiple node names (or `*` wildcards) separated by slash\ncharacters, as in `\"Block/Declaration/VariableName\"`. Such a path\nmatches the final node but only if its direct parent nodes are the\nother nodes mentioned. A `*` in such a path matches any parent,\nbut only a single level—wildcards that match multiple parents\naren't supported, both for efficiency reasons and because Lezer\ntrees make it rather hard to reason about what they would match.)\n\nA path can be ended with `/...` to indicate that the tag assigned\nto the node should also apply to all child nodes, even if they\nmatch their own style (by default, only the innermost style is\nused).\n\nWhen a path ends in `!`, as in `Attribute!`, no further matching\nhappens for the node's child nodes, and the entire node gets the\ngiven style.\n\nIn this notation, node names that contain `/`, `!`, `*`, or `...`\nmust be quoted as JSON strings.\n\nFor example:\n\n```javascript\nparser.withProps(\n styleTags({\n // Style Number and BigNumber nodes\n \"Number BigNumber\": tags.number,\n // Style Escape nodes whose parent is String\n \"String/Escape\": tags.escape,\n // Style anything inside Attributes nodes\n \"Attributes!\": tags.meta,\n // Add a style to all content inside Italic nodes\n \"Italic/...\": tags.emphasis,\n // Style InvalidString nodes as both `string` and `invalid`\n \"InvalidString\": [tags.string, tags.invalid],\n // Style the node named \"/\" as punctuation\n '\"/\"': tags.punctuation\n })\n)\n```\n*/\nfunction styleTags(spec) {\n let byName = Object.create(null);\n for (let prop in spec) {\n let tags = spec[prop];\n if (!Array.isArray(tags))\n tags = [tags];\n for (let part of prop.split(\" \"))\n if (part) {\n let pieces = [], mode = 2 /* Mode.Normal */, rest = part;\n for (let pos = 0;;) {\n if (rest == \"...\" && pos > 0 && pos + 3 == part.length) {\n mode = 1 /* Mode.Inherit */;\n break;\n }\n let m = /^\"(?:[^\"\\\\]|\\\\.)*?\"|[^\\/!]+/.exec(rest);\n if (!m)\n throw new RangeError(\"Invalid path: \" + part);\n pieces.push(m[0] == \"*\" ? \"\" : m[0][0] == '\"' ? JSON.parse(m[0]) : m[0]);\n pos += m[0].length;\n if (pos == part.length)\n break;\n let next = part[pos++];\n if (pos == part.length && next == \"!\") {\n mode = 0 /* Mode.Opaque */;\n break;\n }\n if (next != \"/\")\n throw new RangeError(\"Invalid path: \" + part);\n rest = part.slice(pos);\n }\n let last = pieces.length - 1, inner = pieces[last];\n if (!inner)\n throw new RangeError(\"Invalid path: \" + part);\n let rule = new Rule(tags, mode, last > 0 ? pieces.slice(0, last) : null);\n byName[inner] = rule.sort(byName[inner]);\n }\n }\n return ruleNodeProp.add(byName);\n}\nconst ruleNodeProp = new NodeProp();\nclass Rule {\n constructor(tags, mode, context, next) {\n this.tags = tags;\n this.mode = mode;\n this.context = context;\n this.next = next;\n }\n get opaque() { return this.mode == 0 /* Mode.Opaque */; }\n get inherit() { return this.mode == 1 /* Mode.Inherit */; }\n sort(other) {\n if (!other || other.depth < this.depth) {\n this.next = other;\n return this;\n }\n other.next = this.sort(other.next);\n return other;\n }\n get depth() { return this.context ? this.context.length : 0; }\n}\nRule.empty = new Rule([], 2 /* Mode.Normal */, null);\n/**\nDefine a [highlighter](#highlight.Highlighter) from an array of\ntag/class pairs. Classes associated with more specific tags will\ntake precedence.\n*/\nfunction tagHighlighter(tags, options) {\n let map = Object.create(null);\n for (let style of tags) {\n if (!Array.isArray(style.tag))\n map[style.tag.id] = style.class;\n else\n for (let tag of style.tag)\n map[tag.id] = style.class;\n }\n let { scope, all = null } = options || {};\n return {\n style: (tags) => {\n let cls = all;\n for (let tag of tags) {\n for (let sub of tag.set) {\n let tagClass = map[sub.id];\n if (tagClass) {\n cls = cls ? cls + \" \" + tagClass : tagClass;\n break;\n }\n }\n }\n return cls;\n },\n scope\n };\n}\nfunction highlightTags(highlighters, tags) {\n let result = null;\n for (let highlighter of highlighters) {\n let value = highlighter.style(tags);\n if (value)\n result = result ? result + \" \" + value : value;\n }\n return result;\n}\n/**\nHighlight the given [tree](#common.Tree) with the given\n[highlighter](#highlight.Highlighter). Often, the higher-level\n[`highlightCode`](#highlight.highlightCode) function is easier to\nuse.\n*/\nfunction highlightTree(tree, highlighter, \n/**\nAssign styling to a region of the text. Will be called, in order\nof position, for any ranges where more than zero classes apply.\n`classes` is a space separated string of CSS classes.\n*/\nputStyle, \n/**\nThe start of the range to highlight.\n*/\nfrom = 0, \n/**\nThe end of the range.\n*/\nto = tree.length) {\n let builder = new HighlightBuilder(from, Array.isArray(highlighter) ? highlighter : [highlighter], putStyle);\n builder.highlightRange(tree.cursor(), from, to, \"\", builder.highlighters);\n builder.flush(to);\n}\n/**\nHighlight the given tree with the given highlighter, calling\n`putText` for every piece of text, either with a set of classes or\nwith the empty string when unstyled, and `putBreak` for every line\nbreak.\n*/\nfunction highlightCode(code, tree, highlighter, putText, putBreak, from = 0, to = code.length) {\n let pos = from;\n function writeTo(p, classes) {\n if (p <= pos)\n return;\n for (let text = code.slice(pos, p), i = 0;;) {\n let nextBreak = text.indexOf(\"\\n\", i);\n let upto = nextBreak < 0 ? text.length : nextBreak;\n if (upto > i)\n putText(text.slice(i, upto), classes);\n if (nextBreak < 0)\n break;\n putBreak();\n i = nextBreak + 1;\n }\n pos = p;\n }\n highlightTree(tree, highlighter, (from, to, classes) => {\n writeTo(from, \"\");\n writeTo(to, classes);\n }, from, to);\n writeTo(to, \"\");\n}\nclass HighlightBuilder {\n constructor(at, highlighters, span) {\n this.at = at;\n this.highlighters = highlighters;\n this.span = span;\n this.class = \"\";\n }\n startSpan(at, cls) {\n if (cls != this.class) {\n this.flush(at);\n if (at > this.at)\n this.at = at;\n this.class = cls;\n }\n }\n flush(to) {\n if (to > this.at && this.class)\n this.span(this.at, to, this.class);\n }\n highlightRange(cursor, from, to, inheritedClass, highlighters) {\n let { type, from: start, to: end } = cursor;\n if (start >= to || end <= from)\n return;\n if (type.isTop)\n highlighters = this.highlighters.filter(h => !h.scope || h.scope(type));\n let cls = inheritedClass;\n let rule = getStyleTags(cursor) || Rule.empty;\n let tagCls = highlightTags(highlighters, rule.tags);\n if (tagCls) {\n if (cls)\n cls += \" \";\n cls += tagCls;\n if (rule.mode == 1 /* Mode.Inherit */)\n inheritedClass += (inheritedClass ? \" \" : \"\") + tagCls;\n }\n this.startSpan(Math.max(from, start), cls);\n if (rule.opaque)\n return;\n let mounted = cursor.tree && cursor.tree.prop(NodeProp.mounted);\n if (mounted && mounted.overlay) {\n let inner = cursor.node.enter(mounted.overlay[0].from + start, 1);\n let innerHighlighters = this.highlighters.filter(h => !h.scope || h.scope(mounted.tree.type));\n let hasChild = cursor.firstChild();\n for (let i = 0, pos = start;; i++) {\n let next = i < mounted.overlay.length ? mounted.overlay[i] : null;\n let nextPos = next ? next.from + start : end;\n let rangeFrom = Math.max(from, pos), rangeTo = Math.min(to, nextPos);\n if (rangeFrom < rangeTo && hasChild) {\n while (cursor.from < rangeTo) {\n this.highlightRange(cursor, rangeFrom, rangeTo, inheritedClass, highlighters);\n this.startSpan(Math.min(rangeTo, cursor.to), cls);\n if (cursor.to >= nextPos || !cursor.nextSibling())\n break;\n }\n }\n if (!next || nextPos > to)\n break;\n pos = next.to + start;\n if (pos > from) {\n this.highlightRange(inner.cursor(), Math.max(from, next.from + start), Math.min(to, pos), \"\", innerHighlighters);\n this.startSpan(Math.min(to, pos), cls);\n }\n }\n if (hasChild)\n cursor.parent();\n }\n else if (cursor.firstChild()) {\n if (mounted)\n inheritedClass = \"\";\n do {\n if (cursor.to <= from)\n continue;\n if (cursor.from >= to)\n break;\n this.highlightRange(cursor, from, to, inheritedClass, highlighters);\n this.startSpan(Math.min(to, cursor.to), cls);\n } while (cursor.nextSibling());\n cursor.parent();\n }\n }\n}\n/**\nMatch a syntax node's [highlight rules](#highlight.styleTags). If\nthere's a match, return its set of tags, and whether it is\nopaque (uses a `!`) or applies to all child nodes (`/...`).\n*/\nfunction getStyleTags(node) {\n let rule = node.type.prop(ruleNodeProp);\n while (rule && rule.context && !node.matchContext(rule.context))\n rule = rule.next;\n return rule || null;\n}\nconst t = Tag.define;\nconst comment = t(), name = t(), typeName = t(name), propertyName = t(name), literal = t(), string = t(literal), number = t(literal), content = t(), heading = t(content), keyword = t(), operator = t(), punctuation = t(), bracket = t(punctuation), meta = t();\n/**\nThe default set of highlighting [tags](#highlight.Tag).\n\nThis collection is heavily biased towards programming languages,\nand necessarily incomplete. A full ontology of syntactic\nconstructs would fill a stack of books, and be impractical to\nwrite themes for. So try to make do with this set. If all else\nfails, [open an\nissue](https://github.com/codemirror/codemirror.next) to propose a\nnew tag, or [define](#highlight.Tag^define) a local custom tag for\nyour use case.\n\nNote that it is not obligatory to always attach the most specific\ntag possible to an element—if your grammar can't easily\ndistinguish a certain type of element (such as a local variable),\nit is okay to style it as its more general variant (a variable).\n\nFor tags that extend some parent tag, the documentation links to\nthe parent.\n*/\nconst tags = {\n /**\n A comment.\n */\n comment,\n /**\n A line [comment](#highlight.tags.comment).\n */\n lineComment: t(comment),\n /**\n A block [comment](#highlight.tags.comment).\n */\n blockComment: t(comment),\n /**\n A documentation [comment](#highlight.tags.comment).\n */\n docComment: t(comment),\n /**\n Any kind of identifier.\n */\n name,\n /**\n The [name](#highlight.tags.name) of a variable.\n */\n variableName: t(name),\n /**\n A type [name](#highlight.tags.name).\n */\n typeName: typeName,\n /**\n A tag name (subtag of [`typeName`](#highlight.tags.typeName)).\n */\n tagName: t(typeName),\n /**\n A property or field [name](#highlight.tags.name).\n */\n propertyName: propertyName,\n /**\n An attribute name (subtag of [`propertyName`](#highlight.tags.propertyName)).\n */\n attributeName: t(propertyName),\n /**\n The [name](#highlight.tags.name) of a class.\n */\n className: t(name),\n /**\n A label [name](#highlight.tags.name).\n */\n labelName: t(name),\n /**\n A namespace [name](#highlight.tags.name).\n */\n namespace: t(name),\n /**\n The [name](#highlight.tags.name) of a macro.\n */\n macroName: t(name),\n /**\n A literal value.\n */\n literal,\n /**\n A string [literal](#highlight.tags.literal).\n */\n string,\n /**\n A documentation [string](#highlight.tags.string).\n */\n docString: t(string),\n /**\n A character literal (subtag of [string](#highlight.tags.string)).\n */\n character: t(string),\n /**\n An attribute value (subtag of [string](#highlight.tags.string)).\n */\n attributeValue: t(string),\n /**\n A number [literal](#highlight.tags.literal).\n */\n number,\n /**\n An integer [number](#highlight.tags.number) literal.\n */\n integer: t(number),\n /**\n A floating-point [number](#highlight.tags.number) literal.\n */\n float: t(number),\n /**\n A boolean [literal](#highlight.tags.literal).\n */\n bool: t(literal),\n /**\n Regular expression [literal](#highlight.tags.literal).\n */\n regexp: t(literal),\n /**\n An escape [literal](#highlight.tags.literal), for example a\n backslash escape in a string.\n */\n escape: t(literal),\n /**\n A color [literal](#highlight.tags.literal).\n */\n color: t(literal),\n /**\n A URL [literal](#highlight.tags.literal).\n */\n url: t(literal),\n /**\n A language keyword.\n */\n keyword,\n /**\n The [keyword](#highlight.tags.keyword) for the self or this\n object.\n */\n self: t(keyword),\n /**\n The [keyword](#highlight.tags.keyword) for null.\n */\n null: t(keyword),\n /**\n A [keyword](#highlight.tags.keyword) denoting some atomic value.\n */\n atom: t(keyword),\n /**\n A [keyword](#highlight.tags.keyword) that represents a unit.\n */\n unit: t(keyword),\n /**\n A modifier [keyword](#highlight.tags.keyword).\n */\n modifier: t(keyword),\n /**\n A [keyword](#highlight.tags.keyword) that acts as an operator.\n */\n operatorKeyword: t(keyword),\n /**\n A control-flow related [keyword](#highlight.tags.keyword).\n */\n controlKeyword: t(keyword),\n /**\n A [keyword](#highlight.tags.keyword) that defines something.\n */\n definitionKeyword: t(keyword),\n /**\n A [keyword](#highlight.tags.keyword) related to defining or\n interfacing with modules.\n */\n moduleKeyword: t(keyword),\n /**\n An operator.\n */\n operator,\n /**\n An [operator](#highlight.tags.operator) that dereferences something.\n */\n derefOperator: t(operator),\n /**\n Arithmetic-related [operator](#highlight.tags.operator).\n */\n arithmeticOperator: t(operator),\n /**\n Logical [operator](#highlight.tags.operator).\n */\n logicOperator: t(operator),\n /**\n Bit [operator](#highlight.tags.operator).\n */\n bitwiseOperator: t(operator),\n /**\n Comparison [operator](#highlight.tags.operator).\n */\n compareOperator: t(operator),\n /**\n [Operator](#highlight.tags.operator) that updates its operand.\n */\n updateOperator: t(operator),\n /**\n [Operator](#highlight.tags.operator) that defines something.\n */\n definitionOperator: t(operator),\n /**\n Type-related [operator](#highlight.tags.operator).\n */\n typeOperator: t(operator),\n /**\n Control-flow [operator](#highlight.tags.operator).\n */\n controlOperator: t(operator),\n /**\n Program or markup punctuation.\n */\n punctuation,\n /**\n [Punctuation](#highlight.tags.punctuation) that separates\n things.\n */\n separator: t(punctuation),\n /**\n Bracket-style [punctuation](#highlight.tags.punctuation).\n */\n bracket,\n /**\n Angle [brackets](#highlight.tags.bracket) (usually `<` and `>`\n tokens).\n */\n angleBracket: t(bracket),\n /**\n Square [brackets](#highlight.tags.bracket) (usually `[` and `]`\n tokens).\n */\n squareBracket: t(bracket),\n /**\n Parentheses (usually `(` and `)` tokens). Subtag of\n [bracket](#highlight.tags.bracket).\n */\n paren: t(bracket),\n /**\n Braces (usually `{` and `}` tokens). Subtag of\n [bracket](#highlight.tags.bracket).\n */\n brace: t(bracket),\n /**\n Content, for example plain text in XML or markup documents.\n */\n content,\n /**\n [Content](#highlight.tags.content) that represents a heading.\n */\n heading,\n /**\n A level 1 [heading](#highlight.tags.heading).\n */\n heading1: t(heading),\n /**\n A level 2 [heading](#highlight.tags.heading).\n */\n heading2: t(heading),\n /**\n A level 3 [heading](#highlight.tags.heading).\n */\n heading3: t(heading),\n /**\n A level 4 [heading](#highlight.tags.heading).\n */\n heading4: t(heading),\n /**\n A level 5 [heading](#highlight.tags.heading).\n */\n heading5: t(heading),\n /**\n A level 6 [heading](#highlight.tags.heading).\n */\n heading6: t(heading),\n /**\n A prose [content](#highlight.tags.content) separator (such as a horizontal rule).\n */\n contentSeparator: t(content),\n /**\n [Content](#highlight.tags.content) that represents a list.\n */\n list: t(content),\n /**\n [Content](#highlight.tags.content) that represents a quote.\n */\n quote: t(content),\n /**\n [Content](#highlight.tags.content) that is emphasized.\n */\n emphasis: t(content),\n /**\n [Content](#highlight.tags.content) that is styled strong.\n */\n strong: t(content),\n /**\n [Content](#highlight.tags.content) that is part of a link.\n */\n link: t(content),\n /**\n [Content](#highlight.tags.content) that is styled as code or\n monospace.\n */\n monospace: t(content),\n /**\n [Content](#highlight.tags.content) that has a strike-through\n style.\n */\n strikethrough: t(content),\n /**\n Inserted text in a change-tracking format.\n */\n inserted: t(),\n /**\n Deleted text.\n */\n deleted: t(),\n /**\n Changed text.\n */\n changed: t(),\n /**\n An invalid or unsyntactic element.\n */\n invalid: t(),\n /**\n Metadata or meta-instruction.\n */\n meta,\n /**\n [Metadata](#highlight.tags.meta) that applies to the entire\n document.\n */\n documentMeta: t(meta),\n /**\n [Metadata](#highlight.tags.meta) that annotates or adds\n attributes to a given syntactic element.\n */\n annotation: t(meta),\n /**\n Processing instruction or preprocessor directive. Subtag of\n [meta](#highlight.tags.meta).\n */\n processingInstruction: t(meta),\n /**\n [Modifier](#highlight.Tag^defineModifier) that indicates that a\n given element is being defined. Expected to be used with the\n various [name](#highlight.tags.name) tags.\n */\n definition: Tag.defineModifier(\"definition\"),\n /**\n [Modifier](#highlight.Tag^defineModifier) that indicates that\n something is constant. Mostly expected to be used with\n [variable names](#highlight.tags.variableName).\n */\n constant: Tag.defineModifier(\"constant\"),\n /**\n [Modifier](#highlight.Tag^defineModifier) used to indicate that\n a [variable](#highlight.tags.variableName) or [property\n name](#highlight.tags.propertyName) is being called or defined\n as a function.\n */\n function: Tag.defineModifier(\"function\"),\n /**\n [Modifier](#highlight.Tag^defineModifier) that can be applied to\n [names](#highlight.tags.name) to indicate that they belong to\n the language's standard environment.\n */\n standard: Tag.defineModifier(\"standard\"),\n /**\n [Modifier](#highlight.Tag^defineModifier) that indicates a given\n [names](#highlight.tags.name) is local to some scope.\n */\n local: Tag.defineModifier(\"local\"),\n /**\n A generic variant [modifier](#highlight.Tag^defineModifier) that\n can be used to tag language-specific alternative variants of\n some common tag. It is recommended for themes to define special\n forms of at least the [string](#highlight.tags.string) and\n [variable name](#highlight.tags.variableName) tags, since those\n come up a lot.\n */\n special: Tag.defineModifier(\"special\")\n};\nfor (let name in tags) {\n let val = tags[name];\n if (val instanceof Tag)\n val.name = name;\n}\n/**\nThis is a highlighter that adds stable, predictable classes to\ntokens, for styling with external CSS.\n\nThe following tags are mapped to their name prefixed with `\"tok-\"`\n(for example `\"tok-comment\"`):\n\n* [`link`](#highlight.tags.link)\n* [`heading`](#highlight.tags.heading)\n* [`emphasis`](#highlight.tags.emphasis)\n* [`strong`](#highlight.tags.strong)\n* [`keyword`](#highlight.tags.keyword)\n* [`atom`](#highlight.tags.atom)\n* [`bool`](#highlight.tags.bool)\n* [`url`](#highlight.tags.url)\n* [`labelName`](#highlight.tags.labelName)\n* [`inserted`](#highlight.tags.inserted)\n* [`deleted`](#highlight.tags.deleted)\n* [`literal`](#highlight.tags.literal)\n* [`string`](#highlight.tags.string)\n* [`number`](#highlight.tags.number)\n* [`variableName`](#highlight.tags.variableName)\n* [`typeName`](#highlight.tags.typeName)\n* [`namespace`](#highlight.tags.namespace)\n* [`className`](#highlight.tags.className)\n* [`macroName`](#highlight.tags.macroName)\n* [`propertyName`](#highlight.tags.propertyName)\n* [`operator`](#highlight.tags.operator)\n* [`comment`](#highlight.tags.comment)\n* [`meta`](#highlight.tags.meta)\n* [`punctuation`](#highlight.tags.punctuation)\n* [`invalid`](#highlight.tags.invalid)\n\nIn addition, these mappings are provided:\n\n* [`regexp`](#highlight.tags.regexp),\n [`escape`](#highlight.tags.escape), and\n [`special`](#highlight.tags.special)[`(string)`](#highlight.tags.string)\n are mapped to `\"tok-string2\"`\n* [`special`](#highlight.tags.special)[`(variableName)`](#highlight.tags.variableName)\n to `\"tok-variableName2\"`\n* [`local`](#highlight.tags.local)[`(variableName)`](#highlight.tags.variableName)\n to `\"tok-variableName tok-local\"`\n* [`definition`](#highlight.tags.definition)[`(variableName)`](#highlight.tags.variableName)\n to `\"tok-variableName tok-definition\"`\n* [`definition`](#highlight.tags.definition)[`(propertyName)`](#highlight.tags.propertyName)\n to `\"tok-propertyName tok-definition\"`\n*/\nconst classHighlighter = tagHighlighter([\n { tag: tags.link, class: \"tok-link\" },\n { tag: tags.heading, class: \"tok-heading\" },\n { tag: tags.emphasis, class: \"tok-emphasis\" },\n { tag: tags.strong, class: \"tok-strong\" },\n { tag: tags.keyword, class: \"tok-keyword\" },\n { tag: tags.atom, class: \"tok-atom\" },\n { tag: tags.bool, class: \"tok-bool\" },\n { tag: tags.url, class: \"tok-url\" },\n { tag: tags.labelName, class: \"tok-labelName\" },\n { tag: tags.inserted, class: \"tok-inserted\" },\n { tag: tags.deleted, class: \"tok-deleted\" },\n { tag: tags.literal, class: \"tok-literal\" },\n { tag: tags.string, class: \"tok-string\" },\n { tag: tags.number, class: \"tok-number\" },\n { tag: [tags.regexp, tags.escape, tags.special(tags.string)], class: \"tok-string2\" },\n { tag: tags.variableName, class: \"tok-variableName\" },\n { tag: tags.local(tags.variableName), class: \"tok-variableName tok-local\" },\n { tag: tags.definition(tags.variableName), class: \"tok-variableName tok-definition\" },\n { tag: tags.special(tags.variableName), class: \"tok-variableName2\" },\n { tag: tags.definition(tags.propertyName), class: \"tok-propertyName tok-definition\" },\n { tag: tags.typeName, class: \"tok-typeName\" },\n { tag: tags.namespace, class: \"tok-namespace\" },\n { tag: tags.className, class: \"tok-className\" },\n { tag: tags.macroName, class: \"tok-macroName\" },\n { tag: tags.propertyName, class: \"tok-propertyName\" },\n { tag: tags.operator, class: \"tok-operator\" },\n { tag: tags.comment, class: \"tok-comment\" },\n { tag: tags.meta, class: \"tok-meta\" },\n { tag: tags.invalid, class: \"tok-invalid\" },\n { tag: tags.punctuation, class: \"tok-punctuation\" }\n]);\n\nexport { Tag, classHighlighter, getStyleTags, highlightCode, highlightTree, styleTags, tagHighlighter, tags };\n","import { LRParser } from '@lezer/lr';\nimport { styleTags, tags } from '@lezer/highlight';\n\n// This file was generated by lezer-generator. You probably shouldn't edit it.\nconst inf$1 = 161,\n nan$1 = 162,\n Bool$1 = 1,\n Ignoring$1 = 2,\n On$1 = 3,\n GroupLeft$1 = 4,\n GroupRight$1 = 5,\n Offset$1 = 6,\n Atan2$1 = 7,\n Avg$1 = 8,\n Bottomk$1 = 9,\n Count$1 = 10,\n CountValues$1 = 11,\n Group$1 = 12,\n Max$1 = 13,\n Min$1 = 14,\n Quantile$1 = 15,\n LimitK$1 = 16,\n LimitRatio$1 = 17,\n Stddev$1 = 18,\n Stdvar$1 = 19,\n Sum$1 = 20,\n Topk$1 = 21,\n By$1 = 22,\n Without$1 = 23,\n And$1 = 24,\n Or$1 = 25,\n Unless$1 = 26,\n Start$1 = 27,\n End$1 = 28;\n\n// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\nconst keywordTokens = {\n inf: inf$1,\n nan: nan$1,\n bool: Bool$1,\n ignoring: Ignoring$1,\n on: On$1,\n group_left: GroupLeft$1,\n group_right: GroupRight$1,\n offset: Offset$1,\n};\n\nconst specializeIdentifier = (value, stack) => {\n return keywordTokens[value.toLowerCase()] || -1;\n};\n\nconst contextualKeywordTokens = {\n avg: Avg$1,\n atan2: Atan2$1,\n bottomk: Bottomk$1,\n count: Count$1,\n count_values: CountValues$1,\n group: Group$1,\n max: Max$1,\n min: Min$1,\n quantile: Quantile$1,\n limitk: LimitK$1,\n limit_ratio: LimitRatio$1,\n stddev: Stddev$1,\n stdvar: Stdvar$1,\n sum: Sum$1,\n topk: Topk$1,\n by: By$1,\n without: Without$1,\n and: And$1,\n or: Or$1,\n unless: Unless$1,\n start: Start$1,\n end: End$1,\n};\n\nconst extendIdentifier = (value, stack) => {\n return contextualKeywordTokens[value.toLowerCase()] || -1;\n};\n\n// Copyright 2022 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\nconst promQLHighLight = styleTags({\n LineComment: tags.comment,\n LabelName: tags.labelName,\n StringLiteral: tags.string,\n NumberDurationLiteral: tags.number,\n NumberDurationLiteralInDurationContext: tags.number,\n Identifier: tags.variableName,\n 'Abs Absent AbsentOverTime Acos Acosh Asin Asinh Atan Atanh AvgOverTime Ceil Changes Clamp ClampMax ClampMin Cos Cosh CountOverTime DaysInMonth DayOfMonth DayOfWeek DayOfYear Deg Delta Deriv Exp Floor HistogramAvg HistogramCount HistogramFraction HistogramQuantile HistogramSum DoubleExponentialSmoothing Hour Idelta Increase Irate LabelReplace LabelJoin LastOverTime Ln Log10 Log2 MaxOverTime MinOverTime Minute Month Pi PredictLinear PresentOverTime QuantileOverTime Rad Rate Resets Round Scalar Sgn Sin Sinh Sort SortDesc SortByLabel SortByLabelDesc Sqrt StddevOverTime StdvarOverTime SumOverTime Tan Tanh Time Timestamp Vector Year':\n tags.function(tags.variableName),\n 'Avg Bottomk Count Count_values Group LimitK LimitRatio Max Min Quantile Stddev Stdvar Sum Topk': tags.operatorKeyword,\n 'By Without Bool On Ignoring GroupLeft GroupRight Offset Start End': tags.modifier,\n 'And Unless Or': tags.logicOperator,\n 'Sub Add Mul Mod Div Atan2 Eql Neq Lte Lss Gte Gtr EqlRegex EqlSingle NeqRegex Pow At': tags.operator,\n UnaryOp: tags.arithmeticOperator,\n '( )': tags.paren,\n '[ ]': tags.squareBracket,\n '{ }': tags.brace,\n '⚠': tags.invalid,\n});\n\n// This file was generated by lezer-generator. You probably shouldn't edit it.\nconst spec_Identifier = {__proto__:null,absent_over_time:341, absent:343, abs:345, acos:347, acosh:349, asin:351, asinh:353, atan:355, atanh:357, avg_over_time:359, ceil:361, changes:363, clamp:365, clamp_max:367, clamp_min:369, cos:371, cosh:373, count_over_time:375, days_in_month:377, day_of_month:379, day_of_week:381, day_of_year:383, deg:385, delta:387, deriv:389, exp:391, floor:393, histogram_count:395, histogram_fraction:397, histogram_quantile:399, histogram_stddev:401, histogram_stdvar:403, histogram_sum:405, histogram_avg:407, double_exponential_smoothing:409, hour:411, idelta:413, increase:415, info:417, irate:419, label_replace:421, label_join:423, last_over_time:425, ln:427, log10:429, log2:431, mad_over_time:433, max_over_time:435, min_over_time:437, ts_of_max_over_time:439, ts_of_min_over_time:441, ts_of_last_over_time:443, minute:445, month:447, pi:449, predict_linear:451, present_over_time:453, quantile_over_time:455, rad:457, rate:459, resets:461, round:463, scalar:465, sgn:467, sin:469, sinh:471, sort:473, sort_desc:475, sort_by_label:477, sort_by_label_desc:479, sqrt:481, stddev_over_time:483, stdvar_over_time:485, sum_over_time:487, tan:489, tanh:491, timestamp:493, time:495, vector:497, year:499};\nconst parser = LRParser.deserialize({\n version: 14,\n states: \"9tOYQPOOO'}QPOOOOQO'#C|'#C|O(SQPO'#C{Q(_QQOOOOQO'#De'#DeO(YQPO'#DdOOQO'#F]'#F]O)lQPO'#FbOYQPO'#F_OYQPO'#FaO0jQSO'#FdO0uQQO'#FcOOQO'#Fc'#FcOOQO'#Fw'#FwOOQO'#Df'#DfOOQO'#Dh'#DhOOQO'#Di'#DiOOQO'#Dj'#DjOOQO'#Dk'#DkOOQO'#Dl'#DlOOQO'#Dm'#DmOOQO'#Dn'#DnOOQO'#Do'#DoOOQO'#Dp'#DpOOQO'#Dq'#DqOOQO'#Dr'#DrOOQO'#Ds'#DsOOQO'#Dt'#DtOOQO'#Du'#DuOOQO'#Dv'#DvOOQO'#Dw'#DwOOQO'#Dx'#DxOOQO'#Dy'#DyOOQO'#Dz'#DzOOQO'#D{'#D{OOQO'#D|'#D|OOQO'#D}'#D}OOQO'#EO'#EOOOQO'#EP'#EPOOQO'#EQ'#EQOOQO'#ER'#EROOQO'#ES'#ESOOQO'#ET'#ETOOQO'#EU'#EUOOQO'#EV'#EVOOQO'#EW'#EWOOQO'#EX'#EXOOQO'#EY'#EYOOQO'#EZ'#EZOOQO'#E['#E[OOQO'#E]'#E]OOQO'#E^'#E^OOQO'#E_'#E_OOQO'#E`'#E`OOQO'#Ea'#EaOOQO'#Eb'#EbOOQO'#Ec'#EcOOQO'#Ed'#EdOOQO'#Ee'#EeOOQO'#Ef'#EfOOQO'#Eg'#EgOOQO'#Eh'#EhOOQO'#Ei'#EiOOQO'#Ej'#EjOOQO'#Ek'#EkOOQO'#El'#ElOOQO'#Em'#EmOOQO'#En'#EnOOQO'#Eo'#EoOOQO'#Ep'#EpOOQO'#Eq'#EqOOQO'#Er'#ErOOQO'#Es'#EsOOQO'#Et'#EtOOQO'#Eu'#EuOOQO'#Ev'#EvOOQO'#Ew'#EwOOQO'#Ex'#ExOOQO'#Ey'#EyOOQO'#Ez'#EzOOQO'#E{'#E{OOQO'#E|'#E|OOQO'#E}'#E}OOQO'#FO'#FOOOQO'#FP'#FPOOQO'#FQ'#FQOOQO'#FR'#FROOQO'#FS'#FSOOQO'#FT'#FTOOQO'#FU'#FUOOQO'#FV'#FVOOQO'#FW'#FWOOQO'#FX'#FXOOQO'#FY'#FYQOQPOOO2`QPO'#C}O2eQPO'#DSO(YQPO,59gO2lQQO,59gO4YQPO,59oO4YQPO,59oO4YQPO,59oO4YQPO,59oO4YQPO,59oO;WQPO,5;uO;WQPO,5;xO;iQPO,5<VOOQO,5:O,5:OOOQO,5;w,5;wO<QQQO,5;yO<XQQO,5;{OOQO'#DQ'#DQO=oQPO'#FeO=}QPO,5<OOOQO,5<O,5<OO>ZQPO,5<OOOQO,5;},5;}O>cQSO'#DOOOQO,59i,59iOOQO,59n,59nO>nQQO,59nOOQO1G/R1G/ROOQO'#DV'#DVO2`QPO'#DWOOQO'#F{'#F{O>xQPO'#F{OYQPO1G/ZOYQPO1G/ZOYQPO1G/ZOYQPO1G/ZOYQPO1G/ZOOQO'#F['#F[OEsQPO'#F[OFOQSO1G1aOOQO1G1d1G1dOFWQPO'#F]OOQO'#Fm'#FmOOQO1G1q1G1qOFcQPO1G1qOOQO1G1e1G1eOOQO'#Ff'#FfOFhQPO,5<POFmQPO,5<UOFrQSO1G1jOF}QPO1G1jOOQO1G1j1G1jOOQO,59j,59jOGVQPO,59jOYQPO'#FpOG_QPO1G/YOOQO1G/Y1G/YOGgQPO,59rOOQO,5<g,5<gO! lQQO7+$uO! |QQO7+$uO!#bQQO7+$uO!#xQQO7+$uO!%aQQO7+$uOOQO,5;v,5;vOOQO7+&{7+&{O!%zQPO7+'QO!&RQPO7+']OOQO1G1k1G1kOOQO1G1p1G1pO!&WQPO,5<]OOQO,5<],5<]OOQO7+'U7+'UO!&lQSO7+'UOOQO-E9o-E9oO!&wQSO1G/UO!'SQPO1G/UOOQO1G/U1G/UO!'[QQO,5<[OOQO-E9n-E9nOOQO7+$t7+$tO!'fQPO1G/^OOQO<<Jl<<JlO!.ZQPO<<JlOOQO<<Jw<<JwOOQO<<Jp<<JpP!.`QSO'#FqOOQO,5<Z,5<ZOOQO7+$p7+$pO!.hQSO7+$pOOQO-E9m-E9mOOQO7+$x7+$xOOQOAN@WAN@WOOQO<<H[<<H[P!.sQSO'#Fo\",\n stateData: \"!.{~O$jOSmOS~OWQOXQOYQOZQO[QO]QO^QO_QO`QOaQObQOcQOdQOeQOu^O!Z[O$gVO$hVO$lXO$p_O$q`O$raO$sbO$tcO$udO$veO$wfO$xgO$yhO$ziO${jO$|kO$}lO%OmO%PnO%QoO%RpO%SqO%TrO%UsO%VtO%WuO%XvO%YwO%ZxO%[yO%]zO%^{O%_|O%`}O%a!OO%b!PO%c!QO%d!RO%e!SO%f!TO%g!UO%h!VO%i!WO%j!XO%k!YO%l!ZO%m![O%n!]O%o!^O%p!_O%q!`O%r!aO%s!bO%t!cO%u!dO%v!eO%w!fO%x!gO%y!hO%z!iO%{!jO%|!kO%}!lO&O!mO&P!nO&Q!oO&R!pO&S!qO&T!rO&U!sO&V!tO&W!uO&X!vO&Y!wO&Z!xO&[!yO&]!zO&^!{O&_!|O&`!}O&a#OO&b#PO&c#QO&eWO&fWO&gVO&jZO~O!Z#RO~Of#SOg#SO$l#TO~OU#^OV#WOh#ZOi#[Oj#ZOx#WO{#WO|#WO}#WO!O#XO!P#XO!Q#YO!R#YO!S#YO!T#YO!U#YO!V#YO$`#_O&d#]O~O$g#aO$h#aO&g#aOW$UXX$UXY$UXZ$UX[$UX]$UX^$UX_$UX`$UXa$UXb$UXc$UXd$UXe$UXu$UX!Z$UX$g$UX$h$UX$l$UX$p$UX$q$UX$r$UX$s$UX$t$UX$u$UX$v$UX$w$UX$x$UX$y$UX$z$UX${$UX$|$UX$}$UX%O$UX%P$UX%Q$UX%R$UX%S$UX%T$UX%U$UX%V$UX%W$UX%X$UX%Y$UX%Z$UX%[$UX%]$UX%^$UX%_$UX%`$UX%a$UX%b$UX%c$UX%d$UX%e$UX%f$UX%g$UX%h$UX%i$UX%j$UX%k$UX%l$UX%m$UX%n$UX%o$UX%p$UX%q$UX%r$UX%s$UX%t$UX%u$UX%v$UX%w$UX%x$UX%y$UX%z$UX%{$UX%|$UX%}$UX&O$UX&P$UX&Q$UX&R$UX&S$UX&T$UX&U$UX&V$UX&W$UX&X$UX&Y$UX&Z$UX&[$UX&]$UX&^$UX&_$UX&`$UX&a$UX&b$UX&c$UX&e$UX&f$UX&g$UX&j$UX~Os#eOu#dO&k#gO~O&jZOU$VXV$VXh$VXi$VXj$VXx$VX{$VX|$VX}$VX!O$VX!P$VX!Q$VX!R$VX!S$VX!T$VX!U$VX!V$VX$`$VX$f$VX&d$VX$n$VX$m$VX~O$l#jO~O$n#lO~PYOf#SOg#SOUoaVoahoaioajoaxoa{oa|oa}oa!Ooa!Poa!Qoa!Roa!Soa!Toa!Uoa!Voa$`oa$foa&doa$noa$moa~OP#oOQ#pOR#pOW$oPX$oPY$oPZ$oP[$oP]$oP^$oP_$oP`$oPa$oPb$oPc$oPd$oPe$oPu$oP!Z$oP$g$oP$h$oP$l$oP$p$oP$q$oP$r$oP$s$oP$t$oP$u$oP$v$oP$w$oP$x$oP$y$oP$z$oP${$oP$|$oP$}$oP%O$oP%P$oP%Q$oP%R$oP%S$oP%T$oP%U$oP%V$oP%W$oP%X$oP%Y$oP%Z$oP%[$oP%]$oP%^$oP%_$oP%`$oP%a$oP%b$oP%c$oP%d$oP%e$oP%f$oP%g$oP%h$oP%i$oP%j$oP%k$oP%l$oP%m$oP%n$oP%o$oP%p$oP%q$oP%r$oP%s$oP%t$oP%u$oP%v$oP%w$oP%x$oP%y$oP%z$oP%{$oP%|$oP%}$oP&O$oP&P$oP&Q$oP&R$oP&S$oP&T$oP&U$oP&V$oP&W$oP&X$oP&Y$oP&Z$oP&[$oP&]$oP&^$oP&_$oP&`$oP&a$oP&b$oP&c$oP&e$oP&f$oP&g$oP&j$oP~O$g#xO$h#xO&e#yO&f#yO&g#xO~Ok#}Ol#}O$gVO$hVO&e#|O&f#|O&gVO~O$n$QO~P(_Ox#WOU$TaV$Tah$Tai$Taj$Ta{$Ta|$Ta}$Ta!O$Ta!P$Ta!Q$Ta!R$Ta!S$Ta!T$Ta!U$Ta!V$Ta$`$Ta$f$Ta&d$Ta$n$Ta$m$Ta~O!V$RO$Z$RO$[$RO$]$RO~O!V$RO$Z$RO$[$RO$]$RO$m$UO&k$WO~Os$YOu#dO$n$XO~O$m$ZO$n$]O~P(_OQ#pOR#pOW$oXX$oXY$oXZ$oX[$oX]$oX^$oX_$oX`$oXa$oXb$oXc$oXd$oXe$oXu$oX!Z$oX$g$oX$h$oX$l$oX$p$oX$q$oX$r$oX$s$oX$t$oX$u$oX$v$oX$w$oX$x$oX$y$oX$z$oX${$oX$|$oX$}$oX%O$oX%P$oX%Q$oX%R$oX%S$oX%T$oX%U$oX%V$oX%W$oX%X$oX%Y$oX%Z$oX%[$oX%]$oX%^$oX%_$oX%`$oX%a$oX%b$oX%c$oX%d$oX%e$oX%f$oX%g$oX%h$oX%i$oX%j$oX%k$oX%l$oX%m$oX%n$oX%o$oX%p$oX%q$oX%r$oX%s$oX%t$oX%u$oX%v$oX%w$oX%x$oX%y$oX%z$oX%{$oX%|$oX%}$oX&O$oX&P$oX&Q$oX&R$oX&S$oX&T$oX&U$oX&V$oX&W$oX&X$oX&Y$oX&Z$oX&[$oX&]$oX&^$oX&_$oX&`$oX&a$oX&b$oX&c$oX&e$oX&f$oX&g$oX&j$oX~O$g$eO$h$eO&g$eO~O&h$fO&i$gO~O$g#aO$h#aO&g#aO~O$l$hO~Ou$iO~Ou$jO~Os#eOu#dO&k$mO~O$m$nO&k$mO~O$m$pO$n$rO~O$m$ZO$n$uO~OS$vOT$vOWzaXzaYzaZza[za]za^za_za`zaazabzaczadzaezauza!Zza$gza$hza$lza$pza$qza$rza$sza$tza$uza$vza$wza$xza$yza$zza${za$|za$}za%Oza%Pza%Qza%Rza%Sza%Tza%Uza%Vza%Wza%Xza%Yza%Zza%[za%]za%^za%_za%`za%aza%bza%cza%dza%eza%fza%gza%hza%iza%jza%kza%lza%mza%nza%oza%pza%qza%rza%sza%tza%uza%vza%wza%xza%yza%zza%{za%|za%}za&Oza&Pza&Qza&Rza&Sza&Tza&Uza&Vza&Wza&Xza&Yza&Zza&[za&]za&^za&_za&`za&aza&bza&cza&eza&fza&gza&jza~Ox#WOUwqhwqiwqjwq!Owq!Pwq!Qwq!Rwq!Swq!Twq!Uwq!Vwq$`wq$fwq&dwq$nwq$mwq~OVwq{wq|wq}wq~PNbOV#WO{#WO|#WO}#WO~PNbOV#WOx#WO{#WO|#WO}#WO!O#XO!P#XOUwqhwqiwqjwq$`wq$fwq&dwq$nwq$mwq~O!Qwq!Rwq!Swq!Twq!Uwq!Vwq~P!!^O!Q#YO!R#YO!S#YO!T#YO!U#YO!V#YO~P!!^OV#WOh#ZOj#ZOx#WO{#WO|#WO}#WO!O#XO!P#XO!Q#YO!R#YO!S#YO!T#YO!U#YO!V#YO~OUwqiwq$`wq$fwq&dwq$nwq$mwq~P!$`O&h$wO~P;WO$n$yO~O!V$RO$Z$RO$[$RO$]$RO$m$ea&k$ea~Os#eOu#dO&k$zO~Os$|Ou#dO$n$}O~O$m%OO$n$}O~O$m$da$n$da~P(_O$l#jOWziXziYziZzi[zi]zi^zi_zi`ziazibziczidzieziuzi!Zzi$gzi$hzi$pzi$qzi$rzi$szi$tzi$uzi$vzi$wzi$xzi$yzi$zzi${zi$|zi$}zi%Ozi%Pzi%Qzi%Rzi%Szi%Tzi%Uzi%Vzi%Wzi%Xzi%Yzi%Zzi%[zi%]zi%^zi%_zi%`zi%azi%bzi%czi%dzi%ezi%fzi%gzi%hzi%izi%jzi%kzi%lzi%mzi%nzi%ozi%pzi%qzi%rzi%szi%tzi%uzi%vzi%wzi%xzi%yzi%zzi%{zi%|zi%}zi&Ozi&Pzi&Qzi&Rzi&Szi&Tzi&Uzi&Vzi&Wzi&Xzi&Yzi&Zzi&[zi&]zi&^zi&_zi&`zi&azi&bzi&czi&ezi&fzi&gzi&jzi~O&h%RO~Os#eOu#dO~Os$|Ou#dO$n%SO~Os$|Ou#dO~O\",\n goto: \")y$pPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP$q$}%Z%aP%jP%z$qP&T&[PPPPPPPPPPP$q&f&rP&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r&r$q'O'X$q$q$q$q'h$q't(T(]PPP(T$qP(dP(g(m(sPPPPP(zPPP)je^OXY#T#s#t#u#v#w$ZeROXY#T#s#t#u#v#w$ZQ#URR#n#VQ#k#SQ$^#pR%Q$vQ#fZQ$Y#jU$k$U$n${V$|$p%O%TQ#VRQ#`UR#n#UZ#r#W#X#Y#Z#[Y#q#W#X#Y#Z#[R$_#reUOXY#T#s#t#u#v#w$ZeTOXY#T#s#t#u#v#w$ZQ#z#]Q#{#^R$x$gd^OXY#T#s#t#u#v#w$ZR$O#_eYOXY#T#s#t#u#v#w$Zd]OXY#T#s#t#u#v#w$ZR#i[Q#hZV$l$U$n${Q$S#eT$T#f$kR$P#_Q$q$YR%P$qQ$[#mR$t$[S$V#f#hR$o$VQSOQ#bXQ#cYQ#m#TQ$`#sQ$a#tQ$b#uQ$c#vQ$d#wR$s$ZQ#s#WQ#t#XQ#u#YQ#v#ZR#w#[\",\n nodeNames: \"⚠Bool Ignoring On GroupLeft GroupRight Offset Atan2 Avg Bottomk Count CountValues Group Max Min Quantile LimitK LimitRatio Stddev Stdvar Sum Topk By Without And Or Unless Start End LineComment PromQL AggregateExpr AggregateOp AggregateModifier GroupingLabels LabelName QuotedLabelName StringLiteral FunctionCallBody BinaryExpr Pow BoolModifier MatchingModifierClause Mul Div Mod Add Sub Eql Gte Gtr Lte Lss Neq FunctionCall FunctionIdentifier AbsentOverTime Identifier Absent Abs Acos Acosh Asin Asinh Atan Atanh AvgOverTime Ceil Changes Clamp ClampMax ClampMin Cos Cosh CountOverTime DaysInMonth DayOfMonth DayOfWeek DayOfYear Deg Delta Deriv Exp Floor HistogramCount HistogramFraction HistogramQuantile HistogramStdDev HistogramStdVar HistogramSum HistogramAvg DoubleExponentialSmoothing Hour Idelta Increase Info Irate LabelReplace LabelJoin LastOverTime Ln Log10 Log2 MadOverTime MaxOverTime MinOverTime TsOfMaxOverTime TsOfMinOverTime TsOfLastOverTime Minute Month Pi PredictLinear PresentOverTime QuantileOverTime Rad Rate Resets Round Scalar Sgn Sin Sinh Sort SortDesc SortByLabel SortByLabelDesc Sqrt StddevOverTime StdvarOverTime SumOverTime Tan Tanh Timestamp Time Vector Year MatrixSelector NumberDurationLiteralInDurationContext NumberDurationLiteral OffsetExpr ParenExpr SubqueryExpr UnaryExpr UnaryOp VectorSelector LabelMatchers UnquotedLabelMatcher MatchOp EqlSingle EqlRegex NeqRegex QuotedLabelMatcher StepInvariantExpr At AtModifierPreprocessors MetricName\",\n maxTerm: 257,\n nodeProps: [\n [\"group\", -12,31,37,39,54,137,139,140,141,142,143,145,153,\"Expr\"]\n ],\n propSources: [promQLHighLight],\n skippedNodes: [0,29],\n repeatNodeCount: 3,\n tokenData: \"4k~RwX^#lpq#lqr$ars$tst&luv'Twx'Yxy({yz)Qz{)V{|)[|})c}!O)h!O!P)o!P!Q*u!Q!R*z!R![+u![!]1O!^!_1z!_!`2X!`!a2n!b!c2{!c!}3Q!}#O3h#P#Q3m#Q#R3r#R#S3Q#S#T3w#T#o3Q#o#p4a#q#r4f#y#z#l$f$g#l#BY#BZ#l$IS$I_#l$I|$JO#l$JT$JU#l$KV$KW#l&FU&FV#l~#qY$j~X^#lpq#l#y#z#l$f$g#l#BY#BZ#l$IS$I_#l$I|$JO#l$JT$JU#l$KV$KW#l&FU&FV#l~$dQ!_!`$j#r#s$o~$oO!V~~$tO$]~~$yWu~OY$tZr$trs%cs#O$t#O#P%h#P;'S$t;'S;=`&f<%lO$t~%hOu~~%kRO;'S$t;'S;=`%t;=`O$t~%yXu~OY$tZr$trs%cs#O$t#O#P%h#P;'S$t;'S;=`&f;=`<%l$t<%lO$t~&iP;=`<%l$t~&qSm~OY&lZ;'S&l;'S;=`&}<%lO&l~'QP;=`<%l&l~'YO}~~'_Wu~OY'YZw'Ywx%cx#O'Y#O#P'w#P;'S'Y;'S;=`(u<%lO'Y~'zRO;'S'Y;'S;=`(T;=`O'Y~(YXu~OY'YZw'Ywx%cx#O'Y#O#P'w#P;'S'Y;'S;=`(u;=`<%l'Y<%lO'Y~(xP;=`<%l'Y~)QO$l~~)VO$n~~)[O{~R)cO&fP!OQ~)hO$m~R)oO&eP!PQ~)rP!Q![)u~)zS&g~!Q![)u!g!h*W#R#S)o#X#Y*W~*ZR{|*d}!O*d!Q![*j~*gP!Q![*j~*oQ&g~!Q![*j#R#S*d~*zO|~~+P[&g~!O!P)o!Q![+u!g!h*W#R#S,m#W#X-X#X#Y*W#[#]-p#a#b.U#g#h.x#k#l/Z#l#m0d#m#n/u~+zZ&g~!O!P)o!Q![+u!g!h*W#R#S,m#W#X-X#X#Y*W#[#]-p#a#b.U#g#h.x#k#l/Z#m#n/u~,pP!Q![,s~,xT&g~!O!P)o!Q![,s!g!h*W#R#S,m#X#Y*W~-^P&g~!Q![-a~-dS!Q![-a#[#]-p#a#b.U#g#h.x~-uP&g~!Q![-x~-{R!Q![-x#a#b.U#g#h.x~.ZQ&g~!Q![.a#g#h.s~.dR!Q![.a#a#b.m#g#h.x~.pP#g#h.s~.xO&g~~.}P&g~!Q![/Q~/TQ!Q![/Q#a#b.m~/`P&g~!Q![/c~/fT!Q![/c#W#X-X#[#]-p#a#b.U#g#h.x~/zP&g~!Q![/}~0QU!Q![/}#W#X-X#[#]-p#a#b.U#g#h.x#k#l/Z~0gR!Q![0p!c!i0p#T#Z0p~0uR&g~!Q![0p!c!i0p#T#Z0pV1VT&iS!ZR!Q![1f![!]1f!c!}1f#R#S1f#T#o1fR1kT!ZR!Q![1f![!]1f!c!}1f#R#S1f#T#o1f~2PP!U~!_!`2S~2XO!T~~2^Q$ZP!_!`2d#r#s2iQ2iO!QQ~2nO$[~~2sP!S~!_!`2v~2{O!R~~3QO$`~V3XT!ZRsS!Q![3Q![!]1f!c!}3Q#R#S3Q#T#o3Q~3mO&d~~3rO&h~~3wOx~~3zTO#S3w#S#T%c#T;'S3w;'S;=`4Z<%lO3w~4^P;=`<%l3w~4fO&j~~4kO&k~\",\n tokenizers: [0, 1, 2],\n topRules: {\"PromQL\":[0,30],\"MetricName\":[1,156]},\n specialized: [{term: 57, get: (value, stack) => (specializeIdentifier(value) << 1), external: specializeIdentifier},{term: 57, get: (value, stack) => (extendIdentifier(value) << 1) | 1, external: extendIdentifier, extend: true},{term: 57, get: (value) => spec_Identifier[value] || -1}],\n tokenPrec: 0\n});\n// This file was generated by lezer-generator. You probably shouldn't edit it.\nconst inf = 161,\n nan = 162,\n Bool = 1,\n Ignoring = 2,\n On = 3,\n GroupLeft = 4,\n GroupRight = 5,\n Offset = 6,\n Atan2 = 7,\n Avg = 8,\n Bottomk = 9,\n Count = 10,\n CountValues = 11,\n Group = 12,\n Max = 13,\n Min = 14,\n Quantile = 15,\n LimitK = 16,\n LimitRatio = 17,\n Stddev = 18,\n Stdvar = 19,\n Sum = 20,\n Topk = 21,\n By = 22,\n Without = 23,\n And = 24,\n Or = 25,\n Unless = 26,\n Start = 27,\n End = 28,\n LineComment = 29,\n PromQL = 30,\n AggregateExpr = 31,\n AggregateOp = 32,\n AggregateModifier = 33,\n GroupingLabels = 34,\n LabelName = 35,\n QuotedLabelName = 36,\n StringLiteral = 37,\n FunctionCallBody = 38,\n BinaryExpr = 39,\n Pow = 40,\n BoolModifier = 41,\n MatchingModifierClause = 42,\n Mul = 43,\n Div = 44,\n Mod = 45,\n Add = 46,\n Sub = 47,\n Eql = 48,\n Gte = 49,\n Gtr = 50,\n Lte = 51,\n Lss = 52,\n Neq = 53,\n FunctionCall = 54,\n FunctionIdentifier = 55,\n AbsentOverTime = 56,\n Identifier = 57,\n Absent = 58,\n Abs = 59,\n Acos = 60,\n Acosh = 61,\n Asin = 62,\n Asinh = 63,\n Atan = 64,\n Atanh = 65,\n AvgOverTime = 66,\n Ceil = 67,\n Changes = 68,\n Clamp = 69,\n ClampMax = 70,\n ClampMin = 71,\n Cos = 72,\n Cosh = 73,\n CountOverTime = 74,\n DaysInMonth = 75,\n DayOfMonth = 76,\n DayOfWeek = 77,\n DayOfYear = 78,\n Deg = 79,\n Delta = 80,\n Deriv = 81,\n Exp = 82,\n Floor = 83,\n HistogramCount = 84,\n HistogramFraction = 85,\n HistogramQuantile = 86,\n HistogramStdDev = 87,\n HistogramStdVar = 88,\n HistogramSum = 89,\n HistogramAvg = 90,\n DoubleExponentialSmoothing = 91,\n Hour = 92,\n Idelta = 93,\n Increase = 94,\n Info = 95,\n Irate = 96,\n LabelReplace = 97,\n LabelJoin = 98,\n LastOverTime = 99,\n Ln = 100,\n Log10 = 101,\n Log2 = 102,\n MadOverTime = 103,\n MaxOverTime = 104,\n MinOverTime = 105,\n TsOfMaxOverTime = 106,\n TsOfMinOverTime = 107,\n TsOfLastOverTime = 108,\n Minute = 109,\n Month = 110,\n Pi = 111,\n PredictLinear = 112,\n PresentOverTime = 113,\n QuantileOverTime = 114,\n Rad = 115,\n Rate = 116,\n Resets = 117,\n Round = 118,\n Scalar = 119,\n Sgn = 120,\n Sin = 121,\n Sinh = 122,\n Sort = 123,\n SortDesc = 124,\n SortByLabel = 125,\n SortByLabelDesc = 126,\n Sqrt = 127,\n StddevOverTime = 128,\n StdvarOverTime = 129,\n SumOverTime = 130,\n Tan = 131,\n Tanh = 132,\n Timestamp = 133,\n Time = 134,\n Vector = 135,\n Year = 136,\n MatrixSelector = 137,\n NumberDurationLiteralInDurationContext = 138,\n NumberDurationLiteral = 139,\n OffsetExpr = 140,\n ParenExpr = 141,\n SubqueryExpr = 142,\n UnaryExpr = 143,\n UnaryOp = 144,\n VectorSelector = 145,\n LabelMatchers = 146,\n UnquotedLabelMatcher = 147,\n MatchOp = 148,\n EqlSingle = 149,\n EqlRegex = 150,\n NeqRegex = 151,\n QuotedLabelMatcher = 152,\n StepInvariantExpr = 153,\n At = 154,\n AtModifierPreprocessors = 155,\n MetricName = 156;\n\nexport { Abs, Absent, AbsentOverTime, Acos, Acosh, Add, AggregateExpr, AggregateModifier, AggregateOp, And, Asin, Asinh, At, AtModifierPreprocessors, Atan, Atan2, Atanh, Avg, AvgOverTime, BinaryExpr, Bool, BoolModifier, Bottomk, By, Ceil, Changes, Clamp, ClampMax, ClampMin, Cos, Cosh, Count, CountOverTime, CountValues, DayOfMonth, DayOfWeek, DayOfYear, DaysInMonth, Deg, Delta, Deriv, Div, DoubleExponentialSmoothing, End, Eql, EqlRegex, EqlSingle, Exp, Floor, FunctionCall, FunctionCallBody, FunctionIdentifier, Group, GroupLeft, GroupRight, GroupingLabels, Gte, Gtr, HistogramAvg, HistogramCount, HistogramFraction, HistogramQuantile, HistogramStdDev, HistogramStdVar, HistogramSum, Hour, Idelta, Identifier, Ignoring, Increase, Info, Irate, LabelJoin, LabelMatchers, LabelName, LabelReplace, LastOverTime, LimitK, LimitRatio, LineComment, Ln, Log10, Log2, Lss, Lte, MadOverTime, MatchOp, MatchingModifierClause, MatrixSelector, Max, MaxOverTime, MetricName, Min, MinOverTime, Minute, Mod, Month, Mul, Neq, NeqRegex, NumberDurationLiteral, NumberDurationLiteralInDurationContext, Offset, OffsetExpr, On, Or, ParenExpr, Pi, Pow, PredictLinear, PresentOverTime, PromQL, Quantile, QuantileOverTime, QuotedLabelMatcher, QuotedLabelName, Rad, Rate, Resets, Round, Scalar, Sgn, Sin, Sinh, Sort, SortByLabel, SortByLabelDesc, SortDesc, Sqrt, Start, Stddev, StddevOverTime, Stdvar, StdvarOverTime, StepInvariantExpr, StringLiteral, Sub, SubqueryExpr, Sum, SumOverTime, Tan, Tanh, Time, Timestamp, Topk, TsOfLastOverTime, TsOfMaxOverTime, TsOfMinOverTime, UnaryExpr, UnaryOp, Unless, UnquotedLabelMatcher, Vector, VectorSelector, Without, Year, inf, nan, parser };\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/types.ts\nimport {\n QueryBuilderLabelFilter,\n QueryBuilderOperation,\n QueryBuilderOperationDef,\n VisualQueryBinary,\n} from './shared/types';\n\n/**\n * Visual query model\n */\nexport interface PromVisualQuery {\n metric: string;\n labels: QueryBuilderLabelFilter[];\n operations: QueryBuilderOperation[];\n binaryQueries?: PromVisualQueryBinary[];\n}\n\nexport interface PromQueryModellerInterface {\n renderLabels(labels: QueryBuilderLabelFilter[]): string;\n\n renderQuery(query: PromVisualQuery, nested?: boolean): string;\n\n hasBinaryOp(query: PromVisualQuery): boolean;\n\n getQueryPatterns(): PromQueryPattern[];\n\n getOperationsForCategory(category: string): QueryBuilderOperationDef[];\n\n getOperationDef(id: string): QueryBuilderOperationDef | undefined;\n\n getAlternativeOperations(key: string): QueryBuilderOperationDef[];\n\n getCategories(): string[];\n}\n\nexport type PromVisualQueryBinary = VisualQueryBinary<PromVisualQuery>;\n\nexport enum PromVisualQueryOperationCategory {\n Aggregations = 'Aggregations',\n RangeFunctions = 'Range functions',\n Functions = 'Functions',\n BinaryOps = 'Binary operations',\n Trigonometric = 'Trigonometric',\n Time = 'Time Functions',\n}\n\nexport enum PromOperationId {\n Abs = 'abs',\n Absent = 'absent',\n AbsentOverTime = 'absent_over_time',\n Acos = 'acos',\n Acosh = 'acosh',\n Asin = 'asin',\n Asinh = 'asinh',\n Atan = 'atan',\n Atanh = 'atanh',\n Avg = 'avg',\n AvgOverTime = 'avg_over_time',\n BottomK = 'bottomk',\n Ceil = 'ceil',\n Changes = 'changes',\n Clamp = 'clamp',\n ClampMax = 'clamp_max',\n ClampMin = 'clamp_min',\n Cos = 'cos',\n Cosh = 'cosh',\n Count = 'count',\n CountOverTime = 'count_over_time',\n CountScalar = 'count_scalar',\n CountValues = 'count_values',\n DayOfMonth = 'day_of_month',\n DayOfWeek = 'day_of_week',\n DayOfYear = 'day_of_year',\n DaysInMonth = 'days_in_month',\n Deg = 'deg',\n Delta = 'delta',\n Deriv = 'deriv',\n DoubleExponentialSmoothing = 'double_exponential_smoothing',\n DropCommonLabels = 'drop_common_labels',\n Exp = 'exp',\n Floor = 'floor',\n Group = 'group',\n HistogramQuantile = 'histogram_quantile',\n HistogramAvg = 'histogram_avg',\n HistogramCount = 'histogram_count',\n HistogramSum = 'histogram_sum',\n HistogramFraction = 'histogram_fraction',\n HistogramStddev = 'histogram_stddev',\n HistogramStdvar = 'histogram_stdvar',\n // Renamed as DoubleExponentialSmoothing with Prometheus v3.x\n // https://github.com/prometheus/prometheus/pull/14930\n HoltWinters = 'holt_winters',\n Hour = 'hour',\n Idelta = 'idelta',\n Increase = 'increase',\n Info = 'info',\n Irate = 'irate',\n LabelJoin = 'label_join',\n LabelReplace = 'label_replace',\n Last = 'last',\n LastOverTime = 'last_over_time',\n LimitK = 'limitk',\n LimitRatio = 'limit_ratio',\n Ln = 'ln',\n Log10 = 'log10',\n Log2 = 'log2',\n Max = 'max',\n MaxOverTime = 'max_over_time',\n Min = 'min',\n MinOverTime = 'min_over_time',\n Minute = 'minute',\n Month = 'month',\n Pi = 'pi',\n PredictLinear = 'predict_linear',\n Present = 'present',\n PresentOverTime = 'present_over_time',\n Quantile = 'quantile',\n QuantileOverTime = 'quantile_over_time',\n Rad = 'rad',\n Rate = 'rate',\n Resets = 'resets',\n Round = 'round',\n Scalar = 'scalar',\n Sgn = 'sgn',\n Sin = 'sin',\n Sinh = 'sinh',\n Sort = 'sort',\n SortDesc = 'sort_desc',\n Sqrt = 'sqrt',\n Stddev = 'stddev',\n StddevOverTime = 'stddev_over_time',\n Stdvar = 'stdvar',\n Sum = 'sum',\n SumOverTime = 'sum_over_time',\n Tan = 'tan',\n Tanh = 'tanh',\n Time = 'time',\n Timestamp = 'timestamp',\n TopK = 'topk',\n Vector = 'vector',\n Year = 'year',\n // Binary ops\n Addition = '__addition',\n Subtraction = '__subtraction',\n MultiplyBy = '__multiply_by',\n DivideBy = '__divide_by',\n Modulo = '__modulo',\n Exponent = '__exponent',\n NestedQuery = '__nested_query',\n EqualTo = '__equal_to',\n NotEqualTo = '__not_equal_to',\n GreaterThan = '__greater_than',\n LessThan = '__less_than',\n GreaterOrEqual = '__greater_or_equal',\n LessOrEqual = '__less_or_equal',\n}\n\nexport enum PromQueryPatternType {\n Rate = 'rate',\n Histogram = 'histogram',\n Binary = 'binary',\n}\n\nexport interface PromQueryPattern {\n name: string;\n operations: QueryBuilderOperation[];\n type: PromQueryPatternType;\n binaryQueries?: PromVisualQueryBinary[];\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/operationUtils.ts\nimport { capitalize } from 'lodash';\nimport pluralize from 'pluralize';\n\nimport { SelectableValue } from '@grafana/data';\nimport { t } from '@grafana/i18n';\n\nimport {\n QueryBuilderLabelFilter,\n QueryBuilderOperation,\n QueryBuilderOperationDef,\n QueryBuilderOperationParamDef,\n QueryBuilderOperationParamValue,\n QueryWithOperations,\n} from './shared/types';\nimport { PromVisualQueryOperationCategory } from './types';\n\nexport function functionRendererLeft(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n const params = renderParams(model, def, innerExpr);\n const str = model.id + '(';\n\n if (innerExpr) {\n params.push(innerExpr);\n }\n\n return str + params.join(', ') + ')';\n}\n\nexport function functionRendererRight(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n const params = renderParams(model, def, innerExpr);\n const str = model.id + '(';\n\n if (innerExpr) {\n params.unshift(innerExpr);\n }\n\n return str + params.join(', ') + ')';\n}\n\nfunction rangeRendererWithParams(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDef,\n innerExpr: string,\n renderLeft: boolean\n) {\n if (def.params.length < 2) {\n throw `Cannot render a function with params of length [${def.params.length}]`;\n }\n\n let rangeVector = (model.params ?? [])[0] ?? '5m';\n\n // Next frame the remaining parameters, but get rid of the first one because it's used to move the\n // instant vector into a range vector.\n const params = renderParams(\n {\n ...model,\n params: model.params.slice(1),\n },\n {\n ...def,\n params: def.params.slice(1),\n defaultParams: def.defaultParams.slice(1),\n },\n innerExpr\n );\n\n const str = model.id + '(';\n\n // Depending on the renderLeft variable, render parameters to the left or right\n // renderLeft === true (renderLeft) => (param1, param2, rangeVector[...])\n // renderLeft === false (renderRight) => (rangeVector[...], param1, param2)\n if (innerExpr) {\n renderLeft ? params.push(`${innerExpr}[${rangeVector}]`) : params.unshift(`${innerExpr}[${rangeVector}]`);\n }\n\n // stick everything together\n return str + params.join(', ') + ')';\n}\n\nexport function rangeRendererRightWithParams(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDef,\n innerExpr: string\n) {\n return rangeRendererWithParams(model, def, innerExpr, false);\n}\n\nexport function rangeRendererLeftWithParams(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDef,\n innerExpr: string\n) {\n return rangeRendererWithParams(model, def, innerExpr, true);\n}\n\nfunction renderParams(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n return (model.params ?? []).map((value, index) => {\n const paramDef = def.params[index];\n if (paramDef?.type === 'string') {\n return `\"${value}\"`;\n }\n\n return value;\n });\n}\n\nexport function defaultAddOperationHandler<T extends QueryWithOperations>(def: QueryBuilderOperationDef, query: T) {\n const newOperation: QueryBuilderOperation = {\n id: def.id,\n params: def.defaultParams,\n };\n\n return {\n ...query,\n operations: [...query.operations, newOperation],\n };\n}\n\nexport function getPromOperationDisplayName(funcName: string) {\n return capitalize(funcName.replace(/_/g, ' '));\n}\n\nexport function getRangeVectorParamDef(withRateInterval = false): QueryBuilderOperationParamDef {\n /* eslint-disable @grafana/i18n/no-untranslated-strings */\n const options: Array<SelectableValue<string>> = [\n {\n label: '$__interval',\n value: '$__interval',\n // tooltip: 'Dynamic interval based on max data points, scrape and min interval',\n },\n { label: '1m', value: '1m' },\n { label: '5m', value: '5m' },\n { label: '10m', value: '10m' },\n { label: '1h', value: '1h' },\n { label: '24h', value: '24h' },\n ];\n\n if (withRateInterval) {\n options.unshift({\n label: '$__rate_interval',\n value: '$__rate_interval',\n // tooltip: 'Always above 4x scrape interval',\n });\n }\n /* eslint-enable @grafana/i18n/no-untranslated-strings */\n\n const param: QueryBuilderOperationParamDef = {\n name: 'Range',\n type: 'string',\n options,\n };\n\n return param;\n}\n\nexport function createAggregationOperation(\n name: string,\n overrides: Partial<QueryBuilderOperationDef> = {}\n): QueryBuilderOperationDef[] {\n const operations: QueryBuilderOperationDef[] = [\n {\n id: name,\n name: getPromOperationDisplayName(name),\n params: [\n {\n name: 'By label',\n type: 'string',\n restParam: true,\n optional: true,\n },\n ],\n defaultParams: [],\n alternativesKey: 'plain aggregations',\n category: PromVisualQueryOperationCategory.Aggregations,\n renderer: functionRendererLeft,\n paramChangedHandler: getOnLabelAddedHandler(`__${name}_by`),\n explainHandler: getAggregationExplainer(name, ''),\n addOperationHandler: defaultAddOperationHandler,\n ...overrides,\n },\n {\n id: `__${name}_by`,\n name: `${getPromOperationDisplayName(name)} by`,\n params: [\n {\n name: 'Label',\n type: 'string',\n restParam: true,\n optional: true,\n editor: 'LabelParamEditor',\n },\n ],\n defaultParams: [''],\n alternativesKey: 'aggregations by',\n category: PromVisualQueryOperationCategory.Aggregations,\n renderer: getAggregationByRenderer(name),\n paramChangedHandler: getLastLabelRemovedHandler(name),\n explainHandler: getAggregationExplainer(name, 'by'),\n addOperationHandler: defaultAddOperationHandler,\n hideFromList: true,\n ...overrides,\n },\n {\n id: `__${name}_without`,\n name: `${getPromOperationDisplayName(name)} without`,\n params: [\n {\n name: 'Label',\n type: 'string',\n restParam: true,\n optional: true,\n editor: 'LabelParamEditor',\n },\n ],\n defaultParams: [''],\n alternativesKey: 'aggregations by',\n category: PromVisualQueryOperationCategory.Aggregations,\n renderer: getAggregationWithoutRenderer(name),\n paramChangedHandler: getLastLabelRemovedHandler(name),\n explainHandler: getAggregationExplainer(name, 'without'),\n addOperationHandler: defaultAddOperationHandler,\n hideFromList: true,\n ...overrides,\n },\n ];\n\n return operations;\n}\n\nexport function createAggregationOperationWithParam(\n name: string,\n paramsDef: { params: QueryBuilderOperationParamDef[]; defaultParams: QueryBuilderOperationParamValue[] },\n overrides: Partial<QueryBuilderOperationDef> = {}\n): QueryBuilderOperationDef[] {\n const operations = createAggregationOperation(name, overrides);\n operations[0].params.unshift(...paramsDef.params);\n operations[1].params.unshift(...paramsDef.params);\n operations[2].params.unshift(...paramsDef.params);\n operations[0].defaultParams = paramsDef.defaultParams;\n operations[1].defaultParams = [...paramsDef.defaultParams, ''];\n operations[2].defaultParams = [...paramsDef.defaultParams, ''];\n operations[1].renderer = getAggregationByRendererWithParameter(name);\n operations[2].renderer = getAggregationByRendererWithParameter(name);\n return operations;\n}\n\nexport function getAggregationByRenderer(aggregation: string) {\n return function aggregationRenderer(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n return `${aggregation} by(${model.params.join(', ')}) (${innerExpr})`;\n };\n}\n\nfunction getAggregationWithoutRenderer(aggregation: string) {\n return function aggregationRenderer(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n return `${aggregation} without(${model.params.join(', ')}) (${innerExpr})`;\n };\n}\n\n/**\n * Very simple poc implementation, needs to be modified to support all aggregation operators\n */\nexport function getAggregationExplainer(aggregationName: string, mode: 'by' | 'without' | '') {\n return function aggregationExplainer(model: QueryBuilderOperation) {\n const labels = model.params.map((label) => `\\`${label}\\``).join(' and ');\n const labelWord = pluralize('label', model.params.length);\n\n switch (mode) {\n case 'by':\n return t(\n 'grafana-prometheus.querybuilder.operation-utils.getAggregationExplainer.label-by',\n 'Calculates {{aggregationName}} over dimensions while preserving {{labelWord}} {{labels}}.',\n { aggregationName, labelWord, labels }\n );\n case 'without':\n return t(\n 'grafana-prometheus.querybuilder.operation-utils.getAggregationExplainer.label-without',\n 'Calculates {{aggregationName}} over the dimensions {{labels}}. All other labels are preserved.',\n { aggregationName, labels }\n );\n default:\n return t(\n 'grafana-prometheus.querybuilder.operation-utils.getAggregationExplainer.label-default',\n 'Calculates {{aggregationName}} over the dimensions.',\n { aggregationName }\n );\n }\n };\n}\n\nfunction getAggregationByRendererWithParameter(aggregation: string) {\n return function aggregationRenderer(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n const restParamIndex = def.params.findIndex((param) => param.restParam);\n const params = model.params.slice(0, restParamIndex);\n const restParams = model.params.slice(restParamIndex);\n\n return `${aggregation} by(${restParams.join(', ')}) (${params\n .map((param, idx) => (def.params[idx].type === 'string' ? `\\\"${param}\\\"` : param))\n .join(', ')}, ${innerExpr})`;\n };\n}\n\n/**\n * This function will transform operations without labels to their plan aggregation operation\n */\nexport function getLastLabelRemovedHandler(changeToOperationId: string) {\n return function onParamChanged(index: number, op: QueryBuilderOperation, def: QueryBuilderOperationDef) {\n // If definition has more params then is defined there are no optional rest params anymore.\n // We then transform this operation into a different one\n if (op.params.length < def.params.length) {\n return {\n ...op,\n id: changeToOperationId,\n };\n }\n\n return op;\n };\n}\n\nexport function getOnLabelAddedHandler(changeToOperationId: string) {\n return function onParamChanged(index: number, op: QueryBuilderOperation, def: QueryBuilderOperationDef) {\n // Check if we actually have the label param. As it's optional the aggregation can have one less, which is the\n // case of just simple aggregation without label. When user adds the label it now has the same number of params\n // as its definition, and now we can change it to its `_by` variant.\n if (op.params.length === def.params.length) {\n return {\n ...op,\n id: changeToOperationId,\n };\n }\n return op;\n };\n}\n\nexport function isConflictingSelector(\n newLabel: Partial<QueryBuilderLabelFilter>,\n labels: Array<Partial<QueryBuilderLabelFilter>>\n): boolean {\n if (!newLabel.label || !newLabel.op || !newLabel.value) {\n return false;\n }\n\n if (labels.length < 2) {\n return false;\n }\n\n const operationIsNegative = newLabel.op.toString().startsWith('!');\n\n const candidates = labels.filter(\n (label) => label.label === newLabel.label && label.value === newLabel.value && label.op !== newLabel.op\n );\n\n const conflict = candidates.some((candidate) => {\n if (operationIsNegative && candidate?.op?.toString().startsWith('!') === false) {\n return true;\n }\n if (operationIsNegative === false && candidate?.op?.toString().startsWith('!')) {\n return true;\n }\n return false;\n });\n\n return conflict;\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/binaryScalarOperations.ts\nimport { defaultAddOperationHandler } from './operationUtils';\nimport { QueryBuilderOperation, QueryBuilderOperationDef, QueryBuilderOperationParamDef } from './shared/types';\nimport { PromOperationId, PromVisualQueryOperationCategory } from './types';\n\nexport const binaryScalarDefs = [\n {\n id: PromOperationId.Addition,\n name: 'Add scalar',\n sign: '+',\n },\n {\n id: PromOperationId.Subtraction,\n name: 'Subtract scalar',\n sign: '-',\n },\n {\n id: PromOperationId.MultiplyBy,\n name: 'Multiply by scalar',\n sign: '*',\n },\n {\n id: PromOperationId.DivideBy,\n name: 'Divide by scalar',\n sign: '/',\n },\n {\n id: PromOperationId.Modulo,\n name: 'Modulo by scalar',\n sign: '%',\n },\n {\n id: PromOperationId.Exponent,\n name: 'Exponent',\n sign: '^',\n },\n {\n id: PromOperationId.EqualTo,\n name: 'Equal to',\n sign: '==',\n comparison: true,\n },\n {\n id: PromOperationId.NotEqualTo,\n name: 'Not equal to',\n sign: '!=',\n comparison: true,\n },\n {\n id: PromOperationId.GreaterThan,\n name: 'Greater than',\n sign: '>',\n comparison: true,\n },\n {\n id: PromOperationId.LessThan,\n name: 'Less than',\n sign: '<',\n comparison: true,\n },\n {\n id: PromOperationId.GreaterOrEqual,\n name: 'Greater or equal to',\n sign: '>=',\n comparison: true,\n },\n {\n id: PromOperationId.LessOrEqual,\n name: 'Less or equal to',\n sign: '<=',\n comparison: true,\n },\n];\n\nexport const binaryScalarOperatorToOperatorName = binaryScalarDefs.reduce<\n Record<string, { id: string; comparison?: boolean }>\n>((acc, def) => {\n acc[def.sign] = {\n id: def.id,\n comparison: def.comparison,\n };\n return acc;\n}, {});\n\n// Not sure about this one. It could also be a more generic 'Simple math operation' where user specifies\n// both the operator and the operand in a single input\nexport const binaryScalarOperations: QueryBuilderOperationDef[] = binaryScalarDefs.map((opDef) => {\n const params: QueryBuilderOperationParamDef[] = [{ name: 'Value', type: 'number' }];\n let defaultParams: [number] | [number, boolean] = [2];\n if (opDef.comparison) {\n params.push({\n name: 'Bool',\n type: 'boolean',\n description: 'If checked comparison will return 0 or 1 for the value rather than filtering.',\n });\n defaultParams = [2, false];\n }\n\n return {\n id: opDef.id,\n name: opDef.name,\n params,\n defaultParams,\n alternativesKey: 'binary scalar operations',\n category: PromVisualQueryOperationCategory.BinaryOps,\n renderer: getSimpleBinaryRenderer(opDef.sign),\n addOperationHandler: defaultAddOperationHandler,\n };\n});\n\nfunction getSimpleBinaryRenderer(operator: string) {\n return function binaryRenderer(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n let param = model.params[0];\n let bool = '';\n if (model.params.length === 2) {\n bool = model.params[1] ? ' bool' : '';\n }\n\n return `${innerExpr} ${operator}${bool} ${param}`;\n };\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/parsingUtils.ts\nimport { SyntaxNode, TreeCursor } from '@lezer/common';\nimport { AggregateExpr, FunctionCallBody } from '@prometheus-io/lezer-promql';\n\nimport { QueryBuilderOperation, QueryBuilderOperationParamValue } from './shared/types';\n\n// Although 0 isn't explicitly provided in the lezer-promql library as the error node ID, it does appear to be the ID of error nodes within lezer.\nexport const ErrorId = 0;\n\nexport function getLeftMostChild(cur: SyntaxNode): SyntaxNode {\n return cur.firstChild ? getLeftMostChild(cur.firstChild) : cur;\n}\n\nexport function makeError(expr: string, node: SyntaxNode) {\n return {\n text: getString(expr, node),\n // TODO: this are positions in the string with the replaced variables. Means it cannot be used to show exact\n // placement of the error for the user. We need some translation table to positions before the variable\n // replace.\n from: node.from,\n to: node.to,\n parentType: node.parent?.name,\n };\n}\n\n// Taken from template_srv, but copied so to not mess with the regex.index which is manipulated in the service\n/*\n * This regex matches 3 types of variable reference with an optional format specifier\n * \\$(\\w+) $var1\n * \\[\\[([\\s\\S]+?)(?::(\\w+))?\\]\\] [[var2]] or [[var2:fmt2]]\n * \\${(\\w+)(?::(\\w+))?} ${var3} or ${var3:fmt3}\n */\nconst variableRegex = /\\$(\\w+)|\\[\\[([\\s\\S]+?)(?::(\\w+))?\\]\\]|\\${(\\w+)(?:\\.([^:^\\}]+))?(?::([^\\}]+))?}/g;\n\n/**\n * As variables with $ are creating parsing errors, we first replace them with magic string that is\n * parsable and at the same time we can get the variable and its format back from it.\n */\nexport function replaceVariables(expr: string) {\n const replacedVariables: Record<string, string> = {};\n const replacedExpr = expr.replace(variableRegex, (match, var1, var2, fmt2, var3, fieldPath, fmt3) => {\n const fmt = fmt2 || fmt3;\n let variable = var1;\n let varType = '0';\n\n if (var2) {\n variable = var2;\n varType = '1';\n }\n\n if (var3) {\n variable = var3;\n varType = '2';\n }\n\n const replacement = `__V_${varType}__` + variable + '__V__' + (fmt ? '__F__' + fmt + '__F__' : '');\n replacedVariables[replacement] = match;\n return replacement;\n });\n\n return { replacedExpr, replacedVariables };\n}\n\nconst varTypeFunc = [\n (v: string, f?: string) => `\\$${v}`,\n (v: string, f?: string) => `[[${v}${f ? `:${f}` : ''}]]`,\n (v: string, f?: string) => `\\$\\{${v}${f ? `:${f}` : ''}\\}`,\n];\n\n/**\n * Get back the text with variables in their original format.\n * @param expr\n */\nfunction returnVariables(expr: string) {\n return expr.replace(/__V_(\\d)__(.+?)__V__(?:__F__(\\w+)__F__)?/g, (match, type, v, f) => {\n return varTypeFunc[parseInt(type, 10)](v, f);\n });\n}\n\n/**\n * Get the actual string of the expression. That is not stored in the tree so we have to get the indexes from the node\n * and then based on that get it from the expression.\n * @param expr\n * @param node\n */\nexport function getString(expr: string, node: SyntaxNode | TreeCursor | null | undefined) {\n if (!node) {\n return '';\n }\n return returnVariables(expr.substring(node.from, node.to));\n}\n\n/**\n * Create simple scalar binary op object.\n * @param opDef - definition of the op to be created\n * @param expr\n * @param numberNode - the node for the scalar\n * @param hasBool - whether operation has a bool modifier. Is used only for ops for which it makes sense.\n */\nexport function makeBinOp(\n opDef: { id: string; comparison?: boolean },\n expr: string,\n numberNode: SyntaxNode,\n hasBool: boolean\n): QueryBuilderOperation {\n const params: QueryBuilderOperationParamValue[] = [parseFloat(getString(expr, numberNode))];\n if (opDef.comparison) {\n params.push(hasBool);\n }\n return {\n id: opDef.id,\n params,\n };\n}\n\n/**\n * Get all nodes with type in the tree. This traverses the tree so it is safe only when you know there shouldn't be\n * too much nesting but you just want to skip some of the wrappers. For example getting function args this way would\n * not be safe is it would also find arguments of nested functions.\n * @param expr\n * @param cur\n * @param type\n */\nexport function getAllByType(expr: string, cur: SyntaxNode, type: number): string[] {\n if (cur.type.id === type) {\n return [getString(expr, cur)];\n }\n const values: string[] = [];\n let pos = 0;\n let child = cur.childAfter(pos);\n while (child) {\n values.push(...getAllByType(expr, child, type));\n pos = child.to;\n child = cur.childAfter(pos);\n }\n return values;\n}\n\n/**\n * There aren't any spaces in the metric names, so let's introduce a wildcard into the regex for each space to better facilitate a fuzzy search\n */\nexport const regexifyLabelValuesQueryString = (query: string) => {\n const queryArray = query.split(' ');\n return queryArray.map((query) => `${query}.*`).join('');\n};\n\n/**\n * Built-in Grafana variables used for time ranges and intervals in Prometheus queries\n * Each variable has a carefully crafted numeric replacement that:\n * 1. Has exactly the same string length as the original variable\n * 2. Is valid in Prometheus syntax to avoid parsing errors\n * 3. Preserves error position information for accurate error reporting\n * 4. Uses readable number formatting with digit grouping via underscores\n * https://prometheus.io/docs/prometheus/latest/querying/basics/#float-literals-and-time-durations\n */\nconst BUILT_IN_VARIABLES = [\n { variable: '$__interval_ms', replacement: '79_999_999_999' },\n { variable: '$__interval', replacement: '711_999_999' },\n { variable: '$__rate_interval', replacement: '7999799979997999' },\n { variable: '$__range_ms', replacement: '722_999_999' },\n { variable: '$__range_s', replacement: '79_299_999' },\n { variable: '$__range', replacement: '799_999' },\n];\n\n// Derived maps for efficient lookups\nconst variableToReplacement = BUILT_IN_VARIABLES.reduce<Record<string, string>>((map, { variable, replacement }) => {\n map[variable] = replacement;\n return map;\n}, {});\n\nconst replacementToVariable = BUILT_IN_VARIABLES.reduce<Record<string, string>>((map, { variable, replacement }) => {\n map[replacement] = variable;\n return map;\n}, {});\n\n// Pre-compiled regular expressions for efficient search/replace\nconst builtInVariablePattern = BUILT_IN_VARIABLES.map(({ variable }) => variable.replace(/\\$/g, '\\\\$')).join('|');\nconst builtInVariableRegex = new RegExp(builtInVariablePattern, 'g');\n\nconst builtInReplacementPattern = BUILT_IN_VARIABLES.map(({ replacement }) => replacement).join('|');\nconst builtInReplacementRegex = new RegExp(builtInReplacementPattern, 'g');\n\n/**\n * Replaces Grafana built-in variables with numeric replacements\n * This helps prevent these variables from causing parsing errors\n */\nexport function replaceBuiltInVariable(expr: string): string {\n return expr.replace(builtInVariableRegex, (match) => variableToReplacement[match]);\n}\n\n/**\n * Restores the original built-in variables from their replacement format\n * Reverses the transformation done by replaceBuiltInVariable\n */\nexport function returnBuiltInVariable(expr: string): string {\n return expr.replace(builtInReplacementRegex, (match) => replacementToVariable[match]);\n}\n\nexport function isFunctionOrAggregation(node: SyntaxNode): boolean {\n return node.type.id === AggregateExpr || node.type.id === FunctionCallBody;\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/parsing.ts\nimport { SyntaxNode } from '@lezer/common';\nimport {\n AggregateExpr,\n AggregateModifier,\n AggregateOp,\n BinaryExpr,\n BoolModifier,\n FunctionCall,\n FunctionCallBody,\n FunctionIdentifier,\n GroupingLabels,\n Identifier,\n LabelName,\n QuotedLabelName,\n MatchingModifierClause,\n MatchOp,\n NumberDurationLiteral,\n On,\n ParenExpr,\n parser,\n StringLiteral,\n QuotedLabelMatcher,\n UnquotedLabelMatcher,\n VectorSelector,\n Without,\n} from '@prometheus-io/lezer-promql';\n\nimport { t } from '@grafana/i18n';\n\nimport { binaryScalarOperatorToOperatorName } from './binaryScalarOperations';\nimport {\n ErrorId,\n getAllByType,\n getLeftMostChild,\n getString,\n isFunctionOrAggregation,\n makeBinOp,\n makeError,\n replaceBuiltInVariable,\n replaceVariables,\n returnBuiltInVariable,\n} from './parsingUtils';\nimport { QueryBuilderLabelFilter, QueryBuilderOperation } from './shared/types';\nimport { PromVisualQuery, PromVisualQueryBinary } from './types';\n\n/**\n * Parses a PromQL query into a visual query model.\n *\n * It traverses the tree and uses sort of state machine to update the query model.\n * The query model is modified during the traversal and sent to each handler as context.\n */\nexport function buildVisualQueryFromString(expr: string): Omit<Context, 'replacements'> {\n expr = replaceBuiltInVariable(expr);\n const { replacedExpr, replacedVariables } = replaceVariables(expr);\n const tree = parser.parse(replacedExpr);\n const node = tree.topNode;\n\n // This will be modified in the handlers.\n const visQuery: PromVisualQuery = {\n metric: '',\n labels: [],\n operations: [],\n };\n const context: Context = {\n query: visQuery,\n errors: [],\n replacements: replacedVariables,\n };\n\n try {\n handleExpression(replacedExpr, node, context);\n } catch (err) {\n // Not ideal to log it here, but otherwise we would lose the stack trace.\n console.error(err);\n if (err instanceof Error) {\n context.errors.push({\n text: err.message,\n });\n }\n }\n\n // If we have empty query, we want to reset errors\n if (isEmptyQuery(context.query)) {\n context.errors = [];\n }\n\n // No need to return replaced variables\n delete context.replacements;\n\n return context;\n}\n\ninterface ParsingError {\n text: string;\n from?: number;\n to?: number;\n parentType?: string;\n}\n\ninterface Context {\n query: PromVisualQuery;\n errors: ParsingError[];\n replacements?: Record<string, string>;\n}\n\n/**\n * Handler for default state. It will traverse the tree and call the appropriate handler for each node. The node\n * handled here does not necessarily need to be of type == Expr.\n * @param expr\n * @param node\n * @param context\n */\nfunction handleExpression(expr: string, node: SyntaxNode, context: Context) {\n const visQuery = context.query;\n\n switch (node.type.id) {\n case Identifier: {\n // Expectation is that there is only one of those per query.\n visQuery.metric = getString(expr, node);\n break;\n }\n\n case QuotedLabelName: {\n // Usually we got the metric name above in the Identifier case.\n // If we didn't get the name that's potentially we have it in curly braces as quoted string.\n // It must be quoted because that's how utf8 metric names should be defined\n // See proposal https://github.com/prometheus/proposals/blob/main/proposals/2023-08-21-utf8.md\n if (visQuery.metric === '') {\n const strLiteral = node.getChild(StringLiteral);\n const quotedMetric = getString(expr, strLiteral);\n visQuery.metric = quotedMetric.slice(1, -1);\n }\n break;\n }\n\n case QuotedLabelMatcher: {\n const quotedLabel = getLabel(expr, node, QuotedLabelName);\n quotedLabel.label = quotedLabel.label.slice(1, -1);\n visQuery.labels.push(quotedLabel);\n const err = node.getChild(ErrorId);\n if (err) {\n context.errors.push(makeError(expr, err));\n }\n break;\n }\n\n case UnquotedLabelMatcher: {\n // Same as MetricIdentifier should be just one per query.\n visQuery.labels.push(getLabel(expr, node, LabelName));\n const err = node.getChild(ErrorId);\n if (err) {\n context.errors.push(makeError(expr, err));\n }\n break;\n }\n\n case FunctionCall: {\n handleFunction(expr, node, context);\n break;\n }\n\n case AggregateExpr: {\n handleAggregation(expr, node, context);\n break;\n }\n\n case BinaryExpr: {\n handleBinary(expr, node, context);\n break;\n }\n\n case ErrorId: {\n if (isIntervalVariableError(node)) {\n break;\n }\n context.errors.push(makeError(expr, node));\n break;\n }\n\n default: {\n if (node.type.id === ParenExpr) {\n // We don't support parenthesis in the query to group expressions.\n // We just report error but go on with the parsing.\n context.errors.push(makeError(expr, node));\n }\n // Any other nodes we just ignore and go to its children. This should be fine as there are lots of wrapper\n // nodes that can be skipped.\n // TODO: there are probably cases where we will just skip nodes we don't support and we should be able to\n // detect those and report back.\n let child = node.firstChild;\n while (child) {\n handleExpression(expr, child, context);\n child = child.nextSibling;\n }\n }\n }\n}\n\n// TODO check if we still need this\nfunction isIntervalVariableError(node: SyntaxNode) {\n return node.prevSibling?.firstChild?.type.id === VectorSelector;\n}\n\nfunction getLabel(\n expr: string,\n node: SyntaxNode,\n labelType: typeof LabelName | typeof QuotedLabelName\n): QueryBuilderLabelFilter {\n const label = getString(expr, node.getChild(labelType));\n const op = getString(expr, node.getChild(MatchOp));\n const value = getString(expr, node.getChild(StringLiteral)).replace(/^[\"'`]|[\"'`]$/g, '');\n return {\n label,\n op,\n value,\n };\n}\n\nconst rangeFunctions = ['changes', 'rate', 'irate', 'increase', 'delta'];\n\n/**\n * Handle function call which is usually and identifier and its body > arguments.\n * @param expr\n * @param node\n * @param context\n */\nfunction handleFunction(expr: string, node: SyntaxNode, context: Context) {\n const visQuery = context.query;\n const nameNode = node.getChild(FunctionIdentifier);\n const funcName = getString(expr, nameNode);\n\n // Visual query builder doesn't support nested queries and so info function.\n if (funcName === 'info') {\n context.errors.push({\n text: t(\n 'grafana-prometheus.querybuilder.handle-function.text.query-parsing-is-ambiguous',\n 'Query parsing is ambiguous.'\n ),\n from: node.from,\n to: node.to,\n });\n }\n\n const body = node.getChild(FunctionCallBody);\n const params = [];\n let interval = '';\n\n // This is a bit of a shortcut to get the interval argument. Reasons are\n // - interval is not part of the function args per promQL grammar but we model it as argument for the function in\n // the query model.\n // - it is easier to handle template variables this way as template variable is an error for the parser\n if (rangeFunctions.includes(funcName) || funcName.endsWith('_over_time')) {\n let match = getString(expr, node).match(/\\[(.+)\\]/);\n if (match?.[1]) {\n interval = match[1];\n // We were replaced the builtin variables to prevent errors\n // Here we return those back\n params.push(returnBuiltInVariable(match[1]));\n }\n }\n\n const op = { id: funcName, params };\n // We unshift operations to keep the more natural order that we want to have in the visual query editor.\n visQuery.operations.unshift(op);\n\n if (body) {\n if (getString(expr, body) === '([' + interval + '])') {\n // This is a special case where we have a function with a single argument and it is the interval.\n // This happens when you start adding operations in query builder and did not set a metric yet.\n return;\n }\n updateFunctionArgs(expr, body, context, op);\n }\n}\n\n/**\n * Handle aggregation as they are distinct type from other functions.\n * @param expr\n * @param node\n * @param context\n */\nfunction handleAggregation(expr: string, node: SyntaxNode, context: Context) {\n const visQuery = context.query;\n const nameNode = node.getChild(AggregateOp);\n let funcName = getString(expr, nameNode);\n\n const modifier = node.getChild(AggregateModifier);\n const labels = [];\n\n if (modifier) {\n const byModifier = modifier.getChild(`By`);\n if (byModifier && funcName) {\n funcName = `__${funcName}_by`;\n }\n\n const withoutModifier = modifier.getChild(Without);\n if (withoutModifier) {\n funcName = `__${funcName}_without`;\n }\n\n labels.push(...getAllByType(expr, modifier, LabelName), ...getAllByType(expr, modifier, QuotedLabelName));\n }\n\n const body = node.getChild(FunctionCallBody);\n\n const op: QueryBuilderOperation = { id: funcName, params: [] };\n visQuery.operations.unshift(op);\n updateFunctionArgs(expr, body, context, op);\n // We add labels after params in the visual query editor.\n op.params.push(...labels);\n}\n\n/**\n * Handle (probably) all types of arguments that function or aggregation can have.\n *\n * We cannot just get all the children and iterate them as arguments we have to again recursively traverse through\n * them.\n *\n * @param expr\n * @param node\n * @param context\n * @param op - We need the operation to add the params to as an additional context.\n */\nfunction updateFunctionArgs(expr: string, node: SyntaxNode | null, context: Context, op: QueryBuilderOperation) {\n if (!node) {\n return;\n }\n switch (node.type.id) {\n case FunctionCallBody: {\n let child = node.firstChild;\n\n while (child) {\n updateFunctionArgs(expr, child, context, op);\n child = child.nextSibling;\n }\n break;\n }\n\n case NumberDurationLiteral: {\n op.params.push(parseFloat(getString(expr, node)));\n break;\n }\n\n case StringLiteral: {\n op.params.push(getString(expr, node).replace(/\"/g, ''));\n break;\n }\n\n case VectorSelector: {\n // When we replace a custom variable to prevent errors during parsing we receive VectorSelector and Identifier in it.\n // But this is also a normal case for a normal function body. i.e. topk(5, http_requests_total{})\n // In such cases we got identifier as http_requests_total. So we shouldn't push this as param.\n // So we check whether the given VectorSelector is something we replaced earlier.\n if (context.replacements?.[expr.substring(node.from, node.to)]) {\n const identifierNode = node.getChild(Identifier);\n const customVarName = getString(expr, identifierNode);\n op.params.push(customVarName);\n break;\n }\n }\n\n default: {\n // Means we get to something that does not seem like simple function arg and is probably nested query so jump\n // back to main context\n handleExpression(expr, node, context);\n }\n }\n}\n\n/**\n * Right now binary expressions can be represented in 2 way in visual query. As additional operation in case it is\n * just operation with scalar or it creates a binaryQuery when it's 2 queries.\n * @param expr\n * @param node\n * @param context\n */\nfunction handleBinary(expr: string, node: SyntaxNode, context: Context, idx = 0) {\n const visQuery = context.query;\n const left = node.firstChild!;\n const op = getString(expr, left.nextSibling);\n const binModifier = getBinaryModifier(expr, node.getChild(BoolModifier) ?? node.getChild(MatchingModifierClause));\n\n const right = node.lastChild!;\n\n const opDef = binaryScalarOperatorToOperatorName[op];\n\n const leftNumber = left.type.id === NumberDurationLiteral;\n const rightNumber = right.type.id === NumberDurationLiteral;\n\n const rightBinary = right.type.id === BinaryExpr;\n\n // binary operations that are part of a function argument do not get processed and added to the query until the end, this index helps keep track\n // of where to add the operation in the list rather than just appending it to the end. If the binary operation is just part of a nested binary exp,\n // we append at the end\n const parent = node.parent;\n const child = node.firstChild;\n const shouldOffsetTail =\n parent && !parent.type.isTop && (isFunctionOrAggregation(parent) || (child && isFunctionOrAggregation(child)));\n if (shouldOffsetTail) {\n idx += 1;\n }\n if (leftNumber) {\n // TODO: this should be already handled in case parent is binary expression as it has to be added to parent\n // if query starts with a number that isn't handled now.\n } else {\n // If this is binary we don't really know if there is a query or just chained scalars. So\n // we have to traverse a bit deeper to know\n handleExpression(expr, left, context);\n }\n\n // in the case we have an expression like func(...) / 2 or func(...) + 5, the binary expression will be at the top of the tree\n // in which case, the idx will be 0. In this case it means that the binary operation must be added to the end of the array, and\n\n const newIdx = idx === 0 ? visQuery.operations.length : -idx;\n if (rightNumber) {\n visQuery.operations.splice(newIdx, 0, makeBinOp(opDef, expr, right, !!binModifier?.isBool));\n } else if (rightBinary) {\n // Due to the way binary ops are parsed we can get a binary operation on the right that starts with a number which\n // is a factor for a current binary operation. So we have to add it as an operation now.\n const leftMostChild = getLeftMostChild(right);\n if (leftMostChild?.type.id === NumberDurationLiteral) {\n visQuery.operations.splice(newIdx, 0, makeBinOp(opDef, expr, leftMostChild, !!binModifier?.isBool));\n }\n\n // If we added the first number literal as operation here we still can continue and handle the rest as the first\n // number will be just skipped.\n handleExpression(expr, right, context);\n } else {\n visQuery.binaryQueries = visQuery.binaryQueries || [];\n const binQuery: PromVisualQueryBinary = {\n operator: op,\n query: {\n metric: '',\n labels: [],\n operations: [],\n },\n };\n if (binModifier?.isMatcher) {\n binQuery.vectorMatchesType = binModifier.matchType;\n binQuery.vectorMatches = binModifier.matches;\n }\n visQuery.binaryQueries.push(binQuery);\n handleExpression(expr, right, {\n query: binQuery.query,\n errors: context.errors,\n replacements: context.replacements,\n });\n }\n}\n\n// TODO revisit this function.\nfunction getBinaryModifier(\n expr: string,\n node: SyntaxNode | null\n):\n | { isBool: true; isMatcher: false }\n | { isBool: false; isMatcher: true; matches: string; matchType: 'ignoring' | 'on' }\n | undefined {\n if (!node) {\n return undefined;\n }\n if (node.getChild('Bool')) {\n return { isBool: true, isMatcher: false };\n } else {\n let labels = '';\n const groupingLabels = node.getChild(GroupingLabels);\n if (groupingLabels) {\n labels = getAllByType(expr, groupingLabels, LabelName).join(', ');\n }\n\n return {\n isMatcher: true,\n isBool: false,\n matches: labels,\n matchType: node.getChild(On) ? 'on' : 'ignoring',\n };\n }\n}\n\nfunction isEmptyQuery(query: PromVisualQuery) {\n if (query.labels.length === 0 && query.operations.length === 0 && !query.metric) {\n return true;\n }\n return false;\n}\n","// NOTE: these two functions are similar to the escapeLabelValueIn* functions\n// in language_utils.ts, but they are not exactly the same algorithm, and we found\n\nimport { QueryVariableModel, CustomVariableModel } from '@grafana/data';\nimport { config } from '@grafana/runtime';\n\nexport function interpolateQueryExpr(\n value: string | string[] = [],\n variable: QueryVariableModel | CustomVariableModel\n) {\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// no way to reuse one in the another or vice versa.\nexport function prometheusRegularEscape<T>(value: T) {\n if (typeof value !== 'string') {\n return value;\n }\n\n if (config.featureToggles.prometheusSpecialCharsInLabelValues) {\n // if the string looks like a complete label matcher (e.g. 'job=\"grafana\"' or 'job=~\"grafana\"'),\n // don't escape the encapsulating quotes\n if (/^\\w+(=|!=|=~|!~)\".*\"$/.test(value)) {\n return value;\n }\n\n return value\n .replace(/\\\\/g, '\\\\\\\\') // escape backslashes\n .replace(/\"/g, '\\\\\"'); // escape double quotes\n }\n\n // classic behavior\n return value\n .replace(/\\\\/g, '\\\\\\\\') // escape backslashes\n .replace(/'/g, \"\\\\\\\\'\"); // escape single quotes\n}\n\nexport function prometheusSpecialRegexEscape<T>(value: T) {\n if (typeof value !== 'string') {\n return value;\n }\n\n if (config.featureToggles.prometheusSpecialCharsInLabelValues) {\n return value\n .replace(/\\\\/g, '\\\\\\\\\\\\\\\\') // escape backslashes\n .replace(/\"/g, '\\\\\\\\\\\\\"') // escape double quotes\n .replace(/[$^*{}\\[\\]\\'+?.()|]/g, '\\\\\\\\$&'); // escape regex metacharacters\n }\n\n // classic behavior\n return value\n .replace(/\\\\/g, '\\\\\\\\\\\\\\\\') // escape backslashes\n .replace(/[$^*{}\\[\\]+?.()|]/g, '\\\\\\\\$&'); // escape regex metacharacters\n}\n\n// NOTE: the following 2 exported functions are very similar to the prometheus*Escape\n// functions in datasource.ts, but they are not exactly the same algorithm, and we found\n// no way to reuse one in the another or vice versa.\n\n// Prometheus regular-expressions use the RE2 syntax (https://github.com/google/re2/wiki/Syntax),\n// so every character that matches something in that list has to be escaped.\n// the list of metacharacters is: *+?()|\\.[]{}^$\n// we make a javascript regular expression that matches those characters:\nconst RE2_METACHARACTERS = /[*+?()|\\\\.\\[\\]{}^$]/g;\n\nfunction escapePrometheusRegexp(value: string): string {\n return value.replace(RE2_METACHARACTERS, '\\\\$&');\n}\n\n// based on the openmetrics-documentation, the 3 symbols we have to handle are:\n// - \\n ... the newline character\n// - \\ ... the backslash character\n// - \" ... the double-quote character\nexport function escapeLabelValueInExactSelector(labelValue: string): string {\n return labelValue.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nexport function escapeLabelValueInRegexSelector(labelValue: string): string {\n return escapeLabelValueInExactSelector(escapePrometheusRegexp(labelValue));\n}\n","import { config } from '@grafana/runtime';\n\nimport { prometheusRegularEscape } from '../../../escaping';\nimport { utf8Support } from '../../../utf8_support';\nimport { QueryBuilderLabelFilter } from '../types';\n\n/**\n * Renders label filters in the format: {label1=\"value1\", label2=\"value2\"}\n */\nexport function renderLabels(labels: QueryBuilderLabelFilter[]): string {\n if (labels.length === 0) {\n return '';\n }\n\n let expr = '{';\n for (const filter of labels) {\n if (expr !== '{') {\n expr += ', ';\n }\n\n let labelValue = filter.value;\n const usingRegexOperator = filter.op === '=~' || filter.op === '!~';\n\n if (config.featureToggles.prometheusSpecialCharsInLabelValues && !usingRegexOperator) {\n labelValue = prometheusRegularEscape(labelValue);\n }\n expr += `${utf8Support(filter.label)}${filter.op}\"${labelValue}\"`;\n }\n\n return expr + `}`;\n}\n\nexport function renderLabelsWithoutBrackets(labels: QueryBuilderLabelFilter[]): string[] {\n if (labels.length === 0) {\n return [];\n }\n\n const renderedLabels: string[] = [];\n for (const filter of labels) {\n let labelValue = filter.value;\n const usingRegexOperator = filter.op === '=~' || filter.op === '!~';\n\n if (config.featureToggles.prometheusSpecialCharsInLabelValues && !usingRegexOperator) {\n labelValue = prometheusRegularEscape(labelValue);\n }\n renderedLabels.push(`${utf8Support(filter.label)}${filter.op}\"${labelValue}\"`);\n }\n\n return renderedLabels;\n}\n","import { PromVisualQueryOperationCategory } from '../../types';\nimport { PrometheusVisualQuery, QueryBuilderOperation, QueryBuilderOperationDef } from '../types';\n\n/**\n * Renders operations\n */\nexport function renderOperations(\n queryString: string,\n operations: QueryBuilderOperation[],\n operationsRegistry: Map<string, QueryBuilderOperationDef>\n): string {\n for (const operation of operations) {\n const def = operationsRegistry.get(operation.id);\n if (!def) {\n throw new Error(`Could not find operation ${operation.id} in the registry`);\n }\n queryString = def.renderer(operation, def, queryString);\n }\n\n return queryString;\n}\n\n/**\n * Checks if query has binary operation\n */\nexport function hasBinaryOp(\n query: PrometheusVisualQuery,\n operationsRegistry: Map<string, QueryBuilderOperationDef>\n): boolean {\n return (\n query.operations.find((op) => {\n const def = operationsRegistry.get(op.id);\n return def?.category === PromVisualQueryOperationCategory.BinaryOps;\n }) !== undefined\n );\n}\n","import { isValidLegacyName } from '../../../utf8_support';\nimport { PrometheusVisualQuery, QueryBuilderOperationDef, VisualQueryBinary } from '../types';\n\nimport { renderLabels } from './labels';\nimport { hasBinaryOp, renderOperations } from './operations';\n\n/**\n * Renders binary queries\n */\nexport function renderBinaryQueries(\n queryString: string,\n binaryQueries?: Array<VisualQueryBinary<PrometheusVisualQuery>>\n): string {\n if (binaryQueries) {\n for (const binQuery of binaryQueries) {\n queryString = `${renderBinaryQuery(queryString, binQuery)}`;\n }\n }\n return queryString;\n}\n\n/**\n * Renders a binary query\n */\nfunction renderBinaryQuery(leftOperand: string, binaryQuery: VisualQueryBinary<PrometheusVisualQuery>): string {\n let result = leftOperand + ` ${binaryQuery.operator} `;\n\n if (binaryQuery.vectorMatches) {\n result += `${binaryQuery.vectorMatchesType}(${binaryQuery.vectorMatches}) `;\n }\n\n return result + renderQuery(binaryQuery.query, true);\n}\n\n/**\n * Renders a full query\n */\nexport function renderQuery(\n query: PrometheusVisualQuery,\n nested?: boolean,\n operationsRegistry?: Map<string, QueryBuilderOperationDef>\n): string {\n // Handle empty query\n if (!query.metric && query.labels.length === 0 && query.operations.length === 0) {\n return '';\n }\n\n let queryString = '';\n const labels = renderLabels(query.labels);\n\n if (query.metric) {\n if (isValidLegacyName(query.metric)) {\n // This is a legacy metric, put outside the curl legacy_query{label=\"value\"}\n queryString = `${query.metric}${labels}`;\n } else {\n // This is a utf8 metric, put inside the curly and quotes {\"utf8.metric\", label=\"value\"}\n queryString = `{\"${query.metric}\"${labels.length > 0 ? `, ${labels.substring(1)}` : `}`}`;\n }\n } else if (query.labels.length > 0) {\n // No metric just use labels {label=\"value\"}\n queryString = labels;\n } else if (query.operations.length > 0) {\n // For query patterns, we want the operation to render as e.g. rate([$__rate_interval])\n queryString = '';\n }\n\n // If we have operations and an operations registry, render the operations\n if (query.operations.length > 0) {\n if (operationsRegistry) {\n queryString = renderOperations(queryString, query.operations, operationsRegistry);\n } else {\n // For cases like add_label_to_query, handle operations generically\n for (const operation of query.operations) {\n // Special case to handle basic operations like multiplication\n if (operation.id === 'MultiplyBy' && operation.params && operation.params.length > 0) {\n queryString = `${queryString} * ${operation.params[0]}`;\n }\n }\n }\n }\n\n // Check if this query or child queries need parentheses\n const hasNesting = Boolean(query.binaryQueries?.length);\n const hasBinaryOperation = operationsRegistry ? hasBinaryOp(query, operationsRegistry) : false;\n\n // Handle nested queries with binary operations\n if (!nested && hasBinaryOperation && hasNesting) {\n queryString = `(${queryString})`;\n }\n\n // Render any binary queries\n if (hasNesting) {\n for (const binQuery of query.binaryQueries!) {\n const rightOperand = renderNestedPart(binQuery.query, operationsRegistry);\n\n // Add vector matching if present\n let vectorMatchingStr = '';\n if (binQuery.vectorMatches) {\n vectorMatchingStr = `${binQuery.vectorMatchesType}(${binQuery.vectorMatches}) `;\n }\n\n // Combine left and right operands with operator\n queryString = `${queryString} ${binQuery.operator} ${vectorMatchingStr}${rightOperand}`;\n }\n }\n\n // Add parentheses for nested queries when needed\n if (nested && (hasBinaryOperation || hasNesting)) {\n queryString = `(${queryString})`;\n }\n\n return queryString;\n}\n\n/**\n * Special helper for rendering a nested part of a binary query\n * This ensures we only add parentheses when needed\n */\nfunction renderNestedPart(\n query: PrometheusVisualQuery,\n operationsRegistry?: Map<string, QueryBuilderOperationDef>\n): string {\n // First render the query itself\n const renderedQuery = renderQuery(query, false, operationsRegistry);\n\n const hasOps = query.operations.length > 0;\n const hasNestedBinary = Boolean(query.binaryQueries?.length);\n\n // If this is an operation-only query (no metric, no labels, no binaryQueries, at least one operation), do not add parentheses\n if (hasOps && !hasNestedBinary && !query.metric && (!query.labels || query.labels.length === 0)) {\n return renderedQuery;\n }\n\n // Keep the correct format for test expectations\n if (hasOps || hasNestedBinary) {\n return `(${renderedQuery})`;\n }\n\n return renderedQuery;\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/add_label_to_query.ts\nimport { parser, VectorSelector } from '@prometheus-io/lezer-promql';\n\nimport { buildVisualQueryFromString } from './querybuilder/parsing';\nimport { renderQuery } from './querybuilder/shared/rendering/query';\nimport { QueryBuilderLabelFilter } from './querybuilder/shared/types';\nimport { PromVisualQuery } from './querybuilder/types';\n\n/**\n * Adds label filter to existing query. Useful for query modification for example for ad hoc filters.\n *\n * It uses PromQL parser to find instances of metric and labels, alters them and then splices them back into the query.\n * Ideally we could use the parse -> change -> render is a simple 3 steps but right now building the visual query\n * object does not support all possible queries.\n *\n * So instead this just operates on substrings of the query with labels and operates just on those. This makes this\n * more robust and can alter even invalid queries, and preserves in general the query structure and whitespace.\n * @param query\n * @param key\n * @param value\n * @param operator\n */\nexport function addLabelToQuery(query: string, key: string, value: string | number, operator = '='): string {\n if (!key) {\n throw new Error('Need label to add to query.');\n }\n\n const vectorSelectorPositions = getVectorSelectorPositions(query);\n if (!vectorSelectorPositions.length) {\n return query;\n }\n\n const filter = toLabelFilter(key, value, operator);\n return addFilter(query, vectorSelectorPositions, filter);\n}\n\ntype VectorSelectorPosition = { from: number; to: number; query: PromVisualQuery };\n\n/**\n * Parse the string and get all VectorSelector positions in the query together with parsed representation of the vector\n * selector.\n * @param query\n */\nfunction getVectorSelectorPositions(query: string): VectorSelectorPosition[] {\n const tree = parser.parse(query);\n const positions: VectorSelectorPosition[] = [];\n tree.iterate({\n enter: ({ to, from, type }): false | void => {\n if (type.id === VectorSelector) {\n const visQuery = buildVisualQueryFromString(query.substring(from, to));\n positions.push({ query: visQuery.query, from, to });\n return false;\n }\n },\n });\n return positions;\n}\n\nfunction toLabelFilter(key: string, value: string | number, operator: string): QueryBuilderLabelFilter {\n // We need to make sure that we convert the value back to string because it may be a number\n const transformedValue = value === Infinity ? '+Inf' : value.toString();\n return { label: key, op: operator, value: transformedValue };\n}\n\nfunction addFilter(\n query: string,\n vectorSelectorPositions: VectorSelectorPosition[],\n filter: QueryBuilderLabelFilter\n): string {\n let newQuery = '';\n let prev = 0;\n\n for (let i = 0; i < vectorSelectorPositions.length; i++) {\n // This is basically just doing splice on a string for each matched vector selector.\n\n const match = vectorSelectorPositions[i];\n const isLast = i === vectorSelectorPositions.length - 1;\n\n const start = query.substring(prev, match.from);\n const end = isLast ? query.substring(match.to) : '';\n\n const labelToMatch = labelExists(match.query.labels, filter);\n if (labelToMatch) {\n // if label exists, check the operator, if it is different, update it.\n // We don't want to add duplicate labels.\n if (labelToMatch.op !== filter.op) {\n match.query.labels = match.query.labels.map((label) =>\n label.label === filter.label && label.value === filter.value ? filter : label\n );\n }\n } else {\n // label does not exist, add as is.\n match.query.labels.push(filter);\n }\n const newLabels = renderQuery(match.query);\n newQuery += start + newLabels + end;\n prev = match.to;\n }\n return newQuery;\n}\n\n/**\n * Check if label exists in the list of labels but ignore the operator.\n * @param labels\n * @param filter\n */\nfunction labelExists(labels: QueryBuilderLabelFilter[], filter: QueryBuilderLabelFilter) {\n return labels.find((label) => label.label === filter.label && label.value === filter.value);\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/query_hints.ts\nimport { size } from 'lodash';\n\nimport { QueryFix, QueryHint } from '@grafana/data';\n\nimport { PrometheusDatasource } from './datasource';\nimport { buildVisualQueryFromString } from './querybuilder/parsing';\nimport { QueryBuilderLabelFilter } from './querybuilder/shared/types';\nimport { PromVisualQuery } from './querybuilder/types';\nimport { PromMetricsMetadata, RecordingRuleIdentifier, RuleQueryMapping } from './types';\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?: unknown[], datasource?: PrometheusDatasource): QueryHint[] {\n const hints = [];\n\n const metricsMetadata = datasource?.languageProvider?.retrieveMetricsMetadata();\n\n // ..._bucket metric needs a histogram_quantile()\n // this regex also prevents hints from being shown when a query already has a function\n const oldHistogramMetric = query.trim().match(/^\\w+_bucket$|^\\w+_bucket{.*}$/);\n if (oldHistogramMetric) {\n const label = 'Selected metric has buckets.';\n hints.push({\n type: 'HISTOGRAM_QUANTILE',\n label,\n fix: {\n label: 'Consider calculating aggregated quantile by adding histogram_quantile().',\n action: {\n type: 'ADD_HISTOGRAM_QUANTILE',\n query,\n },\n },\n });\n } else if (metricsMetadata && simpleQueryCheck(query)) {\n // having migrated to native histograms\n // there will be no more old histograms (no buckets)\n // and we can identify a native histogram by the following\n // type === 'histogram'\n // metric name does not include '_bucket'\n const queryTokens = getQueryTokens(query);\n\n // Determine whether any of the query identifier tokens refers to a native histogram metric\n const { nameMetric } = checkMetricType(queryTokens, 'histogram', metricsMetadata, false);\n\n const nativeHistogramNameMetric = nameMetric;\n\n if (nativeHistogramNameMetric) {\n // add hints:\n // histogram_quantile, histogram_avg, histogram_count\n const label = 'Selected metric is a native histogram.';\n hints.push(\n {\n type: 'HISTOGRAM_QUANTILE',\n label,\n fix: {\n label: 'Consider calculating aggregated quantile by adding histogram_quantile().',\n action: {\n type: 'ADD_HISTOGRAM_QUANTILE',\n query,\n },\n },\n },\n {\n type: 'HISTOGRAM_AVG',\n label,\n fix: {\n label: 'Consider calculating the arithmetic average of observed values by adding histogram_avg().',\n action: {\n type: 'ADD_HISTOGRAM_AVG',\n query,\n },\n },\n },\n {\n type: 'HISTOGRAM_COUNT',\n label,\n fix: {\n label: 'Consider calculating the count of observations by adding histogram_count().',\n action: {\n type: 'ADD_HISTOGRAM_COUNT',\n query,\n },\n },\n }\n );\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 let certain = false;\n\n if (metricsMetadata) {\n // Tokenize the query into its identifiers (see https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels)\n const queryTokens = getQueryTokens(query);\n // Determine whether any of the query identifier tokens refers to a counter metric\n const metricTypeChecked = checkMetricType(queryTokens, 'counter', metricsMetadata, certain);\n\n counterNameMetric = metricTypeChecked.nameMetric;\n certain = metricTypeChecked.certain;\n }\n\n if (counterNameMetric) {\n // FixableQuery consists of metric name and optionally label-value pairs. We are not offering fix for complex queries yet.\n const fixableQuery = simpleQueryCheck(query);\n const verb = certain ? 'is' : 'looks like';\n let label = `Selected metric ${verb} a counter.`;\n let fix: QueryFix | undefined;\n\n if (fixableQuery) {\n fix = {\n label: 'Consider calculating rate of counter by adding rate().',\n action: {\n type: 'ADD_RATE',\n query,\n },\n };\n } else {\n label = `${label} Consider calculating rate of counter by adding rate().`;\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 expandQueryHints = getExpandRulesHints(query, datasource.ruleMappings);\n hints.push(...expandQueryHints);\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 },\n });\n }\n }\n\n return hints;\n}\n\nexport function getInitHints(datasource: PrometheusDatasource): QueryHint[] {\n const hints = [];\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\nexport function isRuleInQuery(query: string, ruleName: string) {\n if (!query || !ruleName) {\n return false;\n }\n\n const getRuleRegex = new RegExp(`(?<![\\\\w:])${ruleName}(?=[\\\\[{(\\\\s\\\\)]|$)`);\n return getRuleRegex.test(query);\n}\n\nexport function getExpandRulesHints(query: string, mapping: RuleQueryMapping): QueryHint[] {\n const hints: QueryHint[] = [];\n const mappingForQuery = Object.keys(mapping).reduce((acc, ruleName) => {\n if (!isRuleInQuery(query, ruleName)) {\n return acc;\n }\n\n if (mapping[ruleName].length > 1) {\n const { idx, expandedQuery, identifier, identifierValue } = getRecordingRuleIdentifierIdx(\n query,\n ruleName,\n mapping[ruleName]\n );\n\n // No identifier detected add warning\n if (idx === -1) {\n hints.push({\n type: 'EXPAND_RULES_WARNING',\n label:\n 'We found multiple recording rules that match in this query. To expand the recording rule, add an identifier label/value.',\n });\n return acc;\n } else {\n // Identifier found.\n return {\n ...acc,\n [ruleName]: {\n expandedQuery,\n identifier,\n identifierValue,\n },\n };\n }\n } else {\n return {\n ...acc,\n [ruleName]: {\n expandedQuery: mapping[ruleName][0].query,\n },\n };\n }\n }, {});\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 options: mappingForQuery,\n },\n },\n });\n }\n\n return hints;\n}\n\nexport function getRecordingRuleIdentifierIdx(\n queryStr: string,\n ruleName: string,\n mapping: RuleQueryMapping[string]\n): RecordingRuleIdentifier & { idx: number } {\n const { query } = buildVisualQueryFromString(queryStr);\n const queryMetricLabels: QueryBuilderLabelFilter[] = getQueryLabelsForRuleName(ruleName, query);\n if (queryMetricLabels.length === 0) {\n return { idx: -1, identifier: '', identifierValue: '', expandedQuery: '' };\n }\n\n let uuidLabel = '';\n let uuidLabelValue = '';\n let uuidLabelIdx = -1;\n\n queryMetricLabels.forEach((qml) => {\n if (uuidLabelIdx === -1 && qml.label.search('uuid') !== -1) {\n uuidLabel = qml.label;\n uuidLabelValue = qml.value;\n }\n });\n\n mapping.forEach((mp, idx) => {\n if (mp.labels) {\n Object.entries(mp.labels).forEach(([key, value]) => {\n if (uuidLabelIdx === -1 && key === uuidLabel && value === uuidLabelValue) {\n uuidLabelIdx = idx;\n }\n });\n }\n });\n\n return {\n idx: uuidLabelIdx,\n identifier: uuidLabel,\n identifierValue: uuidLabelValue,\n expandedQuery: mapping[uuidLabelIdx]?.query ?? '',\n };\n}\n\n// returns the labels of matching metric\n// metricName is the ruleName in query\nexport function getQueryLabelsForRuleName(metricName: string, query: PromVisualQuery): QueryBuilderLabelFilter[] {\n if (query.metric === metricName) {\n return query.labels;\n } else {\n if (query.binaryQueries) {\n for (let i = 0; i < query.binaryQueries.length; i++) {\n const labels = getQueryLabelsForRuleName(metricName, query.binaryQueries[i].query);\n if (labels && labels.length > 0) {\n return labels;\n }\n }\n }\n return [];\n }\n}\n\nfunction getQueryTokens(query: string) {\n return (\n Array.from(query.matchAll(/\\$?[a-zA-Z_:][a-zA-Z0-9_:]*/g))\n .map(([match]) => match)\n // Exclude variable identifiers\n .filter((token) => !token.startsWith('$'))\n // Split composite keys to match the tokens returned by the language provider\n .flatMap((token) => token.split(':'))\n );\n}\n\nfunction checkMetricType(\n queryTokens: string[],\n metricType: string,\n metricsMetadata: PromMetricsMetadata,\n certain: boolean\n) {\n // update certain to change language for counters\n const nameMetric =\n queryTokens.find((metricName) => {\n // Only considering first type information, could be non-deterministic\n const metadata = metricsMetadata[metricName];\n if (metadata && metadata.type.toLowerCase() === metricType) {\n certain = true;\n return true;\n } else {\n return false;\n }\n }) ?? '';\n\n return { nameMetric, certain };\n}\n\n/**\n * This regex check looks for only metric name and label filters.\n * This prevents hints from being shown when a query already has a functions or is complex.\n * */\nfunction simpleQueryCheck(query: string) {\n return query.trim().match(/^\\w+$|^\\w+{.*}$/);\n}\n","import { escapeLabelValueInExactSelector, escapeLabelValueInRegexSelector } from '../../escaping';\nimport { isValidLegacyName, utf8Support } from '../../utf8_support';\n\n/**\n * Builds a Prometheus selector string from a metric name and label values\n * @param selectedMetric - The metric name, can be empty\n * @param selectedLabelValues - Record of label names to their selected values\n * @returns A properly formatted Prometheus selector string\n */\nexport function buildSelector(selectedMetric: string, selectedLabelValues: Record<string, string[]>): string {\n // Handle empty case\n if (selectedMetric === '' && Object.keys(selectedLabelValues).length === 0) {\n return '{}';\n }\n\n // Build all label selectors\n const selectorParts: string[] = [];\n\n // Process label selectors\n for (const [key, values] of Object.entries(selectedLabelValues)) {\n // Skip empty value arrays\n if (values.length === 0) {\n continue;\n }\n\n // Use regex matcher for multiple values\n if (values.length > 1) {\n selectorParts.push(`${utf8Support(key)}=~\"${values.map(escapeLabelValueInRegexSelector).join('|')}\"`);\n } else {\n // Use exact matcher for single value\n selectorParts.push(`${utf8Support(key)}=\"${escapeLabelValueInExactSelector(values[0])}\"`);\n }\n }\n\n // Handle metric name cases\n if (selectedMetric === '') {\n return `{${selectorParts.join(',')}}`;\n }\n\n if (isValidLegacyName(selectedMetric)) {\n return `${selectedMetric}{${selectorParts.join(',')}}`;\n }\n\n // Add quoted metric as another selector when it's not a valid legacy name\n selectorParts.unshift(utf8Support(selectedMetric));\n return `{${selectorParts.join(',')}}`;\n}\n","import { useCallback, useEffect, useRef, useState, useMemo } from 'react';\nimport { useDebounce } from 'react-use';\n\nimport { TimeRange } from '@grafana/data';\n\nimport { EMPTY_SELECTOR, LAST_USED_LABELS_KEY, METRIC_LABEL } from '../../constants';\nimport { PrometheusLanguageProviderInterface } from '../../language_provider';\n\nimport { 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","import { createContext, PropsWithChildren, useCallback, useContext, useMemo } from 'react';\n\nimport { TimeRange } from '@grafana/data';\n\nimport { PrometheusLanguageProviderInterface } from '../../language_provider';\n\nimport { buildSelector } from './selectorBuilder';\nimport { useMetricsLabelsValues } from './useMetricsLabelsValues';\n\nexport interface Metric {\n name: string;\n details?: string;\n}\n\n/**\n * Context for the Metrics Browser component\n * Provides state and handlers for browsing and selecting Prometheus metrics and labels\n */\ninterface MetricsBrowserContextType {\n // Error and status state\n err: string;\n setErr: (err: string) => void;\n status: string;\n setStatus: (status: string) => void;\n\n // Series limit settings\n seriesLimit: number;\n setSeriesLimit: (limit: number) => void;\n\n // Callback when selector changes\n onChange: (selector: string) => void;\n\n // Data and selection state\n metrics: Metric[];\n labelKeys: string[];\n isLoadingLabelKeys: boolean;\n isLoadingLabelValues: boolean;\n labelValues: Record<string, string[]>;\n selectedMetric: string;\n selectedLabelKeys: string[];\n selectedLabelValues: Record<string, string[]>;\n\n // Event handlers\n onMetricClick: (name: string) => void;\n onLabelKeyClick: (name: string) => void;\n onLabelValueClick: (labelKey: string, labelValue: string, isSelected: boolean) => void;\n getSelector: () => string;\n onClearClick: () => void;\n\n // Validation\n validationStatus: string;\n onValidationClick: () => void;\n}\n\nconst MetricsBrowserContext = createContext<MetricsBrowserContextType | undefined>(undefined);\n\ntype MetricsBrowserProviderProps = {\n timeRange: TimeRange;\n languageProvider: PrometheusLanguageProviderInterface;\n onChange: (selector: string) => void;\n};\n\n/**\n * Provider component for the Metrics Browser context\n * Manages state and data fetching for metrics, labels, and values\n */\nexport function MetricsBrowserProvider({\n children,\n timeRange,\n languageProvider,\n onChange,\n}: PropsWithChildren<MetricsBrowserProviderProps>) {\n const {\n err,\n setErr,\n status,\n setStatus,\n seriesLimit,\n setSeriesLimit,\n validationStatus,\n metrics,\n labelKeys,\n isLoadingLabelKeys,\n isLoadingLabelValues,\n labelValues,\n selectedMetric,\n selectedLabelKeys,\n selectedLabelValues,\n handleSelectedMetricChange,\n handleSelectedLabelKeyChange,\n handleSelectedLabelValueChange,\n handleValidation,\n handleClear,\n } = useMetricsLabelsValues(timeRange, languageProvider);\n\n // Build a Prometheus selector string from the current selections\n const getSelector = useCallback(\n () => buildSelector(selectedMetric, selectedLabelValues),\n [selectedLabelValues, selectedMetric]\n );\n\n // Memoize the context value to prevent unnecessary re-renders\n const value = useMemo(\n () => ({\n err,\n setErr,\n status,\n setStatus,\n seriesLimit,\n setSeriesLimit,\n validationStatus,\n onChange,\n getSelector,\n metrics,\n labelKeys,\n isLoadingLabelKeys,\n isLoadingLabelValues,\n labelValues,\n selectedMetric,\n selectedLabelKeys,\n selectedLabelValues,\n onMetricClick: handleSelectedMetricChange,\n onLabelKeyClick: handleSelectedLabelKeyChange,\n onLabelValueClick: handleSelectedLabelValueChange,\n onValidationClick: handleValidation,\n onClearClick: handleClear,\n }),\n [\n err,\n setErr,\n status,\n setStatus,\n seriesLimit,\n setSeriesLimit,\n validationStatus,\n onChange,\n getSelector,\n metrics,\n labelKeys,\n isLoadingLabelKeys,\n isLoadingLabelValues,\n labelValues,\n selectedMetric,\n selectedLabelKeys,\n selectedLabelValues,\n handleSelectedMetricChange,\n handleSelectedLabelKeyChange,\n handleSelectedLabelValueChange,\n handleValidation,\n handleClear,\n ]\n );\n\n return <MetricsBrowserContext.Provider value={value}>{children}</MetricsBrowserContext.Provider>;\n}\n\n/**\n * Hook to access the MetricsBrowser context\n * Must be used within a MetricsBrowserProvider\n */\nexport function useMetricsBrowser() {\n const context = useContext(MetricsBrowserContext);\n if (context === undefined) {\n throw new Error('useMetricsBrowser must be used within a MetricsBrowserProvider');\n }\n return context;\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport const getStylesMetricsBrowser = (theme: GrafanaTheme2) => ({\n wrapper: css({\n backgroundColor: theme.colors.background.secondary,\n padding: theme.spacing(1),\n width: '100%',\n }),\n spinner: css({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 120,\n }),\n});\n\nexport const getStylesMetricSelector = (theme: GrafanaTheme2) => ({\n section: css({\n '& + &': {\n margin: `${theme.spacing(2)} 0`,\n },\n position: 'relative',\n }),\n valueListWrapper: css({\n borderLeft: `1px solid ${theme.colors.border.medium}`,\n margin: `${theme.spacing(1)} 0`,\n padding: `${theme.spacing(1)} 0 ${theme.spacing(1)} ${theme.spacing(1)}`,\n }),\n valueList: css({\n marginRight: theme.spacing(1),\n resize: 'horizontal',\n }),\n});\n\nexport const getStylesLabelSelector = (theme: GrafanaTheme2) => ({\n section: css({\n '& + &': {\n margin: `${theme.spacing(2)} 0`,\n },\n position: 'relative',\n }),\n list: css({\n marginTop: theme.spacing(1),\n display: 'flex',\n flexWrap: 'wrap',\n maxHeight: '200px',\n overflow: 'auto',\n alignContent: 'flex-start',\n }),\n});\n\nexport const getStylesValueSelector = (theme: GrafanaTheme2) => ({\n section: css({\n '& + &': {\n margin: `${theme.spacing(2)} 0`,\n },\n position: 'relative',\n }),\n valueListArea: css({\n display: 'flex',\n flexWrap: 'wrap',\n marginTop: theme.spacing(1),\n }),\n valueTitle: css({\n marginLeft: `-${theme.spacing(0.5)}`,\n marginBottom: theme.spacing(1),\n }),\n valueListWrapper: css({\n borderLeft: `1px solid ${theme.colors.border.medium}`,\n margin: `${theme.spacing(1)} 0`,\n padding: `${theme.spacing(1)} 0 ${theme.spacing(1)} ${theme.spacing(1)}`,\n }),\n valueList: css({\n marginRight: theme.spacing(1),\n resize: 'horizontal',\n }),\n});\n\nexport const getStylesSelectorActions = (theme: GrafanaTheme2) => ({\n section: css({\n '& + &': {\n margin: `${theme.spacing(2)} 0`,\n },\n position: 'relative',\n }),\n selector: css({\n fontFamily: theme.typography.fontFamilyMonospace,\n marginBottom: theme.spacing(1),\n }),\n status: css({\n padding: theme.spacing(0.5),\n color: theme.colors.text.secondary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n width: '100%',\n right: 0,\n textAlign: 'right',\n opacity: 0,\n [theme.transitions.handleMotion('no-preference', 'reduce')]: {\n transition: 'opacity 100ms linear',\n },\n }),\n statusShowing: css({\n opacity: 1,\n }),\n error: css({\n color: theme.colors.error.main,\n }),\n validationStatus: css({\n padding: theme.spacing(0.5),\n marginBottom: theme.spacing(1),\n color: theme.colors.text.maxContrast,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }),\n});\n","import { useMemo, useState } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Trans, t } from '@grafana/i18n';\nimport { BrowserLabel as PromLabel, Input, Label, useStyles2, Spinner } from '@grafana/ui';\n\nimport { METRIC_LABEL } from '../../constants';\n\nimport { useMetricsBrowser } from './MetricsBrowserContext';\nimport { getStylesLabelSelector, getStylesMetricsBrowser } from './styles';\n\nexport function LabelSelector() {\n const styles = useStyles2(getStylesLabelSelector);\n const sharedStyles = useStyles2(getStylesMetricsBrowser);\n const [labelSearchTerm, setLabelSearchTerm] = useState('');\n const { labelKeys, isLoadingLabelKeys, selectedLabelKeys, onLabelKeyClick } = useMetricsBrowser();\n\n const filteredLabelKeys = useMemo(() => {\n return labelKeys.filter(\n (lk) => lk !== METRIC_LABEL && (selectedLabelKeys.includes(lk) || lk.includes(labelSearchTerm))\n );\n }, [labelKeys, labelSearchTerm, selectedLabelKeys]);\n\n return (\n <div className={styles.section}>\n <Label\n description={t(\n 'grafana-prometheus.components.label-selector.description-select-labels',\n 'Once label values are selected, only possible label combinations are shown.'\n )}\n >\n <Trans i18nKey=\"grafana-prometheus.components.label-selector.select-labels-to-search-in\">\n 2. Select labels to search in\n </Trans>\n </Label>\n <div>\n <Input\n onChange={(e) => setLabelSearchTerm(e.currentTarget.value)}\n aria-label={t(\n 'grafana-prometheus.components.label-selector.aria-label-filter-expression-for-label',\n 'Filter expression for label'\n )}\n value={labelSearchTerm}\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.code.metricsBrowser.labelNamesFilter}\n />\n </div>\n {/* Using fixed height here to prevent jumpy layout */}\n {isLoadingLabelKeys ? (\n <div className={sharedStyles.spinner}>\n <Spinner size=\"xl\" />\n </div>\n ) : (\n <div className={styles.list} style={{ height: 120 }}>\n {filteredLabelKeys.map((label) => (\n <PromLabel\n key={label}\n name={label}\n active={selectedLabelKeys.includes(label)}\n hidden={false}\n facets={undefined}\n onClick={(name: string) => {\n // Resetting search to prevent empty results\n setLabelSearchTerm('');\n onLabelKeyClick(name);\n }}\n searchTerm={labelSearchTerm}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useMemo, useState } from 'react';\nimport { FixedSizeList } from 'react-window';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Trans, t } from '@grafana/i18n';\nimport { BrowserLabel as PromLabel, Input, Label, useStyles2 } from '@grafana/ui';\n\nimport { LIST_ITEM_SIZE } from '../../constants';\n\nimport { useMetricsBrowser } from './MetricsBrowserContext';\nimport { getStylesMetricSelector } from './styles';\n\nexport function MetricSelector() {\n const styles = useStyles2(getStylesMetricSelector);\n const [metricSearchTerm, setMetricSearchTerm] = useState('');\n const { metrics, selectedMetric, seriesLimit, setSeriesLimit, onMetricClick } = useMetricsBrowser();\n\n const filteredMetrics = useMemo(() => {\n return metrics.filter((m) => m.name === selectedMetric || m.name.includes(metricSearchTerm));\n }, [metrics, selectedMetric, metricSearchTerm]);\n\n return (\n <div>\n <div className={styles.section}>\n <Label\n description={t(\n 'grafana-prometheus.components.metric-selector.label-select-metric',\n 'Once a metric is selected only possible labels are shown. Labels are limited by the series limit below.'\n )}\n >\n <Trans i18nKey=\"grafana-prometheus.components.metric-selector.select-a-metric\">1. Select a metric</Trans>\n </Label>\n <div>\n <Input\n onChange={(e) => setMetricSearchTerm(e.currentTarget.value)}\n aria-label={t(\n 'grafana-prometheus.components.metric-selector.aria-label-filter-expression-for-metric',\n 'Filter expression for metric'\n )}\n value={metricSearchTerm}\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.code.metricsBrowser.selectMetric}\n />\n </div>\n <Label\n description={t(\n 'grafana-prometheus.components.metric-selector.description-series-limit',\n 'The limit applies to all metrics, labels, and values. Leave the field empty to use the default limit. Set to 0 to disable the limit and fetch everything — this may cause performance issues.'\n )}\n >\n <Trans i18nKey=\"grafana-prometheus.components.metric-selector.series-limit\">Series limit</Trans>\n </Label>\n <div>\n <Input\n onChange={(e) => setSeriesLimit(parseInt(e.currentTarget.value.trim(), 10))}\n aria-label={t(\n 'grafana-prometheus.components.metric-selector.aria-label-limit-results-from-series-endpoint',\n 'Limit results from series endpoint'\n )}\n value={seriesLimit}\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.code.metricsBrowser.seriesLimit}\n />\n </div>\n <div\n role=\"list\"\n className={styles.valueListWrapper}\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.code.metricsBrowser.metricList}\n >\n <FixedSizeList\n height={Math.min(450, filteredMetrics.length * LIST_ITEM_SIZE)}\n itemCount={filteredMetrics.length}\n itemSize={LIST_ITEM_SIZE}\n itemKey={(i) => filteredMetrics[i].name}\n width={300}\n className={styles.valueList}\n >\n {({ index, style }) => {\n const metric = filteredMetrics[index];\n return (\n <div style={style}>\n <PromLabel\n name={metric.name}\n value={metric.name}\n title={metric.details}\n active={metric.name === selectedMetric}\n onClick={(name: string, value: string | undefined) => {\n // Resetting search to prevent empty results\n setMetricSearchTerm('');\n onMetricClick(name);\n }}\n searchTerm={metricSearchTerm}\n />\n </div>\n );\n }}\n </FixedSizeList>\n </div>\n </div>\n </div>\n );\n}\n","import { cx } from '@emotion/css';\nimport { useMemo } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Trans, t } from '@grafana/i18n';\nimport { Button, Label, Stack, useStyles2 } from '@grafana/ui';\n\nimport { EMPTY_SELECTOR } from '../../constants';\n\nimport { useMetricsBrowser } from './MetricsBrowserContext';\nimport { getStylesSelectorActions } from './styles';\n\nexport function SelectorActions() {\n const styles = useStyles2(getStylesSelectorActions);\n const { validationStatus, onValidationClick, getSelector, onChange, status, err, onClearClick } = useMetricsBrowser();\n\n const selector = getSelector();\n\n const onClickRunQuery = () => {\n onChange(selector);\n };\n\n const onClickRunRateQuery = () => {\n const query = `rate(${selector}[$__rate_interval])`;\n onChange(query);\n };\n\n const empty = useMemo(() => selector === EMPTY_SELECTOR, [selector]);\n\n return (\n <div className={styles.section}>\n <Label>\n <Trans i18nKey=\"grafana-prometheus.components.selector-actions.resulting-selector\">4. Resulting selector</Trans>\n </Label>\n <div\n aria-label={t('grafana-prometheus.components.selector-actions.aria-label-selector', 'selector')}\n className={styles.selector}\n >\n {selector}\n </div>\n {validationStatus && <div className={styles.validationStatus}>{validationStatus}</div>}\n <Stack>\n <Button\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.code.metricsBrowser.useQuery}\n aria-label={t(\n 'grafana-prometheus.components.selector-actions.aria-label-use-selector-for-query-button',\n 'Use selector for query button'\n )}\n disabled={empty}\n onClick={onClickRunQuery}\n >\n <Trans i18nKey=\"grafana-prometheus.components.selector-actions.use-query\">Use query</Trans>\n </Button>\n <Button\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.code.metricsBrowser.useAsRateQuery}\n aria-label={t(\n 'grafana-prometheus.components.selector-actions.aria-label-use-selector-as-metrics-button',\n 'Use selector as metrics button'\n )}\n variant=\"secondary\"\n disabled={empty}\n onClick={onClickRunRateQuery}\n >\n <Trans i18nKey=\"grafana-prometheus.components.selector-actions.use-as-rate-query\">Use as rate query</Trans>\n </Button>\n <Button\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.code.metricsBrowser.validateSelector}\n aria-label={t(\n 'grafana-prometheus.components.selector-actions.aria-label-validate-submit-button',\n 'Validate submit button'\n )}\n variant=\"secondary\"\n disabled={empty}\n onClick={onValidationClick}\n >\n <Trans i18nKey=\"grafana-prometheus.components.selector-actions.validate-selector\">Validate selector</Trans>\n </Button>\n <Button\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.code.metricsBrowser.clear}\n aria-label={t(\n 'grafana-prometheus.components.selector-actions.aria-label-selector-clear-button',\n 'Selector clear button'\n )}\n variant=\"secondary\"\n onClick={onClearClick}\n >\n <Trans i18nKey=\"grafana-prometheus.components.selector-actions.clear\">Clear</Trans>\n </Button>\n <div className={cx(styles.status, (status || err) && styles.statusShowing)}>\n <span className={err ? styles.error : ''}>{err || status}</span>\n </div>\n </Stack>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { FixedSizeList } from 'react-window';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t, Trans } from '@grafana/i18n';\nimport { BrowserLabel as PromLabel, Input, Label, useStyles2, Spinner } from '@grafana/ui';\n\nimport { LIST_ITEM_SIZE } from '../../constants';\n\nimport { useMetricsBrowser } from './MetricsBrowserContext';\nimport { getStylesMetricsBrowser, getStylesValueSelector } from './styles';\n\nexport function ValueSelector() {\n const styles = useStyles2(getStylesValueSelector);\n const sharedStyles = useStyles2(getStylesMetricsBrowser);\n\n const [valueSearchTerm, setValueSearchTerm] = useState('');\n const { labelValues, selectedLabelValues, isLoadingLabelValues, onLabelValueClick, onLabelKeyClick } =\n useMetricsBrowser();\n\n return (\n <div className={styles.section}>\n <Label\n description={t(\n 'grafana-prometheus.components.value-selector.description-search-field-values-across-selected-labels',\n 'Use the search field to find values across selected labels.'\n )}\n >\n <Trans i18nKey=\"grafana-prometheus.components.value-selector.select-multiple-values-for-your-labels\">\n 3. Select (multiple) values for your labels\n </Trans>\n </Label>\n <div>\n <Input\n onChange={(e) => setValueSearchTerm(e.currentTarget.value)}\n aria-label={t(\n 'grafana-prometheus.components.value-selector.aria-label-filter-expression-for-label-values',\n 'Filter expression for label values'\n )}\n value={valueSearchTerm}\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.code.metricsBrowser.labelValuesFilter}\n />\n </div>\n {isLoadingLabelValues ? (\n <div className={sharedStyles.spinner}>\n <Spinner size=\"xl\" />\n </div>\n ) : (\n <div className={styles.valueListArea}>\n {Object.entries(labelValues).map(([lk, lv]) => {\n if (!lk || !lv) {\n console.error('label values are empty:', { lk, lv });\n return null;\n }\n return (\n <div\n role=\"list\"\n key={lk}\n aria-label={t(\n 'grafana-prometheus.components.value-selector.aria-label-values-for',\n 'Values for {{labelKey}}',\n {\n labelKey: lk,\n }\n )}\n className={styles.valueListWrapper}\n >\n <div className={styles.valueTitle}>\n <PromLabel name={lk} active={true} hidden={false} facets={lv.length} onClick={onLabelKeyClick} />\n </div>\n <FixedSizeList\n height={Math.min(200, LIST_ITEM_SIZE * (lv.length || 0))}\n itemCount={lv.length || 0}\n itemSize={28}\n itemKey={(i) => lv[i]}\n width={200}\n className={styles.valueList}\n >\n {({ index, style }) => {\n const value = lv[index];\n const isSelected = selectedLabelValues[lk]?.includes(value);\n return (\n <div style={style}>\n <PromLabel\n name={value}\n value={value}\n active={isSelected}\n onClick={(name) => onLabelValueClick(lk, name, !isSelected)}\n searchTerm={valueSearchTerm}\n />\n </div>\n );\n }}\n </FixedSizeList>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/PrometheusMetricsBrowser.tsx\nimport { Stack, useStyles2 } from '@grafana/ui';\n\nimport { LabelSelector } from './LabelSelector';\nimport { MetricSelector } from './MetricSelector';\nimport { SelectorActions } from './SelectorActions';\nimport { ValueSelector } from './ValueSelector';\nimport { getStylesMetricsBrowser } from './styles';\n\nexport const MetricsBrowser = () => {\n const styles = useStyles2(getStylesMetricsBrowser);\n\n return (\n <div className={styles.wrapper}>\n <Stack gap={3}>\n <MetricSelector />\n <div>\n <LabelSelector />\n\n <ValueSelector />\n </div>\n </Stack>\n\n <SelectorActions />\n </div>\n );\n};\n","// The MIT License (MIT)\n//\n// Copyright (c) Celian Garcia and Augustin Husson @ Amadeus IT Group\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n'use strict';\n// noinspection JSUnusedGlobalSymbols\nexport var promLanguageDefinition = {\n id: 'promql',\n extensions: ['.promql'],\n aliases: ['Prometheus', 'prometheus', 'prom', 'Prom', 'promql', 'Promql', 'promQL', 'PromQL'],\n mimetypes: [],\n loader: function () { return import('./promql'); } // eslint-disable-line @typescript-eslint/explicit-function-return-type\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/getOverrideServices.ts\nimport { monacoTypes } from '@grafana/ui';\n\n// this thing here is a workaround in a way.\n// what we want to achieve, is that when the autocomplete-window\n// opens, the \"second, extra popup\" with the extra help,\n// also opens automatically.\n// but there is no API to achieve it.\n// the way to do it is to implement the `storageService`\n// interface, and provide our custom implementation,\n// which will default to `true` for the correct string-key.\n// unfortunately, while the typescript-interface exists,\n// it is not exported from monaco-editor,\n// so we cannot rely on typescript to make sure\n// we do it right. all we can do is to manually\n// lookup the interface, and make sure we code our code right.\n// our code is a \"best effort\" approach,\n// i am not 100% how the `scope` and `target` things work,\n// but so far it seems to work ok.\n// i would use an another approach, if there was one available.\n\nfunction makeStorageService() {\n // we need to return an object that fulfills this interface:\n // https://github.com/microsoft/vscode/blob/ff1e16eebb93af79fd6d7af1356c4003a120c563/src/vs/platform/storage/common/storage.ts#L37\n // unfortunately it is not export from monaco-editor\n\n const strings = new Map<string, string>();\n\n // we want this to be true by default\n strings.set('expandSuggestionDocs', true.toString());\n\n return {\n // we do not implement the on* handlers\n onDidChangeValue: (data: unknown): void => undefined,\n onDidChangeTarget: (data: unknown): void => undefined,\n onWillSaveState: (data: unknown): void => undefined,\n\n get: (key: string, scope: unknown, fallbackValue?: string): string | undefined => {\n return strings.get(key) ?? fallbackValue;\n },\n\n getBoolean: (key: string, scope: unknown, fallbackValue?: boolean): boolean | undefined => {\n const val = strings.get(key);\n if (val !== undefined) {\n // the interface-docs say the value will be converted\n // to a boolean but do not specify how, so we improvise\n return val === 'true';\n } else {\n return fallbackValue;\n }\n },\n\n getNumber: (key: string, scope: unknown, fallbackValue?: number): number | undefined => {\n const val = strings.get(key);\n if (val !== undefined) {\n return parseInt(val, 10);\n } else {\n return fallbackValue;\n }\n },\n\n store: (\n key: string,\n value: string | boolean | number | undefined | null,\n scope: unknown,\n target: unknown\n ): void => {\n // the interface-docs say if the value is nullish, it should act as delete\n if (value === null || value === undefined) {\n strings.delete(key);\n } else {\n strings.set(key, value.toString());\n }\n },\n\n remove: (key: string, scope: unknown): void => {\n strings.delete(key);\n },\n\n keys: (scope: unknown, target: unknown): string[] => {\n return Array.from(strings.keys());\n },\n\n logStorage: (): void => {\n console.log('logStorage: not implemented');\n },\n\n migrate: (): Promise<void> => {\n // we do not implement this\n return Promise.resolve(undefined);\n },\n\n isNew: (scope: unknown): boolean => {\n // we create a new storage for every session, we do not persist it,\n // so we return `true`.\n return true;\n },\n\n flush: (reason?: unknown): Promise<void> => {\n // we do not implement this\n return Promise.resolve(undefined);\n },\n };\n}\n\nlet overrideServices: monacoTypes.editor.IEditorOverrideServices | null = null;\n\nexport function getOverrideServices(): monacoTypes.editor.IEditorOverrideServices {\n // only have one instance of this for every query editor\n if (overrideServices === null) {\n overrideServices = {\n storageService: makeStorageService(),\n };\n }\n\n return overrideServices;\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/types.ts\nimport { DataSourceJsonData } from '@grafana/data';\nimport { DataQuery } from '@grafana/schema';\n\nimport { Prometheus as GenPromQuery } from './dataquery';\nimport { QueryBuilderLabelFilter, QueryEditorMode } from './querybuilder/shared/types';\n\nexport interface PromQuery extends GenPromQuery, DataQuery {\n /**\n * Timezone offset to align start & end time on backend\n */\n utcOffsetSec?: number;\n valueWithRefId?: boolean;\n showingGraph?: boolean;\n showingTable?: boolean;\n hinting?: boolean;\n interval?: string;\n fromExploreMetrics?: boolean;\n}\n\nexport enum PrometheusCacheLevel {\n Low = 'Low',\n Medium = 'Medium',\n High = 'High',\n None = 'None',\n}\n\nexport enum PromApplication {\n Cortex = 'Cortex',\n Mimir = 'Mimir',\n Prometheus = 'Prometheus',\n Thanos = 'Thanos',\n}\n\nexport interface PromOptions extends DataSourceJsonData {\n timeInterval?: string;\n queryTimeout?: string;\n httpMethod?: string;\n customQueryParameters?: string;\n disableMetricsLookup?: boolean;\n exemplarTraceIdDestinations?: ExemplarTraceIdDestination[];\n prometheusType?: PromApplication;\n prometheusVersion?: string;\n cacheLevel?: PrometheusCacheLevel;\n defaultEditor?: QueryEditorMode;\n incrementalQuerying?: boolean;\n incrementalQueryOverlapWindow?: string;\n disableRecordingRules?: boolean;\n allowAsRecordingRulesTarget?: boolean;\n sigV4Auth?: boolean;\n oauthPassThru?: boolean;\n seriesEndpoint?: boolean;\n seriesLimit?: number;\n}\n\nexport type ExemplarTraceIdDestination = {\n name: string;\n url?: string;\n urlDisplayLabel?: 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 type PromValue = [number, any];\n\nexport interface PromMetric {\n __name__?: string;\n\n [index: string]: any;\n}\n\nexport interface PromBuildInfoResponse {\n data: {\n application?: string;\n version: string;\n revision: string;\n features?: {\n ruler_config_api?: 'true' | 'false';\n alertmanager_config_api?: 'true' | 'false';\n query_sharding?: 'true' | 'false';\n federated_rules?: 'true' | 'false';\n };\n [key: string]: unknown;\n };\n status: 'success';\n}\n\n/**\n * Auto = query.legendFormat == '__auto'\n * Verbose = query.legendFormat == null/undefined/''\n * Custom query.legendFormat.length > 0 && query.legendFormat !== '__auto'\n */\nexport enum LegendFormatMode {\n Auto = '__auto',\n Verbose = '__verbose',\n Custom = '__custom',\n}\n\nexport enum PromVariableQueryType {\n LabelNames,\n LabelValues,\n MetricNames,\n VarQueryResult,\n SeriesQuery,\n ClassicQuery,\n}\n\nexport interface PromVariableQuery extends DataQuery {\n query?: string;\n expr?: string;\n qryType?: PromVariableQueryType;\n label?: string;\n metric?: string;\n varQuery?: string;\n seriesQuery?: string;\n labelFilters?: QueryBuilderLabelFilter[];\n match?: string;\n classicQuery?: string;\n}\n\nexport type StandardPromVariableQuery = {\n query: string;\n refId: string;\n};\n\n// Rules that we fetch from Prometheus\nexport type RawRecordingRules = {\n name: string;\n file: string;\n rules: Rule[];\n interval?: number;\n limit?: number;\n};\n\n// A single recording rule with its labels and the query it represents\n// In this object, there may be other fields but those are the ones we care for now\nexport type Rule = {\n name: string;\n query: string;\n duration?: number;\n labels?: Record<string, string>;\n annotations?: Record<string, string>;\n alerts?: AlertInfo[];\n type: 'alerting' | 'recording';\n};\n\nexport type AlertInfo = {\n labels: Record<string, string>;\n annotations: Record<string, string>;\n state: string;\n activeAt: string;\n value: string;\n};\n\n// Extracted recording rules with labels\n// We parse and extract the rules because\n// there might be multiple rules with same name but different labels and queries\nexport type RuleQueryMapping = {\n [key: string]: Array<{\n query: string;\n labels?: Record<string, string>;\n }>;\n};\n\nexport type RecordingRuleIdentifier = {\n expandedQuery: string;\n identifier?: string;\n identifierValue?: string;\n};\n","import { PrometheusCacheLevel } from './types';\n\n/**\n * Returns the debounce time in milliseconds based on the cache level.\n * Used to control the frequency of API requests.\n *\n * @param {PrometheusCacheLevel} cacheLevel - The cache level (None, Low, Medium, High)\n * @returns {number} Debounce time in milliseconds:\n * - Medium: 600ms\n * - High: 1200ms\n * - Default (None/Low): 350ms\n */\nexport const getDebounceTimeInMilliseconds = (cacheLevel: PrometheusCacheLevel): number => {\n switch (cacheLevel) {\n case PrometheusCacheLevel.Medium:\n return 600;\n case PrometheusCacheLevel.High:\n return 1200;\n default:\n return 350;\n }\n};\n\n/**\n * Returns the number of days to cache metadata based on the cache level.\n * Used for caching Prometheus metric metadata.\n *\n * @param {PrometheusCacheLevel} cacheLevel - The cache level (None, Low, Medium, High)\n * @returns {number} Number of days to cache:\n * - Medium: 7 days\n * - High: 30 days\n * - Default (None/Low): 1 day\n */\nexport const getDaysToCacheMetadata = (cacheLevel: PrometheusCacheLevel): number => {\n switch (cacheLevel) {\n case PrometheusCacheLevel.Medium:\n return 7;\n case PrometheusCacheLevel.High:\n return 30;\n default:\n return 1;\n }\n};\n\n/**\n * Returns the cache duration in minutes based on the cache level.\n * Used for general API response caching.\n *\n * @param {PrometheusCacheLevel} cacheLevel - The cache level (None, Low, Medium, High)\n * @returns Cache duration in minutes:\n * - Medium: 10 minutes\n * - High: 60 minutes\n * - Default (None/Low): 1 minute\n */\nexport const getCacheDurationInMinutes = (cacheLevel: PrometheusCacheLevel) => {\n switch (cacheLevel) {\n case PrometheusCacheLevel.Medium:\n return 10;\n case PrometheusCacheLevel.High:\n return 60;\n default:\n return 1;\n }\n};\n\n/**\n * Builds cache headers for Prometheus API requests.\n * Creates a standard cache control header with private scope and max-age directive.\n *\n * @param {number} durationInSeconds - Cache duration in seconds\n * @returns Object containing headers with cache control directives:\n * - X-Grafana-Cache: private, max-age=<duration>\n * @example\n * // Returns { headers: { 'X-Grafana-Cache': 'private, max-age=300' } }\n * buildCacheHeaders(300)\n */\nexport const buildCacheHeaders = (durationInSeconds: number) => {\n return {\n headers: {\n 'X-Grafana-Cache': `private, max-age=${durationInSeconds}`,\n },\n };\n};\n\n/**\n * Gets appropriate cache headers based on the configured cache level.\n * Converts cache duration from minutes to seconds and builds the headers.\n * Returns undefined if caching is disabled (None level).\n *\n * @param {PrometheusCacheLevel} cacheLevel - Cache level (None, Low, Medium, High)\n * @returns Cache headers object or undefined if caching is disabled\n * @example\n * // For Medium level, returns { headers: { 'X-Grafana-Cache': 'private, max-age=600' } }\n * getDefaultCacheHeaders(PrometheusCacheLevel.Medium)\n */\nexport const getDefaultCacheHeaders = (cacheLevel: PrometheusCacheLevel) => {\n if (cacheLevel !== PrometheusCacheLevel.None) {\n return buildCacheHeaders(getCacheDurationInMinutes(cacheLevel) * 60);\n }\n return;\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/language_utils.ts\nimport { invert } from 'lodash';\nimport { Token } from 'prismjs';\n\nimport {\n AbstractLabelMatcher,\n AbstractLabelOperator,\n AbstractQuery,\n DataQuery,\n dateMath,\n DateTime,\n incrRoundDn,\n TimeRange,\n} from '@grafana/data';\n\nimport { addLabelToQuery } from './add_label_to_query';\nimport { getCacheDurationInMinutes } from './caching';\nimport { SUGGESTIONS_LIMIT, PROMETHEUS_QUERY_BUILDER_MAX_RESULTS } from './constants';\nimport { PrometheusCacheLevel, PromMetricsMetadata, PromMetricsMetadataItem, RecordingRuleIdentifier } from './types';\n\nexport const processHistogramMetrics = (metrics: string[]) => {\n const resultSet: Set<string> = new Set();\n const regexp = new RegExp('_bucket($|:)');\n for (let index = 0; index < metrics.length; index++) {\n const metric = metrics[index];\n const isHistogramValue = regexp.test(metric);\n if (isHistogramValue) {\n resultSet.add(metric);\n }\n }\n return [...resultSet];\n};\n\nexport function processLabels(labels: Array<{ [key: string]: string }>, withName = false) {\n // For processing we are going to use sets as they have significantly better performance than arrays\n // After we process labels, we will convert sets to arrays and return object with label values in arrays\n const valueSet: { [key: string]: Set<string> } = {};\n labels.forEach((label) => {\n const { __name__, ...rest } = label;\n if (withName) {\n valueSet['__name__'] = valueSet['__name__'] || new Set();\n if (!valueSet['__name__'].has(__name__)) {\n valueSet['__name__'].add(__name__);\n }\n }\n\n Object.keys(rest).forEach((key) => {\n if (!valueSet[key]) {\n valueSet[key] = new Set();\n }\n if (!valueSet[key].has(rest[key])) {\n valueSet[key].add(rest[key]);\n }\n });\n });\n\n // valueArray that we are going to return in the object\n const valueArray: { [key: string]: string[] } = {};\n limitSuggestions(Object.keys(valueSet)).forEach((key) => {\n valueArray[key] = limitSuggestions(Array.from(valueSet[key]));\n });\n\n return { values: valueArray, keys: Object.keys(valueArray) };\n}\n\n// This will capture 4 groups. Example label filter => {instance=\"10.4.11.4:9003\"}\n// 1. label: instance\n// 2. operator: =\n// 3. value: \"10.4.11.4:9003\"\n// 4. comma: if there is a comma it will give ,\n// 5. space: if there is a space after comma it will give the whole space\n// comma and space is useful for addLabelsToExpression function\nconst labelRegexp = /\\b(\\w+)(!?=~?)(\"[^\"\\n]*?\")(,)?(\\s*)?/g;\n\nexport function expandRecordingRules(query: string, mapping: { [name: string]: RecordingRuleIdentifier }): string {\n const getRuleRegex = (ruleName: string) => new RegExp(`(\\\\s|\\\\(|^)(${ruleName})(\\\\s|$|\\\\(|\\\\[|\\\\{)`, 'ig');\n\n // For each mapping key we iterate over the query and split them in parts.\n // recording:rule{label=~\"/label/value\"} * some:other:rule{other_label=\"value\"}\n // We want to keep parts in here like this:\n // recording:rule\n // {label=~\"/label/value\"} *\n // some:other:rule\n // {other_label=\"value\"}\n const tmpSplitParts = Object.keys(mapping).reduce<string[]>(\n (prev, curr) => {\n let parts: string[] = [];\n let tmpParts: string[] = [];\n let removeIdx: number[] = [];\n\n // we iterate over prev because it might be like this after first loop\n // recording:rule and {label=~\"/label/value\"} * some:other:rule{other_label=\"value\"}\n // so we need to split the second part too\n prev.filter(Boolean).forEach((p, i) => {\n const doesMatch = p.match(getRuleRegex(curr));\n if (doesMatch) {\n parts = p.split(curr);\n if (parts.length === 2) {\n // this is the case when we have such result for this query\n // max (metric{label=\"value\"})\n // \"max(\", \"{label=\"value\"}\"\n removeIdx.push(i);\n tmpParts.push(...[parts[0], curr, parts[1]].filter(Boolean));\n } else if (parts.length > 2) {\n // this is the case when we have such query\n // metric + metric\n // when we split it we have such data\n // \"\", \" + \", \"\"\n removeIdx.push(i);\n parts = parts.map((p) => (p === '' ? curr : p));\n tmpParts.push(...parts);\n }\n }\n });\n\n // if we have idx to remove that means we split the value in that index.\n // No need to keep it. Have the new split values instead.\n removeIdx.forEach((ri) => (prev[ri] = ''));\n prev = prev.filter(Boolean);\n prev.push(...tmpParts);\n\n return prev;\n },\n [query]\n );\n\n // we have the separate parts. we need to replace the metric and apply the labels if there is any\n let labelFound = false;\n const trulyExpandedQuery = tmpSplitParts.map((tsp, i) => {\n // if we know this loop tsp is a label, not the metric we want to expand\n if (labelFound) {\n labelFound = false;\n return '';\n }\n\n // check if the mapping is there\n if (mapping[tsp]) {\n const { expandedQuery: recordingRule, identifierValue, identifier } = mapping[tsp];\n // it is a recording rule. if the following is a label then apply it\n if (i + 1 !== tmpSplitParts.length && tmpSplitParts[i + 1].match(labelRegexp)) {\n // the next value in the loop is label. Let's apply labels to the metric\n labelFound = true;\n const regexp = new RegExp(`(,)?(\\\\s)?(${identifier}=\\\\\"${identifierValue}\\\\\")(,)?(\\\\s)?`, 'g');\n const labels = tmpSplitParts[i + 1].replace(regexp, '');\n const invalidLabelsRegex = /(\\)\\{|\\}\\{|\\]\\{)/;\n return addLabelsToExpression(recordingRule + labels, invalidLabelsRegex);\n } else {\n // it is not a recording rule and might be a binary operation in between two recording rules\n // So no need to do anything. just return it.\n return recordingRule;\n }\n }\n\n return tsp;\n });\n\n // Remove empty strings and merge them\n return trulyExpandedQuery.filter(Boolean).join('');\n}\n\nfunction addLabelsToExpression(expr: string, invalidLabelsRegexp: RegExp) {\n const match = expr.match(invalidLabelsRegexp);\n if (!match) {\n return expr;\n }\n\n // Split query into 2 parts - before the invalidLabelsRegex match and after.\n const indexOfRegexMatch = match.index ?? 0;\n const exprBeforeRegexMatch = expr.slice(0, indexOfRegexMatch + 1);\n const exprAfterRegexMatch = expr.slice(indexOfRegexMatch + 1);\n\n // Create arrayOfLabelObjects with label objects that have key, operator and value.\n const arrayOfLabelObjects: Array<{\n key: string;\n operator: string;\n value: string;\n comma?: string;\n space?: string;\n }> = [];\n exprAfterRegexMatch.replace(labelRegexp, (label, key, operator, value, comma, space) => {\n arrayOfLabelObjects.push({ key, operator, value, comma, space });\n return '';\n });\n\n // Loop through all label objects and add them to query.\n // As a starting point we have valid query without the labels.\n let result = exprBeforeRegexMatch;\n arrayOfLabelObjects.filter(Boolean).forEach((obj) => {\n // Remove extra set of quotes from obj.value\n const value = obj.value.slice(1, -1);\n result = addLabelToQuery(result, obj.key, value, obj.operator);\n });\n\n // reconstruct the labels\n let existingLabel = arrayOfLabelObjects.reduce((prev, curr) => {\n prev += `${curr.key}${curr.operator}${curr.value}${curr.comma ?? ''}${curr.space ?? ''}`;\n return prev;\n }, '');\n\n // Check if there is anything besides labels\n // Useful for this kind of metrics sum (recording_rule_metric{label1=\"value1\"}) by (env)\n // if we don't check this part, ) by (env) part will be lost\n existingLabel = '{' + existingLabel + '}';\n const potentialLeftOver = exprAfterRegexMatch.replace(existingLabel, '');\n\n return result + potentialLeftOver;\n}\n\n/**\n * Adds metadata for synthetic metrics for which the API does not provide metadata.\n * See https://github.com/grafana/grafana/issues/22337 for details.\n *\n * @param metadata HELP and TYPE metadata from /api/v1/metadata\n */\nexport function fixSummariesMetadata(metadata: { [metric: string]: PromMetricsMetadataItem[] }): PromMetricsMetadata {\n if (!metadata) {\n return metadata;\n }\n const baseMetadata: PromMetricsMetadata = {};\n const summaryMetadata: PromMetricsMetadata = {};\n for (const metric in metadata) {\n // NOTE: based on prometheus-documentation, we can receive\n // multiple metadata-entries for the given metric, it seems\n // it happens when the same metric is on multiple targets\n // and their help-text differs\n // (https://prometheus.io/docs/prometheus/latest/querying/api/#querying-metric-metadata)\n // for now we just use the first entry.\n const item = metadata[metric][0];\n baseMetadata[metric] = item;\n\n if (item.type === 'histogram') {\n summaryMetadata[`${metric}_bucket`] = {\n type: 'counter',\n help: `Cumulative counters for the observation buckets (${item.help})`,\n };\n summaryMetadata[`${metric}_count`] = {\n type: 'counter',\n help: `Count of events that have been observed for the histogram metric (${item.help})`,\n };\n summaryMetadata[`${metric}_sum`] = {\n type: 'counter',\n help: `Total sum of all observed values for the histogram metric (${item.help})`,\n };\n }\n if (item.type === 'summary') {\n summaryMetadata[`${metric}_count`] = {\n type: 'counter',\n help: `Count of events that have been observed for the base metric (${item.help})`,\n };\n summaryMetadata[`${metric}_sum`] = {\n type: 'counter',\n help: `Total sum of all observed values for the base metric (${item.help})`,\n };\n }\n }\n // Synthetic series\n const syntheticMetadata: PromMetricsMetadata = {};\n syntheticMetadata['ALERTS'] = {\n type: 'gauge',\n help: 'Time series showing pending and firing alerts. The sample value is set to 1 as long as the alert is in the indicated active (pending or firing) state.',\n };\n\n return { ...baseMetadata, ...summaryMetadata, ...syntheticMetadata };\n}\n\nexport function roundMsToMin(milliseconds: number): number {\n return roundSecToMin(milliseconds / 1000);\n}\n\nfunction roundSecToMin(seconds: number): number {\n return Math.floor(seconds / 60);\n}\n\n// Returns number of minutes rounded up to the nearest nth minute\nfunction roundSecToNextMin(seconds: number, secondsToRound = 1): number {\n return Math.ceil(seconds / 60) - (Math.ceil(seconds / 60) % secondsToRound);\n}\n\nfunction limitSuggestions(items: string[]) {\n return items.slice(0, SUGGESTIONS_LIMIT);\n}\n\nconst FromPromLikeMap: Record<string, AbstractLabelOperator> = {\n '=': AbstractLabelOperator.Equal,\n '!=': AbstractLabelOperator.NotEqual,\n '=~': AbstractLabelOperator.EqualRegEx,\n '!~': AbstractLabelOperator.NotEqualRegEx,\n};\n\nconst ToPromLikeMap: Record<AbstractLabelOperator, string> = invert(FromPromLikeMap) as Record<\n AbstractLabelOperator,\n string\n>;\n\nfunction toPromLikeExpr(labelBasedQuery: AbstractQuery): string {\n const expr = labelBasedQuery.labelMatchers\n .map((selector: AbstractLabelMatcher) => {\n const operator = ToPromLikeMap[selector.operator];\n if (operator) {\n return `${selector.name}${operator}\"${selector.value}\"`;\n } else {\n return '';\n }\n })\n .filter((e: string) => e !== '')\n .join(', ');\n\n return expr ? `{${expr}}` : '';\n}\n\nexport function toPromLikeQuery(labelBasedQuery: AbstractQuery): PromLikeQuery {\n return {\n refId: labelBasedQuery.refId,\n expr: toPromLikeExpr(labelBasedQuery),\n range: true,\n };\n}\n\ninterface PromLikeQuery extends DataQuery {\n expr: string;\n range: boolean;\n}\n\nfunction getMaybeTokenStringContent(token: Token): string {\n if (typeof token.content === 'string') {\n return token.content;\n }\n\n return '';\n}\n\nexport function extractLabelMatchers(tokens: Array<string | Token>): AbstractLabelMatcher[] {\n const labelMatchers: AbstractLabelMatcher[] = [];\n\n for (const token of tokens) {\n if (!(token instanceof Token)) {\n continue;\n }\n\n if (token.type === 'context-labels') {\n let labelKey = '';\n let labelValue = '';\n let labelOperator = '';\n\n const contentTokens = Array.isArray(token.content) ? token.content : [token.content];\n\n for (let currentToken of contentTokens) {\n if (typeof currentToken === 'string') {\n let currentStr: string;\n currentStr = currentToken;\n if (currentStr === '=' || currentStr === '!=' || currentStr === '=~' || currentStr === '!~') {\n labelOperator = currentStr;\n }\n } else if (currentToken instanceof Token) {\n switch (currentToken.type) {\n case 'label-key':\n labelKey = getMaybeTokenStringContent(currentToken);\n break;\n case 'label-value':\n labelValue = getMaybeTokenStringContent(currentToken);\n labelValue = labelValue.substring(1, labelValue.length - 1);\n const labelComparator = FromPromLikeMap[labelOperator];\n if (labelComparator) {\n labelMatchers.push({ name: labelKey, operator: labelComparator, value: labelValue });\n }\n break;\n }\n }\n }\n }\n }\n\n return labelMatchers;\n}\n\n/**\n * Calculates new interval \"snapped\" to the closest Nth minute, depending on cache level datasource setting\n * @param cacheLevel\n * @param range\n */\nexport function getRangeSnapInterval(\n cacheLevel: PrometheusCacheLevel,\n range: TimeRange\n): {\n start: string;\n end: string;\n} {\n // Don't round the range if we're not caching\n if (cacheLevel === PrometheusCacheLevel.None) {\n return {\n start: getPrometheusTime(range.from, false).toString(),\n end: getPrometheusTime(range.to, true).toString(),\n };\n }\n // Otherwise round down to the nearest nth minute for the start time\n const startTime = getPrometheusTime(range.from, false);\n const startTimeQuantizedSeconds = incrRoundDn(startTime, getCacheDurationInMinutes(cacheLevel) * 60);\n\n // And round up to the nearest nth minute for the end time\n const endTime = getPrometheusTime(range.to, true);\n const endTimeQuantizedSeconds = roundSecToNextMin(endTime, getCacheDurationInMinutes(cacheLevel)) * 60;\n\n // If the interval was too short, we could have rounded both start and end to the same time, if so let's add one step to the end\n if (startTimeQuantizedSeconds === endTimeQuantizedSeconds) {\n const endTimePlusOneStep = endTimeQuantizedSeconds + getCacheDurationInMinutes(cacheLevel) * 60;\n return { start: startTimeQuantizedSeconds.toString(), end: endTimePlusOneStep.toString() };\n }\n\n const start = startTimeQuantizedSeconds.toString();\n const end = endTimeQuantizedSeconds.toString();\n\n return { start, end };\n}\n\nexport function 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/**\n * Used to truncate metrics, label names and label value in the query builder select components\n * to improve frontend performance. This is best used with an async select component including\n * the loadOptions property where we should still allow users to search all results with a string.\n * This can be done either storing the total results or querying an api that allows for matching a query.\n *\n * @param array\n * @param limit\n * @returns\n */\nexport function truncateResult<T>(array: T[], limit?: number): T[] {\n if (limit === undefined) {\n limit = PROMETHEUS_QUERY_BUILDER_MAX_RESULTS;\n }\n array.length = Math.min(array.length, limit);\n return array;\n}\n\n/**\n * Removes quotes from a string if they exist.\n * Used to handle utf8 label keys in Prometheus queries.\n *\n * @param {string} input - Input string that may have surrounding quotes\n * @returns {string} String with surrounding quotes removed if they existed\n */\nexport function removeQuotesIfExist(input: string): string {\n const match = input.match(/^\"(.*)\"$/); // extract the content inside the quotes\n return match?.[1] ?? input;\n}\n","import { HistoryItem, TimeRange } from '@grafana/data';\n\nimport { DEFAULT_COMPLETION_LIMIT, METRIC_LABEL } from '../../../constants';\nimport { type PrometheusLanguageProviderInterface } from '../../../language_provider';\nimport { removeQuotesIfExist } from '../../../language_utils';\nimport { PromQuery } from '../../../types';\nimport { escapeForUtf8Support, isValidLegacyName } from '../../../utf8_support';\n\nexport const CODE_MODE_SUGGESTIONS_INCOMPLETE_EVENT = 'codeModeSuggestionsIncomplete';\n\ntype SuggestionsIncompleteEvent = CustomEvent<{\n limit: number;\n datasourceUid: string;\n}>;\n\nexport function isSuggestionsIncompleteEvent(e: Event): e is SuggestionsIncompleteEvent {\n return (\n e.type === CODE_MODE_SUGGESTIONS_INCOMPLETE_EVENT &&\n 'detail' in e &&\n typeof e.detail === 'object' &&\n e.detail !== null &&\n 'limit' in e.detail &&\n 'datasourceUid' in e.detail\n );\n}\n\ninterface Metric {\n name: string;\n help: string;\n type: string;\n isUtf8?: boolean;\n}\n\nexport interface DataProviderParams {\n languageProvider: PrometheusLanguageProviderInterface;\n historyProvider: Array<HistoryItem<PromQuery>>;\n}\n\nexport class DataProvider {\n readonly languageProvider: PrometheusLanguageProviderInterface;\n readonly historyProvider: Array<HistoryItem<PromQuery>>;\n\n readonly queryLabelKeys: typeof this.languageProvider.queryLabelKeys;\n readonly queryLabelValues: typeof this.languageProvider.queryLabelValues;\n /**\n * The text that's been typed so far within the current {@link Monaco.Range | Range}.\n *\n * @remarks\n * This is useful with fuzzy searching items to provide as Monaco autocomplete suggestions.\n */\n private inputInRange: string;\n\n constructor(params: DataProviderParams) {\n this.languageProvider = params.languageProvider;\n this.historyProvider = params.historyProvider;\n this.inputInRange = '';\n\n this.queryLabelKeys = this.languageProvider.queryLabelKeys.bind(this.languageProvider);\n this.queryLabelValues = this.languageProvider.queryLabelValues.bind(this.languageProvider);\n }\n\n /**\n * Queries metric names with optional filtering.\n * Safely constructs regex patterns and handles errors.\n */\n queryMetricNames = async (timeRange: TimeRange, searchTerm: string | undefined): Promise<string[]> => {\n try {\n let match: string | undefined;\n if (searchTerm) {\n const escapedWord = escapeForUtf8Support(removeQuotesIfExist(searchTerm));\n match = `{__name__=~\".*${escapedWord}.*\"}`;\n }\n\n const result = await this.languageProvider.queryLabelValues(\n timeRange,\n METRIC_LABEL,\n match,\n DEFAULT_COMPLETION_LIMIT\n );\n\n return Array.isArray(result) ? result : [];\n } catch (error) {\n console.warn('Failed to query metric names:', error);\n return [];\n }\n };\n\n getHistory(): string[] {\n return this.historyProvider.map((h) => h.query.expr).filter(Boolean);\n }\n\n getAllMetricNames(): string[] {\n return this.languageProvider.retrieveMetrics();\n }\n\n metricNamesToMetrics(metricNames: string[]): Metric[] {\n const metricsMetadata = this.languageProvider.retrieveMetricsMetadata();\n const result: Metric[] = metricNames.map((m) => {\n const metaItem = metricsMetadata?.[m];\n return {\n name: m,\n help: metaItem?.help ?? '',\n type: metaItem?.type ?? '',\n isUtf8: !isValidLegacyName(m),\n };\n });\n\n return result;\n }\n\n private setInputInRange(textInput: string): void {\n this.inputInRange = textInput;\n }\n\n get monacoSettings() {\n return {\n inputInRange: this.inputInRange,\n setInputInRange: this.setInputInRange.bind(this),\n };\n }\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/util.ts\n\n// this helper class is used to make typescript warn you when you forget\n// a case-block in a switch statement.\n// example code that triggers the typescript-error:\n//\n// const x:'A'|'B'|'C' = 'A';\n//\n// switch(x) {\n// case 'A':\n// // something\n// case 'B':\n// // something\n// default:\n// throw new NeverCaseError(x);\n// }\n//\n//\n// typescript will show an error in this case,\n// when you add the missing `case 'C'` code,\n// the problem will be fixed.\n\nexport class NeverCaseError extends Error {\n constructor(value: never) {\n super('should never happen');\n }\n}\n","// Core grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/completions.ts\nimport UFuzzy from '@leeoniya/ufuzzy';\nimport { languages } from 'monaco-editor';\n\nimport { TimeRange } from '@grafana/data';\nimport { config } from '@grafana/runtime';\n\nimport { DEFAULT_COMPLETION_LIMIT } from '../../../constants';\nimport { escapeLabelValueInExactSelector, prometheusRegularEscape } from '../../../escaping';\nimport { getFunctions } from '../../../promql';\nimport { isValidLegacyName } from '../../../utf8_support';\n\nimport { DataProvider } from './data_provider';\nimport { TriggerType } from './monaco-completion-provider';\nimport type { Label, Situation } from './situation';\nimport { NeverCaseError } from './util';\n// FIXME: we should not load this from the \"outside\", but we cannot do that while we have the \"old\" query-field too\n\nexport type CompletionType = 'HISTORY' | 'FUNCTION' | 'METRIC_NAME' | 'DURATION' | 'LABEL_NAME' | 'LABEL_VALUE';\n\n// We cannot use languages.CompletionItemInsertTextRule.InsertAsSnippet because grafana-prometheus package isn't compatible\n// It should first change the moduleResolution to bundler for TS to correctly resolve the types\n// https://github.com/grafana/grafana/pull/96450\nconst InsertAsSnippet = 4;\n\ntype Completion = {\n type: CompletionType;\n label: string;\n insertText: string;\n insertTextRules?: languages.CompletionItemInsertTextRule;\n detail?: string;\n documentation?: string;\n triggerOnInsert?: boolean;\n};\n\nconst metricNamesSearch = {\n // see https://github.com/leeoniya/uFuzzy?tab=readme-ov-file#how-it-works for details\n multiInsert: new UFuzzy({ intraMode: 0 }),\n singleError: new UFuzzy({ intraMode: 1 }),\n};\n\n// Snippet Marker is telling monaco where to show the cursor and maybe a help text\n// With help text example: ${1:labelName}\n// labelName will be shown as selected. So user would know what to type next\nconst snippetMarker = '${1:}';\n\ninterface MetricFilterOptions {\n metricNames: string[];\n inputText: string;\n limit: number;\n}\n\nexport function filterMetricNames({ metricNames, inputText, limit }: MetricFilterOptions): string[] {\n if (!inputText?.trim()) {\n return metricNames.slice(0, limit);\n }\n\n const terms = metricNamesSearch.multiInsert.split(inputText); // e.g. 'some_metric_name or-another' -> ['some', 'metric', 'name', 'or', 'another']\n const isComplexSearch = terms.length > 4;\n const fuzzyResults = isComplexSearch\n ? metricNamesSearch.multiInsert.filter(metricNames, inputText) // for complex searches, prioritize performance by using MultiInsert fuzzy search\n : metricNamesSearch.singleError.filter(metricNames, inputText); // for simple searches, prioritize flexibility by using SingleError fuzzy search\n\n return fuzzyResults ? fuzzyResults.slice(0, limit).map((idx) => metricNames[idx]) : [];\n}\n\n// we order items like: history, functions, metrics\nasync function getAllMetricNamesCompletions(\n searchTerm: string | undefined,\n dataProvider: DataProvider,\n timeRange: TimeRange\n): Promise<Completion[]> {\n let metricNames = await dataProvider.queryMetricNames(timeRange, searchTerm);\n\n return dataProvider.metricNamesToMetrics(metricNames).map((metric) => ({\n type: 'METRIC_NAME',\n label: metric.name,\n detail: `${metric.name} : ${metric.type}`,\n documentation: metric.help,\n ...(metric.isUtf8\n ? {\n insertText: `{\"${metric.name}\"${snippetMarker}}`,\n insertTextRules: InsertAsSnippet,\n }\n : {\n insertText: metric.name,\n }),\n }));\n}\n\nconst getFunctionCompletions: () => Completion[] = () => {\n return getFunctions().map((f) => ({\n type: 'FUNCTION',\n label: f.label,\n insertText: f.insertText ?? '', // i don't know what to do when this is nullish. it should not be.\n detail: f.detail,\n documentation: f.documentation,\n }));\n};\n\nasync function getFunctionsOnlyCompletions(): Promise<Completion[]> {\n return Promise.resolve(getFunctionCompletions());\n}\n\nasync function getAllFunctionsAndMetricNamesCompletions(\n searchTerm: string | undefined,\n dataProvider: DataProvider,\n timeRange: TimeRange\n): Promise<Completion[]> {\n const metricNames = await getAllMetricNamesCompletions(searchTerm, dataProvider, timeRange);\n return [...getFunctionCompletions(), ...metricNames];\n}\n\nconst DURATION_COMPLETIONS: Completion[] = [\n '$__interval',\n '$__range',\n '$__rate_interval',\n '1m',\n '5m',\n '10m',\n '30m',\n '1h',\n '1d',\n].map((text) => ({\n type: 'DURATION',\n label: text,\n insertText: text,\n}));\n\nfunction getAllHistoryCompletions(dataProvider: DataProvider): Completion[] {\n // function getAllHistoryCompletions(queryHistory: PromHistoryItem[]): Completion[] {\n // NOTE: the typescript types are wrong. historyItem.query.expr can be undefined\n const allHistory = dataProvider.getHistory();\n // FIXME: find a better history-limit\n return allHistory.slice(0, 10).map((expr) => ({\n type: 'HISTORY',\n label: expr,\n insertText: expr,\n }));\n}\n\nfunction makeSelector(metricName: string | undefined, labels: Label[]): string | undefined {\n if (metricName === undefined && labels.length === 0) {\n return undefined;\n }\n\n const allLabels = [...labels];\n\n // we transform the metricName to a label, if it exists\n if (metricName !== undefined) {\n allLabels.push({ name: '__name__', value: metricName, op: '=' });\n }\n\n const allLabelTexts = allLabels.map(\n (label) => `${label.name}${label.op}\"${escapeLabelValueInExactSelector(label.value)}\"`\n );\n\n return `{${allLabelTexts.join(',')}}`;\n}\n\nasync function getLabelNames(\n metric: string | undefined,\n otherLabels: Label[],\n dataProvider: DataProvider,\n timeRange: TimeRange\n): Promise<string[]> {\n const selector = makeSelector(metric, otherLabels);\n const labelNames = await dataProvider.queryLabelKeys(timeRange, selector, DEFAULT_COMPLETION_LIMIT);\n // Exclude __name__ from output\n otherLabels.push({ name: '__name__', value: '', op: '!=' });\n const usedLabelNames = new Set(otherLabels.map((l) => l.name));\n // names used in the query\n return labelNames.filter((l) => !usedLabelNames.has(l));\n}\n\nasync function getLabelNamesForCompletions(\n metric: string | undefined,\n suffix: string,\n triggerOnInsert: boolean,\n otherLabels: Label[],\n dataProvider: DataProvider,\n timeRange: TimeRange\n): Promise<Completion[]> {\n const labelNames = await getLabelNames(metric, otherLabels, dataProvider, timeRange);\n return labelNames.map((text) => {\n const isUtf8 = !isValidLegacyName(text);\n return {\n type: 'LABEL_NAME',\n label: text,\n ...(isUtf8\n ? {\n insertText: `\"${text}\"${suffix}`,\n insertTextRules: InsertAsSnippet,\n }\n : {\n insertText: `${text}${suffix}`,\n }),\n triggerOnInsert,\n };\n });\n}\n\nasync function getLabelNamesForSelectorCompletions(\n metric: string | undefined,\n otherLabels: Label[],\n dataProvider: DataProvider,\n timeRange: TimeRange\n): Promise<Completion[]> {\n return getLabelNamesForCompletions(metric, '=', true, otherLabels, dataProvider, timeRange);\n}\n\nasync function getLabelNamesForByCompletions(\n metric: string | undefined,\n otherLabels: Label[],\n dataProvider: DataProvider,\n timeRange: TimeRange\n): Promise<Completion[]> {\n return getLabelNamesForCompletions(metric, '', false, otherLabels, dataProvider, timeRange);\n}\n\nasync function getLabelValues(\n metric: string | undefined,\n labelName: string,\n otherLabels: Label[],\n dataProvider: DataProvider,\n timeRange: TimeRange\n): Promise<string[]> {\n const selector = makeSelector(metric, otherLabels);\n return await dataProvider.queryLabelValues(timeRange, labelName, selector);\n}\n\nasync function getLabelValuesForMetricCompletions(\n metric: string | undefined,\n labelName: string,\n betweenQuotes: boolean,\n otherLabels: Label[],\n dataProvider: DataProvider,\n timeRange: TimeRange\n): Promise<Completion[]> {\n const values = await getLabelValues(metric, labelName, otherLabels, dataProvider, timeRange);\n return values.map((text) => ({\n type: 'LABEL_VALUE',\n label: text,\n insertText: formatLabelValueForCompletion(text, betweenQuotes),\n }));\n}\n\nfunction formatLabelValueForCompletion(value: string, betweenQuotes: boolean): string {\n const text = config.featureToggles.prometheusSpecialCharsInLabelValues ? prometheusRegularEscape(value) : value;\n return betweenQuotes ? text : `\"${text}\"`;\n}\n\nexport async function getCompletions(\n situation: Situation,\n dataProvider: DataProvider,\n timeRange: TimeRange,\n searchTerm?: string,\n triggerType: TriggerType = 'full'\n): Promise<Completion[]> {\n switch (situation.type) {\n case 'IN_DURATION':\n return Promise.resolve(DURATION_COMPLETIONS);\n case 'IN_FUNCTION':\n return triggerType === 'full'\n ? getAllFunctionsAndMetricNamesCompletions(searchTerm, dataProvider, timeRange)\n : getFunctionsOnlyCompletions();\n case 'AT_ROOT': {\n return triggerType === 'full'\n ? getAllFunctionsAndMetricNamesCompletions(searchTerm, dataProvider, timeRange)\n : getFunctionsOnlyCompletions();\n }\n case 'EMPTY': {\n if (triggerType === 'partial') {\n return Promise.resolve(getFunctionCompletions());\n }\n const metricNames = await getAllMetricNamesCompletions(searchTerm, dataProvider, timeRange);\n const historyCompletions = getAllHistoryCompletions(dataProvider);\n return Promise.resolve([...historyCompletions, ...getFunctionCompletions(), ...metricNames]);\n }\n case 'IN_LABEL_SELECTOR_NO_LABEL_NAME':\n return getLabelNamesForSelectorCompletions(situation.metricName, situation.otherLabels, dataProvider, timeRange);\n case 'IN_GROUPING':\n return getLabelNamesForByCompletions(situation.metricName, situation.otherLabels, dataProvider, timeRange);\n case 'IN_LABEL_SELECTOR_WITH_LABEL_NAME':\n return getLabelValuesForMetricCompletions(\n situation.metricName,\n situation.labelName,\n situation.betweenQuotes,\n situation.otherLabels,\n dataProvider,\n timeRange\n );\n default:\n throw new NeverCaseError(situation);\n }\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/situation.ts\nimport type { SyntaxNode, Tree } from '@lezer/common';\nimport {\n AggregateExpr,\n AggregateModifier,\n BinaryExpr,\n EqlRegex,\n EqlSingle,\n FunctionCallBody,\n GroupingLabels,\n Identifier,\n LabelMatchers,\n LabelName,\n MatchOp,\n MatrixSelector,\n Neq,\n NeqRegex,\n NumberDurationLiteralInDurationContext,\n parser,\n PromQL,\n QuotedLabelMatcher,\n QuotedLabelName,\n StringLiteral,\n UnquotedLabelMatcher,\n VectorSelector,\n} from '@prometheus-io/lezer-promql';\n\nimport { NeverCaseError } from './util';\n\ntype Direction = 'parent' | 'firstChild' | 'lastChild' | 'nextSibling';\n\ntype NodeTypeId =\n | 0 // this is used as error-id\n | typeof AggregateExpr\n | typeof AggregateModifier\n | typeof FunctionCallBody\n | typeof GroupingLabels\n | typeof Identifier\n | typeof UnquotedLabelMatcher\n | typeof QuotedLabelMatcher\n | typeof LabelMatchers\n | typeof LabelName\n | typeof QuotedLabelName\n | typeof PromQL\n | typeof StringLiteral\n | typeof VectorSelector\n | typeof MatrixSelector\n | typeof MatchOp\n | typeof EqlSingle\n | typeof Neq\n | typeof EqlRegex\n | typeof NeqRegex;\n\ntype Path = Array<[Direction, NodeTypeId]>;\n\nfunction move(node: SyntaxNode, direction: Direction): SyntaxNode | null {\n switch (direction) {\n case 'parent':\n return node.parent;\n case 'firstChild':\n return node.firstChild;\n case 'lastChild':\n return node.lastChild;\n case 'nextSibling':\n return node.nextSibling;\n default:\n throw new NeverCaseError(direction);\n }\n}\n\nfunction walk(node: SyntaxNode, path: Path): SyntaxNode | null {\n let current: SyntaxNode | null = node;\n for (const [direction, expectedType] of path) {\n current = move(current, direction);\n if (current === null) {\n // we could not move in the direction, we stop\n return null;\n }\n if (current.type.id !== expectedType) {\n // the reached node has wrong type, we stop\n return null;\n }\n }\n return current;\n}\n\nfunction getNodeText(node: SyntaxNode, text: string, utf8?: boolean): string {\n const nodeFrom = utf8 ? node.from + 1 : node.from;\n const nodeTo = utf8 ? node.to - 1 : node.to;\n return text.slice(nodeFrom, nodeTo);\n}\n\nfunction parsePromQLStringLiteral(text: string): string {\n // if it is a string-literal, it is inside quotes of some kind\n const inside = text.slice(1, text.length - 1);\n\n // FIXME: support https://prometheus.io/docs/prometheus/latest/querying/basics/#string-literals\n // FIXME: maybe check other promql code, if all is supported or not\n\n // for now we do only some very simple un-escaping\n\n // we start with double-quotes\n if (text.startsWith('\"') && text.endsWith('\"')) {\n // NOTE: this is not 100% perfect, we only unescape the double-quote,\n // there might be other characters too\n return inside.replace(/\\\\\"/, '\"');\n }\n\n // then single-quote\n if (text.startsWith(\"'\") && text.endsWith(\"'\")) {\n // NOTE: this is not 100% perfect, we only unescape the single-quote,\n // there might be other characters too\n return inside.replace(/\\\\'/, \"'\");\n }\n\n // then backticks\n if (text.startsWith('`') && text.endsWith('`')) {\n return inside;\n }\n\n throw new Error('FIXME: invalid string literal');\n}\n\ntype LabelOperator = '=' | '!=' | '=~' | '!~';\n\nexport type Label = {\n name: string;\n value: string;\n op: LabelOperator;\n};\n\nexport type Situation =\n | {\n type: 'IN_FUNCTION';\n }\n | {\n type: 'AT_ROOT';\n }\n | {\n type: 'EMPTY';\n }\n | {\n type: 'IN_DURATION';\n }\n | {\n type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME';\n metricName?: string;\n otherLabels: Label[];\n // utf8 labels must be in quotes\n betweenQuotes: boolean;\n }\n | {\n type: 'IN_GROUPING';\n metricName: string;\n otherLabels: Label[];\n }\n | {\n type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME';\n metricName?: string;\n labelName: string;\n betweenQuotes: boolean;\n otherLabels: Label[];\n };\n\ntype Resolver = {\n path: NodeTypeId[];\n fun: (node: SyntaxNode, text: string, pos: number) => Situation | null;\n};\n\nfunction isPathMatch(resolverPath: NodeTypeId[], cursorPath: number[]): boolean {\n return resolverPath.every((item, index) => item === cursorPath[index]);\n}\n\nconst ERROR_NODE_NAME: NodeTypeId = 0; // this is used as error-id\n\nconst RESOLVERS: Resolver[] = [\n {\n path: [LabelMatchers, VectorSelector],\n fun: resolveLabelKeysWithEquals,\n },\n {\n path: [StringLiteral, QuotedLabelName, LabelMatchers, VectorSelector],\n fun: resolveUtf8LabelKeysWithEquals,\n },\n {\n path: [PromQL],\n fun: resolveTopLevel,\n },\n {\n // Partially written metric name\n path: [Identifier, VectorSelector, PromQL],\n fun: resolveTopLevel,\n },\n {\n path: [FunctionCallBody],\n fun: resolveInFunction,\n },\n {\n path: [StringLiteral, UnquotedLabelMatcher],\n fun: resolveLabelMatcher,\n },\n {\n path: [StringLiteral, QuotedLabelMatcher],\n fun: resolveQuotedLabelMatcher,\n },\n {\n path: [ERROR_NODE_NAME, BinaryExpr, PromQL],\n fun: resolveTopLevel,\n },\n {\n path: [ERROR_NODE_NAME, UnquotedLabelMatcher],\n fun: resolveLabelMatcher,\n },\n {\n path: [ERROR_NODE_NAME, QuotedLabelMatcher],\n fun: resolveQuotedLabelMatcher,\n },\n {\n path: [ERROR_NODE_NAME, NumberDurationLiteralInDurationContext, MatrixSelector],\n fun: resolveDurations,\n },\n {\n path: [GroupingLabels],\n fun: resolveLabelsForGrouping,\n },\n];\n\nconst LABEL_OP_MAP = new Map<number, LabelOperator>([\n [EqlSingle, '='],\n [EqlRegex, '=~'],\n [Neq, '!='],\n [NeqRegex, '!~'],\n]);\n\nfunction getLabelOp(opNode: SyntaxNode): LabelOperator | null {\n const opChild = opNode.firstChild;\n if (opChild === null) {\n return null;\n }\n\n return LABEL_OP_MAP.get(opChild.type.id) ?? null;\n}\n\nfunction getLabel(labelMatcherNode: SyntaxNode, text: string): Label | null {\n const allowedMatchers = new Set([UnquotedLabelMatcher, QuotedLabelMatcher]);\n if (!allowedMatchers.has(labelMatcherNode.type.id)) {\n return null;\n }\n\n const nameNode =\n walk(labelMatcherNode, [['firstChild', LabelName]]) ?? walk(labelMatcherNode, [['firstChild', QuotedLabelName]]);\n\n if (nameNode === null) {\n return null;\n }\n\n const opNode = walk(nameNode, [['nextSibling', MatchOp]]);\n if (opNode === null) {\n return null;\n }\n\n const op = getLabelOp(opNode);\n if (op === null) {\n return null;\n }\n\n const valueNode = walk(labelMatcherNode, [['lastChild', StringLiteral]]);\n\n if (valueNode === null) {\n return null;\n }\n\n const name = getNodeText(nameNode, text);\n const value = parsePromQLStringLiteral(getNodeText(valueNode, text));\n\n return { name, value, op };\n}\n\nfunction getLabels(labelMatchersNode: SyntaxNode, text: string): Label[] {\n if (labelMatchersNode.type.id !== LabelMatchers) {\n return [];\n }\n\n const matchers = [UnquotedLabelMatcher, QuotedLabelMatcher];\n\n return matchers.reduce<Label[]>((acc, matcher) => {\n labelMatchersNode.getChildren(matcher).forEach((ln) => {\n const label = getLabel(ln, text);\n if (notEmpty(label)) {\n acc.push(label);\n }\n });\n return acc;\n }, []);\n}\n\nfunction getNodeChildren(node: SyntaxNode): SyntaxNode[] {\n let child: SyntaxNode | null = node.firstChild;\n const children: SyntaxNode[] = [];\n while (child !== null) {\n children.push(child);\n child = child.nextSibling;\n }\n return children;\n}\n\nfunction getNodeInSubtree(node: SyntaxNode, typeId: NodeTypeId): SyntaxNode | null {\n // first we try the current node\n if (node.type.id === typeId) {\n return node;\n }\n\n // then we try the children\n const children = getNodeChildren(node);\n for (const child of children) {\n const n = getNodeInSubtree(child, typeId);\n if (n !== null) {\n return n;\n }\n }\n\n return null;\n}\n\nfunction resolveLabelsForGrouping(node: SyntaxNode, text: string, pos: number): Situation | null {\n const aggrExpNode = walk(node, [\n ['parent', AggregateModifier],\n ['parent', AggregateExpr],\n ]);\n if (aggrExpNode === null) {\n return null;\n }\n const bodyNode = aggrExpNode.getChild(FunctionCallBody);\n if (bodyNode === null) {\n return null;\n }\n\n const metricIdNode = getNodeInSubtree(bodyNode, Identifier) ?? getNodeInSubtree(bodyNode, StringLiteral);\n\n if (!metricIdNode) {\n return null;\n }\n\n // Let's check whether it's a utf8 metric.\n // A utf8 metric must be a StringLiteral and its parent must be a QuotedLabelName\n if (metricIdNode.type.id === StringLiteral && metricIdNode.parent?.type.id !== QuotedLabelName) {\n return null;\n }\n\n const metricName = getNodeText(metricIdNode, text, metricIdNode.type.id === StringLiteral);\n\n return {\n type: 'IN_GROUPING',\n metricName,\n otherLabels: [],\n };\n}\n\nfunction resolveLabelMatcher(node: SyntaxNode, text: string, pos: number): Situation | null {\n // we can arrive here in two situation. `node` is either:\n // - a StringNode (like in `{job=\"^\"}`)\n // - or an error node (like in `{job=^}`)\n const inStringNode = !node.type.isError;\n\n const parent = walk(node, [['parent', UnquotedLabelMatcher]]);\n if (parent === null) {\n return null;\n }\n\n const labelNameNode = walk(parent, [['firstChild', LabelName]]);\n if (labelNameNode === null) {\n return null;\n }\n\n const labelName = getNodeText(labelNameNode, text);\n\n const labelMatchersNode = walk(parent, [['parent', LabelMatchers]]);\n if (labelMatchersNode === null) {\n return null;\n }\n\n // now we need to find the other names\n const allLabels = getLabels(labelMatchersNode, text);\n\n // we need to remove \"our\" label from all-labels, if it is in there\n const otherLabels = allLabels.filter((label) => label.name !== labelName);\n\n const metricName = getMetricName(labelMatchersNode, text);\n\n // we are probably in a situation without a metric name\n return {\n type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',\n labelName,\n betweenQuotes: inStringNode,\n otherLabels,\n ...(metricName ? { metricName } : {}),\n };\n}\n\nfunction resolveQuotedLabelMatcher(node: SyntaxNode, text: string, pos: number): Situation | null {\n // we can arrive here in two situation. `node` is either:\n // - a StringNode (like in `{\"job\"=\"^\"}`)\n // - or an error node (like in `{\"job\"=^}`)\n const inStringNode = !node.type.isError;\n\n const parent = walk(node, [['parent', QuotedLabelMatcher]]);\n if (parent === null) {\n return null;\n }\n\n const labelNameNode = walk(parent, [['firstChild', QuotedLabelName]]);\n if (labelNameNode === null) {\n return null;\n }\n\n const labelName = getNodeText(labelNameNode, text);\n\n const labelMatchersNode = walk(parent, [['parent', LabelMatchers]]);\n if (labelMatchersNode === null) {\n return null;\n }\n\n // now we need to find the other names\n const allLabels = getLabels(labelMatchersNode, text);\n\n // we need to remove \"our\" label from all-labels, if it is in there\n const otherLabels = allLabels.filter((label) => label.name !== labelName);\n const metricName = getMetricName(parent.parent!, text);\n\n return {\n type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',\n labelName,\n betweenQuotes: inStringNode,\n otherLabels,\n ...(metricName ? { metricName } : {}),\n };\n}\n\nfunction resolveTopLevel(node: SyntaxNode, text: string, pos: number): Situation {\n return {\n type: 'AT_ROOT',\n };\n}\n\nfunction resolveInFunction(node: SyntaxNode, text: string, pos: number): Situation {\n return {\n type: 'IN_FUNCTION',\n };\n}\n\nfunction resolveDurations(node: SyntaxNode, text: string, pos: number): Situation {\n return {\n type: 'IN_DURATION',\n };\n}\n\nfunction resolveLabelKeysWithEquals(node: SyntaxNode, text: string, pos: number): Situation | null {\n // next false positive:\n // `something{a=\"1\"^}`\n let child = walk(node, [['firstChild', UnquotedLabelMatcher]]);\n if (child !== null) {\n // means the label-matching part contains at least one label already.\n //\n // in this case, we will need to have a `,` character at the end,\n // to be able to suggest adding the next label.\n // the area between the end-of-the-child-node and the cursor-pos\n // must contain a `,` in this case.\n const textToCheck = text.slice(child.to, pos);\n\n if (!textToCheck.includes(',')) {\n return null;\n }\n }\n\n // next false positive:\n // `{\"utf8.metric\"^}`\n child = walk(node, [['firstChild', QuotedLabelName]]);\n if (child !== null) {\n // means the label-matching part contains a utf8 metric.\n //\n // in this case, we will need to have a `,` character at the end,\n // to be able to suggest adding the next label.\n // the area between the end-of-the-child-node and the cursor-pos\n // must contain a `,` in this case.\n const textToCheck = text.slice(child.to, pos);\n\n if (!textToCheck.includes(',')) {\n return null;\n }\n }\n\n const otherLabels = getLabels(node, text);\n const metricName = getMetricName(node, text);\n\n return {\n type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',\n otherLabels,\n betweenQuotes: false,\n ...(metricName ? { metricName } : {}),\n };\n}\n\nfunction resolveUtf8LabelKeysWithEquals(node: SyntaxNode, text: string, pos: number): Situation | null {\n const otherLabels = getLabels(node, text);\n const metricName = node.parent?.parent ? getMetricName(node.parent.parent, text) : null;\n\n return {\n type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',\n otherLabels,\n betweenQuotes: true,\n ...(metricName ? { metricName } : {}),\n };\n}\n\nfunction getMetricName(node: SyntaxNode, text: string): string | null {\n // Legacy Metric metric_name{label=\"value\"}\n const legacyMetricNameNode = walk(node, [\n ['parent', VectorSelector],\n ['firstChild', Identifier],\n ]);\n\n if (legacyMetricNameNode) {\n return getNodeText(legacyMetricNameNode, text);\n }\n\n // check for a utf-8 metric\n // utf-8 metric {\"metric.name\", label=\"value\"}\n const utf8MetricNameNode = walk(node, [\n ['parent', VectorSelector],\n ['firstChild', LabelMatchers],\n ['firstChild', QuotedLabelName],\n ['firstChild', StringLiteral],\n ]);\n\n if (utf8MetricNameNode) {\n return getNodeText(utf8MetricNameNode, text, true);\n }\n\n // no metric name\n return null;\n}\n\n// we find the first error-node in the tree that is at the cursor-position.\n// NOTE: this might be too slow, might need to optimize it\n// (ideas: we do not need to go into every subtree, based on from/to)\n// also, only go to places that are in the sub-tree of the node found\n// by default by lezer. problem is, `next()` will go upward too,\n// and we do not want to go higher than our node\nfunction getErrorNode(tree: Tree, pos: number): SyntaxNode | null {\n const cur = tree.cursorAt(pos);\n while (true) {\n if (cur.from === pos && cur.to === pos) {\n const { node } = cur;\n if (node.type.isError) {\n return node;\n }\n }\n\n if (!cur.next()) {\n break;\n }\n }\n return null;\n}\n\nexport function getSituation(text: string, pos: number): Situation | null {\n // there is a special-case when we are at the start of writing text,\n // so we handle that case first\n\n if (text === '') {\n return {\n type: 'EMPTY',\n };\n }\n\n /**\n PromQL\n Expr\n VectorSelector\n LabelMatchers\n */\n const tree = parser.parse(text);\n\n // if the tree contains error, it is very probable that\n // our node is one of those error-nodes.\n // also, if there are errors, the node lezer finds us,\n // might not be the best node.\n // so first we check if there is an error-node at the cursor-position\n const maybeErrorNode = getErrorNode(tree, pos);\n\n const cur = maybeErrorNode != null ? maybeErrorNode.cursor() : tree.cursorAt(pos);\n const currentNode = cur.node;\n\n const ids = [cur.type.id];\n while (cur.parent()) {\n ids.push(cur.type.id);\n }\n\n for (let resolver of RESOLVERS) {\n // i do not use a foreach because i want to stop as soon\n // as i find something\n if (isPathMatch(resolver.path, ids)) {\n return resolver.fun(currentNode, text, pos);\n }\n }\n\n return null;\n}\n\nfunction notEmpty<TValue>(value: TValue | null | undefined): value is TValue {\n return value !== null && value !== undefined;\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/index.ts\nimport { TimeRange } from '@grafana/data';\nimport type { Monaco, monacoTypes } from '@grafana/ui';\n\nimport { CompletionType, getCompletions } from './completions';\nimport { DataProvider } from './data_provider';\nimport { getSituation } from './situation';\nimport { NeverCaseError } from './util';\n\nexport type TriggerType = 'partial' | 'full';\n\nexport type MonacoQueryFieldLocalState = {\n isManualTriggerRequested: boolean;\n};\n\nconst TRIGGER_CHARACTERS = ['{', ',', '[', '(', '=', '~', ' ', '\"'];\nconst MIN_WORD_LENGTH_FOR_FULL_COMPLETIONS = 3;\n\nexport function getSuggestOptions(): monacoTypes.editor.ISuggestOptions {\n return {\n // monaco-editor sometimes provides suggestions automatically, i am not\n // sure based on what, seems to be by analyzing the words already\n // written.\n // to try it out:\n // - enter `go_goroutines{job~`\n // - have the cursor at the end of the string\n // - press ctrl-enter\n // - you will get two suggestions\n // those were not provided by grafana, they are offered automatically.\n // i want to remove those. the only way i found is:\n // - every suggestion-item has a `kind` attribute,\n // that controls the icon to the left of the suggestion.\n // - items auto-generated by monaco have `kind` set to `text`.\n // - we make sure grafana-provided suggestions do not have `kind` set to `text`.\n // - and then we tell monaco not to show suggestions of kind `text`\n showWords: false,\n };\n}\n\nfunction getMonacoCompletionItemKind(type: CompletionType, monaco: Monaco): monacoTypes.languages.CompletionItemKind {\n switch (type) {\n case 'DURATION':\n return monaco.languages.CompletionItemKind.Unit;\n case 'FUNCTION':\n return monaco.languages.CompletionItemKind.Variable;\n case 'HISTORY':\n return monaco.languages.CompletionItemKind.Snippet;\n case 'LABEL_NAME':\n return monaco.languages.CompletionItemKind.Enum;\n case 'LABEL_VALUE':\n return monaco.languages.CompletionItemKind.EnumMember;\n case 'METRIC_NAME':\n return monaco.languages.CompletionItemKind.Constructor;\n default:\n throw new NeverCaseError(type);\n }\n}\n\nfunction getTriggerType(\n word: monacoTypes.editor.IWordAtPosition | null,\n model: monacoTypes.editor.ITextModel,\n position: monacoTypes.Position,\n state: MonacoQueryFieldLocalState\n): TriggerType {\n // Manual trigger (Ctrl+Space) - always full completions\n if (state.isManualTriggerRequested) {\n return 'full';\n }\n\n const charBeforeCursor = model.getValueInRange({\n startLineNumber: position.lineNumber,\n endLineNumber: position.lineNumber,\n startColumn: Math.max(1, position.column - 1),\n endColumn: position.column,\n });\n\n if (TRIGGER_CHARACTERS.includes(charBeforeCursor)) {\n return 'full';\n }\n\n // For typed words of sufficient length, use full completions\n if (word && word.word.length >= MIN_WORD_LENGTH_FOR_FULL_COMPLETIONS) {\n return 'full';\n }\n\n return 'partial';\n}\n\nexport function getCompletionProvider(\n monaco: Monaco,\n dataProvider: DataProvider,\n timeRange: TimeRange\n): { provider: monacoTypes.languages.CompletionItemProvider; state: MonacoQueryFieldLocalState } {\n const state: MonacoQueryFieldLocalState = {\n isManualTriggerRequested: false,\n };\n\n const provideCompletionItems = (\n model: monacoTypes.editor.ITextModel,\n position: monacoTypes.Position\n ): monacoTypes.languages.ProviderResult<monacoTypes.languages.CompletionList> => {\n const word = model.getWordAtPosition(position);\n const range =\n word != null\n ? monaco.Range.lift({\n startLineNumber: position.lineNumber,\n endLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endColumn: word.endColumn,\n })\n : monaco.Range.fromPositions(position);\n\n // Set input range for data provider\n dataProvider.monacoSettings.setInputInRange(model.getValueInRange(range));\n\n // Get adjusted position for cursor/selection handling\n const adjustedPosition = getAdjustedPosition(position);\n const offset = model.getOffsetAt(adjustedPosition);\n const situation = getSituation(model.getValue(), offset);\n\n // Early exit if no situation detected\n if (situation === null) {\n return Promise.resolve({ suggestions: [], incomplete: false });\n }\n\n const triggerType: TriggerType = getTriggerType(word, model, position, state);\n\n return getCompletions(situation, dataProvider, timeRange, word?.word, triggerType).then((items) => {\n // Monaco by-default alphabetically orders the items.\n // We use a number-as-string sortkey to maintain our custom order\n const maxIndexDigits = items.length > 0 ? items.length.toString().length : 1;\n const suggestions: monacoTypes.languages.CompletionItem[] = items.map((item, index) => ({\n kind: getMonacoCompletionItemKind(item.type, monaco),\n label: item.label,\n insertText: item.insertText,\n insertTextRules: item.insertTextRules,\n detail: item.detail,\n documentation: item.documentation,\n sortText: index.toString().padStart(maxIndexDigits, '0'), // to force the order we have\n range,\n command: item.triggerOnInsert\n ? {\n id: 'editor.action.triggerSuggest',\n title: '',\n }\n : undefined,\n }));\n\n return { suggestions };\n });\n };\n\n // Helper function to handle position adjustment for selection\n function getAdjustedPosition(position: monacoTypes.Position): { column: number; lineNumber: number } {\n let adjustedColumn = position.column;\n\n // Check to see if the browser supports window.getSelection()\n if (window.getSelection) {\n const selectedText = window.getSelection()?.toString();\n // If the user has selected text, adjust the cursor position to be at the start of the selection\n if (selectedText && selectedText.length > 0) {\n adjustedColumn = Math.max(1, adjustedColumn - selectedText.length);\n }\n }\n\n return {\n column: adjustedColumn,\n lineNumber: position.lineNumber,\n };\n }\n\n return {\n provider: {\n triggerCharacters: TRIGGER_CHARACTERS,\n provideCompletionItems,\n },\n state,\n };\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/loki/components/monaco-query-field/monaco-completion-provider/validation.ts\nimport { SyntaxNode } from '@lezer/common';\nimport { LRParser } from '@lezer/lr';\n\n// Although 0 isn't explicitly provided in the @grafana/lezer-logql library as the error node ID, it does appear to be the ID of error nodes within lezer.\nconst ErrorId = 0;\n\nexport const warningTypes: Record<string, string> = {\n SubqueryExpr:\n 'This subquery may return only one data point, preventing rate/increase/delta calculations. Use a range at least twice the step size (e.g., [2x:x]).',\n};\n\nenum NodeType {\n SubqueryExpr = 'SubqueryExpr',\n Duration = 'NumberDurationLiteralInDurationContext',\n}\n\ninterface ParserIssueBoundary {\n startLineNumber: number;\n startColumn: number;\n endLineNumber: number;\n endColumn: number;\n issue: string;\n}\n\ninterface ParseIssue {\n text: string;\n node: SyntaxNode;\n}\n\n/**\n * Conceived to work in combination with the MonacoQueryField component.\n * Given an original query, and it's interpolated version, it will return an array of ParserErrorBoundary\n * objects containing nodes which are actual errors. The interpolated version (even with placeholder variables)\n * is required because variables look like errors for Lezer.\n * @internal\n */\nexport function validateQuery(\n query: string,\n interpolatedQuery: string,\n queryLines: string[],\n parser: LRParser\n): { errors: ParserIssueBoundary[]; warnings: ParserIssueBoundary[] } {\n if (!query) {\n return { errors: [], warnings: [] };\n }\n\n /**\n * To provide support to variable interpolation in query validation, we run the parser in the interpolated\n * query. If there are errors there, we trace them back to the original unparsed query, so we can more\n * accurately highlight the error in the query, since it's likely that the variable name and variable value\n * have different lengths. With this, we also exclude irrelevant parser errors that are produced by\n * lezer not understanding $variables and $__variables, which usually generate 2 or 3 error SyntaxNode.\n */\n const { errors: interpolatedErrors, warnings: interpolatedWarnings } = parseQuery(interpolatedQuery, parser);\n if (!interpolatedErrors.length && !interpolatedWarnings.length) {\n return { errors: [], warnings: [] };\n }\n\n let parseErrors: ParseIssue[] = interpolatedErrors;\n let parseWarnings: ParseIssue[] = interpolatedWarnings;\n if (query !== interpolatedQuery) {\n const { errors: queryErrors, warnings: queryWarnings } = parseQuery(query, parser);\n parseErrors = interpolatedErrors.flatMap(\n (interpolatedError) =>\n queryErrors.filter((queryError) => interpolatedError.text === queryError.text) || interpolatedError\n );\n parseWarnings = interpolatedWarnings.flatMap(\n (interpolatedWarning) =>\n queryWarnings.filter((queryWarning) => interpolatedWarning.node.from === queryWarning.node.from) ||\n interpolatedWarning\n );\n }\n\n const errorBoundaries = parseErrors\n .map((parseError) => findIssueBoundary(query, queryLines, parseError, 'error'))\n .filter(isValidIssueBoundary);\n const warningBoundaries = parseWarnings\n .map((parseWarning) => findIssueBoundary(query, queryLines, parseWarning, 'warning'))\n .filter(isValidIssueBoundary);\n\n return {\n errors: errorBoundaries,\n warnings: warningBoundaries,\n };\n}\n\nfunction parseQuery(query: string, parser: LRParser) {\n const parseErrors: ParseIssue[] = [];\n const parseWarnings: ParseIssue[] = [];\n\n const tree = parser.parse(query);\n tree.iterate({\n enter: (nodeRef): false | void => {\n if (nodeRef.type.id === ErrorId) {\n const node = nodeRef.node;\n parseErrors.push({ node: node, text: query.substring(node.from, node.to) });\n }\n\n if (nodeRef.type.name === NodeType.SubqueryExpr) {\n const node = nodeRef.node;\n const durations: string[] = [];\n\n const children = node.getChildren(NodeType.Duration);\n for (const child of children) {\n durations.push(query.substring(child.from, child.to));\n }\n\n if (durations.length === 2 && durations[0] === durations[1]) {\n parseWarnings.push({ node: node, text: query.substring(node.from, node.to) });\n }\n }\n },\n });\n\n return { errors: parseErrors, warnings: parseWarnings };\n}\n\nfunction findIssueBoundary(\n query: string,\n queryLines: string[],\n parseError: ParseIssue,\n issueType: 'error' | 'warning'\n): ParserIssueBoundary | null {\n if (queryLines.length === 1) {\n const isEmptyString = parseError.node.from === parseError.node.to;\n const errorNode = isEmptyString && parseError.node.parent ? parseError.node.parent : parseError.node;\n let issue: string;\n\n if (issueType === 'error') {\n issue = isEmptyString ? query.substring(errorNode.from, errorNode.to) : parseError.text;\n } else {\n issue = warningTypes[parseError.node.type.name];\n }\n\n return {\n startLineNumber: 1,\n startColumn: errorNode.from + 1,\n endLineNumber: 1,\n endColumn: errorNode.to + 1,\n issue,\n };\n }\n\n let startPos = 0,\n endPos = 0;\n for (let line = 0; line < queryLines.length; line++) {\n endPos = startPos + queryLines[line].length;\n\n if (parseError.node.from > endPos) {\n startPos += queryLines[line].length + 1;\n continue;\n }\n\n return {\n startLineNumber: line + 1,\n startColumn: parseError.node.from - startPos + 1,\n endLineNumber: line + 1,\n endColumn: parseError.node.to - startPos + 1,\n issue: issueType === 'error' ? parseError.text : warningTypes[parseError.node.type.name],\n };\n }\n\n return null;\n}\n\nfunction isValidIssueBoundary(boundary: ParserIssueBoundary | null): boundary is ParserIssueBoundary {\n return boundary !== null;\n}\n\nexport const placeHolderScopedVars = {\n __interval: { text: '1s', value: '1s' },\n __rate_interval: { text: '1s', value: '1s' },\n __auto: { text: '1s', value: '1s' },\n __interval_ms: { text: '1000', value: 1000 },\n __range_ms: { text: '1000', value: 1000 },\n __range_s: { text: '1', value: 1 },\n __range: { text: '1s', value: '1s' },\n};\n","// The MIT License (MIT)\n//\n// Copyright (c) Celian Garcia and Augustin Husson @ Amadeus IT Group\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n'use strict';\n// import { languages } from \"monaco-editor\";\n// noinspection JSUnusedGlobalSymbols\nexport const languageConfiguration = {\n // the default separators except `@$`\n wordPattern: /(-?\\d*\\.\\d\\w*)|([^`~!#%^&*()\\-=+\\[{\\]}\\\\|;:'\",.<>\\/?\\s]+)/g,\n // Not possible to make comments in PromQL syntax\n comments: {\n lineComment: '#',\n },\n brackets: [\n ['{', '}'],\n ['[', ']'],\n ['(', ')'],\n ],\n autoClosingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n ],\n surroundingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n { open: '<', close: '>' },\n ],\n folding: {},\n};\n// PromQL Aggregation Operators\n// (https://prometheus.io/docs/prometheus/latest/querying/operators/#aggregation-operators)\nconst aggregations = [\n 'sum',\n 'min',\n 'max',\n 'avg',\n 'group',\n 'stddev',\n 'stdvar',\n 'count',\n 'count_values',\n 'bottomk',\n 'topk',\n 'quantile',\n];\n// PromQL functions\n// (https://prometheus.io/docs/prometheus/latest/querying/functions/)\nconst functions = [\n 'abs',\n 'absent',\n 'ceil',\n 'changes',\n 'clamp',\n 'clamp_max',\n 'clamp_min',\n 'day_of_month',\n 'day_of_week',\n 'days_in_month',\n 'delta',\n 'deriv',\n 'double_exponential_smoothing',\n 'exp',\n 'floor',\n 'histogram_quantile',\n 'histogram_avg',\n 'histogram_count',\n 'histogram_sum',\n 'histogram_fraction',\n 'histogram_stddev',\n 'histogram_stdvar',\n // Renamed as DoubleExponentialSmoothing with Prometheus v3.x\n // https://github.com/prometheus/prometheus/pull/14930\n 'holt_winters',\n 'hour',\n 'idelta',\n 'increase',\n 'info',\n 'irate',\n 'label_join',\n 'label_replace',\n 'ln',\n 'log2',\n 'log10',\n 'minute',\n 'month',\n 'predict_linear',\n 'rate',\n 'resets',\n 'round',\n 'scalar',\n 'sort',\n 'sort_desc',\n 'sqrt',\n 'time',\n 'timestamp',\n 'vector',\n 'year',\n];\n// PromQL specific functions: Aggregations over time\n// (https://prometheus.io/docs/prometheus/latest/querying/functions/#aggregation_over_time)\nconst aggregationsOverTime = [];\nfor (let _i = 0, aggregations_1 = aggregations; _i < aggregations_1.length; _i++) {\n let agg = aggregations_1[_i];\n aggregationsOverTime.push(agg + '_over_time');\n}\n// PromQL vector matching + the by and without clauses\n// (https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching)\nconst vectorMatching = ['on', 'ignoring', 'group_right', 'group_left', 'by', 'without'];\n// Produce a regex matching elements : (elt1|elt2|...)\nconst vectorMatchingRegex =\n '(' +\n vectorMatching.reduce(function (prev, curr) {\n return prev + '|' + curr;\n }) +\n ')';\n// PromQL Operators\n// (https://prometheus.io/docs/prometheus/latest/querying/operators/)\nconst operators = ['+', '-', '*', '/', '%', '^', '==', '!=', '>', '<', '>=', '<=', 'and', 'or', 'unless'];\n// PromQL offset modifier\n// (https://prometheus.io/docs/prometheus/latest/querying/basics/#offset-modifier)\nconst offsetModifier = ['offset'];\n// Merging all the keywords in one list\nconst keywords = aggregations\n .concat(functions)\n .concat(aggregationsOverTime)\n .concat(vectorMatching)\n .concat(offsetModifier);\n// noinspection JSUnusedGlobalSymbols\nexport const language = {\n ignoreCase: false,\n defaultToken: '',\n tokenPostfix: '.promql',\n keywords: keywords,\n operators: operators,\n vectorMatching: vectorMatchingRegex,\n // we include these common regular expressions\n symbols: /[=><!~?:&|+\\-*\\/^%]+/,\n escapes: /\\\\(?:[abfnrtv\\\\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,\n digits: /\\d+(_+\\d+)*/,\n octaldigits: /[0-7]+(_+[0-7]+)*/,\n binarydigits: /[0-1]+(_+[0-1]+)*/,\n hexdigits: /[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,\n integersuffix: /(ll|LL|u|U|l|L)?(ll|LL|u|U|l|L)?/,\n floatsuffix: /[fFlL]?/,\n // The main tokenizer for our languages\n tokenizer: {\n root: [\n // 'by', 'without' and vector matching\n [/@vectorMatching\\s*(?=\\()/, 'type', '@clauses'],\n // labels\n [/[a-z_]\\w*(?=\\s*(=|!=|=~|!~))/, 'tag'],\n // comments\n [/(^#.*$)/, 'comment'],\n // all keywords have the same color\n [\n /[a-zA-Z_]\\w*/,\n {\n cases: {\n '@keywords': 'type',\n '@default': 'identifier',\n },\n },\n ],\n // strings\n [/\"([^\"\\\\]|\\\\.)*$/, 'string.invalid'],\n [/'([^'\\\\]|\\\\.)*$/, 'string.invalid'],\n [/\"/, 'string', '@string_double'],\n [/'/, 'string', '@string_single'],\n [/`/, 'string', '@string_backtick'],\n // whitespace\n { include: '@whitespace' },\n // delimiters and operators\n [/[{}()\\[\\]]/, '@brackets'],\n [/[<>](?!@symbols)/, '@brackets'],\n [\n /@symbols/,\n {\n cases: {\n '@operators': 'delimiter',\n '@default': '',\n },\n },\n ],\n // numbers\n [/\\d+[smhdwy]/, 'number'],\n [/\\d*\\d+[eE]([\\-+]?\\d+)?(@floatsuffix)/, 'number.float'],\n [/\\d*\\.\\d+([eE][\\-+]?\\d+)?(@floatsuffix)/, 'number.float'],\n [/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/, 'number.hex'],\n [/0[0-7']*[0-7](@integersuffix)/, 'number.octal'],\n [/0[bB][0-1']*[0-1](@integersuffix)/, 'number.binary'],\n [/\\d[\\d']*\\d(@integersuffix)/, 'number'],\n [/\\d(@integersuffix)/, 'number'],\n ],\n string_double: [\n [/[^\\\\\"]+/, 'string'],\n [/@escapes/, 'string.escape'],\n [/\\\\./, 'string.escape.invalid'],\n [/\"/, 'string', '@pop'],\n ],\n string_single: [\n [/[^\\\\']+/, 'string'],\n [/@escapes/, 'string.escape'],\n [/\\\\./, 'string.escape.invalid'],\n [/'/, 'string', '@pop'],\n ],\n string_backtick: [\n [/[^\\\\`$]+/, 'string'],\n [/@escapes/, 'string.escape'],\n [/\\\\./, 'string.escape.invalid'],\n [/`/, 'string', '@pop'],\n ],\n clauses: [\n [/[^(,)]/, 'tag'],\n [/\\)/, 'identifier', '@pop'],\n ],\n whitespace: [[/[ \\t\\r\\n]+/, 'white']],\n },\n};\n// noinspection JSUnusedGlobalSymbols\n// export const completionItemProvider = {\n// provideCompletionItems: function () {\n// // To simplify, we made the choice to never create automatically the parenthesis behind keywords\n// // It is because in PromQL, some keywords need parenthesis behind, some don't, some can have but it's optional.\n// const suggestions = keywords.map(function (value) {\n// return {\n// label: value,\n// kind: languages.CompletionItemKind.Keyword,\n// insertText: value,\n// insertTextRules: languages.CompletionItemInsertTextRule.InsertAsSnippet\n// };\n// });\n// return { suggestions: suggestions };\n// }\n// };\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/MonacoQueryField.tsx\nimport { css } from '@emotion/css';\nimport { parser } from '@prometheus-io/lezer-promql';\nimport { promLanguageDefinition } from 'monaco-promql';\nimport { useEffect, useRef } from 'react';\nimport { useLatest } from 'react-use';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Monaco, monacoTypes, ReactMonacoEditor, useTheme2 } from '@grafana/ui';\n\nimport { Props } from './MonacoQueryFieldProps';\nimport { getOverrideServices } from './getOverrideServices';\nimport { DataProvider } from './monaco-completion-provider/data_provider';\nimport { getCompletionProvider, getSuggestOptions } from './monaco-completion-provider/monaco-completion-provider';\nimport { placeHolderScopedVars, validateQuery } from './monaco-completion-provider/validation';\nimport { language, languageConfiguration } from './promql';\n\nconst options: monacoTypes.editor.IStandaloneEditorConstructionOptions = {\n codeLens: false,\n contextmenu: false,\n // we need `fixedOverflowWidgets` because otherwise in grafana-dashboards\n // the popup is clipped by the panel-visualizations.\n fixedOverflowWidgets: true,\n folding: false,\n fontSize: 14,\n lineDecorationsWidth: 8, // used as \"padding-left\"\n lineNumbers: 'off',\n minimap: { enabled: false },\n overviewRulerBorder: false,\n overviewRulerLanes: 0,\n padding: {\n // these numbers were picked so that visually this matches the previous version\n // of the query-editor the best\n top: 4,\n bottom: 5,\n },\n renderLineHighlight: 'none',\n scrollbar: {\n vertical: 'hidden',\n verticalScrollbarSize: 8, // used as \"padding-right\"\n horizontal: 'hidden',\n horizontalScrollbarSize: 0,\n alwaysConsumeMouseWheel: false,\n },\n scrollBeyondLastLine: false,\n suggest: getSuggestOptions(),\n suggestFontSize: 12,\n wordWrap: 'on',\n quickSuggestionsDelay: 250,\n};\n\n// this number was chosen by testing various values. it might be necessary\n// because of the width of the border, not sure.\n//it needs to do 2 things:\n// 1. when the editor is single-line, it should make the editor height be visually correct\n// 2. when the editor is multi-line, the editor should not be \"scrollable\" (meaning,\n// you do a scroll-movement in the editor, and it will scroll the content by a couple pixels\n// up & down. this we want to avoid)\nconst EDITOR_HEIGHT_OFFSET = 2;\n\nconst PROMQL_LANG_ID = promLanguageDefinition.id;\n\n// we must only run the promql-setup code once\nlet PROMQL_SETUP_STARTED = false;\n\nfunction ensurePromQL(monaco: Monaco) {\n if (PROMQL_SETUP_STARTED === false) {\n PROMQL_SETUP_STARTED = true;\n const { aliases, extensions, mimetypes } = promLanguageDefinition;\n monaco.languages.register({ id: PROMQL_LANG_ID, aliases, extensions, mimetypes });\n\n // @ts-ignore\n monaco.languages.setMonarchTokensProvider(PROMQL_LANG_ID, language);\n // @ts-ignore\n monaco.languages.setLanguageConfiguration(PROMQL_LANG_ID, languageConfiguration);\n }\n}\n\nconst getStyles = (theme: GrafanaTheme2, placeholder: string) => {\n return {\n container: css({\n borderRadius: theme.shape.radius.default,\n border: `1px solid ${theme.components.input.borderColor}`,\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'start',\n alignItems: 'center',\n height: '100%',\n overflow: 'hidden',\n }),\n placeholder: css({\n '::after': {\n content: `'${placeholder}'`,\n fontFamily: theme.typography.fontFamilyMonospace,\n opacity: 0.6,\n },\n }),\n };\n};\n\nconst MonacoQueryField = (props: Props) => {\n const id = uuidv4();\n\n // we need only one instance of `overrideServices` during the lifetime of the react component\n const overrideServicesRef = useRef(getOverrideServices());\n const containerRef = useRef<HTMLDivElement>(null);\n const { languageProvider, history, onBlur, onRunQuery, initialValue, placeholder, datasource, timeRange } = props;\n\n const lpRef = useLatest(languageProvider);\n const historyRef = useLatest(history);\n const onRunQueryRef = useLatest(onRunQuery);\n const onBlurRef = useLatest(onBlur);\n\n const autocompleteDisposeFun = useRef<(() => void) | null>(null);\n\n const theme = useTheme2();\n const styles = getStyles(theme, placeholder);\n\n useEffect(() => {\n // when we unmount, we unregister the autocomplete-function, if it was registered\n return () => {\n autocompleteDisposeFun.current?.();\n };\n }, []);\n\n return (\n <div\n data-testid={selectors.components.QueryField.container}\n className={styles.container}\n // NOTE: we will be setting inline-style-width/height on this element\n ref={containerRef}\n >\n <ReactMonacoEditor\n // see https://github.com/suren-atoyan/monaco-react/issues/365\n saveViewState\n overrideServices={overrideServicesRef.current}\n options={options}\n language=\"promql\"\n value={initialValue}\n beforeMount={(monaco) => {\n ensurePromQL(monaco);\n }}\n onMount={(editor, monaco) => {\n const isEditorFocused = editor.createContextKey<boolean>('isEditorFocused' + id, false);\n // we setup on-blur\n editor.onDidBlurEditorWidget(() => {\n isEditorFocused.set(false);\n onBlurRef.current(editor.getValue());\n });\n editor.onDidFocusEditorText(() => {\n isEditorFocused.set(true);\n });\n const dataProvider = new DataProvider({\n historyProvider: historyRef.current,\n languageProvider: lpRef.current,\n });\n\n // Create completion provider with state for Ctrl+Space detection\n const { provider: completionProvider, state: completionState } = getCompletionProvider(\n monaco,\n dataProvider,\n timeRange\n );\n\n // completion-providers in monaco are not registered directly to editor-instances,\n // they are registered to languages. this makes it hard for us to have\n // separate completion-providers for every query-field-instance\n // (but we need that, because they might connect to different datasources).\n // the trick we do is, we wrap the callback in a \"proxy\",\n // and in the proxy, the first thing is, we check if we are called from\n // \"our editor instance\", and if not, we just return nothing. if yes,\n // we call the completion-provider.\n const filteringCompletionProvider: monacoTypes.languages.CompletionItemProvider = {\n ...completionProvider,\n provideCompletionItems: (model, position, context, token) => {\n // if the model-id does not match, then this call is from a different editor-instance,\n // not \"our instance\", so return nothing\n if (editor.getModel()?.id !== model.id) {\n return { suggestions: [] };\n }\n return completionProvider.provideCompletionItems(model, position, context, token);\n },\n };\n\n const { dispose } = monaco.languages.registerCompletionItemProvider(\n PROMQL_LANG_ID,\n filteringCompletionProvider\n );\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if ((event.ctrlKey || event.metaKey) && event.code === 'Space') {\n // Only handle if this editor is focused\n if (editor.hasTextFocus()) {\n event.preventDefault();\n event.stopPropagation();\n\n completionState.isManualTriggerRequested = true;\n editor.trigger('keyboard', 'editor.action.triggerSuggest', {});\n setTimeout(() => {\n completionState.isManualTriggerRequested = false;\n }, 300);\n }\n }\n };\n\n // Add global listener\n document.addEventListener('keydown', handleKeyDown, true);\n\n // Combine cleanup functions\n autocompleteDisposeFun.current = () => {\n document.removeEventListener('keydown', handleKeyDown, true);\n dispose();\n };\n\n // this code makes the editor resize itself so that the content fits\n // (it will grow taller when necessary)\n // FIXME: maybe move this functionality into CodeEditor, like:\n // <CodeEditor resizingMode=\"single-line\"/>\n const updateElementHeight = () => {\n const containerDiv = containerRef.current;\n if (containerDiv !== null) {\n const pixelHeight = editor.getContentHeight();\n containerDiv.style.height = `${pixelHeight + EDITOR_HEIGHT_OFFSET}px`;\n containerDiv.style.width = '100%';\n const pixelWidth = containerDiv.clientWidth;\n editor.layout({ width: pixelWidth, height: pixelHeight });\n }\n };\n\n editor.onDidContentSizeChange(updateElementHeight);\n updateElementHeight();\n\n // handle: shift + enter\n // FIXME: maybe move this functionality into CodeEditor?\n editor.addCommand(\n monaco.KeyMod.Shift | monaco.KeyCode.Enter,\n () => {\n onRunQueryRef.current(editor.getValue());\n },\n 'isEditorFocused' + id\n );\n\n // Fixes Monaco capturing the search key binding and displaying a useless search box within the Editor.\n // See https://github.com/grafana/grafana/issues/85850\n monaco.editor.addKeybindingRule({\n keybinding: monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyF,\n command: null,\n });\n\n // Something in this configuration of monaco doesn't bubble up [mod]+K,\n // which the command palette uses. Pass the event out of monaco manually\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK, function () {\n global.dispatchEvent(new KeyboardEvent('keydown', { key: 'k', metaKey: true }));\n });\n\n if (placeholder) {\n const placeholderDecorators = [\n {\n range: new monaco.Range(1, 1, 1, 1),\n options: {\n className: styles.placeholder,\n isWholeLine: true,\n },\n },\n ];\n\n let decorators: string[] = [];\n\n const checkDecorators: () => void = () => {\n const model = editor.getModel();\n\n if (!model) {\n return;\n }\n\n const newDecorators = model.getValueLength() === 0 ? placeholderDecorators : [];\n decorators = model.deltaDecorations(decorators, newDecorators);\n };\n\n checkDecorators();\n editor.onDidChangeModelContent(checkDecorators);\n\n editor.onDidChangeModelContent((e) => {\n const model = editor.getModel();\n if (!model) {\n return;\n }\n const query = model.getValue();\n const { errors, warnings } = validateQuery(\n query,\n datasource.interpolateString(query, placeHolderScopedVars),\n model.getLinesContent(),\n parser\n );\n\n const errorMarkers = errors.map(({ issue, ...boundary }) => {\n return {\n message: `${issue ? `Error parsing \"${issue}\"` : 'Parse error'}. The query appears to be incorrect and could fail to be executed.`,\n severity: monaco.MarkerSeverity.Error,\n ...boundary,\n };\n });\n\n const warningMarkers = warnings.map(({ issue, ...boundary }) => {\n return {\n message: `Warning: ${issue}`,\n severity: monaco.MarkerSeverity.Warning,\n ...boundary,\n };\n });\n\n monaco.editor.setModelMarkers(model, 'owner', [...errorMarkers, ...warningMarkers]);\n });\n }\n }}\n />\n </div>\n );\n};\n\n// we will lazy-load this module using React.lazy,\n// and that only supports default-exports,\n// so we have to default-export this, even if\n// it is against the style-guidelines.\n\nexport default MonacoQueryField;\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/MonacoQueryFieldLazy.tsx\nimport { Suspense } from 'react';\n\nimport MonacoQueryField from './MonacoQueryField';\nimport { Props } from './MonacoQueryFieldProps';\n\nexport const MonacoQueryFieldLazy = (props: Props) => {\n return (\n <Suspense fallback={null}>\n <MonacoQueryField {...props} />\n </Suspense>\n );\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/MonacoQueryFieldWrapper.tsx\nimport { useRef } from 'react';\n\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};\n\nexport const MonacoQueryFieldWrapper = (props: Props) => {\n const lastRunValueRef = useRef<string | null>(null);\n const { 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 onChange(value);\n };\n\n return <MonacoQueryFieldLazy onRunQuery={handleRunQuery} onBlur={handleBlur} {...rest} />;\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/PromQueryField.tsx\nimport { css, cx } from '@emotion/css';\nimport { ReactNode, useCallback, useEffect, useState } from 'react';\n\nimport {\n DataFrame,\n getDefaultTimeRange,\n isDataFrame,\n QueryEditorProps,\n QueryHint,\n toLegacyResponseData,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t, Trans } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { clearButtonStyles, Icon, useTheme2 } from '@grafana/ui';\n\nimport { PrometheusDatasource } from '../datasource';\nimport { getInitHints } from '../query_hints';\nimport { PromOptions, PromQuery } from '../types';\n\nimport { MetricsBrowser } from './metrics-browser/MetricsBrowser';\nimport { MetricsBrowserProvider } from './metrics-browser/MetricsBrowserContext';\nimport { MonacoQueryFieldWrapper } from './monaco-query-field/MonacoQueryFieldWrapper';\n\ninterface PromQueryFieldProps extends QueryEditorProps<PrometheusDatasource, PromQuery, PromOptions> {\n ExtraFieldElement?: ReactNode;\n hideMetricsBrowser?: boolean;\n 'data-testid'?: string;\n}\n\nexport const PromQueryField = (props: PromQueryFieldProps) => {\n const {\n app,\n datasource,\n datasource: { languageProvider },\n query,\n ExtraFieldElement,\n history = [],\n data,\n range,\n onChange,\n onRunQuery,\n hideMetricsBrowser = false,\n } = props;\n\n const theme = useTheme2();\n\n const [hint, setHint] = useState<QueryHint | null>(null);\n const [labelBrowserVisible, setLabelBrowserVisible] = useState(false);\n\n const refreshHint = useCallback(\n (series: DataFrame[]) => {\n const initHints = getInitHints(datasource);\n const initHint = initHints[0] ?? null;\n\n // If no data or empty series, use default hint\n if (!data?.series?.length) {\n setHint(initHint);\n return;\n }\n\n const result = isDataFrame(series[0]) ? series.map(toLegacyResponseData) : series;\n const queryHints = datasource.getQueryHints(query, result);\n let queryHint = queryHints.length > 0 ? queryHints[0] : null;\n\n setHint(queryHint ?? initHint);\n },\n [data, datasource, query]\n );\n\n useEffect(() => {\n refreshHint(data?.series ?? []);\n }, [data?.series, refreshHint]);\n\n const onChangeQuery = (value: string, override?: boolean) => {\n if (!onChange) {\n return;\n }\n // Send text change to parent\n const nextQuery: PromQuery = { ...query, expr: value };\n onChange(nextQuery);\n\n if (override && onRunQuery) {\n onRunQuery();\n }\n };\n\n const onChangeLabelBrowser = (selector: string) => {\n onChangeQuery(selector, true);\n setLabelBrowserVisible(false);\n };\n\n const onClickChooserButton = () => {\n setLabelBrowserVisible(!labelBrowserVisible);\n\n reportInteraction('user_grafana_prometheus_metrics_browser_clicked', {\n editorMode: labelBrowserVisible ? 'metricViewClosed' : 'metricViewOpen',\n app: app ?? '',\n });\n };\n\n const onClickHintFix = () => {\n if (hint?.fix?.action) {\n onChange(datasource.modifyQuery(query, hint.fix.action));\n }\n onRunQuery();\n };\n\n return (\n <>\n <div\n className=\"gf-form-inline gf-form-inline--xs-view-flex-column flex-grow-1\"\n data-testid={props['data-testid']}\n >\n {!hideMetricsBrowser && (\n <button\n className=\"gf-form-label query-keyword pointer\"\n onClick={onClickChooserButton}\n disabled={datasource.lookupsDisabled}\n type=\"button\"\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.code.metricsBrowser.openButton}\n >\n {datasource.lookupsDisabled ? (\n <Trans i18nKey=\"grafana-prometheus.metrics-browser.disabled-label\">(Disabled)</Trans>\n ) : (\n <Trans i18nKey=\"grafana-prometheus.metrics-browser.enabled-label\">Metrics browser</Trans>\n )}\n <Icon name={labelBrowserVisible ? 'angle-down' : 'angle-right'} />\n </button>\n )}\n\n <div className=\"flex-grow-1 min-width-15\">\n <MonacoQueryFieldWrapper\n languageProvider={languageProvider}\n history={history}\n onChange={onChangeQuery}\n onRunQuery={onRunQuery}\n initialValue={query.expr ?? ''}\n placeholder={t(\n 'grafana-prometheus.components.prom-query-field.placeholder-enter-a-prom-ql-query',\n 'Enter a PromQL query…'\n )}\n datasource={datasource}\n timeRange={range ?? getDefaultTimeRange()}\n />\n </div>\n </div>\n {labelBrowserVisible && (\n <div className=\"gf-form\">\n <MetricsBrowserProvider\n timeRange={range ?? getDefaultTimeRange()}\n languageProvider={languageProvider}\n onChange={onChangeLabelBrowser}\n >\n <MetricsBrowser />\n </MetricsBrowserProvider>\n </div>\n )}\n {ExtraFieldElement}\n {hint ? (\n <div\n className={css({\n flexBasis: '100%',\n })}\n >\n <div className=\"text-warning\">\n {hint.label}{' '}\n {hint.fix ? (\n <button\n type=\"button\"\n className={cx(clearButtonStyles(theme), 'text-link', 'muted')}\n onClick={onClickHintFix}\n >\n {hint.fix.label}\n </button>\n ) : null}\n </div>\n </div>\n ) : null}\n </>\n );\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/OperationExplainedBox.tsx\nimport { css } from '@emotion/css';\nimport * as React from 'react';\n\nimport { GrafanaTheme2, renderMarkdown } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\ninterface Props {\n title?: React.ReactNode;\n children?: React.ReactNode;\n markdown?: string;\n stepNumber?: number;\n}\n\nexport function OperationExplainedBox({ title, stepNumber, markdown, children }: Props) {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.box}>\n {stepNumber !== undefined && <div className={styles.stepNumber}>{stepNumber}</div>}\n <div className={styles.boxInner}>\n {title && (\n <div className={styles.header}>\n <span>{title}</span>\n </div>\n )}\n <div className={styles.body}>\n {markdown && <div dangerouslySetInnerHTML={{ __html: renderMarkdown(markdown) }}></div>}\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n box: css({\n background: theme.colors.background.secondary,\n padding: theme.spacing(1),\n borderRadius: theme.shape.radius.default,\n position: 'relative',\n }),\n boxInner: css({\n marginLeft: theme.spacing(4),\n }),\n stepNumber: css({\n fontWeight: theme.typography.fontWeightMedium,\n background: theme.colors.secondary.main,\n width: '20px',\n height: '20px',\n borderRadius: theme.shape.radius.circle,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'absolute',\n top: '10px',\n left: '11px',\n fontSize: theme.typography.bodySmall.fontSize,\n }),\n header: css({\n paddingBottom: theme.spacing(0.5),\n display: 'flex',\n alignItems: 'center',\n fontFamily: theme.typography.fontFamilyMonospace,\n }),\n body: css({\n color: theme.colors.text.secondary,\n 'p:last-child': {\n margin: 0,\n },\n a: {\n color: theme.colors.text.link,\n textDecoration: 'underline',\n },\n }),\n };\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/RawQuery.tsx\nimport { css, cx } from '@emotion/css';\nimport Prism, { Grammar } from 'prismjs';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { useTheme2 } from '@grafana/ui';\n\ninterface Props {\n query: string;\n lang: {\n grammar: Grammar;\n name: string;\n };\n className?: string;\n}\n\nexport function RawQuery({ query, lang, className }: Props) {\n const theme = useTheme2();\n const styles = getStyles(theme);\n const highlighted = Prism.highlight(query, lang.grammar, lang.name);\n\n return (\n <div\n className={cx(styles.editorField, 'prism-syntax-highlight', className)}\n aria-label={t('grafana-prometheus.querybuilder.raw-query.aria-label-selector', 'selector')}\n dangerouslySetInnerHTML={{ __html: highlighted }}\n />\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n editorField: css({\n fontFamily: theme.typography.fontFamilyMonospace,\n fontSize: theme.typography.bodySmall.fontSize,\n }),\n };\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/OperationListExplained.tsx\nimport { Grammar } from 'prismjs';\n\nimport { OperationExplainedBox } from './OperationExplainedBox';\nimport { RawQuery } from './RawQuery';\nimport { QueryBuilderOperation, QueryWithOperations, VisualQueryModeller } from './types';\n\ninterface Props<T extends QueryWithOperations> {\n query: T;\n queryModeller: VisualQueryModeller;\n explainMode?: boolean;\n stepNumber: number;\n lang: {\n grammar: Grammar;\n name: string;\n };\n onMouseEnter?: (op: QueryBuilderOperation, index: number) => void;\n onMouseLeave?: (op: QueryBuilderOperation, index: number) => void;\n}\n\nexport function OperationListExplained<T extends QueryWithOperations>({\n query,\n queryModeller,\n stepNumber,\n lang,\n onMouseEnter,\n onMouseLeave,\n}: Props<T>) {\n return (\n <>\n {query.operations.map((op, index) => {\n const def = queryModeller.getOperationDef(op.id);\n if (!def) {\n return `Operation ${op.id} not found`;\n }\n const title = def.renderer(op, def, '<expr>');\n const body = def.explainHandler ? def.explainHandler(op, def) : (def.documentation ?? 'no docs');\n\n return (\n <div\n key={index}\n onMouseEnter={() => onMouseEnter?.(op, index)}\n onMouseLeave={() => onMouseLeave?.(op, index)}\n >\n <OperationExplainedBox\n stepNumber={index + stepNumber}\n title={<RawQuery query={title} lang={lang} />}\n markdown={body}\n />\n </div>\n );\n })}\n </>\n );\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/operations.ts\nimport { binaryScalarOperations } from './binaryScalarOperations';\nimport {\n defaultAddOperationHandler,\n functionRendererLeft,\n functionRendererRight,\n getPromOperationDisplayName,\n getRangeVectorParamDef,\n rangeRendererLeftWithParams,\n rangeRendererRightWithParams,\n} from './operationUtils';\nimport {\n QueryBuilderOperation,\n QueryBuilderOperationDef,\n QueryWithOperations,\n VisualQueryModeller,\n} from './shared/types';\nimport { PromOperationId, PromVisualQuery, PromVisualQueryOperationCategory } from './types';\n\nexport function getOperationDefinitions(): QueryBuilderOperationDef[] {\n const list: QueryBuilderOperationDef[] = [\n {\n id: PromOperationId.HistogramQuantile,\n name: 'Histogram quantile',\n params: [{ name: 'Quantile', type: 'number', options: [0.99, 0.95, 0.9, 0.75, 0.5, 0.25] }],\n defaultParams: [0.9],\n category: PromVisualQueryOperationCategory.Functions,\n renderer: functionRendererLeft,\n addOperationHandler: defaultAddOperationHandler,\n },\n createFunction({ id: PromOperationId.HistogramAvg }),\n createFunction({ id: PromOperationId.HistogramCount }),\n createFunction({ id: PromOperationId.HistogramSum }),\n {\n id: PromOperationId.HistogramFraction,\n name: 'Histogram fraction',\n params: [\n { name: 'Lower scalar', type: 'number' },\n { name: 'Upper scalar', type: 'number' },\n ],\n defaultParams: [0.0, 0.2],\n category: PromVisualQueryOperationCategory.Functions,\n renderer: functionRendererLeft,\n addOperationHandler: defaultAddOperationHandler,\n },\n createFunction({ id: PromOperationId.HistogramStddev }),\n createFunction({ id: PromOperationId.HistogramStdvar }),\n {\n id: PromOperationId.LabelReplace,\n name: 'Label replace',\n params: [\n { name: 'Destination label', type: 'string' },\n { name: 'Replacement', type: 'string' },\n { name: 'Source label', type: 'string' },\n { name: 'Regex', type: 'string' },\n ],\n category: PromVisualQueryOperationCategory.Functions,\n defaultParams: ['', '$1', '', '(.*)'],\n renderer: functionRendererRight,\n addOperationHandler: defaultAddOperationHandler,\n },\n {\n id: PromOperationId.Ln,\n name: 'Ln',\n params: [],\n defaultParams: [],\n category: PromVisualQueryOperationCategory.Functions,\n renderer: functionRendererLeft,\n addOperationHandler: defaultAddOperationHandler,\n },\n createRangeFunction(PromOperationId.Changes),\n createRangeFunction(PromOperationId.Rate, true),\n createRangeFunction(PromOperationId.Irate),\n createRangeFunction(PromOperationId.Increase, true),\n createRangeFunction(PromOperationId.Idelta),\n createRangeFunction(PromOperationId.Delta),\n createFunction({\n id: PromOperationId.DoubleExponentialSmoothing,\n params: [\n getRangeVectorParamDef(),\n { name: 'Smoothing Factor', type: 'number' },\n { name: 'Trend Factor', type: 'number' },\n ],\n defaultParams: ['$__interval', 0.5, 0.5],\n alternativesKey: 'range function',\n category: PromVisualQueryOperationCategory.RangeFunctions,\n renderer: rangeRendererRightWithParams,\n addOperationHandler: addOperationWithRangeVector,\n changeTypeHandler: operationTypeChangedHandlerForRangeFunction,\n }),\n createFunction({\n id: PromOperationId.HoltWinters,\n params: [\n getRangeVectorParamDef(),\n { name: 'Smoothing Factor', type: 'number' },\n { name: 'Trend Factor', type: 'number' },\n ],\n defaultParams: ['$__interval', 0.5, 0.5],\n alternativesKey: 'range function',\n category: PromVisualQueryOperationCategory.RangeFunctions,\n renderer: rangeRendererRightWithParams,\n addOperationHandler: addOperationWithRangeVector,\n changeTypeHandler: operationTypeChangedHandlerForRangeFunction,\n }),\n createFunction({\n id: PromOperationId.PredictLinear,\n params: [getRangeVectorParamDef(), { name: 'Seconds from now', type: 'number' }],\n defaultParams: ['$__interval', 60],\n alternativesKey: 'range function',\n category: PromVisualQueryOperationCategory.RangeFunctions,\n renderer: rangeRendererRightWithParams,\n addOperationHandler: addOperationWithRangeVector,\n changeTypeHandler: operationTypeChangedHandlerForRangeFunction,\n }),\n createFunction({\n id: PromOperationId.QuantileOverTime,\n params: [getRangeVectorParamDef(), { name: 'Quantile', type: 'number' }],\n defaultParams: ['$__interval', 0.5],\n alternativesKey: 'overtime function',\n category: PromVisualQueryOperationCategory.RangeFunctions,\n renderer: rangeRendererLeftWithParams,\n addOperationHandler: addOperationWithRangeVector,\n changeTypeHandler: operationTypeChangedHandlerForRangeFunction,\n }),\n ...binaryScalarOperations,\n {\n id: PromOperationId.NestedQuery,\n name: 'Binary operation with query',\n params: [],\n defaultParams: [],\n category: PromVisualQueryOperationCategory.BinaryOps,\n renderer: (model, def, innerExpr) => innerExpr,\n addOperationHandler: addNestedQueryHandler,\n },\n createFunction({ id: PromOperationId.Abs }),\n createFunction({ id: PromOperationId.Absent }),\n createFunction({\n id: PromOperationId.Acos,\n category: PromVisualQueryOperationCategory.Trigonometric,\n }),\n createFunction({\n id: PromOperationId.Acosh,\n category: PromVisualQueryOperationCategory.Trigonometric,\n }),\n createFunction({\n id: PromOperationId.Asin,\n category: PromVisualQueryOperationCategory.Trigonometric,\n }),\n createFunction({\n id: PromOperationId.Asinh,\n category: PromVisualQueryOperationCategory.Trigonometric,\n }),\n createFunction({\n id: PromOperationId.Atan,\n category: PromVisualQueryOperationCategory.Trigonometric,\n }),\n createFunction({\n id: PromOperationId.Atanh,\n category: PromVisualQueryOperationCategory.Trigonometric,\n }),\n createFunction({ id: PromOperationId.Ceil }),\n createFunction({\n id: PromOperationId.Clamp,\n name: 'Clamp',\n params: [\n { name: 'Minimum Scalar', type: 'number' },\n { name: 'Maximum Scalar', type: 'number' },\n ],\n defaultParams: [1, 1],\n }),\n\n createFunction({\n id: PromOperationId.ClampMax,\n params: [{ name: 'Maximum Scalar', type: 'number' }],\n defaultParams: [1],\n }),\n createFunction({\n id: PromOperationId.ClampMin,\n params: [{ name: 'Minimum Scalar', type: 'number' }],\n defaultParams: [1],\n }),\n createFunction({\n id: PromOperationId.Cos,\n category: PromVisualQueryOperationCategory.Trigonometric,\n }),\n createFunction({\n id: PromOperationId.Cosh,\n category: PromVisualQueryOperationCategory.Trigonometric,\n }),\n createFunction({\n id: PromOperationId.DayOfMonth,\n category: PromVisualQueryOperationCategory.Time,\n }),\n createFunction({\n id: PromOperationId.DayOfWeek,\n category: PromVisualQueryOperationCategory.Time,\n }),\n createFunction({\n id: PromOperationId.DayOfYear,\n category: PromVisualQueryOperationCategory.Time,\n }),\n createFunction({\n id: PromOperationId.DaysInMonth,\n category: PromVisualQueryOperationCategory.Time,\n }),\n createFunction({ id: PromOperationId.Deg }),\n createRangeFunction(PromOperationId.Deriv),\n //\n createFunction({ id: PromOperationId.Exp }),\n createFunction({ id: PromOperationId.Floor }),\n createFunction({ id: PromOperationId.Hour }),\n createFunction({\n id: PromOperationId.LabelJoin,\n params: [\n {\n name: 'Destination Label',\n type: 'string',\n },\n {\n name: 'Separator',\n type: 'string',\n },\n {\n name: 'Source Label',\n type: 'string',\n restParam: true,\n optional: true,\n },\n ],\n defaultParams: ['', ',', ''],\n renderer: labelJoinRenderer,\n explainHandler: labelJoinExplainHandler,\n addOperationHandler: labelJoinAddOperationHandler,\n }),\n createFunction({ id: PromOperationId.Log10 }),\n createFunction({ id: PromOperationId.Log2 }),\n createFunction({ id: PromOperationId.Minute }),\n createFunction({ id: PromOperationId.Month }),\n createFunction({\n id: PromOperationId.Pi,\n renderer: (model) => `${model.id}()`,\n }),\n createFunction({ id: PromOperationId.Rad }),\n createRangeFunction(PromOperationId.Resets),\n createFunction({\n id: PromOperationId.Round,\n category: PromVisualQueryOperationCategory.Functions,\n params: [{ name: 'To Nearest', type: 'number' }],\n defaultParams: [1],\n }),\n createFunction({ id: PromOperationId.Scalar }),\n createFunction({ id: PromOperationId.Sgn }),\n createFunction({ id: PromOperationId.Sin, category: PromVisualQueryOperationCategory.Trigonometric }),\n createFunction({\n id: PromOperationId.Sinh,\n category: PromVisualQueryOperationCategory.Trigonometric,\n }),\n createFunction({ id: PromOperationId.Sort }),\n createFunction({ id: PromOperationId.SortDesc }),\n createFunction({ id: PromOperationId.Sqrt }),\n createFunction({\n id: PromOperationId.Tan,\n category: PromVisualQueryOperationCategory.Trigonometric,\n }),\n createFunction({\n id: PromOperationId.Tanh,\n category: PromVisualQueryOperationCategory.Trigonometric,\n }),\n createFunction({\n id: PromOperationId.Time,\n renderer: (model) => `${model.id}()`,\n }),\n createFunction({ id: PromOperationId.Timestamp }),\n createFunction({\n id: PromOperationId.Vector,\n params: [{ name: 'Value', type: 'number' }],\n defaultParams: [1],\n renderer: (model) => `${model.id}(${model.params[0]})`,\n }),\n createFunction({ id: PromOperationId.Year }),\n ];\n\n return list;\n}\n\nfunction createFunction(definition: Partial<QueryBuilderOperationDef>): QueryBuilderOperationDef {\n return {\n ...definition,\n id: definition.id!,\n name: definition.name ?? getPromOperationDisplayName(definition.id!),\n params: definition.params ?? [],\n defaultParams: definition.defaultParams ?? [],\n category: definition.category ?? PromVisualQueryOperationCategory.Functions,\n renderer: definition.renderer ?? (definition.params ? functionRendererRight : functionRendererLeft),\n addOperationHandler: definition.addOperationHandler ?? defaultAddOperationHandler,\n };\n}\n\nfunction createRangeFunction(name: string, withRateInterval = false): QueryBuilderOperationDef {\n return {\n id: name,\n name: getPromOperationDisplayName(name),\n params: [getRangeVectorParamDef(withRateInterval)],\n defaultParams: [withRateInterval ? '$__rate_interval' : '$__interval'],\n alternativesKey: 'range function',\n category: PromVisualQueryOperationCategory.RangeFunctions,\n renderer: operationWithRangeVectorRenderer,\n addOperationHandler: addOperationWithRangeVector,\n changeTypeHandler: operationTypeChangedHandlerForRangeFunction,\n };\n}\n\nfunction operationTypeChangedHandlerForRangeFunction(\n operation: QueryBuilderOperation,\n newDef: QueryBuilderOperationDef\n) {\n // validate current parameter\n if (operation.params[0] === '$__rate_interval' && newDef.defaultParams[0] !== '$__rate_interval') {\n operation.params = newDef.defaultParams;\n } else if (operation.params[0] === '$__interval' && newDef.defaultParams[0] !== '$__interval') {\n operation.params = newDef.defaultParams;\n }\n\n return operation;\n}\n\nfunction operationWithRangeVectorRenderer(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDef,\n innerExpr: string\n) {\n let rangeVector = (model.params ?? [])[0] ?? '5m';\n return `${def.id}(${innerExpr}[${rangeVector}])`;\n}\n\n/**\n * Since there can only be one operation with range vector this will replace the current one (if one was added )\n */\nexport function addOperationWithRangeVector(\n def: QueryBuilderOperationDef,\n query: PromVisualQuery,\n modeller: VisualQueryModeller\n) {\n const newOperation: QueryBuilderOperation = {\n id: def.id,\n params: def.defaultParams,\n };\n\n if (query.operations.length > 0) {\n // If operation exists it has to be in the registry so no point to check if it was found\n const firstOp = modeller.getOperationDef(query.operations[0].id)!;\n\n if (firstOp.addOperationHandler === addOperationWithRangeVector) {\n return {\n ...query,\n operations: [newOperation, ...query.operations.slice(1)],\n };\n }\n }\n\n return {\n ...query,\n operations: [newOperation, ...query.operations],\n };\n}\n\nfunction addNestedQueryHandler(def: QueryBuilderOperationDef, query: PromVisualQuery): PromVisualQuery {\n return {\n ...query,\n binaryQueries: [\n ...(query.binaryQueries ?? []),\n {\n operator: '/',\n query,\n },\n ],\n };\n}\n\nfunction labelJoinRenderer(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n const paramZero = model.params[0] ?? '';\n const paramOne = model.params[1] ?? '';\n\n const separator = `\"${paramOne}\"`;\n return `${model.id}(${innerExpr}, \"${paramZero}\", ${separator}, \"${model.params.slice(2).join(separator)}\")`;\n}\n\nfunction labelJoinExplainHandler(op: QueryBuilderOperation, def?: QueryBuilderOperationDef): string {\n let explainMessage = def?.documentation ?? 'no docs';\n\n if (typeof op.params[1] !== 'string') {\n explainMessage += ' 🚨🚨🚨 The `separator` must be a string.';\n }\n\n return explainMessage;\n}\n\nfunction labelJoinAddOperationHandler<T extends QueryWithOperations>(def: QueryBuilderOperationDef, query: T) {\n const newOperation: QueryBuilderOperation = {\n id: def.id,\n params: def.defaultParams,\n };\n\n return {\n ...query,\n operations: [...query.operations, newOperation],\n };\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/aggregations.ts\nimport {\n createAggregationOperation,\n createAggregationOperationWithParam,\n getPromOperationDisplayName,\n getRangeVectorParamDef,\n} from './operationUtils';\nimport { addOperationWithRangeVector } from './operations';\nimport { QueryBuilderOperation, QueryBuilderOperationDef } from './shared/types';\nimport { PromOperationId, PromVisualQueryOperationCategory } from './types';\n\nexport function getAggregationOperations(): QueryBuilderOperationDef[] {\n return [\n ...createAggregationOperation(PromOperationId.Sum),\n ...createAggregationOperation(PromOperationId.Avg),\n ...createAggregationOperation(PromOperationId.Min),\n ...createAggregationOperation(PromOperationId.Max),\n ...createAggregationOperation(PromOperationId.Count),\n ...createAggregationOperation(PromOperationId.Group),\n ...createAggregationOperation(PromOperationId.Stddev),\n ...createAggregationOperation(PromOperationId.Stdvar),\n ...createAggregationOperationWithParam(PromOperationId.TopK, {\n params: [{ name: 'K-value', type: 'number' }],\n defaultParams: [5],\n }),\n ...createAggregationOperationWithParam(PromOperationId.BottomK, {\n params: [{ name: 'K-value', type: 'number' }],\n defaultParams: [5],\n }),\n ...createAggregationOperationWithParam(PromOperationId.CountValues, {\n params: [{ name: 'Identifier', type: 'string' }],\n defaultParams: ['count'],\n }),\n ...createAggregationOperationWithParam(PromOperationId.Quantile, {\n params: [{ name: 'Value', type: 'number' }],\n defaultParams: [1],\n }),\n ...createAggregationOperationWithParam(PromOperationId.LimitK, {\n params: [{ name: 'K-value', type: 'number' }],\n defaultParams: [5],\n }),\n ...createAggregationOperationWithParam(PromOperationId.LimitRatio, {\n params: [{ name: 'Ratio', type: 'number' }],\n defaultParams: [1],\n }),\n createAggregationOverTime(PromOperationId.SumOverTime),\n createAggregationOverTime(PromOperationId.AvgOverTime),\n createAggregationOverTime(PromOperationId.MinOverTime),\n createAggregationOverTime(PromOperationId.MaxOverTime),\n createAggregationOverTime(PromOperationId.CountOverTime),\n createAggregationOverTime(PromOperationId.LastOverTime),\n createAggregationOverTime(PromOperationId.PresentOverTime),\n createAggregationOverTime(PromOperationId.AbsentOverTime),\n createAggregationOverTime(PromOperationId.StddevOverTime),\n ];\n}\n\nfunction createAggregationOverTime(name: string): QueryBuilderOperationDef {\n return {\n id: name,\n name: getPromOperationDisplayName(name),\n params: [getRangeVectorParamDef()],\n defaultParams: ['$__interval'],\n alternativesKey: 'overtime function',\n category: PromVisualQueryOperationCategory.RangeFunctions,\n renderer: operationWithRangeVectorRenderer,\n addOperationHandler: addOperationWithRangeVector,\n };\n}\n\nfunction operationWithRangeVectorRenderer(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDef,\n innerExpr: string\n) {\n let rangeVector = (model.params ?? [])[0] ?? '$__interval';\n return `${def.id}(${innerExpr}[${rangeVector}])`;\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/LokiAndPromQueryModellerBase.ts\nimport { Registry } from '@grafana/data';\n\nimport { renderLabels } from './rendering/labels';\nimport { hasBinaryOp, renderOperations } from './rendering/operations';\nimport { renderQuery, renderBinaryQueries } from './rendering/query';\nimport {\n PrometheusVisualQuery,\n QueryBuilderLabelFilter,\n QueryBuilderOperation,\n QueryBuilderOperationDef,\n VisualQueryBinary,\n VisualQueryModeller,\n} from './types';\n\nexport abstract class PromQueryModellerBase implements VisualQueryModeller {\n protected operationsRegistry: Registry<QueryBuilderOperationDef>;\n private categories: string[] = [];\n private operationsMapCache: Map<string, QueryBuilderOperationDef> | null = null;\n\n constructor(getOperations: () => QueryBuilderOperationDef[]) {\n this.operationsRegistry = new Registry<QueryBuilderOperationDef>(getOperations);\n }\n\n private getOperationsMap(): Map<string, QueryBuilderOperationDef> {\n if (!this.operationsMapCache) {\n this.operationsMapCache = new Map<string, QueryBuilderOperationDef>();\n this.operationsRegistry.list().forEach((op) => {\n this.operationsMapCache!.set(op.id, op);\n });\n }\n return this.operationsMapCache;\n }\n\n protected setOperationCategories(categories: string[]) {\n this.categories = categories;\n }\n\n getOperationsForCategory(category: string) {\n return this.operationsRegistry.list().filter((op) => op.category === category && !op.hideFromList);\n }\n\n getAlternativeOperations(key: string) {\n return this.operationsRegistry.list().filter((op) => op.alternativesKey && op.alternativesKey === key);\n }\n\n getCategories() {\n return this.categories;\n }\n\n getOperationDef(id: string): QueryBuilderOperationDef | undefined {\n return this.operationsRegistry.getIfExists(id);\n }\n\n renderOperations(queryString: string, operations: QueryBuilderOperation[]) {\n return renderOperations(queryString, operations, this.getOperationsMap());\n }\n\n renderBinaryQueries(queryString: string, binaryQueries?: Array<VisualQueryBinary<PrometheusVisualQuery>>) {\n return renderBinaryQueries(queryString, binaryQueries);\n }\n\n renderLabels(labels: QueryBuilderLabelFilter[]) {\n return renderLabels(labels);\n }\n\n renderQuery(query: PrometheusVisualQuery, nested?: boolean) {\n return renderQuery(query, nested, this.getOperationsMap());\n }\n\n hasBinaryOp(query: PrometheusVisualQuery): boolean {\n return hasBinaryOp(query, this.getOperationsMap());\n }\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/PromQueryModeller.ts\nimport { getFunctions } from '../promql';\n\nimport { getAggregationOperations } from './aggregations';\nimport { getOperationDefinitions } from './operations';\nimport { PromQueryModellerBase } from './shared/PromQueryModellerBase';\nimport {\n PromQueryPattern,\n PromQueryPatternType,\n PromVisualQueryOperationCategory,\n PromQueryModellerInterface,\n} from './types';\n\nexport class PromQueryModeller extends PromQueryModellerBase implements PromQueryModellerInterface {\n constructor() {\n super(() => {\n const allOperations = [...getOperationDefinitions(), ...getAggregationOperations()];\n for (const op of allOperations) {\n const func = getFunctions().find((x) => x.insertText === op.id);\n if (func) {\n op.documentation = func.documentation;\n }\n }\n return allOperations;\n });\n\n this.setOperationCategories([\n PromVisualQueryOperationCategory.Aggregations,\n PromVisualQueryOperationCategory.RangeFunctions,\n PromVisualQueryOperationCategory.Functions,\n PromVisualQueryOperationCategory.BinaryOps,\n PromVisualQueryOperationCategory.Trigonometric,\n PromVisualQueryOperationCategory.Time,\n ]);\n }\n\n getQueryPatterns(): PromQueryPattern[] {\n return [\n {\n name: 'Rate then sum',\n type: PromQueryPatternType.Rate,\n operations: [\n { id: 'rate', params: ['$__rate_interval'] },\n { id: 'sum', params: [] },\n ],\n },\n {\n name: 'Rate then sum by(label) then avg',\n type: PromQueryPatternType.Rate,\n operations: [\n { id: 'rate', params: ['$__rate_interval'] },\n { id: '__sum_by', params: [''] },\n { id: 'avg', params: [] },\n ],\n },\n {\n name: 'Histogram quantile on rate',\n type: PromQueryPatternType.Histogram,\n operations: [\n { id: 'rate', params: ['$__rate_interval'] },\n { id: '__sum_by', params: ['le'] },\n { id: 'histogram_quantile', params: [0.95] },\n ],\n },\n {\n name: 'Histogram quantile on increase',\n type: PromQueryPatternType.Histogram,\n operations: [\n { id: 'increase', params: ['$__rate_interval'] },\n { id: '__max_by', params: ['le'] },\n { id: 'histogram_quantile', params: [0.95] },\n ],\n },\n {\n name: 'Binary Query',\n type: PromQueryPatternType.Binary,\n operations: [\n { id: 'rate', params: ['$__rate_interval'] },\n { id: 'sum', params: [] },\n ],\n binaryQueries: [\n {\n operator: '/',\n query: {\n metric: '',\n labels: [],\n operations: [\n { id: 'rate', params: ['$__rate_interval'] },\n { id: 'sum', params: [] },\n ],\n },\n },\n ],\n },\n ];\n }\n}\n","import { PromQueryModeller } from '../PromQueryModeller';\nimport { PromQueryModellerInterface } from '../types';\n\n/**\n * This singleton instance of the Prometheus query modeller is a central point\n * for accessing the query modeller functionality while avoiding circular\n * dependencies in the codebase.\n */\n\nexport const promQueryModeller: PromQueryModellerInterface = new PromQueryModeller();\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryBuilderExplained.tsx\nimport { memo } from 'react';\n\nimport { Stack } from '@grafana/ui';\n\nimport { promqlGrammar } from '../../promql';\nimport { buildVisualQueryFromString } from '../parsing';\nimport { OperationExplainedBox } from '../shared/OperationExplainedBox';\nimport { OperationListExplained } from '../shared/OperationListExplained';\nimport { RawQuery } from '../shared/RawQuery';\nimport { promQueryModeller } from '../shared/modeller_instance';\nimport { PromVisualQuery } from '../types';\n\nexport const EXPLAIN_LABEL_FILTER_CONTENT = 'Fetch all series matching metric name and label filters.';\n\ninterface PromQueryBuilderExplainedProps {\n query: string;\n}\n\nexport const PromQueryBuilderExplained = memo<PromQueryBuilderExplainedProps>(({ query }) => {\n const visQuery = buildVisualQueryFromString(query || '').query;\n const lang = { grammar: promqlGrammar, name: 'promql' };\n\n return (\n <Stack gap={0.5} direction=\"column\">\n <OperationExplainedBox\n stepNumber={1}\n title={<RawQuery query={`${promQueryModeller.renderQuery(visQuery)}`} lang={lang} />}\n >\n {EXPLAIN_LABEL_FILTER_CONTENT}\n </OperationExplainedBox>\n <OperationListExplained<PromVisualQuery>\n stepNumber={2}\n queryModeller={promQueryModeller}\n query={visQuery}\n lang={lang}\n />\n </Stack>\n );\n});\n\nPromQueryBuilderExplained.displayName = 'PromQueryBuilderExplained';\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryCodeEditor.tsx\nimport { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { PromQueryField } from '../../components/PromQueryField';\nimport { PromQueryEditorProps } from '../../components/types';\n\nimport { PromQueryBuilderExplained } from './PromQueryBuilderExplained';\n\ntype PromQueryCodeEditorProps = PromQueryEditorProps & {\n showExplain: boolean;\n};\n\nexport function PromQueryCodeEditor(props: PromQueryCodeEditorProps) {\n const { query, datasource, range, onRunQuery, onChange, data, app, showExplain } = props;\n const styles = useStyles2(getStyles);\n\n return (\n <div\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.code.queryField}\n className={styles.wrapper}\n >\n <PromQueryField\n datasource={datasource}\n query={query}\n range={range}\n onRunQuery={onRunQuery}\n onChange={onChange}\n history={[]}\n data={data}\n app={app}\n />\n {showExplain && <PromQueryBuilderExplained query={query.expr} />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n // This wrapper styling can be removed after the old PromQueryEditor is removed.\n // This is removing margin bottom on the old legacy inline form styles\n wrapper: css({\n '.gf-form': {\n marginBottom: 0,\n },\n }),\n };\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/AnnotationQueryEditor.tsx\n\nimport { memo } from 'react';\n\nimport { AnnotationQuery } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Trans, t } from '@grafana/i18n';\nimport { EditorField, EditorRow, EditorRows, EditorSwitch } from '@grafana/plugin-ui';\nimport { AutoSizeInput, Input, Space } from '@grafana/ui';\n\nimport { PromQueryCodeEditor } from '../querybuilder/components/PromQueryCodeEditor';\nimport { PromQuery } from '../types';\n\nimport { PromQueryEditorProps } from './types';\n\ntype Props = PromQueryEditorProps & {\n annotation?: AnnotationQuery<PromQuery>;\n onAnnotationChange?: (annotation: AnnotationQuery<PromQuery>) => void;\n};\n\nconst PLACEHOLDER_TITLE = '{{alertname}}';\nconst PLACEHOLDER_TEXT = '{{instance}}';\nconst PLACEHOLDER_TAGS = 'label1,label2';\n\n/**\n * AnnotationQueryEditor component for Prometheus datasource.\n * Allows users to configure annotation queries with options for title, tags, text format,\n * and timestamp settings.\n */\nexport const AnnotationQueryEditor = memo(function AnnotationQueryEditor(props: Props) {\n const { annotation, onAnnotationChange, onChange, onRunQuery, query } = props;\n\n if (!annotation || !onAnnotationChange) {\n return (\n <h3>\n <Trans i18nKey=\"grafana-prometheus.components.annotation-query-editor.annotation-data-load-error\">\n Annotation data load error!\n </Trans>\n </h3>\n );\n }\n\n const handleMinStepChange = (value: string) => {\n onChange({ ...query, interval: value });\n };\n\n const handleTitleChange = (value: string) => {\n onAnnotationChange({\n ...annotation,\n titleFormat: value,\n });\n };\n\n const handleTagsChange = (value: string) => {\n onAnnotationChange({\n ...annotation,\n tagKeys: value,\n });\n };\n\n const handleTextChange = (value: string) => {\n onAnnotationChange({\n ...annotation,\n textFormat: value,\n });\n };\n\n const handleUseValueForTimeChange = (checked: boolean) => {\n onAnnotationChange({\n ...annotation,\n useValueForTime: checked,\n });\n };\n\n return (\n <>\n <EditorRows>\n <PromQueryCodeEditor {...props} query={query} showExplain={false} onRunQuery={onRunQuery} onChange={onChange} />\n <EditorRow>\n <EditorField\n label={t('grafana-prometheus.components.annotation-query-editor.label-min-step', 'Min step')}\n tooltip={\n <Trans\n i18nKey=\"grafana-prometheus.components.annotation-query-editor.tooltip-min-step\"\n values={{ intervalVar: '$__interval', rateIntervalVar: '$__rate_interval' }}\n >\n An additional lower limit for the step parameter of the Prometheus query and for the{' '}\n <code>{'{{intervalVar}}'}</code> and <code>{'{{rateIntervalVar}}'}</code> variables.\n </Trans>\n }\n >\n <AutoSizeInput\n type=\"text\"\n aria-label={t(\n 'grafana-prometheus.components.annotation-query-editor.aria-label-lower-limit-parameter',\n 'Set lower limit for the step parameter'\n )}\n placeholder={t('grafana-prometheus.components.annotation-query-editor.placeholder-auto', 'auto')}\n minWidth={10}\n value={query.interval ?? ''}\n onChange={(e) => handleMinStepChange(e.currentTarget.value)}\n id={selectors.components.DataSource.Prometheus.annotations.minStep}\n data-testid={selectors.components.DataSource.Prometheus.annotations.minStep}\n />\n </EditorField>\n </EditorRow>\n </EditorRows>\n <Space v={0.5} />\n <EditorRow>\n <EditorField\n label={t('grafana-prometheus.components.annotation-query-editor.label-title', 'Title')}\n tooltip={t(\n 'grafana-prometheus.components.annotation-query-editor.tooltip-either-pattern-example-instance-replaced-label',\n 'Use either the name or a pattern. For example, {{labelTemplate}} is replaced with label value for the label {{labelName}}.',\n { labelName: 'instance', labelTemplate: '{{instance}}' }\n )}\n >\n <Input\n type=\"text\"\n placeholder={PLACEHOLDER_TITLE}\n value={annotation.titleFormat ?? ''}\n onChange={(event) => handleTitleChange(event.currentTarget.value)}\n data-testid={selectors.components.DataSource.Prometheus.annotations.title}\n />\n </EditorField>\n <EditorField label={t('grafana-prometheus.components.annotation-query-editor.label-tags', 'Tags')}>\n <Input\n type=\"text\"\n placeholder={PLACEHOLDER_TAGS}\n value={annotation.tagKeys ?? ''}\n onChange={(event) => handleTagsChange(event.currentTarget.value)}\n data-testid={selectors.components.DataSource.Prometheus.annotations.tags}\n />\n </EditorField>\n <EditorField\n label={t('grafana-prometheus.components.annotation-query-editor.label-text', 'Text')}\n tooltip={t(\n 'grafana-prometheus.components.annotation-query-editor.tooltip-either-pattern-example-instance-replaced-label',\n 'Use either the name or a pattern. For example, {{labelTemplate}} is replaced with label value for the label {{labelName}}.',\n { labelName: 'instance', labelTemplate: '{{instance}}' }\n )}\n >\n <Input\n type=\"text\"\n placeholder={PLACEHOLDER_TEXT}\n value={annotation.textFormat ?? ''}\n onChange={(event) => handleTextChange(event.currentTarget.value)}\n data-testid={selectors.components.DataSource.Prometheus.annotations.text}\n />\n </EditorField>\n <EditorField\n label={t(\n 'grafana-prometheus.components.annotation-query-editor.label-series-value-as-timestamp',\n 'Series value as timestamp'\n )}\n tooltip={t(\n 'grafana-prometheus.components.annotation-query-editor.tooltip-timestamp-milliseconds-series-value-seconds-multiply',\n 'The unit of timestamp is milliseconds. If the unit of the series value is seconds, multiply its range vector by 1000.'\n )}\n >\n <EditorSwitch\n value={annotation.useValueForTime ?? false}\n onChange={(event) => handleUseValueForTimeChange(event.currentTarget.checked)}\n data-testid={selectors.components.DataSource.Prometheus.annotations.seriesValueAsTimestamp}\n />\n </EditorField>\n </EditorRow>\n </>\n );\n});\n","import { Observable, of } from 'rxjs';\n\nimport {\n AnnotationEvent,\n AnnotationQuery,\n AnnotationSupport,\n DataFrame,\n rangeUtil,\n renderLegendFormat,\n} from '@grafana/data';\n\nimport { AnnotationQueryEditor } from './components/AnnotationQueryEditor';\nimport { PrometheusDatasource } from './datasource';\nimport { PromQuery } from './types';\n\nconst ANNOTATION_QUERY_STEP_DEFAULT = '60s';\n\nexport const PrometheusAnnotationSupport = (ds: PrometheusDatasource): AnnotationSupport<PromQuery> => {\n return {\n QueryEditor: AnnotationQueryEditor,\n prepareAnnotation(json: AnnotationQuery<PromQuery>): AnnotationQuery<PromQuery> {\n // Initialize target if it doesn't exist\n if (!json.target) {\n json.target = {\n expr: '',\n refId: 'Anno',\n };\n }\n\n // Create a new target, preserving existing values when present\n json.target = {\n ...json.target,\n refId: json.target.refId || json.refId || 'Anno',\n expr: json.target.expr || json.expr || '',\n interval: json.target.interval || json.step || '',\n };\n\n // Remove properties that have been transferred to target\n delete json.expr;\n delete json.step;\n\n return json;\n },\n processEvents(anno: AnnotationQuery<PromQuery>, frames: DataFrame[]): Observable<AnnotationEvent[] | undefined> {\n if (!frames.length) {\n return new Observable<undefined>();\n }\n\n const { tagKeys = '', titleFormat = '', textFormat = '' } = anno;\n\n const input = frames[0].meta?.executedQueryString || '';\n const regex = /Step:\\s*([\\d\\w]+)/;\n const match = input.match(regex);\n const stepValue = match ? match[1] : null;\n const step = rangeUtil.intervalToSeconds(stepValue || ANNOTATION_QUERY_STEP_DEFAULT) * 1000;\n const tagKeysArray = tagKeys.split(',');\n\n const eventList: AnnotationEvent[] = [];\n\n for (const frame of frames) {\n if (frame.fields.length === 0) {\n continue;\n }\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.forEach((value: string) => {\n let timeStampValue: number;\n let valueValue: number;\n const time = timeField.values[idx];\n\n // If we want to use value as a time, we use value as timeStampValue and valueValue will be 1\n if (anno.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] > 0);\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: anno,\n title: renderLegendFormat(titleFormat, labels),\n tags,\n text: renderLegendFormat(textFormat, labels),\n };\n }\n\n // Finish up last point if we have one\n if (latestEvent) {\n latestEvent.timeEnd = activeValuesTimestamps[activeValuesTimestamps.length - 1];\n eventList.push(latestEvent);\n }\n }\n\n return of(eventList);\n },\n };\n};\n","import { TimeRange } from '@grafana/data';\nimport { BackendSrvRequest } from '@grafana/runtime';\n\nimport { getDefaultCacheHeaders } from './caching';\nimport { DEFAULT_SERIES_LIMIT, EMPTY_SELECTOR, MATCH_ALL_LABELS, METRIC_LABEL } from './constants';\nimport { PrometheusDatasource } from './datasource';\nimport { getRangeSnapInterval, processHistogramMetrics, removeQuotesIfExist } from './language_utils';\nimport { buildVisualQueryFromString } from './querybuilder/parsing';\nimport { PrometheusCacheLevel } from './types';\nimport { escapeForUtf8Support, utf8Support } from './utf8_support';\n\ntype PrometheusSeriesResponse = Array<{ [key: string]: string }>;\ntype PrometheusLabelsResponse = string[];\n\nexport interface ResourceApiClient {\n metrics: string[];\n histogramMetrics: string[];\n labelKeys: string[];\n cachedLabelValues: Record<string, string[]>;\n\n start: (timeRange: TimeRange) => Promise<void>;\n\n queryMetrics: (timeRange: TimeRange) => Promise<{ metrics: string[]; histogramMetrics: string[] }>;\n queryLabelKeys: (timeRange: TimeRange, match?: string, limit?: number) => Promise<string[]>;\n queryLabelValues: (timeRange: TimeRange, labelKey: string, match?: string, limit?: number) => Promise<string[]>;\n\n querySeries: (timeRange: TimeRange, match: string, limit: number) => Promise<PrometheusSeriesResponse>;\n}\n\ntype RequestFn = (\n url: string,\n params?: Record<string, unknown>,\n options?: Partial<BackendSrvRequest>\n) => Promise<unknown>;\n\nexport abstract class BaseResourceClient {\n private seriesLimit: number;\n\n constructor(\n protected readonly request: RequestFn,\n protected readonly datasource: PrometheusDatasource\n ) {\n this.seriesLimit = this.datasource.seriesLimit;\n }\n\n /**\n * Returns the effective limit to use for API requests.\n * Uses the provided limit if specified, otherwise falls back to the datasource's configured series limit.\n * When zero is provided, it returns zero (which means no limit in Prometheus API).\n *\n * @param {number} [limit] - Optional limit parameter from the API call\n * @returns {number} The limit to use - either the provided limit or datasource's default series limit\n */\n protected getEffectiveLimit(limit?: number): number {\n return limit ?? this.seriesLimit;\n }\n\n protected async requestLabels(\n url: string,\n params?: Record<string, unknown>,\n options?: Partial<BackendSrvRequest>\n ): Promise<PrometheusLabelsResponse> {\n const response = await this.request(url, params, options);\n return Array.isArray(response) ? response : [];\n }\n\n protected async requestSeries(\n url: string,\n params?: Record<string, unknown>,\n options?: Partial<BackendSrvRequest>\n ): Promise<PrometheusSeriesResponse> {\n const response = await this.request(url, params, options);\n return Array.isArray(response) ? response : [];\n }\n\n /**\n * Fetches all time series that match a specific label matcher using **series** endpoint.\n *\n * @param {TimeRange} timeRange - Time range to use for the query\n * @param {string} match - Label matcher to filter time series\n * @param {string} limit - Maximum number of series to return\n */\n public querySeries = async (timeRange: TimeRange, match: string | undefined, limit: number) => {\n const effectiveMatch = !match || match === EMPTY_SELECTOR ? MATCH_ALL_LABELS : match;\n const timeParams = this.datasource.getTimeRangeParams(timeRange);\n const searchParams = { ...timeParams, 'match[]': effectiveMatch, limit };\n return await this.requestSeries('/api/v1/series', searchParams, getDefaultCacheHeaders(this.datasource.cacheLevel));\n };\n}\n\nexport class LabelsApiClient extends BaseResourceClient implements ResourceApiClient {\n private _cache: ResourceClientsCache = new ResourceClientsCache(this.datasource.cacheLevel);\n\n public histogramMetrics: string[] = [];\n public metrics: string[] = [];\n public labelKeys: string[] = [];\n public cachedLabelValues: Record<string, string[]> = {};\n\n start = async (timeRange: TimeRange) => {\n await this.queryMetrics(timeRange);\n this.labelKeys = await this.queryLabelKeys(timeRange);\n };\n\n /**\n * Fetches all available metrics from Prometheus using the labels values endpoint for __name__.\n * Also processes and identifies histogram metrics (those ending with '_bucket').\n * Results are cached and stored in the client instance for future use.\n *\n * @param {TimeRange} timeRange - Time range to search for metrics\n * @param {number} [limit] - Optional maximum number of metrics to return, uses datasource default if not specified\n * @returns {Promise<{metrics: string[], histogramMetrics: string[]}>} Object containing all metrics and filtered histogram metrics\n */\n public queryMetrics = async (\n timeRange: TimeRange,\n limit?: number\n ): Promise<{ metrics: string[]; histogramMetrics: string[] }> => {\n const effectiveLimit = this.getEffectiveLimit(limit);\n this.metrics = await this.queryLabelValues(timeRange, METRIC_LABEL, undefined, effectiveLimit);\n this.histogramMetrics = processHistogramMetrics(this.metrics);\n this._cache.setLabelValues(timeRange, undefined, effectiveLimit, this.metrics);\n return { metrics: this.metrics, histogramMetrics: this.histogramMetrics };\n };\n\n /**\n * Fetches all available label keys from Prometheus using labels endpoint.\n * Uses the labels endpoint with optional match parameter for filtering.\n *\n * @param {TimeRange} timeRange - Time range to use for the query\n * @param {string} match - Optional label matcher to filter results\n * @param {string} limit - Maximum number of results to return\n * @returns {Promise<string[]>} Array of label keys sorted alphabetically\n */\n public queryLabelKeys = async (timeRange: TimeRange, match?: string, limit?: number): Promise<string[]> => {\n let url = '/api/v1/labels';\n const timeParams = getRangeSnapInterval(this.datasource.cacheLevel, timeRange);\n const effectiveLimit = this.getEffectiveLimit(limit);\n const searchParams = { limit: effectiveLimit, ...timeParams, ...(match ? { 'match[]': match } : {}) };\n const effectiveMatch = match ?? '';\n const maybeCachedKeys = this._cache.getLabelKeys(timeRange, effectiveMatch, effectiveLimit);\n if (maybeCachedKeys) {\n return maybeCachedKeys;\n }\n\n const res = await this.requestLabels(url, searchParams, getDefaultCacheHeaders(this.datasource.cacheLevel));\n if (Array.isArray(res)) {\n this.labelKeys = res.slice().sort();\n this._cache.setLabelKeys(timeRange, effectiveMatch, effectiveLimit, this.labelKeys);\n return this.labelKeys.slice();\n }\n\n return [];\n };\n\n /**\n * Fetches all values for a specific label key from Prometheus using labels values endpoint.\n *\n * @param {TimeRange} timeRange - Time range to use for the query\n * @param {string} labelKey - The label key to fetch values for\n * @param {string} match - Optional label matcher to filter results\n * @param {string} limit - Maximum number of results to return\n * @returns {Promise<string[]>} Array of label values\n */\n public queryLabelValues = async (\n timeRange: TimeRange,\n labelKey: string,\n match?: string,\n limit?: number\n ): Promise<string[]> => {\n const timeParams = this.datasource.getAdjustedInterval(timeRange);\n const effectiveLimit = this.getEffectiveLimit(limit);\n const searchParams = { limit: effectiveLimit, ...timeParams, ...(match ? { 'match[]': match } : {}) };\n const interpolatedName = this.datasource.interpolateString(labelKey);\n const interpolatedAndEscapedName = escapeForUtf8Support(removeQuotesIfExist(interpolatedName));\n const effectiveMatch = `${match ?? ''}-${interpolatedAndEscapedName}`;\n const maybeCachedValues = this._cache.getLabelValues(timeRange, effectiveMatch, effectiveLimit);\n if (maybeCachedValues) {\n return maybeCachedValues;\n }\n\n const url = `/api/v1/label/${interpolatedAndEscapedName}/values`;\n const value = await this.requestLabels(url, searchParams, getDefaultCacheHeaders(this.datasource.cacheLevel));\n this._cache.setLabelValues(timeRange, effectiveMatch, effectiveLimit, value ?? []);\n return value ?? [];\n };\n}\n\nexport class SeriesApiClient extends BaseResourceClient implements ResourceApiClient {\n private _cache: ResourceClientsCache = new ResourceClientsCache(this.datasource.cacheLevel);\n\n public histogramMetrics: string[] = [];\n public metrics: string[] = [];\n public labelKeys: string[] = [];\n public cachedLabelValues: Record<string, string[]> = {};\n\n start = async (timeRange: TimeRange) => {\n await this.queryMetrics(timeRange);\n };\n\n public queryMetrics = async (timeRange: TimeRange): Promise<{ metrics: string[]; histogramMetrics: string[] }> => {\n const series = await this.querySeries(timeRange, undefined, DEFAULT_SERIES_LIMIT);\n const { metrics, labelKeys } = processSeries(series, METRIC_LABEL);\n this.metrics = metrics;\n this.histogramMetrics = processHistogramMetrics(this.metrics);\n this.labelKeys = labelKeys;\n this._cache.setLabelValues(timeRange, undefined, DEFAULT_SERIES_LIMIT, metrics);\n this._cache.setLabelKeys(timeRange, undefined, DEFAULT_SERIES_LIMIT, labelKeys);\n return { metrics: this.metrics, histogramMetrics: this.histogramMetrics };\n };\n\n public queryLabelKeys = async (timeRange: TimeRange, match?: string, limit?: number): Promise<string[]> => {\n const effectiveLimit = this.getEffectiveLimit(limit);\n const effectiveMatch = !match || match === EMPTY_SELECTOR ? undefined : match;\n const maybeCachedKeys = this._cache.getLabelKeys(timeRange, effectiveMatch, effectiveLimit);\n if (maybeCachedKeys) {\n return maybeCachedKeys;\n }\n\n const series = await this.querySeries(timeRange, effectiveMatch, effectiveLimit);\n const { labelKeys } = processSeries(series);\n this._cache.setLabelKeys(timeRange, effectiveMatch, effectiveLimit, labelKeys);\n return labelKeys;\n };\n\n public queryLabelValues = async (\n timeRange: TimeRange,\n labelKey: string,\n match?: string,\n limit?: number\n ): Promise<string[]> => {\n let effectiveMatch = '';\n if (!match || match === EMPTY_SELECTOR) {\n // Just and empty matcher {} or no matcher\n effectiveMatch = `{${utf8Support(removeQuotesIfExist(labelKey))}!=\"\"}`;\n } else {\n const {\n query: { metric, labels },\n } = buildVisualQueryFromString(match);\n labels.push({\n label: removeQuotesIfExist(labelKey),\n op: '!=',\n value: '',\n });\n const metricFilter = metric ? `__name__=\"${metric}\",` : '';\n const labelFilters = labels.map((lf) => `${utf8Support(lf.label)}${lf.op}\"${lf.value}\"`).join(',');\n effectiveMatch = `{${metricFilter}${labelFilters}}`;\n }\n\n const effectiveLimit = this.getEffectiveLimit(limit);\n const maybeCachedValues = this._cache.getLabelValues(timeRange, effectiveMatch, effectiveLimit);\n if (maybeCachedValues) {\n return maybeCachedValues;\n }\n\n const series = await this.querySeries(timeRange, effectiveMatch, effectiveLimit);\n const { labelValues } = processSeries(series, removeQuotesIfExist(labelKey));\n this._cache.setLabelValues(timeRange, effectiveMatch, effectiveLimit, labelValues);\n return labelValues;\n };\n}\n\nclass ResourceClientsCache {\n private readonly MAX_CACHE_ENTRIES = 1000; // Maximum number of cache entries\n private readonly MAX_CACHE_SIZE_BYTES = 50 * 1024 * 1024; // 50MB max cache size\n\n private _cache: Record<string, string[]> = {};\n private _accessTimestamps: Record<string, number> = {};\n\n constructor(private cacheLevel: PrometheusCacheLevel = PrometheusCacheLevel.High) {}\n\n public setLabelKeys(timeRange: TimeRange, match: string | undefined, limit: number, keys: string[]) {\n if (keys.length === 0) {\n return;\n }\n // Check and potentially clean cache before adding new entry\n this.cleanCacheIfNeeded();\n const cacheKey = this.getCacheKey(timeRange, match, limit, 'key');\n this._cache[cacheKey] = keys.slice().sort();\n this._accessTimestamps[cacheKey] = Date.now();\n }\n\n public getLabelKeys(timeRange: TimeRange, match: string | undefined, limit: number): string[] | undefined {\n const cacheKey = this.getCacheKey(timeRange, match, limit, 'key');\n const result = this._cache[cacheKey];\n if (result) {\n // Update access timestamp on cache hit\n this._accessTimestamps[cacheKey] = Date.now();\n }\n return result;\n }\n\n public setLabelValues(timeRange: TimeRange, match: string | undefined, limit: number, values: string[]) {\n if (values.length === 0) {\n return;\n }\n // Check and potentially clean cache before adding new entry\n this.cleanCacheIfNeeded();\n const cacheKey = this.getCacheKey(timeRange, match, limit, 'value');\n this._cache[cacheKey] = values.slice().sort();\n this._accessTimestamps[cacheKey] = Date.now();\n }\n\n public getLabelValues(timeRange: TimeRange, match: string, limit: number): string[] | undefined {\n const cacheKey = this.getCacheKey(timeRange, match, limit, 'value');\n const result = this._cache[cacheKey];\n if (result) {\n // Update access timestamp on cache hit\n this._accessTimestamps[cacheKey] = Date.now();\n }\n return result;\n }\n\n private getCacheKey(timeRange: TimeRange, match: string | undefined, limit: number, type: 'key' | 'value') {\n const snappedTimeRange = getRangeSnapInterval(this.cacheLevel, timeRange);\n return [snappedTimeRange.start, snappedTimeRange.end, limit, match, type].join('|');\n }\n\n private cleanCacheIfNeeded() {\n // Check number of entries\n const currentEntries = Object.keys(this._cache).length;\n if (currentEntries >= this.MAX_CACHE_ENTRIES) {\n // Calculate 20% of current entries, but ensure we remove at least 1 entry\n const entriesToRemove = Math.max(1, Math.floor(currentEntries - this.MAX_CACHE_ENTRIES + 1));\n this.removeOldestEntries(entriesToRemove);\n }\n\n // Check cache size in bytes\n const currentSize = this.getCacheSizeInBytes();\n if (currentSize > this.MAX_CACHE_SIZE_BYTES) {\n // Calculate 20% of current entries, but ensure we remove at least 1 entry\n const entriesToRemove = Math.max(1, Math.floor(Object.keys(this._cache).length * 0.2));\n this.removeOldestEntries(entriesToRemove);\n }\n }\n\n private getCacheSizeInBytes(): number {\n let size = 0;\n for (const key in this._cache) {\n // Calculate size of key\n size += key.length * 2; // Approximate size of string in bytes (UTF-16)\n\n // Calculate size of value array\n const value = this._cache[key];\n for (const item of value) {\n size += item.length * 2; // Approximate size of each string in bytes\n }\n }\n return size;\n }\n\n private removeOldestEntries(count: number) {\n // Get all entries sorted by timestamp (oldest first)\n const entries = Object.entries(this._accessTimestamps).sort(\n ([, timestamp1], [, timestamp2]) => timestamp1 - timestamp2\n );\n\n // Take the oldest 'count' entries\n const entriesToRemove = entries.slice(0, count);\n\n // Remove these entries from both cache and timestamps\n for (const [key] of entriesToRemove) {\n delete this._cache[key];\n delete this._accessTimestamps[key];\n }\n }\n}\n\nexport function processSeries(series: Array<{ [key: string]: string }>, findValuesForKey?: string) {\n const metrics: Set<string> = new Set();\n const labelKeys: Set<string> = new Set();\n const labelValues: Set<string> = new Set();\n\n // Extract metrics and label keys\n series.forEach((item) => {\n // Add the __name__ value to metrics\n if (METRIC_LABEL in item) {\n metrics.add(item.__name__);\n }\n\n // Add all keys except __name__ to labelKeys\n Object.keys(item).forEach((key) => {\n if (key !== METRIC_LABEL) {\n labelKeys.add(key);\n }\n if (findValuesForKey && key === findValuesForKey) {\n labelValues.add(item[key]);\n }\n });\n });\n\n return {\n metrics: Array.from(metrics).sort(),\n labelKeys: Array.from(labelKeys).sort(),\n labelValues: Array.from(labelValues).sort(),\n };\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/language_provider.ts\nimport { once } from 'lodash';\nimport Prism from 'prismjs';\n\nimport {\n AbstractLabelMatcher,\n AbstractLabelOperator,\n AbstractQuery,\n AdHocVariableFilter,\n getDefaultTimeRange,\n LanguageProvider,\n Scope,\n scopeFilterOperatorMap,\n ScopeSpecFilter,\n TimeRange,\n} from '@grafana/data';\nimport { BackendSrvRequest } from '@grafana/runtime';\n\nimport { buildCacheHeaders, getDaysToCacheMetadata, getDefaultCacheHeaders } from './caching';\nimport { Label } from './components/monaco-query-field/monaco-completion-provider/situation';\nimport { DEFAULT_SERIES_LIMIT, EMPTY_SELECTOR, REMOVE_SERIES_LIMIT } from './constants';\nimport { PrometheusDatasource } from './datasource';\nimport {\n extractLabelMatchers,\n fixSummariesMetadata,\n processHistogramMetrics,\n processLabels,\n removeQuotesIfExist,\n toPromLikeQuery,\n} from './language_utils';\nimport { promqlGrammar } from './promql';\nimport { buildVisualQueryFromString } from './querybuilder/parsing';\nimport { LabelsApiClient, ResourceApiClient, SeriesApiClient } from './resource_clients';\nimport { PromMetricsMetadata, PromQuery } from './types';\nimport { escapeForUtf8Support, isValidLegacyName } from './utf8_support';\n\nconst DEFAULT_KEYS = ['job', 'instance'];\n\n/**\n * Prometheus API endpoints for fetching resources\n */\nconst API_V1 = {\n METADATA: '/api/v1/metadata',\n SERIES: '/api/v1/series',\n LABELS: '/api/v1/labels',\n LABELS_VALUES: (labelKey: string) => `/api/v1/label/${labelKey}/values`,\n};\n\ninterface PrometheusBaseLanguageProvider {\n datasource: PrometheusDatasource;\n\n /**\n * When no timeRange provided, we will use the default time range (now/now-6h)\n * @param timeRange\n */\n start: (timeRange?: TimeRange) => Promise<any[]>;\n\n request: (url: string, params?: any, options?: Partial<BackendSrvRequest>) => Promise<any>;\n\n fetchSuggestions: (\n timeRange?: TimeRange,\n queries?: PromQuery[],\n scopes?: Scope[],\n adhocFilters?: AdHocVariableFilter[],\n labelName?: string,\n limit?: number,\n requestId?: string\n ) => Promise<string[]>;\n}\n\n/**\n * @deprecated This interface is deprecated and will be removed.\n */\ninterface PrometheusLegacyLanguageProvider {\n /**\n * @deprecated Use retrieveHistogramMetrics() method instead\n */\n histogramMetrics: string[];\n /**\n * @deprecated Use retrieveMetrics() method instead\n */\n metrics: string[];\n /**\n * @deprecated Use retrieveMetricsMetadata() method instead\n */\n metricsMetadata?: PromMetricsMetadata;\n /**\n * @deprecated Use retrieveLabelKeys() method instead\n */\n labelKeys: string[];\n\n /**\n * @deprecated Use queryMetricsMetadata() method instead.\n */\n loadMetricsMetadata: () => void;\n /**\n * @deprecated Use retrieveMetricsMetadata() method instead\n */\n getLabelKeys: () => string[];\n /**\n * @deprecated If you need labelKeys or labelValues please use queryLabelKeys() or queryLabelValues() functions\n */\n getSeries: (timeRange: TimeRange, selector: string, withName?: boolean) => Promise<Record<string, string[]>>;\n /**\n * @deprecated Use queryLabelValues() method insteadIt'll determine the right endpoint based on the datasource settings\n */\n fetchLabelValues: (range: TimeRange, key: string, limit?: string | number) => Promise<string[]>;\n /**\n * @deprecated Use queryLabelValues() method insteadIt'll determine the right endpoint based on the datasource settings\n */\n getLabelValues: (range: TimeRange, key: string) => Promise<string[]>;\n /**\n * @deprecated If you need labelKeys or labelValues please use queryLabelKeys() or queryLabelValues() functions\n */\n fetchLabels: (timeRange: TimeRange, queries?: PromQuery[], limit?: string) => Promise<string[]>;\n /**\n * @deprecated Use queryLabelValues() method insteadIt'll determine the right endpoint based on the datasource settings\n */\n getSeriesValues: (timeRange: TimeRange, labelName: string, selector: string) => Promise<string[]>;\n /**\n * @deprecated Use queryLabelValues() method insteadIt'll determine the right endpoint based on the datasource settings\n */\n fetchSeriesValuesWithMatch: (\n timeRange: TimeRange,\n name: string,\n match?: string,\n requestId?: string,\n withLimit?: string | number\n ) => Promise<string[]>;\n /**\n * @deprecated Use queryLabelKeys() method instead. It'll determine the right endpoint based on the datasource settings\n */\n getSeriesLabels: (timeRange: TimeRange, selector: string, otherLabels: Label[]) => Promise<string[]>;\n /**\n * @deprecated Use queryLabelKeys() method instead. It'll determine the right endpoint based on the datasource settings\n */\n fetchLabelsWithMatch: (\n timeRange: TimeRange,\n name: string,\n withName?: boolean,\n withLimit?: string | number\n ) => Promise<Record<string, string[]>>;\n /**\n * @deprecated Use queryLabelKeys() method instead. It'll determine the right endpoint based on the datasource settings\n */\n fetchSeriesLabels: (\n timeRange: TimeRange,\n name: string,\n withName?: boolean,\n withLimit?: string | number\n ) => Promise<Record<string, string[]>>;\n /**\n * @deprecated Use queryLabelKeys() method instead. It'll determine the right endpoint based on the datasource settings\n */\n fetchSeriesLabelsMatch: (\n timeRange: TimeRange,\n name: string,\n withLimit?: string | number\n ) => Promise<Record<string, string[]>>;\n /**\n * @deprecated If you need labelKeys or labelValues please use queryLabelKeys() or queryLabelValues() functions\n */\n fetchSeries: (timeRange: TimeRange, match: string) => Promise<Array<Record<string, string>>>;\n /**\n * @deprecated If you need labelKeys or labelValues please use queryLabelKeys() or queryLabelValues() functions\n */\n fetchDefaultSeries: (timeRange: TimeRange) => Promise<{}>;\n}\n\n/**\n * Old implementation of prometheus language provider.\n * @deprecated Use PrometheusLanguageProviderInterface and PrometheusLanguageProvider class instead.\n */\nexport default class PromQlLanguageProvider extends LanguageProvider implements PrometheusLegacyLanguageProvider {\n declare startTask: Promise<any>;\n declare labelFetchTs: number;\n\n datasource: PrometheusDatasource;\n\n histogramMetrics: string[];\n metrics: string[];\n metricsMetadata?: PromMetricsMetadata;\n labelKeys: string[] = [];\n\n constructor(datasource: PrometheusDatasource, initialValues?: Partial<PromQlLanguageProvider>) {\n super();\n\n this.datasource = datasource;\n this.histogramMetrics = [];\n this.metrics = [];\n\n Object.assign(this, initialValues);\n }\n\n request = async (url: string, params = {}, options?: Partial<BackendSrvRequest>) => {\n try {\n const res = await this.datasource.metadataRequest(url, params, options);\n return res.data.data;\n } catch (error) {\n if (!isCancelledError(error)) {\n console.error(error);\n }\n }\n\n return undefined;\n };\n\n /**\n * Overridden by PrometheusLanguageProvider\n */\n start = async (timeRange: TimeRange = getDefaultTimeRange()): Promise<any[]> => {\n if (this.datasource.lookupsDisabled) {\n return [];\n }\n\n this.metrics = (await this.fetchLabelValues(timeRange, '__name__')) || [];\n this.histogramMetrics = processHistogramMetrics(this.metrics).sort();\n return Promise.all([this.loadMetricsMetadata(), this.fetchLabels(timeRange)]);\n };\n\n async loadMetricsMetadata() {\n const secondsInDay = 86400;\n const headers = buildCacheHeaders(getDaysToCacheMetadata(this.datasource.cacheLevel) * secondsInDay);\n this.metricsMetadata = fixSummariesMetadata(\n await this.request(\n API_V1.METADATA,\n {},\n {\n showErrorAlert: false,\n ...headers,\n }\n )\n );\n }\n\n getLabelKeys(): string[] {\n return this.labelKeys;\n }\n\n async getSeries(timeRange: TimeRange, selector: string, withName?: boolean): Promise<Record<string, string[]>> {\n if (this.datasource.lookupsDisabled) {\n return {};\n }\n try {\n if (selector === EMPTY_SELECTOR) {\n return await this.fetchDefaultSeries(timeRange);\n } else {\n return await this.fetchSeriesLabels(timeRange, selector, withName, REMOVE_SERIES_LIMIT);\n }\n } catch (error) {\n // TODO: better error handling\n console.error(error);\n return {};\n }\n }\n\n fetchLabelValues = async (range: TimeRange, key: string, limit?: string | number): Promise<string[]> => {\n const params = { ...this.datasource.getAdjustedInterval(range), ...(limit ? { limit } : {}) };\n const interpolatedName = this.datasource.interpolateString(key);\n const interpolatedAndEscapedName = escapeForUtf8Support(removeQuotesIfExist(interpolatedName));\n const value = await this.request(\n API_V1.LABELS_VALUES(interpolatedAndEscapedName),\n params,\n getDefaultCacheHeaders(this.datasource.cacheLevel)\n );\n return value ?? [];\n };\n\n async getLabelValues(range: TimeRange, key: string): Promise<string[]> {\n return await this.fetchLabelValues(range, key);\n }\n\n /**\n * Fetches all label keys\n */\n fetchLabels = async (timeRange: TimeRange, queries?: PromQuery[], limit?: string): Promise<string[]> => {\n let url = API_V1.LABELS;\n const timeParams = this.datasource.getAdjustedInterval(timeRange);\n this.labelFetchTs = Date.now().valueOf();\n\n const searchParams = new URLSearchParams({ ...timeParams, ...(limit ? { limit } : {}) });\n queries?.forEach((q) => {\n const visualQuery = buildVisualQueryFromString(q.expr);\n if (visualQuery.query.metric !== '') {\n const isUtf8Metric = !isValidLegacyName(visualQuery.query.metric);\n searchParams.append('match[]', isUtf8Metric ? `{\"${visualQuery.query.metric}\"}` : visualQuery.query.metric);\n if (visualQuery.query.binaryQueries) {\n visualQuery.query.binaryQueries.forEach((bq) => {\n searchParams.append('match[]', isUtf8Metric ? `{\"${bq.query.metric}\"}` : bq.query.metric);\n });\n }\n }\n });\n\n if (this.datasource.httpMethod === 'GET') {\n url += `?${searchParams.toString()}`;\n }\n\n const res = await this.request(url, searchParams, getDefaultCacheHeaders(this.datasource.cacheLevel));\n if (Array.isArray(res)) {\n this.labelKeys = res.slice().sort();\n return [...this.labelKeys];\n }\n\n return [];\n };\n\n /**\n * Gets series values\n * Function to replace old getSeries calls in a way that will provide faster endpoints\n * for new prometheus instances, while maintaining backward compatability\n */\n getSeriesValues = async (timeRange: TimeRange, labelName: string, selector: string): Promise<string[]> => {\n if (!this.datasource.hasLabelsMatchAPISupport()) {\n const data = await this.getSeries(timeRange, selector);\n return data[removeQuotesIfExist(labelName)] ?? [];\n }\n return await this.fetchSeriesValuesWithMatch(timeRange, labelName, selector);\n };\n\n /**\n * Fetches all values for a label, with optional match[]\n */\n fetchSeriesValuesWithMatch = async (\n timeRange: TimeRange,\n name: string,\n match?: string,\n requestId?: string,\n withLimit?: string | number\n ): Promise<string[]> => {\n const interpolatedName = name ? this.datasource.interpolateString(name) : null;\n const interpolatedMatch = match ? this.datasource.interpolateString(match) : null;\n const range = this.datasource.getAdjustedInterval(timeRange);\n const urlParams = {\n ...range,\n ...(interpolatedMatch && { 'match[]': interpolatedMatch }),\n ...(withLimit ? { limit: withLimit } : {}),\n };\n let requestOptions: Partial<BackendSrvRequest> | undefined = {\n ...getDefaultCacheHeaders(this.datasource.cacheLevel),\n ...(requestId && { requestId }),\n };\n\n if (!Object.keys(requestOptions).length) {\n requestOptions = undefined;\n }\n\n const interpolatedAndEscapedName = escapeForUtf8Support(removeQuotesIfExist(interpolatedName ?? ''));\n\n const value = await this.request(API_V1.LABELS_VALUES(interpolatedAndEscapedName), urlParams, requestOptions);\n return value ?? [];\n };\n\n /**\n * Gets series labels\n * Function to replace old getSeries calls in a way that will provide faster endpoints for new prometheus instances,\n * while maintaining backward compatability. The old API call got the labels and the values in a single query,\n * but with the new query we need two calls, one to get the labels, and another to get the values.\n */\n getSeriesLabels = async (timeRange: TimeRange, selector: string, otherLabels: Label[]): Promise<string[]> => {\n let possibleLabelNames, data: Record<string, string[]>;\n\n if (!this.datasource.hasLabelsMatchAPISupport()) {\n data = await this.getSeries(timeRange, selector);\n possibleLabelNames = Object.keys(data); // all names from prometheus\n } else {\n // Exclude __name__ from output\n otherLabels.push({ name: '__name__', value: '', op: '!=' });\n data = await this.fetchSeriesLabelsMatch(timeRange, selector);\n possibleLabelNames = Object.keys(data);\n }\n\n const usedLabelNames = new Set(otherLabels.map((l) => l.name)); // names used in the query\n return possibleLabelNames.filter((l) => !usedLabelNames.has(l));\n };\n\n /**\n * Fetch labels using the best endpoint that datasource supports.\n * This is cached by its args but also by the global timeRange currently selected as they can change over requested time.\n */\n fetchLabelsWithMatch = async (\n timeRange: TimeRange,\n name: string,\n withName?: boolean,\n withLimit?: string | number\n ): Promise<Record<string, string[]>> => {\n if (this.datasource.hasLabelsMatchAPISupport()) {\n return this.fetchSeriesLabelsMatch(timeRange, name, withLimit);\n } else {\n return this.fetchSeriesLabels(timeRange, name, withName, REMOVE_SERIES_LIMIT);\n }\n };\n\n /**\n * Fetch labels for a series using /series endpoint. This is cached by its args but also by the global timeRange currently selected as\n * they can change over requested time.\n */\n fetchSeriesLabels = async (\n timeRange: TimeRange,\n name: string,\n withName?: boolean,\n withLimit?: string | number\n ): Promise<Record<string, string[]>> => {\n const interpolatedName = this.datasource.interpolateString(name);\n const range = this.datasource.getAdjustedInterval(timeRange);\n let urlParams = {\n ...range,\n 'match[]': interpolatedName,\n ...(withLimit !== 'none' ? { limit: withLimit ?? DEFAULT_SERIES_LIMIT } : {}),\n };\n\n const data = await this.request(API_V1.SERIES, urlParams, getDefaultCacheHeaders(this.datasource.cacheLevel));\n const { values } = processLabels(data, withName);\n return values;\n };\n\n /**\n * Fetch labels for a series using /labels endpoint. This is cached by its args but also by the global timeRange currently selected as\n * they can change over requested time.\n */\n fetchSeriesLabelsMatch = async (\n timeRange: TimeRange,\n name: string,\n withLimit?: string | number\n ): Promise<Record<string, string[]>> => {\n const interpolatedName = this.datasource.interpolateString(name);\n const range = this.datasource.getAdjustedInterval(timeRange);\n const urlParams = {\n ...range,\n 'match[]': interpolatedName,\n ...(withLimit ? { limit: withLimit } : {}),\n };\n\n const data: string[] = await this.request(\n API_V1.LABELS,\n urlParams,\n getDefaultCacheHeaders(this.datasource.cacheLevel)\n );\n // Convert string array to Record<string , []>\n return data.reduce((ac, a) => ({ ...ac, [a]: '' }), {});\n };\n\n /**\n * Fetch series for a selector. Use this for raw results. Use fetchSeriesLabels() to get labels.\n */\n fetchSeries = async (timeRange: TimeRange, match: string): Promise<Array<Record<string, string>>> => {\n const range = this.datasource.getTimeRangeParams(timeRange);\n const params = { ...range, 'match[]': match };\n return await this.request(API_V1.SERIES, params, getDefaultCacheHeaders(this.datasource.cacheLevel));\n };\n\n /**\n * Fetch this only one as we assume this won't change over time. This is cached differently from fetchSeriesLabels\n * because we can cache more aggressively here and also we do not want to invalidate this cache the same way as in\n * fetchSeriesLabels.\n */\n fetchDefaultSeries = once(async (timeRange: TimeRange) => {\n const values = await Promise.all(DEFAULT_KEYS.map((key) => this.fetchLabelValues(timeRange, key)));\n return DEFAULT_KEYS.reduce((acc, key, i) => ({ ...acc, [key]: values[i] }), {});\n });\n\n /**\n * Fetch labels or values for a label based on the queries, scopes, filters and time range\n */\n fetchSuggestions = async (\n timeRange?: TimeRange,\n queries?: PromQuery[],\n scopes?: Scope[],\n adhocFilters?: AdHocVariableFilter[],\n labelName?: string,\n limit?: number,\n requestId?: string\n ): Promise<string[]> => {\n if (!timeRange) {\n timeRange = getDefaultTimeRange();\n }\n\n const url = '/suggestions';\n const timeParams = this.datasource.getAdjustedInterval(timeRange);\n const value = await this.request(\n url,\n {\n labelName,\n queries: queries?.map((q) =>\n this.datasource.interpolateString(q.expr, {\n ...this.datasource.getIntervalVars(),\n ...this.datasource.getRangeScopedVars(timeRange),\n })\n ),\n scopes: scopes?.reduce<ScopeSpecFilter[]>((acc, scope) => {\n if (scope.spec.filters) {\n acc.push(...scope.spec.filters);\n }\n\n return acc;\n }, []),\n adhocFilters: adhocFilters?.map((filter) => ({\n key: filter.key,\n operator: scopeFilterOperatorMap[filter.operator],\n value: filter.value,\n values: filter.values,\n })),\n limit,\n ...timeParams,\n },\n {\n ...(requestId && { requestId }),\n headers: {\n ...getDefaultCacheHeaders(this.datasource.cacheLevel)?.headers,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n }\n );\n\n return value ?? [];\n };\n}\n\n/**\n * Modern implementation of the Prometheus language provider that abstracts API endpoint selection.\n *\n * Features:\n * - Automatically selects the most efficient API endpoint based on Prometheus version and configuration\n * - Supports both labels and series endpoints for backward compatibility\n * - Handles match[] parameters for filtering time series data\n * - Implements automatic request limiting (default: 40,000 series if not configured otherwise)\n * - Provides unified interface for both modern and legacy Prometheus versions\n * - Provides caching mechanism based on time range, limit, and match parameters\n *\n * @see LabelsApiClient For modern Prometheus versions using the labels API\n * @see SeriesApiClient For legacy Prometheus versions using the series API\n */\nexport interface PrometheusLanguageProviderInterface\n extends PrometheusBaseLanguageProvider,\n PrometheusLegacyLanguageProvider {\n /**\n * Initializes the language provider by fetching metrics, label keys, and metrics metadata using Resource Clients.\n * All calls use the limit parameter from datasource configuration (default: 40,000 if not set).\n *\n * For backward compatibility, it calls _backwardCompatibleStart.\n * Some places still rely on deprecated fields. Until we replace them, we need _backwardCompatibleStart method.\n */\n start: (timeRange?: TimeRange) => Promise<any[]>;\n\n /**\n * Returns already cached metrics metadata including type and help information.\n * If there is no cached metadata, it returns an empty object.\n * To get fresh metadata, use queryMetricsMetadata instead.\n */\n retrieveMetricsMetadata: () => PromMetricsMetadata;\n\n /**\n * Returns already cached list of histogram metrics (identified by '_bucket' suffix).\n * If there are no cached histogram metrics, it returns an empty array.\n */\n retrieveHistogramMetrics: () => string[];\n\n /**\n * Returns already cached list of all available metric names.\n * If there are no cached metrics, it returns an empty array.\n */\n retrieveMetrics: () => string[];\n\n /**\n * Returns already cached list of available label keys.\n * If there are no cached label keys, it returns an empty array.\n */\n retrieveLabelKeys: () => string[];\n\n /**\n * Fetches fresh metrics metadata from Prometheus with optional limit.\n * Uses datasource's default limit if not specified.\n */\n queryMetricsMetadata: (limit?: number) => Promise<PromMetricsMetadata>;\n\n /**\n * Queries Prometheus for label keys within time range, optionally filtered by match selector.\n * Automatically selects labels or series endpoint based on datasource configuration.\n * If no limit is provided, uses the datasource's default limit configuration.\n * Use zero (0) to fetch all label keys, but this might return huge amounts of data.\n */\n queryLabelKeys: (timeRange: TimeRange, match?: string, limit?: number) => Promise<string[]>;\n\n /**\n * Queries Prometheus for values of a specific label key, optionally filtered by match selector.\n * Automatically selects labels or series endpoint based on datasource configuration.\n * If no limit is provided, uses the datasource's default limit configuration.\n * Use zero (0) to fetch all label values, but this might return huge amounts of data.\n */\n queryLabelValues: (timeRange: TimeRange, labelKey: string, match?: string, limit?: number) => Promise<string[]>;\n}\n\nexport class PrometheusLanguageProvider extends PromQlLanguageProvider implements PrometheusLanguageProviderInterface {\n private _metricsMetadata?: PromMetricsMetadata;\n private _resourceClient?: ResourceApiClient;\n\n constructor(datasource: PrometheusDatasource) {\n super(datasource);\n }\n\n /**\n * Lazily initializes and returns the appropriate resource client based on Prometheus version.\n *\n * The client selection logic:\n * - For Prometheus v2.6+ with labels API: Uses LabelsApiClient for efficient label-based queries\n * - For older versions: Falls back to SeriesApiClient for backward compatibility\n *\n * The client instance is cached after first initialization to avoid repeated creation.\n *\n * @returns {ResourceApiClient} An instance of either LabelsApiClient or SeriesApiClient\n */\n private get resourceClient(): ResourceApiClient {\n if (!this._resourceClient) {\n this._resourceClient = this.datasource.hasLabelsMatchAPISupport()\n ? new LabelsApiClient(this.request, this.datasource)\n : new SeriesApiClient(this.request, this.datasource);\n }\n\n return this._resourceClient;\n }\n\n /**\n * Same start logic but it uses resource clients. Backward compatibility it calls _backwardCompatibleStart.\n * Some places still relies on deprecated fields. Until we replace them we need _backwardCompatibleStart method\n */\n start = async (timeRange: TimeRange = getDefaultTimeRange()): Promise<any[]> => {\n if (this.datasource.lookupsDisabled) {\n return [];\n }\n await Promise.all([this.resourceClient.start(timeRange), this.queryMetricsMetadata(this.datasource.seriesLimit)]);\n return this._backwardCompatibleStart();\n };\n\n /**\n * This private method exists to make sure the old class will be functional until we remove it.\n * When we remove old class (PromQlLanguageProvider) we should remove this method too.\n */\n private _backwardCompatibleStart = async () => {\n this.metricsMetadata = this.retrieveMetricsMetadata();\n this.metrics = this.retrieveMetrics();\n this.histogramMetrics = this.retrieveHistogramMetrics();\n this.labelKeys = this.retrieveLabelKeys();\n return [];\n };\n\n /**\n * Fetches metadata for metrics from Prometheus.\n * Sets cache headers based on the configured metadata cache duration.\n *\n * @returns {Promise<PromMetricsMetadata>} Promise that resolves when metadata has been fetched\n */\n private _queryMetadata = async (limit?: number): Promise<PromMetricsMetadata> => {\n const secondsInDay = 86400;\n const headers = buildCacheHeaders(getDaysToCacheMetadata(this.datasource.cacheLevel) * secondsInDay);\n const metadata = await this.request(\n API_V1.METADATA,\n { limit: limit ?? this.datasource.seriesLimit },\n {\n showErrorAlert: false,\n ...headers,\n }\n );\n return fixSummariesMetadata(metadata);\n };\n\n /**\n * Retrieves the cached Prometheus metrics metadata.\n * This metadata includes type information (counter, gauge, etc.) and help text for metrics.\n *\n * @returns {PromMetricsMetadata} Cached metadata or empty object if not yet fetched\n */\n public retrieveMetricsMetadata = (): PromMetricsMetadata => {\n return this._metricsMetadata ?? {};\n };\n\n /**\n * Retrieves the list of histogram metrics from the current resource client.\n * Histogram metrics are identified by the '_bucket' suffix and are used for percentile calculations.\n *\n * @returns {string[]} Array of histogram metric names\n */\n public retrieveHistogramMetrics = (): string[] => {\n return this.resourceClient?.histogramMetrics;\n };\n\n /**\n * Retrieves the complete list of available metrics from the current resource client.\n * This includes all metric names regardless of their type (counter, gauge, histogram).\n *\n * @returns {string[]} Array of all metric names\n */\n public retrieveMetrics = (): string[] => {\n return this.resourceClient?.metrics;\n };\n\n /**\n * Retrieves the list of available label keys from the current resource client.\n * Label keys are the names of labels that can be used to filter and group metrics.\n *\n * @returns {string[]} Array of label key names\n */\n public retrieveLabelKeys = (): string[] => {\n return this.resourceClient?.labelKeys;\n };\n\n /**\n * Fetches fresh metrics metadata from Prometheus and updates the cache.\n * This includes querying for metric types, help text, and unit information.\n * If the fetch fails, the cache is set to an empty object to prevent stale data.\n *\n * @returns {Promise<PromMetricsMetadata>} Promise that resolves to the fetched metadata\n */\n public queryMetricsMetadata = async (limit?: number): Promise<PromMetricsMetadata> => {\n try {\n this._metricsMetadata = (await this._queryMetadata(limit)) ?? {};\n } catch (error) {\n this._metricsMetadata = {};\n }\n return this._metricsMetadata;\n };\n\n /**\n * Fetches all available label keys that match the specified criteria.\n *\n * This method queries Prometheus for label keys within the specified time range.\n * The results can be filtered using the match parameter and limited in size.\n * Uses either the labels API (Prometheus v2.6+) or series API based on version.\n *\n * @param {TimeRange} timeRange - Time range to search for label keys\n * @param {string} [match] - Optional PromQL selector to filter label keys (e.g., '{job=\"grafana\"}')\n * @param {string} [limit] - Optional maximum number of label keys to return\n * @returns {Promise<string[]>} Array of matching label key names, sorted alphabetically\n */\n public queryLabelKeys = async (timeRange: TimeRange, match?: string, limit?: number): Promise<string[]> => {\n const interpolatedMatch = match ? this.datasource.interpolateString(match) : match;\n return await this.resourceClient.queryLabelKeys(timeRange, interpolatedMatch, limit);\n };\n\n /**\n * Fetches all values for a specific label key that match the specified criteria.\n *\n * This method queries Prometheus for label values within the specified time range.\n * Results can be filtered using the match parameter to find values in specific contexts.\n * Supports both modern (labels API) and legacy (series API) Prometheus versions.\n *\n * The method automatically handles UTF-8 encoded label keys by properly escaping them\n * before making API requests. This means you can safely pass label keys containing\n * special characters like dots, colons, or Unicode characters (e.g., 'http.status:code',\n * 'μs', 'response.time').\n *\n * @param {TimeRange} timeRange - Time range to search for label values\n * @param {string} labelKey - The label key to fetch values for (e.g., 'job', 'instance', 'http.status:code')\n * @param {string} [match] - Optional PromQL selector to filter values (e.g., '{job=\"grafana\"}')\n * @param {string} [limit] - Optional maximum number of values to return\n * @returns {Promise<string[]>} Array of matching label values, sorted alphabetically\n * @example\n * // Fetch all values for the 'job' label\n * const values = await queryLabelValues(timeRange, 'job');\n * // Fetch 'instance' values only for jobs matching 'grafana'\n * const instances = await queryLabelValues(timeRange, 'instance', '{job=\"grafana\"}');\n * // Fetch values for a label key with special characters\n * const statusCodes = await queryLabelValues(timeRange, 'http.status:code');\n */\n public queryLabelValues = async (\n timeRange: TimeRange,\n labelKey: string,\n match?: string,\n limit?: number\n ): Promise<string[]> => {\n const interpolatedMatch = match ? this.datasource.interpolateString(match) : match;\n return await this.resourceClient.queryLabelValues(\n timeRange,\n this.datasource.interpolateString(labelKey),\n interpolatedMatch,\n limit\n );\n };\n}\n\nexport const importFromAbstractQuery = (labelBasedQuery: AbstractQuery): PromQuery => {\n return toPromLikeQuery(labelBasedQuery);\n};\n\nexport const exportToAbstractQuery = (query: PromQuery): AbstractQuery => {\n const promQuery = query.expr;\n if (!promQuery || promQuery.length === 0) {\n return { refId: query.refId, labelMatchers: [] };\n }\n const tokens = Prism.tokenize(promQuery, promqlGrammar);\n const labelMatchers: AbstractLabelMatcher[] = extractLabelMatchers(tokens);\n const nameLabelValue = getNameLabelValue(promQuery, tokens);\n if (nameLabelValue && nameLabelValue.length > 0) {\n labelMatchers.push({\n name: '__name__',\n operator: AbstractLabelOperator.Equal,\n value: nameLabelValue,\n });\n }\n\n return {\n refId: query.refId,\n labelMatchers,\n };\n};\n\n/**\n * Checks if an error is a cancelled request error.\n * Used to avoid logging cancelled request errors.\n *\n * @param {unknown} error - Error to check\n * @returns {boolean} True if the error is a cancelled request error\n */\nfunction isCancelledError(error: unknown): error is {\n cancelled: boolean;\n} {\n return typeof error === 'object' && error !== null && 'cancelled' in error && error.cancelled === true;\n}\n\nfunction getNameLabelValue(promQuery: string, tokens: Array<string | Prism.Token>): string {\n let nameLabelValue = '';\n\n for (const token of tokens) {\n if (typeof token === 'string') {\n nameLabelValue = token;\n break;\n }\n }\n return nameLabelValue;\n}\n\n/**\n * Extracts metrics from queries and populates match parameters.\n * This is used to filter time series data based on existing queries.\n * Handles UTF8 metrics by properly escaping them.\n *\n * @param {PromQuery[]} queries - Array of Prometheus queries\n * @returns {string[]} Metric names as a regex matcher inside the array for easy handling\n */\nexport const populateMatchParamsFromQueries = (queries?: PromQuery[]): string[] => {\n if (!queries) {\n return [];\n }\n\n const metrics = (queries ?? []).reduce<string[]>((params, query) => {\n const visualQuery = buildVisualQueryFromString(query.expr);\n if (visualQuery.query.metric !== '') {\n params.push(visualQuery.query.metric);\n }\n if (visualQuery.query.binaryQueries) {\n visualQuery.query.binaryQueries.forEach((bq) => {\n if (bq.query.metric !== '') {\n params.push(bq.query.metric);\n }\n });\n }\n return params;\n }, []);\n\n return metrics.length === 0 ? [] : [`__name__=~\"${metrics.join('|')}\"`];\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/migrations/variableMigration.ts\nimport { buildVisualQueryFromString } from '../querybuilder/parsing';\nimport { promQueryModeller } from '../querybuilder/shared/modeller_instance';\nimport { PromVariableQuery, PromVariableQueryType as QueryType } from '../types';\n\nexport const PrometheusLabelNamesRegex = /^label_names\\(\\)\\s*$/;\nexport const PrometheusLabelValuesRegex = /^label_values\\((?:(.+),\\s*)?(.+)\\)\\s*$/;\nexport const PrometheusMetricNamesRegex = /^metrics\\((.+)\\)\\s*$/;\nexport const PrometheusQueryResultRegex = /^query_result\\((.+)\\)\\s*$/;\nexport const PrometheusLabelNamesRegexWithMatch = /^label_names\\((.+)\\)\\s*$/;\n\nexport function migrateVariableQueryToEditor(rawQuery: string | PromVariableQuery): PromVariableQuery {\n // If not string, we assume PromVariableQuery\n if (typeof rawQuery !== 'string') {\n return rawQuery;\n }\n\n const queryBase = {\n refId: 'PrometheusDatasource-VariableQuery',\n qryType: QueryType.LabelNames,\n };\n\n const labelNamesMatchQuery = rawQuery.match(PrometheusLabelNamesRegexWithMatch);\n\n if (labelNamesMatchQuery) {\n return {\n ...queryBase,\n qryType: QueryType.LabelNames,\n match: labelNamesMatchQuery[1],\n };\n }\n\n const labelNames = rawQuery.match(PrometheusLabelNamesRegex);\n if (labelNames) {\n return {\n ...queryBase,\n qryType: QueryType.LabelNames,\n };\n }\n\n const labelValuesCheck = rawQuery.match(/^label_values\\(/);\n if (labelValuesCheck) {\n const labelValues = rawQuery.match(PrometheusLabelValuesRegex);\n const label = labelValues ? labelValues[2] : '';\n const metric = labelValues ? labelValues[1] : '';\n\n if (metric) {\n const visQuery = buildVisualQueryFromString(metric);\n return {\n ...queryBase,\n qryType: QueryType.LabelValues,\n label,\n metric: visQuery.query.metric,\n labelFilters: visQuery.query.labels,\n };\n } else {\n return {\n ...queryBase,\n qryType: QueryType.LabelValues,\n label,\n };\n }\n }\n\n const metricNamesCheck = rawQuery.match(/^metrics\\(/);\n if (metricNamesCheck) {\n const metricNames = rawQuery.match(PrometheusMetricNamesRegex);\n const metric = metricNames ? metricNames[1] : '';\n return {\n ...queryBase,\n qryType: QueryType.MetricNames,\n metric,\n };\n }\n\n const queryResultCheck = rawQuery.match(/^query_result\\(/);\n if (queryResultCheck) {\n const queryResult = rawQuery.match(PrometheusQueryResultRegex);\n const varQuery = queryResult ? queryResult[1] : '';\n return {\n ...queryBase,\n qryType: QueryType.VarQueryResult,\n varQuery,\n };\n }\n\n // seriesQuery does not have a function and no regex above\n if (!labelNames && !labelValuesCheck && !metricNamesCheck && !queryResultCheck) {\n return {\n ...queryBase,\n qryType: QueryType.SeriesQuery,\n seriesQuery: rawQuery,\n };\n }\n\n return queryBase;\n}\n\n// migrate it back to a string with the correct variables in place\nexport function migrateVariableEditorBackToVariableSupport(QueryVariable: PromVariableQuery): string {\n switch (QueryVariable.qryType) {\n case QueryType.LabelNames:\n if (QueryVariable.match) {\n return `label_names(${QueryVariable.match})`;\n }\n return 'label_names()';\n case QueryType.LabelValues:\n if (QueryVariable.metric || (QueryVariable.labelFilters && QueryVariable.labelFilters.length !== 0)) {\n const visualQueryQuery = {\n metric: QueryVariable.metric ?? '',\n labels: QueryVariable.labelFilters ?? [],\n operations: [],\n };\n\n const metric = promQueryModeller.renderQuery(visualQueryQuery);\n return `label_values(${metric},${QueryVariable.label})`;\n } else {\n return `label_values(${QueryVariable.label})`;\n }\n case QueryType.MetricNames:\n return `metrics(${QueryVariable.metric})`;\n case QueryType.VarQueryResult:\n const varQuery = removeLineBreaks(QueryVariable.varQuery);\n return `query_result(${varQuery})`;\n case QueryType.SeriesQuery:\n return QueryVariable.seriesQuery ?? '';\n case QueryType.ClassicQuery:\n return QueryVariable.classicQuery ?? '';\n }\n\n return '';\n}\n\n// allow line breaks in query result textarea\nfunction removeLineBreaks(input?: string) {\n return input ? input.replace(/[\\r\\n]+/gm, '') : '';\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/metric_find_query.ts\nimport { map as _map } from 'lodash';\n\nimport { MetricFindValue, TimeRange } from '@grafana/data';\n\nimport { METRIC_LABEL } from './constants';\nimport { PrometheusDatasource } from './datasource';\nimport { getPrometheusTime } from './language_utils';\nimport {\n PrometheusLabelNamesRegex,\n PrometheusLabelNamesRegexWithMatch,\n PrometheusLabelValuesRegex,\n PrometheusMetricNamesRegex,\n PrometheusQueryResultRegex,\n} from './migrations/variableMigration';\nimport { getOriginalMetricName } from './result_transformer';\n\nexport class PrometheusMetricFindQuery {\n constructor(\n private datasource: PrometheusDatasource,\n private query: string\n ) {\n this.datasource = datasource;\n this.query = query;\n }\n\n async process(timeRange: TimeRange): Promise<MetricFindValue[]> {\n const labelNamesRegex = PrometheusLabelNamesRegex;\n const labelNamesRegexWithMatch = PrometheusLabelNamesRegexWithMatch;\n const labelValuesRegex = PrometheusLabelValuesRegex;\n const metricNamesRegex = PrometheusMetricNamesRegex;\n const queryResultRegex = PrometheusQueryResultRegex;\n const labelNamesQuery = this.query.match(labelNamesRegex);\n const labelNamesMatchQuery = this.query.match(labelNamesRegexWithMatch);\n\n if (labelNamesMatchQuery) {\n const selector = `{__name__=~\".*${labelNamesMatchQuery[1]}.*\"}`;\n const keys = await this.datasource.languageProvider.queryLabelKeys(timeRange, selector);\n return keys.filter((key) => key !== METRIC_LABEL).map((result) => ({ text: result }));\n }\n\n if (labelNamesQuery) {\n return this.datasource.getTagKeys({ filters: [], timeRange });\n }\n\n const labelValuesQuery = this.query.match(labelValuesRegex);\n if (labelValuesQuery) {\n const filter = labelValuesQuery[1];\n const label = labelValuesQuery[2];\n if (isFilterDefined(filter)) {\n return await this.labelValuesQuery(label, timeRange, filter);\n } else {\n // Exclude the filter part of the expression because it is blank or empty\n return await this.labelValuesQuery(label, timeRange);\n }\n }\n\n const metricNamesQuery = this.query.match(metricNamesRegex);\n if (metricNamesQuery) {\n return await this.metricNameQuery(metricNamesQuery[1], timeRange);\n }\n\n const queryResultQuery = this.query.match(queryResultRegex);\n if (queryResultQuery) {\n return this.queryResultQuery(queryResultQuery[1], timeRange);\n }\n\n // if query contains full metric name, return metric name and label list\n const expressions = ['label_values()', 'metrics()', 'query_result()'];\n if (!expressions.includes(this.query)) {\n return await this.metricNameAndLabelsQuery(this.query, timeRange);\n }\n\n return Promise.resolve([]);\n }\n\n async labelValuesQuery(label: string, range: TimeRange, metric?: string) {\n const values = await this.datasource.languageProvider.queryLabelValues(range, label, metric);\n return values.map((value) => ({ text: value }));\n }\n\n async metricNameQuery(metricFilterPattern: string, range: TimeRange) {\n const names = await this.datasource.languageProvider.queryLabelValues(\n range,\n METRIC_LABEL,\n `{__name__=~\"${metricFilterPattern}\"}`\n );\n return names.map((n) => ({ text: n, expandable: true }));\n }\n\n queryResultQuery(query: string, range: TimeRange) {\n const url = '/api/v1/query';\n const params = {\n query,\n time: getPrometheusTime(range.to, true).toString(),\n };\n return this.datasource.metadataRequest(url, params).then((result) => {\n switch (result.data.data.resultType) {\n case 'scalar': // [ <unix_time>, \"<scalar_value>\" ]\n case 'string': // [ <unix_time>, \"<string_value>\" ]\n return [\n {\n text: result.data.data.result[1] || '',\n expandable: false,\n },\n ];\n case 'vector':\n return _map(result.data.data.result, (metricData) => {\n let text = metricData.metric.__name__ || '';\n delete metricData.metric.__name__;\n text +=\n '{' +\n _map(metricData.metric, (v, k) => {\n return k + '=\"' + v + '\"';\n }).join(',') +\n '}';\n text += ' ' + metricData.value[1] + ' ' + metricData.value[0] * 1000;\n\n return {\n text: text,\n expandable: true,\n };\n });\n default:\n throw Error(`Unknown/Unhandled result type: [${result.data.data.resultType}]`);\n }\n });\n }\n\n async metricNameAndLabelsQuery(query: string, range: TimeRange): Promise<MetricFindValue[]> {\n const start = getPrometheusTime(range.from, false);\n const end = getPrometheusTime(range.to, true);\n const params = {\n 'match[]': query,\n start: start.toString(),\n end: end.toString(),\n };\n\n const result = await this.datasource.metadataRequest(`/api/v1/series`, params);\n return result.data.data.map((metric: Record<string, string>) => ({\n text: getOriginalMetricName(metric),\n expandable: true,\n }));\n }\n}\n\nfunction isFilterDefined(filter: string) {\n // We consider blank strings or the empty filter {} as an undefined filter\n return filter && filter.split(' ').join('') !== '{}';\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querycache/QueryCache.ts\nimport {\n amendTable,\n DataFrame,\n DataQueryRequest,\n dateTime,\n durationToMilliseconds,\n Field,\n incrRoundDn,\n isValidDuration,\n parseDuration,\n rangeUtil,\n ScopedVars,\n Table,\n trimTable,\n} from '@grafana/data';\n\nimport { PromQuery } from '../types';\n\n// dashboardUID + panelId + refId\n// (must be stable across query changes, time range changes / interval changes / panel resizes / template variable changes)\ntype TargetIdent = string;\n\n// query + template variables + interval + raw time range\n// used for full target cache busting -> full range re-query\ntype TargetSignature = string;\ntype TimestampMs = number;\ntype SupportedQueryTypes = PromQuery;\ntype ApplyInterpolation = (str: string, scopedVars?: ScopedVars) => string;\n\n// string matching requirements defined in durationutil.ts\nexport const defaultPrometheusQueryOverlapWindow = '10m';\n\ninterface TargetCache {\n signature: TargetSignature;\n prevTo: TimestampMs;\n frames: DataFrame[];\n}\n\nexport interface CacheRequestInfo<T extends SupportedQueryTypes> {\n requests: Array<DataQueryRequest<T>>;\n targetSignatures: Map<TargetIdent, TargetSignature>;\n shouldCache: boolean;\n}\n\n/**\n * Get field identity\n * This is the string used to uniquely identify a field within a \"target\"\n * @param field\n */\nconst getFieldIdentity = (field: Field) => `${field.type}|${field.name}|${JSON.stringify(field.labels ?? '')}`;\n\n/**\n * NOMENCLATURE\n * Target: The request target (DataQueryRequest), i.e. a specific query reference within a panel\n * Identity: the string that is not expected to change\n * Signature: the string that is expected to change, upon which we wipe the cache fields\n */\nexport class QueryCache<T extends SupportedQueryTypes> {\n private overlapWindowMs: number;\n private getTargetSignature: (request: DataQueryRequest<T>, target: T) => string;\n private applyInterpolation = (str: string, scopedVars?: ScopedVars) => str;\n\n cache = new Map<TargetIdent, TargetCache>();\n\n constructor(options: {\n getTargetSignature: (request: DataQueryRequest<T>, target: T) => string;\n overlapString: string;\n applyInterpolation?: ApplyInterpolation;\n }) {\n const unverifiedOverlap = options.overlapString;\n if (isValidDuration(unverifiedOverlap)) {\n const duration = parseDuration(unverifiedOverlap);\n this.overlapWindowMs = durationToMilliseconds(duration);\n } else {\n const duration = parseDuration(defaultPrometheusQueryOverlapWindow);\n this.overlapWindowMs = durationToMilliseconds(duration);\n }\n\n this.getTargetSignature = options.getTargetSignature;\n if (options.applyInterpolation) {\n this.applyInterpolation = options.applyInterpolation;\n }\n }\n\n // can be used to change full range request to partial, split into multiple requests\n requestInfo(request: DataQueryRequest<T>): CacheRequestInfo<T> {\n // TODO: align from/to to interval to increase probability of hitting backend cache\n\n const newFrom = request.range.from.valueOf();\n const newTo = request.range.to.valueOf();\n\n // only cache 'now'-relative queries (that can benefit from a backfill cache)\n const shouldCache = request.rangeRaw?.to?.toString() === 'now';\n\n // all targets are queried together, so we check for any that causes group cache invalidation & full re-query\n let doPartialQuery = shouldCache;\n let prevTo: TimestampMs | undefined = undefined;\n\n // pre-compute reqTargetSignatures\n const reqTargetSignatures = new Map<TargetIdent, TargetSignature>();\n request.targets.forEach((target) => {\n let targetIdentity = `${request.dashboardUID}|${request.panelId}|${target.refId}`;\n let targetSignature = this.getTargetSignature(request, target); // ${request.maxDataPoints} ?\n reqTargetSignatures.set(targetIdentity, targetSignature);\n });\n\n // figure out if new query range or new target props trigger full cache invalidation & re-query\n for (const [targetIdentity, targetSignature] of reqTargetSignatures) {\n let cached = this.cache.get(targetIdentity);\n let cachedSig = cached?.signature;\n\n if (cachedSig !== targetSignature) {\n doPartialQuery = false;\n } else {\n // only do partial queries when new request range follows prior request range (possibly with overlap)\n // e.g. now-6h with refresh <= 6h\n prevTo = cached?.prevTo ?? Infinity;\n\n doPartialQuery = newTo > prevTo && newFrom <= prevTo;\n }\n\n if (!doPartialQuery) {\n break;\n }\n }\n\n if (doPartialQuery && prevTo) {\n // clamp to make sure we don't re-query previous 10m when newFrom is ahead of it (e.g. 5min range, 30s refresh)\n let newFromPartial = Math.max(prevTo - this.overlapWindowMs, newFrom);\n\n const newToDate = dateTime(newTo);\n const newFromPartialDate = dateTime(incrRoundDn(newFromPartial, request.intervalMs));\n\n // modify to partial query\n request = {\n ...request,\n range: {\n ...request.range,\n from: newFromPartialDate,\n to: newToDate,\n },\n };\n } else {\n reqTargetSignatures.forEach((targSig, targIdent) => {\n this.cache.delete(targIdent);\n });\n }\n\n return {\n requests: [request],\n targetSignatures: reqTargetSignatures,\n shouldCache,\n };\n }\n\n // should amend existing cache with new frames and return full response\n procFrames(\n request: DataQueryRequest<T>,\n requestInfo: CacheRequestInfo<T> | undefined,\n respFrames: DataFrame[]\n ): DataFrame[] {\n if (requestInfo?.shouldCache) {\n const newFrom = request.range.from.valueOf();\n const newTo = request.range.to.valueOf();\n\n // group frames by targets\n const respByTarget = new Map<TargetIdent, DataFrame[]>();\n\n respFrames.forEach((frame: DataFrame) => {\n let targetIdent = `${request.dashboardUID}|${request.panelId}|${frame.refId}`;\n\n let frames = respByTarget.get(targetIdent);\n\n if (!frames) {\n frames = [];\n respByTarget.set(targetIdent, frames);\n }\n\n frames.push(frame);\n });\n\n let outFrames: DataFrame[] = [];\n\n respByTarget.forEach((respFrames, targetIdentity) => {\n let cachedFrames = (targetIdentity ? this.cache.get(targetIdentity)?.frames : null) ?? [];\n\n respFrames.forEach((respFrame: DataFrame) => {\n // skip empty frames\n if (respFrame.length === 0 || respFrame.fields.length === 0) {\n return;\n }\n\n // frames are identified by their second (non-time) field's name + labels\n // TODO: maybe also frame.meta.type?\n let respFrameIdentity = getFieldIdentity(respFrame.fields[1]);\n\n let cachedFrame = cachedFrames.find((cached) => getFieldIdentity(cached.fields[1]) === respFrameIdentity);\n\n if (!cachedFrame) {\n // append new unknown frames\n cachedFrames.push(respFrame);\n } else {\n // we assume that fields cannot appear/disappear and will all exist in same order\n\n // amend & re-cache\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n let prevTable: Table = cachedFrame.fields.map((field) => field.values) as Table;\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n let nextTable: Table = respFrame.fields.map((field) => field.values) as Table;\n\n let amendedTable = amendTable(prevTable, nextTable);\n if (amendedTable) {\n for (let i = 0; i < amendedTable.length; i++) {\n cachedFrame.fields[i].values = amendedTable[i];\n if (cachedFrame.fields[i].config.displayNameFromDS !== respFrame.fields[i].config.displayNameFromDS) {\n cachedFrame.fields[i].config.displayNameFromDS = respFrame.fields[i].config.displayNameFromDS;\n }\n }\n cachedFrame.length = cachedFrame.fields[0].values.length;\n }\n }\n });\n\n // trim all frames to in-view range, evict those that end up with 0 length\n let nonEmptyCachedFrames: DataFrame[] = [];\n\n cachedFrames.forEach((frame) => {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n let table: Table = frame.fields.map((field) => field.values) as Table;\n\n const dataPointStep = findDatapointStep(request, respFrames, this.applyInterpolation);\n\n // query interval is greater than request.intervalMs, use query interval to make sure we've always got one datapoint outside the panel viewport\n let trimmed = trimTable(table, newFrom - dataPointStep, newTo);\n\n if (trimmed[0].length > 0) {\n for (let i = 0; i < trimmed.length; i++) {\n frame.fields[i].values = trimmed[i];\n }\n nonEmptyCachedFrames.push(frame);\n }\n });\n\n this.cache.set(targetIdentity, {\n signature: requestInfo.targetSignatures.get(targetIdentity)!,\n frames: nonEmptyCachedFrames,\n prevTo: newTo,\n });\n\n outFrames.push(...nonEmptyCachedFrames);\n });\n\n // transformV2 mutates field values for heatmap de-accum, and modifies field order, so we gotta clone here, for now :(\n respFrames = outFrames.map((frame) => ({\n ...frame,\n fields: frame.fields.map((field) => ({\n ...field,\n config: {\n ...field.config, // prevents mutatative exemplars links (re)enrichment\n },\n values: field.values.slice(),\n })),\n }));\n }\n\n return respFrames;\n }\n}\n\nexport function findDatapointStep(\n request: DataQueryRequest<PromQuery>,\n respFrames: DataFrame[],\n applyInterpolation: ApplyInterpolation\n): number {\n // Prometheus specific logic below\n if (request.targets[0].datasource?.type !== 'prometheus') {\n return 0;\n }\n\n const target = request.targets.find((t) => t.refId === respFrames[0].refId);\n\n let dataPointStep = request.intervalMs;\n if (target?.interval) {\n const minStepMs =\n respFrames[0].meta?.custom?.['calculatedMinStep'] ??\n rangeUtil.intervalToMs(applyInterpolation(target.interval, request.scopedVars));\n if (minStepMs > request.intervalMs) {\n dataPointStep = minStepMs;\n }\n }\n return dataPointStep;\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/tracking.ts\nimport { CoreApp, DataQueryRequest, DataQueryResponse } from '@grafana/data';\nimport { config, reportInteraction } from '@grafana/runtime';\n\nimport { PromQuery } from './types';\n\nexport function trackQuery(\n response: DataQueryResponse,\n request: DataQueryRequest<PromQuery> & { targets: PromQuery[] },\n startTime: Date\n): void {\n const { app, targets: queries } = request;\n // We only track queries run in Explore.\n // We do not want to track queries from the dashboard, viewing a panel,\n // cloud-alerting, unified-alerting, scenes and unknown\n if (app !== CoreApp.Explore) {\n return;\n }\n\n for (const query of queries) {\n reportInteraction('grafana_prometheus_query_executed', {\n app,\n grafana_version: config.buildInfo.version,\n has_data: response.data.some((frame) => frame.length > 0),\n has_error: response.error !== undefined,\n expr: query.expr,\n format: query.format,\n instant: query.instant,\n range: query.range,\n exemplar: query.exemplar,\n hinting: query.hinting,\n interval: query.interval,\n intervalFactor: query.intervalFactor,\n utcOffsetSec: query.utcOffsetSec,\n legend: query.legendFormat,\n valueWithRefId: query.valueWithRefId,\n requestId: request.requestId,\n showingGraph: query.showingGraph,\n showingTable: query.showingTable,\n editor_mode: query.editorMode,\n simultaneously_sent_query_count: queries.length,\n time_range_from: request?.range?.from?.toISOString(),\n time_range_to: request?.range?.to?.toISOString(),\n time_taken: Date.now() - startTime.getTime(),\n });\n }\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/LabelFilterItem.tsx\nimport debounce from 'debounce-promise';\nimport { useState } from 'react';\n\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t } from '@grafana/i18n';\nimport { AccessoryButton, InputGroup } from '@grafana/plugin-ui';\nimport { AsyncSelect, Select } from '@grafana/ui';\n\nimport { truncateResult } from '../../language_utils';\nimport { QueryBuilderLabelFilter } from '../shared/types';\n\ninterface LabelFilterItemProps {\n defaultOp: string;\n item: Partial<QueryBuilderLabelFilter>;\n onChange: (value: QueryBuilderLabelFilter) => void;\n onGetLabelNames: (forLabel: Partial<QueryBuilderLabelFilter>) => Promise<SelectableValue[]>;\n onGetLabelValues: (forLabel: Partial<QueryBuilderLabelFilter>) => Promise<SelectableValue[]>;\n onDelete: () => void;\n invalidLabel?: boolean;\n invalidValue?: boolean;\n getLabelValuesAutofillSuggestions: (query: string, labelName?: string) => Promise<SelectableValue[]>;\n debounceDuration: number;\n}\n\nexport function LabelFilterItem({\n item,\n defaultOp,\n onChange,\n onDelete,\n onGetLabelNames,\n onGetLabelValues,\n invalidLabel,\n invalidValue,\n getLabelValuesAutofillSuggestions,\n debounceDuration,\n}: LabelFilterItemProps) {\n const [state, setState] = useState<{\n labelNames?: SelectableValue[];\n labelValues?: SelectableValue[];\n isLoadingLabelNames?: boolean;\n isLoadingLabelValues?: boolean;\n }>({});\n // there's a bug in react-select where the menu doesn't recalculate its position when the options are loaded asynchronously\n // see https://github.com/grafana/grafana/issues/63558\n // instead, we explicitly control the menu visibility and prevent showing it until the options have fully loaded\n const [labelNamesMenuOpen, setLabelNamesMenuOpen] = useState(false);\n const [labelValuesMenuOpen, setLabelValuesMenuOpen] = useState(false);\n const [allLabels, setAllLabels] = useState<SelectableValue[]>([]);\n\n const isMultiSelect = (operator = item.op) => {\n return operators.find((op) => op.label === operator)?.isMultiValue;\n };\n\n const getSelectOptionsFromString = (item?: string): string[] => {\n if (item) {\n const regExp = /\\(([^)]+)\\)/;\n const matches = item?.match(regExp);\n\n if (matches && matches[0].indexOf('|') > 0) {\n return [item];\n }\n\n if (item.indexOf('|') > 0) {\n return item.split('|');\n }\n return [item];\n }\n return [];\n };\n\n const labelValueSearch = debounce(\n (query: string) => getLabelValuesAutofillSuggestions(query, item.label),\n debounceDuration\n );\n\n /**\n * Debounce a search through all the labels possible and truncate by .\n */\n const labelNamesSearch = debounce((query: string) => {\n // we limit the select to show 1000 options,\n // but we still search through all the possible options\n const results = allLabels.filter((label) => {\n return label.value.includes(query);\n });\n return truncateResult(results);\n }, debounceDuration);\n\n const itemValue = item?.value ?? '';\n\n return (\n <div key={itemValue} data-testid=\"prometheus-dimensions-filter-item\">\n <InputGroup>\n {/* Label name select, loads all values at once */}\n <AsyncSelect\n placeholder={t('grafana-prometheus.querybuilder.label-filter-item.placeholder-select-label', 'Select label')}\n data-testid={selectors.components.QueryBuilder.labelSelect}\n inputId=\"prometheus-dimensions-filter-item-key\"\n width=\"auto\"\n value={item.label ? toOption(item.label) : null}\n allowCustomValue\n onOpenMenu={async () => {\n setState({ isLoadingLabelNames: true });\n const labelNames = await onGetLabelNames(item);\n // store all label names to allow for full label searching by typing in the select option, see loadOptions function labelNamesSearch\n setAllLabels(labelNames);\n setLabelNamesMenuOpen(true);\n // truncate the results the same amount as the metric select\n const truncatedLabelNames = truncateResult(labelNames);\n setState({ labelNames: truncatedLabelNames, isLoadingLabelNames: undefined });\n }}\n onCloseMenu={() => {\n setLabelNamesMenuOpen(false);\n }}\n isOpen={labelNamesMenuOpen}\n isLoading={state.isLoadingLabelNames ?? false}\n loadOptions={labelNamesSearch}\n defaultOptions={state.labelNames}\n onChange={(change) => {\n if (change.label) {\n onChange({\n ...item,\n op: item.op ?? defaultOp,\n label: change.label,\n // eslint-ignore\n } as QueryBuilderLabelFilter);\n }\n }}\n invalid={invalidLabel}\n />\n\n {/* Operator select i.e. = =~ != !~ */}\n <Select\n data-testid={selectors.components.QueryBuilder.matchOperatorSelect}\n className=\"query-segment-operator\"\n value={toOption(item.op ?? defaultOp)}\n options={operators}\n width=\"auto\"\n onChange={(change) => {\n if (change.value != null) {\n onChange({\n ...item,\n op: change.value,\n value: isMultiSelect(change.value) ? item.value : getSelectOptionsFromString(item?.value)[0],\n // eslint-ignore\n } as QueryBuilderLabelFilter);\n }\n }}\n />\n\n {/* Label value async select: autocomplete calls prometheus API */}\n <AsyncSelect\n placeholder={t('grafana-prometheus.querybuilder.label-filter-item.placeholder-select-value', 'Select value')}\n data-testid={selectors.components.QueryBuilder.valueSelect}\n inputId=\"prometheus-dimensions-filter-item-value\"\n width=\"auto\"\n value={\n isMultiSelect()\n ? getSelectOptionsFromString(itemValue).map(toOption)\n : getSelectOptionsFromString(itemValue).map(toOption)[0]\n }\n allowCustomValue\n formatCreateLabel={(input) => input} // to avoid confusion, opt out of using the `defaultFormatCreateLabel`\n createOptionPosition={item.op?.includes('~') ? 'first' : 'last'}\n onOpenMenu={async () => {\n setState({ isLoadingLabelValues: true });\n const labelValues = await onGetLabelValues(item);\n truncateResult(labelValues);\n setLabelValuesMenuOpen(true);\n setState({\n ...state,\n labelValues,\n isLoadingLabelValues: undefined,\n });\n }}\n onCloseMenu={() => {\n setLabelValuesMenuOpen(false);\n }}\n isOpen={labelValuesMenuOpen}\n defaultOptions={state.labelValues}\n isMulti={isMultiSelect()}\n isLoading={state.isLoadingLabelValues}\n loadOptions={labelValueSearch}\n onChange={(change) => {\n if (change.value) {\n onChange({\n ...item,\n value: change.value,\n op: item.op ?? defaultOp,\n // eslint-ignore\n } as QueryBuilderLabelFilter);\n } else {\n const changes = change\n .map((change: { label?: string }) => {\n return change.label;\n })\n .join('|');\n // eslint-ignore\n onChange({ ...item, value: changes, op: item.op ?? defaultOp } as QueryBuilderLabelFilter);\n }\n }}\n invalid={invalidValue}\n />\n <AccessoryButton\n aria-label={t('grafana-prometheus.querybuilder.label-filter-item.aria-label-remove', 'Remove {{name}}', {\n name: item.label,\n })}\n icon=\"times\"\n variant=\"secondary\"\n onClick={onDelete}\n />\n </InputGroup>\n </div>\n );\n}\n\nconst operators = [\n { label: '=', value: '=', isMultiValue: false },\n { label: '!=', value: '!=', isMultiValue: false },\n { label: '=~', value: '=~', isMultiValue: true },\n { label: '!~', value: '!~', isMultiValue: true },\n];\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/LabelFilters.tsx\nimport { css, cx } from '@emotion/css';\nimport { isEqual } from 'lodash';\nimport { useEffect, useState } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { EditorField, EditorFieldGroup, EditorList } from '@grafana/plugin-ui';\nimport { InlineFieldRow, InlineLabel } from '@grafana/ui';\n\nimport { QueryBuilderLabelFilter } from '../shared/types';\n\nimport { LabelFilterItem } from './LabelFilterItem';\n\nexport const MISSING_LABEL_FILTER_ERROR_MESSAGE = 'Select at least 1 label filter (label and value)';\n\nexport interface LabelFiltersProps {\n labelsFilters: QueryBuilderLabelFilter[];\n onChange: (labelFilters: Array<Partial<QueryBuilderLabelFilter>>) => void;\n onGetLabelNames: (forLabel: Partial<QueryBuilderLabelFilter>) => Promise<SelectableValue[]>;\n onGetLabelValues: (forLabel: Partial<QueryBuilderLabelFilter>) => Promise<SelectableValue[]>;\n /** If set to true, component will show error message until at least 1 filter is selected */\n labelFilterRequired?: boolean;\n getLabelValuesAutofillSuggestions: (query: string, labelName?: string) => Promise<SelectableValue[]>;\n debounceDuration: number;\n variableEditor?: boolean;\n}\n\nexport function LabelFilters({\n labelsFilters,\n onChange,\n onGetLabelNames,\n onGetLabelValues,\n labelFilterRequired,\n getLabelValuesAutofillSuggestions,\n debounceDuration,\n variableEditor,\n}: LabelFiltersProps) {\n const defaultOp = '=';\n const [items, setItems] = useState<Array<Partial<QueryBuilderLabelFilter>>>([{ op: defaultOp }]);\n\n useEffect(() => {\n if (labelsFilters.length > 0) {\n setItems(labelsFilters);\n } else {\n setItems([{ op: defaultOp }]);\n }\n }, [labelsFilters]);\n\n const onLabelsChange = (newItems: Array<Partial<QueryBuilderLabelFilter>>) => {\n setItems(newItems);\n\n // Extract full label filters with both label & value\n const newLabels = newItems.filter((x) => x.label != null && x.value != null);\n if (!isEqual(newLabels, labelsFilters)) {\n onChange(newLabels);\n }\n };\n\n const hasLabelFilter = items.some((item) => item.label && item.value);\n\n const editorList = () => {\n return (\n <EditorList\n items={items}\n onChange={onLabelsChange}\n renderItem={(item: Partial<QueryBuilderLabelFilter>, onChangeItem, onDelete) => (\n <LabelFilterItem\n debounceDuration={debounceDuration}\n item={item}\n defaultOp={defaultOp}\n onChange={onChangeItem}\n onDelete={onDelete}\n onGetLabelNames={onGetLabelNames}\n onGetLabelValues={onGetLabelValues}\n invalidLabel={labelFilterRequired && !item.label}\n invalidValue={labelFilterRequired && !item.value}\n getLabelValuesAutofillSuggestions={getLabelValuesAutofillSuggestions}\n />\n )}\n />\n );\n };\n\n return (\n <>\n {variableEditor ? (\n <InlineFieldRow>\n <div\n className={cx(\n css({\n display: 'flex',\n })\n )}\n >\n <InlineLabel\n width={20}\n tooltip={\n <div>\n <Trans i18nKey=\"grafana-prometheus.querybuilder.label-filters.tooltip-label-filters\">\n Optional: used to filter the metric select for this query type.\n </Trans>\n </div>\n }\n >\n <Trans i18nKey=\"grafana-prometheus.querybuilder.label-filters.label-filters\">Label filters</Trans>\n </InlineLabel>\n {editorList()}\n </div>\n </InlineFieldRow>\n ) : (\n <EditorFieldGroup>\n <EditorField\n label={t('grafana-prometheus.querybuilder.label-filters.label-label-filters', 'Label filters')}\n error={MISSING_LABEL_FILTER_ERROR_MESSAGE}\n invalid={labelFilterRequired && !hasLabelFilter}\n >\n {editorList()}\n </EditorField>\n </EditorFieldGroup>\n )}\n </>\n );\n}\n","import { regexifyLabelValuesQueryString } from '../parsingUtils';\nimport { QueryBuilderLabelFilter } from '../shared/types';\n\nconst formatPrometheusLabelFiltersToString = (\n queryString: string,\n labelsFilters: QueryBuilderLabelFilter[] | undefined\n): string => {\n const filterArray = labelsFilters ? formatPrometheusLabelFilters(labelsFilters) : [];\n\n return `{__name__=~\".*${queryString}\"${filterArray ? filterArray.join('') : ''}}`;\n};\n\nexport const formatPrometheusLabelFilters = (labelsFilters: QueryBuilderLabelFilter[]): string[] => {\n return labelsFilters.map((label) => {\n return `,${label.label}=\"${label.value}\"`;\n });\n};\n\n/**\n * Reformat the query string and label filters to return all valid results for current query editor state\n */\nexport const formatKeyValueStrings = (query: string, labelsFilters?: QueryBuilderLabelFilter[]): string => {\n const queryString = regexifyLabelValuesQueryString(query);\n\n return formatPrometheusLabelFiltersToString(queryString, labelsFilters);\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/metrics-modal/FeedbackLink.tsx\nimport { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { Icon, useStyles2, Stack } from '@grafana/ui';\n\ninterface Props {\n feedbackUrl?: string;\n}\n\nexport function FeedbackLink({ feedbackUrl }: Props) {\n const styles = useStyles2(getStyles);\n\n return (\n <Stack>\n <a\n href={feedbackUrl}\n className={styles.link}\n title={t(\n 'grafana-prometheus.querybuilder.feedback-link.title-give-feedback',\n 'The metrics explorer is new, please let us know how we can improve it'\n )}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n <Icon name=\"comment-alt-message\" />{' '}\n <Trans i18nKey=\"grafana-prometheus.querybuilder.feedback-link.give-feedback\">Give feedback</Trans>\n </a>\n </Stack>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n link: css({\n color: theme.colors.text.secondary,\n fontSize: theme.typography.bodySmall.fontSize,\n ':hover': {\n color: theme.colors.text.link,\n },\n margin: `-25px 0 30px 0`,\n }),\n };\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/metrics-modal/state/helpers.ts\nimport { t } from '@grafana/i18n';\n\nimport { PrometheusLanguageProviderInterface } from '../../../language_provider';\n\nimport { MetricData, MetricsData, PromFilterOption } from './types';\n\n// Constants\nconst HISTOGRAM_TYPES = ['histogram', 'summary'] as const;\nconst OLD_HISTOGRAM_PATTERN = /^\\w+_bucket$|^\\w+_bucket{.*}$/;\nconst HISTOGRAM_TYPE = 'histogram';\nconst NATIVE_HISTOGRAM_TYPE = 'native histogram';\n\n/**\n * Builds the metric data object with type and description\n * @param metric - The metric name\n * @param languageProvider - The Prometheus language provider interface\n * @returns MetricData object with value, type, and description\n */\nexport const generateMetricData = (\n metric: string,\n languageProvider: PrometheusLanguageProviderInterface\n): MetricData => {\n const metadata = languageProvider.retrieveMetricsMetadata();\n\n let type = metadata[metric]?.type;\n const description = metadata[metric]?.help;\n\n HISTOGRAM_TYPES.forEach((t) => {\n if (description?.toLowerCase().includes(t) && type !== t) {\n type = type ? `${type} (${t})` : t;\n }\n });\n\n const oldHistogramMatch = metric.match(OLD_HISTOGRAM_PATTERN);\n\n if (type === HISTOGRAM_TYPE && !oldHistogramMatch) {\n type = NATIVE_HISTOGRAM_TYPE;\n }\n\n return {\n value: metric,\n type: type,\n description: description,\n };\n};\n\nexport function calculatePageList(metricsData: MetricsData, resultsPerPage: number): number[] {\n if (!Array.isArray(metricsData) || metricsData.length === 0) {\n return [];\n }\n\n if (resultsPerPage <= 0) {\n return [1];\n }\n\n const totalPages = Math.ceil(metricsData.length / resultsPerPage);\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n}\n\nexport const getPromTypes: () => PromFilterOption[] = () => [\n {\n value: 'counter',\n label: t('grafana-prometheus.querybuilder.get-prom-types.label-counter', 'Counter'),\n description: t(\n 'grafana-prometheus.querybuilder.get-prom-types.description-counter',\n 'A cumulative metric that represents a single monotonically increasing counter whose value can only increase or be reset to zero on restart.'\n ),\n },\n {\n value: 'gauge',\n label: t('grafana-prometheus.querybuilder.get-prom-types.label-gauge', 'Gauge'),\n description: t(\n 'grafana-prometheus.querybuilder.get-prom-types.description-gauge',\n 'A metric that represents a single numerical value that can arbitrarily go up and down.'\n ),\n },\n {\n value: 'histogram',\n label: t('grafana-prometheus.querybuilder.get-prom-types.label-histogram', 'Histogram'),\n description: t(\n 'grafana-prometheus.querybuilder.get-prom-types.description-histogram',\n 'A histogram samples observations (usually things like request durations or response sizes) and counts them in configurable buckets.'\n ),\n },\n {\n value: 'native histogram',\n label: t('grafana-prometheus.querybuilder.get-prom-types.label-native-histogram', 'Native histogram'),\n description: t(\n 'grafana-prometheus.querybuilder.get-prom-types.description-native-histogram',\n 'Native histograms are different from classic Prometheus histograms in a number of ways: Native histogram bucket boundaries are calculated by a formula that depends on the scale (resolution) of the native histogram, and are not user defined.'\n ),\n },\n {\n value: 'summary',\n label: t('grafana-prometheus.querybuilder.get-prom-types.label-summary', 'Summary'),\n description: t(\n 'grafana-prometheus.querybuilder.get-prom-types.description-summary',\n 'A summary samples observations (usually things like request durations and response sizes) and can calculate configurable quantiles over a sliding time window.'\n ),\n },\n {\n value: 'unknown',\n label: t('grafana-prometheus.querybuilder.get-prom-types.label-unknown', 'Unknown'),\n description: t(\n 'grafana-prometheus.querybuilder.get-prom-types.description-unknown',\n 'These metrics have been given the type unknown in the metadata.'\n ),\n },\n {\n value: 'no type',\n label: t('grafana-prometheus.querybuilder.get-prom-types.label-no-type', 'No type'),\n description: t(\n 'grafana-prometheus.querybuilder.get-prom-types.description-no-type',\n 'These metrics have no defined type in the metadata.'\n ),\n },\n];\n\nexport const getPlaceholders = () => ({\n browse: t('grafana-prometheus.querybuilder.get-placeholders.browse', 'Search metrics by name'),\n filterType: t('grafana-prometheus.querybuilder.get-placeholders.type', 'Filter by type'),\n});\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/metrics-modal/uFuzzy.ts\nimport uFuzzy from '@leeoniya/ufuzzy';\n\nconst uf = new uFuzzy({\n intraMode: 1,\n intraIns: 1,\n intraSub: 1,\n intraTrn: 1,\n intraDel: 1,\n});\n\nexport const fuzzySearch = (haystack: string[], query: string) => {\n const [idxs, info, order] = uf.search(haystack, query, 0, 1e5);\n\n let haystackOrder: string[] = [];\n let matchesSet: Set<string> = new Set();\n if (!(idxs && order)) {\n return [[], []];\n }\n /**\n * get the fuzzy matches for highlighting\n * @param part\n * @param matched\n */\n const mark = (part: string, matched: boolean) => {\n if (matched) {\n matchesSet.add(part);\n }\n };\n\n // Iterate to create the order of needles(queries) and the matches\n for (let i = 0; i < order.length; i++) {\n let infoIdx = order[i];\n\n /** Evaluate the match, get the matches for highlighting */\n uFuzzy.highlight(haystack[info.idx[infoIdx]], info.ranges[infoIdx], mark);\n /** Get the order */\n haystackOrder.push(haystack[info.idx[infoIdx]]);\n }\n\n return [haystackOrder, [...matchesSet]];\n};\n","import debounce from 'debounce-promise';\nimport {\n createContext,\n FC,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { SelectableValue, TimeRange } from '@grafana/data';\n\nimport { METRIC_LABEL, PROMETHEUS_QUERY_BUILDER_MAX_RESULTS } from '../../../constants';\nimport { PrometheusLanguageProviderInterface } from '../../../language_provider';\nimport { regexifyLabelValuesQueryString } from '../../parsingUtils';\nimport { QueryBuilderLabelFilter } from '../../shared/types';\nimport { formatPrometheusLabelFilters } from '../formatter';\n\nimport { generateMetricData } from './helpers';\nimport { MetricData, MetricsData } from './types';\nimport { fuzzySearch } from './uFuzzy';\n\nexport const DEFAULT_RESULTS_PER_PAGE = 25;\n\ntype Pagination = {\n pageNum: number;\n resultsPerPage: number;\n totalPageNum: number;\n};\n\ntype MetricsModalContextValue = {\n isLoading: boolean;\n setIsLoading: (val: boolean) => void;\n filteredMetricsData: MetricData[];\n debouncedBackendSearch: (\n timeRange: TimeRange,\n metricText: string,\n queryLabels?: QueryBuilderLabelFilter[]\n ) => Promise<void>;\n pagination: Pagination;\n setPagination: (val: Pagination) => void;\n selectedTypes: Array<SelectableValue<string>>;\n setSelectedTypes: (val: Array<SelectableValue<string>>) => void;\n searchedText: string;\n setSearchedText: (val: string) => void;\n};\n\nconst MetricsModalContext = createContext<MetricsModalContextValue | undefined>(undefined);\n\ntype MetricsModalContextProviderProps = {\n languageProvider: PrometheusLanguageProviderInterface;\n};\n\nexport const MetricsModalContextProvider: FC<PropsWithChildren<MetricsModalContextProviderProps>> = ({\n children,\n languageProvider,\n}) => {\n const [isLoading, setIsLoading] = useState(true);\n const [metricsData, setMetricsData] = useState<MetricsData>([]);\n const [pagination, setPagination] = useState<Pagination>({\n pageNum: 1,\n totalPageNum: 1,\n resultsPerPage: DEFAULT_RESULTS_PER_PAGE,\n });\n const [selectedTypes, setSelectedTypes] = useState<Array<SelectableValue<string>>>([]);\n const [searchedText, setSearchedText] = useState('');\n\n const filteredMetricsData = useMemo(() => {\n if (selectedTypes.length === 0) {\n return metricsData;\n }\n\n // Filter metrics based on selected types\n return metricsData.filter((metric: MetricData) => {\n return selectedTypes.some((selectedType) => {\n // Handle metrics with defined types\n if (metric.type && selectedType.value) {\n return metric.type.includes(selectedType.value);\n }\n\n // Handle metrics without type when \"no type\" is selected\n if (!metric.type && selectedType.value === 'no type') {\n return true;\n }\n\n return false;\n });\n });\n }, [metricsData, selectedTypes]);\n\n useEffect(() => {\n const totalPageNum =\n filteredMetricsData.length === 0 ? 1 : Math.ceil(filteredMetricsData.length / pagination.resultsPerPage);\n const pageNum = pagination.pageNum > totalPageNum ? 1 : pagination.pageNum;\n\n setPagination((prevPagination) => ({\n ...prevPagination,\n totalPageNum,\n pageNum,\n }));\n }, [filteredMetricsData.length, pagination.resultsPerPage, pagination.pageNum]);\n\n // Track the latest search ID to handle race conditions\n const latestSearchIdRef = useRef<number>(0);\n\n const fetchMetadata = useCallback(async () => {\n try {\n setIsLoading(true);\n const metadata = await languageProvider.queryMetricsMetadata(PROMETHEUS_QUERY_BUILDER_MAX_RESULTS);\n\n if (Object.keys(metadata).length === 0) {\n setMetricsData([]);\n } else {\n const processedData = Object.keys(metadata).map((m) => generateMetricData(m, languageProvider));\n setMetricsData(processedData);\n }\n } catch (error) {\n setMetricsData([]);\n } finally {\n setIsLoading(false);\n }\n }, [languageProvider]);\n\n const debouncedBackendSearch = useMemo(\n () =>\n debounce(async (timeRange: TimeRange, metricText: string, queryLabels?: QueryBuilderLabelFilter[]) => {\n // Generate unique search ID to handle race conditions\n const searchId = ++latestSearchIdRef.current;\n\n try {\n if (metricText === '') {\n await fetchMetadata();\n return;\n }\n\n setIsLoading(true);\n\n const queryString = regexifyLabelValuesQueryString(metricText);\n const filterArray = queryLabels ? formatPrometheusLabelFilters(queryLabels) : [];\n const match = `{__name__=~\"(?i).*${queryString}\"${filterArray ? filterArray.join('') : ''}}`;\n\n const results = await languageProvider.queryLabelValues(timeRange, METRIC_LABEL, match);\n\n // Check if this is still the most recent search\n if (searchId !== latestSearchIdRef.current) {\n return; // Ignore outdated results\n }\n\n const [fuzzyOrderedMetrics] = fuzzySearch(results, queryString);\n const resultsOptions: MetricsData = fuzzyOrderedMetrics.map((m) => generateMetricData(m, languageProvider));\n\n setMetricsData(resultsOptions);\n setIsLoading(false);\n } catch (error) {\n // Only update state if this is still the latest search\n if (searchId === latestSearchIdRef.current) {\n console.error('Backend search failed:', error);\n setMetricsData([]); // Clear results on error\n setIsLoading(false);\n }\n }\n }, 300),\n [fetchMetadata, languageProvider]\n );\n\n useEffect(() => {\n fetchMetadata();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <MetricsModalContext.Provider\n value={{\n isLoading,\n setIsLoading,\n filteredMetricsData,\n debouncedBackendSearch,\n pagination,\n setPagination,\n selectedTypes,\n setSelectedTypes,\n searchedText,\n setSearchedText,\n }}\n >\n {children}\n </MetricsModalContext.Provider>\n );\n};\n\nexport function useMetricsModal() {\n const context = useContext(MetricsModalContext);\n if (context === undefined) {\n throw new Error('useMetricsModal must be used within a MetricsModalContextProvider');\n }\n return context;\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Trans } from '@grafana/i18n';\nimport { FieldValidationMessage, TextLink } from '@grafana/ui';\n\n/**\n * Use this to return a url in a tooltip in a field. Don't forget to make the field interactive to be able to click on the tooltip\n * @param url\n * @returns\n */\nexport function docsTip(url?: string) {\n const docsUrl = 'https://grafana.com/docs/grafana/latest/datasources/prometheus/configure/';\n\n return (\n <TextLink href={url ? url : docsUrl} external>\n <Trans i18nKey=\"grafana-prometheus.configuration.docs-tip.visit-docs-for-more-details-here\">\n Visit docs for more details here.\n </Trans>\n </TextLink>\n );\n}\n\nexport const validateInput = (\n input: string,\n pattern: string | RegExp,\n errorMessage?: string\n): boolean | JSX.Element => {\n const defaultErrorMessage = 'Value is not valid';\n const inputTooLongErrorMessage = 'Input is too long';\n const validationTimeoutErrorMessage = 'Validation timeout - input too complex';\n const invalidValidationPatternErrorMessage = 'Invalid validation pattern';\n const MAX_INPUT_LENGTH = 1000; // Reasonable limit for most validation cases\n\n // Early return if no input\n if (!input) {\n return true;\n }\n\n // Check input length\n if (input.length > MAX_INPUT_LENGTH) {\n return <FieldValidationMessage>{inputTooLongErrorMessage}</FieldValidationMessage>;\n }\n\n try {\n // Convert string pattern to RegExp if needed\n let regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;\n\n // Ensure pattern is properly anchored to prevent catastrophic backtracking\n if (typeof pattern === 'string' && !pattern.startsWith('^') && !pattern.endsWith('$')) {\n regex = new RegExp(`^${pattern}$`);\n }\n\n // Add timeout to prevent ReDoS\n const timeout = 100; // 100ms timeout\n const startTime = Date.now();\n\n const isValid = regex.test(input);\n\n // Check if execution took too long\n if (Date.now() - startTime > timeout) {\n return <FieldValidationMessage>{validationTimeoutErrorMessage}</FieldValidationMessage>;\n }\n\n if (!isValid) {\n return <FieldValidationMessage>{errorMessage || defaultErrorMessage}</FieldValidationMessage>;\n }\n\n return true;\n } catch (error) {\n return <FieldValidationMessage>{invalidValidationPatternErrorMessage}</FieldValidationMessage>;\n }\n};\n\nexport function overhaulStyles(theme: GrafanaTheme2) {\n return {\n additionalSettings: css({\n marginBottom: '25px',\n }),\n secondaryGrey: css({\n color: theme.colors.secondary.text,\n opacity: '65%',\n }),\n inlineError: css({\n margin: '0px 0px 4px 245px',\n }),\n switchField: css({\n alignItems: 'center',\n }),\n sectionHeaderPadding: css({\n paddingTop: '32px',\n }),\n sectionBottomPadding: css({\n paddingBottom: '28px',\n }),\n subsectionText: css({\n fontSize: '12px',\n }),\n hrBottomSpace: css({\n marginBottom: '56px',\n }),\n hrTopSpace: css({\n marginTop: '50px',\n }),\n textUnderline: css({\n textDecoration: 'underline',\n }),\n versionMargin: css({\n marginBottom: '12px',\n }),\n advancedHTTPSettingsMargin: css({\n margin: '24px 0 8px 0',\n }),\n advancedSettings: css({\n paddingTop: '32px',\n }),\n alertingTop: css({\n marginTop: '40px !important',\n }),\n overhaulPageHeading: css({\n fontWeight: 400,\n }),\n container: css({\n maxwidth: 578,\n }),\n };\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/metrics-modal/styles.ts\nimport { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport const getMetricsModalStyles = (theme: GrafanaTheme2) => {\n return {\n modal: css({\n width: '85vw',\n [theme.breakpoints.down('md')]: {\n width: '100%',\n },\n [theme.breakpoints.up('xl')]: {\n width: '60%',\n },\n }),\n inputWrapper: css({\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n }),\n inputItemFirst: css({\n flexBasis: '40%',\n paddingRight: '16px',\n [theme.breakpoints.down('md')]: {\n paddingRight: '0px',\n paddingBottom: '16px',\n },\n }),\n inputItem: css({\n flexGrow: 1,\n flexBasis: '20%',\n [theme.breakpoints.down('md')]: {\n minWidth: '100%',\n },\n }),\n resultsData: css({\n margin: `4px 0 ${theme.spacing(2)} 0`,\n }),\n resultsDataFiltered: css({\n color: theme.colors.text.secondary,\n textAlign: 'center',\n border: 'solid 1px rgba(204, 204, 220, 0.25)',\n padding: '7px',\n }),\n resultsDataFilteredText: css({\n display: 'inline',\n verticalAlign: 'text-top',\n }),\n results: css({\n height: 'calc(80vh - 310px)',\n overflowY: 'scroll',\n }),\n resultsFooter: css({\n marginTop: '24px',\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'center',\n position: 'sticky',\n justifyContent: 'center',\n }),\n currentlySelected: css({\n color: 'grey',\n opacity: '75%',\n fontSize: '0.75rem',\n }),\n loadingSpinner: css({\n visibility: 'hidden',\n }),\n visible: css({\n visibility: 'visible',\n }),\n noBorder: css({\n border: 'none',\n }),\n };\n};\n\nexport const getResultsTableStyles = (theme: GrafanaTheme2) => {\n return {\n table: css({\n tableLayout: 'fixed',\n borderRadius: theme.shape.radius.default,\n width: '100%',\n whiteSpace: 'normal',\n td: {\n padding: theme.spacing(1),\n },\n 'td,th': {\n minWidth: theme.spacing(3),\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n },\n }),\n row: css({\n label: 'row',\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n cursor: 'pointer',\n '&:last-child': {\n borderBottom: 0,\n },\n '&:hover': {\n backgroundColor: theme.colors.background.secondary,\n },\n }),\n tableHeaderPadding: css({\n padding: '8px',\n }),\n matchHighLight: css({\n background: 'inherit',\n color: theme.components.textHighlight.text,\n backgroundColor: theme.components.textHighlight.background,\n }),\n nameWidth: css({\n width: '37.5%',\n }),\n nameOverflow: css({\n overflowWrap: 'anywhere',\n }),\n typeWidth: css({\n width: '15%',\n }),\n descriptionWidth: css({\n width: '35%',\n }),\n stickyHeader: css({\n position: 'sticky',\n top: 0,\n backgroundColor: theme.colors.background.primary,\n }),\n noResults: css({\n textAlign: 'center',\n color: theme.colors.text.secondary,\n }),\n tooltipSpace: css({\n marginLeft: '4px',\n }),\n };\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/metrics-modal/ResultsTable.tsx\nimport { ReactElement, useMemo } from 'react';\nimport Highlighter from 'react-highlight-words';\n\nimport { t, Trans } from '@grafana/i18n';\nimport { Icon, Tooltip, useStyles2 } from '@grafana/ui';\n\nimport { docsTip } from '../../../configuration/shared/utils';\nimport { PromVisualQuery } from '../../types';\n\nimport { useMetricsModal } from './MetricsModalContext';\nimport { getResultsTableStyles } from './styles';\nimport { MetricData } from './types';\n\ntype ResultsTableProps = {\n onChange: (query: PromVisualQuery) => void;\n onClose: () => void;\n query: PromVisualQuery;\n};\n\nexport function ResultsTable(props: ResultsTableProps) {\n const { onChange, onClose, query } = props;\n const {\n isLoading,\n filteredMetricsData,\n pagination: { pageNum, resultsPerPage },\n selectedTypes,\n searchedText,\n } = useMetricsModal();\n\n const slicedMetrics = useMemo(() => {\n const startIndex = (pageNum - 1) * resultsPerPage;\n const endIndex = startIndex + resultsPerPage;\n return filteredMetricsData.slice(startIndex, endIndex);\n }, [filteredMetricsData, pageNum, resultsPerPage]);\n\n const styles = useStyles2(getResultsTableStyles);\n\n function selectMetric(metric: MetricData) {\n if (metric.value) {\n onChange({ ...query, metric: metric.value });\n onClose();\n }\n }\n\n function metaRows(metric: MetricData) {\n return (\n <>\n <td>{displayType(metric.type ?? '')}</td>\n <td>\n <Highlighter\n textToHighlight={metric.description ?? ''}\n searchWords={[]}\n autoEscape\n highlightClassName={styles.matchHighLight}\n />\n </td>\n </>\n );\n }\n\n function addHelpIcon(fullType: string, descriptiveType: string, link: string) {\n return (\n <>\n {fullType}\n <span className={styles.tooltipSpace}>\n <Tooltip\n content={\n <>\n <Trans i18nKey=\"grafana-prometheus.querybuilder.results-table.content-descriptive-type\">\n When creating a {{ descriptiveType }}, Prometheus exposes multiple series with the type counter.{' '}\n </Trans>\n {docsTip(link)}\n </>\n }\n placement=\"bottom-start\"\n interactive={true}\n >\n <Icon name=\"info-circle\" size=\"xs\" />\n </Tooltip>\n </span>\n </>\n );\n }\n\n function displayType(type: string | null) {\n if (!type) {\n return '';\n }\n\n if (type.includes('(summary)')) {\n return addHelpIcon(type, 'summary', 'https://prometheus.io/docs/concepts/metric_types/#summary');\n }\n\n if (type.includes('(histogram)')) {\n return addHelpIcon(type, 'histogram', 'https://prometheus.io/docs/concepts/metric_types/#histogram');\n }\n\n return type;\n }\n\n function noMetricsMessages(): ReactElement {\n let message;\n\n if (!searchedText) {\n message = t(\n 'grafana-prometheus.querybuilder.results-table.message-no-metrics-found',\n 'There are no metrics found in the data source.'\n );\n }\n\n if (query.labels.length > 0) {\n message = t(\n 'grafana-prometheus.querybuilder.results-table.message-expand-label-filters',\n 'There are no metrics found. Try to expand your label filters.'\n );\n }\n\n if (searchedText || selectedTypes.length > 0) {\n message = t(\n 'grafana-prometheus.querybuilder.results-table.message-expand-search',\n 'There are no metrics found. Try to expand your search and filters.'\n );\n }\n\n return (\n <tr className={styles.noResults}>\n <td colSpan={3}>{message}</td>\n </tr>\n );\n }\n\n return (\n <table className={styles.table}>\n <thead className={styles.stickyHeader}>\n <tr>\n <th className={`${styles.nameWidth} ${styles.tableHeaderPadding}`}>\n <Trans i18nKey=\"grafana-prometheus.querybuilder.results-table.name\">Name</Trans>\n </th>\n <th className={`${styles.typeWidth} ${styles.tableHeaderPadding}`}>\n <Trans i18nKey=\"grafana-prometheus.querybuilder.results-table.type\">Type</Trans>\n </th>\n <th className={`${styles.descriptionWidth} ${styles.tableHeaderPadding}`}>\n <Trans i18nKey=\"grafana-prometheus.querybuilder.results-table.description\">Description</Trans>\n </th>\n </tr>\n </thead>\n <tbody>\n <>\n {slicedMetrics.length > 0 &&\n slicedMetrics.map((metric: MetricData, idx: number) => {\n return (\n <tr key={metric?.value ?? idx} className={styles.row} onClick={() => selectMetric(metric)}>\n <td className={styles.nameOverflow}>\n <Highlighter\n textToHighlight={metric?.value ?? ''}\n searchWords={searchedText.split(' ')}\n autoEscape\n highlightClassName={styles.matchHighLight}\n />\n </td>\n {metaRows(metric)}\n </tr>\n );\n })}\n {slicedMetrics.length === 0 && !isLoading && noMetricsMessages()}\n </>\n </tbody>\n </table>\n );\n}\n","export const metricsModaltestIds = {\n metricModal: 'metric-modal',\n searchMetric: 'search-metric',\n selectType: 'select-type',\n metricCard: 'metric-card',\n useMetric: 'use-metric',\n searchPage: 'search-page',\n resultsPerPage: 'results-per-page',\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/metrics-modal/MetricsModal.tsx\nimport { cx } from '@emotion/css';\n\nimport { SelectableValue, TimeRange } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t, Trans } from '@grafana/i18n';\nimport { Icon, Input, Modal, MultiSelect, Pagination, Spinner, useStyles2 } from '@grafana/ui';\n\nimport { PrometheusDatasource } from '../../../datasource';\nimport { PromVisualQuery } from '../../types';\n\nimport { FeedbackLink } from './FeedbackLink';\nimport { MetricsModalContextProvider, useMetricsModal } from './MetricsModalContext';\nimport { ResultsTable } from './ResultsTable';\nimport { getPlaceholders, getPromTypes } from './helpers';\nimport { getMetricsModalStyles } from './styles';\nimport { metricsModaltestIds } from './testIds';\nimport { PromFilterOption } from './types';\n\ninterface MetricsModalProps {\n datasource: PrometheusDatasource;\n timeRange: TimeRange;\n isOpen: boolean;\n query: PromVisualQuery;\n onClose: () => void;\n onChange: (query: PromVisualQuery) => void;\n}\n\nconst MetricsModalContent = (props: MetricsModalProps) => {\n const { isOpen, onClose, onChange, query, timeRange } = props;\n\n const {\n isLoading,\n filteredMetricsData,\n debouncedBackendSearch,\n pagination,\n setPagination,\n selectedTypes,\n setSelectedTypes,\n searchedText,\n setSearchedText,\n } = useMetricsModal();\n const styles = useStyles2(getMetricsModalStyles);\n const placeholders = getPlaceholders();\n const promTypes = getPromTypes();\n\n const typeOptions: SelectableValue[] = promTypes.map((t: PromFilterOption) => {\n return {\n value: t.value,\n label: t.label,\n description: t.description,\n };\n });\n\n const searchCallback = (query: string, fullMetaSearchVal?: boolean) => {\n setSearchedText(query);\n debouncedBackendSearch(timeRange, query);\n };\n\n return (\n <Modal\n data-testid={metricsModaltestIds.metricModal}\n isOpen={isOpen}\n title={t('grafana-prometheus.querybuilder.metrics-modal.title-metrics-explorer', 'Metrics explorer')}\n onDismiss={onClose}\n aria-label={t('grafana-prometheus.querybuilder.metrics-modal.aria-label-browse-metrics', 'Browse metrics')}\n className={styles.modal}\n >\n <FeedbackLink feedbackUrl=\"https://forms.gle/DEMAJHoAMpe3e54CA\" />\n <div\n className={styles.inputWrapper}\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.builder.metricsExplorer}\n >\n <div className={cx(styles.inputItem, styles.inputItemFirst)}>\n <Input\n autoFocus={true}\n data-testid={metricsModaltestIds.searchMetric}\n placeholder={placeholders.browse}\n value={searchedText}\n onInput={(e) => {\n const value = e.currentTarget.value ?? '';\n setSearchedText(value);\n setPagination({ ...pagination, pageNum: 1 });\n searchCallback(value);\n }}\n />\n </div>\n <div className={styles.inputItem}>\n <MultiSelect\n data-testid={metricsModaltestIds.selectType}\n inputId=\"my-select\"\n options={typeOptions}\n value={selectedTypes}\n placeholder={placeholders.filterType}\n onChange={setSelectedTypes}\n />\n </div>\n <div>\n <Spinner className={`${styles.loadingSpinner} ${isLoading ? styles.visible : ''}`} />\n </div>\n </div>\n <div className={styles.resultsData}>\n {query.metric && (\n <i className={styles.currentlySelected}>\n <Trans\n i18nKey=\"grafana-prometheus.querybuilder.metrics-modal.currently-selected\"\n values={{ selected: query.metric }}\n >\n Currently selected: {'{{selected}}'}\n </Trans>\n </i>\n )}\n {query.labels.length > 0 && (\n <div className={styles.resultsDataFiltered}>\n <Icon name=\"info-circle\" size=\"sm\" />\n <div className={styles.resultsDataFilteredText}>\n \n <Trans i18nKey=\"grafana-prometheus.querybuilder.metrics-modal.metrics-pre-filtered\">\n These metrics have been pre-filtered by labels chosen in the label filters.\n </Trans>\n </div>\n </div>\n )}\n </div>\n <div className={styles.results}>\n {filteredMetricsData && <ResultsTable onChange={onChange} onClose={onClose} query={query} />}\n </div>\n <div className={styles.resultsFooter}>\n <Pagination\n currentPage={pagination.pageNum > pagination.totalPageNum ? 1 : pagination.pageNum}\n numberOfPages={pagination.totalPageNum}\n onNavigate={(val: number) => setPagination({ ...pagination, pageNum: val ?? 1 })}\n />\n </div>\n </Modal>\n );\n};\n\nexport const MetricsModal = (props: MetricsModalProps) => {\n return (\n <MetricsModalContextProvider languageProvider={props.datasource.languageProvider}>\n <MetricsModalContent {...props} />\n </MetricsModalContextProvider>\n );\n};\n","import { useCallback, useState } from 'react';\n\nimport { SelectableValue, TimeRange } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Trans, t } from '@grafana/i18n';\nimport { EditorField, EditorFieldGroup, InputGroup } from '@grafana/plugin-ui';\nimport { Button, InlineField, InlineFieldRow, Combobox, ComboboxOption } from '@grafana/ui';\n\nimport { METRIC_LABEL } from '../../constants';\nimport { PrometheusDatasource } from '../../datasource';\nimport { QueryBuilderLabelFilter } from '../shared/types';\nimport { PromVisualQuery } from '../types';\n\nimport { formatKeyValueStrings } from './formatter';\nimport { MetricsModal } from './metrics-modal/MetricsModal';\n\nexport interface MetricComboboxProps {\n metricLookupDisabled: boolean;\n query: PromVisualQuery;\n onChange: (query: PromVisualQuery) => void;\n onGetMetrics: () => Promise<SelectableValue[]>;\n datasource: PrometheusDatasource;\n labelsFilters: QueryBuilderLabelFilter[];\n onBlur?: () => void;\n variableEditor?: boolean;\n timeRange: TimeRange;\n}\n\nexport function MetricCombobox({\n datasource,\n query,\n onChange,\n onGetMetrics,\n labelsFilters,\n variableEditor,\n timeRange,\n}: Readonly<MetricComboboxProps>) {\n const [metricsModalOpen, setMetricsModalOpen] = useState(false);\n\n /**\n * Gets label_values response from prometheus API for current autocomplete query string and any existing labels filters\n */\n const getMetricLabels = useCallback(\n async (query: string) => {\n const match = formatKeyValueStrings(query, labelsFilters);\n const results = await datasource.languageProvider.queryLabelValues(timeRange, METRIC_LABEL, match);\n\n const resultsOptions = results.map((result) => {\n return {\n label: result,\n value: result,\n };\n });\n return resultsOptions;\n },\n [datasource.languageProvider, labelsFilters, timeRange]\n );\n\n const onComboboxChange = useCallback(\n (opt: ComboboxOption<string> | null) => {\n onChange({ ...query, metric: opt?.value ?? '' });\n },\n [onChange, query]\n );\n\n const loadOptions = useCallback(\n async (input: string): Promise<ComboboxOption[]> => {\n const metrics = input.length ? await getMetricLabels(input) : await onGetMetrics();\n\n return metrics.map((option) => ({\n label: option.label ?? option.value,\n value: option.value,\n }));\n },\n [getMetricLabels, onGetMetrics]\n );\n\n const asyncSelect = () => {\n return (\n <InputGroup>\n <Combobox\n placeholder={t(\n 'grafana-prometheus.querybuilder.metric-combobox.async-select.placeholder-select-metric',\n 'Select metric'\n )}\n width=\"auto\"\n minWidth={25}\n options={loadOptions}\n value={query.metric}\n onChange={onComboboxChange}\n createCustomValue\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.builder.metricSelect}\n />\n <Button\n tooltip={t(\n 'grafana-prometheus.querybuilder.metric-combobox.async-select.tooltip-open-metrics-explorer',\n 'Open metrics explorer'\n )}\n aria-label={t(\n 'grafana-prometheus.querybuilder.metric-combobox.async-select.aria-label-open-metrics-explorer',\n 'Open metrics explorer'\n )}\n variant=\"secondary\"\n icon=\"book-open\"\n onClick={() => setMetricsModalOpen(true)}\n />\n </InputGroup>\n );\n };\n\n return (\n <>\n {!datasource.lookupsDisabled && metricsModalOpen && (\n <MetricsModal\n datasource={datasource}\n isOpen={metricsModalOpen}\n onClose={() => setMetricsModalOpen(false)}\n query={query}\n onChange={onChange}\n timeRange={timeRange}\n />\n )}\n {variableEditor ? (\n <InlineFieldRow>\n <InlineField\n label={t('grafana-prometheus.querybuilder.metric-combobox.label-metric', 'Metric')}\n labelWidth={20}\n tooltip={\n <div>\n <Trans i18nKey=\"grafana-prometheus.querybuilder.metric-combobox.tooltip-metric\">\n Optional: returns a list of label values for the label name in the specified metric.\n </Trans>\n </div>\n }\n >\n {asyncSelect()}\n </InlineField>\n </InlineFieldRow>\n ) : (\n <EditorFieldGroup>\n <EditorField label={t('grafana-prometheus.querybuilder.metric-combobox.label-metric', 'Metric')}>\n {asyncSelect()}\n </EditorField>\n </EditorFieldGroup>\n )}\n </>\n );\n}\n","// 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 { SelectableValue, TimeRange } from '@grafana/data';\n\nimport { getDebounceTimeInMilliseconds } from '../../caching';\nimport { PrometheusDatasource } from '../../datasource';\nimport { truncateResult } from '../../language_utils';\nimport { PromMetricsMetadata } from '../../types';\nimport { regexifyLabelValuesQueryString } from '../parsingUtils';\nimport { promQueryModeller } from '../shared/modeller_instance';\nimport { QueryBuilderLabelFilter } from '../shared/types';\nimport { 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","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/VariableQueryEditor.tsx\nimport debounce from 'debounce-promise';\nimport { FormEvent, useCallback, useEffect, useState } from 'react';\n\nimport { getDefaultTimeRange, QueryEditorProps, SelectableValue, toOption } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t, Trans } from '@grafana/i18n';\nimport { AsyncSelect, InlineField, InlineFieldRow, Input, Select, TextArea } from '@grafana/ui';\n\nimport { PrometheusDatasource } from '../datasource';\nimport { truncateResult } from '../language_utils';\nimport {\n migrateVariableEditorBackToVariableSupport,\n migrateVariableQueryToEditor,\n} from '../migrations/variableMigration';\nimport { MetricsLabelsSection } from '../querybuilder/components/MetricsLabelsSection';\nimport { promQueryModeller } from '../querybuilder/shared/modeller_instance';\nimport { QueryBuilderLabelFilter } from '../querybuilder/shared/types';\nimport { PromVisualQuery } from '../querybuilder/types';\nimport {\n PromOptions,\n PromQuery,\n PromVariableQuery,\n PromVariableQueryType as QueryType,\n StandardPromVariableQuery,\n} from '../types';\n\nconst variableOptions = [\n { label: 'Label names', value: QueryType.LabelNames },\n { label: 'Label values', value: QueryType.LabelValues },\n { label: 'Metrics', value: QueryType.MetricNames },\n { label: 'Query result', value: QueryType.VarQueryResult },\n { label: 'Series query', value: QueryType.SeriesQuery },\n { label: 'Classic query', value: QueryType.ClassicQuery },\n];\n\nexport type Props = QueryEditorProps<PrometheusDatasource, PromQuery, PromOptions, PromVariableQuery>;\n\nconst refId = 'PrometheusVariableQueryEditor-VariableQuery';\n\nexport const PromVariableQueryEditor = ({ onChange, query, datasource, range }: Props) => {\n // to select the query type, i.e. label_names, label_values, etc.\n const [qryType, setQryType] = useState<number | undefined>(undefined);\n // list of variables for each function\n const [label, setLabel] = useState('');\n\n const [labelNamesMatch, setLabelNamesMatch] = useState('');\n\n // metric is used for both label_values() and metric()\n // label_values() metric requires a whole/complete metric\n // metric() is expected to be a part of a metric string\n const [metric, setMetric] = useState('');\n // varQuery is a whole query, can include math/rates/etc\n const [varQuery, setVarQuery] = useState('');\n // seriesQuery is only a whole\n const [seriesQuery, setSeriesQuery] = useState('');\n\n // the original variable query implementation, e.g. label_value(metric, label_name)\n const [classicQuery, setClassicQuery] = useState('');\n\n // list of label names for label_values(), /api/v1/labels, contains the same results as label_names() function\n const [truncatedLabelOptions, setTruncatedLabelOptions] = useState<Array<SelectableValue<string>>>([]);\n const [allLabelOptions, setAllLabelOptions] = useState<Array<SelectableValue<string>>>([]);\n\n /**\n * Set the both allLabels and truncatedLabels\n *\n * @param names\n * @param variables\n */\n function setLabels(names: SelectableValue[], variables: SelectableValue[]) {\n setAllLabelOptions([...variables, ...names]);\n const truncatedNames = truncateResult(names);\n setTruncatedLabelOptions([...variables, ...truncatedNames]);\n }\n\n // label filters have been added as a filter for metrics in label values query type\n const [labelFilters, setLabelFilters] = useState<QueryBuilderLabelFilter[]>([]);\n\n useEffect(() => {\n if (!query) {\n return;\n }\n\n if (query.qryType === QueryType.ClassicQuery) {\n setQryType(query.qryType);\n setClassicQuery(query.query ?? '');\n } else {\n // 1. Changing from standard to custom variable editor changes the string attr from expr to query\n // 2. jsonnet grafana as code passes a variable as a string\n const variableQuery = variableMigration(query);\n\n setLabelNamesMatch(variableQuery.match ?? '');\n setQryType(variableQuery.qryType);\n setLabel(variableQuery.label ?? '');\n setMetric(variableQuery.metric ?? '');\n setLabelFilters(variableQuery.labelFilters ?? []);\n setVarQuery(variableQuery.varQuery ?? '');\n setSeriesQuery(variableQuery.seriesQuery ?? '');\n setClassicQuery(variableQuery.classicQuery ?? '');\n }\n }, [query]);\n\n // set the label names options for the label values var query\n useEffect(() => {\n if (qryType !== QueryType.LabelValues) {\n return;\n }\n const variables = datasource.getVariables().map((variable: string) => ({ label: variable, value: variable }));\n let timeRange = range;\n if (!timeRange) {\n timeRange = getDefaultTimeRange();\n }\n\n if (!metric) {\n // get all the labels\n datasource.getTagKeys({ timeRange, filters: [] }).then((labelNames: Array<{ text: string }>) => {\n const names = labelNames.map(({ text }) => ({ label: text, value: text }));\n setLabels(names, variables);\n });\n } else {\n // fetch the labels filtered by the metric\n // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n const labelToConsider = [{ label: '__name__', op: '=', value: metric }];\n const expr = promQueryModeller.renderLabels(labelToConsider);\n\n datasource.languageProvider.queryLabelKeys(timeRange, expr).then((labelNames: string[]) => {\n const names = labelNames.map((value) => ({ label: value, value: value }));\n setLabels(names, variables);\n });\n }\n }, [datasource, qryType, metric, range]);\n\n const onChangeWithVariableString = (\n updateVar: { [key: string]: QueryType | string },\n updLabelFilters?: QueryBuilderLabelFilter[]\n ) => {\n const queryVar = {\n qryType,\n label,\n metric,\n match: labelNamesMatch,\n varQuery,\n seriesQuery,\n classicQuery,\n refId: 'PrometheusVariableQueryEditor-VariableQuery',\n };\n\n let updateLabelFilters = updLabelFilters ? { labelFilters: updLabelFilters } : { labelFilters: labelFilters };\n\n const updatedVar = { ...queryVar, ...updateVar, ...updateLabelFilters };\n\n const queryString = migrateVariableEditorBackToVariableSupport(updatedVar);\n\n // setting query.query property allows for update of variable definition\n onChange({\n query: queryString,\n qryType: updatedVar.qryType,\n refId,\n });\n };\n\n /** Call onchange for label names query type change */\n const onQueryTypeChange = (newType: SelectableValue<QueryType>) => {\n setQryType(newType.value);\n if (newType.value !== QueryType.SeriesQuery) {\n onChangeWithVariableString({ qryType: newType.value ?? 0 });\n }\n };\n\n /** Call onchange for label select when query type is label values */\n const onLabelChange = (newLabel: SelectableValue<string>) => {\n const newLabelvalue = newLabel && newLabel.value ? newLabel.value : '';\n setLabel(newLabelvalue);\n if (qryType === QueryType.LabelValues && newLabelvalue) {\n onChangeWithVariableString({ label: newLabelvalue });\n }\n };\n\n /**\n * Call onChange for MetricsLabels component change for label values query type\n * if there is a label (required) and\n * if the labels or metric are updated.\n */\n const metricsLabelsChange = (update: PromVisualQuery) => {\n setMetric(update.metric);\n setLabelFilters(update.labels);\n\n const updMetric = update.metric;\n const updLabelFilters = update.labels ?? [];\n\n if (qryType === QueryType.LabelValues && label && (updMetric || updLabelFilters)) {\n onChangeWithVariableString({ qryType, metric: updMetric }, updLabelFilters);\n }\n };\n\n const onLabelNamesMatchChange = (regex: string) => {\n if (qryType === QueryType.LabelNames) {\n onChangeWithVariableString({ qryType, match: regex });\n }\n };\n\n /**\n * Call onchange for metric change if metrics names (regex) query type\n * Debounce this because to not call the API for every keystroke.\n */\n const onMetricChange = (value: string) => {\n if (qryType === QueryType.MetricNames && value) {\n onChangeWithVariableString({ metric: value });\n }\n };\n\n /**\n * Do not call onchange for variable query result when query type is var query result\n * because the query may not be finished typing and an error is returned\n * for incorrectly formatted series. Call onchange for blur instead.\n */\n const onVarQueryChange = (e: FormEvent<HTMLTextAreaElement>) => {\n setVarQuery(e.currentTarget.value);\n };\n\n /**\n * Do not call onchange for seriesQuery when query type is series query\n * because the series may not be finished typing and an error is returned\n * for incorrectly formatted series. Call onchange for blur instead.\n */\n const onSeriesQueryChange = (e: FormEvent<HTMLInputElement>) => {\n setSeriesQuery(e.currentTarget.value);\n };\n\n const onClassicQueryChange = (e: FormEvent<HTMLInputElement>) => {\n setClassicQuery(e.currentTarget.value);\n };\n\n const promVisualQuery = useCallback(() => {\n return { metric: metric, labels: labelFilters, operations: [] };\n }, [metric, labelFilters]);\n\n /**\n * Debounce a search through all the labels possible and truncate by .\n */\n const labelNamesSearch = debounce((query: string) => {\n // we limit the select to show 1000 options,\n // but we still search through all the possible options\n const results = allLabelOptions.filter((label) => {\n return label.value?.includes(query);\n });\n return truncateResult(results);\n }, 300);\n\n return (\n <>\n <InlineFieldRow>\n <InlineField\n label={t('grafana-prometheus.components.prom-variable-query-editor.label-query-type', 'Query type')}\n labelWidth={20}\n tooltip={\n <div>\n <Trans i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.tooltip-query-type\">\n The Prometheus data source plugin provides the following query types for template variables.\n </Trans>\n </div>\n }\n >\n <Select\n placeholder={t(\n 'grafana-prometheus.components.prom-variable-query-editor.placeholder-select-query-type',\n 'Select query type'\n )}\n aria-label={t(\n 'grafana-prometheus.components.prom-variable-query-editor.aria-label-query-type',\n 'Query type'\n )}\n onChange={onQueryTypeChange}\n value={qryType}\n options={variableOptions}\n width={25}\n data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.queryType}\n />\n </InlineField>\n </InlineFieldRow>\n\n {qryType === QueryType.LabelValues && (\n <>\n <InlineFieldRow>\n <InlineField\n label={t('grafana-prometheus.components.prom-variable-query-editor.label-label', 'Label')}\n labelWidth={20}\n required\n aria-labelledby=\"label-select\"\n tooltip={\n <div>\n <Trans i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.tooltip-label\">\n Returns a list of label values for the label name in all metrics unless the metric is specified.\n </Trans>\n </div>\n }\n >\n <AsyncSelect\n onChange={onLabelChange}\n value={label ? toOption(label) : null}\n defaultOptions={truncatedLabelOptions}\n width={25}\n allowCustomValue\n isClearable={true}\n loadOptions={labelNamesSearch}\n data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.labelValues.labelSelect}\n />\n </InlineField>\n </InlineFieldRow>\n {/* Used to select an optional metric with optional label filters */}\n <MetricsLabelsSection\n query={promVisualQuery()}\n datasource={datasource}\n onChange={metricsLabelsChange}\n variableEditor={true}\n timeRange={range ?? getDefaultTimeRange()}\n />\n </>\n )}\n\n {qryType === QueryType.LabelNames && (\n <InlineFieldRow>\n <InlineField\n label={t('grafana-prometheus.components.prom-variable-query-editor.label-metric-regex', 'Metric regex')}\n labelWidth={20}\n aria-labelledby=\"Metric regex\"\n tooltip={\n <div>\n <Trans i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.tooltip-metric-regex\">\n Returns a list of label names, optionally filtering by specified metric regex.\n </Trans>\n </div>\n }\n >\n <Input\n type=\"text\"\n aria-label={t(\n 'grafana-prometheus.components.prom-variable-query-editor.aria-label-metric-regex',\n 'Metric regex'\n )}\n placeholder={t(\n 'grafana-prometheus.components.prom-variable-query-editor.placeholder-metric-regex',\n 'Metric regex'\n )}\n value={labelNamesMatch}\n onBlur={(event) => {\n setLabelNamesMatch(event.currentTarget.value);\n onLabelNamesMatchChange(event.currentTarget.value);\n }}\n onChange={(e) => {\n setLabelNamesMatch(e.currentTarget.value);\n }}\n width={25}\n data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.labelnames.metricRegex}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n\n {qryType === QueryType.MetricNames && (\n <InlineFieldRow>\n <InlineField\n label={t('grafana-prometheus.components.prom-variable-query-editor.label-metric-regex', 'Metric regex')}\n labelWidth={20}\n aria-labelledby=\"Metric selector\"\n tooltip={\n <div>\n <Trans i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.returns-metrics-matching-specified-metric-regex\">\n Returns a list of metrics matching the specified metric regex.\n </Trans>\n </div>\n }\n >\n <Input\n type=\"text\"\n aria-label={t(\n 'grafana-prometheus.components.prom-variable-query-editor.aria-label-metric-selector',\n 'Metric selector'\n )}\n placeholder={t(\n 'grafana-prometheus.components.prom-variable-query-editor.placeholder-metric-regex',\n 'Metric regex'\n )}\n value={metric}\n onChange={(e) => {\n setMetric(e.currentTarget.value);\n }}\n onBlur={(e) => {\n setMetric(e.currentTarget.value);\n onMetricChange(e.currentTarget.value);\n }}\n width={25}\n data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.metricNames.metricRegex}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n\n {qryType === QueryType.VarQueryResult && (\n <InlineFieldRow>\n <InlineField\n label={t('grafana-prometheus.components.prom-variable-query-editor.label-query', 'Query')}\n labelWidth={20}\n tooltip={\n <div>\n <Trans\n i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.tooltip-query\"\n values={{ exampleQuery: 'sum(go_goroutines)' }}\n >\n Returns a list of Prometheus query results for the query. This can include Prometheus functions, i.e.\n {'{{exampleQuery}}'}.\n </Trans>\n </div>\n }\n >\n <TextArea\n type=\"text\"\n aria-label={t(\n 'grafana-prometheus.components.prom-variable-query-editor.aria-label-prometheus-query',\n 'Prometheus Query'\n )}\n placeholder={t(\n 'grafana-prometheus.components.prom-variable-query-editor.placeholder-prometheus-query',\n 'Prometheus Query'\n )}\n value={varQuery}\n onChange={onVarQueryChange}\n onBlur={() => {\n if (qryType === QueryType.VarQueryResult && varQuery) {\n onChangeWithVariableString({ qryType });\n }\n }}\n cols={100}\n data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.varQueryResult}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n\n {qryType === QueryType.SeriesQuery && (\n <InlineFieldRow>\n <InlineField\n label={t('grafana-prometheus.components.prom-variable-query-editor.label-series-query', 'Series Query')}\n labelWidth={20}\n tooltip={\n <div>\n <Trans\n i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.tooltip-series-query\"\n values={{\n example1: 'go_goroutines{instance=\"localhost:9090\"}',\n example2: 'go_goroutines',\n example3: '{instance=\"localhost:9090\"}',\n }}\n >\n Enter a metric with labels, only a metric or only labels, i.e.\n {'{{example1}}'}, {'{{example2}}'}, or {'{{example3}}'}. Returns a list of time series associated with\n the entered data.\n </Trans>\n </div>\n }\n >\n <Input\n type=\"text\"\n aria-label={t(\n 'grafana-prometheus.components.prom-variable-query-editor.aria-label-series-query',\n 'Series Query'\n )}\n placeholder={t(\n 'grafana-prometheus.components.prom-variable-query-editor.placeholder-series-query',\n 'Series Query'\n )}\n value={seriesQuery}\n onChange={onSeriesQueryChange}\n onBlur={() => {\n if (qryType === QueryType.SeriesQuery && seriesQuery) {\n onChangeWithVariableString({ qryType });\n }\n }}\n width={100}\n data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.seriesQuery}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n\n {qryType === QueryType.ClassicQuery && (\n <InlineFieldRow>\n <InlineField\n label={t('grafana-prometheus.components.prom-variable-query-editor.label-classic-query', 'Classic Query')}\n labelWidth={20}\n tooltip={\n <div>\n <Trans\n i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.tooltip-classic-query\"\n values={{\n exampleQuery: 'label_values(metric, label)',\n }}\n >\n The original implementation of the Prometheus variable query editor. Enter a string with the correct\n query type and parameters as described in these docs. For example, {'{{exampleQuery}}'}.\n </Trans>\n </div>\n }\n >\n <Input\n type=\"text\"\n aria-label={t(\n 'grafana-prometheus.components.prom-variable-query-editor.aria-label-classic-query',\n 'Classic Query'\n )}\n placeholder={t(\n 'grafana-prometheus.components.prom-variable-query-editor.placeholder-classic-query',\n 'Classic Query'\n )}\n value={classicQuery}\n onChange={onClassicQueryChange}\n onBlur={() => {\n if (qryType === QueryType.ClassicQuery && classicQuery) {\n onChangeWithVariableString({ qryType });\n }\n }}\n width={100}\n data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.classicQuery}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n </>\n );\n};\n\nexport function variableMigration(query: string | PromVariableQuery | StandardPromVariableQuery): PromVariableQuery {\n if (typeof query === 'string') {\n return migrateVariableQueryToEditor(query);\n } else if (query.query) {\n return migrateVariableQueryToEditor(query.query);\n } else {\n return query;\n }\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/variables.ts\nimport { from, Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { CustomVariableSupport, DataQueryRequest, DataQueryResponse, rangeUtil } from '@grafana/data';\nimport { getTemplateSrv, TemplateSrv } from '@grafana/runtime';\n\nimport { PromVariableQueryEditor } from './components/VariableQueryEditor';\nimport { PrometheusDatasource } from './datasource';\nimport { PrometheusMetricFindQuery } from './metric_find_query';\nimport { PromVariableQuery } from './types';\n\nexport class PrometheusVariableSupport extends CustomVariableSupport<PrometheusDatasource> {\n constructor(\n private readonly datasource: PrometheusDatasource,\n private readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super();\n }\n\n editor = PromVariableQueryEditor;\n\n query(request: DataQueryRequest<PromVariableQuery>): Observable<DataQueryResponse> {\n // Handling grafana as code from jsonnet variable queries which are strings and not objects\n // Previously, when using StandardVariableSupport\n // the variable query string was changed to be on the expr attribute\n // Now, using CustomVariableSupport,\n // the variable query is changed to the query attribute.\n // So, without standard variable support changing the query string to the expr attribute,\n // the variable query string is coming in as it is written in jsonnet,\n // where it is just a string. Here is where we handle that.\n let query: string | undefined;\n if (typeof request.targets[0] === 'string') {\n query = request.targets[0];\n } else {\n query = request.targets[0].query;\n }\n\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(request.range),\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(request.range));\n\n return metricFindStream.pipe(map((results) => ({ data: results })));\n }\n}\n","import { defaults } from 'lodash';\nimport { tz } from 'moment-timezone';\nimport { lastValueFrom, Observable, throwError } from 'rxjs';\nimport { map, tap } from 'rxjs/operators';\nimport { gte } from 'semver';\n\nimport {\n AbstractQuery,\n AdHocVariableFilter,\n CoreApp,\n CustomVariableModel,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceGetTagKeysOptions,\n DataSourceGetTagValuesOptions,\n DataSourceInstanceSettings,\n DataSourceWithQueryExportSupport,\n DataSourceWithQueryImportSupport,\n dateTime,\n getDefaultTimeRange,\n LegacyMetricFindQueryOptions,\n MetricFindValue,\n QueryFixAction,\n QueryVariableModel,\n rangeUtil,\n ScopedVars,\n scopeFilterOperatorMap,\n ScopeSpecFilter,\n TimeRange,\n} from '@grafana/data';\nimport {\n BackendSrvRequest,\n config,\n DataSourceWithBackend,\n FetchResponse,\n getBackendSrv,\n getTemplateSrv,\n isFetchError,\n 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 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 { QueryBuilderLabelFilter, QueryEditorMode } from './querybuilder/shared/types';\nimport { CacheRequestInfo, defaultPrometheusQueryOverlapWindow, QueryCache } from './querycache/QueryCache';\nimport { transformV2 } from './result_transformer';\nimport { trackQuery } from './tracking';\nimport {\n ExemplarTraceIdDestination,\n PromApplication,\n PrometheusCacheLevel,\n PromOptions,\n PromQuery,\n PromQueryRequest,\n RawRecordingRules,\n 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 id: number;\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 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.id = instanceSettings.id;\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) {\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 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.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","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/QueryPattern.tsx\nimport { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { t, Trans } from '@grafana/i18n';\nimport { Button, Card, useStyles2 } from '@grafana/ui';\n\nimport { promqlGrammar } from '../promql';\n\nimport { RawQuery } from './shared/RawQuery';\nimport { promQueryModeller } from './shared/modeller_instance';\nimport { PromQueryPattern } from './types';\n\ntype Props = {\n pattern: PromQueryPattern;\n hasNewQueryOption: boolean;\n hasPreviousQuery: boolean | string;\n selectedPatternName: string | null;\n setSelectedPatternName: (name: string | null) => void;\n onPatternSelect: (pattern: PromQueryPattern, selectAsNewQuery?: boolean) => void;\n};\n\nexport const QueryPattern = (props: Props) => {\n const { pattern, onPatternSelect, hasNewQueryOption, hasPreviousQuery, selectedPatternName, setSelectedPatternName } =\n props;\n\n const styles = useStyles2(getStyles);\n const lang = { grammar: promqlGrammar, name: 'promql' };\n\n return (\n <Card noMargin className={styles.card}>\n <Card.Heading>{pattern.name}</Card.Heading>\n <div className={styles.rawQueryContainer}>\n <RawQuery\n aria-label={t(\n 'grafana-prometheus.querybuilder.query-pattern.aria-label-raw-query',\n '{{patternName}} raw query',\n {\n patternName: pattern.name,\n }\n )}\n query={promQueryModeller.renderQuery({\n metric: '',\n labels: [],\n operations: pattern.operations,\n binaryQueries: pattern.binaryQueries,\n })}\n lang={lang}\n className={styles.rawQuery}\n />\n </div>\n <Card.Actions>\n {selectedPatternName !== pattern.name ? (\n <Button\n size=\"sm\"\n aria-label={t(\n 'grafana-prometheus.querybuilder.query-pattern.aria-label-use-this-query-button',\n 'use this query button'\n )}\n onClick={() => {\n if (hasPreviousQuery) {\n // If user has previous query, we need to confirm that they want to apply this query pattern\n setSelectedPatternName(pattern.name);\n } else {\n onPatternSelect(pattern);\n }\n }}\n >\n <Trans i18nKey=\"grafana-prometheus.querybuilder.query-pattern.use-this-query\">Use this query</Trans>\n </Button>\n ) : (\n <>\n <div className={styles.spacing}>\n {`If you would like to use this query, ${\n hasNewQueryOption\n ? 'you can either apply this query pattern or create a new query'\n : 'this query pattern will be applied to your current query'\n }.`}\n </div>\n <Button\n size=\"sm\"\n aria-label={t('grafana-prometheus.querybuilder.query-pattern.aria-label-back-button', 'back button')}\n fill=\"outline\"\n onClick={() => setSelectedPatternName(null)}\n >\n <Trans i18nKey=\"grafana-prometheus.querybuilder.query-pattern.back\">Back</Trans>\n </Button>\n <Button\n size=\"sm\"\n aria-label={t(\n 'grafana-prometheus.querybuilder.query-pattern.aria-label-apply-query-starter-button',\n 'apply query starter button'\n )}\n onClick={() => {\n onPatternSelect(pattern);\n }}\n >\n <Trans i18nKey=\"grafana-prometheus.querybuilder.query-pattern.apply-query\">Apply query</Trans>\n </Button>\n {hasNewQueryOption && (\n <Button\n size=\"sm\"\n aria-label={t(\n 'grafana-prometheus.querybuilder.query-pattern.aria-label-create-new-query-button',\n 'create new query button'\n )}\n onClick={() => {\n onPatternSelect(pattern, true);\n }}\n >\n <Trans i18nKey=\"grafana-prometheus.querybuilder.query-pattern.create-new-query\">Create new query</Trans>\n </Button>\n )}\n </>\n )}\n </Card.Actions>\n </Card>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n card: css({\n width: '49.5%',\n display: 'flex',\n flexDirection: 'column',\n }),\n rawQueryContainer: css({\n flexGrow: 1,\n }),\n rawQuery: css({\n backgroundColor: theme.colors.background.primary,\n padding: theme.spacing(1),\n marginTop: theme.spacing(1),\n }),\n spacing: css({\n marginBottom: theme.spacing(1),\n }),\n };\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/QueryPatternsModal.tsx\nimport { css } from '@emotion/css';\nimport { capitalize } from 'lodash';\nimport { useMemo, useState } from 'react';\n\nimport { CoreApp, DataQuery, getNextRefId, GrafanaTheme2 } from '@grafana/data';\nimport { t, Trans } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { Button, Collapse, Modal, Stack, useStyles2 } from '@grafana/ui';\n\nimport { PromQuery } from '../types';\n\nimport { QueryPattern } from './QueryPattern';\nimport { buildVisualQueryFromString } from './parsing';\nimport { promQueryModeller } from './shared/modeller_instance';\nimport { PromQueryPattern, PromQueryPatternType } from './types';\n\ntype Props = {\n isOpen: boolean;\n query: PromQuery;\n queries: DataQuery[] | undefined;\n app?: CoreApp;\n onClose: () => void;\n onChange: (query: PromQuery) => void;\n onAddQuery?: (query: PromQuery) => void;\n};\n\nexport const QueryPatternsModal = (props: Props) => {\n const { isOpen, onClose, onChange, onAddQuery, query, queries, app } = props;\n const [openTabs, setOpenTabs] = useState<string[]>([]);\n const [selectedPatternName, setSelectedPatternName] = useState<string | null>(null);\n\n const styles = useStyles2(getStyles);\n const hasNewQueryOption = !!onAddQuery;\n const hasPreviousQuery = useMemo(() => {\n const visualQuery = buildVisualQueryFromString(query.expr ?? '');\n // has anything entered in the query, metric, labels, operations, or binary queries\n const hasOperations = visualQuery.query.operations.length > 0,\n hasMetric = visualQuery.query.metric,\n hasLabels = visualQuery.query.labels.length > 0,\n hasBinaryQueries = visualQuery.query.binaryQueries ? visualQuery.query.binaryQueries.length > 0 : false;\n\n return hasOperations || hasMetric || hasLabels || hasBinaryQueries;\n }, [query.expr]);\n\n const onPatternSelect = (pattern: PromQueryPattern, selectAsNewQuery = false) => {\n const visualQuery = buildVisualQueryFromString(selectAsNewQuery ? '' : query.expr);\n reportInteraction('grafana_prom_kickstart_your_query_selected', {\n app: app ?? '',\n editorMode: query.editorMode,\n selectedPattern: pattern.name,\n preSelectedOperationsCount: visualQuery.query.operations.length,\n preSelectedLabelsCount: visualQuery.query.labels.length,\n createNewQuery: hasNewQueryOption && selectAsNewQuery,\n });\n\n // Apply the pattern operations before rendering the expression\n visualQuery.query.operations = pattern.operations;\n visualQuery.query.binaryQueries = pattern.binaryQueries;\n const renderedExpr = promQueryModeller.renderQuery(visualQuery.query);\n\n if (hasNewQueryOption && selectAsNewQuery) {\n onAddQuery({\n ...query,\n refId: getNextRefId(queries ?? [query]),\n expr: renderedExpr,\n });\n } else {\n onChange({\n ...query,\n expr: renderedExpr,\n });\n }\n setSelectedPatternName(null);\n onClose();\n };\n\n return (\n <Modal\n aria-label={t(\n 'grafana-prometheus.querybuilder.query-patterns-modal.aria-label-kick-start-your-query-modal',\n 'Kick start your query modal'\n )}\n isOpen={isOpen}\n title={t(\n 'grafana-prometheus.querybuilder.query-patterns-modal.title-kick-start-your-query',\n 'Kick start your query'\n )}\n onDismiss={onClose}\n >\n <div className={styles.spacing}>\n <Trans i18nKey=\"grafana-prometheus.querybuilder.query-patterns-modal.description-kick-start-your-query\">\n Kick start your query by selecting one of these queries. You can then continue to complete your query.\n </Trans>\n </div>\n {Object.values(PromQueryPatternType).map((patternType) => {\n const isOpen = openTabs.includes(patternType);\n return (\n <Collapse\n aria-label={t(\n 'grafana-prometheus.querybuilder.query-patterns-modal.aria-label-toggle-query-starter',\n 'open and close {{patternType}} query starter card',\n { patternType }\n )}\n key={patternType}\n label={t(\n 'grafana-prometheus.querybuilder.query-patterns-modal.label-toggle-query-starter',\n '{{patternType}} query starters',\n {\n patternType: capitalize(patternType),\n }\n )}\n isOpen={isOpen}\n onToggle={() => {\n const action = isOpen ? 'close' : 'open';\n reportInteraction(`grafana_prom_kickstart_toggle_pattern_card`, {\n action,\n patternType,\n });\n\n setOpenTabs((tabs) =>\n // close tab if it's already open, otherwise open it\n tabs.includes(patternType) ? tabs.filter((t) => t !== patternType) : [...tabs, patternType]\n );\n }}\n >\n <Stack wrap justifyContent=\"space-between\">\n {promQueryModeller\n .getQueryPatterns()\n .filter((pattern) => pattern.type === patternType)\n .map((pattern) => (\n <QueryPattern\n key={pattern.name}\n pattern={pattern}\n hasNewQueryOption={hasNewQueryOption}\n hasPreviousQuery={hasPreviousQuery}\n onPatternSelect={onPatternSelect}\n selectedPatternName={selectedPatternName}\n setSelectedPatternName={setSelectedPatternName}\n />\n ))}\n </Stack>\n </Collapse>\n );\n })}\n <Button\n aria-label={t(\n 'grafana-prometheus.querybuilder.query-patterns-modal.aria-label-close-kick-start-your-query-modal',\n 'close kick start your query modal'\n )}\n variant=\"secondary\"\n onClick={onClose}\n >\n <Trans i18nKey=\"grafana-prometheus.querybuilder.query-patterns-modal.close\">Close</Trans>\n </Button>\n </Modal>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n spacing: css({\n marginBottom: theme.spacing(1),\n }),\n };\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/hooks/useFlag.ts\nimport { useCallback, useState } from 'react';\n\nimport { store } from '@grafana/data';\n\nexport const promQueryEditorExplainKey = 'PrometheusQueryEditorExplainDefault';\n\ntype QueryEditorFlags = typeof promQueryEditorExplainKey;\n\nfunction getFlagValue(key: QueryEditorFlags, defaultValue = false): boolean {\n const val = store.get(key);\n return val === undefined ? defaultValue : Boolean(parseInt(val, 10));\n}\n\nfunction setFlagValue(key: QueryEditorFlags, value: boolean) {\n store.set(key, value ? '1' : '0');\n}\n\ntype UseFlagHookReturnType = { flag: boolean; setFlag: (val: boolean) => void };\n\n/**\n *\n * Use and store value of explain switch in local storage.\n * Needs to be a hook with local state to trigger re-renders.\n */\nexport function useFlag(key: QueryEditorFlags, defaultValue = false): UseFlagHookReturnType {\n const [flag, updateFlag] = useState(getFlagValue(key, defaultValue));\n const setter = useCallback(\n (value: boolean) => {\n setFlagValue(key, value);\n updateFlag(value);\n },\n [key]\n );\n\n return { flag, setFlag: setter };\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/types.ts\n/**\n * Shared types that can be reused by Loki and other data sources\n */\nimport { ComponentType } from 'react';\n\nimport { DataSourceApi, RegistryItem, SelectableValue, TimeRange } from '@grafana/data';\n\nimport { PromVisualQuery } from '../types';\n\nexport interface QueryBuilderLabelFilter {\n label: string;\n op: string;\n value: string;\n}\n\nexport interface QueryBuilderOperation {\n id: string;\n params: QueryBuilderOperationParamValue[];\n}\n\nexport interface QueryWithOperations {\n operations: QueryBuilderOperation[];\n}\n\nexport interface QueryBuilderOperationDef<T = any> extends RegistryItem {\n documentation?: string;\n params: QueryBuilderOperationParamDef[];\n defaultParams: QueryBuilderOperationParamValue[];\n category: string;\n hideFromList?: boolean;\n alternativesKey?: string;\n /** Can be used to control operation placement when adding a new operations, lower are placed first */\n orderRank?: number;\n renderer: QueryBuilderOperationRenderer;\n addOperationHandler: QueryBuilderAddOperationHandler<T>;\n paramChangedHandler?: QueryBuilderOnParamChangedHandler;\n explainHandler?: QueryBuilderExplainOperationHandler;\n changeTypeHandler?: (op: QueryBuilderOperation, newDef: QueryBuilderOperationDef<T>) => QueryBuilderOperation;\n}\n\ntype QueryBuilderAddOperationHandler<T> = (def: QueryBuilderOperationDef, query: T, modeller: VisualQueryModeller) => T;\n\ntype QueryBuilderExplainOperationHandler = (op: QueryBuilderOperation, def?: QueryBuilderOperationDef) => string;\n\ntype QueryBuilderOnParamChangedHandler = (\n index: number,\n operation: QueryBuilderOperation,\n operationDef: QueryBuilderOperationDef\n) => QueryBuilderOperation;\n\ntype QueryBuilderOperationRenderer = (\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDef,\n innerExpr: string\n) => string;\n\nexport type QueryBuilderOperationParamValue = string | number | boolean;\n\nexport interface QueryBuilderOperationParamDef {\n name: string;\n type: 'string' | 'number' | 'boolean';\n options?: string[] | number[] | Array<SelectableValue<string>>;\n hideName?: boolean;\n restParam?: boolean;\n optional?: boolean;\n placeholder?: string;\n description?: string;\n minWidth?: number;\n editor?: ComponentType<QueryBuilderOperationParamEditorProps> | string;\n runQueryOnEnter?: boolean;\n}\n\nexport interface QueryBuilderOperationParamEditorProps {\n onChange: (index: number, value: QueryBuilderOperationParamValue) => void;\n onRunQuery: () => void;\n /** Parameter index */\n index: number;\n operationId: string;\n query: PromVisualQuery;\n datasource: DataSourceApi;\n timeRange: TimeRange;\n paramDef: QueryBuilderOperationParamDef;\n queryModeller: VisualQueryModeller;\n value?: QueryBuilderOperationParamValue;\n}\n\nexport enum QueryEditorMode {\n Code = 'code',\n Builder = 'builder',\n}\n\nexport interface VisualQueryModeller {\n getOperationsForCategory(category: string): QueryBuilderOperationDef[];\n\n getAlternativeOperations(key: string): QueryBuilderOperationDef[];\n\n getCategories(): string[];\n\n getOperationDef(id: string): QueryBuilderOperationDef | undefined;\n}\n\nexport interface VisualQueryBinary<T> {\n operator: string;\n vectorMatchesType?: 'on' | 'ignoring';\n vectorMatches?: string;\n query: T;\n}\n\nexport interface PrometheusVisualQuery {\n metric?: string;\n labels: QueryBuilderLabelFilter[];\n operations: QueryBuilderOperation[];\n binaryQueries?: Array<VisualQueryBinary<PrometheusVisualQuery>>;\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/QueryEditorModeToggle.tsx\nimport { t } from '@grafana/i18n';\nimport { RadioButtonGroup } from '@grafana/ui';\n\nimport { QueryEditorMode } from './types';\n\ninterface Props {\n mode: QueryEditorMode;\n onChange: (mode: QueryEditorMode) => void;\n}\n\nexport function QueryEditorModeToggle({ mode, onChange }: Props) {\n const editorModes = [\n {\n label: t('grafana-prometheus.querybuilder.query-editor-mode-toggle.editor-modes.label-builder', 'Builder'),\n value: QueryEditorMode.Builder,\n },\n {\n label: t('grafana-prometheus.querybuilder.query-editor-mode-toggle.editor-modes.label-code', 'Code'),\n value: QueryEditorMode.Code,\n },\n ];\n return (\n <div data-testid={'QueryEditorModeToggle'}>\n <RadioButtonGroup options={editorModes} size=\"sm\" value={mode} onChange={onChange} />\n </div>\n );\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/QueryHeaderSwitch.tsx\nimport { css } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport { HTMLProps, useRef } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Switch, useStyles2, Stack } from '@grafana/ui';\n\ninterface Props extends Omit<HTMLProps<HTMLInputElement>, 'value' | 'ref'> {\n value?: boolean;\n label: string;\n}\n\nexport function QueryHeaderSwitch({ label, ...inputProps }: Props) {\n const dashedLabel = label.replace(' ', '-');\n const switchIdRef = useRef(uniqueId(`switch-${dashedLabel}`));\n const styles = useStyles2(getStyles);\n\n return (\n <Stack gap={1}>\n <label htmlFor={switchIdRef.current} className={styles.switchLabel}>\n {label}\n </label>\n <Switch {...inputProps} id={switchIdRef.current} />\n </Stack>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n switchLabel: css({\n color: theme.colors.text.secondary,\n cursor: 'pointer',\n fontSize: theme.typography.bodySmall.fontSize,\n '&:hover': {\n color: theme.colors.text.primary,\n },\n }),\n };\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/state.ts\nimport { CoreApp, store } from '@grafana/data';\n\nimport { LegendFormatMode, PromQuery } from '../types';\n\nimport { QueryEditorMode } from './shared/types';\n\nconst queryEditorModeDefaultLocalStorageKey = 'PrometheusQueryEditorModeDefault';\n\nexport function changeEditorMode(query: PromQuery, editorMode: QueryEditorMode, onChange: (query: PromQuery) => void) {\n // If empty query store new mode as default\n if (query.expr === '') {\n store.set(queryEditorModeDefaultLocalStorageKey, editorMode);\n }\n\n onChange({ ...query, editorMode });\n}\n\nfunction getDefaultEditorMode(expr: string, defaultEditor: QueryEditorMode = QueryEditorMode.Builder): QueryEditorMode {\n // If we already have an expression default to code view\n if (expr != null && expr !== '') {\n return QueryEditorMode.Code;\n }\n\n const value: QueryEditorMode = store.get(queryEditorModeDefaultLocalStorageKey);\n switch (value) {\n case QueryEditorMode.Builder:\n case QueryEditorMode.Code:\n return value;\n default:\n return defaultEditor;\n }\n}\n\n/**\n * Returns query with defaults, and boolean true/false depending on change was required\n */\nexport function getQueryWithDefaults(\n query: PromQuery & { expr?: string },\n app: CoreApp | undefined,\n defaultEditor?: QueryEditorMode\n): PromQuery {\n let result = query;\n\n if (!query.editorMode) {\n result = { ...query, editorMode: getDefaultEditorMode(query.expr, defaultEditor) };\n }\n\n // default query expr is now empty string, set in getDefaultQuery\n // While expr is required in the types, it is not always defined at runtime, so we need to check for undefined and default to an empty string to prevent runtime errors\n if (!query.expr) {\n result = { ...result, expr: '', legendFormat: LegendFormatMode.Auto };\n }\n\n if (query.range == null && query.instant == null) {\n // Default to range query\n result = { ...result, range: true };\n\n // In explore we default to both instant & range\n if (app === CoreApp.Explore) {\n result.instant = true;\n }\n }\n\n // Unified Alerting does not support \"both\" for query type – fall back to \"range\".\n const isBothInstantAndRange = query.instant && query.range;\n if (app === CoreApp.UnifiedAlerting && isBothInstantAndRange) {\n result = { ...result, instant: false, range: true };\n }\n\n return result;\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/OperationInfoButton.tsx\nimport { css } from '@emotion/css';\nimport { autoUpdate, offset, useClick, useDismiss, useFloating, useInteractions } from '@floating-ui/react';\nimport { memo, useState } from 'react';\n\nimport { GrafanaTheme2, renderMarkdown } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { FlexItem } from '@grafana/plugin-ui';\nimport { Button, floatingUtils, Portal, useStyles2 } from '@grafana/ui';\n\nimport { QueryBuilderOperation, QueryBuilderOperationDef } from './types';\n\ninterface Props {\n operation: QueryBuilderOperation;\n def: QueryBuilderOperationDef;\n}\n\nexport const OperationInfoButton = memo<Props>(({ def, operation }) => {\n const styles = useStyles2(getStyles);\n const [show, setShow] = useState(false);\n\n // the order of middleware is important!\n const middleware = [offset(16), ...floatingUtils.getPositioningMiddleware()];\n\n const { context, refs, floatingStyles } = useFloating({\n open: show,\n placement: 'top',\n onOpenChange: setShow,\n middleware,\n whileElementsMounted: autoUpdate,\n });\n\n const click = useClick(context);\n const dismiss = useDismiss(context);\n\n const { getReferenceProps, getFloatingProps } = useInteractions([dismiss, click]);\n\n return (\n <>\n <Button\n tooltip={t(\n 'grafana-prometheus.querybuilder.operation-info-button.title-click-to-show-description',\n 'Click to show description'\n )}\n ref={refs.setReference}\n icon=\"info-circle\"\n size=\"sm\"\n variant=\"secondary\"\n fill=\"text\"\n {...getReferenceProps()}\n />\n {show && (\n <Portal>\n <div ref={refs.setFloating} style={floatingStyles} {...getFloatingProps()} className={styles.docBox}>\n <div className={styles.docBoxHeader}>\n <span>{def.renderer(operation, def, '<expr>')}</span>\n <FlexItem grow={1} />\n <Button\n icon=\"times\"\n onClick={() => setShow(false)}\n fill=\"text\"\n variant=\"secondary\"\n aria-label={t(\n 'grafana-prometheus.querybuilder.operation-info-button.title-remove-operation',\n 'Remove operation'\n )}\n />\n </div>\n <div\n className={styles.docBoxBody}\n dangerouslySetInnerHTML={{ __html: getOperationDocs(def, operation) }}\n ></div>\n </div>\n </Portal>\n )}\n </>\n );\n});\n\nOperationInfoButton.displayName = 'OperationDocs';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n docBox: css({\n overflow: 'hidden',\n background: theme.colors.background.elevated,\n border: `1px solid ${theme.colors.border.weak}`,\n boxShadow: theme.shadows.z3,\n maxWidth: '600px',\n padding: theme.spacing(1),\n borderRadius: theme.shape.radius.default,\n zIndex: theme.zIndex.tooltip,\n }),\n docBoxHeader: css({\n fontSize: theme.typography.h5.fontSize,\n fontFamily: theme.typography.fontFamilyMonospace,\n paddingBottom: theme.spacing(1),\n display: 'flex',\n alignItems: 'center',\n }),\n docBoxBody: css({\n // The markdown paragraph has a marginBottom this removes it\n marginBottom: theme.spacing(-1),\n color: theme.colors.text.secondary,\n }),\n };\n};\n\nfunction getOperationDocs(def: QueryBuilderOperationDef, op: QueryBuilderOperation): string {\n return renderMarkdown(def.explainHandler ? def.explainHandler(op, def) : (def.documentation ?? 'no docs'));\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/OperationHeader.tsx\nimport { css } from '@emotion/css';\nimport { DraggableProvided } from '@hello-pangea/dnd';\nimport { memo, useState } from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { FlexItem } from '@grafana/plugin-ui';\nimport { Button, Select, useStyles2 } from '@grafana/ui';\n\nimport { OperationInfoButton } from './OperationInfoButton';\nimport { QueryBuilderOperation, QueryBuilderOperationDef, VisualQueryModeller } from './types';\n\ninterface Props {\n operation: QueryBuilderOperation;\n def: QueryBuilderOperationDef;\n index: number;\n queryModeller: VisualQueryModeller;\n dragHandleProps?: DraggableProvided['dragHandleProps'];\n onChange: (index: number, update: QueryBuilderOperation) => void;\n onRemove: (index: number) => void;\n}\n\ninterface State {\n isOpen?: boolean;\n alternatives?: Array<SelectableValue<QueryBuilderOperationDef>>;\n}\n\nexport const OperationHeader = memo<Props>(\n ({ operation, def, index, onChange, onRemove, queryModeller, dragHandleProps }) => {\n const styles = useStyles2(getStyles);\n const [state, setState] = useState<State>({});\n\n const onToggleSwitcher = () => {\n if (state.isOpen) {\n setState({ ...state, isOpen: false });\n } else {\n const alternatives = queryModeller\n .getAlternativeOperations(def.alternativesKey!)\n .map((alt) => ({ label: alt.name, value: alt }));\n setState({ isOpen: true, alternatives });\n }\n };\n\n return (\n <div className={styles.header}>\n {!state.isOpen && (\n <>\n <div {...dragHandleProps}>{def.name ?? def.id}</div>\n <FlexItem grow={1} />\n <div className={`${styles.operationHeaderButtons} operation-header-show-on-hover`}>\n <Button\n icon=\"angle-down\"\n size=\"sm\"\n onClick={onToggleSwitcher}\n fill=\"text\"\n variant=\"secondary\"\n aria-label={t(\n 'grafana-prometheus.querybuilder.operation-header.title-click-to-view-alternative-operations',\n 'Click to view alternative operations'\n )}\n />\n <OperationInfoButton def={def} operation={operation} />\n <Button\n icon=\"times\"\n size=\"sm\"\n onClick={() => onRemove(index)}\n fill=\"text\"\n variant=\"secondary\"\n aria-label={t(\n 'grafana-prometheus.querybuilder.operation-header.title-remove-operation',\n 'Remove operation'\n )}\n />\n </div>\n </>\n )}\n {state.isOpen && (\n <div className={styles.selectWrapper}>\n <Select\n autoFocus\n openMenuOnFocus\n placeholder={t(\n 'grafana-prometheus.querybuilder.operation-header.placeholder-replace-with',\n 'Replace with'\n )}\n options={state.alternatives}\n isOpen={true}\n onCloseMenu={onToggleSwitcher}\n onChange={(value) => {\n if (value.value) {\n // Operation should exist if it is selectable\n const newDef = queryModeller.getOperationDef(value.value.id)!;\n\n // copy default params, and override with all current params\n const newParams = [...newDef.defaultParams];\n for (let i = 0; i < Math.min(operation.params.length, newParams.length); i++) {\n if (newDef.params[i].type === def.params[i].type) {\n newParams[i] = operation.params[i];\n }\n }\n\n const changedOp = { ...operation, params: newParams, id: value.value.id };\n onChange(index, def.changeTypeHandler ? def.changeTypeHandler(changedOp, newDef) : changedOp);\n }\n }}\n />\n </div>\n )}\n </div>\n );\n }\n);\n\nOperationHeader.displayName = 'OperationHeader';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n header: css({\n borderBottom: `1px solid ${theme.colors.border.medium}`,\n padding: theme.spacing(0.5, 0.5, 0.5, 1),\n display: 'flex',\n alignItems: 'center',\n }),\n operationHeaderButtons: css({\n opacity: 1,\n }),\n selectWrapper: css({\n paddingRight: theme.spacing(2),\n }),\n };\n};\n","export function getOperationParamId(operationId: string, paramIndex: number) {\n return `operations.${operationId}.param.${paramIndex}`;\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/LabelParamEditor.tsx\nimport { useState } from 'react';\n\nimport { DataSourceApi, SelectableValue, TimeRange, toOption } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { Select } from '@grafana/ui';\n\nimport { getOperationParamId } from '../shared/param_utils';\nimport { QueryBuilderLabelFilter, QueryBuilderOperationParamEditorProps } from '../shared/types';\nimport { PromVisualQuery, PromQueryModellerInterface } from '../types';\n\n/**\n * Props for the LabelParamEditor component.\n * This editor specifically requires a Prometheus query modeller instance.\n */\ninterface LabelParamEditorProps extends Omit<QueryBuilderOperationParamEditorProps, 'queryModeller'> {\n queryModeller: PromQueryModellerInterface;\n}\n\n/**\n * Editor for label parameters that requires a Prometheus query modeller instance.\n * This is used by the OperationParamEditorWrapper which ensures the modeller is always provided.\n */\nexport function LabelParamEditor({\n onChange,\n index,\n operationId,\n value,\n query,\n datasource,\n timeRange,\n queryModeller,\n}: LabelParamEditorProps) {\n const [state, setState] = useState<{\n options?: SelectableValue[];\n isLoading?: boolean;\n }>({});\n\n return (\n <Select\n inputId={getOperationParamId(operationId, index)}\n autoFocus={value === '' ? true : undefined}\n openMenuOnFocus\n onOpenMenu={async () => {\n setState({ isLoading: true });\n const options = await loadGroupByLabels(timeRange, query, datasource, queryModeller);\n setState({ options, isLoading: undefined });\n }}\n isLoading={state.isLoading}\n allowCustomValue\n noOptionsMessage={t(\n 'grafana-prometheus.querybuilder.label-param-editor.noOptionsMessage-no-labels-found',\n 'No labels found'\n )}\n loadingMessage={t(\n 'grafana-prometheus.querybuilder.label-param-editor.loadingMessage-loading-labels',\n 'Loading labels'\n )}\n options={state.options}\n value={toOption(value as string)}\n onChange={(value) => onChange(index, value.value!)}\n />\n );\n}\n\nasync function loadGroupByLabels(\n timeRange: TimeRange,\n query: PromVisualQuery,\n datasource: DataSourceApi,\n modeller: PromQueryModellerInterface\n): Promise<SelectableValue[]> {\n let labels: QueryBuilderLabelFilter[] = query.labels;\n\n // This function is used by both Prometheus and Loki and this the only difference.\n if (datasource.type === 'prometheus') {\n // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n labels = [{ label: '__name__', op: '=', value: query.metric }, ...query.labels];\n }\n\n const expr = modeller.renderLabels(labels);\n const result: string[] = await datasource.languageProvider.queryLabelKeys(timeRange, expr);\n\n return result.map((x) => ({\n label: x,\n value: x,\n }));\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/OperationParamEditor.tsx\nimport { css } from '@emotion/css';\nimport { ComponentType } from 'react';\n\nimport { GrafanaTheme2, SelectableValue, toOption } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { AutoSizeInput, Button, Checkbox, Select, useStyles2, Stack } from '@grafana/ui';\n\nimport { LabelParamEditor } from '../components/LabelParamEditor';\n\nimport { getOperationParamId } from './param_utils';\nimport { QueryBuilderOperationParamDef, QueryBuilderOperationParamEditorProps } from './types';\n\n/**\n * Registry of operation parameter editors that can be referenced by key.\n *\n * This approach solves a circular dependency problem in the codebase:\n * - Operation definitions need to reference editors (e.g., LabelParamEditor)\n * - Editors need to reference the modeller instance\n * - The modeller instance needs to reference operation definitions\n *\n * By using string keys instead of direct imports, we break this cycle:\n * 1. Operation definitions reference editors by key (no component import needed)\n * 2. The registry maps these keys to actual editor components\n * 3. The wrapper component (OperationParamEditorWrapper) injects the modeller instance\n *\n * This creates a clear dependency flow:\n * Operation Definitions -> Registry -> Editor Components <- Wrapper <- Modeller Instance\n *\n * @example\n * ```ts\n * {\n * id: 'someOperation',\n * params: [{\n * name: 'Label',\n * type: 'string',\n * editor: 'LabelParamEditor' // Reference by key instead of supplying the component directly\n * }]\n * }\n * ```\n */\nconst editorMap: Record<string, ComponentType<QueryBuilderOperationParamEditorProps>> = {\n // The wrapper component will ensure the modeller is provided\n LabelParamEditor: LabelParamEditor as ComponentType<QueryBuilderOperationParamEditorProps>,\n};\n\n/**\n * Resolves an operation parameter editor based on the parameter definition.\n *\n * The editor can be specified in three ways:\n * 1. As a string key referencing a registered editor in editorMap\n * 2. As a direct component reference\n * 3. Based on the parameter type (string, number, boolean) or options\n *\n * This flexibility allows operation definitions to be decoupled from editor implementations\n * while maintaining type safety and clear dependencies.\n */\nexport function getOperationParamEditor(\n paramDef: QueryBuilderOperationParamDef\n): ComponentType<QueryBuilderOperationParamEditorProps> {\n if (paramDef.editor) {\n if (typeof paramDef.editor === 'string') {\n return editorMap[paramDef.editor] || SimpleInputParamEditor;\n }\n return paramDef.editor;\n }\n\n if (paramDef.options) {\n return SelectInputParamEditor;\n }\n\n switch (paramDef.type) {\n case 'boolean':\n return BoolInputParamEditor;\n case 'number':\n case 'string':\n default:\n return SimpleInputParamEditor;\n }\n}\n\nfunction SimpleInputParamEditor(props: QueryBuilderOperationParamEditorProps) {\n return (\n <AutoSizeInput\n id={getOperationParamId(props.operationId, props.index)}\n defaultValue={props.value?.toString()}\n minWidth={props.paramDef.minWidth}\n placeholder={props.paramDef.placeholder}\n title={props.paramDef.description}\n maxWidth={(props.paramDef.minWidth || 20) * 3}\n onCommitChange={(evt) => {\n props.onChange(props.index, evt.currentTarget.value);\n if (props.paramDef.runQueryOnEnter && evt.type === 'keydown') {\n props.onRunQuery();\n }\n }}\n />\n );\n}\n\nfunction BoolInputParamEditor(props: QueryBuilderOperationParamEditorProps) {\n return (\n <Checkbox\n id={getOperationParamId(props.operationId, props.index)}\n value={Boolean(props.value)}\n onChange={(evt) => props.onChange(props.index, evt.currentTarget.checked)}\n />\n );\n}\n\nfunction SelectInputParamEditor({\n paramDef,\n value,\n index,\n operationId,\n onChange,\n}: QueryBuilderOperationParamEditorProps) {\n const styles = useStyles2(getStyles);\n let selectOptions = paramDef.options as SelectableValue[];\n\n if (!selectOptions[0]?.label) {\n selectOptions = paramDef.options!.map((option) => ({\n label: option.toString(),\n value: option,\n }));\n }\n\n let valueOption = selectOptions.find((x) => x.value === value) ?? toOption(value as string);\n\n // If we have optional options param and don't have value, we want to render button with which we add optional options.\n // This makes it easier to understand what needs to be selected and what is optional.\n if (!value && paramDef.optional) {\n return (\n <div className={styles.optionalParam}>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n title={t('grafana-prometheus.querybuilder.operation-param-editor.title-add', 'Add {{name}}', {\n name: paramDef.name,\n })}\n icon=\"plus\"\n onClick={() => onChange(index, selectOptions[0].value)}\n >\n {paramDef.name}\n </Button>\n </div>\n );\n }\n\n return (\n <Stack gap={0.5} direction=\"row\" alignItems=\"center\">\n <Select\n id={getOperationParamId(operationId, index)}\n value={valueOption}\n options={selectOptions}\n placeholder={paramDef.placeholder}\n allowCustomValue={true}\n onChange={(value) => onChange(index, value.value!)}\n width={paramDef.minWidth || 'auto'}\n />\n {paramDef.optional && (\n <Button\n data-testid={`operations.${index}.remove-param`}\n size=\"sm\"\n fill=\"text\"\n icon=\"times\"\n variant=\"secondary\"\n aria-label={t('grafana-prometheus.querybuilder.operation-param-editor.title-remove', 'Remove {{name}}', {\n name: paramDef.name,\n })}\n onClick={() => onChange(index, '')}\n />\n )}\n </Stack>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n optionalParam: css({\n marginTop: theme.spacing(1),\n }),\n };\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/OperationEditor.tsx\nimport { css, cx } from '@emotion/css';\nimport { Draggable } from '@hello-pangea/dnd';\nimport { useEffect, useId, useState } from 'react';\nimport * as React from 'react';\n\nimport { DataSourceApi, GrafanaTheme2, TimeRange } from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { Button, Icon, Stack, Tooltip, useStyles2 } from '@grafana/ui';\n\nimport { OperationHeader } from './OperationHeader';\nimport { getOperationParamEditor } from './OperationParamEditorRegistry';\nimport { getOperationParamId } from './param_utils';\nimport {\n QueryBuilderOperation,\n QueryBuilderOperationDef,\n QueryBuilderOperationParamDef,\n QueryBuilderOperationParamValue,\n VisualQueryModeller,\n} from './types';\n\ninterface Props {\n operation: QueryBuilderOperation;\n index: number;\n query: any;\n datasource: DataSourceApi;\n queryModeller: VisualQueryModeller;\n onChange: (index: number, update: QueryBuilderOperation) => void;\n onRemove: (index: number) => void;\n onRunQuery: () => void;\n flash?: boolean;\n highlight?: boolean;\n timeRange: TimeRange;\n}\n\nexport function OperationEditor({\n operation,\n index,\n onRemove,\n onChange,\n onRunQuery,\n queryModeller,\n query,\n datasource,\n flash,\n highlight,\n timeRange,\n}: Props) {\n const styles = useStyles2(getStyles);\n const def = queryModeller.getOperationDef(operation.id);\n const shouldFlash = useFlash(flash);\n const id = useId();\n\n if (!def) {\n return (\n <span>\n <Trans i18nKey=\"grafana-prometheus.querybuilder.operation-editor.not-found\" values={{ id: operation.id }}>\n Operation {'{{id}}'} not found\n </Trans>\n </span>\n );\n }\n\n const onParamValueChanged = (paramIdx: number, value: QueryBuilderOperationParamValue) => {\n const update: QueryBuilderOperation = { ...operation, params: [...operation.params] };\n update.params[paramIdx] = value;\n callParamChangedThenOnChange(def, update, index, paramIdx, onChange);\n };\n\n const onAddRestParam = () => {\n const update: QueryBuilderOperation = { ...operation, params: [...operation.params, ''] };\n callParamChangedThenOnChange(def, update, index, operation.params.length, onChange);\n };\n\n const onRemoveRestParam = (paramIdx: number) => {\n const update: QueryBuilderOperation = {\n ...operation,\n params: [...operation.params.slice(0, paramIdx), ...operation.params.slice(paramIdx + 1)],\n };\n callParamChangedThenOnChange(def, update, index, paramIdx, onChange);\n };\n\n const operationElements: React.ReactNode[] = [];\n\n for (let paramIndex = 0; paramIndex < operation.params.length; paramIndex++) {\n const paramDef = def.params[Math.min(def.params.length - 1, paramIndex)];\n const Editor = getOperationParamEditor(paramDef);\n\n operationElements.push(\n <div className={styles.paramRow} key={`${paramIndex}-1`}>\n {!paramDef.hideName && (\n <div className={styles.paramName}>\n <label htmlFor={getOperationParamId(id, paramIndex)}>{paramDef.name}</label>\n {paramDef.description && (\n <Tooltip placement=\"top\" content={paramDef.description} theme=\"info\">\n <Icon name=\"info-circle\" size=\"sm\" className={styles.infoIcon} />\n </Tooltip>\n )}\n </div>\n )}\n <div className={styles.paramValue}>\n <Stack gap={0.5} direction=\"row\" alignItems=\"center\">\n <Editor\n paramDef={paramDef}\n value={operation.params[paramIndex]}\n index={paramIndex}\n operationId={operation.id}\n query={query}\n datasource={datasource}\n timeRange={timeRange}\n onChange={onParamValueChanged}\n onRunQuery={onRunQuery}\n queryModeller={queryModeller}\n />\n {paramDef.restParam && (operation.params.length > def.params.length || paramDef.optional) && (\n <Button\n data-testid={`operations.${index}.remove-rest-param`}\n size=\"sm\"\n fill=\"text\"\n icon=\"times\"\n variant=\"secondary\"\n aria-label={t('grafana-prometheus.querybuilder.operation-editor.title-remove', 'Remove {{name}}', {\n name: paramDef.name,\n })}\n onClick={() => onRemoveRestParam(paramIndex)}\n />\n )}\n </Stack>\n </div>\n </div>\n );\n }\n\n // Handle adding button for rest params\n let restParam: React.ReactNode | undefined;\n if (def.params.length > 0) {\n const lastParamDef = def.params[def.params.length - 1];\n if (lastParamDef.restParam) {\n restParam = renderAddRestParamButton(lastParamDef, onAddRestParam, index, operation.params.length, styles);\n }\n }\n\n return (\n <Draggable draggableId={`operation-${index}`} index={index}>\n {(provided) => (\n <div\n className={cx(styles.card, (shouldFlash || highlight) && styles.cardHighlight)}\n ref={provided.innerRef}\n {...provided.draggableProps}\n data-testid={`operations.${index}.wrapper`}\n >\n <OperationHeader\n operation={operation}\n dragHandleProps={provided.dragHandleProps}\n def={def}\n index={index}\n onChange={onChange}\n onRemove={onRemove}\n queryModeller={queryModeller}\n />\n <div className={styles.body}>{operationElements}</div>\n {restParam}\n {index < query.operations.length - 1 && (\n <div className={styles.arrow}>\n <div className={styles.arrowLine} />\n <div className={styles.arrowArrow} />\n </div>\n )}\n </div>\n )}\n </Draggable>\n );\n}\n\n/**\n * When flash is switched on makes sure it is switched of right away, so we just flash the highlight and then fade\n * out.\n * @param flash\n */\nfunction useFlash(flash?: boolean) {\n const [keepFlash, setKeepFlash] = useState(true);\n useEffect(() => {\n let t: ReturnType<typeof setTimeout>;\n if (flash) {\n t = setTimeout(() => {\n setKeepFlash(false);\n }, 1000);\n } else {\n setKeepFlash(true);\n }\n\n return () => clearTimeout(t);\n }, [flash]);\n\n return keepFlash && flash;\n}\n\nfunction renderAddRestParamButton(\n paramDef: QueryBuilderOperationParamDef,\n onAddRestParam: () => void,\n operationIndex: number,\n paramIndex: number,\n styles: OperationEditorStyles\n) {\n return (\n <div className={styles.restParam} key={`${paramIndex}-2`}>\n <Button\n size=\"sm\"\n icon=\"plus\"\n title={`Add ${paramDef.name}`.trimEnd()}\n variant=\"secondary\"\n onClick={onAddRestParam}\n data-testid={`operations.${operationIndex}.add-rest-param`}\n >\n {paramDef.name}\n </Button>\n </div>\n );\n}\n\nfunction callParamChangedThenOnChange(\n def: QueryBuilderOperationDef,\n operation: QueryBuilderOperation,\n operationIndex: number,\n paramIndex: number,\n onChange: (index: number, update: QueryBuilderOperation) => void\n) {\n if (def.paramChangedHandler) {\n onChange(operationIndex, def.paramChangedHandler(paramIndex, operation, def));\n } else {\n onChange(operationIndex, operation);\n }\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n cardWrapper: css({\n alignItems: 'stretch',\n }),\n error: css({\n marginBottom: theme.spacing(1),\n }),\n card: css({\n background: theme.colors.background.primary,\n border: `1px solid ${theme.colors.border.medium}`,\n cursor: 'grab',\n borderRadius: theme.shape.radius.default,\n marginBottom: theme.spacing(1),\n position: 'relative',\n [theme.transitions.handleMotion('no-preference', 'reduce')]: {\n transition: 'all 0.5s ease-in 0s',\n },\n height: '100%',\n }),\n cardError: css({\n boxShadow: `0px 0px 4px 0px ${theme.colors.warning.main}`,\n border: `1px solid ${theme.colors.warning.main}`,\n }),\n cardHighlight: css({\n boxShadow: `0px 0px 4px 0px ${theme.colors.primary.border}`,\n border: `1px solid ${theme.colors.primary.border}`,\n }),\n infoIcon: css({\n marginLeft: theme.spacing(0.5),\n color: theme.colors.text.secondary,\n ':hover': {\n color: theme.colors.text.primary,\n },\n }),\n body: css({\n margin: theme.spacing(1, 1, 0.5, 1),\n display: 'table',\n }),\n paramRow: css({\n label: 'paramRow',\n display: 'table-row',\n verticalAlign: 'middle',\n }),\n paramName: css({\n display: 'table-cell',\n padding: theme.spacing(0, 1, 0, 0),\n fontSize: theme.typography.bodySmall.fontSize,\n fontWeight: theme.typography.fontWeightMedium,\n verticalAlign: 'middle',\n height: '32px',\n }),\n paramValue: css({\n label: 'paramValue',\n display: 'table-cell',\n verticalAlign: 'middle',\n }),\n restParam: css({\n padding: theme.spacing(0, 1, 1, 1),\n }),\n arrow: css({\n position: 'absolute',\n top: '0',\n right: '-18px',\n display: 'flex',\n }),\n arrowLine: css({\n height: '2px',\n width: '8px',\n backgroundColor: theme.colors.border.strong,\n position: 'relative',\n top: '14px',\n }),\n arrowArrow: css({\n width: 0,\n height: 0,\n borderTop: `5px solid transparent`,\n borderBottom: `5px solid transparent`,\n borderLeft: `7px solid ${theme.colors.border.strong}`,\n position: 'relative',\n top: '10px',\n }),\n };\n};\n\ntype OperationEditorStyles = ReturnType<typeof getStyles>;\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/OperationList.tsx\nimport { css } from '@emotion/css';\nimport { DragDropContext, Droppable, DropResult } from '@hello-pangea/dnd';\nimport { useState } from 'react';\nimport { useMountedState, usePrevious } from 'react-use';\n\nimport { DataSourceApi, GrafanaTheme2, TimeRange } from '@grafana/data';\nimport { t, Trans } from '@grafana/i18n';\nimport { Button, Cascader, CascaderOption, useStyles2, Stack } from '@grafana/ui';\n\nimport { OperationEditor } from './OperationEditor';\nimport { QueryBuilderOperation, QueryWithOperations, VisualQueryModeller } from './types';\n\ninterface Props<T extends QueryWithOperations> {\n query: T;\n datasource: DataSourceApi;\n onChange: (query: T) => void;\n onRunQuery: () => void;\n queryModeller: VisualQueryModeller;\n explainMode?: boolean;\n highlightedOp?: QueryBuilderOperation;\n timeRange: TimeRange;\n}\n\nexport function OperationList<T extends QueryWithOperations>({\n query,\n datasource,\n queryModeller,\n onChange,\n onRunQuery,\n highlightedOp,\n timeRange,\n}: Props<T>) {\n const styles = useStyles2(getStyles);\n const { operations } = query;\n\n const opsToHighlight = useOperationsHighlight(operations);\n\n const [cascaderOpen, setCascaderOpen] = useState(false);\n\n const onOperationChange = (index: number, update: QueryBuilderOperation) => {\n const updatedList = [...operations];\n updatedList.splice(index, 1, update);\n onChange({ ...query, operations: updatedList });\n };\n\n const onRemove = (index: number) => {\n const updatedList = [...operations.slice(0, index), ...operations.slice(index + 1)];\n onChange({ ...query, operations: updatedList });\n };\n\n const addOptions: CascaderOption[] = queryModeller.getCategories().map((category) => {\n return {\n value: category,\n label: category,\n items: queryModeller.getOperationsForCategory(category).map((operation) => ({\n value: operation.id,\n label: operation.name,\n isLeaf: true,\n })),\n };\n });\n\n const onAddOperation = (value: string) => {\n const operationDef = queryModeller.getOperationDef(value);\n if (!operationDef) {\n return;\n }\n onChange(operationDef.addOperationHandler(operationDef, query, queryModeller));\n setCascaderOpen(false);\n };\n\n const onDragEnd = (result: DropResult) => {\n if (!result.destination) {\n return;\n }\n\n const updatedList = [...operations];\n const element = updatedList[result.source.index];\n updatedList.splice(result.source.index, 1);\n updatedList.splice(result.destination.index, 0, element);\n onChange({ ...query, operations: updatedList });\n };\n\n const onCascaderBlur = () => {\n setCascaderOpen(false);\n };\n\n return (\n <Stack gap={1} direction=\"column\">\n <Stack gap={1}>\n {operations.length > 0 && (\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId=\"sortable-field-mappings\" direction=\"horizontal\">\n {(provided) => (\n <div className={styles.operationList} ref={provided.innerRef} {...provided.droppableProps}>\n {operations.map((op, index) => {\n return (\n <OperationEditor\n key={op.id + JSON.stringify(op.params) + index}\n queryModeller={queryModeller}\n index={index}\n operation={op}\n query={query}\n datasource={datasource}\n onChange={onOperationChange}\n onRemove={onRemove}\n onRunQuery={onRunQuery}\n flash={opsToHighlight[index]}\n highlight={highlightedOp === op}\n timeRange={timeRange}\n />\n );\n })}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n )}\n <div className={styles.addButton}>\n {cascaderOpen ? (\n <Cascader\n options={addOptions}\n onSelect={onAddOperation}\n onBlur={onCascaderBlur}\n autoFocus={true}\n alwaysOpen={true}\n hideActiveLevelLabel={true}\n placeholder={t('grafana-prometheus.querybuilder.operation-list.placeholder-search', 'Search')}\n />\n ) : (\n <Button\n icon={'plus'}\n variant={'secondary'}\n onClick={() => setCascaderOpen(true)}\n title={t('grafana-prometheus.querybuilder.operation-list.title-add-operation', 'Add operation')}\n >\n <Trans i18nKey=\"grafana-prometheus.querybuilder.operation-list.operations\">Operations</Trans>\n </Button>\n )}\n </div>\n </Stack>\n </Stack>\n );\n}\n\n/**\n * Returns indexes of operations that should be highlighted. We check the diff of operations added but at the same time\n * we want to highlight operations only after the initial render, so we check for mounted state and calculate the diff\n * only after.\n * @param operations\n */\nfunction useOperationsHighlight(operations: QueryBuilderOperation[]) {\n const isMounted = useMountedState();\n const prevOperations = usePrevious(operations);\n\n if (!isMounted()) {\n return operations.map(() => false);\n }\n\n if (!prevOperations) {\n return operations.map(() => true);\n }\n\n let newOps: boolean[] = [];\n\n if (prevOperations.length - 1 === operations.length && operations.every((op) => prevOperations.includes(op))) {\n // In case we remove one op and does not change any ops then don't highlight anything.\n return operations.map(() => false);\n }\n if (prevOperations.length + 1 === operations.length && prevOperations.every((op) => operations.includes(op))) {\n // If we add a single op just find it and highlight just that.\n const newOp = operations.find((op) => !prevOperations.includes(op));\n newOps = operations.map((op) => {\n return op === newOp;\n });\n } else {\n // Default diff of all ops.\n newOps = operations.map((op, index) => {\n return !isSameOp(op.id, prevOperations[index]?.id);\n });\n }\n return newOps;\n}\n\nfunction isSameOp(op1?: string, op2?: string) {\n return op1 === op2 || `__${op1}_by` === op2 || op1 === `__${op2}_by`;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n heading: css({\n label: 'heading',\n fontSize: 12,\n fontWeight: theme.typography.fontWeightMedium,\n marginBottom: 0,\n }),\n operationList: css({\n label: 'operationList',\n display: 'flex',\n flexWrap: 'wrap',\n gap: theme.spacing(2),\n }),\n addButton: css({\n label: 'addButton',\n width: 126,\n paddingBottom: theme.spacing(1),\n }),\n };\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/OperationsEditorRow.tsx\nimport { css } from '@emotion/css';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, Stack } from '@grafana/ui';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport function OperationsEditorRow({ children }: Props) {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.root}>\n <Stack gap={1}>{children}</Stack>\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n root: css({\n padding: theme.spacing(1, 1, 0, 1),\n backgroundColor: theme.colors.background.secondary,\n borderRadius: theme.shape.radius.default,\n }),\n };\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/QueryBuilderHints.tsx\nimport { css } from '@emotion/css';\nimport { useEffect, useState } from 'react';\n\nimport { GrafanaTheme2, PanelData, QueryHint } from '@grafana/data';\nimport { Trans } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { Button, Tooltip, useStyles2 } from '@grafana/ui';\n\nimport { PrometheusDatasource } from '../../datasource';\nimport { PromQueryModellerInterface, PromVisualQuery } from '../types';\n\ninterface Props {\n query: PromVisualQuery;\n datasource: PrometheusDatasource;\n queryModeller: PromQueryModellerInterface;\n buildVisualQueryFromString: (expr: string) => { query: PromVisualQuery };\n onChange: (update: PromVisualQuery) => void;\n data?: PanelData;\n}\n\nexport const QueryBuilderHints = ({\n datasource,\n query: visualQuery,\n onChange,\n data,\n queryModeller,\n buildVisualQueryFromString,\n}: Props) => {\n const [hints, setHints] = useState<QueryHint[]>([]);\n const styles = useStyles2(getStyles);\n\n useEffect(() => {\n const query = { expr: queryModeller.renderQuery(visualQuery), refId: '' };\n // For now show only actionable hints\n const hints = datasource.getQueryHints(query, data?.series || []).filter((hint) => hint.fix?.action);\n setHints(hints);\n }, [datasource, visualQuery, data, queryModeller]);\n\n return (\n <div className={styles.root}>\n {hints.length > 0 && (\n <div className={styles.container}>\n {hints.map((hint) => {\n return (\n // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n <Tooltip content={`${hint.label} ${hint.fix?.label}`} key={hint.type}>\n <Button\n onClick={() => {\n reportInteraction('grafana_query_builder_hints_clicked', {\n hint: hint.type,\n datasourceType: datasource.type,\n });\n\n if (hint?.fix?.action) {\n const query = { expr: queryModeller.renderQuery(visualQuery), refId: '' };\n const newQuery = datasource.modifyQuery(query, hint.fix.action);\n const newVisualQuery = buildVisualQueryFromString(newQuery.expr);\n return onChange(newVisualQuery.query);\n }\n }}\n fill=\"outline\"\n size=\"sm\"\n className={styles.hint}\n >\n <Trans\n i18nKey=\"grafana-prometheus.querybuilder.query-builder-hints.hint-details\"\n values={{ hintDetails: hint.fix?.title || hint.fix?.action?.type.toLowerCase().replace('_', ' ') }}\n >\n hint: {'{{hintDetails}}'}\n </Trans>\n </Button>\n </Tooltip>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nQueryBuilderHints.displayName = 'QueryBuilderHints';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n root: css({\n padding: theme.spacing(0.5),\n }),\n container: css({\n display: 'flex',\n alignItems: 'start',\n }),\n hint: css({\n marginRight: theme.spacing(1),\n marginBottom: theme.spacing(1),\n }),\n };\n};\n","import { css } from '@emotion/css';\nimport { memo, useState } from 'react';\n\nimport { DataSourceApi, getDefaultTimeRange, PanelData } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { EditorRow } from '@grafana/plugin-ui';\n\nimport { PrometheusDatasource } from '../../datasource';\nimport { promqlGrammar } from '../../promql';\nimport { getInitHints } from '../../query_hints';\nimport { buildVisualQueryFromString } from '../parsing';\nimport { OperationExplainedBox } from '../shared/OperationExplainedBox';\nimport { OperationList } from '../shared/OperationList';\nimport { OperationListExplained } from '../shared/OperationListExplained';\nimport { OperationsEditorRow } from '../shared/OperationsEditorRow';\nimport { QueryBuilderHints } from '../shared/QueryBuilderHints';\nimport { RawQuery } from '../shared/RawQuery';\nimport { promQueryModeller } from '../shared/modeller_instance';\nimport { QueryBuilderOperation } from '../shared/types';\nimport { PromVisualQuery } from '../types';\n\nimport { MetricsLabelsSection } from './MetricsLabelsSection';\nimport { EXPLAIN_LABEL_FILTER_CONTENT } from './PromQueryBuilderExplained';\n\ninterface QueryBuilderContentProps {\n query: PromVisualQuery;\n datasource: PrometheusDatasource;\n onChange: (update: PromVisualQuery) => void;\n onRunQuery: () => void;\n data?: PanelData;\n showExplain: boolean;\n}\n\nexport const QueryBuilderContent = memo<QueryBuilderContentProps>((props) => {\n const { datasource, query, onChange, onRunQuery, data, showExplain } = props;\n const [highlightedOp, setHighlightedOp] = useState<QueryBuilderOperation | undefined>();\n\n const lang = { grammar: promqlGrammar, name: 'promql' };\n const initHints = getInitHints(datasource);\n\n return (\n <>\n <EditorRow>\n <MetricsLabelsSection\n query={query}\n onChange={onChange}\n datasource={datasource}\n timeRange={data?.timeRange ?? getDefaultTimeRange()}\n />\n </EditorRow>\n {initHints.length ? (\n <div\n className={css({\n flexBasis: '100%',\n })}\n >\n <div className=\"text-warning\">\n {initHints[0].label}{' '}\n {initHints[0].fix ? (\n <button type=\"button\" className={'text-warning'}>\n {initHints[0].fix.label}\n </button>\n ) : null}\n </div>\n </div>\n ) : null}\n {showExplain && (\n <OperationExplainedBox\n stepNumber={1}\n title={<RawQuery query={`${promQueryModeller.renderQuery(query)}`} lang={lang} />}\n >\n {EXPLAIN_LABEL_FILTER_CONTENT}\n </OperationExplainedBox>\n )}\n <OperationsEditorRow>\n <OperationList<PromVisualQuery>\n queryModeller={promQueryModeller}\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n datasource={datasource as DataSourceApi}\n query={query}\n onChange={onChange}\n onRunQuery={onRunQuery}\n highlightedOp={highlightedOp}\n timeRange={data?.timeRange ?? getDefaultTimeRange()}\n />\n <div data-testid={selectors.components.DataSource.Prometheus.queryEditor.builder.hints}>\n <QueryBuilderHints\n datasource={datasource}\n query={query}\n onChange={onChange}\n data={data}\n queryModeller={promQueryModeller}\n buildVisualQueryFromString={buildVisualQueryFromString}\n />\n </div>\n </OperationsEditorRow>\n {showExplain && (\n <OperationListExplained<PromVisualQuery>\n lang={lang}\n query={query}\n stepNumber={2}\n queryModeller={promQueryModeller}\n onMouseEnter={(op: QueryBuilderOperation) => setHighlightedOp(op)}\n onMouseLeave={() => setHighlightedOp(undefined)}\n />\n )}\n </>\n );\n});\n\nQueryBuilderContent.displayName = 'QueryBuilderContent';\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/NestedQuery.tsx\nimport { css } from '@emotion/css';\nimport { memo } from 'react';\n\nimport { GrafanaTheme2, toOption } from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { EditorRows, FlexItem } from '@grafana/plugin-ui';\nimport { AutoSizeInput, IconButton, Select, useStyles2 } from '@grafana/ui';\n\nimport { PrometheusDatasource } from '../../datasource';\nimport { binaryScalarDefs } from '../binaryScalarOperations';\nimport { PromVisualQueryBinary } from '../types';\n\nimport { QueryBuilderContent } from './QueryBuilderContent';\n\ninterface NestedQueryProps {\n nestedQuery: PromVisualQueryBinary;\n datasource: PrometheusDatasource;\n index: number;\n onChange: (index: number, update: PromVisualQueryBinary) => void;\n onRemove: (index: number) => void;\n onRunQuery: () => void;\n showExplain: boolean;\n}\n\nexport const NestedQuery = memo<NestedQueryProps>((props) => {\n const { nestedQuery, index, datasource, onChange, onRemove, onRunQuery, showExplain } = props;\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.card}>\n <div className={styles.header}>\n <div className={styles.name}>\n <Trans i18nKey=\"grafana-prometheus.querybuilder.nested-query.operator\">Operator</Trans>\n </div>\n <Select\n width=\"auto\"\n options={operators}\n value={toOption(nestedQuery.operator)}\n onChange={(value) => {\n onChange(index, {\n ...nestedQuery,\n operator: value.value!,\n });\n }}\n />\n <div className={styles.name}>\n <Trans i18nKey=\"grafana-prometheus.querybuilder.nested-query.vector-matches\">Vector matches</Trans>\n </div>\n <div className={styles.vectorMatchWrapper}>\n <Select<PromVisualQueryBinary['vectorMatchesType']>\n width=\"auto\"\n value={nestedQuery.vectorMatchesType || 'on'}\n allowCustomValue\n options={[\n { value: 'on', label: t('grafana-prometheus.querybuilder.nested-query.label.on', 'On') },\n {\n value: 'ignoring',\n label: t('grafana-prometheus.querybuilder.nested-query.label.ignoring', 'Ignoring'),\n },\n ]}\n onChange={(val) => {\n onChange(index, {\n ...nestedQuery,\n vectorMatchesType: val.value,\n });\n }}\n />\n <AutoSizeInput\n className={styles.vectorMatchInput}\n minWidth={20}\n defaultValue={nestedQuery.vectorMatches}\n onCommitChange={(evt) => {\n onChange(index, {\n ...nestedQuery,\n vectorMatches: evt.currentTarget.value,\n vectorMatchesType: nestedQuery.vectorMatchesType || 'on',\n });\n }}\n />\n </div>\n <FlexItem grow={1} />\n <IconButton\n name=\"times\"\n size=\"sm\"\n onClick={() => onRemove(index)}\n tooltip={t('grafana-prometheus.querybuilder.nested-query.tooltip-remove-match', 'Remove match')}\n />\n </div>\n <div className={styles.body}>\n <EditorRows>\n <QueryBuilderContent\n showExplain={showExplain}\n query={nestedQuery.query}\n datasource={datasource}\n onRunQuery={onRunQuery}\n onChange={(update) => {\n onChange(index, { ...nestedQuery, query: update });\n }}\n />\n </EditorRows>\n </div>\n </div>\n );\n});\n\nconst operators = binaryScalarDefs.map((def) => ({ label: def.sign, value: def.sign }));\n\nNestedQuery.displayName = 'NestedQuery';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n card: css({\n label: 'card',\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.5),\n }),\n header: css({\n label: 'header',\n padding: theme.spacing(0.5, 0.5, 0.5, 1),\n gap: theme.spacing(1),\n display: 'flex',\n alignItems: 'center',\n }),\n name: css({\n label: 'name',\n whiteSpace: 'nowrap',\n }),\n body: css({\n label: 'body',\n paddingLeft: theme.spacing(2),\n }),\n vectorMatchInput: css({\n label: 'vectorMatchInput',\n marginLeft: -1,\n }),\n vectorMatchWrapper: css({\n label: 'vectorMatchWrapper',\n display: 'flex',\n }),\n };\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/NestedQueryList.tsx\nimport { Stack } from '@grafana/ui';\n\nimport { PrometheusDatasource } from '../../datasource';\nimport { PromVisualQuery, PromVisualQueryBinary } from '../types';\n\nimport { NestedQuery } from './NestedQuery';\n\ninterface NestedQueryListProps {\n query: PromVisualQuery;\n datasource: PrometheusDatasource;\n onChange: (query: PromVisualQuery) => void;\n onRunQuery: () => void;\n showExplain: boolean;\n}\n\nexport function NestedQueryList(props: NestedQueryListProps) {\n const { query, datasource, onChange, onRunQuery, showExplain } = props;\n const nestedQueries = query.binaryQueries ?? [];\n\n const onNestedQueryUpdate = (index: number, update: PromVisualQueryBinary) => {\n const updatedList = [...nestedQueries];\n updatedList.splice(index, 1, update);\n onChange({ ...query, binaryQueries: updatedList });\n };\n\n const onRemove = (index: number) => {\n const updatedList = [...nestedQueries.slice(0, index), ...nestedQueries.slice(index + 1)];\n onChange({ ...query, binaryQueries: updatedList });\n };\n\n return (\n <Stack direction=\"column\" gap={1}>\n {nestedQueries.map((nestedQuery, index) => (\n <NestedQuery\n key={index.toString()}\n nestedQuery={nestedQuery}\n index={index}\n onChange={onNestedQueryUpdate}\n datasource={datasource}\n onRemove={onRemove}\n onRunQuery={onRunQuery}\n showExplain={showExplain}\n />\n ))}\n </Stack>\n );\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryBuilder.tsx\nimport { memo } from 'react';\n\nimport { PanelData } from '@grafana/data';\n\nimport { PrometheusDatasource } from '../../datasource';\nimport { PromVisualQuery } from '../types';\n\nimport { NestedQueryList } from './NestedQueryList';\nimport { QueryBuilderContent } from './QueryBuilderContent';\n\ninterface PromQueryBuilderProps {\n query: PromVisualQuery;\n datasource: PrometheusDatasource;\n onChange: (update: PromVisualQuery) => void;\n onRunQuery: () => void;\n data?: PanelData;\n showExplain: boolean;\n}\n\nexport const PromQueryBuilder = memo<PromQueryBuilderProps>((props) => {\n const { query, datasource, onChange, onRunQuery, showExplain } = props;\n\n return (\n <>\n <QueryBuilderContent {...props} />\n {query.binaryQueries && query.binaryQueries.length > 0 && (\n <NestedQueryList\n query={query}\n datasource={datasource}\n onChange={onChange}\n onRunQuery={onRunQuery}\n showExplain={showExplain}\n />\n )}\n </>\n );\n});\n\nPromQueryBuilder.displayName = 'PromQueryBuilder';\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/QueryPreview.tsx\nimport { EditorFieldGroup, EditorRow } from '@grafana/plugin-ui';\n\nimport { promqlGrammar } from '../../promql';\nimport { RawQuery } from '../shared/RawQuery';\n\ninterface QueryPreviewProps {\n query: string;\n}\n\nexport function QueryPreview({ query }: QueryPreviewProps) {\n if (!query) {\n return null;\n }\n\n return (\n <EditorRow>\n <EditorFieldGroup>\n <RawQuery query={query} lang={{ grammar: promqlGrammar, name: 'promql' }} />\n </EditorFieldGroup>\n </EditorRow>\n );\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryBuilderContainer.tsx\nimport { useEffect, useState } from 'react';\n\nimport { PanelData } from '@grafana/data';\n\nimport { PrometheusDatasource } from '../../datasource';\nimport { PromQuery } from '../../types';\nimport { buildVisualQueryFromString } from '../parsing';\nimport { promQueryModeller } from '../shared/modeller_instance';\nimport { PromVisualQuery } from '../types';\n\nimport { PromQueryBuilder } from './PromQueryBuilder';\nimport { QueryPreview } from './QueryPreview';\n\ninterface PromQueryBuilderContainerProps {\n query: PromQuery;\n datasource: PrometheusDatasource;\n onChange: (update: PromQuery) => void;\n onRunQuery: () => void;\n data?: PanelData;\n showExplain: boolean;\n}\n\ninterface RenderedQuery {\n visQuery?: PromVisualQuery;\n expr: string;\n}\n\n/**\n * This component is here just to contain the translation logic between string query and the visual query builder model.\n */\nexport function PromQueryBuilderContainer(props: PromQueryBuilderContainerProps) {\n const { query, onChange, onRunQuery, datasource, data, showExplain } = props;\n const [rendered, setRendered] = useState<RenderedQuery>({ expr: query.expr });\n\n useEffect(() => {\n // Only rebuild visual query if expr changes from outside\n if (!rendered.visQuery || rendered.expr !== query.expr) {\n const parseResult = buildVisualQueryFromString(query.expr ?? '');\n\n setRendered({ expr: query.expr, visQuery: parseResult.query });\n }\n }, [query, rendered]);\n\n const onVisQueryChange = (visQuery: PromVisualQuery) => {\n const expr = promQueryModeller.renderQuery(visQuery);\n setRendered({ expr, visQuery });\n onChange({ ...props.query, expr });\n };\n\n if (!rendered.visQuery) {\n return null;\n }\n\n return (\n <>\n <PromQueryBuilder\n data={data}\n datasource={datasource}\n showExplain={showExplain}\n query={rendered.visQuery}\n onRunQuery={onRunQuery}\n onChange={onVisQueryChange}\n />\n <QueryPreview query={query.expr} />\n </>\n );\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/PromExemplarField.tsx\nimport { css, cx } from '@emotion/css';\nimport { useEffect, useState } from 'react';\nimport { usePrevious } from 'react-use';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { IconButton, InlineLabel, Tooltip, useStyles2 } from '@grafana/ui';\n\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 <Trans i18nKey=\"grafana-prometheus.components.prom-exemplar-field.exemplars\">Exemplars</Trans>\n <IconButton\n name=\"eye\"\n tooltip={\n !!query.exemplar\n ? t(\n 'grafana-prometheus.components.prom-exemplar-field.tooltip-disable-query',\n 'Disable query with exemplars'\n )\n : t(\n 'grafana-prometheus.components.prom-exemplar-field.tooltip-enable-query',\n 'Enable query with exemplars'\n )\n }\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 marginLeft: theme.spacing(2),\n }),\n activeIcon: css({\n color: theme.colors.primary.main,\n }),\n iconWrapper: css({\n display: 'flex',\n alignItems: 'center',\n }),\n };\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/PromExploreExtraField.tsx\nimport { css, cx } from '@emotion/css';\nimport { isEqual } from 'lodash';\nimport { memo, useCallback } from 'react';\nimport * as React from 'react';\nimport { usePrevious } from 'react-use';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { t, Trans } from '@grafana/i18n';\nimport { InlineFormLabel, RadioButtonGroup, useStyles2 } from '@grafana/ui';\n\nimport { PrometheusDatasource } from '../datasource';\nimport { PromQuery } from '../types';\n\nimport { PromExemplarField } from './PromExemplarField';\n\nexport interface PromExploreExtraFieldProps {\n query: PromQuery;\n onChange: (value: PromQuery) => void;\n onRunQuery: () => void;\n datasource: PrometheusDatasource;\n}\n\nexport const PromExploreExtraField = memo(({ query, datasource, onChange, onRunQuery }: PromExploreExtraFieldProps) => {\n const rangeOptions = getQueryTypeOptions(true);\n const prevQuery = usePrevious(query);\n const styles = useStyles2(getStyles);\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 const onQueryTypeChange = getQueryTypeChangeHandler(query, onChange);\n\n return (\n <div\n aria-label={t(\n 'grafana-prometheus.components.prom-explore-extra-field.aria-label-prometheus-extra-field',\n 'Prometheus extra field'\n )}\n className=\"gf-form-inline\"\n data-testid={promExploreExtraFieldTestIds.extraFieldEditor}\n >\n {/*Query type field*/}\n <div\n data-testid={promExploreExtraFieldTestIds.queryTypeField}\n className={cx(\n 'gf-form',\n styles.queryTypeField,\n css({\n flexWrap: 'nowrap',\n })\n )}\n aria-label={t(\n 'grafana-prometheus.components.prom-explore-extra-field.aria-label-query-type-field',\n 'Query type field'\n )}\n >\n <InlineFormLabel width=\"auto\">\n <Trans i18nKey=\"grafana-prometheus.components.prom-explore-extra-field.query-type\">Query type</Trans>\n </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={promExploreExtraFieldTestIds.stepField}\n className={cx(\n 'gf-form',\n css({\n flexWrap: 'nowrap',\n })\n )}\n aria-label={t('grafana-prometheus.components.prom-explore-extra-field.aria-label-step-field', 'Step field')}\n >\n <InlineFormLabel\n width={6}\n tooltip={t(\n 'grafana-prometheus.components.prom-explore-extra-field.tooltip-units-builtin-variables-example-interval-rateinterval',\n 'Time units and built-in variables can be used here, for example: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (Default if no unit is specified: {{default}})',\n {\n example1: '$__interval',\n example2: '$__rate_interval',\n example3: '5s',\n example4: '1m',\n example5: '3h',\n example6: '1d',\n example7: '1y',\n default: 's',\n }\n )}\n >\n <Trans i18nKey=\"grafana-prometheus.components.prom-explore-extra-field.min-step\">Min step</Trans>\n </InlineFormLabel>\n <input\n type={'text'}\n className=\"gf-form-input width-4\"\n // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\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\nPromExploreExtraField.displayName = 'PromExploreExtraField';\n\nexport function getQueryTypeOptions(includeBoth: boolean) {\n const rangeOptions = [\n {\n value: 'range',\n label: t('grafana-prometheus.components.get-query-type-options.range-options.label.range', 'Range'),\n description: t(\n 'grafana-prometheus.components.get-query-type-options.range-options.description.query-range',\n 'Run query over a range of time'\n ),\n },\n {\n value: 'instant',\n label: t('grafana-prometheus.components.get-query-type-options.range-options.label.instant', 'Instant'),\n description: 'Run query against a single point in time. For this query, the \"To\" time is used',\n },\n ];\n\n if (includeBoth) {\n rangeOptions.push({\n value: 'both',\n label: t('grafana-prometheus.components.get-query-type-options.label.both', 'Both'),\n description: t(\n 'grafana-prometheus.components.get-query-type-options.description.instant-query-range',\n 'Run an Instant query and a Range query'\n ),\n });\n }\n\n return rangeOptions;\n}\n\nexport function getQueryTypeChangeHandler(query: PromQuery, onChange: (update: PromQuery) => void) {\n return (queryType: string) => {\n if (queryType === 'instant') {\n onChange({ ...query, instant: true, range: false, exemplar: false });\n } else if (queryType === 'range') {\n onChange({ ...query, instant: false, range: true });\n } else {\n onChange({ ...query, instant: true, range: true });\n }\n };\n}\n\nexport const promExploreExtraFieldTestIds = {\n extraFieldEditor: 'prom-editor-extra-field',\n stepField: 'prom-editor-extra-field-step',\n queryTypeField: 'prom-editor-extra-field-query-type',\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n queryTypeField: css({\n marginRight: theme.spacing(0.5),\n }),\n});\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/shared/QueryOptionGroup.tsx\nimport { css } from '@emotion/css';\nimport * as React from 'react';\nimport { useToggle } from 'react-use';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Collapse, useStyles2, Stack } from '@grafana/ui';\n\ninterface Props {\n title: string;\n collapsedInfo: string[];\n children: React.ReactNode;\n}\n\nexport function QueryOptionGroup({ title, children, collapsedInfo }: Props) {\n const [isOpen, toggleOpen] = useToggle(false);\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.wrapper}>\n <Collapse\n className={styles.collapse}\n isOpen={isOpen}\n onToggle={toggleOpen}\n label={\n <Stack gap={0}>\n <h6 className={styles.title}>{title}</h6>\n {!isOpen && (\n <div className={styles.description}>\n {collapsedInfo.map((x, i) => (\n <span key={i}>{x}</span>\n ))}\n </div>\n )}\n </Stack>\n }\n >\n <div className={styles.body}>{children}</div>\n </Collapse>\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n collapse: css({\n backgroundColor: 'unset',\n border: 'unset',\n marginBottom: 0,\n\n ['> button']: {\n padding: theme.spacing(0, 1),\n },\n }),\n wrapper: css({\n width: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'baseline',\n }),\n title: css({\n flexGrow: 1,\n overflow: 'hidden',\n fontSize: theme.typography.bodySmall.fontSize,\n fontWeight: theme.typography.fontWeightMedium,\n margin: 0,\n }),\n description: css({\n color: theme.colors.text.secondary,\n fontSize: theme.typography.bodySmall.fontSize,\n fontWeight: theme.typography.bodySmall.fontWeight,\n paddingLeft: theme.spacing(2),\n gap: theme.spacing(2),\n display: 'flex',\n }),\n body: css({\n display: 'flex',\n gap: theme.spacing(2),\n flexWrap: 'wrap',\n }),\n tooltip: css({\n marginRight: theme.spacing(0.25),\n }),\n };\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryLegendEditor.tsx\nimport { useRef } from 'react';\nimport * as React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t } from '@grafana/i18n';\nimport { EditorField } from '@grafana/plugin-ui';\nimport { AutoSizeInput, Select } from '@grafana/ui';\n\nimport { LegendFormatMode } from '../../types';\n\ninterface PromQueryLegendEditorProps {\n legendFormat: string | undefined;\n onChange: (legendFormat: string) => void;\n onRunQuery: () => void;\n}\n\nconst getLegendModeOptions = () => [\n {\n label: t('grafana-prometheus.prom-query-legend-editor.get-legend-mode-options.label-auto', 'Auto'),\n value: LegendFormatMode.Auto,\n description: t(\n 'grafana-prometheus.prom-query-legend-editor.get-legend-mode-options.description-auto',\n 'Only includes unique labels'\n ),\n },\n {\n label: t('grafana-prometheus.prom-query-legend-editor.get-legend-mode-options.label-verbose', 'Verbose'),\n value: LegendFormatMode.Verbose,\n description: t(\n 'grafana-prometheus.prom-query-legend-editor.get-legend-mode-options.description-verbose',\n 'All label names and values'\n ),\n },\n {\n label: t('grafana-prometheus.prom-query-legend-editor.get-legend-mode-options.label-custom', 'Custom'),\n value: LegendFormatMode.Custom,\n description: t(\n 'grafana-prometheus.prom-query-legend-editor.get-legend-mode-options.description-custom',\n 'Provide a naming template'\n ),\n },\n];\n\n/**\n * Tests for this component are on the parent level (PromQueryBuilderOptions).\n */\nexport const PromQueryLegendEditor = React.memo<PromQueryLegendEditorProps>(\n ({ legendFormat, onChange, onRunQuery }) => {\n const mode = getLegendMode(legendFormat);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const legendModeOptions = getLegendModeOptions();\n\n const onLegendFormatChanged = (evt: React.FormEvent<HTMLInputElement>) => {\n let newFormat = evt.currentTarget.value;\n if (newFormat.length === 0) {\n newFormat = LegendFormatMode.Auto;\n }\n\n if (newFormat !== legendFormat) {\n onChange(newFormat);\n onRunQuery();\n }\n };\n\n const onLegendModeChanged = (value: SelectableValue<LegendFormatMode>) => {\n switch (value.value!) {\n case LegendFormatMode.Auto:\n onChange(LegendFormatMode.Auto);\n break;\n case LegendFormatMode.Custom:\n onChange('{{label_name}}');\n setTimeout(() => {\n inputRef.current?.focus();\n inputRef.current?.setSelectionRange(2, 12, 'forward');\n }, 10);\n break;\n case LegendFormatMode.Verbose:\n onChange('');\n break;\n }\n onRunQuery();\n };\n\n return (\n <EditorField\n label={t('grafana-prometheus.querybuilder.prom-query-legend-editor.label-legend', 'Legend')}\n tooltip={t(\n 'grafana-prometheus.querybuilder.prom-query-legend-editor.tooltip-legend',\n 'Series name override or template. Ex. {{templateExample}} will be replaced with label value for {{labelName}}.',\n { templateExample: '{{hostname}}', labelName: 'hostname' }\n )}\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.legend}\n >\n <>\n {mode === LegendFormatMode.Custom && (\n <AutoSizeInput\n id=\"legendFormat\"\n minWidth={22}\n // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n placeholder=\"auto\"\n defaultValue={legendFormat}\n onCommitChange={onLegendFormatChanged}\n ref={inputRef}\n />\n )}\n {mode !== LegendFormatMode.Custom && (\n <Select\n inputId=\"legend.mode\"\n isSearchable={false}\n placeholder={t(\n 'grafana-prometheus.querybuilder.prom-query-legend-editor.placeholder-select-legend-mode',\n 'Select legend mode'\n )}\n options={legendModeOptions}\n width={22}\n onChange={onLegendModeChanged}\n value={legendModeOptions.find((x) => x.value === mode)}\n aria-label={t(\n 'grafana-prometheus.querybuilder.prom-query-legend-editor.aria-label-legend',\n 'Legend combobox'\n )}\n />\n )}\n </>\n </EditorField>\n );\n }\n);\n\nPromQueryLegendEditor.displayName = 'PromQueryLegendEditor';\n\nfunction getLegendMode(legendFormat: string | undefined) {\n // This special value means the new smart minimal series naming\n if (legendFormat === LegendFormatMode.Auto) {\n return LegendFormatMode.Auto;\n }\n\n // Missing or empty legend format is the old verbose behavior\n if (legendFormat == null || legendFormat === '') {\n return LegendFormatMode.Verbose;\n }\n\n return LegendFormatMode.Custom;\n}\n\nexport function getLegendModeLabel(legendFormat: string | undefined) {\n const legendModeOptions = getLegendModeOptions();\n const mode = getLegendMode(legendFormat);\n if (mode !== LegendFormatMode.Custom) {\n return legendModeOptions.find((x) => x.value === mode)?.label;\n }\n return legendFormat;\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryBuilderOptions.tsx\nimport { map } from 'lodash';\nimport { SyntheticEvent } from 'react';\nimport * as React from 'react';\n\nimport { CoreApp, SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Trans, t } from '@grafana/i18n';\nimport { EditorField, EditorRow, EditorSwitch } from '@grafana/plugin-ui';\nimport { AutoSizeInput, RadioButtonGroup, Select } from '@grafana/ui';\n\nimport { getQueryTypeChangeHandler, getQueryTypeOptions } from '../../components/PromExploreExtraField';\nimport { PromQueryFormat } from '../../dataquery';\nimport { PromQuery } from '../../types';\nimport { QueryOptionGroup } from '../shared/QueryOptionGroup';\n\nimport { getLegendModeLabel, PromQueryLegendEditor } from './PromQueryLegendEditor';\n\ninterface PromQueryBuilderOptionsProps {\n query: PromQuery;\n app?: CoreApp;\n onChange: (update: PromQuery) => void;\n onRunQuery: () => void;\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\nexport const PromQueryBuilderOptions = React.memo<PromQueryBuilderOptionsProps>(\n ({ query, app, onChange, onRunQuery }) => {\n const FORMAT_OPTIONS: Array<SelectableValue<PromQueryFormat>> = [\n {\n label: t(\n 'grafana-prometheus.querybuilder.prom-query-builder-options.format-options.label-time-series',\n 'Time series'\n ),\n value: 'time_series',\n },\n {\n label: t('grafana-prometheus.querybuilder.prom-query-builder-options.format-options.label-table', 'Table'),\n value: 'table',\n },\n {\n label: t('grafana-prometheus.querybuilder.prom-query-builder-options.format-options.label-heatmap', 'Heatmap'),\n value: 'heatmap',\n },\n ];\n\n const onChangeFormat = (value: SelectableValue<PromQueryFormat>) => {\n onChange({ ...query, format: value.value });\n onRunQuery();\n };\n\n const onChangeStep = (evt: React.FormEvent<HTMLInputElement>) => {\n onChange({ ...query, interval: evt.currentTarget.value.trim() });\n onRunQuery();\n };\n\n const queryTypeOptions = getQueryTypeOptions(\n app === CoreApp.Explore || app === CoreApp.Correlations || app === CoreApp.PanelEditor\n );\n\n const onQueryTypeChange = getQueryTypeChangeHandler(query, onChange);\n\n const onExemplarChange = (event: SyntheticEvent<HTMLInputElement>) => {\n const isEnabled = event.currentTarget.checked;\n onChange({ ...query, exemplar: isEnabled });\n onRunQuery();\n };\n\n const onIntervalFactorChange = (value: SelectableValue<number>) => {\n onChange({ ...query, intervalFactor: value.value });\n onRunQuery();\n };\n\n const formatOption = FORMAT_OPTIONS.find((option) => option.value === query.format) || FORMAT_OPTIONS[0];\n const queryTypeValue = getQueryTypeValue(query);\n const queryTypeLabel = queryTypeOptions.find((x) => x.value === queryTypeValue)!.label;\n\n return (\n <EditorRow>\n <div data-testid={selectors.components.DataSource.Prometheus.queryEditor.options}>\n <QueryOptionGroup\n title={t('grafana-prometheus.querybuilder.prom-query-builder-options.title-options', 'Options')}\n collapsedInfo={getCollapsedInfo(query, formatOption.label!, queryTypeLabel, app)}\n >\n <PromQueryLegendEditor\n legendFormat={query.legendFormat}\n onChange={(legendFormat) => onChange({ ...query, legendFormat })}\n onRunQuery={onRunQuery}\n />\n <EditorField\n label={t('grafana-prometheus.querybuilder.prom-query-builder-options.label-min-step', 'Min step')}\n tooltip={\n <>\n <Trans\n i18nKey=\"grafana-prometheus.querybuilder.prom-query-builder-options.tooltip-min-step\"\n values={{\n interval: '$__interval',\n rateInterval: '$__rate_interval',\n }}\n >\n An additional lower limit for the step parameter of the Prometheus query and for the{' '}\n <code>{'{{interval}}'}</code> and <code>{'{{rateInterval}}'}</code> variables.\n </Trans>\n </>\n }\n >\n <AutoSizeInput\n type=\"text\"\n aria-label={t(\n 'grafana-prometheus.querybuilder.prom-query-builder-options.aria-label-lower-limit-parameter',\n 'Min step text box, set lower limit for the step parameter'\n )}\n placeholder={t('grafana-prometheus.querybuilder.prom-query-builder-options.placeholder-auto', 'auto')}\n minWidth={10}\n onCommitChange={onChangeStep}\n defaultValue={query.interval}\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.step}\n />\n </EditorField>\n <EditorField label={t('grafana-prometheus.querybuilder.prom-query-builder-options.label-format', 'Format')}>\n <Select\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.format}\n value={formatOption}\n allowCustomValue\n onChange={onChangeFormat}\n options={FORMAT_OPTIONS}\n aria-label={t(\n 'grafana-prometheus.querybuilder.prom-query-builder-options.aria-label-format',\n 'Format combobox'\n )}\n />\n </EditorField>\n <EditorField\n label={t('grafana-prometheus.querybuilder.prom-query-builder-options.label-type', 'Type')}\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.type}\n >\n <RadioButtonGroup\n options={queryTypeOptions}\n value={queryTypeValue}\n onChange={onQueryTypeChange}\n aria-label={t(\n 'grafana-prometheus.querybuilder.prom-query-builder-options.aria-label-type',\n 'Type radio button group'\n )}\n />\n </EditorField>\n {shouldShowExemplarSwitch(query, app) && (\n <EditorField\n label={t('grafana-prometheus.querybuilder.prom-query-builder-options.label-exemplars', 'Exemplars')}\n >\n <EditorSwitch\n value={query.exemplar || false}\n onChange={onExemplarChange}\n data-testid={selectors.components.DataSource.Prometheus.queryEditor.exemplars}\n aria-label={t(\n 'grafana-prometheus.querybuilder.prom-query-builder-options.aria-label-exemplars',\n 'Exemplars switch.'\n )}\n />\n </EditorField>\n )}\n {query.intervalFactor && query.intervalFactor > 1 && (\n <EditorField\n label={t('grafana-prometheus.querybuilder.prom-query-builder-options.label-resolution', 'Resolution')}\n >\n <Select\n aria-label={t(\n 'grafana-prometheus.querybuilder.prom-query-builder-options.aria-label-select-resolution',\n 'Select resolution'\n )}\n isSearchable={false}\n options={INTERVAL_FACTOR_OPTIONS}\n onChange={onIntervalFactorChange}\n value={INTERVAL_FACTOR_OPTIONS.find((option) => option.value === query.intervalFactor)}\n />\n </EditorField>\n )}\n </QueryOptionGroup>\n </div>\n </EditorRow>\n );\n }\n);\n\nfunction shouldShowExemplarSwitch(query: PromQuery, app?: CoreApp) {\n if (app === CoreApp.UnifiedAlerting || !query.range) {\n return false;\n }\n\n return true;\n}\n\nfunction getQueryTypeValue(query: PromQuery) {\n return query.range && query.instant ? 'both' : query.instant ? 'instant' : 'range';\n}\n\nfunction getCollapsedInfo(query: PromQuery, formatOption: string, queryType: string, app?: CoreApp): string[] {\n const items: string[] = [];\n\n items.push(\n t('grafana-prometheus.querybuilder.get-collapsed-info.legend', 'Legend: {{value}}', {\n value: getLegendModeLabel(query.legendFormat),\n })\n );\n items.push(\n t('grafana-prometheus.querybuilder.get-collapsed-info.format', 'Format: {{value}}', { value: formatOption })\n );\n items.push(\n t('grafana-prometheus.querybuilder.get-collapsed-info.step', 'Step: {{value}}', { value: query.interval ?? 'auto' })\n );\n items.push(t('grafana-prometheus.querybuilder.get-collapsed-info.type', 'Type: {{value}}', { value: queryType }));\n\n if (shouldShowExemplarSwitch(query, app)) {\n items.push(\n t('grafana-prometheus.querybuilder.get-collapsed-info.exemplars', 'Exemplars: {{value}}', {\n value: query.exemplar ? 'true' : 'false',\n })\n );\n }\n return items;\n}\n\nPromQueryBuilderOptions.displayName = 'PromQueryBuilderOptions';\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryEditorSelector.tsx\nimport { isEqual } from 'lodash';\nimport { memo, SyntheticEvent, useCallback, useEffect, useState } from 'react';\n\nimport { CoreApp, LoadingState } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t, Trans } from '@grafana/i18n';\nimport { EditorHeader, EditorRows, FlexItem } from '@grafana/plugin-ui';\nimport { reportInteraction } from '@grafana/runtime';\nimport { Button, ConfirmModal, Space } from '@grafana/ui';\n\nimport { PromQueryEditorProps } from '../../components/types';\nimport { PromQuery } from '../../types';\nimport { QueryPatternsModal } from '../QueryPatternsModal';\nimport { promQueryEditorExplainKey, useFlag } from '../hooks/useFlag';\nimport { buildVisualQueryFromString } from '../parsing';\nimport { QueryEditorModeToggle } from '../shared/QueryEditorModeToggle';\nimport { QueryHeaderSwitch } from '../shared/QueryHeaderSwitch';\nimport { QueryEditorMode } from '../shared/types';\nimport { changeEditorMode, getQueryWithDefaults } from '../state';\n\nimport { PromQueryBuilderContainer } from './PromQueryBuilderContainer';\nimport { PromQueryBuilderOptions } from './PromQueryBuilderOptions';\nimport { PromQueryCodeEditor } from './PromQueryCodeEditor';\n\ntype Props = PromQueryEditorProps;\n\nexport const PromQueryEditorSelector = memo<Props>((props) => {\n const {\n onChange,\n onRunQuery,\n data,\n app,\n onAddQuery,\n datasource: { defaultEditor },\n queries,\n } = props;\n\n const [parseModalOpen, setParseModalOpen] = useState(false);\n const [queryPatternsModalOpen, setQueryPatternsModalOpen] = useState(false);\n const [dataIsStale, setDataIsStale] = useState(false);\n const { flag: explain, setFlag: setExplain } = useFlag(promQueryEditorExplainKey);\n\n const query = getQueryWithDefaults(props.query, app, defaultEditor);\n // This should be filled in from the defaults by now.\n const editorMode = query.editorMode!;\n\n const onEditorModeChange = useCallback(\n (newMetricEditorMode: QueryEditorMode) => {\n reportInteraction('user_grafana_prometheus_editor_mode_clicked', {\n newEditor: newMetricEditorMode,\n previousEditor: query.editorMode ?? '',\n newQuery: !query.expr,\n app: app ?? '',\n });\n\n if (newMetricEditorMode === QueryEditorMode.Builder) {\n const result = buildVisualQueryFromString(query.expr || '');\n // If there are errors, give user a chance to decide if they want to go to builder as that can lose some data.\n if (result.errors.length) {\n setParseModalOpen(true);\n return;\n }\n }\n changeEditorMode(query, newMetricEditorMode, onChange);\n },\n [onChange, query, app]\n );\n\n useEffect(() => {\n setDataIsStale(false);\n }, [data]);\n\n const onChangeInternal = (query: PromQuery) => {\n if (!isEqual(query, props.query)) {\n setDataIsStale(true);\n }\n onChange(query);\n };\n\n const onShowExplainChange = (e: SyntheticEvent<HTMLInputElement>) => {\n setExplain(e.currentTarget.checked);\n };\n\n const handleOpenQueryPatternsModal = useCallback(() => {\n reportInteraction('grafana_prometheus_open_kickstart_clicked', {\n app: app ?? '',\n });\n setQueryPatternsModalOpen(true);\n }, [app]);\n\n return (\n <>\n <ConfirmModal\n isOpen={parseModalOpen}\n title={t(\n 'grafana-prometheus.querybuilder.prom-query-editor-selector.title-parsing-error-switch-builder',\n 'Parsing error: Switch to the builder mode?'\n )}\n body={t(\n 'grafana-prometheus.querybuilder.prom-query-editor-selector.body-syntax-error',\n 'There is a syntax error, or the query structure cannot be visualized when switching to the builder mode. Parts of the query may be lost.'\n )}\n confirmText={t('grafana-prometheus.querybuilder.prom-query-editor-selector.confirmText-continue', 'Continue')}\n onConfirm={() => {\n changeEditorMode(query, QueryEditorMode.Builder, onChange);\n setParseModalOpen(false);\n }}\n onDismiss={() => setParseModalOpen(false)}\n />\n <QueryPatternsModal\n isOpen={queryPatternsModalOpen}\n onClose={() => setQueryPatternsModalOpen(false)}\n query={query}\n queries={queries}\n app={app}\n onChange={onChange}\n onAddQuery={onAddQuery}\n />\n <EditorHeader>\n <Button\n data-testid={selectors.components.QueryBuilder.queryPatterns}\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleOpenQueryPatternsModal}\n >\n <Trans i18nKey=\"grafana-prometheus.querybuilder.prom-query-editor-selector.kick-start-your-query\">\n Kick start your query\n </Trans>\n </Button>\n <div data-testid={selectors.components.DataSource.Prometheus.queryEditor.explain}>\n <QueryHeaderSwitch\n label={t('grafana-prometheus.querybuilder.prom-query-editor-selector.label-explain', 'Explain')}\n value={explain}\n onChange={onShowExplainChange}\n />\n </div>\n <FlexItem grow={1} />\n {app !== CoreApp.Explore && app !== CoreApp.Correlations && (\n <Button\n variant={dataIsStale ? 'primary' : 'secondary'}\n size=\"sm\"\n onClick={onRunQuery}\n icon={data?.state === LoadingState.Loading ? 'spinner' : undefined}\n disabled={data?.state === LoadingState.Loading}\n >\n <Trans i18nKey=\"grafana-prometheus.querybuilder.prom-query-editor-selector.run-queries\">Run queries</Trans>\n </Button>\n )}\n <div data-testid={selectors.components.DataSource.Prometheus.queryEditor.editorToggle}>\n <QueryEditorModeToggle mode={editorMode} onChange={onEditorModeChange} />\n </div>\n </EditorHeader>\n <Space v={0.5} />\n <EditorRows>\n {editorMode === QueryEditorMode.Code && (\n <PromQueryCodeEditor {...props} query={query} showExplain={explain} onChange={onChangeInternal} />\n )}\n {editorMode === QueryEditorMode.Builder && (\n <PromQueryBuilderContainer\n query={query}\n datasource={props.datasource}\n onChange={onChangeInternal}\n onRunQuery={props.onRunQuery}\n data={data}\n showExplain={explain}\n />\n )}\n <PromQueryBuilderOptions query={query} app={props.app} onChange={onChange} onRunQuery={onRunQuery} />\n </EditorRows>\n </>\n );\n});\n\nPromQueryEditorSelector.displayName = 'PromQueryEditorSelector';\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/PromQueryEditorForAlerting.tsx\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={alertingTestIds.editor}\n />\n );\n}\n\nexport const alertingTestIds = {\n editor: 'prom-editor-cloud-alerting',\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/PromQueryEditorByApp.tsx\nimport { memo } from 'react';\n\nimport { CoreApp } from '@grafana/data';\n\nimport { PromQueryEditorSelector } from '../querybuilder/components/PromQueryEditorSelector';\n\nimport { PromQueryEditorForAlerting } from './PromQueryEditorForAlerting';\nimport { PromQueryEditorProps } from './types';\n\nfunction PromQueryEditorByAppBase(props: PromQueryEditorProps) {\n const { app } = props;\n\n switch (app) {\n case CoreApp.CloudAlerting:\n return <PromQueryEditorForAlerting {...props} />;\n default:\n return <PromQueryEditorSelector {...props} />;\n }\n}\n\nexport const PromQueryEditorByApp = memo(PromQueryEditorByAppBase);\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/PromCheatSheet.tsx\nimport { css } from '@emotion/css';\n\nimport { GrafanaTheme2, QueryEditorHelpProps } from '@grafana/data';\nimport { Trans } from '@grafana/i18n';\nimport { useStyles2 } from '@grafana/ui';\n\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\nexport const PromCheatSheet = (props: QueryEditorHelpProps<PromQuery>) => {\n const styles = useStyles2(getStyles);\n\n return (\n <div>\n <h2>\n <Trans i18nKey=\"grafana-prometheus.components.prom-cheat-sheet.prom-ql-cheat-sheet\">PromQL Cheat Sheet</Trans>\n </h2>\n {CHEAT_SHEET_ITEMS.map((item, index) => (\n <div className={styles.cheatSheetItem} key={index}>\n <div className={styles.cheatSheetItemTitle}>{item.title}</div>\n {item.expression ? (\n <button\n type=\"button\"\n className={styles.cheatSheetExample}\n onClick={(e) => props.onClickExample({ refId: 'A', expr: item.expression })}\n >\n <code>{item.expression}</code>\n </button>\n ) : null}\n {item.label}\n </div>\n ))}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n cheatSheetItem: css({\n margin: theme.spacing(3, 0),\n }),\n cheatSheetItemTitle: css({\n fontSize: theme.typography.h3.fontSize,\n }),\n cheatSheetExample: css({\n margin: theme.spacing(0.5, 0),\n // element is interactive, clear button styles\n textAlign: 'left',\n border: 'none',\n background: 'transparent',\n display: 'block',\n }),\n});\n","import { config } from '@grafana/runtime';\n\nvar AzureCloud = /* @__PURE__ */ ((AzureCloud2) => {\n AzureCloud2[\"Public\"] = \"AzureCloud\";\n AzureCloud2[\"China\"] = \"AzureChinaCloud\";\n AzureCloud2[\"USGovernment\"] = \"AzureUSGovernment\";\n AzureCloud2[\"None\"] = \"\";\n return AzureCloud2;\n})(AzureCloud || {});\nconst predefinedClouds = [\n { name: \"AzureCloud\", displayName: \"Azure\" },\n { name: \"AzureChinaCloud\", displayName: \"Azure China\" },\n { name: \"AzureUSGovernment\", displayName: \"Azure US Government\" }\n];\nfunction getAzureClouds() {\n const settingsEx = config.azure;\n if (Array.isArray(settingsEx.clouds) && settingsEx.clouds.length > 0) {\n return settingsEx.clouds;\n }\n return predefinedClouds;\n}\nfunction getDefaultAzureCloud() {\n return config.azure.cloud || \"AzureCloud\" /* Public */;\n}\nfunction resolveLegacyCloudName(cloudName) {\n if (!cloudName) {\n return void 0;\n }\n switch (cloudName) {\n case \"azuremonitor\":\n return \"AzureCloud\" /* Public */;\n case \"chinaazuremonitor\":\n return \"AzureChinaCloud\" /* China */;\n case \"govazuremonitor\":\n return \"AzureUSGovernment\" /* USGovernment */;\n default:\n throw new Error(`Azure cloud '${cloudName}' is not recognized by datasource.`);\n }\n}\n\nexport { AzureCloud, getAzureClouds, getDefaultAzureCloud, resolveLegacyCloudName };\n//# sourceMappingURL=clouds.js.map\n","function instanceOfAzureCredential(authType, object) {\n if (!object) {\n return false;\n }\n return object.authType === authType;\n}\n\nexport { instanceOfAzureCredential };\n//# sourceMappingURL=AzureCredentials.js.map\n","import { config } from '@grafana/runtime';\nimport { getDefaultAzureCloud } from '../clouds.js';\nimport { instanceOfAzureCredential } from './AzureCredentials.js';\n\nconst concealed = Symbol(\"Concealed client secret\");\nconst concealedLegacy = Symbol(\"Concealed legacy client secret\");\nfunction isCredentialsComplete(credentials, ignoreSecret = false) {\n const authType = credentials.authType;\n switch (authType) {\n case \"msi\":\n case \"workloadidentity\":\n case \"currentuser\":\n return true;\n case \"clientsecret\":\n case \"clientsecret-obo\":\n return !!(credentials.azureCloud && credentials.tenantId && credentials.clientId && // When ignoreSecret is set we consider the credentials complete without checking the secret\n !!(ignoreSecret || credentials.clientSecret));\n case \"ad-password\":\n return !!(credentials.clientId && credentials.password && credentials.userId);\n default:\n throw new Error(`The auth type '${authType}' not supported.`);\n }\n}\nfunction getClientSecret(options) {\n if (!(\"secureJsonFields\" in options) || !options.hasOwnProperty(\"secureJsonFields\")) {\n return void 0;\n }\n if (options.secureJsonFields.azureClientSecret) {\n return concealed;\n } else if (options.secureJsonFields.clientSecret) {\n return concealedLegacy;\n } else {\n const secret = options.secureJsonData?.azureClientSecret;\n return typeof secret === \"string\" && secret.length > 0 ? secret : void 0;\n }\n}\nfunction getAdPassword(options) {\n if (!(\"secureJsonFields\" in options) || !options.hasOwnProperty(\"secureJsonFields\")) {\n return void 0;\n }\n if (options.secureJsonFields.password) {\n return concealed;\n } else {\n const secret = options.secureJsonData?.password;\n return typeof secret === \"string\" && secret.length > 0 ? secret : void 0;\n }\n}\nfunction getDatasourceCredentials(options, oboEnabled) {\n const credentials = options.jsonData.azureCredentials;\n if (!credentials) {\n return void 0;\n }\n const authType = credentials.authType;\n switch (authType) {\n case \"msi\":\n case \"workloadidentity\":\n if (authType === \"msi\" && config.azure.managedIdentityEnabled || authType === \"workloadidentity\" && config.azure.workloadIdentityEnabled) {\n return {\n authType\n };\n } else {\n return void 0;\n }\n case \"clientsecret\":\n case \"clientsecret-obo\":\n if (authType === \"clientsecret-obo\" && !oboEnabled) {\n return void 0;\n }\n return {\n authType,\n azureCloud: credentials.azureCloud || getDefaultAzureCloud(),\n tenantId: credentials.tenantId,\n clientId: credentials.clientId,\n clientSecret: getClientSecret(options)\n };\n case \"ad-password\":\n return {\n authType,\n userId: credentials.userId,\n clientId: credentials.clientId,\n password: getAdPassword(options)\n };\n }\n if (instanceOfAzureCredential(authType, credentials)) {\n if (!config.azure.userIdentityEnabled) {\n return void 0;\n }\n if (instanceOfAzureCredential(\"clientsecret\", credentials.serviceCredentials)) {\n const serviceCredentials = { ...credentials.serviceCredentials, clientSecret: getClientSecret(options) };\n return {\n authType,\n serviceCredentialsEnabled: credentials.serviceCredentialsEnabled,\n serviceCredentials\n };\n }\n return {\n authType,\n serviceCredentialsEnabled: credentials.serviceCredentialsEnabled,\n serviceCredentials: credentials.serviceCredentials\n };\n }\n throw new Error(`The auth type '${authType}' is not supported.`);\n}\nfunction updateDatasourceCredentials(options, credentials, oboEnabled) {\n options = {\n ...options,\n jsonData: {\n ...options.jsonData,\n azureAuthType: void 0,\n cloudName: void 0,\n tenantId: void 0,\n clientId: void 0\n }\n };\n const authType = credentials.authType;\n switch (authType) {\n case \"msi\":\n case \"workloadidentity\":\n if (authType === \"msi\" && !config.azure.managedIdentityEnabled) {\n throw new Error(\"Managed Identity authentication is not enabled in Grafana config.\");\n }\n if (authType === \"workloadidentity\" && !config.azure.workloadIdentityEnabled) {\n throw new Error(\"Workload Identity authentication is not enabled in Grafana config.\");\n }\n options = {\n ...options,\n jsonData: {\n ...options.jsonData,\n azureCredentials: {\n authType\n }\n }\n };\n return options;\n case \"clientsecret\":\n case \"clientsecret-obo\":\n if (authType === \"clientsecret-obo\" && !oboEnabled) {\n throw new Error(\"Client Secret OBO authentication is not enabled in Grafana config.\");\n }\n options = {\n ...options,\n jsonData: {\n ...options.jsonData,\n azureCredentials: {\n authType,\n azureCloud: credentials.azureCloud || getDefaultAzureCloud(),\n tenantId: credentials.tenantId,\n clientId: credentials.clientId\n }\n },\n secureJsonData: {\n ...options.secureJsonData,\n azureClientSecret: typeof credentials.clientSecret === \"string\" && credentials.clientSecret.length > 0 ? credentials.clientSecret : void 0\n },\n secureJsonFields: {\n ...options.secureJsonFields,\n azureClientSecret: credentials.clientSecret === concealed,\n clientSecret: credentials.clientSecret === concealedLegacy\n }\n };\n if (authType === \"clientsecret-obo\") {\n options = {\n ...options,\n jsonData: {\n ...options.jsonData,\n oauthPassThru: true\n }\n };\n }\n return options;\n case \"ad-password\":\n options = {\n ...options,\n jsonData: {\n ...options.jsonData,\n azureCredentials: {\n authType: \"ad-password\",\n userId: credentials.userId,\n clientId: credentials.clientId\n }\n },\n secureJsonData: {\n ...options.secureJsonData,\n password: typeof credentials.password === \"string\" && credentials.password.length > 0 ? credentials.password : void 0\n },\n secureJsonFields: {\n ...options.secureJsonFields,\n password: typeof credentials.password === \"symbol\"\n }\n };\n return options;\n }\n if (instanceOfAzureCredential(\"currentuser\", credentials)) {\n if (!config.azure.userIdentityEnabled) {\n throw new Error(\"User Identity authentication is not enabled in Grafana config.\");\n }\n const serviceCredentials = credentials.serviceCredentials;\n let clientSecret;\n if (instanceOfAzureCredential(\"clientsecret\", serviceCredentials)) {\n clientSecret = serviceCredentials.clientSecret;\n delete serviceCredentials.clientSecret;\n }\n options = {\n ...options,\n jsonData: {\n ...options.jsonData,\n azureCredentials: {\n authType: \"currentuser\",\n serviceCredentialsEnabled: credentials.serviceCredentialsEnabled,\n serviceCredentials\n },\n oauthPassThru: true,\n disableGrafanaCache: true\n },\n secureJsonData: {\n ...options.secureJsonData,\n azureClientSecret: typeof clientSecret === \"string\" && clientSecret.length > 0 ? clientSecret : void 0\n },\n secureJsonFields: {\n ...options.secureJsonFields,\n azureClientSecret: clientSecret === concealed,\n clientSecret: clientSecret === concealedLegacy\n }\n };\n return options;\n }\n throw new Error(`The auth type '${authType}' is not supported.`);\n}\nfunction hasCredentials(options) {\n return !!options.jsonData.azureCredentials;\n}\n\nexport { concealed, concealedLegacy, getAdPassword, getClientSecret, getDatasourceCredentials, hasCredentials, isCredentialsComplete, updateDatasourceCredentials };\n//# sourceMappingURL=AzureCredentialsConfig.js.map\n","const ResourceTypes = {\n AnalysisServices: \"microsoft.analysisservices/servers\",\n ApiManagementService: \"microsoft.apimanagement/service\",\n ApplicationGateways: \"microsoft.network/applicationgateways\",\n ApplicationGatewayforContainers: \"microsoft.servicenetworking/trafficcontrollers\",\n ApplicationInsights: \"microsoft.insights/components\",\n AppServiceEnvironments: \"microsoft.web/hostingenvironments\",\n AppServicePlans: \"microsoft.web/serverfarms\",\n AppServices: \"microsoft.web/sites\",\n ArcMachines: \"microsoft.hybridcompute/machines\",\n AutomationAccounts: \"microsoft.automation/automationaccounts\",\n AutonomousDatabases: \"oracle.database/autonomousdatabases\",\n AutoscaleSettings: \"microsoft.insights/autoscalesettings\",\n AzureAD: \"microsoft.aadiam/azureadmetrics\",\n AzureADDomainServices: \"microsoft.aad/domainservices\",\n AzureDatabricks: \"microsoft.databricks/workspaces\",\n AzureBotService: \"microsoft.botservice/botservices\",\n AzureElasticSAN: \"microsoft.elasticsan/elasticsans\",\n AzureResourceManager: \"microsoft.resources/subscriptions\",\n AzureSpringCloud: \"microsoft.appplatform/spring\",\n AzureStackHCI: \"microsoft.azurestackhci/clusters\",\n AzureVMWarePrivateClouds: \"microsoft.avs/privateclouds\",\n AzsResourceMonitor: \"microsoft.azurestackresourcemonitor/storageaccountmonitor\",\n // AzureStack Resource\n BackupVaults: \"microsoft.dataprotection/backupvaults\",\n BareMetalMachine: \"microsoft.networkcloud/baremetalmachines\",\n Bastion: \"microsoft.network/bastionhosts\",\n BatchAccounts: \"microsoft.batch/batchaccounts\",\n BatchAi: \"microsoft.batchai/workspaces\",\n CdnProfile: \"microsoft.cdn/profiles\",\n CdnWafPolicy: \"microsoft.cdn/cdnwebapplicationfirewallpolicies\",\n ClassicCloudServices: \"microsoft.classiccompute/domainnames\",\n CloudServiceExtendedSupport: \"microsoft.compute/cloudservices\",\n ClassicComputeVirtualMachines: \"microsoft.classiccompute/virtualmachines\",\n CloudSimple: \"microsoft.vmwarecloudsimple/virtualmachines\",\n // 3rd party resource\n Cluster: \"microsoft.networkcloud/clusters\",\n ClusterManagers: \"microsoft.networkcloud/clustermanagers\",\n CognitiveServices: \"microsoft.cognitiveservices/accounts\",\n CommunicationsGateways: \"microsoft.voiceservices/communicationsgateways\",\n CodeSigningAccounts: \"microsoft.codesigning/codesigningaccounts\",\n ConfigurationStores: \"microsoft.appconfiguration/configurationstores\",\n Connections: \"microsoft.network/connections\",\n ConnectedVehicle: \"microsoft.connectedvehicle/platformaccounts\",\n ContactProfiles: \"microsoft.orbital/contactprofiles\",\n ContainerApps: \"microsoft.app/containerapps\",\n ContainerAppsEnvironment: \"microsoft.app/managedenvironments\",\n ContainerGroups: \"microsoft.containerinstance/containergroups\",\n ContainerRegistries: \"microsoft.containerregistry/registries\",\n ContainerServicesManaged: \"microsoft.containerservice/managedclusters\",\n CosmosDB: \"microsoft.documentdb/databaseaccounts\",\n CosmosCassandra: \"microsoft.documentdb/cassandraClusters\",\n CosmosMongo: \"microsoft.documentdb/mongoClusters\",\n CustomerInsights: \"microsoft.customerinsights/hubs\",\n CustomMetricUsage: \"microsoft.insights/qos\",\n DataboxEdge: \"microsoft.databoxedge/databoxedgedevices\",\n DataFactories: \"microsoft.datafactory/datafactories\",\n DataFactoriesv2: \"microsoft.datafactory/factories\",\n DataCollectionRules: \"microsoft.insights/datacollectionrules\",\n DataLakeAnalytics: \"microsoft.datalakeanalytics/accounts\",\n DataLakeStore: \"microsoft.datalakestore/accounts\",\n DataShare: \"microsoft.datashare/accounts\",\n DBForMySql: \"microsoft.dbformysql/servers\",\n DeviceProvisioningServices: \"microsoft.devices/provisioningservices\",\n DevCenters: \"microsoft.devcenter/devcenters\",\n Disks: \"microsoft.compute/disks\",\n DNSZones: \"microsoft.network/dnszones\",\n DNSPrivateResolver: \"microsoft.network/dnsresolvers\",\n DNSForwardingRuleset: \"microsoft.network/dnsforwardingrulesets\",\n EnterpriseGraph: \"microsoft.enterpriseknowledgegraph/services\",\n EventGridDomains: \"microsoft.eventgrid/domains\",\n EventGridTopics: \"microsoft.eventgrid/topics\",\n EventGridSystemTopics: \"microsoft.eventgrid/systemtopics\",\n EventHubs: \"microsoft.eventhub/namespaces\",\n EventHubsClusters: \"microsoft.eventhub/clusters\",\n ExpressRouteCircuits: \"microsoft.network/expressroutecircuits\",\n ExpressRouteGateways: \"microsoft.network/expressroutegateways\",\n ExpressRoutePorts: \"microsoft.network/expressrouteports\",\n FabricLocations: \"microsoft.fabric.admin/fabriclocations\",\n // AzureStack Resource\n Firewall: \"microsoft.network/azurefirewalls\",\n FrontDoor: \"microsoft.network/frontdoors\",\n Grafana: \"microsoft.dashboard/grafana\",\n HDInsights: \"microsoft.hdinsight/clusters\",\n IoTCentralApplications: \"microsoft.iotcentral/iotapps\",\n IoTHub: \"microsoft.devices/iothubs\",\n IotSpaces: \"microsoft.iotspaces/graph\",\n KeyVault: \"microsoft.keyvault/vaults\",\n KubernetesArc: \"microsoft.kubernetes/connectedclusters\",\n KustoClusters: \"microsoft.kusto/clusters\",\n Layer2IsolationDomain: \"microsoft.managednetworkfabric/l2isolationdomains\",\n Layer3IsolationDomain: \"microsoft.managednetworkfabric/l3isolationdomains\",\n LoadBalancers: \"microsoft.network/loadbalancers\",\n LogAnalytics: \"microsoft.operationalinsights/workspaces\",\n LogicApps: \"microsoft.logic/workflows\",\n LogicIntegrationServiceEnvironment: \"microsoft.logic/integrationserviceenvironments\",\n MachineLearningServiceWorkspace: \"microsoft.machinelearningservices/workspaces\",\n MariaDB: \"microsoft.dbformariadb/servers\",\n ManagedHsms: \"microsoft.keyvault/managedhsms\",\n ManagedLustre: \"microsoft.storagecache/amlfilesystems\",\n ManagedNetworkFabricNetworkDevices: \"microsoft.managednetworkfabric/networkdevices\",\n MediaServices: \"microsoft.media/mediaservices\",\n MonitorAccounts: \"microsoft.monitor/accounts\",\n MySQLFlexibleServers: \"microsoft.dbformysql/flexibleservers\",\n NatGateway: \"microsoft.network/natgateways\",\n NetworkInterfaces: \"microsoft.network/networkinterfaces\",\n NetworkVirtualAppliances: \"microsoft.network/networkvirtualappliances\",\n NetAppCapacityPools: \"microsoft.netapp/netappaccounts/capacitypools\",\n NetworkWatcher: \"microsoft.network/networkwatchers\",\n NGINXaaS: \"nginx.nginxplus/nginxdeployments\",\n ConnectionMonitor: \"microsoft.network/networkwatchers/connectionmonitors\",\n NotificationHubs: \"microsoft.notificationhubs/namespaces/notificationhubs\",\n OracleExadataVMCluster: \"oracle.database/cloudvmclusters\",\n OracleExadbVMCluster: \"oracle.database/exadbVmClusters\",\n OrbitalL2Connections: \"microsoft.orbital/l2connections\",\n MobileNetworkSite: \"microsoft.mobilenetwork/mobilenetworks/sites\",\n RadioAccessNetwork: \"microsoft.mobilenetwork/radioaccessnetworks\",\n PacketCoreControlPlane: \"microsoft.mobilenetwork/packetcorecontrolplanes\",\n PacketCoreDataPlane: \"microsoft.mobilenetwork/packetcorecontrolplanes/packetcoredataplanes\",\n PeeringServices: \"microsoft.peering/peeringservices\",\n PlayFabTitles: \"microsoft.playfab/titles\",\n PointToSiteVPN: \"microsoft.network/p2svpngateways\",\n PostgreSQLFlexibleServers: \"microsoft.dbforpostgresql/flexibleservers\",\n PostgreSQLServers: \"microsoft.dbforpostgresql/servers\",\n PostgreSQLServersV2: \"microsoft.dbforpostgresql/serversv2\",\n PowerBIDedicatedCapacities: \"microsoft.powerbidedicated/capacities\",\n PrivateEndpoint: \"microsoft.network/privateendpoints\",\n PrivateLinkService: \"microsoft.network/privatelinkservices\",\n ProviderMonitorSettings: \"Microsoft.ProviderHub/providerMonitorSettings\",\n ProvisionedClusters: \"microsoft.hybridcontainerservice/provisionedclusters\",\n PublicIPAddresses: \"microsoft.network/publicipaddresses\",\n PublicIPPrefixes: \"microsoft.network/publicipprefixes\",\n RecoveryServicesVault: \"microsoft.recoveryservices/vaults\",\n RedisCaches: \"microsoft.cache/redis\",\n RedisEnterprise: \"microsoft.cache/redisenterprise\",\n Relay: \"microsoft.relay/namespaces\",\n SearchServices: \"microsoft.search/searchservices\",\n ServerGroups: \"microsoft.dbforpostgresql/servergroupsv2\",\n ServiceBus: \"microsoft.servicebus/namespaces\",\n ServiceFabricMesh: \"microsoft.servicefabricmesh/applications\",\n SignalRService: \"microsoft.signalrservice/signalr\",\n SignalRServiceWebPubSub: \"microsoft.signalrservice/webpubsub\",\n Solutions: \"microsoft.operationsmanagement/solutions\",\n Spacecrafts: \"microsoft.orbital/spacecrafts\",\n SqlManaged: \"microsoft.sql/managedinstances\",\n SqlServersDatabases: \"microsoft.sql/servers/databases\",\n SqlServersElasticPools: \"microsoft.sql/servers/elasticpools\",\n SqlServersElasticJobAgents: \"microsoft.sql/servers/jobagents\",\n StaticSites: \"Microsoft.web/staticSites\",\n Storage: \"microsoft.storage/storageaccounts\",\n StorageAppliance: \"microsoft.networkcloud/storageappliances\",\n StorageCaches: \"microsoft.storagecache/caches\",\n StorageMover: \"microsoft.storagemover/storagemovers\",\n StorageClassic: \"microsoft.classicstorage/storageaccounts\",\n StorageSync: \"microsoft.storagesync/storagesyncservices\",\n StreamAnalyticsJobs: \"microsoft.streamanalytics/streamingjobs\",\n SynapseWorkspace: \"microsoft.synapse/workspaces\",\n TimeseriesInsightsEnvironments: \"microsoft.timeseriesinsights/environments\",\n TrafficManagerProfiles: \"microsoft.network/trafficmanagerprofiles\",\n VirtualHubs: \"microsoft.network/virtualhubs\",\n VirtualMachines: \"microsoft.compute/virtualmachines\",\n VirtualMachinesScaleSets: \"microsoft.compute/virtualmachinescalesets\",\n VirtualNetworkFunctions: \"microsoft.hybridnetwork/virtualnetworkfunctions\",\n VirtualNetworkGateWays: \"microsoft.network/virtualnetworkgateways\",\n VirtualWANs: \"microsoft.network/virtualwans\",\n VPNGateways: \"microsoft.network/vpngateways\",\n WebsitesSlots: \"microsoft.web/sites/slots\",\n WorkerPools: \"microsoft.web/hostingenvironments/workerpools\",\n ActivityLogAlertRules: \"microsoft.insights/activitylogalerts\",\n MetricAlertRules: \"microsoft.insights/metricalerts\",\n LogAlertRules: \"microsoft.insights/scheduledqueryrules\",\n ActionGroups: \"microsoft.insights/actiongroups\",\n AlertProcessingRules: \"microsoft.alertsmanagement/actionrules\",\n SmartAlertRules: \"microsoft.alertsmanagement/smartdetectoralertrules\",\n PrometheusRuleGroups: \"microsoft.alertsmanagement/prometheusrulegroups\"\n};\n\nexport { ResourceTypes };\n//# sourceMappingURL=ResourceTypes.js.map\n","import { ResourceTypes } from './ResourceTypes.js';\n\nconst MetricsSupportedTypes = [\n ResourceTypes.AnalysisServices,\n ResourceTypes.ApiManagementService,\n ResourceTypes.ApplicationGateways,\n ResourceTypes.ApplicationGatewayforContainers,\n ResourceTypes.ApplicationInsights,\n ResourceTypes.AppServiceEnvironments,\n ResourceTypes.AppServicePlans,\n ResourceTypes.AppServices,\n ResourceTypes.AutomationAccounts,\n ResourceTypes.AutonomousDatabases,\n ResourceTypes.AzureADDomainServices,\n ResourceTypes.AzureBotService,\n ResourceTypes.AzureDatabricks,\n ResourceTypes.AzureElasticSAN,\n ResourceTypes.AzureSpringCloud,\n ResourceTypes.AzureStackHCI,\n ResourceTypes.AzureVMWarePrivateClouds,\n ResourceTypes.BackupVaults,\n ResourceTypes.BareMetalMachine,\n ResourceTypes.Bastion,\n ResourceTypes.BatchAccounts,\n ResourceTypes.DataCollectionRules,\n ResourceTypes.BatchAi,\n ResourceTypes.CdnProfile,\n ResourceTypes.CdnWafPolicy,\n ResourceTypes.ClassicCloudServices,\n ResourceTypes.ClassicComputeVirtualMachines,\n ResourceTypes.CloudServiceExtendedSupport,\n ResourceTypes.CloudSimple,\n ResourceTypes.Cluster,\n ResourceTypes.ClusterManagers,\n ResourceTypes.CodeSigningAccounts,\n ResourceTypes.CognitiveServices,\n ResourceTypes.CommunicationsGateways,\n ResourceTypes.ConfigurationStores,\n ResourceTypes.Connections,\n ResourceTypes.ConnectedVehicle,\n ResourceTypes.ContainerAppsEnvironment,\n ResourceTypes.ContainerGroups,\n ResourceTypes.ContainerRegistries,\n ResourceTypes.ContainerServicesManaged,\n ResourceTypes.CosmosDB,\n ResourceTypes.CosmosCassandra,\n ResourceTypes.CosmosMongo,\n ResourceTypes.DataboxEdge,\n ResourceTypes.DataFactories,\n ResourceTypes.DataFactoriesv2,\n ResourceTypes.DataLakeAnalytics,\n ResourceTypes.DataLakeStore,\n ResourceTypes.DataShare,\n ResourceTypes.DBForMySql,\n ResourceTypes.DeviceProvisioningServices,\n ResourceTypes.DevCenters,\n ResourceTypes.Disks,\n ResourceTypes.DNSZones,\n ResourceTypes.DNSPrivateResolver,\n ResourceTypes.DNSForwardingRuleset,\n ResourceTypes.EnterpriseGraph,\n ResourceTypes.EventGridDomains,\n ResourceTypes.EventGridTopics,\n ResourceTypes.EventGridSystemTopics,\n ResourceTypes.EventHubs,\n ResourceTypes.EventHubsClusters,\n ResourceTypes.ExpressRouteCircuits,\n ResourceTypes.ExpressRoutePorts,\n ResourceTypes.Firewall,\n ResourceTypes.FrontDoor,\n ResourceTypes.HDInsights,\n ResourceTypes.IoTCentralApplications,\n ResourceTypes.IoTHub,\n ResourceTypes.IotSpaces,\n ResourceTypes.KeyVault,\n ResourceTypes.KubernetesArc,\n ResourceTypes.KustoClusters,\n ResourceTypes.Layer2IsolationDomain,\n ResourceTypes.Layer3IsolationDomain,\n ResourceTypes.LoadBalancers,\n ResourceTypes.LogAnalytics,\n ResourceTypes.LogicApps,\n ResourceTypes.LogicIntegrationServiceEnvironment,\n ResourceTypes.MachineLearningServiceWorkspace,\n ResourceTypes.ManagedNetworkFabricNetworkDevices,\n ResourceTypes.MariaDB,\n ResourceTypes.ManagedHsms,\n ResourceTypes.MediaServices,\n ResourceTypes.MonitorAccounts,\n ResourceTypes.MySQLFlexibleServers,\n ResourceTypes.NatGateway,\n ResourceTypes.NetAppCapacityPools,\n ResourceTypes.NetworkInterfaces,\n ResourceTypes.NGINXaaS,\n ResourceTypes.NotificationHubs,\n ResourceTypes.OracleExadataVMCluster,\n ResourceTypes.OracleExadbVMCluster,\n ResourceTypes.OrbitalL2Connections,\n ResourceTypes.MobileNetworkSite,\n ResourceTypes.RadioAccessNetwork,\n ResourceTypes.PacketCoreControlPlane,\n ResourceTypes.PacketCoreDataPlane,\n ResourceTypes.PeeringServices,\n ResourceTypes.PlayFabTitles,\n ResourceTypes.PostgreSQLServers,\n ResourceTypes.PostgreSQLServersV2,\n ResourceTypes.PowerBIDedicatedCapacities,\n ResourceTypes.PrivateEndpoint,\n ResourceTypes.PrivateLinkService,\n ResourceTypes.ProviderMonitorSettings,\n ResourceTypes.ProvisionedClusters,\n ResourceTypes.PublicIPAddresses,\n ResourceTypes.PublicIPPrefixes,\n ResourceTypes.RecoveryServicesVault,\n ResourceTypes.RedisCaches,\n ResourceTypes.RedisEnterprise,\n ResourceTypes.Relay,\n ResourceTypes.SearchServices,\n ResourceTypes.ServerGroups,\n ResourceTypes.ServiceBus,\n ResourceTypes.ServiceFabricMesh,\n ResourceTypes.SignalRService,\n ResourceTypes.SignalRServiceWebPubSub,\n ResourceTypes.Solutions,\n ResourceTypes.SqlManaged,\n ResourceTypes.SqlServersDatabases,\n ResourceTypes.SqlServersElasticPools,\n ResourceTypes.SqlServersElasticJobAgents,\n ResourceTypes.StaticSites,\n ResourceTypes.Storage,\n ResourceTypes.StorageAppliance,\n ResourceTypes.StorageCaches,\n ResourceTypes.StorageClassic,\n ResourceTypes.StorageMover,\n ResourceTypes.StorageSync,\n ResourceTypes.StreamAnalyticsJobs,\n ResourceTypes.SynapseWorkspace,\n ResourceTypes.TimeseriesInsightsEnvironments,\n ResourceTypes.TrafficManagerProfiles,\n ResourceTypes.VirtualMachines,\n ResourceTypes.VirtualMachinesScaleSets,\n ResourceTypes.VirtualNetworkGateWays,\n ResourceTypes.WebsitesSlots,\n ResourceTypes.AutoscaleSettings,\n ResourceTypes.AzureAD,\n ResourceTypes.AzsResourceMonitor,\n ResourceTypes.ConnectionMonitor,\n ResourceTypes.ContainerApps,\n ResourceTypes.CustomerInsights,\n ResourceTypes.ExpressRouteGateways,\n ResourceTypes.FabricLocations,\n ResourceTypes.NetworkVirtualAppliances,\n ResourceTypes.NetworkWatcher,\n ResourceTypes.PointToSiteVPN,\n ResourceTypes.PostgreSQLFlexibleServers,\n ResourceTypes.VPNGateways,\n ResourceTypes.VirtualHubs,\n ResourceTypes.WorkerPools,\n ResourceTypes.ManagedLustre,\n ResourceTypes.Grafana,\n ResourceTypes.ContactProfiles,\n ResourceTypes.Spacecrafts\n];\n\nexport { MetricsSupportedTypes };\n//# sourceMappingURL=MetricsResourceTypes.js.map\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/AlertingSettingsOverhaul.tsx\nimport { cx } from '@emotion/css';\n\nimport { DataSourceJsonData, DataSourcePluginOptionsEditorProps } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Trans, t } from '@grafana/i18n';\nimport { ConfigSubSection } from '@grafana/plugin-ui';\nimport { config } from '@grafana/runtime';\nimport { InlineField, Switch, useTheme2 } from '@grafana/ui';\n\nimport { docsTip, overhaulStyles } from './shared/utils';\n\ninterface Props<T extends DataSourceJsonData>\n extends Pick<DataSourcePluginOptionsEditorProps<T>, 'options' | 'onOptionsChange'> {}\n\ninterface AlertingConfig extends DataSourceJsonData {\n manageAlerts?: boolean;\n allowAsRecordingRulesTarget?: boolean;\n}\n\nexport function AlertingSettingsOverhaul<T extends AlertingConfig>({\n options,\n onOptionsChange,\n}: Props<T>): JSX.Element {\n const theme = useTheme2();\n // imported GrafanaTheme2 from @grafana/data does not match type of same from @grafana/ui\n // @ts-ignore\n const styles = overhaulStyles(theme);\n\n return (\n <ConfigSubSection\n title={t('grafana-prometheus.configuration.alerting-settings-overhaul.title-alerting', 'Alerting')}\n className={cx(styles.container, styles.alertingTop)}\n >\n <div className=\"gf-form-group\">\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineField\n labelWidth={30}\n label={t(\n 'grafana-prometheus.configuration.alerting-settings-overhaul.label-manage-alerts-via-alerting-ui',\n 'Manage alerts via Alerting UI'\n )}\n disabled={options.readOnly}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.alerting-settings-overhaul.tooltip-manage-alerts-via-alerting-ui\">\n Manage alert rules for this data source. To manage other alerting resources, add an Alertmanager\n data source.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n interactive={true}\n className={styles.switchField}\n >\n <Switch\n value={options.jsonData.manageAlerts ?? config.defaultDatasourceManageAlertsUiToggle}\n onChange={(event) =>\n onOptionsChange({\n ...options,\n jsonData: { ...options.jsonData, manageAlerts: event!.currentTarget.checked },\n })\n }\n id={selectors.components.DataSource.Prometheus.configPage.manageAlerts}\n />\n </InlineField>\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineField\n labelWidth={30}\n label={t(\n 'grafana-prometheus.configuration.alerting-settings-overhaul.label-allow-as-recording-rules-target',\n 'Allow as recording rules target'\n )}\n disabled={options.readOnly}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.alerting-settings-overhaul.tooltip-allow-as-recording-rules-target\">\n Allow this data source to be selected as a target for writing recording rules.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n interactive={true}\n className={styles.switchField}\n >\n <Switch\n value={\n options.jsonData.allowAsRecordingRulesTarget ?? config.defaultAllowRecordingRulesTargetAlertsUiToggle\n }\n onChange={(event) =>\n onOptionsChange({\n ...options,\n jsonData: { ...options.jsonData, allowAsRecordingRulesTarget: event!.currentTarget.checked },\n })\n }\n id={selectors.components.DataSource.Prometheus.configPage.allowAsRecordingRulesTarget}\n />\n </InlineField>\n </div>\n </div>\n </div>\n </ConfigSubSection>\n );\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/ExemplarSetting.tsx\nimport { useState } from 'react';\n\nimport { DataSourceInstanceSettings } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Trans, t } from '@grafana/i18n';\nimport { config, DataSourcePicker } from '@grafana/runtime';\nimport { Button, InlineField, Input, Switch, useTheme2 } from '@grafana/ui';\n\nimport { PROM_CONFIG_LABEL_WIDTH } from '../constants';\nimport { ExemplarTraceIdDestination } from '../types';\n\nimport { docsTip, overhaulStyles } from './shared/utils';\n\ntype Props = {\n value: ExemplarTraceIdDestination;\n onChange: (value: ExemplarTraceIdDestination) => void;\n onDelete: () => void;\n disabled?: boolean;\n};\n\nexport function ExemplarSetting({ value, onChange, onDelete, disabled }: Props) {\n const [isInternalLink, setIsInternalLink] = useState(Boolean(value.datasourceUid));\n\n const theme = useTheme2();\n const styles = overhaulStyles(theme);\n\n return (\n <div className=\"gf-form-group\">\n <InlineField\n label={t('grafana-prometheus.configuration.exemplar-setting.label-internal-link', 'Internal link')}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n disabled={disabled}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.exemplar-setting.tooltip-internal-link\">\n Enable this option if you have an internal link. When enabled, this reveals the data source selector.\n Select the backend tracing data store for your exemplar data.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n interactive={true}\n className={styles.switchField}\n >\n <>\n <Switch\n value={isInternalLink}\n data-testid={selectors.components.DataSource.Prometheus.configPage.internalLinkSwitch}\n onChange={(ev) => setIsInternalLink(ev.currentTarget.checked)}\n />\n </>\n </InlineField>\n\n {isInternalLink ? (\n <InlineField\n label={t('grafana-prometheus.configuration.exemplar-setting.label-data-source', 'Data source')}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.exemplar-setting.tooltip-data-source\">\n The data source the exemplar is going to navigate to.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n disabled={disabled}\n interactive={true}\n >\n <DataSourcePicker\n filter={\n config.featureToggles.azureMonitorPrometheusExemplars\n ? undefined\n : (ds) => ds.type !== 'grafana-azure-monitor-datasource'\n }\n tracing={true}\n current={value.datasourceUid}\n noDefault={true}\n width={40}\n onChange={(ds: DataSourceInstanceSettings) =>\n onChange({\n ...value,\n datasourceUid: ds.uid,\n url: undefined,\n })\n }\n />\n </InlineField>\n ) : (\n <InlineField\n label={t('grafana-prometheus.configuration.exemplar-setting.label-url', 'URL')}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.exemplar-setting.tooltip-url\">\n The URL of the trace backend the user would go to see its trace\n </Trans>{' '}\n {docsTip()}\n </>\n }\n disabled={disabled}\n interactive={true}\n >\n <Input\n placeholder={t(\n 'grafana-prometheus.configuration.exemplar-setting.placeholder-httpsexamplecomvalueraw',\n 'https://example.com/${__value.raw}'\n )}\n spellCheck={false}\n width={40}\n value={value.url}\n onChange={(event) =>\n onChange({\n ...value,\n datasourceUid: undefined,\n url: event.currentTarget.value,\n })\n }\n />\n </InlineField>\n )}\n\n <InlineField\n label={t('grafana-prometheus.configuration.exemplar-setting.label-url-label', 'URL Label')}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.exemplar-setting.tooltip-url-label\">\n Use to override the button label on the exemplar traceID field.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n disabled={disabled}\n interactive={true}\n >\n <Input\n placeholder={t(\n 'grafana-prometheus.configuration.exemplar-setting.placeholder-go-to-examplecom',\n 'Go to example.com'\n )}\n spellCheck={false}\n width={40}\n value={value.urlDisplayLabel}\n onChange={(event) =>\n onChange({\n ...value,\n urlDisplayLabel: event.currentTarget.value,\n })\n }\n />\n </InlineField>\n <InlineField\n label={t('grafana-prometheus.configuration.exemplar-setting.label-label-name', 'Label name')}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.exemplar-setting.tooltip-label-name\">\n The name of the field in the labels object that should be used to get the traceID.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n disabled={disabled}\n interactive={true}\n >\n <Input\n placeholder={t('grafana-prometheus.configuration.exemplar-setting.placeholder-trace-id', '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 {!disabled && (\n <InlineField\n label={t(\n 'grafana-prometheus.configuration.exemplar-setting.label-remove-exemplar-link',\n 'Remove exemplar link'\n )}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n disabled={disabled}\n >\n <Button\n variant=\"destructive\"\n aria-label={t(\n 'grafana-prometheus.configuration.exemplar-setting.title-remove-exemplar-link',\n 'Remove exemplar link'\n )}\n icon=\"times\"\n onClick={(event) => {\n event.preventDefault();\n onDelete();\n }}\n />\n </InlineField>\n )}\n </div>\n );\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/ExemplarsSettings.tsx\nimport { css } from '@emotion/css';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t, Trans } from '@grafana/i18n';\nimport { ConfigSubSection } from '@grafana/plugin-ui';\nimport { Button, useTheme2 } from '@grafana/ui';\n\nimport { ExemplarTraceIdDestination } from '../types';\n\nimport { ExemplarSetting } from './ExemplarSetting';\nimport { overhaulStyles } from './shared/utils';\n\ntype Props = {\n options?: ExemplarTraceIdDestination[];\n onChange: (value: ExemplarTraceIdDestination[]) => void;\n disabled?: boolean;\n};\n\nexport function ExemplarsSettings({ options, onChange, disabled }: Props) {\n const theme = useTheme2();\n const styles = overhaulStyles(theme);\n return (\n <div className={styles.sectionBottomPadding}>\n <ConfigSubSection\n title={t('grafana-prometheus.configuration.exemplars-settings.title-exemplars', 'Exemplars')}\n className={styles.container}\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 disabled={disabled}\n />\n );\n })}\n\n {!disabled && (\n <Button\n variant=\"secondary\"\n data-testid={selectors.components.DataSource.Prometheus.configPage.exemplarsAddButton}\n className={css({\n marginBottom: '10px',\n })}\n icon=\"plus\"\n onClick={(event) => {\n event.preventDefault();\n const newOptions = [...(options || []), { name: 'traceID' }];\n onChange(newOptions);\n }}\n >\n <Trans i18nKey=\"grafana-prometheus.configuration.exemplars-settings.add\">Add</Trans>\n </Button>\n )}\n {disabled && !options && (\n <i>\n <Trans i18nKey=\"grafana-prometheus.configuration.exemplars-settings.no-exemplars-configurations\">\n No exemplars configurations\n </Trans>\n </i>\n )}\n </ConfigSubSection>\n </div>\n );\n}\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/PromFlavorVersions.ts\nexport const PromFlavorVersions: { [index: string]: Array<{ value?: string; label: string }> } = {\n Prometheus: [\n { value: undefined, label: 'Please select' },\n { value: '2.0.0', label: '< 2.14.x' },\n { value: '2.14.0', label: '2.14.x' },\n { value: '2.15.0', label: '2.15.x' },\n { value: '2.16.0', label: '2.16.x' },\n { value: '2.17.0', label: '2.17.x' },\n { value: '2.18.0', label: '2.18.x' },\n { value: '2.19.0', label: '2.19.x' },\n { value: '2.20.0', label: '2.20.x' },\n { value: '2.21.0', label: '2.21.x' },\n { value: '2.22.0', label: '2.22.x' },\n { value: '2.23.0', label: '2.23.x' },\n { value: '2.24.0', label: '2.24.x' },\n { value: '2.25.0', label: '2.25.x' },\n { value: '2.26.0', label: '2.26.x' },\n { value: '2.27.0', label: '2.27.x' },\n { value: '2.28.0', label: '2.28.x' },\n { value: '2.29.0', label: '2.29.x' },\n { value: '2.30.0', label: '2.30.x' },\n { value: '2.31.0', label: '2.31.x' },\n { value: '2.32.0', label: '2.32.x' },\n { value: '2.33.0', label: '2.33.x' },\n { value: '2.34.0', label: '2.34.x' },\n { value: '2.35.0', label: '2.35.x' },\n { value: '2.36.0', label: '2.36.x' },\n { value: '2.37.0', label: '2.37.x' },\n { value: '2.38.0', label: '2.38.x' },\n { value: '2.39.0', label: '2.39.x' },\n { value: '2.40.0', label: '2.40.x' },\n { value: '2.41.0', label: '2.41.x' },\n { value: '2.42.0', label: '2.42.x' },\n { value: '2.43.0', label: '2.43.x' },\n { value: '2.44.0', label: '2.44.x' },\n { value: '2.45.0', label: '2.45.x' },\n { value: '2.46.0', label: '2.46.x' },\n { value: '2.47.0', label: '2.47.x' },\n { value: '2.48.0', label: '2.48.x' },\n { value: '2.49.0', label: '2.49.x' },\n { value: '2.50.0', label: '2.50.x' },\n\n // This value will be returned for future versions of prometheus until we add new entries to this object\n { value: '2.50.1', label: '> 2.50.x' },\n ],\n Mimir: [\n { value: undefined, label: 'Please select' },\n { value: '2.0.0', label: '2.0.x' },\n { value: '2.1.0', label: '2.1.x' },\n { value: '2.2.0', label: '2.2.x' },\n { value: '2.3.0', label: '2.3.x' },\n { value: '2.4.0', label: '2.4.x' },\n { value: '2.5.0', label: '2.5.x' },\n { value: '2.6.0', label: '2.6.x' },\n { value: '2.7.0', label: '2.7.x' },\n { value: '2.8.0', label: '2.8.x' },\n { value: '2.9.0', label: '2.9.x' },\n { value: '2.9.1', label: '> 2.9.x' },\n ],\n Thanos: [\n { value: undefined, label: 'Please select' },\n { value: '0.0.0', label: '< 0.16.x' },\n { value: '0.16.0', label: '0.16.x' },\n { value: '0.17.0', label: '0.17.x' },\n { value: '0.18.0', label: '0.18.x' },\n { value: '0.19.0', label: '0.19.x' },\n { value: '0.20.0', label: '0.20.x' },\n { value: '0.21.0', label: '0.21.x' },\n { value: '0.22.0', label: '0.22.x' },\n { value: '0.23.0', label: '0.23.x' },\n { value: '0.24.0', label: '0.24.x' },\n { value: '0.25.0', label: '0.25.x' },\n { value: '0.26.0', label: '0.26.x' },\n { value: '0.27.0', label: '0.27.x' },\n { value: '0.28.0', label: '0.28.x' },\n { value: '0.29.0', label: '0.29.x' },\n { value: '0.30.0', label: '0.30.x' },\n { value: '0.31.0', label: '0.31.x' },\n { value: '0.31.1', label: '> 0.31.x' },\n ],\n Cortex: [\n { value: undefined, label: 'Please select' },\n { value: '0.0.0', label: '< 1.0.0' },\n { value: '1.0.0', label: '1.0.0' },\n { value: '1.1.0', label: '1.1.x' },\n { value: '1.2.0', label: '1.2.x' },\n { value: '1.3.0', label: '1.3.x' },\n { value: '1.4.0', label: '1.4.x' },\n { value: '1.5.0', label: '1.5.x' },\n { value: '1.6.0', label: '1.6.x' },\n { value: '1.7.0', label: '1.7.x' },\n { value: '1.8.0', label: '1.8.x' },\n { value: '1.9.0', label: '1.9.x' },\n { value: '1.10.0', label: '1.10.x' },\n { value: '1.11.0', label: '1.11.x' },\n { value: '1.13.0', label: '1.13.x' },\n { value: '1.14.0', label: '> 1.13.x' },\n ],\n};\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/PromSettings.tsx\nimport { SyntheticEvent, useState } from 'react';\n\nimport {\n DataSourcePluginOptionsEditorProps,\n DataSourceSettings,\n onUpdateDatasourceJsonDataOptionChecked,\n SelectableValue,\n updateDatasourcePluginJsonDataOption,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Trans, t } from '@grafana/i18n';\nimport { ConfigSubSection } from '@grafana/plugin-ui';\nimport { InlineField, Input, Select, Switch, TextLink, useTheme2 } from '@grafana/ui';\n\nimport {\n DEFAULT_SERIES_LIMIT,\n DURATION_REGEX,\n durationError,\n MULTIPLE_DURATION_REGEX,\n NON_NEGATIVE_INTEGER_REGEX,\n PROM_CONFIG_LABEL_WIDTH,\n seriesLimitError,\n} from '../constants';\nimport { QueryEditorMode } from '../querybuilder/shared/types';\nimport { defaultPrometheusQueryOverlapWindow } from '../querycache/QueryCache';\nimport { PromApplication, PrometheusCacheLevel, PromOptions } from '../types';\n\nimport { ExemplarsSettings } from './ExemplarsSettings';\nimport { PromFlavorVersions } from './PromFlavorVersions';\nimport { docsTip, overhaulStyles, validateInput } from './shared/utils';\n\ntype Props = Pick<DataSourcePluginOptionsEditorProps<PromOptions>, 'options' | 'onOptionsChange'>;\n\nconst httpOptions = [\n { value: 'POST', label: 'POST' },\n { value: 'GET', label: 'GET' },\n];\n\nconst cacheValueOptions = [\n { value: PrometheusCacheLevel.Low, label: 'Low' },\n { value: PrometheusCacheLevel.Medium, label: 'Medium' },\n { value: PrometheusCacheLevel.High, label: 'High' },\n { value: PrometheusCacheLevel.None, label: 'None' },\n];\n\ntype PrometheusSelectItemsType = Array<{ value: PromApplication; label: PromApplication }>;\n\ntype ValidDuration = {\n timeInterval: string;\n queryTimeout: string;\n incrementalQueryOverlapWindow: string;\n};\n\nconst prometheusFlavorSelectItems: PrometheusSelectItemsType = [\n { value: PromApplication.Prometheus, label: PromApplication.Prometheus },\n { value: PromApplication.Cortex, label: PromApplication.Cortex },\n { value: PromApplication.Mimir, label: PromApplication.Mimir },\n { value: PromApplication.Thanos, label: PromApplication.Thanos },\n];\n\nconst getOptionsWithDefaults = (options: DataSourceSettings<PromOptions>) => {\n if (options.jsonData.httpMethod) {\n return options;\n }\n\n // We are explicitly adding httpMethod so, it is correctly displayed in dropdown.\n // This way, it is more predictable for users.\n return { ...options, jsonData: { ...options.jsonData, httpMethod: 'POST' } };\n};\n\nexport const PromSettings = (props: Props) => {\n const theme = useTheme2();\n const styles = overhaulStyles(theme);\n const { onOptionsChange } = props;\n\n const editorOptions = [\n {\n value: QueryEditorMode.Builder,\n label: t('grafana-prometheus.configuration.prom-settings.editor-options.label-builder', 'Builder'),\n },\n {\n value: QueryEditorMode.Code,\n label: t('grafana-prometheus.configuration.prom-settings.editor-options.label-code', 'Code'),\n },\n ];\n\n const optionsWithDefaults = getOptionsWithDefaults(props.options);\n const [validDuration, updateValidDuration] = useState<ValidDuration>({\n timeInterval: '',\n queryTimeout: '',\n incrementalQueryOverlapWindow: '',\n });\n\n const [seriesLimit, setSeriesLimit] = useState<string>(\n optionsWithDefaults.jsonData.seriesLimit?.toString() || `${DEFAULT_SERIES_LIMIT}`\n );\n\n return (\n <>\n <ConfigSubSection\n title={t('grafana-prometheus.configuration.prom-settings.title-interval-behaviour', 'Interval behaviour')}\n className={styles.container}\n >\n <div className=\"gf-form-group\">\n {/* Scrape interval */}\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineField\n label={t('grafana-prometheus.configuration.prom-settings.label-scrape-interval', 'Scrape interval')}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans\n i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-scrape-interval\"\n values={{ default: '15s' }}\n >\n This interval is how frequently Prometheus scrapes targets. Set this to the typical scrape and\n evaluation interval configured in your Prometheus config file. If you set this to a greater value\n than your Prometheus config file interval, Grafana will evaluate the data according to this\n interval and you will see less data points. Defaults to {'{{default}}'}.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n interactive={true}\n disabled={optionsWithDefaults.readOnly}\n >\n <>\n <Input\n className=\"width-20\"\n value={optionsWithDefaults.jsonData.timeInterval}\n spellCheck={false}\n // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n placeholder=\"15s\"\n onChange={onChangeHandler('timeInterval', optionsWithDefaults, onOptionsChange)}\n onBlur={(e) =>\n updateValidDuration({\n ...validDuration,\n timeInterval: e.currentTarget.value,\n })\n }\n data-testid={selectors.components.DataSource.Prometheus.configPage.scrapeInterval}\n />\n {validateInput(validDuration.timeInterval, DURATION_REGEX, durationError)}\n </>\n </InlineField>\n </div>\n </div>\n {/* Query Timeout */}\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineField\n label={t('grafana-prometheus.configuration.prom-settings.label-query-timeout', 'Query timeout')}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-query-timeout\">\n Set the Prometheus query timeout.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n interactive={true}\n disabled={optionsWithDefaults.readOnly}\n >\n <>\n <Input\n className=\"width-20\"\n value={optionsWithDefaults.jsonData.queryTimeout}\n onChange={onChangeHandler('queryTimeout', optionsWithDefaults, onOptionsChange)}\n spellCheck={false}\n // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n placeholder=\"60s\"\n onBlur={(e) =>\n updateValidDuration({\n ...validDuration,\n queryTimeout: e.currentTarget.value,\n })\n }\n data-testid={selectors.components.DataSource.Prometheus.configPage.queryTimeout}\n />\n {validateInput(validDuration.queryTimeout, DURATION_REGEX, durationError)}\n </>\n </InlineField>\n </div>\n </div>\n </div>\n </ConfigSubSection>\n\n <ConfigSubSection\n title={t('grafana-prometheus.configuration.prom-settings.title-query-editor', 'Query editor')}\n className={styles.container}\n >\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <InlineField\n label={t('grafana-prometheus.configuration.prom-settings.label-default-editor', 'Default editor')}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-default-editor\">\n Set default editor option for all users of this data source.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n interactive={true}\n disabled={optionsWithDefaults.readOnly}\n >\n <Select\n aria-label={t(\n 'grafana-prometheus.configuration.prom-settings.aria-label-default-editor',\n 'Default Editor (Code or Builder)'\n )}\n options={editorOptions}\n value={\n editorOptions.find((o) => o.value === optionsWithDefaults.jsonData.defaultEditor) ??\n editorOptions.find((o) => o.value === QueryEditorMode.Builder)\n }\n onChange={onChangeHandler('defaultEditor', optionsWithDefaults, onOptionsChange)}\n width={40}\n data-testid={selectors.components.DataSource.Prometheus.configPage.defaultEditor}\n />\n </InlineField>\n </div>\n <div className=\"gf-form\">\n <InlineField\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n label={t(\n 'grafana-prometheus.configuration.prom-settings.label-disable-metrics-lookup',\n 'Disable metrics lookup'\n )}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-disable-metrics-lookup\">\n Checking this option will disable the metrics chooser and metric/label support in the query\n field's autocomplete. This helps if you have performance issues with bigger Prometheus\n instances.{' '}\n </Trans>\n {docsTip()}\n </>\n }\n interactive={true}\n disabled={optionsWithDefaults.readOnly}\n className={styles.switchField}\n >\n <Switch\n value={optionsWithDefaults.jsonData.disableMetricsLookup ?? false}\n onChange={onUpdateDatasourceJsonDataOptionChecked(props, 'disableMetricsLookup')}\n id={selectors.components.DataSource.Prometheus.configPage.disableMetricLookup}\n />\n </InlineField>\n </div>\n </div>\n </ConfigSubSection>\n\n <ConfigSubSection\n title={t('grafana-prometheus.configuration.prom-settings.title-performance', 'Performance')}\n className={styles.container}\n >\n {!optionsWithDefaults.jsonData.prometheusType &&\n !optionsWithDefaults.jsonData.prometheusVersion &&\n optionsWithDefaults.readOnly && (\n <div className={styles.versionMargin}>\n <Trans i18nKey=\"grafana-prometheus.configuration.prom-settings.more-info\">\n For more information on configuring prometheus type and version in data sources, see the{' '}\n <TextLink external href=\"https://grafana.com/docs/grafana/latest/administration/provisioning/\">\n provisioning documentation\n </TextLink>\n .\n </Trans>\n </div>\n )}\n <div className=\"gf-form-group\">\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineField\n label={t('grafana-prometheus.configuration.prom-settings.label-prometheus-type', 'Prometheus type')}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n {/* , and attempt to detect the version */}\n <Trans i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-prometheus-type\">\n Set this to the type of your prometheus database, e.g. Prometheus, Cortex, Mimir or Thanos.\n Changing this field will save your current settings. Certain types of Prometheus supports or does\n not support various APIs. For example, some types support regex matching for label queries to\n improve performance. Some types have an API for metadata. If you set this incorrectly you may\n experience odd behavior when querying metrics and labels. Please check your Prometheus\n documentation to ensure you enter the correct type.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n interactive={true}\n disabled={optionsWithDefaults.readOnly}\n >\n <Select\n aria-label={t(\n 'grafana-prometheus.configuration.prom-settings.aria-label-prometheus-type',\n 'Prometheus type'\n )}\n options={prometheusFlavorSelectItems}\n value={prometheusFlavorSelectItems.find(\n (o) => o.value === optionsWithDefaults.jsonData.prometheusType\n )}\n onChange={onChangeHandler('prometheusType', optionsWithDefaults, onOptionsChange)}\n width={40}\n data-testid={selectors.components.DataSource.Prometheus.configPage.prometheusType}\n />\n </InlineField>\n </div>\n </div>\n <div className=\"gf-form-inline\">\n {optionsWithDefaults.jsonData.prometheusType && (\n <div className=\"gf-form\">\n <InlineField\n label={t(\n 'grafana-prometheus.configuration.prom-settings.label-prom-type-version',\n '{{promType}} version',\n {\n promType: optionsWithDefaults.jsonData.prometheusType,\n }\n )}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans\n i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-prom-type-version\"\n values={{ promType: optionsWithDefaults.jsonData.prometheusType }}\n >\n Use this to set the version of your {'{{promType}}'} instance if it is not automatically\n configured.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n interactive={true}\n disabled={optionsWithDefaults.readOnly}\n >\n <Select\n aria-label={t(\n 'grafana-prometheus.configuration.prom-settings.aria-label-prom-type-type',\n '{{promType}} type',\n {\n promType: optionsWithDefaults.jsonData.prometheusType,\n }\n )}\n options={PromFlavorVersions[optionsWithDefaults.jsonData.prometheusType]}\n value={PromFlavorVersions[optionsWithDefaults.jsonData.prometheusType]?.find(\n (o) => o.value === optionsWithDefaults.jsonData.prometheusVersion\n )}\n onChange={onChangeHandler('prometheusVersion', optionsWithDefaults, onOptionsChange)}\n width={40}\n data-testid={selectors.components.DataSource.Prometheus.configPage.prometheusVersion}\n />\n </InlineField>\n </div>\n )}\n </div>\n\n <div className=\"gf-form-inline\">\n <div className=\"gf-form max-width-30\">\n <InlineField\n label={t('grafana-prometheus.configuration.prom-settings.label-cache-level', 'Cache level')}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-cache-level\">\n Sets the browser caching level for editor queries. Higher cache settings are recommended for high\n cardinality data sources.\n </Trans>\n </>\n }\n interactive={true}\n disabled={optionsWithDefaults.readOnly}\n >\n <Select\n width={40}\n onChange={onChangeHandler('cacheLevel', optionsWithDefaults, onOptionsChange)}\n options={cacheValueOptions}\n value={\n cacheValueOptions.find((o) => o.value === optionsWithDefaults.jsonData.cacheLevel) ??\n PrometheusCacheLevel.Low\n }\n data-testid={selectors.components.DataSource.Prometheus.configPage.cacheLevel}\n />\n </InlineField>\n </div>\n </div>\n\n <div className=\"gf-form-inline\">\n <div className=\"gf-form max-width-30\">\n <InlineField\n label={t(\n 'grafana-prometheus.configuration.prom-settings.label-incremental-querying-beta',\n 'Incremental querying (beta)'\n )}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-incremental-querying-beta\">\n This feature will change the default behavior of relative queries to always request fresh data\n from the prometheus instance, instead query results will be cached, and only new records are\n requested. Turn this on to decrease database and network load.\n </Trans>\n </>\n }\n interactive={true}\n className={styles.switchField}\n disabled={optionsWithDefaults.readOnly}\n >\n <Switch\n value={optionsWithDefaults.jsonData.incrementalQuerying ?? false}\n onChange={onUpdateDatasourceJsonDataOptionChecked(props, 'incrementalQuerying')}\n id={selectors.components.DataSource.Prometheus.configPage.incrementalQuerying}\n />\n </InlineField>\n </div>\n </div>\n\n <div className=\"gf-form-inline\">\n {optionsWithDefaults.jsonData.incrementalQuerying && (\n <InlineField\n label={t(\n 'grafana-prometheus.configuration.prom-settings.label-query-overlap-window',\n 'Query overlap window'\n )}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans\n i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-query-overlap-window\"\n values={{\n example1: '10m',\n example2: '120s',\n example3: '0s',\n default: '10m',\n }}\n >\n Set a duration like {'{{example1}}'} or {'{{example2}}'} or {'{{example3}}'}. Default of{' '}\n {'{{default}}'}. This duration will be added to the duration of each incremental request.\n </Trans>\n </>\n }\n interactive={true}\n disabled={optionsWithDefaults.readOnly}\n >\n <>\n <Input\n onBlur={(e) =>\n updateValidDuration({\n ...validDuration,\n incrementalQueryOverlapWindow: e.currentTarget.value,\n })\n }\n className=\"width-20\"\n value={\n optionsWithDefaults.jsonData.incrementalQueryOverlapWindow ?? defaultPrometheusQueryOverlapWindow\n }\n onChange={onChangeHandler('incrementalQueryOverlapWindow', optionsWithDefaults, onOptionsChange)}\n spellCheck={false}\n data-testid={selectors.components.DataSource.Prometheus.configPage.queryOverlapWindow}\n />\n {validateInput(validDuration.incrementalQueryOverlapWindow, MULTIPLE_DURATION_REGEX, durationError)}\n </>\n </InlineField>\n )}\n </div>\n\n <div className=\"gf-form-inline\">\n <div className=\"gf-form max-width-30\">\n <InlineField\n label={t(\n 'grafana-prometheus.configuration.prom-settings.label-disable-recording-rules-beta',\n 'Disable recording rules (beta)'\n )}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-disable-recording-rules-beta\">\n This feature will disable recording rules. Turn this on to improve dashboard performance\n </Trans>\n </>\n }\n interactive={true}\n className={styles.switchField}\n disabled={optionsWithDefaults.readOnly}\n >\n <Switch\n value={optionsWithDefaults.jsonData.disableRecordingRules ?? false}\n onChange={onUpdateDatasourceJsonDataOptionChecked(props, 'disableRecordingRules')}\n id={selectors.components.DataSource.Prometheus.configPage.disableRecordingRules}\n />\n </InlineField>\n </div>\n </div>\n </div>\n </ConfigSubSection>\n\n <ConfigSubSection\n title={t('grafana-prometheus.configuration.prom-settings.title-other', 'Other')}\n className={styles.container}\n >\n <div className=\"gf-form-group\">\n <div className=\"gf-form-inline\">\n <div className=\"gf-form max-width-30\">\n <InlineField\n label={t(\n 'grafana-prometheus.configuration.prom-settings.label-custom-query-parameters',\n 'Custom query parameters'\n )}\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans\n i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-custom-query-parameters\"\n values={{\n example1: 'timeout',\n example2: 'partial_response',\n example3: 'dedup',\n example4: 'max_source_resolution',\n concatenationChar: '‘&’',\n }}\n >\n Add custom parameters to the Prometheus query URL. For example {'{{example1}}'}, {'{{example2}}'},{' '}\n {'{{example3}}'}, or\n {'{{example4}}'}. Multiple parameters should be concatenated together with{' '}\n {'{{concatenationChar}}'}.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n interactive={true}\n disabled={optionsWithDefaults.readOnly}\n >\n <Input\n className=\"width-20\"\n value={optionsWithDefaults.jsonData.customQueryParameters}\n onChange={onChangeHandler('customQueryParameters', optionsWithDefaults, onOptionsChange)}\n spellCheck={false}\n placeholder={t(\n 'grafana-prometheus.configuration.prom-settings.placeholder-example-maxsourceresolutionmtimeout',\n 'Example: {{example}}',\n { example: 'max_source_resolution=5m&timeout=10' }\n )}\n data-testid={selectors.components.DataSource.Prometheus.configPage.customQueryParameters}\n />\n </InlineField>\n </div>\n </div>\n <div className=\"gf-form-inline\">\n {/* HTTP Method */}\n <div className=\"gf-form\">\n <InlineField\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-http-method\">\n You can use either POST or GET HTTP method to query your Prometheus data source. POST is the\n recommended method as it allows bigger queries. Change this to GET if you have a Prometheus\n version older than 2.1 or if POST requests are restricted in your network.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n interactive={true}\n label={t('grafana-prometheus.configuration.prom-settings.label-http-method', 'HTTP method')}\n disabled={optionsWithDefaults.readOnly}\n >\n <Select\n width={40}\n aria-label={t(\n 'grafana-prometheus.configuration.prom-settings.aria-label-select-http-method',\n 'Select HTTP method'\n )}\n options={httpOptions}\n value={httpOptions.find((o) => o.value === optionsWithDefaults.jsonData.httpMethod)}\n onChange={onChangeHandler('httpMethod', optionsWithDefaults, onOptionsChange)}\n data-testid={selectors.components.DataSource.Prometheus.configPage.httpMethod}\n />\n </InlineField>\n </div>\n </div>\n <InlineField\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n label={t('grafana-prometheus.configuration.prom-settings.label-series-limit', 'Series limit')}\n tooltip={\n <>\n <Trans i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-series-limit\">\n The limit applies to all resources (metrics, labels, and values) for both endpoints (series and\n labels). Leave the field empty to use the default limit (40000). Set to 0 to disable the limit and\n fetch everything — this may cause performance issues. Default limit is 40000.\n </Trans>\n {docsTip()}\n </>\n }\n interactive={true}\n disabled={optionsWithDefaults.readOnly}\n >\n <>\n <Input\n className=\"width-20\"\n value={seriesLimit}\n spellCheck={false}\n // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n placeholder=\"40000\"\n onChange={(event: { currentTarget: { value: string } }) => {\n setSeriesLimit(event.currentTarget.value);\n onOptionsChange({\n ...optionsWithDefaults,\n jsonData: {\n ...optionsWithDefaults.jsonData,\n seriesLimit: parseInt(event.currentTarget.value, 10),\n },\n });\n }}\n onBlur={(e) => validateInput(e.currentTarget.value, NON_NEGATIVE_INTEGER_REGEX, seriesLimitError)}\n data-testid={selectors.components.DataSource.Prometheus.configPage.seriesLimit}\n />\n {validateInput(seriesLimit, NON_NEGATIVE_INTEGER_REGEX, seriesLimitError)}\n </>\n </InlineField>\n <InlineField\n labelWidth={PROM_CONFIG_LABEL_WIDTH}\n label={t('grafana-prometheus.configuration.prom-settings.label-use-series-endpoint', 'Use series endpoint')}\n tooltip={\n <>\n <Trans\n i18nKey=\"grafana-prometheus.configuration.prom-settings.tooltip-use-series-endpoint\"\n values={{ exampleParameter: 'match[]' }}\n >\n Checking this option will favor the series endpoint with {'{{exampleParameter}}'} parameter over the\n label values endpoint with {'{{exampleParameter}}'} parameter. While the label values endpoint is\n considered more performant, some users may prefer the series because it has a POST method while the\n label values endpoint only has a GET method.\n </Trans>{' '}\n {docsTip()}\n </>\n }\n interactive={true}\n disabled={optionsWithDefaults.readOnly}\n className={styles.switchField}\n >\n <Switch\n value={optionsWithDefaults.jsonData.seriesEndpoint ?? false}\n onChange={onUpdateDatasourceJsonDataOptionChecked(props, 'seriesEndpoint')}\n />\n </InlineField>\n </div>\n </ConfigSubSection>\n\n <ExemplarsSettings\n options={optionsWithDefaults.jsonData.exemplarTraceIdDestinations}\n onChange={(exemplarOptions) =>\n updateDatasourcePluginJsonDataOption(\n { onOptionsChange, options: optionsWithDefaults },\n 'exemplarTraceIdDestinations',\n exemplarOptions\n )\n }\n disabled={optionsWithDefaults.readOnly}\n />\n </>\n );\n};\n\nexport const getValueFromEventItem = (eventItem: SyntheticEvent<HTMLInputElement> | SelectableValue<string>) => {\n if (!eventItem) {\n return '';\n }\n\n if ('currentTarget' in eventItem) {\n return eventItem.currentTarget.value;\n }\n\n return eventItem.value;\n};\n\nconst onChangeHandler =\n (key: keyof PromOptions, options: Props['options'], 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 {\n AzureCredentials,\n AzureDataSourceJsonData,\n AzureDataSourceSecureJsonData,\n AzureDataSourceSettings,\n getAzureClouds,\n getDatasourceCredentials,\n getDefaultAzureCloud,\n updateDatasourceCredentials,\n} from '@grafana/azure-sdk';\nimport { DataSourceSettings, SelectableValue } from '@grafana/data';\nimport { PromOptions } from '@grafana/prometheus';\nimport { config } from '@grafana/runtime';\n\nexport function getAzureCloudOptions(): Array<SelectableValue<string>> {\n const cloudInfo = getAzureClouds();\n\n return cloudInfo.map((cloud) => ({\n value: cloud.name,\n label: cloud.displayName,\n }));\n}\n\nexport function getDefaultCredentials(): AzureCredentials {\n if (config.azure.managedIdentityEnabled) {\n return { authType: 'msi' };\n } else {\n return { authType: 'clientsecret', azureCloud: getDefaultAzureCloud() };\n }\n}\n\nexport function getCredentials(options: AzureDataSourceSettings): AzureCredentials {\n const credentials = getDatasourceCredentials(options);\n if (credentials) {\n return credentials;\n }\n\n // If no credentials saved, then return empty credentials\n // of type based on whether the managed identity enabled\n return getDefaultCredentials();\n}\n\nexport function updateCredentials(\n options: AzurePromDataSourceSettings,\n credentials: AzureCredentials\n): AzurePromDataSourceSettings {\n return updateDatasourceCredentials(options, credentials);\n}\n\nexport function setDefaultCredentials(options: AzurePromDataSourceSettings): Partial<AzurePromDataSourceSettings> {\n return {\n jsonData: {\n ...options.jsonData,\n azureCredentials: getDefaultCredentials(),\n },\n };\n}\n\nexport function resetCredentials(options: AzurePromDataSourceSettings): Partial<AzurePromDataSourceSettings> {\n return {\n jsonData: {\n ...options.jsonData,\n azureCredentials: undefined,\n azureEndpointResourceId: undefined,\n },\n };\n}\n\nexport interface AzurePromDataSourceOptions extends PromOptions, AzureDataSourceJsonData {\n azureEndpointResourceId?: string;\n}\n\nexport type AzurePromDataSourceSettings = DataSourceSettings<AzurePromDataSourceOptions, AzureDataSourceSecureJsonData>;\n","import { cx } from '@emotion/css';\nimport { ChangeEvent, useMemo } from 'react';\n\nimport { AzureAuthType, AzureCredentials } from '@grafana/azure-sdk';\nimport { SelectableValue } from '@grafana/data';\nimport { InlineFormLabel, Button, Select, Input } from '@grafana/ui';\n\nexport interface Props {\n managedIdentityEnabled: boolean;\n workloadIdentityEnabled: boolean;\n credentials: AzureCredentials;\n azureCloudOptions?: SelectableValue[];\n onCredentialsChange: (updatedCredentials: AzureCredentials) => void;\n getSubscriptions?: () => Promise<SelectableValue[]>;\n disabled?: boolean;\n}\n\nexport const AzureCredentialsForm = (props: Props) => {\n const {\n credentials,\n azureCloudOptions,\n onCredentialsChange,\n disabled,\n managedIdentityEnabled,\n workloadIdentityEnabled,\n } = props;\n\n const authTypeOptions = useMemo(() => {\n let opts: Array<SelectableValue<AzureAuthType>> = [\n {\n value: 'clientsecret',\n label: 'App Registration',\n },\n ];\n\n if (managedIdentityEnabled) {\n opts.push({\n value: 'msi',\n label: 'Managed Identity',\n });\n }\n\n if (workloadIdentityEnabled) {\n opts.push({\n value: 'workloadidentity',\n label: 'Workload Identity',\n });\n }\n return opts;\n }, [managedIdentityEnabled, workloadIdentityEnabled]);\n\n const onAuthTypeChange = (selected: SelectableValue<AzureAuthType>) => {\n const defaultAuthType = managedIdentityEnabled\n ? 'msi'\n : workloadIdentityEnabled\n ? 'workloadidentity'\n : 'clientsecret';\n const updated: AzureCredentials = {\n ...credentials,\n authType: selected.value || defaultAuthType,\n };\n onCredentialsChange(updated);\n };\n\n const onAzureCloudChange = (selected: SelectableValue<string>) => {\n if (credentials.authType === 'clientsecret') {\n const updated: AzureCredentials = {\n ...credentials,\n azureCloud: selected.value,\n };\n onCredentialsChange(updated);\n }\n };\n\n const onTenantIdChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (credentials.authType === 'clientsecret') {\n const updated: AzureCredentials = {\n ...credentials,\n tenantId: event.target.value,\n };\n onCredentialsChange(updated);\n }\n };\n\n const onClientIdChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (credentials.authType === 'clientsecret') {\n const updated: AzureCredentials = {\n ...credentials,\n clientId: event.target.value,\n };\n onCredentialsChange(updated);\n }\n };\n\n const onClientSecretChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (credentials.authType === 'clientsecret') {\n const updated: AzureCredentials = {\n ...credentials,\n clientSecret: event.target.value,\n };\n onCredentialsChange(updated);\n }\n };\n\n const onClientSecretReset = () => {\n if (credentials.authType === 'clientsecret') {\n const updated: AzureCredentials = {\n ...credentials,\n clientSecret: '',\n };\n onCredentialsChange(updated);\n }\n };\n\n return (\n <div className=\"gf-form-group\">\n {authTypeOptions.length > 1 && (\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 className=\"width-15\"\n value={authTypeOptions.find((opt) => opt.value === credentials.authType)}\n options={authTypeOptions}\n onChange={onAuthTypeChange}\n isDisabled={disabled}\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 className=\"width-15\"\n value={azureCloudOptions.find((opt) => opt.value === credentials.azureCloud)}\n options={azureCloudOptions}\n onChange={onAzureCloudChange}\n isDisabled={disabled}\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={cx('width-20')}\n placeholder=\"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\"\n value={credentials.tenantId || ''}\n onChange={onTenantIdChange}\n disabled={disabled}\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={cx('width-20')}\n placeholder=\"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\"\n value={credentials.clientId || ''}\n onChange={onClientIdChange}\n disabled={disabled}\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 htmlFor=\"azure-client-secret\" className=\"width-12\">\n Client Secret\n </InlineFormLabel>\n <Input id=\"azure-client-secret\" className={cx('width-20')} placeholder=\"configured\" disabled />\n </div>\n {!disabled && (\n <div className=\"gf-form\">\n <div className={cx('max-width-20 gf-form-inline')}>\n <Button variant=\"secondary\" type=\"button\" onClick={onClientSecretReset}>\n reset\n </Button>\n </div>\n </div>\n )}\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={cx('width-20')}\n placeholder=\"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\"\n value={credentials.clientSecret || ''}\n onChange={onClientSecretChange}\n disabled={disabled}\n />\n </div>\n </div>\n </div>\n )}\n </>\n )}\n </div>\n );\n};\n\nexport default AzureCredentialsForm;\n","import { cx } from '@emotion/css';\nimport { FormEvent, useMemo, useState } from 'react';\nimport { useEffectOnce } from 'react-use';\n\nimport { AzureCredentials } from '@grafana/azure-sdk';\nimport { config } from '@grafana/runtime';\nimport { InlineField, InlineFieldRow, InlineSwitch, Input } from '@grafana/ui';\nimport { HttpSettingsBaseProps } from '@grafana/ui/internal';\n\nimport { getAzureCloudOptions, getCredentials, updateCredentials } from './AzureCredentialsConfig';\nimport { AzureCredentialsForm } from './AzureCredentialsForm';\n\nexport const AzureAuthSettings = (props: HttpSettingsBaseProps) => {\n const { dataSourceConfig, onChange } = props;\n\n const [overrideAudienceAllowed] = useState<boolean>(!!config.featureToggles.prometheusAzureOverrideAudience);\n const [overrideAudienceChecked, setOverrideAudienceChecked] = useState<boolean>(\n !!dataSourceConfig.jsonData.azureEndpointResourceId\n );\n\n const credentials = useMemo(() => getCredentials(dataSourceConfig), [dataSourceConfig]);\n\n const onCredentialsChange = (credentials: AzureCredentials): void => {\n onChange(updateCredentials(dataSourceConfig, credentials));\n };\n\n const onOverrideAudienceChange = (ev: FormEvent<HTMLInputElement>): void => {\n setOverrideAudienceChecked(ev.currentTarget.checked);\n if (!ev.currentTarget.checked) {\n onChange({\n ...dataSourceConfig,\n jsonData: { ...dataSourceConfig.jsonData, azureEndpointResourceId: undefined },\n });\n }\n };\n\n const onResourceIdChange = (ev: FormEvent<HTMLInputElement>): void => {\n if (overrideAudienceChecked) {\n onChange({\n ...dataSourceConfig,\n jsonData: { ...dataSourceConfig.jsonData, azureEndpointResourceId: ev.currentTarget.value },\n });\n }\n };\n\n // The auth type needs to be set on the first load of the data source\n useEffectOnce(() => {\n if (!dataSourceConfig.jsonData.authType) {\n onCredentialsChange(credentials);\n }\n });\n\n return (\n <>\n <h6>Azure authentication</h6>\n <AzureCredentialsForm\n managedIdentityEnabled={config.azure.managedIdentityEnabled}\n workloadIdentityEnabled={config.azure.workloadIdentityEnabled}\n credentials={credentials}\n azureCloudOptions={getAzureCloudOptions()}\n onCredentialsChange={onCredentialsChange}\n disabled={dataSourceConfig.readOnly}\n />\n {overrideAudienceAllowed && (\n <>\n <h6>Azure configuration</h6>\n <div className=\"gf-form-group\">\n <InlineFieldRow>\n <InlineField labelWidth={24} label=\"Override AAD audience\" disabled={dataSourceConfig.readOnly}>\n <InlineSwitch value={overrideAudienceChecked} onChange={onOverrideAudienceChange} />\n </InlineField>\n </InlineFieldRow>\n {overrideAudienceChecked && (\n <InlineFieldRow>\n <InlineField labelWidth={24} label=\"Resource ID\" disabled={dataSourceConfig.readOnly}>\n <Input\n className={cx('width-20')}\n value={dataSourceConfig.jsonData.azureEndpointResourceId || ''}\n onChange={onResourceIdChange}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n </div>\n </>\n )}\n </>\n );\n};\n\nexport default AzureAuthSettings;\n","import { ReactElement, useState } from 'react';\nimport * as React from 'react';\n\nimport { Auth, ConnectionSettings, convertLegacyAuthProps, AuthMethod } from '@grafana/plugin-ui';\nimport { docsTip, overhaulStyles } from '@grafana/prometheus';\nimport { Alert, SecureSocksProxySettings, useTheme2 } from '@grafana/ui';\n// NEED TO EXPORT THIS FROM GRAFANA/UI FOR EXTERNAL DS\nimport { AzureAuthSettings } from '@grafana/ui/internal';\n\nimport { AzurePromDataSourceSettings } from './AzureCredentialsConfig';\n\ntype Props = {\n options: AzurePromDataSourceSettings;\n onOptionsChange: (options: AzurePromDataSourceSettings) => void;\n azureAuthSettings: AzureAuthSettings;\n sigV4AuthToggleEnabled: boolean | undefined;\n renderSigV4Editor: React.ReactNode;\n secureSocksDSProxyEnabled: boolean;\n};\n\n// these are not available yet in grafana\nexport type CustomMethodId = `custom-${string}`;\n\nexport type CustomMethod = {\n id: CustomMethodId;\n label: string;\n description: string;\n component: ReactElement;\n};\n\nexport const DataSourcehttpSettingsOverhaul = (props: Props) => {\n const {\n options,\n onOptionsChange,\n azureAuthSettings,\n sigV4AuthToggleEnabled,\n renderSigV4Editor,\n secureSocksDSProxyEnabled,\n } = props;\n\n const newAuthProps = convertLegacyAuthProps({\n config: options,\n onChange: onOptionsChange,\n });\n\n const theme = useTheme2();\n const styles = overhaulStyles(theme);\n\n // for custom auth methods sigV4 and azure auth\n let customMethods: CustomMethod[] = [];\n\n const [sigV4Selected, setSigV4Selected] = useState<boolean>(options.jsonData.sigV4Auth || false);\n\n const sigV4Id = 'custom-sigV4Id';\n\n const sigV4Option: CustomMethod = {\n id: sigV4Id,\n label: 'SigV4 auth',\n description: 'This is SigV4 auth description',\n component: <>{renderSigV4Editor}</>,\n };\n\n if (sigV4AuthToggleEnabled) {\n customMethods.push(sigV4Option);\n }\n\n const azureAuthEnabled: boolean =\n (azureAuthSettings?.azureAuthSupported && azureAuthSettings.getAzureAuthEnabled(options)) || false;\n\n const [azureAuthSelected, setAzureAuthSelected] = useState<boolean>(azureAuthEnabled);\n\n const azureAuthId = 'custom-azureAuthId';\n\n const azureAuthOption: CustomMethod = {\n id: azureAuthId,\n label: 'Azure auth',\n description: 'Authenticate with Azure',\n component: (\n <>\n {azureAuthSettings.azureSettingsUI && (\n <azureAuthSettings.azureSettingsUI dataSourceConfig={options} onChange={onOptionsChange} />\n )}\n </>\n ),\n };\n\n // allow the option to show in the dropdown\n if (azureAuthSettings?.azureAuthSupported) {\n customMethods.push(azureAuthOption);\n }\n\n function returnSelectedMethod() {\n if (sigV4Selected) {\n return sigV4Id;\n }\n\n if (azureAuthSelected) {\n return azureAuthId;\n }\n\n return newAuthProps.selectedMethod;\n }\n\n // Do we need this switch anymore? Update the language.\n let urlTooltip;\n switch (options.access) {\n case 'direct':\n urlTooltip = (\n <>\n Your access method is <em>Browser</em>, this means the URL needs to be accessible from the browser.\n {docsTip()}\n </>\n );\n break;\n case 'proxy':\n urlTooltip = (\n <>\n Your access method is <em>Server</em>, this means the URL needs to be accessible from the grafana\n backend/server.\n {docsTip()}\n </>\n );\n break;\n default:\n urlTooltip = <>Specify a complete HTTP URL (for example http://your_server:8080) {docsTip()}</>;\n }\n\n return (\n <>\n <ConnectionSettings\n urlPlaceholder=\"http://localhost:9090\"\n config={options}\n onChange={onOptionsChange}\n urlLabel=\"Prometheus server URL\"\n urlTooltip={urlTooltip}\n />\n <hr className={`${styles.hrTopSpace} ${styles.hrBottomSpace}`} />\n {sigV4Selected && (\n <Alert title=\"Deprecation Notice\" severity=\"warning\">\n The SigV4 authentication in the core Prometheus data source is deprecated. Please use the Amazon Managed\n Service for Prometheus data source to authenticate with SigV4.\n </Alert>\n )}\n {azureAuthSelected && (\n <Alert title=\"Deprecation Notice\" severity=\"warning\">\n Azure authentication in the core Prometheus data source is deprecated. Please use the Azure Monitor Managed\n Service for Prometheus data source to authenticate using Azure authentication.\n </Alert>\n )}\n <Auth\n {...newAuthProps}\n customMethods={customMethods}\n onAuthMethodSelect={(method) => {\n // sigV4Id\n if (sigV4AuthToggleEnabled) {\n setSigV4Selected(method === sigV4Id);\n }\n\n // Azure\n if (azureAuthSettings?.azureAuthSupported) {\n setAzureAuthSelected(method === azureAuthId);\n azureAuthSettings.setAzureAuthEnabled(options, method === azureAuthId);\n }\n\n onOptionsChange({\n ...options,\n basicAuth: method === AuthMethod.BasicAuth,\n withCredentials: method === AuthMethod.CrossSiteCredentials,\n jsonData: {\n ...options.jsonData,\n azureCredentials: method === azureAuthId ? options.jsonData.azureCredentials : undefined,\n sigV4Auth: method === sigV4Id,\n oauthPassThru: method === AuthMethod.OAuthForward,\n },\n });\n }}\n // If your method is selected pass its id to `selectedMethod`,\n // otherwise pass the id from converted legacy data\n selectedMethod={returnSelectedMethod()}\n />\n <div className={styles.sectionBottomPadding} />\n {secureSocksDSProxyEnabled && (\n <>\n <SecureSocksProxySettings options={options} onOptionsChange={onOptionsChange} />\n <div className={styles.sectionBottomPadding} />\n </>\n )}\n </>\n );\n};\n","import { css } from '@emotion/css';\n\nimport { SIGV4ConnectionConfig } from '@grafana/aws-sdk';\nimport { hasCredentials } from '@grafana/azure-sdk';\nimport { DataSourcePluginOptionsEditorProps, GrafanaTheme2 } from '@grafana/data';\nimport { AdvancedHttpSettings, ConfigSection, DataSourceDescription } from '@grafana/plugin-ui';\nimport { AlertingSettingsOverhaul, PromOptions, PromSettings } from '@grafana/prometheus';\nimport { config } from '@grafana/runtime';\nimport { Alert, FieldValidationMessage, TextLink, useTheme2 } from '@grafana/ui';\n\nimport { AzureAuthSettings } from './AzureAuthSettings';\nimport { AzurePromDataSourceSettings, setDefaultCredentials, resetCredentials } from './AzureCredentialsConfig';\nimport { DataSourcehttpSettingsOverhaul } from './DataSourceHttpSettingsOverhaulPackage';\n\nexport const PROM_CONFIG_LABEL_WIDTH = 30;\n\nexport type Props = DataSourcePluginOptionsEditorProps<PromOptions>;\n\nexport const ConfigEditor = (props: Props) => {\n const { options, onOptionsChange } = props;\n\n const azureAuthSettings = {\n azureAuthSupported: config.azureAuthEnabled,\n getAzureAuthEnabled: (config: AzurePromDataSourceSettings): boolean => hasCredentials(config),\n setAzureAuthEnabled: (config: AzurePromDataSourceSettings, enabled: boolean) =>\n enabled ? setDefaultCredentials(config) : resetCredentials(config),\n azureSettingsUI: AzureAuthSettings,\n };\n\n const theme = useTheme2();\n const styles = overhaulStyles(theme);\n\n return (\n <>\n {options.access === 'direct' && (\n <Alert title=\"Error\" severity=\"error\">\n Browser access mode in the Prometheus data source is no longer available. Switch to server access mode.\n </Alert>\n )}\n <DataSourceDescription\n dataSourceName=\"Prometheus\"\n docsLink=\"https://grafana.com/docs/grafana/latest/datasources/prometheus/configure/\"\n />\n <hr className={`${styles.hrTopSpace} ${styles.hrBottomSpace}`} />\n <DataSourcehttpSettingsOverhaul\n options={options}\n onOptionsChange={onOptionsChange}\n azureAuthSettings={azureAuthSettings}\n sigV4AuthToggleEnabled={config.sigV4AuthEnabled}\n renderSigV4Editor={\n <SIGV4ConnectionConfig inExperimentalAuthComponent={true} {...props}></SIGV4ConnectionConfig>\n }\n secureSocksDSProxyEnabled={config.secureSocksDSProxyEnabled}\n />\n <hr />\n <ConfigSection\n className={styles.advancedSettings}\n title=\"Advanced settings\"\n description=\"Additional settings are optional settings that can be configured for more control over your data source.\"\n >\n <AdvancedHttpSettings\n className={styles.advancedHTTPSettingsMargin}\n config={options}\n onChange={onOptionsChange}\n />\n <AlertingSettingsOverhaul<PromOptions> options={options} onOptionsChange={onOptionsChange} />\n <PromSettings options={options} onOptionsChange={onOptionsChange} />\n </ConfigSection>\n </>\n );\n};\n/**\n * Use this to return a url in a tooltip in a field. Don't forget to make the field interactive to be able to click on the tooltip\n * @param url\n * @returns\n */\nexport function docsTip(url?: string) {\n const docsUrl = 'https://grafana.com/docs/grafana/latest/datasources/prometheus/#configure-the-data-source';\n\n return (\n <TextLink href={url ? url : docsUrl} external>\n Visit docs for more details here.\n </TextLink>\n );\n}\n\nexport const validateInput = (\n input: string,\n pattern: string | RegExp,\n errorMessage?: string\n): boolean | JSX.Element => {\n const defaultErrorMessage = 'Value is not valid';\n if (input && !input.match(pattern)) {\n return <FieldValidationMessage>{errorMessage ? errorMessage : defaultErrorMessage}</FieldValidationMessage>;\n } else {\n return true;\n }\n};\n\nexport function overhaulStyles(theme: GrafanaTheme2) {\n return {\n additionalSettings: css({\n marginBottom: '25px',\n }),\n secondaryGrey: css({\n color: `${theme.colors.secondary.text}`,\n opacity: '65%',\n }),\n inlineError: css({\n margin: '0px 0px 4px 245px',\n }),\n switchField: css({\n alignItems: 'center',\n }),\n sectionHeaderPadding: css({\n paddingTop: '32px',\n }),\n sectionBottomPadding: css({\n paddingBottom: '28px',\n }),\n subsectionText: css({\n fontSize: '12px',\n }),\n hrBottomSpace: css({\n marginBottom: '56px',\n }),\n hrTopSpace: css({\n marginTop: '50px',\n }),\n textUnderline: css({\n textDecoration: 'underline',\n }),\n versionMargin: css({\n marginBottom: '12px',\n }),\n advancedHTTPSettingsMargin: css({\n margin: '24px 0 8px 0',\n }),\n advancedSettings: css({\n paddingTop: '32px',\n }),\n alertingTop: css({\n marginTop: '40px !important',\n }),\n overhaulPageHeading: css({\n fontWeight: '400',\n }),\n container: css({\n maxwidth: '578',\n }),\n };\n}\n","import { DataSourcePlugin } from '@grafana/data';\nimport { PrometheusDatasource, PromQueryEditorByApp, PromCheatSheet } from '@grafana/prometheus';\n\nimport { ConfigEditor } from './configuration/ConfigEditorPackage';\n\nexport const plugin = new DataSourcePlugin(PrometheusDatasource)\n .setQueryEditor(PromQueryEditorByApp)\n .setConfigEditor(ConfigEditor)\n .setQueryEditorHelp(PromCheatSheet);\n","// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/result_transformer.ts\nimport { flatten, forOwn, groupBy, partition } from 'lodash';\n\nimport {\n CoreApp,\n DataFrame,\n DataFrameType,\n DataLink,\n DataQueryRequest,\n DataQueryResponse,\n DataTopic,\n Field,\n FieldType,\n getDisplayProcessor,\n getFieldDisplayName,\n Labels,\n sortDataFrame,\n TIME_SERIES_TIME_FIELD_NAME,\n TIME_SERIES_VALUE_FIELD_NAME,\n} from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\nimport { ExemplarTraceIdDestination, PromMetric, PromQuery, PromValue } from './types';\n\n// handles case-insensitive Inf, +Inf, -Inf (with optional \"inity\" suffix)\nconst INFINITY_SAMPLE_REGEX = /^[+-]?inf(?:inity)?$/i;\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 isCumulativeHeatmapResult = (dataFrame: DataFrame, options: DataQueryRequest<PromQuery>): boolean => {\n if (dataFrame.meta?.type === DataFrameType.HeatmapCells) {\n return false;\n }\n\n const target = options.targets.find((target) => target.refId === dataFrame.refId);\n return target?.format === 'heatmap';\n};\n\n// V2 result transformer used to transform query results from queries that were run through prometheus backend\nexport function transformV2(\n response: DataQueryResponse,\n request: DataQueryRequest<PromQuery>,\n options: { exemplarTraceIdDestinations?: ExemplarTraceIdDestination[] }\n) {\n // migration for dataplane field name issue\n // update displayNameFromDS in the field config\n response.data.forEach((f: DataFrame) => {\n const target = request.targets.find((t) => t.refId === f.refId);\n // check that the legend is selected as auto\n if (target && target.legendFormat === '__auto') {\n f.fields.forEach((field) => {\n if (field.labels?.__name__ && field.labels?.__name__ === field.name) {\n const fieldCopy = { ...field, name: TIME_SERIES_VALUE_FIELD_NAME };\n field.config.displayNameFromDS = getFieldDisplayName(fieldCopy, f, response.data);\n }\n });\n }\n });\n\n const [tableFrames, framesWithoutTable] = partition<DataFrame>(response.data, (df) => isTableResult(df, request));\n const processedTableFrames = transformDFToTable(tableFrames);\n\n const [exemplarFrames, framesWithoutTableAndExemplars] = partition<DataFrame>(\n framesWithoutTable,\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 const [heatmapResults, framesWithoutTableHeatmapsAndExemplars] = partition<DataFrame>(\n framesWithoutTableAndExemplars,\n (df) => isCumulativeHeatmapResult(df, request)\n );\n\n // this works around the fact that we only get back frame.name with le buckets when legendFormat == {{le}}...which is not the default\n heatmapResults.forEach((df) => {\n if (df.name == null) {\n let f = df.fields.find((f) => f.type === FieldType.number);\n\n if (f) {\n let le = f.labels?.le;\n\n if (le) {\n // this is used for sorting the frames by numeric ascending le labels for de-accum\n df.name = le;\n // this is used for renaming the Value fields to le label\n f.config.displayNameFromDS = le;\n }\n }\n }\n });\n\n // Group heatmaps by query\n const heatmapResultsGroupedByQuery = groupBy<DataFrame>(heatmapResults, (h) => h.refId);\n\n // Initialize empty array to push grouped histogram frames to\n let processedHeatmapResultsGroupedByQuery: DataFrame[][] = [];\n\n // Iterate through every query in this heatmap\n for (const query in heatmapResultsGroupedByQuery) {\n // Get reference to dataFrames for heatmap\n const heatmapResultsGroup = heatmapResultsGroupedByQuery[query];\n\n // Create a new grouping by iterating through the data frames...\n const heatmapResultsGroupedByValues = groupBy<DataFrame>(heatmapResultsGroup, (dataFrame) => {\n // Each data frame has `Time` and `Value` properties, we want to get the values\n const values = dataFrame.fields.find((field) => field.type === FieldType.number);\n // Specific functionality for special \"le\" quantile heatmap value, we know if this value exists, that we do not want to calculate the heatmap density across data frames from the same quartile\n if (values?.labels && HISTOGRAM_QUANTILE_LABEL_NAME in values.labels) {\n const { le, ...notLE } = values?.labels;\n return Object.values(notLE).join();\n }\n\n // Return a string made from the concatenation of this frame's values to represent a grouping in the query\n return Object.values(values?.labels ?? []).join();\n });\n\n // Then iterate through the resultant object\n forOwn(heatmapResultsGroupedByValues, (dataFrames, key) => {\n // Sort frames within each grouping\n const sortedHeatmap = dataFrames.sort(sortSeriesByLabel);\n // And push the sorted grouping with the rest\n processedHeatmapResultsGroupedByQuery.push(mergeHeatmapFrames(transformToHistogramOverTime(sortedHeatmap)));\n });\n }\n\n // Everything else is processed as time_series result and graph preferredVisualisationType\n const otherFrames = framesWithoutTableHeatmapsAndExemplars.map((dataFrame) => {\n const df: DataFrame = {\n ...dataFrame,\n meta: {\n ...dataFrame.meta,\n preferredVisualisationType: 'graph',\n },\n };\n return df;\n });\n\n const flattenedProcessedHeatmapFrames = flatten(processedHeatmapResultsGroupedByQuery);\n\n return {\n ...response,\n data: [...otherFrames, ...processedTableFrames, ...flattenedProcessedHeatmapFrames, ...processedExemplarFrames],\n };\n}\n\nconst HISTOGRAM_QUANTILE_LABEL_NAME = 'le';\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: Field[] = [];\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 labelFields.push({\n name: label,\n config: { filterable: true },\n type: FieldType.string,\n values: [],\n });\n }\n });\n });\n\n let prevTime = -Infinity;\n let needsSort = false;\n\n // Fill valueField, timeField and labelFields with values\n dataFramesByRefId[refId].forEach((df) => {\n timeField.config.interval ??= df.fields[0]?.config.interval;\n\n const timeFields = df.fields[0]?.values ?? [];\n const dataFields = df.fields[1]?.values ?? [];\n\n timeFields.forEach((value) => {\n timeField.values.push(value);\n\n if (value < prevTime) {\n needsSort = true;\n }\n\n prevTime = value;\n });\n\n dataFields.forEach((value) => {\n valueField.values.push(parseSampleValue(value));\n const labelsForField = df.fields[1].labels ?? {};\n labelFields.forEach((field) => field.values.push(getLabelValue(labelsForField, field.name)));\n });\n });\n\n const fields = [timeField, ...labelFields, valueField];\n\n const frame: DataFrame = {\n refId,\n fields,\n // Prometheus specific UI for instant queries\n meta: {\n ...dataFramesByRefId[refId][0].meta,\n preferredVisualisationType: 'rawPrometheus' as const,\n },\n length: timeField.values.length,\n };\n\n return needsSort ? sortDataFrame(frame, 0) : frame;\n });\n\n return frames;\n}\n\nfunction getValueText(responseLength: number, refId = '') {\n return responseLength > 1 ? `Value #${refId}` : 'Value';\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 // dsSettings is undefined because of the reasons below:\n // - permissions issues (probably most likely)\n // - deleted datasource\n // - misconfiguration\n if (dsSettings) {\n dataLinks.push({\n title: options.urlDisplayLabel || `Query with ${dsSettings?.name}`,\n url: '',\n internal: {\n query: { query: '${__value.raw}', queryType: 'traceql' },\n panelsState: {\n trace: {\n spanId: '${__data.fields[\"span_id\"]}',\n },\n },\n datasourceUid: options.datasourceUid,\n datasourceName: dsSettings?.name ?? 'Data source not found',\n },\n });\n }\n }\n\n if (options.url) {\n dataLinks.push({\n title: options.urlDisplayLabel || `Go to ${options.url}`,\n url: options.url,\n targetBlank: true,\n });\n }\n return dataLinks;\n}\n\nfunction getLabelValue(metric: PromMetric, label: string): string | number {\n if (metric.hasOwnProperty(label)) {\n return metric[label];\n }\n return '';\n}\n\nfunction getTimeField(data: PromValue[], isMs = false): Field<number> {\n return {\n name: TIME_SERIES_TIME_FIELD_NAME,\n type: FieldType.time,\n config: {},\n values: data.map((val) => (isMs ? val[0] : val[0] * 1000)),\n };\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): Field {\n return {\n name: valueName,\n type: FieldType.number,\n display: getDisplayProcessor(),\n config: {\n displayNameFromDS,\n },\n labels,\n values: data.map((val) => (parseValue ? parseSampleValue(val[1]) : val[1])),\n };\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\nfunction mergeHeatmapFrames(frames: DataFrame[]): DataFrame[] {\n if (frames.length === 0 || (frames.length === 1 && frames[0].length === 0)) {\n return [];\n }\n\n const timeField = frames[0].fields.find((field) => field.type === FieldType.time)!;\n const countFields = frames.map((frame) => {\n let field = frame.fields.find((field) => field.type === FieldType.number)!;\n\n return {\n ...field,\n name: field.config.displayNameFromDS!,\n };\n });\n\n return [\n {\n ...frames[0],\n meta: {\n ...frames[0].meta,\n type: DataFrameType.HeatmapRows,\n },\n fields: [timeField!, ...countFields],\n },\n ];\n}\n\n/** @internal */\nexport function transformToHistogramOverTime(seriesList: DataFrame[]): 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\n for (let i = seriesList.length - 1; i > 0; i--) {\n const topSeries = seriesList[i].fields.find((s) => s.type === FieldType.number);\n const bottomSeries = seriesList[i - 1].fields.find((s) => s.type === FieldType.number);\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[j] || [0];\n topSeries.values[j] -= bottomPoint;\n\n if (topSeries.values[j] < 1e-9) {\n topSeries.values[j] = 0;\n }\n }\n }\n\n return seriesList;\n}\n\nexport function sortSeriesByLabel(s1: DataFrame, s2: DataFrame): number {\n let le1, le2;\n\n try {\n // the state.displayName conditions are here because we also use this sorting util fn\n // in panels where isHeatmapResult was false but we still want to sort numerically-named\n // fields after the full unique displayName is cached in field state\n le1 = parseSampleValue(s1.fields[1].state?.displayName ?? s1.name ?? s1.fields[1].name);\n le2 = parseSampleValue(s2.fields[1].state?.displayName ?? s2.name ?? s2.fields[1].name);\n } catch (err) {\n // fail if not integer. might happen with bad queries\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\n/** @internal */\nexport function parseSampleValue(value: string): number {\n if (INFINITY_SAMPLE_REGEX.test(value)) {\n return value[0] === '-' ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY;\n }\n return parseFloat(value);\n}\n","import { cx, css } from '@emotion/css';\nimport { useStyles2 } from '@grafana/ui';\nimport React__default, { Children, isValidElement, cloneElement } from 'react';\n\nconst InputGroup = ({ children }) => {\n const styles = useStyles2(getStyles);\n const modifiedChildren = Children.map(children, (child) => {\n if (isValidElement(child) && child.props.invalid) {\n return cloneElement(child, { className: cx(child.props.className, styles.invalidChild) });\n }\n return child;\n });\n return /* @__PURE__ */ React__default.createElement(\"div\", { className: styles.root }, modifiedChildren);\n};\nconst borderPriority = [\n \"\",\n // lowest priority\n \"base\",\n \"hovered\",\n \"invalid\",\n \"focused\"\n // highest priority\n];\nconst getStyles = () => ({\n root: css({\n display: \"flex\",\n // Style the direct children of the component\n \"> *\": {\n \"&:not(:first-child)\": {\n // Negative margin hides the double-border on adjacent selects\n marginLeft: -1\n },\n \"&:first-child\": {\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0\n },\n \"&:last-child\": {\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0\n },\n \"&:not(:first-child):not(:last-child)\": {\n borderRadius: 0\n },\n //\n position: \"relative\",\n zIndex: borderPriority.indexOf(\"base\"),\n // Adjacent borders are overlapping, so raise children up when hovering etc\n // so all that child's borders are visible.\n \"&:hover\": {\n zIndex: borderPriority.indexOf(\"hovered\")\n },\n \"&:focus-within\": {\n zIndex: borderPriority.indexOf(\"focused\")\n }\n }\n }),\n invalidChild: css({\n zIndex: borderPriority.indexOf(\"invalid\")\n })\n});\n\nexport { InputGroup };\n//# sourceMappingURL=InputGroup.js.map\n","import React__default from 'react';\nimport { EditorStack } from './EditorStack.js';\n\nconst EditorFieldGroup = ({ children }) => {\n return /* @__PURE__ */ React__default.createElement(EditorStack, { gap: 1 }, children);\n};\n\nexport { EditorFieldGroup };\n//# sourceMappingURL=EditorFieldGroup.js.map\n","import { css } from '@emotion/css';\nimport { Switch } from '@grafana/ui';\nimport React__default from 'react';\n\nconst EditorSwitch = (props) => {\n const styles = getStyles();\n return /* @__PURE__ */ React__default.createElement(\"div\", { className: styles.switch }, /* @__PURE__ */ React__default.createElement(Switch, { ...props }));\n};\nconst getStyles = () => {\n return {\n switch: css({\n display: \"flex\",\n alignItems: \"center\",\n minHeight: 30\n })\n };\n};\n\nexport { EditorSwitch };\n//# sourceMappingURL=EditorSwitch.js.map\n"],"names":["EditorRows","children","EditorHeader","styles","getStyles","theme","AccessoryButton","className","props","getButtonStyles","EditorList","items","renderItem","onChange","ref","onAddItem","newItems","onChangeItem","itemIndex","newItem","onDeleteItem","item","index","useLatest","value","FlexItem","grow","shrink","nextTagID","Tag","name","set","base","modified","mod","nameOrParent","parent","tag","t","Modifier","a","b","nextModifierID","mods","exists","sameArray","m","configs","powerSet","config","x","i","array","sets","j","e","styleTags","spec","byName","prop","tags","part","pieces","mode","rest","pos","next","last","inner","rule","Rule","ruleNodeProp","context","other","tagHighlighter","options","map","style","scope","all","cls","sub","tagClass","highlightTags","highlighters","result","highlighter","highlightTree","tree","putStyle","from","to","builder","HighlightBuilder","highlightCode","code","putText","putBreak","writeTo","p","classes","text","nextBreak","upto","at","span","cursor","inheritedClass","type","start","end","h","getStyleTags","tagCls","mounted","innerHighlighters","hasChild","nextPos","rangeFrom","rangeTo","node","comment","typeName","propertyName","literal","string","number","content","heading","keyword","operator","punctuation","bracket","meta","val","classHighlighter","inf$1","nan$1","Bool$1","Ignoring$1","On$1","GroupLeft$1","GroupRight$1","Offset$1","Atan2$1","Avg$1","Bottomk$1","Count$1","CountValues$1","Group$1","Max$1","Min$1","Quantile$1","LimitK$1","LimitRatio$1","Stddev$1","Stdvar$1","Sum$1","Topk$1","By$1","Without$1","And$1","Or$1","Unless$1","Start$1","End$1","keywordTokens","specializeIdentifier","stack","contextualKeywordTokens","extendIdentifier","promQLHighLight","spec_Identifier","parser","inf","nan","Bool","Ignoring","On","GroupLeft","GroupRight","Offset","Atan2","Avg","Bottomk","Count","CountValues","Group","Max","Min","Quantile","LimitK","LimitRatio","Stddev","Stdvar","Sum","Topk","By","Without","And","Or","Unless","Start","End","LineComment","PromQL","AggregateExpr","AggregateOp","AggregateModifier","GroupingLabels","LabelName","QuotedLabelName","StringLiteral","FunctionCallBody","BinaryExpr","Pow","BoolModifier","MatchingModifierClause","Mul","Div","Mod","Add","Sub","Eql","Gte","Gtr","Lte","Lss","Neq","FunctionCall","FunctionIdentifier","AbsentOverTime","Identifier","Absent","Abs","Acos","Acosh","Asin","Asinh","Atan","Atanh","AvgOverTime","Ceil","Changes","Clamp","ClampMax","ClampMin","Cos","Cosh","CountOverTime","DaysInMonth","DayOfMonth","DayOfWeek","DayOfYear","Deg","Delta","Deriv","Exp","Floor","HistogramCount","HistogramFraction","HistogramQuantile","HistogramStdDev","HistogramStdVar","HistogramSum","HistogramAvg","DoubleExponentialSmoothing","Hour","Idelta","Increase","Info","Irate","LabelReplace","LabelJoin","LastOverTime","Ln","Log10","Log2","MadOverTime","MaxOverTime","MinOverTime","TsOfMaxOverTime","TsOfMinOverTime","TsOfLastOverTime","Minute","Month","Pi","PredictLinear","PresentOverTime","QuantileOverTime","Rad","Rate","Resets","Round","Scalar","Sgn","Sin","Sinh","Sort","SortDesc","SortByLabel","SortByLabelDesc","Sqrt","StddevOverTime","StdvarOverTime","SumOverTime","Tan","Tanh","Timestamp","Time","Vector","Year","MatrixSelector","NumberDurationLiteralInDurationContext","NumberDurationLiteral","OffsetExpr","ParenExpr","SubqueryExpr","UnaryExpr","UnaryOp","VectorSelector","LabelMatchers","UnquotedLabelMatcher","MatchOp","EqlSingle","EqlRegex","NeqRegex","QuotedLabelMatcher","StepInvariantExpr","At","AtModifierPreprocessors","MetricName","PromVisualQueryOperationCategory","PromOperationId","PromQueryPatternType","functionRendererLeft","model","def","innerExpr","params","renderParams","str","functionRendererRight","rangeRendererWithParams","renderLeft","rangeVector","rangeRendererRightWithParams","rangeRendererLeftWithParams","defaultAddOperationHandler","query","newOperation","getPromOperationDisplayName","funcName","getRangeVectorParamDef","withRateInterval","createAggregationOperation","overrides","getOnLabelAddedHandler","getAggregationExplainer","getAggregationByRenderer","getLastLabelRemovedHandler","getAggregationWithoutRenderer","createAggregationOperationWithParam","paramsDef","operations","getAggregationByRendererWithParameter","aggregation","aggregationName","labels","label","labelWord","restParamIndex","param","restParams","idx","changeToOperationId","op","isConflictingSelector","newLabel","operationIsNegative","candidate","binaryScalarDefs","binaryScalarOperatorToOperatorName","acc","binaryScalarOperations","opDef","defaultParams","getSimpleBinaryRenderer","bool","ErrorId","getLeftMostChild","cur","makeError","expr","getString","variableRegex","replaceVariables","replacedVariables","match","var1","var2","fmt2","var3","fieldPath","fmt3","fmt","variable","varType","replacement","varTypeFunc","v","f","returnVariables","makeBinOp","numberNode","hasBool","getAllByType","values","child","regexifyLabelValuesQueryString","BUILT_IN_VARIABLES","variableToReplacement","replacementToVariable","builtInVariablePattern","builtInVariableRegex","builtInReplacementPattern","builtInReplacementRegex","replaceBuiltInVariable","returnBuiltInVariable","isFunctionOrAggregation","buildVisualQueryFromString","replacedExpr","handleExpression","err","isEmptyQuery","visQuery","strLiteral","quotedMetric","quotedLabel","getLabel","handleFunction","handleAggregation","handleBinary","isIntervalVariableError","labelType","rangeFunctions","nameNode","body","interval","updateFunctionArgs","modifier","identifierNode","customVarName","left","binModifier","getBinaryModifier","right","leftNumber","rightNumber","rightBinary","newIdx","leftMostChild","binQuery","groupingLabels","interpolateQueryExpr","prometheusRegularEscape","prometheusSpecialRegexEscape","escapedValues","RE2_METACHARACTERS","escapePrometheusRegexp","escapeLabelValueInExactSelector","labelValue","escapeLabelValueInRegexSelector","renderLabels","filter","usingRegexOperator","renderLabelsWithoutBrackets","renderedLabels","renderOperations","queryString","operationsRegistry","operation","hasBinaryOp","renderBinaryQueries","binaryQueries","renderBinaryQuery","leftOperand","binaryQuery","renderQuery","nested","hasNesting","hasBinaryOperation","rightOperand","renderNestedPart","vectorMatchingStr","renderedQuery","hasOps","hasNestedBinary","addLabelToQuery","key","vectorSelectorPositions","getVectorSelectorPositions","toLabelFilter","addFilter","positions","transformedValue","newQuery","prev","isLast","labelToMatch","labelExists","newLabels","SUM_HINT_THRESHOLD_COUNT","getQueryHints","series","datasource","hints","metricsMetadata","simpleQueryCheck","queryTokens","getQueryTokens","nameMetric","checkMetricType","nameMatch","counterNameMetric","certain","metricTypeChecked","fixableQuery","fix","expandQueryHints","getExpandRulesHints","getInitHints","isRuleInQuery","ruleName","mapping","mappingForQuery","expandedQuery","identifier","identifierValue","getRecordingRuleIdentifierIdx","queryStr","queryMetricLabels","getQueryLabelsForRuleName","uuidLabel","uuidLabelValue","uuidLabelIdx","qml","mp","metricName","token","metricType","metadata","buildSelector","selectedMetric","selectedLabelValues","selectorParts","useMetricsLabelsValues","timeRange","languageProvider","timeRangeRef","lastSeriesLimitRef","isInitializedRef","seriesLimit","setSeriesLimit","setErr","status","setStatus","validationStatus","setValidationStatus","metrics","setMetrics","setSelectedMetric","labelKeys","setLabelKeys","selectedLabelKeys","setSelectedLabelKeys","lastSelectedLabelKey","setLastSelectedLabelKey","labelValues","setLabelValues","setSelectedLabelValues","isLoadingLabelKeys","setIsLoadingLabelKeys","isLoadingLabelValues","setIsLoadingLabelValues","effectiveLimit","handleError","msg","getMetricDetails","buildSafeSelector","metric","selector","loadSelectedLabelsFromStorage","availableLabelKeys","labelKeysInLocalStorageAsString","slk","fetchMetrics","safeSelector","fetchLabelKeys","fetchLabelValues","transformedLabelValues","newSelectedLabelValues","lk","initialize","transformedMetrics","transformedLabelKeys","labelKeysInLocalStorage","useDebounce","newSelectedMetric","fetchedMetrics","fetchedLabelKeys","newSelectedLabelKeys","labelKey","lkIdx","newLabelValues","isSelected","newLastSelectedLabelKey","fetchedLabelValues","newMetrics","newLabelKeys","labelKeysSelector","results","MetricsBrowserContext","MetricsBrowserProvider","handleSelectedMetricChange","handleSelectedLabelKeyChange","handleSelectedLabelValueChange","handleValidation","handleClear","getSelector","useMetricsBrowser","getStylesMetricsBrowser","getStylesMetricSelector","getStylesLabelSelector","getStylesValueSelector","getStylesSelectorActions","LabelSelector","sharedStyles","labelSearchTerm","setLabelSearchTerm","onLabelKeyClick","filteredLabelKeys","Label","Input","selectors","Spinner","MetricSelector","metricSearchTerm","setMetricSearchTerm","onMetricClick","filteredMetrics","SelectorActions","onValidationClick","onClearClick","onClickRunQuery","onClickRunRateQuery","empty","Stack","Button","ValueSelector","valueSearchTerm","setValueSearchTerm","onLabelValueClick","lv","MetricsBrowser","promLanguageDefinition","makeStorageService","strings","data","fallbackValue","target","reason","overrideServices","getOverrideServices","PrometheusCacheLevel","PromApplication","LegendFormatMode","PromVariableQueryType","getDebounceTimeInMilliseconds","cacheLevel","getDaysToCacheMetadata","getCacheDurationInMinutes","buildCacheHeaders","durationInSeconds","getDefaultCacheHeaders","processHistogramMetrics","resultSet","regexp","processLabels","withName","valueSet","__name__","valueArray","limitSuggestions","labelRegexp","expandRecordingRules","getRuleRegex","tmpSplitParts","curr","parts","tmpParts","removeIdx","ri","labelFound","tsp","recordingRule","invalidLabelsRegex","addLabelsToExpression","invalidLabelsRegexp","indexOfRegexMatch","exprBeforeRegexMatch","exprAfterRegexMatch","arrayOfLabelObjects","comma","space","obj","existingLabel","potentialLeftOver","fixSummariesMetadata","baseMetadata","summaryMetadata","syntheticMetadata","roundMsToMin","milliseconds","roundSecToMin","seconds","roundSecToNextMin","secondsToRound","FromPromLikeMap","ToPromLikeMap","toPromLikeExpr","labelBasedQuery","toPromLikeQuery","getMaybeTokenStringContent","extractLabelMatchers","tokens","labelMatchers","labelOperator","contentTokens","currentToken","currentStr","labelComparator","getRangeSnapInterval","range","getPrometheusTime","startTime","startTimeQuantizedSeconds","endTime","endTimeQuantizedSeconds","endTimePlusOneStep","date","roundUp","truncateResult","limit","removeQuotesIfExist","input","CODE_MODE_SUGGESTIONS_INCOMPLETE_EVENT","isSuggestionsIncompleteEvent","DataProvider","searchTerm","error","metricNames","metaItem","textInput","NeverCaseError","InsertAsSnippet","metricNamesSearch","snippetMarker","filterMetricNames","inputText","fuzzyResults","getAllMetricNamesCompletions","dataProvider","getFunctionCompletions","getFunctionsOnlyCompletions","getAllFunctionsAndMetricNamesCompletions","DURATION_COMPLETIONS","getAllHistoryCompletions","makeSelector","allLabels","getLabelNames","otherLabels","labelNames","usedLabelNames","getLabelNamesForCompletions","suffix","triggerOnInsert","isUtf8","getLabelNamesForSelectorCompletions","getLabelNamesForByCompletions","getLabelValues","labelName","getLabelValuesForMetricCompletions","betweenQuotes","formatLabelValueForCompletion","getCompletions","situation","triggerType","historyCompletions","move","direction","walk","path","current","expectedType","getNodeText","utf8","nodeFrom","nodeTo","parsePromQLStringLiteral","inside","isPathMatch","resolverPath","cursorPath","ERROR_NODE_NAME","RESOLVERS","resolveLabelKeysWithEquals","resolveUtf8LabelKeysWithEquals","resolveTopLevel","resolveInFunction","resolveLabelMatcher","resolveQuotedLabelMatcher","resolveDurations","resolveLabelsForGrouping","LABEL_OP_MAP","getLabelOp","opNode","opChild","labelMatcherNode","valueNode","getLabels","labelMatchersNode","matcher","ln","notEmpty","getNodeChildren","getNodeInSubtree","typeId","aggrExpNode","bodyNode","metricIdNode","inStringNode","labelNameNode","getMetricName","legacyMetricNameNode","utf8MetricNameNode","getErrorNode","getSituation","maybeErrorNode","currentNode","ids","resolver","TRIGGER_CHARACTERS","MIN_WORD_LENGTH_FOR_FULL_COMPLETIONS","getSuggestOptions","getMonacoCompletionItemKind","monaco","getTriggerType","word","position","state","charBeforeCursor","getCompletionProvider","provideCompletionItems","adjustedPosition","getAdjustedPosition","offset","maxIndexDigits","adjustedColumn","selectedText","warningTypes","NodeType","validateQuery","interpolatedQuery","queryLines","interpolatedErrors","interpolatedWarnings","parseQuery","parseErrors","parseWarnings","queryErrors","queryWarnings","interpolatedError","queryError","interpolatedWarning","queryWarning","errorBoundaries","parseError","findIssueBoundary","isValidIssueBoundary","warningBoundaries","parseWarning","nodeRef","durations","issueType","isEmptyString","errorNode","issue","startPos","endPos","line","boundary","placeHolderScopedVars","languageConfiguration","aggregations","functions","aggregationsOverTime","_i","aggregations_1","agg","vectorMatching","vectorMatchingRegex","operators","offsetModifier","language","EDITOR_HEIGHT_OFFSET","PROMQL_LANG_ID","PROMQL_SETUP_STARTED","ensurePromQL","aliases","extensions","mimetypes","placeholder","id","overrideServicesRef","containerRef","history","onBlur","onRunQuery","initialValue","lpRef","historyRef","onRunQueryRef","onBlurRef","autocompleteDisposeFun","editor","isEditorFocused","completionProvider","completionState","filteringCompletionProvider","dispose","handleKeyDown","event","updateElementHeight","containerDiv","pixelHeight","pixelWidth","placeholderDecorators","decorators","checkDecorators","newDecorators","errors","warnings","errorMarkers","warningMarkers","MonacoQueryFieldLazy","MonacoQueryFieldWrapper","lastRunValueRef","handleRunQuery","handleBlur","PromQueryField","app","ExtraFieldElement","hideMetricsBrowser","hint","setHint","labelBrowserVisible","setLabelBrowserVisible","refreshHint","initHint","queryHints","queryHint","onChangeQuery","override","nextQuery","onChangeLabelBrowser","onClickChooserButton","onClickHintFix","Icon","OperationExplainedBox","title","stepNumber","markdown","RawQuery","lang","highlighted","OperationListExplained","queryModeller","onMouseEnter","onMouseLeave","getOperationDefinitions","createFunction","createRangeFunction","addOperationWithRangeVector","operationTypeChangedHandlerForRangeFunction","addNestedQueryHandler","labelJoinRenderer","labelJoinExplainHandler","labelJoinAddOperationHandler","definition","operationWithRangeVectorRenderer","newDef","modeller","paramZero","separator","explainMessage","getAggregationOperations","createAggregationOverTime","PromQueryModellerBase","getOperations","Registry","categories","category","PromQueryModeller","allOperations","func","promQueryModeller","EXPLAIN_LABEL_FILTER_CONTENT","PromQueryBuilderExplained","promql","PromQueryCodeEditor","showExplain","PLACEHOLDER_TITLE","PLACEHOLDER_TEXT","PLACEHOLDER_TAGS","AnnotationQueryEditor","annotation","onAnnotationChange","handleMinStepChange","handleTitleChange","handleTagsChange","handleTextChange","handleUseValueForTimeChange","checked","EditorRow","EditorField","AutoSizeInput","Space","EditorSwitch","ANNOTATION_QUERY_STEP_DEFAULT","PrometheusAnnotationSupport","ds","json","anno","frames","Observable","tagKeys","titleFormat","textFormat","regex","stepValue","step","tagKeysArray","eventList","frame","timeField","valueField","timeValueTuple","timeStampValue","valueValue","time","activeValuesTimestamps","latestEvent","timestamp","of","BaseResourceClient","request","effectiveMatch","searchParams","url","response","LabelsApiClient","ResourceClientsCache","timeParams","maybeCachedKeys","res","interpolatedName","interpolatedAndEscapedName","maybeCachedValues","SeriesApiClient","processSeries","metricFilter","labelFilters","lf","keys","cacheKey","snappedTimeRange","currentEntries","entriesToRemove","size","count","timestamp1","timestamp2","findValuesForKey","DEFAULT_KEYS","API_V1","PromQlLanguageProvider","initialValues","isCancelledError","queries","q","visualQuery","isUtf8Metric","bq","requestId","withLimit","interpolatedMatch","urlParams","requestOptions","possibleLabelNames","l","ac","scopes","adhocFilters","headers","PrometheusLanguageProvider","importFromAbstractQuery","exportToAbstractQuery","promQuery","nameLabelValue","getNameLabelValue","populateMatchParamsFromQueries","PrometheusLabelNamesRegex","PrometheusLabelValuesRegex","PrometheusMetricNamesRegex","PrometheusQueryResultRegex","PrometheusLabelNamesRegexWithMatch","migrateVariableQueryToEditor","rawQuery","queryBase","labelNamesMatchQuery","labelValuesCheck","metricNamesCheck","queryResultCheck","queryResult","varQuery","migrateVariableEditorBackToVariableSupport","QueryVariable","visualQueryQuery","removeLineBreaks","PrometheusMetricFindQuery","labelNamesRegex","labelNamesRegexWithMatch","labelValuesRegex","metricNamesRegex","queryResultRegex","labelNamesQuery","labelValuesQuery","isFilterDefined","metricNamesQuery","queryResultQuery","metricFilterPattern","metricData","k","defaultPrometheusQueryOverlapWindow","getFieldIdentity","field","QueryCache","scopedVars","unverifiedOverlap","duration","newFrom","newTo","shouldCache","doPartialQuery","prevTo","reqTargetSignatures","targetIdentity","targetSignature","cached","newFromPartial","newToDate","newFromPartialDate","targSig","targIdent","requestInfo","respFrames","respByTarget","targetIdent","outFrames","cachedFrames","respFrame","respFrameIdentity","cachedFrame","prevTable","nextTable","amendedTable","nonEmptyCachedFrames","table","dataPointStep","findDatapointStep","trimmed","applyInterpolation","minStepMs","trackQuery","LabelFilterItem","defaultOp","onDelete","onGetLabelNames","onGetLabelValues","invalidLabel","invalidValue","getLabelValuesAutofillSuggestions","debounceDuration","setState","labelNamesMenuOpen","setLabelNamesMenuOpen","labelValuesMenuOpen","setLabelValuesMenuOpen","setAllLabels","isMultiSelect","getSelectOptionsFromString","regExp","matches","labelValueSearch","labelNamesSearch","itemValue","InputGroup","truncatedLabelNames","change","Select","changes","MISSING_LABEL_FILTER_ERROR_MESSAGE","LabelFilters","labelsFilters","labelFilterRequired","variableEditor","setItems","onLabelsChange","hasLabelFilter","editorList","InlineFieldRow","InlineLabel","EditorFieldGroup","formatPrometheusLabelFiltersToString","filterArray","formatPrometheusLabelFilters","formatKeyValueStrings","FeedbackLink","feedbackUrl","HISTOGRAM_TYPES","OLD_HISTOGRAM_PATTERN","HISTOGRAM_TYPE","NATIVE_HISTOGRAM_TYPE","generateMetricData","description","oldHistogramMatch","calculatePageList","metricsData","resultsPerPage","totalPages","_","getPromTypes","getPlaceholders","uf","uFuzzy","fuzzySearch","haystack","idxs","info","order","haystackOrder","matchesSet","mark","matched","infoIdx","DEFAULT_RESULTS_PER_PAGE","MetricsModalContext","MetricsModalContextProvider","isLoading","setIsLoading","setMetricsData","pagination","setPagination","selectedTypes","setSelectedTypes","searchedText","setSearchedText","filteredMetricsData","selectedType","totalPageNum","pageNum","prevPagination","latestSearchIdRef","fetchMetadata","processedData","debouncedBackendSearch","metricText","queryLabels","searchId","fuzzyOrderedMetrics","resultsOptions","useMetricsModal","docsTip","validateInput","pattern","errorMessage","defaultErrorMessage","inputTooLongErrorMessage","validationTimeoutErrorMessage","invalidValidationPatternErrorMessage","timeout","isValid","overhaulStyles","getMetricsModalStyles","getResultsTableStyles","ResultsTable","onClose","slicedMetrics","startIndex","endIndex","selectMetric","metaRows","displayType","addHelpIcon","fullType","descriptiveType","link","Tooltip","noMetricsMessages","message","metricsModaltestIds","MetricsModalContent","isOpen","placeholders","typeOptions","searchCallback","fullMetaSearchVal","Modal","Pagination","MetricsModal","MetricCombobox","onGetMetrics","metricsModalOpen","setMetricsModalOpen","getMetricLabels","onComboboxChange","opt","loadOptions","option","asyncSelect","Combobox","InlineField","MetricsLabelsSection","onChangeLabels","withTemplateVariableOptions","optionsPromise","variables","forLabel","labelsToConsider","getLabelValuesAutocompleteSuggestions","interpolatedLabelsToConsider","labelObject","toSelectableValue","getMetrics","getMetadataString","help","variableOptions","refId","PromVariableQueryEditor","qryType","setQryType","setLabel","labelNamesMatch","setLabelNamesMatch","setMetric","setVarQuery","seriesQuery","setSeriesQuery","classicQuery","setClassicQuery","truncatedLabelOptions","setTruncatedLabelOptions","allLabelOptions","setAllLabelOptions","setLabels","names","truncatedNames","setLabelFilters","variableQuery","variableMigration","labelToConsider","onChangeWithVariableString","updateVar","updLabelFilters","updatedVar","onQueryTypeChange","newType","onLabelChange","newLabelvalue","metricsLabelsChange","update","updMetric","onLabelNamesMatchChange","onMetricChange","onVarQueryChange","onSeriesQueryChange","onClassicQueryChange","promVisualQuery","TextArea","PrometheusVariableSupport","templateSrv","interpolated","metricFindQuery","PrometheusDatasource","DataSourceWithBackend","instanceSettings","ruleGroups","extractRuleMappingFromGroups","targetVersion","targetFlavor","httpOptions","throwError","queryUrl","abstractQueries","abstractQuery","endpoint","lastValueFrom","currentTargetIdx","targets","utcOffset","processedTargets","processedTarget","shouldUseIncrementalQuery","fullOrPartialRequest","amendedResponse","tap","msRange","sRange","extractResourceMatcher","filters","expandedQueries","replacedInterpolatedQuery","targetHasScopes","action","expression","exprWithAdhoc","fromExploreMetrics","defaults","groups","group","existingRule","metricMatch","labelsMatch","QueryPattern","onPatternSelect","hasNewQueryOption","hasPreviousQuery","selectedPatternName","setSelectedPatternName","Card","QueryPatternsModal","onAddQuery","openTabs","setOpenTabs","hasOperations","hasMetric","hasLabels","hasBinaryQueries","selectAsNewQuery","renderedExpr","patternType","Collapse","tabs","promQueryEditorExplainKey","getFlagValue","defaultValue","store","setFlagValue","useFlag","flag","updateFlag","setter","QueryEditorMode","QueryEditorModeToggle","editorModes","RadioButtonGroup","QueryHeaderSwitch","inputProps","dashedLabel","switchIdRef","Switch","queryEditorModeDefaultLocalStorageKey","changeEditorMode","editorMode","getDefaultEditorMode","defaultEditor","getQueryWithDefaults","isBothInstantAndRange","OperationInfoButton","show","setShow","middleware","floating","refs","floatingStyles","click","dismiss","getReferenceProps","getFloatingProps","Portal","getOperationDocs","OperationHeader","onRemove","dragHandleProps","onToggleSwitcher","alternatives","alt","newParams","changedOp","getOperationParamId","operationId","paramIndex","LabelParamEditor","loadGroupByLabels","editorMap","getOperationParamEditor","paramDef","SimpleInputParamEditor","SelectInputParamEditor","BoolInputParamEditor","evt","Checkbox","selectOptions","valueOption","OperationEditor","flash","highlight","shouldFlash","useFlash","onParamValueChanged","paramIdx","callParamChangedThenOnChange","onAddRestParam","onRemoveRestParam","operationElements","Editor","restParam","lastParamDef","renderAddRestParamButton","provided","keepFlash","setKeepFlash","operationIndex","OperationList","highlightedOp","opsToHighlight","useOperationsHighlight","cascaderOpen","setCascaderOpen","onOperationChange","updatedList","addOptions","onAddOperation","operationDef","onDragEnd","element","onCascaderBlur","Cascader","isMounted","useMountedState","prevOperations","usePrevious","newOps","newOp","isSameOp","op1","op2","OperationsEditorRow","QueryBuilderHints","setHints","newVisualQuery","QueryBuilderContent","setHighlightedOp","initHints","NestedQuery","nestedQuery","IconButton","NestedQueryList","nestedQueries","onNestedQueryUpdate","PromQueryBuilder","QueryPreview","PromQueryBuilderContainer","rendered","setRendered","parseResult","onVisQueryChange","PromExemplarField","setError","prevError","iconButtonStyles","PromExploreExtraField","rangeOptions","getQueryTypeOptions","prevQuery","onExemplarChange","exemplar","onChangeQueryStep","onStepChange","onReturnKeyDown","getQueryTypeChangeHandler","promExploreExtraFieldTestIds","includeBoth","queryType","QueryOptionGroup","collapsedInfo","toggleOpen","useToggle","getLegendModeOptions","PromQueryLegendEditor","legendFormat","getLegendMode","inputRef","legendModeOptions","onLegendFormatChanged","newFormat","onLegendModeChanged","getLegendModeLabel","INTERVAL_FACTOR_OPTIONS","PromQueryBuilderOptions","FORMAT_OPTIONS","onChangeFormat","onChangeStep","queryTypeOptions","isEnabled","onIntervalFactorChange","formatOption","queryTypeValue","getQueryTypeValue","queryTypeLabel","getCollapsedInfo","shouldShowExemplarSwitch","PromQueryEditorSelector","parseModalOpen","setParseModalOpen","queryPatternsModalOpen","setQueryPatternsModalOpen","dataIsStale","setDataIsStale","explain","setExplain","onEditorModeChange","newMetricEditorMode","onChangeInternal","onShowExplainChange","handleOpenQueryPatternsModal","ConfirmModal","PromQueryEditorForAlerting","alertingTestIds","PromQueryEditorByAppBase","PromQueryEditorByApp","CHEAT_SHEET_ITEMS","PromCheatSheet","AzureCloud","AzureCloud2","predefinedClouds","getAzureClouds","settingsEx","getDefaultAzureCloud","resolveLegacyCloudName","cloudName","instanceOfAzureCredential","authType","object","concealed","concealedLegacy","isCredentialsComplete","credentials","ignoreSecret","getClientSecret","secret","getAdPassword","getDatasourceCredentials","oboEnabled","serviceCredentials","updateDatasourceCredentials","clientSecret","hasCredentials","ResourceTypes","MetricsSupportedTypes","AlertingSettingsOverhaul","onOptionsChange","ConfigSubSection","ExemplarSetting","disabled","isInternalLink","setIsInternalLink","ev","DataSourcePicker","ExemplarsSettings","newField","newOptions","PromFlavorVersions","cacheValueOptions","prometheusFlavorSelectItems","getOptionsWithDefaults","PromSettings","editorOptions","optionsWithDefaults","validDuration","updateValidDuration","onChangeHandler","o","exemplarOptions","getValueFromEventItem","eventItem","getAzureCloudOptions","cloud","getDefaultCredentials","getCredentials","updateCredentials","setDefaultCredentials","resetCredentials","AzureCredentialsForm","azureCloudOptions","onCredentialsChange","managedIdentityEnabled","workloadIdentityEnabled","authTypeOptions","opts","onAuthTypeChange","selected","defaultAuthType","updated","onAzureCloudChange","onTenantIdChange","onClientIdChange","onClientSecretChange","onClientSecretReset","AzureAuthSettings","dataSourceConfig","overrideAudienceAllowed","overrideAudienceChecked","setOverrideAudienceChecked","onOverrideAudienceChange","onResourceIdChange","useEffectOnce","DataSourcehttpSettingsOverhaul","azureAuthSettings","sigV4AuthToggleEnabled","renderSigV4Editor","secureSocksDSProxyEnabled","newAuthProps","customMethods","sigV4Selected","setSigV4Selected","sigV4Id","sigV4Option","azureAuthEnabled","azureAuthSelected","setAzureAuthSelected","azureAuthId","azureAuthOption","returnSelectedMethod","urlTooltip","ConnectionSettings","Alert","Auth","method","SecureSocksProxySettings","PROM_CONFIG_LABEL_WIDTH","ConfigEditor","enabled","DataSourceDescription","ConfigSection","AdvancedHttpSettings","INFINITY_SAMPLE_REGEX","isTableResult","dataFrame","isCumulativeHeatmapResult","transformV2","fieldCopy","tableFrames","framesWithoutTable","df","processedTableFrames","transformDFToTable","exemplarFrames","framesWithoutTableAndExemplars","destinations","processedExemplarFrames","exemplarTraceIdDestination","traceIDField","links","getDataLinks","heatmapResults","framesWithoutTableHeatmapsAndExemplars","le","heatmapResultsGroupedByQuery","processedHeatmapResultsGroupedByQuery","heatmapResultsGroup","heatmapResultsGroupedByValues","HISTOGRAM_QUANTILE_LABEL_NAME","notLE","dataFrames","sortedHeatmap","sortSeriesByLabel","mergeHeatmapFrames","transformToHistogramOverTime","otherFrames","flattenedProcessedHeatmapFrames","dfs","dataFramesByRefId","refIds","valueText","getValueText","getValueField","getTimeField","labelFields","promLabels","prevTime","needsSort","timeFields","dataFields","parseSampleValue","labelsForField","getLabelValue","fields","responseLength","dataLinks","dsSettings","isMs","valueName","parseValue","displayNameFromDS","getOriginalMetricName","labelData","labelPart","countFields","seriesList","topSeries","s","bottomSeries","bottomPoint","s1","s2","le1","le2","modifiedChildren","borderPriority"],"sourceRoot":""}
.
Edit
..
Edit
1117.145ac642f59357bc40d8.js
Edit
1117.145ac642f59357bc40d8.js.map
Edit
1118.c684d1aadf16a6c70620.js
Edit
1118.c684d1aadf16a6c70620.js.map
Edit
1122.5fbf0d7cd148c610616d.js
Edit
1122.5fbf0d7cd148c610616d.js.map
Edit
1142.a4b35a0e8699cafd901e.js
Edit
1142.a4b35a0e8699cafd901e.js.map
Edit
1162.81868b3ac499fa5ea04b.js
Edit
1162.81868b3ac499fa5ea04b.js.map
Edit
1183.7444f51e5996a7f23c7d.js
Edit
1183.7444f51e5996a7f23c7d.js.map
Edit
1282.ae38cac1b732d8ac1d96.js
Edit
1282.ae38cac1b732d8ac1d96.js.map
Edit
130.a58aaeea748f37ee6482.js
Edit
130.a58aaeea748f37ee6482.js.map
Edit
1419.59f53ae25085b28e1e11.js
Edit
1419.59f53ae25085b28e1e11.js.map
Edit
1420.e63ce495727f83b8887d.js
Edit
1420.e63ce495727f83b8887d.js.map
Edit
1438.ccdd05d7188edf4191ff.js
Edit
1438.ccdd05d7188edf4191ff.js.map
Edit
1446.fe7b1f4563629b80793f.js
Edit
1446.fe7b1f4563629b80793f.js.map
Edit
1484.3da94e44ecdadcd342d4.js
Edit
1484.3da94e44ecdadcd342d4.js.map
Edit
1492.4026c6e7130c3afdae87.js
Edit
1494.ef220afb67ff6c52c7af.js
Edit
1494.ef220afb67ff6c52c7af.js.map
Edit
1560.538cd2395be11ba4e2c9.js
Edit
1560.538cd2395be11ba4e2c9.js.map
Edit
1579.c391ef869d4f7bfc0d1c.js
Edit
1579.c391ef869d4f7bfc0d1c.js.map
Edit
1646.d7d87a40853795910533.js
Edit
1646.d7d87a40853795910533.js.map
Edit
1710.7db3f56c6714c0c340e0.js
Edit
1710.7db3f56c6714c0c340e0.js.map
Edit
1716.f71f518289da5d2229bc.js
Edit
1716.f71f518289da5d2229bc.js.map
Edit
1740.baf38e7ee007e1a6935e.js
Edit
1740.baf38e7ee007e1a6935e.js.map
Edit
1821.c9a2456dc8d78cf6b02f.js
Edit
1821.c9a2456dc8d78cf6b02f.js.map
Edit
1888.d33142738af4fbf8a230.js
Edit
1888.d33142738af4fbf8a230.js.map
Edit
1914.5f33b3c2133b5bb7ea6e.js
Edit
1914.5f33b3c2133b5bb7ea6e.js.map
Edit
198.65a768ff6c601d19ea3f.js
Edit
198.65a768ff6c601d19ea3f.js.map
Edit
1990.9171129a8deabb59bf30.js
Edit
1990.9171129a8deabb59bf30.js.map
Edit
2018.5ff00ee0456301c1cf43.js
Edit
2018.5ff00ee0456301c1cf43.js.map
Edit
205.2eb73847215c8d021cc9.js
Edit
205.2eb73847215c8d021cc9.js.map
Edit
2077.a5848ca4b4b9fdebca17.js
Edit
2077.a5848ca4b4b9fdebca17.js.map
Edit
2094.97e7f0876201e76a77fd.js
Edit
2094.97e7f0876201e76a77fd.js.map
Edit
2150.7576285186c713978b39.js
Edit
2150.7576285186c713978b39.js.map
Edit
2152.b55841e6f422682a3891.js
Edit
2152.b55841e6f422682a3891.js.map
Edit
221.0fc4d14d0a67f3a25d64.js
Edit
221.0fc4d14d0a67f3a25d64.js.map
Edit
2218.623d73bd0985ddf5f8c4.js
Edit
2218.623d73bd0985ddf5f8c4.js.map
Edit
2223.e65417164a45701ed9dc.js
Edit
2223.e65417164a45701ed9dc.js.map
Edit
2244.70c156ada2487a05595c.js
Edit
2244.70c156ada2487a05595c.js.map
Edit
2278.f887de0a65e1b784ea9f.js
Edit
2278.f887de0a65e1b784ea9f.js.map
Edit
2288.6a65ba08c6c0f4f83435.js
Edit
2288.6a65ba08c6c0f4f83435.js.map
Edit
2311.73e1a2b949d289f5d6c9.js
Edit
2311.73e1a2b949d289f5d6c9.js.map
Edit
2398.d142e32be48079fc63c0.js
Edit
2398.d142e32be48079fc63c0.js.map
Edit
2405.c1b37a7cc8182472f6a6.js
Edit
2405.c1b37a7cc8182472f6a6.js.map
Edit
2446.0418c7ea000998178d8b.js
Edit
2446.0418c7ea000998178d8b.js.map
Edit
2450.d73c024ff7273aebf911.js
Edit
2450.d73c024ff7273aebf911.js.map
Edit
2586.668c65b61e9ea31b5bca.js
Edit
2586.668c65b61e9ea31b5bca.js.map
Edit
265.ed6933785cc750cbd9ed.js
Edit
265.ed6933785cc750cbd9ed.js.map
Edit
2658.7f70ebc378803654a814.js
Edit
2658.7f70ebc378803654a814.js.map
Edit
2686.ae267304ddd1380c30c7.js
Edit
2686.ae267304ddd1380c30c7.js.map
Edit
2692.fa24ada7d987a7ee05f1.js
Edit
2692.fa24ada7d987a7ee05f1.js.map
Edit
2699.b79e57051a1a63376320.js
Edit
2699.b79e57051a1a63376320.js.map
Edit
2710.e1ac8e57578a838f5bd8.js
Edit
2710.e1ac8e57578a838f5bd8.js.map
Edit
2744.d6b14bf01022bdb8eab5.js
Edit
2744.d6b14bf01022bdb8eab5.js.map
Edit
2745.8049d948cb362dfc6cb3.js
Edit
2745.8049d948cb362dfc6cb3.js.map
Edit
2835.01beb5b1a252d779aad7.js
Edit
2835.01beb5b1a252d779aad7.js.map
Edit
2961.4b27b21453fdbb115dd4.js
Edit
2961.4b27b21453fdbb115dd4.js.map
Edit
2962.85c9dc0cca68efab5e0c.js
Edit
2962.85c9dc0cca68efab5e0c.js.map
Edit
2975.e64aaea6ff35a7d3b3fd.js
Edit
2975.e64aaea6ff35a7d3b3fd.js.map
Edit
3003.f51365051eb27cf765d8.js
Edit
3003.f51365051eb27cf765d8.js.map
Edit
3042.44bad7d2d0536000b808.js
Edit
3042.44bad7d2d0536000b808.js.map
Edit
3062.ad5844391370fcc7525a.js
Edit
3062.ad5844391370fcc7525a.js.map
Edit
3082.704af6779ad700a5fa42.js
Edit
3082.704af6779ad700a5fa42.js.map
Edit
3096.aed61083f1ba4803ae84.js
Edit
3096.aed61083f1ba4803ae84.js.map
Edit
3126.10c85e1f02105e470a69.js
Edit
3126.10c85e1f02105e470a69.js.map
Edit
3169.0b88a5a2340f70961599.js
Edit
3169.0b88a5a2340f70961599.js.map
Edit
3171.c79c28e2611563e2dbcb.js
Edit
3171.c79c28e2611563e2dbcb.js.map
Edit
3182.831f754ed3b6f10441a0.js
Edit
3182.831f754ed3b6f10441a0.js.map
Edit
3192.2cb90eadf3399270363e.js
Edit
3192.2cb90eadf3399270363e.js.map
Edit
3217.c6faaa4f5637068f90f3.js
Edit
3217.c6faaa4f5637068f90f3.js.map
Edit
3259.c8e4d6ad93201a56e49f.js
Edit
3259.c8e4d6ad93201a56e49f.js.map
Edit
3284.79c2897655286b0c1f6d.js
Edit
3284.79c2897655286b0c1f6d.js.map
Edit
3303.225dae64cff0c2280c3b.js
Edit
3303.225dae64cff0c2280c3b.js.map
Edit
3326.cabc370d66d7ecfbd2c3.js
Edit
3326.cabc370d66d7ecfbd2c3.js.map
Edit
344.85cff3029cbbb5463c7e.js
Edit
344.85cff3029cbbb5463c7e.js.map
Edit
3466.fda7da0cb4150e59da98.js
Edit
3466.fda7da0cb4150e59da98.js.map
Edit
3474.74dfd856a9528c758a57.js
Edit
3474.74dfd856a9528c758a57.js.map
Edit
348.fd20e2547f12dbed76c7.js
Edit
348.fd20e2547f12dbed76c7.js.map
Edit
3495.9c1ae6f61edf7aef207b.js
Edit
3495.9c1ae6f61edf7aef207b.js.map
Edit
3501.a0ee7c2b24136aa91eb5.js
Edit
3501.a0ee7c2b24136aa91eb5.js.map
Edit
3520.a3c2b474e2dcaf9879fc.js
Edit
3520.a3c2b474e2dcaf9879fc.js.map
Edit
3605.41e3c44dfe2ca2966198.js
Edit
3605.41e3c44dfe2ca2966198.js.map
Edit
362.e5ce68af98ee6713a4e7.js
Edit
362.e5ce68af98ee6713a4e7.js.map
Edit
3622.0b196041f825b42c5233.js
Edit
3622.0b196041f825b42c5233.js.map
Edit
3630.1ffe9229d5c27fd0823a.js
Edit
3630.1ffe9229d5c27fd0823a.js.map
Edit
3659.f5dc1bb19d36546aadb8.js
Edit
3659.f5dc1bb19d36546aadb8.js.map
Edit
3688.ec5e74c60569e9498687.js
Edit
3688.ec5e74c60569e9498687.js.map
Edit
3718.b570aa4fa35f8dfc686e.js
Edit
3718.b570aa4fa35f8dfc686e.js.map
Edit
3726.84ef8bb1304f7adbc7f3.js
Edit
3726.84ef8bb1304f7adbc7f3.js.map
Edit
398.ceeafcf522343c717c4b.js
Edit
398.ceeafcf522343c717c4b.js.map
Edit
4064.e52eb763993ad947e4a1.js
Edit
4064.e52eb763993ad947e4a1.js.map
Edit
407.594046bd73cc88c29e80.js
Edit
407.594046bd73cc88c29e80.js.map
Edit
4113.3fa5432815c4662eb03e.js
Edit
4113.3fa5432815c4662eb03e.js.map
Edit
4114.c4741f0a73781d3f87dc.js
Edit
4114.c4741f0a73781d3f87dc.js.map
Edit
4120.968e1408d894f8515330.js
Edit
4120.968e1408d894f8515330.js.map
Edit
4162.8b8a683fa98d677f9137.js
Edit
4162.8b8a683fa98d677f9137.js.map
Edit
4209.de7f2b850ee1292a67e5.js
Edit
4209.de7f2b850ee1292a67e5.js.map
Edit
4224.cc13db0c6e3f7fdb05c9.js
Edit
4224.cc13db0c6e3f7fdb05c9.js.map
Edit
4251.28e90ad13c8fe749062c.js
Edit
4251.28e90ad13c8fe749062c.js.map
Edit
4334.396d65b7ba31733108e9.js
Edit
4334.396d65b7ba31733108e9.js.map
Edit
4350.6db49924324f8061d361.js
Edit
4350.6db49924324f8061d361.js.map
Edit
4463.24a3e34bed64cbbb8b99.js
Edit
4463.24a3e34bed64cbbb8b99.js.map
Edit
4514.03e966fee9064d7305dd.js
Edit
4514.03e966fee9064d7305dd.js.map
Edit
4564.ea4a09ba96ddbf74a0ee.js
Edit
4564.ea4a09ba96ddbf74a0ee.js.map
Edit
46.7809585ddbb4791e248a.js
Edit
46.7809585ddbb4791e248a.js.map
Edit
4630.54d7f3b9d384c6b95bbc.js
Edit
4630.54d7f3b9d384c6b95bbc.js.map
Edit
4656.a07d832134b096826a58.js
Edit
4656.a07d832134b096826a58.js.map
Edit
468.d3a2ba8b0d226ca1475b.js
Edit
468.d3a2ba8b0d226ca1475b.js.map
Edit
4680.abd86af55b75e75326ab.js
Edit
4680.abd86af55b75e75326ab.js.map
Edit
4691.2f69f76af87a66a1513c.js
Edit
4691.2f69f76af87a66a1513c.js.map
Edit
4698.c9a2c562b12da12dc66e.js
Edit
4698.c9a2c562b12da12dc66e.js.map
Edit
4791.fc3ef0337811ab73b164.js
Edit
4791.fc3ef0337811ab73b164.js.map
Edit
4814.2d8cb562606e508512d8.js
Edit
4814.2d8cb562606e508512d8.js.map
Edit
4824.2da8107f19d58bf153e0.js
Edit
4824.2da8107f19d58bf153e0.js.map
Edit
4839.f4d2edd5c2678ef2b624.js
Edit
4839.f4d2edd5c2678ef2b624.js.map
Edit
4857.4971a98037d2ec3b663d.js
Edit
4857.4971a98037d2ec3b663d.js.map
Edit
4865.be02c1283a83523c4414.js
Edit
4865.be02c1283a83523c4414.js.map
Edit
494.5463fc5a297eaedd150f.js
Edit
494.5463fc5a297eaedd150f.js.map
Edit
4958.226af5f19bf47305a407.js
Edit
4958.226af5f19bf47305a407.js.map
Edit
4962.bbff24c5a85e9314600a.js
Edit
4962.bbff24c5a85e9314600a.js.map
Edit
4964.1f2cc5acc0078feb7b08.js
Edit
4964.1f2cc5acc0078feb7b08.js.map
Edit
4965.ccdc00d808390be53820.js
Edit
4965.ccdc00d808390be53820.js.map
Edit
5065.a2c71dab50ccb4174ee2.js
Edit
5065.a2c71dab50ccb4174ee2.js.map
Edit
5074.92e2d1ae98dcd913506e.js
Edit
5074.92e2d1ae98dcd913506e.js.map
Edit
5091.987ffc33b70121541e5d.js
Edit
5091.987ffc33b70121541e5d.js.map
Edit
5106.581eaf66a6592320d97a.js
Edit
5106.581eaf66a6592320d97a.js.map
Edit
5110.96d49ea826be96c65045.js
Edit
5110.96d49ea826be96c65045.js.map
Edit
5130.cbdddcd716a093bdbaac.js
Edit
5130.cbdddcd716a093bdbaac.js.map
Edit
5196.9b7364caf64a8583ad01.js
Edit
5196.9b7364caf64a8583ad01.js.map
Edit
5198.2cd64d4e16a385dd9b91.js
Edit
5198.2cd64d4e16a385dd9b91.js.map
Edit
5280.2c29942977baa2dfbe0e.js
Edit
5280.2c29942977baa2dfbe0e.js.map
Edit
5364.0288d9c98f74f26b73e7.js
Edit
5364.0288d9c98f74f26b73e7.js.map
Edit
5446.ad01d0b233122dd49849.js
Edit
5446.ad01d0b233122dd49849.js.map
Edit
5550.5bf3e7d23d6b104740fd.js
Edit
5550.5bf3e7d23d6b104740fd.js.map
Edit
5618.909592bbe054b70f2377.js
Edit
5618.909592bbe054b70f2377.js.map
Edit
5648.a1fc2b0cbbca9bfa1d94.js
Edit
5648.a1fc2b0cbbca9bfa1d94.js.map
Edit
5664.c55be32f6d459ac3f3d8.js
Edit
5664.c55be32f6d459ac3f3d8.js.map
Edit
5671.e1e396b75d7b95ef461f.js
Edit
5671.e1e396b75d7b95ef461f.js.map
Edit
5742.117597ec799ab75cb2f4.js
Edit
5742.117597ec799ab75cb2f4.js.map
Edit
5747.b9389680058c12ffba68.js
Edit
5747.b9389680058c12ffba68.js.map
Edit
5757.5a4b7f2368dd09da42be.js
Edit
5786.c45dfaf9e1d969472e5e.js
Edit
5786.c45dfaf9e1d969472e5e.js.map
Edit
5790.29b0a5797fd46e9664f5.js
Edit
5790.29b0a5797fd46e9664f5.js.map
Edit
5923.b9c876b4bf528d8511cb.js
Edit
5923.b9c876b4bf528d8511cb.js.map
Edit
5984.1efdc4bb85100bd19ca9.js
Edit
5984.1efdc4bb85100bd19ca9.js.map
Edit
5995.5c7a375f33ea1cd16daa.js
Edit
5995.5c7a375f33ea1cd16daa.js.map
Edit
6018.befdd11bf701ea71f7bf.js
Edit
6018.befdd11bf701ea71f7bf.js.map
Edit
6029.bdcbf27bcdd36812f646.js
Edit
6029.bdcbf27bcdd36812f646.js.map
Edit
6088.7f526abfdb4003574c68.js
Edit
6088.7f526abfdb4003574c68.js.map
Edit
613.084d33252856771cf6e1.js
Edit
613.084d33252856771cf6e1.js.map
Edit
6185.2a7c893c6b3f2f0dadb8.js
Edit
6185.2a7c893c6b3f2f0dadb8.js.map
Edit
6208.571f272269524cfd14e7.js
Edit
6208.571f272269524cfd14e7.js.map
Edit
6236.30d1fa6aee173c946c50.js
Edit
6236.30d1fa6aee173c946c50.js.map
Edit
6244.64f83fc5d05560979c51.js
Edit
6244.64f83fc5d05560979c51.js.map
Edit
6260.b8be95165766a81dade2.js
Edit
6260.b8be95165766a81dade2.js.map
Edit
630.56b78dcdaeeb9d9c2967.js
Edit
630.56b78dcdaeeb9d9c2967.js.map
Edit
6302.a2ffa52069511df9772f.js
Edit
6302.a2ffa52069511df9772f.js.map
Edit
6315.f4d87fc6f8ae3cb40e38.js
Edit
6315.f4d87fc6f8ae3cb40e38.js.map
Edit
6414.7520859a2d9cc0a63d7f.js
Edit
6414.7520859a2d9cc0a63d7f.js.map
Edit
6446.1d75a8140260005fffbd.js
Edit
6446.1d75a8140260005fffbd.js.map
Edit
6743.67a52a99e2fdd1ae1e10.js
Edit
6743.67a52a99e2fdd1ae1e10.js.map
Edit
6759.0454d3c1e41385379bdc.js
Edit
6759.0454d3c1e41385379bdc.js.map
Edit
6772.0d4a074848bc323be8f8.js
Edit
6772.0d4a074848bc323be8f8.js.map
Edit
680.726adca366b4ecb272db.js
Edit
680.726adca366b4ecb272db.js.map
Edit
6830.a4b0ecf3a6d784ca7609.js
Edit
6830.a4b0ecf3a6d784ca7609.js.map
Edit
6834.0c9ef40e2f2b5428983d.js
Edit
6834.0c9ef40e2f2b5428983d.js.map
Edit
6857.252a60422ee275193aa7.js
Edit
6857.252a60422ee275193aa7.js.map
Edit
6940.b6c74df14413f0188f0d.js
Edit
6940.b6c74df14413f0188f0d.js.map
Edit
6990.d663924714fc213b17c6.js
Edit
6990.d663924714fc213b17c6.js.map
Edit
7018.5a037d2577fedc8d10f1.js
Edit
7018.5a037d2577fedc8d10f1.js.map
Edit
7031.047b15171c23b248efa0.js
Edit
7031.047b15171c23b248efa0.js.map
Edit
7033.141597840e42815ef6a4.js
Edit
7033.141597840e42815ef6a4.js.map
Edit
7048.3746fc9a274bf8ff72f1.js
Edit
7048.3746fc9a274bf8ff72f1.js.map
Edit
7051.604a402d305e093c00c2.js
Edit
7051.604a402d305e093c00c2.js.map
Edit
7061.f18464bcd6c6d7455662.js
Edit
7061.f18464bcd6c6d7455662.js.map
Edit
7080.9cdd1b7a0bf62b48e1fe.js
Edit
7080.9cdd1b7a0bf62b48e1fe.js.map
Edit
7200.d4425528f6cee80f9931.js
Edit
7200.d4425528f6cee80f9931.js.map
Edit
7235.46f071d3e4d0bb976223.js
Edit
7235.46f071d3e4d0bb976223.js.map
Edit
7246.03f5a8496e53f64602e2.js
Edit
7246.03f5a8496e53f64602e2.js.map
Edit
7249.3bea4aaf890f89fdad45.js
Edit
7249.3bea4aaf890f89fdad45.js.map
Edit
7299.cdff402b076dfea09ead.js
Edit
7299.cdff402b076dfea09ead.js.map
Edit
7348.6fd722455e8c7e077815.js
Edit
7348.6fd722455e8c7e077815.js.map
Edit
7396.ded473b7a47dc42fbb59.js
Edit
7396.ded473b7a47dc42fbb59.js.map
Edit
7466.b7c17c526c7b734dd5f7.js
Edit
7466.b7c17c526c7b734dd5f7.js.map
Edit
7539.5f405cae3b15e1e2f6fa.js
Edit
7539.5f405cae3b15e1e2f6fa.js.map
Edit
7585.084552e02c66201a55be.js
Edit
7585.084552e02c66201a55be.js.map
Edit
7626.38819cc0696f2d25cf99.js
Edit
7626.38819cc0696f2d25cf99.js.map
Edit
7651.5024ed8dd1beb08d01ab.js
Edit
7651.5024ed8dd1beb08d01ab.js.map
Edit
7681.7ef7b4f86e99abd7b7e1.js
Edit
7681.7ef7b4f86e99abd7b7e1.js.map
Edit
7691.0ad86f0c686b19ce829e.js
Edit
7691.0ad86f0c686b19ce829e.js.map
Edit
7790.4c141092868e7208a087.js
Edit
7790.4c141092868e7208a087.js.map
Edit
7806.dff3509790e494ca5a45.js
Edit
7806.dff3509790e494ca5a45.js.map
Edit
7836.afe37ef4be354f0a3b91.js
Edit
7836.afe37ef4be354f0a3b91.js.map
Edit
7882.e1721e9d6ac2d421bcda.js
Edit
7882.e1721e9d6ac2d421bcda.js.map
Edit
7886.8499ded396232466be7d.js
Edit
7886.8499ded396232466be7d.js.map
Edit
7887.a6dcfd824d57598ba1c3.js
Edit
7887.a6dcfd824d57598ba1c3.js.map
Edit
7969.a048d8060cabf1aede33.js
Edit
7969.a048d8060cabf1aede33.js.map
Edit
7996.bd232896e4559d37a26f.js
Edit
7996.bd232896e4559d37a26f.js.map
Edit
8016.8145cd87abcdd0646db2.js
Edit
8016.8145cd87abcdd0646db2.js.map
Edit
8018.c31846109f2dff21d8c4.js
Edit
8018.c31846109f2dff21d8c4.js.map
Edit
8056.4e8f71ed4d507f89b487.js
Edit
8056.4e8f71ed4d507f89b487.js.map
Edit
8177.52abd0953ac914f69e26.js
Edit
8177.52abd0953ac914f69e26.js.map
Edit
8220.aeea4a8f0893b3447b56.js
Edit
8220.aeea4a8f0893b3447b56.js.map
Edit
8224.75bd73bf51ff7a2fc4a0.js
Edit
8224.75bd73bf51ff7a2fc4a0.js.map
Edit
8230.d65bce2998eec95c6082.js
Edit
8230.d65bce2998eec95c6082.js.map
Edit
8260.c1da67af19b9259d5651.js
Edit
8260.c1da67af19b9259d5651.js.map
Edit
8271.0ee36e030014244adb47.js
Edit
8271.0ee36e030014244adb47.js.map
Edit
8332.a62e8632a336661f2969.js
Edit
8332.a62e8632a336661f2969.js.map
Edit
8334.1196f5ddcef25711fc25.js
Edit
8334.1196f5ddcef25711fc25.js.map
Edit
8347.de402f9280cd7a316c57.js
Edit
8347.de402f9280cd7a316c57.js.map
Edit
8390.9de755da2e214cc845a3.js
Edit
8390.9de755da2e214cc845a3.js.map
Edit
8393.30e95ae45cbe5455dcda.js
Edit
8393.30e95ae45cbe5455dcda.js.map
Edit
8477.4dad0537d13cf9315e86.js
Edit
8477.4dad0537d13cf9315e86.js.map
Edit
8494.659892f00c9d15ae441a.js
Edit
8494.659892f00c9d15ae441a.js.map
Edit
8530.0460c988ee4a40ce7769.js
Edit
8530.0460c988ee4a40ce7769.js.map
Edit
8542.317c15ed57f68fcf0c97.js
Edit
8542.317c15ed57f68fcf0c97.js.map
Edit
8547.390120a5caf7646e0e3e.js
Edit
8547.390120a5caf7646e0e3e.js.map
Edit
8566.5c8f392bb383ab92eed0.js
Edit
8566.5c8f392bb383ab92eed0.js.map
Edit
8622.5acf73c1485a11dfb0ab.js
Edit
8622.5acf73c1485a11dfb0ab.js.map
Edit
8706.f17afa6bcdfd511d5b03.js
Edit
8706.f17afa6bcdfd511d5b03.js.map
Edit
874.d24410518317d605c708.js
Edit
874.d24410518317d605c708.js.map
Edit
8813.e5137844631f6ddedbce.js
Edit
8813.e5137844631f6ddedbce.js.map
Edit
8856.2720526447b3adb5c75f.js
Edit
8856.2720526447b3adb5c75f.js.map
Edit
886.5f3383e84b10a6530b97.js
Edit
886.5f3383e84b10a6530b97.js.map
Edit
8864.2f4ee982114c25634e55.js
Edit
8864.2f4ee982114c25634e55.js.map
Edit
8902.71f14964ec6cea84dc8e.js
Edit
8902.71f14964ec6cea84dc8e.js.map
Edit
8932.e59e50ddb63414e0f2b9.js
Edit
8932.e59e50ddb63414e0f2b9.js.map
Edit
8990.665213a5c89afd6b2f83.js
Edit
8990.665213a5c89afd6b2f83.js.map
Edit
9034.a32e36472481cbe5d72d.js
Edit
9034.a32e36472481cbe5d72d.js.map
Edit
9038.f03b25f160057d4a0bf6.js
Edit
9038.f03b25f160057d4a0bf6.js.map
Edit
904.b68cd2a0cd6d68c5f1ae.js
Edit
904.b68cd2a0cd6d68c5f1ae.js.map
Edit
9044.441f64d6d946cc93be46.js
Edit
9044.441f64d6d946cc93be46.js.map
Edit
9147.8309cadbc384209d62e5.js
Edit
9147.8309cadbc384209d62e5.js.map
Edit
9150.38487365ffd149b730af.js
Edit
9150.38487365ffd149b730af.js.map
Edit
9292.e6befb57f8f116ad95a8.js
Edit
9292.e6befb57f8f116ad95a8.js.map
Edit
9355.95d7e1782f93f339549e.js
Edit
9355.95d7e1782f93f339549e.js.map
Edit
9388.88d95a230e9432e7037b.js
Edit
9388.88d95a230e9432e7037b.js.map
Edit
9390.c72fcd228017f7647b38.js
Edit
9390.c72fcd228017f7647b38.js.map
Edit
9414.642bfe0d5eb16efd0c16.js
Edit
9414.642bfe0d5eb16efd0c16.js.map
Edit
9449.502f2a824d0203e88d4d.js
Edit
9449.502f2a824d0203e88d4d.js.map
Edit
946.48c5e8c688cf29424295.js
Edit
946.48c5e8c688cf29424295.js.map
Edit
9473.e6fc327da88d88712828.js
Edit
9473.e6fc327da88d88712828.js.map
Edit
9510.1e255e96fe40aad2ed6f.js
Edit
9510.1e255e96fe40aad2ed6f.js.map
Edit
9521.e65411d726c29d77c526.js
Edit
9521.e65411d726c29d77c526.js.map
Edit
9538.a2289ff9ad06e24e391f.js
Edit
9538.a2289ff9ad06e24e391f.js.map
Edit
957.3c35d66aa698d8bdfe05.js
Edit
957.3c35d66aa698d8bdfe05.js.map
Edit
9571.41558d40bff9ea8c0726.js
Edit
9571.41558d40bff9ea8c0726.js.map
Edit
9578.9cfae16465bb9bc1f336.js
Edit
9578.9cfae16465bb9bc1f336.js.map
Edit
968.d4b150f9211c478b7b05.js
Edit
968.d4b150f9211c478b7b05.js.map
Edit
970.46f17b76711e4961a575.js
Edit
970.46f17b76711e4961a575.js.map
Edit
9700.02180b7a06c8a1f7606b.js
Edit
9700.02180b7a06c8a1f7606b.js.map
Edit
9744.aa6baaf988a68fa6a9ba.js
Edit
9744.aa6baaf988a68fa6a9ba.js.map
Edit
9820.6b462d83575efd05c883.js
Edit
9820.6b462d83575efd05c883.js.map
Edit
9838.06bd7dfd4290786f80e3.js
Edit
9838.06bd7dfd4290786f80e3.js.map
Edit
9992.fb08517d3ff77e887443.js
Edit
9992.fb08517d3ff77e887443.js.map
Edit
9996.21c451f22ff76b4bb683.js
Edit
9996.21c451f22ff76b4bb683.js.map
Edit
AdminAuthentication.076c98c6380fd1e42f7e.js
Edit
AdminAuthentication.076c98c6380fd1e42f7e.js.map
Edit
AdminEditOrgPage.8df8167ea6ff8f4803bd.js
Edit
AdminEditOrgPage.8df8167ea6ff8f4803bd.js.map
Edit
AdminListOrgsPage.176dac9ed391bda8952b.js
Edit
AdminListOrgsPage.176dac9ed391bda8952b.js.map
Edit
AdminSettings.7373ed8fa9b943bb2098.js
Edit
AdminSettings.7373ed8fa9b943bb2098.js.map
Edit
AlertGroups.81264e6e5009c36eed6e.js
Edit
AlertGroups.81264e6e5009c36eed6e.js.map
Edit
AlertRuleListIndex.98e7328feeaa2ffe67eb.js
Edit
AlertRuleListIndex.98e7328feeaa2ffe67eb.js.map
Edit
AlertingDisabled.b2c834be0ca4666dd793.js
Edit
AlertingDisabled.b2c834be0ca4666dd793.js.map
Edit
AlertingGroupDetails.3a2c6ef8085b505852e4.js
Edit
AlertingGroupDetails.3a2c6ef8085b505852e4.js.map
Edit
AlertingGroupEdit.69cfe9d5f37a1fc65326.js
Edit
AlertingGroupEdit.69cfe9d5f37a1fc65326.js.map
Edit
AlertingHome.06f307ab9a2a5d8b7f93.js
Edit
AlertingHome.06f307ab9a2a5d8b7f93.js.map
Edit
AlertingImportFromDSRules.f1224bcb622d25e2c94f.js
Edit
AlertingImportFromDSRules.f1224bcb622d25e2c94f.js.map
Edit
AlertingRedirectToRule.9ed1d16829d6833d2827.js
Edit
AlertingRedirectToRule.9ed1d16829d6833d2827.js.map
Edit
AlertingRuleForm.2e69d3f00eb6221e7355.js
Edit
AlertingRuleForm.2e69d3f00eb6221e7355.js.map
Edit
AlertingSettings.7a5f782f877cec4790cb.js
Edit
AlertingSettings.7a5f782f877cec4790cb.js.map
Edit
AlertingTriage.1174f36b4937ad0047c1.js
Edit
AlertingTriage.1174f36b4937ad0047c1.js.map
Edit
BenchmarksPage.ef387f4598ba2b2236ad.js
Edit
BenchmarksPage.ef387f4598ba2b2236ad.js.map
Edit
BookmarksPage.8fe93eb7377073f0c985.js
Edit
BookmarksPage.8fe93eb7377073f0c985.js.map
Edit
ChangePasswordPage.f21b0b1dd107ccd33c1a.js
Edit
ChangePasswordPage.f21b0b1dd107ccd33c1a.js.map
Edit
Connections.949b6389e73bcadb2109.js
Edit
Connections.949b6389e73bcadb2109.js.map
Edit
ContactPoints.9ae2d1927d60c6169b87.js
Edit
ContactPoints.9ae2d1927d60c6169b87.js.map
Edit
CorrelationsFeatureToggle.ec2f1aefce6b456e15eb.js
Edit
CorrelationsFeatureToggle.ec2f1aefce6b456e15eb.js.map
Edit
CorrelationsPage.bd7fcd24ed0b5fe8ac3e.js
Edit
CorrelationsPage.bd7fcd24ed0b5fe8ac3e.js.map
Edit
CreateTeam.429acf93986740280312.js
Edit
CreateTeam.429acf93986740280312.js.map
Edit
DashboardImport.3e9b6f980b81d6f1c755.js
Edit
DashboardImport.3e9b6f980b81d6f1c755.js.map
Edit
DashboardListPage.abeb0c29f072f888f9fb.js
Edit
DashboardListPage.abeb0c29f072f888f9fb.js.map
Edit
DashboardPage.72557fe6dd1a022b7d48.js
Edit
DashboardPage.72557fe6dd1a022b7d48.js.map
Edit
DashboardPageProxy.80adfefad8a885d8e2ef.js
Edit
DashboardPageProxy.80adfefad8a885d8e2ef.js.map
Edit
DashboardScenePage.83fe1fa9509b50120d65.js
Edit
DashboardScenePage.83fe1fa9509b50120d65.js.map
Edit
EditContactPoint.0c33428ddc8ba974d946.js
Edit
EditContactPoint.0c33428ddc8ba974d946.js.map
Edit
EditMuteTiming.8760cc9c77560acf0cd6.js
Edit
EditMuteTiming.8760cc9c77560acf0cd6.js.map
Edit
EditRepositoryPage.d71faaab1af2c8d70a22.js
Edit
EditRepositoryPage.d71faaab1af2c8d70a22.js.map
Edit
EmbeddedDashboard.57de550bce819e3d52e6.js
Edit
EmbeddedDashboard.57de550bce819e3d52e6.js.map
Edit
FileHistoryPage.154ab77c19bbe0ebed20.js
Edit
FileHistoryPage.154ab77c19bbe0ebed20.js.map
Edit
FileStatusPage.36f58cd61202ec603d22.js
Edit
FileStatusPage.36f58cd61202ec603d22.js.map
Edit
FolderAlerting.0b9acb6c42276aaee57d.js
Edit
FolderAlerting.0b9acb6c42276aaee57d.js.map
Edit
FolderLibraryPanelsPage.44f8cabf542ec314d176.js
Edit
FolderLibraryPanelsPage.44f8cabf542ec314d176.js.map
Edit
GettingStartedPage.4bea37f1c9bdcfd0f41b.js
Edit
GettingStartedPage.4bea37f1c9bdcfd0f41b.js.map
Edit
GlobalConfig.1377596507974d18caf6.js
Edit
GlobalConfig.1377596507974d18caf6.js.map
Edit
HistoryPage.4da98f4fa313ee3676ca.js
Edit
HistoryPage.4da98f4fa313ee3676ca.js.map
Edit
LdapSettingsPage.0e9f08d5e59150ecf466.js
Edit
LdapSettingsPage.0e9f08d5e59150ecf466.js.map
Edit
LibraryPanelsPage.824580d7751526c658e2.js
Edit
LibraryPanelsPage.824580d7751526c658e2.js.map
Edit
ListPublicDashboardPage.64c26ffd3ebe6c9076f3.js
Edit
ListPublicDashboardPage.64c26ffd3ebe6c9076f3.js.map
Edit
LoginPage.db48423ed1b455431daa.js
Edit
LoginPage.db48423ed1b455431daa.js.map
Edit
MetricsDrilldownRedirect.fcad4bdff346974952f4.js
Edit
MetricsDrilldownRedirect.fcad4bdff346974952f4.js.map
Edit
MigrateToCloud.5b474ad00e8a3d979750.js
Edit
MigrateToCloud.5b474ad00e8a3d979750.js.map
Edit
NewMuteTiming.2f6302420674f1c73aba.js
Edit
NewMuteTiming.2f6302420674f1c73aba.js.map
Edit
NewOrgPage.be31eaee06e2043d609b.js
Edit
NewOrgPage.be31eaee06e2043d609b.js.map
Edit
NewReceiverView.f1d83eb66a39882b8661.js
Edit
NewReceiverView.f1d83eb66a39882b8661.js.map
Edit
NewSilencePage.2643a48031f7e5d8f376.js
Edit
NewSilencePage.2643a48031f7e5d8f376.js.map
Edit
NotificationPoliciesPage.9333d10ecad1452ebf27.js
Edit
NotificationPoliciesPage.9333d10ecad1452ebf27.js.map
Edit
NotificationsPage.57df4ff5ba1433a4345d.js
Edit
NotificationsPage.57df4ff5ba1433a4345d.js.map
Edit
OrgDetailsPage.7b5835c30585aae81343.js
Edit
OrgDetailsPage.7b5835c30585aae81343.js.map
Edit
PlaylistEditPage.8310e384af659e40c313.js
Edit
PlaylistEditPage.8310e384af659e40c313.js.map
Edit
PlaylistNewPage.f45b642a98a747e28c0d.js
Edit
PlaylistNewPage.f45b642a98a747e28c0d.js.map
Edit
PlaylistPage.9af74957a1cdfb125338.js
Edit
PlaylistPage.9af74957a1cdfb125338.js.map
Edit
PlaylistStartPage.8011a98267ac64c7fa05.js
Edit
PlaylistStartPage.8011a98267ac64c7fa05.js.map
Edit
PluginExtensionsLog.54c02047d569b0c05823.js
Edit
PluginExtensionsLog.54c02047d569b0c05823.js.map
Edit
PluginListPage.e50c18fed21c23ca4ee8.js
Edit
PluginListPage.e50c18fed21c23ca4ee8.js.map
Edit
PluginPage.ae424531bce63dd4721e.js
Edit
PluginPage.ae424531bce63dd4721e.js.map
Edit
ProfileFeatureTogglePage.27378dcbb7520611348e.js
Edit
ProfileFeatureTogglePage.27378dcbb7520611348e.js.map
Edit
ProvisioningWizardPage.c4e4a8f431b4719b0e95.js
Edit
ProvisioningWizardPage.c4e4a8f431b4719b0e95.js.map
Edit
PublicDashboardPage.33d6ec8f685f1b70b9a6.js
Edit
PublicDashboardPage.33d6ec8f685f1b70b9a6.js.map
Edit
RecentlyDeleted.5e0ec16474d939fd9683.js
Edit
RecentlyDeleted.5e0ec16474d939fd9683.js.map
Edit
RecentlyDeletedPage.1dbc2b80b28204de8237.js
Edit
RecentlyDeletedPage.1dbc2b80b28204de8237.js.map
Edit
RepositoryListPage.ec3a0af1cbe2740800bf.js
Edit
RepositoryListPage.ec3a0af1cbe2740800bf.js.map
Edit
RepositoryStatusPage.9aee60589e35a4a19ec2.js
Edit
RepositoryStatusPage.9aee60589e35a4a19ec2.js.map
Edit
SelectOrgPage.910a8d842019a6d7fe93.js
Edit
SelectOrgPage.910a8d842019a6d7fe93.js.map
Edit
SendResetMailPage.513361d6980f98ff8139.js
Edit
SendResetMailPage.513361d6980f98ff8139.js.map
Edit
ServerStats.2830ca154f465dbdecea.js
Edit
ServerStats.2830ca154f465dbdecea.js.map
Edit
ServiceAccountCreatePage.80fcbdd2b7f5aa4e2da1.js
Edit
ServiceAccountCreatePage.80fcbdd2b7f5aa4e2da1.js.map
Edit
ServiceAccountPage.48944056459bb412ff33.js
Edit
ServiceAccountPage.48944056459bb412ff33.js.map
Edit
ServiceAccountsPage.d20b1eb9f87661f10b45.js
Edit
ServiceAccountsPage.d20b1eb9f87661f10b45.js.map
Edit
SignupInvited.fe2c29f380e9888c28cf.js
Edit
SignupInvited.fe2c29f380e9888c28cf.js.map
Edit
SilencesTablePage.b998fdbdcc3d60a81739.js
Edit
SilencesTablePage.b998fdbdcc3d60a81739.js.map
Edit
SnapshotListPage.6feaf24adb92e6a302ec.js
Edit
SnapshotListPage.6feaf24adb92e6a302ec.js.map
Edit
SoloPanelPage.7fc6a934aaadf4c1f84d.js
Edit
SoloPanelPage.7fc6a934aaadf4c1f84d.js.map
Edit
SoloPanelPageOld.bde57e000dd0a0108685.js
Edit
SoloPanelPageOld.bde57e000dd0a0108685.js.map
Edit
SupportBundles.1f46603ad3494624d67a.js
Edit
SupportBundles.1f46603ad3494624d67a.js.map
Edit
SupportBundlesCreate.5eaea61a9713f057277b.js
Edit
SupportBundlesCreate.5eaea61a9713f057277b.js.map
Edit
TeamList.6b088f83e6e8cb66b21d.js
Edit
TeamList.6b088f83e6e8cb66b21d.js.map
Edit
TeamPages.9d8b5dceef8be43c6923.js
Edit
TeamPages.9d8b5dceef8be43c6923.js.map
Edit
Templates.7a02a8497ebca052dcfb.js
Edit
Templates.7a02a8497ebca052dcfb.js.map
Edit
TestStuffPage.982c641592b2f7c9db40.js
Edit
TestStuffPage.982c641592b2f7c9db40.js.map
Edit
ThemePlayground.aeeec77fd8e9c1482f55.js
Edit
ThemePlayground.aeeec77fd8e9c1482f55.js.map
Edit
UserAdminPage.fc4d562eef05d9f59aca.js
Edit
UserAdminPage.fc4d562eef05d9f59aca.js.map
Edit
UserCreatePage.b7036214c66612fb31e9.js
Edit
UserCreatePage.b7036214c66612fb31e9.js.map
Edit
UserInvitePage.4a9bcd4084d7ae454c73.js
Edit
UserInvitePage.4a9bcd4084d7ae454c73.js.map
Edit
UserListPage.a452e1153ae820f58ac9.js
Edit
UserListPage.a452e1153ae820f58ac9.js.map
Edit
UserProfileEditPage.82c11690282e669eabb1.js
Edit
UserProfileEditPage.82c11690282e669eabb1.js.map
Edit
alert-rules-drawer-content.c95bb5ddd3fc813cae92.js
Edit
alert-rules-drawer-content.c95bb5ddd3fc813cae92.js.map
Edit
alert-rules-toolbar-button.0d86c1adae7edb55ff76.js
Edit
alert-rules-toolbar-button.0d86c1adae7edb55ff76.js.map
Edit
alertListPanel.0110106a8d1ab70d65d5.js
Edit
alertListPanel.0110106a8d1ab70d65d5.js.map
Edit
alertmanagerPlugin.2b59de5e7b7a556f87f1.js
Edit
alertmanagerPlugin.2b59de5e7b7a556f87f1.js.map
Edit
annoListPanel.0005a0eab0b05e24d970.js
Edit
annoListPanel.0005a0eab0b05e24d970.js.map
Edit
app.8385deda1df49aa75ec2.js
Edit
app.8385deda1df49aa75ec2.js.map
Edit
assets-manifest.json
Edit
barChartPanel.eecdaeab7d146d477721.js
Edit
barChartPanel.eecdaeab7d146d477721.js.map
Edit
barGaugePanel.6d9e94bbb72ba92a0e9b.js
Edit
barGaugePanel.6d9e94bbb72ba92a0e9b.js.map
Edit
candlestickPanel.af0e0decd06e7b7ab286.js
Edit
candlestickPanel.af0e0decd06e7b7ab286.js.map
Edit
canvasPanel.ddab72fab6e58c3419b2.js
Edit
canvasPanel.ddab72fab6e58c3419b2.js.map
Edit
cloudwatchPlugin.06ef34f60000c4f7ea37.js
Edit
cloudwatchPlugin.06ef34f60000c4f7ea37.js.map
Edit
dark.b66fa87185b9a313ec14.js
Edit
dashListPanel.23b954da0c4888602048.js
Edit
dashListPanel.23b954da0c4888602048.js.map
Edit
dataGridPanel.bb5d4b678cba38dd380b.js
Edit
debugPanel.fff63da32084d7a2e236.js
Edit
debugPanel.fff63da32084d7a2e236.js.map
Edit
elasticsearchPlugin.3f2edb012f5162b48903.js
Edit
elasticsearchPlugin.3f2edb012f5162b48903.js.map
Edit
explore-feature-toggle-page.3de03fa91c88d05cea1c.js
Edit
explore-feature-toggle-page.3de03fa91c88d05cea1c.js.map
Edit
explore.dd32637df83326225e0d.js
Edit
explore.dd32637df83326225e0d.js.map
Edit
flamegraphPanel.cc6c5b4bcd69e406fbb7.js
Edit
flamegraphPanel.cc6c5b4bcd69e406fbb7.js.map
Edit
gaugePanel.5da3c4e39a652e281cc4.js
Edit
gaugePanel.5da3c4e39a652e281cc4.js.map
Edit
gazetteer
Edit
geomapPanel.67ebb4567e9b5fa5074b.js
Edit
gettingStartedPanel.833059170dbbf8d5c4bf.js
Edit
gettingStartedPanel.833059170dbbf8d5c4bf.js.map
Edit
grafana.1492.25120d27db88f863e058.css
Edit
grafana.4350.a45e45977094df4a0bc9.css
Edit
grafana.5790.ffb3a9cd952d3cd7471b.css
Edit
grafana.DashboardPage.a66335f88cd003e4a44f.css
Edit
grafana.DashboardPageProxy.a66335f88cd003e4a44f.css
Edit
grafana.app.1f6473bb54b1e1647be8.css
Edit
grafana.dark.1e8d85816912aadbbba5.css
Edit
grafana.dataGridPanel.c1fc5db1829b1b31eb4d.css
Edit
grafana.geomapPanel.0057d964fa972bb207ec.css
Edit
grafana.light.111a5a99fcebc0962ddc.css
Edit
grafana.livePanel.25120d27db88f863e058.css
Edit
grafana.react-monaco-editor.ffb3a9cd952d3cd7471b.css
Edit
grafana.swagger.d0a2da197b9827204ac1.css
Edit
grafana.tablePanel.25120d27db88f863e058.css
Edit
grafanaPlugin.f21cdb4b84a732cc9dd8.js
Edit
grafanaPlugin.f21cdb4b84a732cc9dd8.js.map
Edit
heatmapPanel.7834b997bc573eddba88.js
Edit
heatmapPanel.7834b997bc573eddba88.js.map
Edit
histogramPanel.9953bfeccf8774500c0c.js
Edit
histogramPanel.9953bfeccf8774500c0c.js.map
Edit
img
Edit
influxdbPlugin.7a899e63be0a65d41e13.js
Edit
influxdbPlugin.7a899e63be0a65d41e13.js.map
Edit
light.827d442410485e491818.js
Edit
livePanel.2a43f499bc746d928d45.js
Edit
livePanel.2a43f499bc746d928d45.js.map
Edit
logsPanel.a328022d248508a083c1.js
Edit
logsPanel.a328022d248508a083c1.js.map
Edit
loki-query-field.f9a0b82b636d4821760c.js
Edit
loki-query-field.f9a0b82b636d4821760c.js.map
Edit
maps
Edit
mixedPlugin.3a69de93f366afbb2f85.js
Edit
newsPanel.c17f40f7c88ea14620e7.js
Edit
newsPanel.c17f40f7c88ea14620e7.js.map
Edit
nodeGraphPanel.f717a9075d994a9a8af4.js
Edit
nodeGraphPanel.f717a9075d994a9a8af4.js.map
Edit
opentsdbPlugin.1795eab1c223ea030c2e.js
Edit
opentsdbPlugin.1795eab1c223ea030c2e.js.map
Edit
pieChartPanel.45166aa6d57d163817ea.js
Edit
pieChartPanel.45166aa6d57d163817ea.js.map
Edit
prometheusPlugin.c3a55eb5353085fc3d2b.js
Edit
prometheusPlugin.c3a55eb5353085fc3d2b.js.map
Edit
radialBarPanel.294c52d497d8f5c2bebb.js
Edit
radialBarPanel.294c52d497d8f5c2bebb.js.map
Edit
runtime.a37cc2f12a959f33871a.js
Edit
runtime.a37cc2f12a959f33871a.js.map
Edit
sql-query-editor.e767d4a2aef360034bd9.js
Edit
sql-query-editor.e767d4a2aef360034bd9.js.map
Edit
statPanel.3a7f191bfb27fd320014.js
Edit
statPanel.3a7f191bfb27fd320014.js.map
Edit
stateTimelinePanel.08d857b143ef89dc195f.js
Edit
stateTimelinePanel.08d857b143ef89dc195f.js.map
Edit
static
Edit
statusHistoryPanel.29f7b8dc01039ba795af.js
Edit
statusHistoryPanel.29f7b8dc01039ba795af.js.map
Edit
swagger.06875a6266679f54141d.js
Edit
swagger.06875a6266679f54141d.js.map
Edit
tablePanel.43861ce2a60617dcd19d.js
Edit
tablePanel.43861ce2a60617dcd19d.js.map
Edit
textPanel.867ee60d01b2039aa159.js
Edit
textPanel.867ee60d01b2039aa159.js.map
Edit
timeseriesPanel.b4a947da450030262a31.js
Edit
timeseriesPanel.b4a947da450030262a31.js.map
Edit
tracesPanel.35bfc3e5ff6bea4212a3.js
Edit
tracesPanel.35bfc3e5ff6bea4212a3.js.map
Edit
trendPanel.001aff2bd153e737c464.js
Edit
trendPanel.001aff2bd153e737c464.js.map
Edit
vis-data.b34535ebabc0fcb91557.js
Edit
vis-data.b34535ebabc0fcb91557.js.map
Edit
vis-network.1b41caf21892c9525709.js
Edit
vis-network.1b41caf21892c9525709.js.map
Edit
welcomeBanner.1a693c9dc02006be4f0b.js
Edit
welcomeBanner.1a693c9dc02006be4f0b.js.map
Edit
xychart.cb20af67a6c495ba6ccd.js
Edit
xychart.cb20af67a6c495ba6ccd.js.map
Edit