/usr/share/grafana/public/build
{"version":3,"file":"7691.0ad86f0c686b19ce829e.js","mappings":"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","sources":["webpack://grafana/./public/app/plugins/datasource/loki/components/monaco-query-field/monaco-completion-provider/validation.ts","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorRow.js","webpack://grafana/./node_modules/uuid/dist/esm-browser/regex.js","webpack://grafana/./node_modules/uuid/dist/esm-browser/validate.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorStack.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/VisualQueryBuilder/components/RawQuery.js","webpack://grafana/./node_modules/rxjs/dist/esm5/internal/observable/defer.js","webpack://grafana/./public/app/types/suggestions.ts","webpack://grafana/./public/app/plugins/datasource/loki/logsTimeSplitting.ts","webpack://grafana/./public/app/plugins/datasource/loki/metricTimeSplitting.ts","webpack://grafana/./node_modules/lru-cache/dist/esm/index.js","webpack://grafana/./public/app/plugins/datasource/loki/LanguageProvider.ts","webpack://grafana/./node_modules/rxjs/dist/esm5/internal/observable/dom/WebSocketSubject.js","webpack://grafana/./node_modules/rxjs/dist/esm5/internal/observable/dom/webSocket.js","webpack://grafana/./node_modules/uuid/dist/esm-browser/sha1.js","webpack://grafana/./node_modules/uuid/dist/esm-browser/parse.js","webpack://grafana/./node_modules/uuid/dist/esm-browser/v35.js","webpack://grafana/./node_modules/uuid/dist/esm-browser/v5.js","webpack://grafana/./public/app/plugins/datasource/loki/liveStreamsResultTransformer.ts","webpack://grafana/./public/app/plugins/datasource/loki/LiveStreams.ts","webpack://grafana/./public/app/plugins/datasource/loki/components/LokiContextUi.tsx","webpack://grafana/./public/app/plugins/datasource/loki/sortDataFrame.ts","webpack://grafana/./public/app/plugins/datasource/loki/LogContextProvider.ts","webpack://grafana/./public/app/plugins/datasource/loki/migrations/variableQueryMigrations.ts","webpack://grafana/./public/app/plugins/datasource/loki/components/VariableQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/loki/LokiVariableSupport.ts","webpack://grafana/./public/app/plugins/datasource/loki/getDerivedFields.ts","webpack://grafana/./public/app/plugins/datasource/loki/makeTableFrames.ts","webpack://grafana/./public/app/plugins/datasource/loki/backendResultTransformer.ts","webpack://grafana/./public/app/plugins/datasource/loki/components/LokiOptionFields.tsx","webpack://grafana/./public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryFieldLazy.tsx","webpack://grafana/./public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryFieldWrapper.tsx","webpack://grafana/./public/app/plugins/datasource/loki/components/LokiQueryField.tsx","webpack://grafana/./public/app/plugins/datasource/loki/components/AnnotationsQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/loki/queryHints.ts","webpack://grafana/./public/app/plugins/datasource/loki/shardQuerySplitting.ts","webpack://grafana/./public/app/plugins/datasource/loki/streaming.ts","webpack://grafana/./public/app/plugins/datasource/loki/datasource.ts","webpack://grafana/./public/app/plugins/datasource/loki/tracking.ts","webpack://grafana/./public/app/plugins/datasource/loki/querySplitting.ts","webpack://grafana/./public/app/plugins/datasource/loki/mergeResponses.ts","webpack://grafana/./public/app/plugins/panel/logs/types.ts","webpack://grafana/./public/app/plugins/panel/logs/useDatasourcesFromTargets.ts","webpack://grafana/./public/app/plugins/panel/logs/LogsPanel.tsx","webpack://grafana/./public/app/plugins/panel/logs/suggestions.ts","webpack://grafana/./public/app/plugins/panel/logs/module.tsx"],"sourcesContent":["import { SyntaxNode } from '@lezer/common';\nimport { LRParser } from '@lezer/lr';\n\nimport { ErrorId } from '../../../querybuilder/parsingUtils';\n\ninterface ParserErrorBoundary {\n startLineNumber: number;\n startColumn: number;\n endLineNumber: number;\n endColumn: number;\n error: string;\n}\n\ninterface ParseError {\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): ParserErrorBoundary[] | false {\n if (!query) {\n return false;\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 interpolatedErrors: ParseError[] = parseQuery(interpolatedQuery, parser);\n if (!interpolatedErrors.length) {\n return false;\n }\n\n let parseErrors: ParseError[] = interpolatedErrors;\n if (query !== interpolatedQuery) {\n const queryErrors: ParseError[] = parseQuery(query, parser);\n parseErrors = interpolatedErrors.flatMap(\n (interpolatedError) =>\n queryErrors.filter((queryError) => interpolatedError.text === queryError.text) || interpolatedError\n );\n }\n\n return parseErrors.map((parseError) => findErrorBoundary(query, queryLines, parseError)).filter(isErrorBoundary);\n}\n\nfunction parseQuery(query: string, parser: LRParser) {\n const parseErrors: ParseError[] = [];\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({\n node: node,\n text: query.substring(node.from, node.to),\n });\n }\n },\n });\n return parseErrors;\n}\n\nfunction findErrorBoundary(query: string, queryLines: string[], parseError: ParseError): ParserErrorBoundary | 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 const error = isEmptyString ? query.substring(errorNode.from, errorNode.to) : parseError.text;\n return {\n startLineNumber: 1,\n startColumn: errorNode.from + 1,\n endLineNumber: 1,\n endColumn: errorNode.to + 1,\n error,\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 error: parseError.text,\n };\n }\n\n return null;\n}\n\nfunction isErrorBoundary(boundary: ParserErrorBoundary | null): boundary is ParserErrorBoundary {\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","import { css } from '@emotion/css';\nimport React__default from 'react';\nimport '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { EditorStack } from './EditorStack.js';\n\nconst EditorRow = ({ children }) => {\n const styles = useStyles2(getStyles);\n return /* @__PURE__ */ React__default.createElement(\"div\", { className: styles.root }, /* @__PURE__ */ React__default.createElement(EditorStack, { gap: 2 }, children));\n};\nconst getStyles = (theme) => {\n return {\n root: css({\n padding: theme.spacing(1),\n backgroundColor: theme.colors.background.secondary,\n borderRadius: theme.shape.radius.default\n })\n };\n};\n\nexport { EditorRow };\n//# sourceMappingURL=EditorRow.js.map\n","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;\n","import REGEX from './regex.js';\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\nexport default validate;\n","import React__default from 'react';\nimport { Stack } from '@grafana/ui';\nimport '@grafana/data';\n\nconst EditorStack = ({ children, wrap: wrapItems = true, ...props }) => {\n var _a, _b;\n return /* @__PURE__ */ React__default.createElement(Stack, { wrap: wrapItems ? \"wrap\" : undefined, direction: (_a = props.direction) != null ? _a : \"row\", gap: (_b = props.gap) != null ? _b : 2, ...props }, children);\n};\n\nexport { EditorStack };\n//# sourceMappingURL=EditorStack.js.map\n","import { cx, css } from '@emotion/css';\nimport Prism from 'prismjs';\nimport React__default from 'react';\nimport { textUtil } from '@grafana/data';\nimport { useTheme2 } from '@grafana/ui';\n\nfunction RawQuery({ query, language, className }) {\n const theme = useTheme2();\n const styles = getStyles(theme);\n const highlighted = Prism.highlight(query, language.grammar, language.name);\n return /* @__PURE__ */ React__default.createElement(\n \"div\",\n {\n className: cx(styles.editorField, \"prism-syntax-highlight\", className),\n \"aria-label\": \"selector\",\n dangerouslySetInnerHTML: { __html: textUtil.sanitize(highlighted) }\n }\n );\n}\nconst getStyles = (theme) => {\n return {\n editorField: css({\n fontFamily: theme.typography.fontFamilyMonospace,\n fontSize: theme.typography.bodySmall.fontSize\n })\n };\n};\n\nexport { RawQuery };\n//# sourceMappingURL=RawQuery.js.map\n","import { Observable } from '../Observable';\nimport { innerFrom } from './innerFrom';\nexport function defer(observableFactory) {\n return new Observable(function (subscriber) {\n innerFrom(observableFactory()).subscribe(subscriber);\n });\n}\n//# sourceMappingURL=defer.js.map","export enum SuggestionName {\n LineChart = 'Line chart',\n LineChartSmooth = 'Line chart smooth',\n LineChartGradientColorScheme = 'Line chart with gradient color scheme',\n AreaChart = 'Area chart',\n AreaChartStacked = 'Area chart stacked',\n AreaChartStackedPercent = 'Area chart 100% stacked',\n BarChart = 'Bar chart',\n BarChartGradientColorScheme = 'Bar chart with gradient color scheme',\n BarChartStacked = 'Bar chart stacked',\n BarChartStackedPercent = 'Bar chart 100% stacked',\n BarChartHorizontal = 'Bar chart horizontal',\n BarChartHorizontalStacked = 'Bar chart horizontal stacked',\n BarChartHorizontalStackedPercent = 'Bar chart horizontal 100% stacked',\n Candlestick = 'Candlestick',\n PieChart = 'Pie chart',\n PieChartDonut = 'Pie chart donut',\n Stat = 'Stat',\n StatColoredBackground = 'Stat colored background',\n Gauge = 'Gauge',\n GaugeCircular = 'Circular gauge',\n GaugeNoThresholds = 'Gauge no thresholds',\n BarGaugeBasic = 'Bar gauge basic',\n BarGaugeLCD = 'Bar gauge LCD',\n Table = 'Table',\n StateTimeline = 'State timeline',\n StatusHistory = 'Status history',\n TextPanel = 'Text',\n DashboardList = 'Dashboard list',\n Logs = 'Logs',\n FlameGraph = 'Flame graph',\n Trace = 'Trace',\n NodeGraph = 'Node graph',\n}\n","// every timestamp in this file is a number which contains an unix-timestamp-in-millisecond format,\n// like returned by `new Date().getTime()`. this is needed because the \"math\"\n// has to be done on integer numbers.\n\n// the way loki handles logs-range-queries is that if you specify start & end,\n// one of those will be included, but the other will not. this allows us to\n// make it easy to split ranges.\n// for example, if the time-range is 100<>150,\n// we can split it into:\n// - 100<>120\n// - 120<>140\n// - 140<>150\n// and no log-line will be skipped or duplicated\n// (NOTE: we do these calculations in milliseconds. at the end, Loki receives\n// nanoseconds, but it will be OK, because it's simply a matter to adding `000000`,\n// to the end, so if we do it right in milliseconds, it should be OK in\n// nanoseconds too\n\nexport function splitTimeRange(\n startTime: number,\n endTime: number,\n idealRangeDuration: number\n): Array<[number, number]> {\n if (endTime - startTime <= idealRangeDuration) {\n return [[startTime, endTime]];\n }\n\n const result: Array<[number, number]> = [];\n\n // we walk backward, because we need want the potentially smaller \"last\" chunk\n // to be at the oldest timestamp.\n for (let chunkEndTime = endTime; chunkEndTime > startTime; chunkEndTime -= idealRangeDuration) {\n // when we get close to the start of the time range, we need to be sure not\n // to cross over the startTime\n const chunkStartTime = Math.max(chunkEndTime - idealRangeDuration, startTime);\n result.push([chunkStartTime, chunkEndTime]);\n }\n\n // because we walked backwards, we need to reverse the array\n result.reverse();\n\n return result;\n}\n","// every timestamp in this file is a number which contains an unix-timestamp-in-millisecond format,\n// like returned by `new Date().getTime()`. this is needed because the \"math\"\n// has to be done on integer numbers.\n\n// we are trying to be compatible with\n// https://github.com/grafana/loki/blob/089ec1b05f5ec15a8851d0e8230153e0eeb4dcec/pkg/querier/queryrange/split_by_interval.go#L327-L336\n\nexport function splitTimeRange(\n startTime: number,\n endTime: number,\n step: number,\n idealRangeDuration: number\n): Array<[number, number]> {\n if (idealRangeDuration < step) {\n // we cannot create chunks smaller than `step`\n return [[startTime, endTime]];\n }\n\n // we make the duration a multiple of `step`, lowering it if necessary\n const alignedDuration = Math.trunc(idealRangeDuration / step) * step;\n\n const alignedStartTime = startTime - (startTime % step);\n\n const result: Array<[number, number]> = [];\n\n // in a previous version we started iterating from the end, to the start.\n // However this is not easily possible as end timestamps are always inclusive\n // for Loki. So a `2022-02-08T00:00:00Z` end time with a 1day step would mean\n // to include the 08.02.2022, which we don't want. So we have to start from\n // the start, always ending at the last step before the actual end, or the total end.\n for (let chunkStartTime = alignedStartTime; chunkStartTime < endTime; chunkStartTime += alignedDuration) {\n const chunkEndTime = Math.min(chunkStartTime + alignedDuration - step, endTime);\n result.push([chunkStartTime, chunkEndTime]);\n }\n\n return result;\n}\n","/**\n * @module LRUCache\n */\nconst defaultPerf = (typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function') ?\n performance\n : Date;\nconst warned = new Set();\n/* c8 ignore start */\nconst PROCESS = (typeof process === 'object' && !!process ?\n process\n : {});\n/* c8 ignore start */\nconst emitWarning = (msg, type, code, fn) => {\n typeof PROCESS.emitWarning === 'function' ?\n PROCESS.emitWarning(msg, type, code, fn)\n : console.error(`[${code}] ${type}: ${msg}`);\n};\nlet AC = globalThis.AbortController;\nlet AS = globalThis.AbortSignal;\n/* c8 ignore start */\nif (typeof AC === 'undefined') {\n //@ts-ignore\n AS = class AbortSignal {\n onabort;\n _onabort = [];\n reason;\n aborted = false;\n addEventListener(_, fn) {\n this._onabort.push(fn);\n }\n };\n //@ts-ignore\n AC = class AbortController {\n constructor() {\n warnACPolyfill();\n }\n signal = new AS();\n abort(reason) {\n if (this.signal.aborted)\n return;\n //@ts-ignore\n this.signal.reason = reason;\n //@ts-ignore\n this.signal.aborted = true;\n //@ts-ignore\n for (const fn of this.signal._onabort) {\n fn(reason);\n }\n this.signal.onabort?.(reason);\n }\n };\n let printACPolyfillWarning = PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1';\n const warnACPolyfill = () => {\n if (!printACPolyfillWarning)\n return;\n printACPolyfillWarning = false;\n emitWarning('AbortController is not defined. If using lru-cache in ' +\n 'node 14, load an AbortController polyfill from the ' +\n '`node-abort-controller` package. A minimal polyfill is ' +\n 'provided for use by LRUCache.fetch(), but it should not be ' +\n 'relied upon in other contexts (eg, passing it to other APIs that ' +\n 'use AbortController/AbortSignal might have undesirable effects). ' +\n 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.', 'NO_ABORT_CONTROLLER', 'ENOTSUP', warnACPolyfill);\n };\n}\n/* c8 ignore stop */\nconst shouldWarn = (code) => !warned.has(code);\nconst TYPE = Symbol('type');\nconst isPosInt = (n) => n && n === Math.floor(n) && n > 0 && isFinite(n);\n/* c8 ignore start */\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\nconst getUintArray = (max) => !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null;\n/* c8 ignore stop */\nclass ZeroArray extends Array {\n constructor(size) {\n super(size);\n this.fill(0);\n }\n}\nclass Stack {\n heap;\n length;\n // private constructor\n static #constructing = false;\n static create(max) {\n const HeapCls = getUintArray(max);\n if (!HeapCls)\n return [];\n Stack.#constructing = true;\n const s = new Stack(max, HeapCls);\n Stack.#constructing = false;\n return s;\n }\n constructor(max, HeapCls) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)');\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max);\n this.length = 0;\n }\n push(n) {\n this.heap[this.length++] = n;\n }\n pop() {\n return this.heap[--this.length];\n }\n}\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n #max;\n #maxSize;\n #dispose;\n #onInsert;\n #disposeAfter;\n #fetchMethod;\n #memoMethod;\n #perf;\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf;\n }\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl;\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution;\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge;\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet;\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas;\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale;\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet;\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL;\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize;\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation;\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection;\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet;\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort;\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection;\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort;\n // computed properties\n #size;\n #calculatedSize;\n #keyMap;\n #keyList;\n #valList;\n #next;\n #prev;\n #head;\n #tail;\n #free;\n #disposed;\n #sizes;\n #starts;\n #ttls;\n #hasDispose;\n #hasFetchMethod;\n #hasDisposeAfter;\n #hasOnInsert;\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals(c) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n sizes: c.#sizes,\n keyMap: c.#keyMap,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head;\n },\n get tail() {\n return c.#tail;\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p) => c.#isBackgroundFetch(p),\n backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context),\n moveToTail: (index) => c.#moveToTail(index),\n indexes: (options) => c.#indexes(options),\n rindexes: (options) => c.#rindexes(options),\n isStale: (index) => c.#isStale(index),\n };\n }\n // Protected read-only members\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max() {\n return this.#max;\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize() {\n return this.#maxSize;\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize() {\n return this.#calculatedSize;\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size() {\n return this.#size;\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod() {\n return this.#fetchMethod;\n }\n get memoMethod() {\n return this.#memoMethod;\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose;\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert;\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter;\n }\n constructor(options) {\n const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, onInsert, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, perf, } = options;\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError('perf option must have a now() method if specified');\n }\n }\n this.#perf = perf ?? defaultPerf;\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer');\n }\n const UintArray = max ? getUintArray(max) : Array;\n if (!UintArray) {\n throw new Error('invalid max value: ' + max);\n }\n this.#max = max;\n this.#maxSize = maxSize;\n this.maxEntrySize = maxEntrySize || this.#maxSize;\n this.sizeCalculation = sizeCalculation;\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize');\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function');\n }\n }\n if (memoMethod !== undefined &&\n typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined');\n }\n this.#memoMethod = memoMethod;\n if (fetchMethod !== undefined &&\n typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified');\n }\n this.#fetchMethod = fetchMethod;\n this.#hasFetchMethod = !!fetchMethod;\n this.#keyMap = new Map();\n this.#keyList = new Array(max).fill(undefined);\n this.#valList = new Array(max).fill(undefined);\n this.#next = new UintArray(max);\n this.#prev = new UintArray(max);\n this.#head = 0;\n this.#tail = 0;\n this.#free = Stack.create(max);\n this.#size = 0;\n this.#calculatedSize = 0;\n if (typeof dispose === 'function') {\n this.#dispose = dispose;\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert;\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter;\n this.#disposed = [];\n }\n else {\n this.#disposeAfter = undefined;\n this.#disposed = undefined;\n }\n this.#hasDispose = !!this.#dispose;\n this.#hasOnInsert = !!this.#onInsert;\n this.#hasDisposeAfter = !!this.#disposeAfter;\n this.noDisposeOnSet = !!noDisposeOnSet;\n this.noUpdateTTL = !!noUpdateTTL;\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection;\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection;\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort;\n this.ignoreFetchAbort = !!ignoreFetchAbort;\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError('maxSize must be a positive integer if specified');\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError('maxEntrySize must be a positive integer if specified');\n }\n this.#initializeSizeTracking();\n }\n this.allowStale = !!allowStale;\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet;\n this.updateAgeOnGet = !!updateAgeOnGet;\n this.updateAgeOnHas = !!updateAgeOnHas;\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ?\n ttlResolution\n : 1;\n this.ttlAutopurge = !!ttlAutopurge;\n this.ttl = ttl || 0;\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified');\n }\n this.#initializeTTLTracking();\n }\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError('At least one of max, maxSize, or ttl is required');\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED';\n if (shouldWarn(code)) {\n warned.add(code);\n const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.';\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache);\n }\n }\n }\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key) {\n return this.#keyMap.has(key) ? Infinity : 0;\n }\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max);\n const starts = new ZeroArray(this.#max);\n this.#ttls = ttls;\n this.#starts = starts;\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0;\n ttls[index] = ttl;\n if (ttl !== 0 && this.ttlAutopurge) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index], 'expire');\n }\n }, ttl + 1);\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref();\n }\n /* c8 ignore stop */\n }\n };\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0;\n };\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index];\n const start = starts[index];\n /* c8 ignore next */\n if (!ttl || !start)\n return;\n status.ttl = ttl;\n status.start = start;\n status.now = cachedNow || getNow();\n const age = status.now - start;\n status.remainingTTL = ttl - age;\n }\n };\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0;\n const getNow = () => {\n const n = this.#perf.now();\n if (this.ttlResolution > 0) {\n cachedNow = n;\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution);\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref();\n }\n /* c8 ignore stop */\n }\n return n;\n };\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key);\n if (index === undefined) {\n return 0;\n }\n const ttl = ttls[index];\n const start = starts[index];\n if (!ttl || !start) {\n return Infinity;\n }\n const age = (cachedNow || getNow()) - start;\n return ttl - age;\n };\n this.#isStale = index => {\n const s = starts[index];\n const t = ttls[index];\n return !!t && !!s && (cachedNow || getNow()) - s > t;\n };\n }\n // conditionally set private methods related to TTL\n #updateItemAge = () => { };\n #statusTTL = () => { };\n #setItemTTL = () => { };\n /* c8 ignore stop */\n #isStale = () => false;\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max);\n this.#calculatedSize = 0;\n this.#sizes = sizes;\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index];\n sizes[index] = 0;\n };\n this.#requireSize = (k, v, size, sizeCalculation) => {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n return 0;\n }\n if (!isPosInt(size)) {\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function');\n }\n size = sizeCalculation(v, k);\n if (!isPosInt(size)) {\n throw new TypeError('sizeCalculation return invalid (expect positive integer)');\n }\n }\n else {\n throw new TypeError('invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.');\n }\n }\n return size;\n };\n this.#addItemSize = (index, size, status) => {\n sizes[index] = size;\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index];\n while (this.#calculatedSize > maxSize) {\n this.#evict(true);\n }\n }\n this.#calculatedSize += sizes[index];\n if (status) {\n status.entrySize = size;\n status.totalCalculatedSize = this.#calculatedSize;\n }\n };\n }\n #removeItemSize = _i => { };\n #addItemSize = (_i, _s, _st) => { };\n #requireSize = (_k, _v, size, sizeCalculation) => {\n if (size || sizeCalculation) {\n throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache');\n }\n return 0;\n };\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; true;) {\n if (!this.#isValidIndex(i)) {\n break;\n }\n if (allowStale || !this.#isStale(i)) {\n yield i;\n }\n if (i === this.#head) {\n break;\n }\n else {\n i = this.#prev[i];\n }\n }\n }\n }\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; true;) {\n if (!this.#isValidIndex(i)) {\n break;\n }\n if (allowStale || !this.#isStale(i)) {\n yield i;\n }\n if (i === this.#tail) {\n break;\n }\n else {\n i = this.#next[i];\n }\n }\n }\n }\n #isValidIndex(index) {\n return (index !== undefined &&\n this.#keyMap.get(this.#keyList[index]) === index);\n }\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield [this.#keyList[i], this.#valList[i]];\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield [this.#keyList[i], this.#valList[i]];\n }\n }\n }\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i];\n if (k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield k;\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i];\n if (k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield k;\n }\n }\n }\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n if (v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i];\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i];\n if (v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i];\n }\n }\n }\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries();\n }\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache';\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(fn, getOptions = {}) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n if (value === undefined)\n continue;\n if (fn(value, this.#keyList[i], this)) {\n return this.get(this.#keyList[i], getOptions);\n }\n }\n }\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(fn, thisp = this) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n if (value === undefined)\n continue;\n fn.call(thisp, value, this.#keyList[i], this);\n }\n }\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(fn, thisp = this) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n if (value === undefined)\n continue;\n fn.call(thisp, value, this.#keyList[i], this);\n }\n }\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false;\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i], 'expire');\n deleted = true;\n }\n }\n return deleted;\n }\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key) {\n const i = this.#keyMap.get(key);\n if (i === undefined)\n return undefined;\n const v = this.#valList[i];\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n if (value === undefined)\n return undefined;\n /* c8 ignore end */\n const entry = { value };\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i];\n const start = this.#starts[i];\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start);\n entry.ttl = remain;\n entry.start = Date.now();\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i];\n }\n return entry;\n }\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr = [];\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i];\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n if (value === undefined || key === undefined)\n continue;\n const entry = { value };\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i];\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - this.#starts[i];\n entry.start = Math.floor(Date.now() - age);\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i];\n }\n arr.unshift([key, entry]);\n }\n return arr;\n }\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr) {\n this.clear();\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start;\n entry.start = this.#perf.now() - age;\n }\n this.set(key, entry.value, entry);\n }\n }\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(k, v, setOptions = {}) {\n if (v === undefined) {\n this.delete(k);\n return this;\n }\n const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions;\n let { noUpdateTTL = this.noUpdateTTL } = setOptions;\n const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation);\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n if (status) {\n status.set = 'miss';\n status.maxEntrySizeExceeded = true;\n }\n // have to delete, in case something is there already.\n this.#delete(k, 'set');\n return this;\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k);\n if (index === undefined) {\n // addition\n index = (this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size);\n this.#keyList[index] = k;\n this.#valList[index] = v;\n this.#keyMap.set(k, index);\n this.#next[this.#tail] = index;\n this.#prev[index] = this.#tail;\n this.#tail = index;\n this.#size++;\n this.#addItemSize(index, size, status);\n if (status)\n status.set = 'add';\n noUpdateTTL = false;\n if (this.#hasOnInsert) {\n this.#onInsert?.(v, k, 'add');\n }\n }\n else {\n // update\n this.#moveToTail(index);\n const oldVal = this.#valList[index];\n if (v !== oldVal) {\n if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) {\n oldVal.__abortController.abort(new Error('replaced'));\n const { __staleWhileFetching: s } = oldVal;\n if (s !== undefined && !noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set']);\n }\n }\n }\n else if (!noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set']);\n }\n }\n this.#removeItemSize(index);\n this.#addItemSize(index, size, status);\n this.#valList[index] = v;\n if (status) {\n status.set = 'replace';\n const oldValue = oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal;\n if (oldValue !== undefined)\n status.oldValue = oldValue;\n }\n }\n else if (status) {\n status.set = 'update';\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, v === oldVal ? 'update' : 'replace');\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking();\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start);\n }\n if (status)\n this.#statusTTL(status, index);\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n return this;\n }\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop() {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head];\n this.#evict(true);\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching;\n }\n }\n else if (val !== undefined) {\n return val;\n }\n }\n }\n finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n }\n }\n #evict(free) {\n const head = this.#head;\n const k = this.#keyList[head];\n const v = this.#valList[head];\n if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('evicted'));\n }\n else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'evict');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'evict']);\n }\n }\n this.#removeItemSize(head);\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined;\n this.#valList[head] = undefined;\n this.#free.push(head);\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0;\n this.#free.length = 0;\n }\n else {\n this.#head = this.#next[head];\n }\n this.#keyMap.delete(k);\n this.#size--;\n return head;\n }\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k, hasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions;\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined) {\n return false;\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index);\n }\n if (status) {\n status.has = 'hit';\n this.#statusTTL(status, index);\n }\n return true;\n }\n else if (status) {\n status.has = 'stale';\n this.#statusTTL(status, index);\n }\n }\n else if (status) {\n status.has = 'miss';\n }\n return false;\n }\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k, peekOptions = {}) {\n const { allowStale = this.allowStale } = peekOptions;\n const index = this.#keyMap.get(k);\n if (index === undefined ||\n (!allowStale && this.#isStale(index))) {\n return;\n }\n const v = this.#valList[index];\n // either stale and allowed, or forcing a refresh of non-stale value\n return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n }\n #backgroundFetch(k, index, options, context) {\n const v = index === undefined ? undefined : this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n return v;\n }\n const ac = new AC();\n const { signal } = options;\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n });\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n };\n const cb = (v, updateCache = false) => {\n const { aborted } = ac.signal;\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined;\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true;\n options.status.fetchError = ac.signal.reason;\n if (ignoreAbort)\n options.status.fetchAbortIgnored = true;\n }\n else {\n options.status.fetchResolved = true;\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason);\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p;\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index];\n if (vl === p || ignoreAbort && updateCache && vl === undefined) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index] = bf.__staleWhileFetching;\n }\n else {\n this.#delete(k, 'fetch');\n }\n }\n else {\n if (options.status)\n options.status.fetchUpdated = true;\n this.set(k, v, fetchOpts.options);\n }\n }\n return v;\n };\n const eb = (er) => {\n if (options.status) {\n options.status.fetchRejected = true;\n options.status.fetchError = er;\n }\n return fetchFail(er);\n };\n const fetchFail = (er) => {\n const { aborted } = ac.signal;\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort;\n const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection;\n const noDelete = allowStale || options.noDeleteOnFetchRejection;\n const bf = p;\n if (this.#valList[index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del = !noDelete || bf.__staleWhileFetching === undefined;\n if (del) {\n this.#delete(k, 'fetch');\n }\n else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index] = bf.__staleWhileFetching;\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true;\n }\n return bf.__staleWhileFetching;\n }\n else if (bf.__returned === bf) {\n throw er;\n }\n };\n const pcall = (res, rej) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts);\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej);\n }\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort ||\n options.allowStaleOnFetchAbort) {\n res(undefined);\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true);\n }\n }\n });\n };\n if (options.status)\n options.status.fetchDispatched = true;\n const p = new Promise(pcall).then(cb, eb);\n const bf = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n });\n if (index === undefined) {\n // internal, don't expose status.\n this.set(k, bf, { ...fetchOpts.options, status: undefined });\n index = this.#keyMap.get(k);\n }\n else {\n this.#valList[index] = bf;\n }\n return bf;\n }\n #isBackgroundFetch(p) {\n if (!this.#hasFetchMethod)\n return false;\n const b = p;\n return (!!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AC);\n }\n async fetch(k, fetchOptions = {}) {\n const { \n // get options\n allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, \n // set options\n ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, \n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions;\n if (!this.#hasFetchMethod) {\n if (status)\n status.fetch = 'get';\n return this.get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n });\n }\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n };\n let index = this.#keyMap.get(k);\n if (index === undefined) {\n if (status)\n status.fetch = 'miss';\n const p = this.#backgroundFetch(k, index, options, context);\n return (p.__returned = p);\n }\n else {\n // in cache, maybe already fetching\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined;\n if (status) {\n status.fetch = 'inflight';\n if (stale)\n status.returnedStale = true;\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v);\n }\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index);\n if (!forceRefresh && !isStale) {\n if (status)\n status.fetch = 'hit';\n this.#moveToTail(index);\n if (updateAgeOnGet) {\n this.#updateItemAge(index);\n }\n if (status)\n this.#statusTTL(status, index);\n return v;\n }\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context);\n const hasStale = p.__staleWhileFetching !== undefined;\n const staleVal = hasStale && allowStale;\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh';\n if (staleVal && isStale)\n status.returnedStale = true;\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p);\n }\n }\n async forceFetch(k, fetchOptions = {}) {\n const v = await this.fetch(k, fetchOptions);\n if (v === undefined)\n throw new Error('fetch() returned undefined');\n return v;\n }\n memo(k, memoOptions = {}) {\n const memoMethod = this.#memoMethod;\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor');\n }\n const { context, forceRefresh, ...options } = memoOptions;\n const v = this.get(k, options);\n if (!forceRefresh && v !== undefined)\n return v;\n const vv = memoMethod(k, v, {\n options,\n context,\n });\n this.set(k, vv, options);\n return vv;\n }\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k, getOptions = {}) {\n const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions;\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n const value = this.#valList[index];\n const fetching = this.#isBackgroundFetch(value);\n if (status)\n this.#statusTTL(status, index);\n if (this.#isStale(index)) {\n if (status)\n status.get = 'stale';\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire');\n }\n if (status && allowStale)\n status.returnedStale = true;\n return allowStale ? value : undefined;\n }\n else {\n if (status &&\n allowStale &&\n value.__staleWhileFetching !== undefined) {\n status.returnedStale = true;\n }\n return allowStale ? value.__staleWhileFetching : undefined;\n }\n }\n else {\n if (status)\n status.get = 'hit';\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n if (fetching) {\n return value.__staleWhileFetching;\n }\n this.#moveToTail(index);\n if (updateAgeOnGet) {\n this.#updateItemAge(index);\n }\n return value;\n }\n }\n else if (status) {\n status.get = 'miss';\n }\n }\n #connect(p, n) {\n this.#prev[n] = p;\n this.#next[p] = n;\n }\n #moveToTail(index) {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index];\n }\n else {\n this.#connect(this.#prev[index], this.#next[index]);\n }\n this.#connect(this.#tail, index);\n this.#tail = index;\n }\n }\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k) {\n return this.#delete(k, 'delete');\n }\n #delete(k, reason) {\n let deleted = false;\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n deleted = true;\n if (this.#size === 1) {\n this.#clear(reason);\n }\n else {\n this.#removeItemSize(index);\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'));\n }\n else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, reason);\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, reason]);\n }\n }\n this.#keyMap.delete(k);\n this.#keyList[index] = undefined;\n this.#valList[index] = undefined;\n if (index === this.#tail) {\n this.#tail = this.#prev[index];\n }\n else if (index === this.#head) {\n this.#head = this.#next[index];\n }\n else {\n const pi = this.#prev[index];\n this.#next[pi] = this.#next[index];\n const ni = this.#next[index];\n this.#prev[ni] = this.#prev[index];\n }\n this.#size--;\n this.#free.push(index);\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n return deleted;\n }\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete');\n }\n #clear(reason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'));\n }\n else {\n const k = this.#keyList[index];\n if (this.#hasDispose) {\n this.#dispose?.(v, k, reason);\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, reason]);\n }\n }\n }\n this.#keyMap.clear();\n this.#valList.fill(undefined);\n this.#keyList.fill(undefined);\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0);\n this.#starts.fill(0);\n }\n if (this.#sizes) {\n this.#sizes.fill(0);\n }\n this.#head = 0;\n this.#tail = 0;\n this.#free.length = 0;\n this.#calculatedSize = 0;\n this.#size = 0;\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n }\n}\n//# sourceMappingURL=index.js.map","import { flatten } from 'lodash';\nimport { LRUCache } from 'lru-cache';\n\nimport { AbstractQuery, getDefaultTimeRange, KeyValue, LanguageProvider, ScopedVars, TimeRange } from '@grafana/data';\nimport { BackendSrvRequest, config } from '@grafana/runtime';\n\nimport { DEFAULT_MAX_LINES_SAMPLE, LokiDatasource } from './datasource';\nimport { abstractQueryToExpr, mapAbstractOperatorsToOp, processLabels } from './languageUtils';\nimport { getStreamSelectorsFromQuery } from './queryUtils';\nimport { buildVisualQueryFromString } from './querybuilder/parsing';\nimport {\n extractLabelKeysFromDataFrame,\n extractLogParserFromDataFrame,\n extractUnwrapLabelKeysFromDataFrame,\n} from './responseUtils';\nimport { DetectedFieldsResult, LabelType, LokiQuery, LokiQueryType, ParserAndLabelKeysResult } from './types';\n\nconst NS_IN_MS = 1000000;\nconst EMPTY_SELECTOR = '{}';\nconst HIDDEN_LABELS = ['__aggregated_metric__', '__tenant_id__', '__stream_shard__'];\n\nexport default class LokiLanguageProvider extends LanguageProvider {\n labelKeys: string[];\n started = false;\n startedTimeRange?: TimeRange;\n datasource: LokiDatasource;\n\n /**\n * Cache for labels of series. This is bit simplistic in the sense that it just counts responses each as a 1 and does\n * not account for different size of a response. If that is needed a `length` function can be added in the options.\n * 10 as a max size is totally arbitrary right now.\n */\n private seriesCache = new LRUCache<string, Record<string, string[]>>({ max: 10 });\n private labelsCache = new LRUCache<string, string[]>({ max: 10 });\n private detectedFieldValuesCache = new LRUCache<string, string[]>({ max: 10 });\n private labelsPromisesCache = new LRUCache<string, Promise<string[]>>({ max: 10 });\n private detectedLabelValuesPromisesCache = new LRUCache<string, Promise<string[]>>({ max: 10 });\n\n constructor(datasource: LokiDatasource) {\n super();\n\n this.datasource = datasource;\n this.labelKeys = [];\n }\n\n request = async (\n url: string,\n params?: Record<string, string | number>,\n throwError?: boolean,\n requestOptions?: Partial<BackendSrvRequest>\n ) => {\n try {\n return await this.datasource.metadataRequest(url, params, requestOptions);\n } catch (error) {\n if (throwError) {\n throw error;\n } else {\n console.error(error);\n }\n }\n\n return undefined;\n };\n\n /**\n * Initialize the language provider by fetching set of labels.\n */\n start = (timeRange?: TimeRange) => {\n const range = timeRange ?? this.getDefaultTimeRange();\n const newRangeParams = this.datasource.getTimeRangeParams(range);\n const prevRangeParams = this.startedTimeRange ? this.datasource.getTimeRangeParams(this.startedTimeRange) : null;\n // refetch labels if either there's not already a start task or the time range has changed\n if (\n !this.startTask ||\n !prevRangeParams ||\n newRangeParams.start !== prevRangeParams.start ||\n newRangeParams.end !== prevRangeParams.end\n ) {\n this.startedTimeRange = range;\n this.startTask = this.fetchLabels({ timeRange: range }).then(() => {\n this.started = true;\n return [];\n });\n }\n\n return this.startTask;\n };\n\n /**\n * Returns the label keys that have been fetched.\n * If labels have not been fetched yet, it will return an empty array.\n * For updated labels (which should not happen often), use fetchLabels.\n * @todo It is quite complicated to know when to use fetchLabels and when to use getLabelKeys.\n * We should consider simplifying this and use caching in the same way as with seriesCache and labelsCache\n * and just always use fetchLabels.\n * Caching should be thought out properly, so we are not fetching this often, as labelKeys should not be changing often.\n *\n * @returns {string[]} An array of label keys or an empty array if labels have not been fetched.\n */\n getLabelKeys(): string[] {\n return this.labelKeys;\n }\n\n importFromAbstractQuery(labelBasedQuery: AbstractQuery): LokiQuery {\n return {\n refId: labelBasedQuery.refId,\n expr: abstractQueryToExpr(labelBasedQuery),\n queryType: LokiQueryType.Range,\n };\n }\n\n exportToAbstractQuery(query: LokiQuery): AbstractQuery {\n if (!query.expr || query.expr.length === 0) {\n return { refId: query.refId, labelMatchers: [] };\n }\n const streamSelectors = getStreamSelectorsFromQuery(query.expr);\n\n const labelMatchers = streamSelectors.map((streamSelector) => {\n const visualQuery = buildVisualQueryFromString(streamSelector).query;\n const matchers = visualQuery.labels.map((label) => {\n return {\n name: label.label,\n value: label.value,\n operator: mapAbstractOperatorsToOp[label.op],\n };\n });\n return matchers;\n });\n\n return {\n refId: query.refId,\n labelMatchers: flatten(labelMatchers),\n };\n }\n\n /**\n * Fetch label keys using the best applicable endpoint.\n *\n * This asynchronous function returns all available label keys from the data source.\n * It returns a promise that resolves to an array of strings containing the label keys.\n *\n * @param options - (Optional) An object containing additional options.\n * @param options.streamSelector - (Optional) The stream selector to filter label keys. If not provided, all label keys are fetched.\n * @param options.timeRange - (Optional) The time range for which you want to retrieve label keys. If not provided, the default time range is used.\n * @returns A promise containing an array of label keys.\n * @throws An error if the fetch operation fails.\n */\n async fetchLabels(options?: { streamSelector?: string; timeRange?: TimeRange }): Promise<string[]> {\n // We'll default to use `/labels`. If the flag is disabled, and there's a streamSelector, we'll use the series endpoint.\n if (config.featureToggles.lokiLabelNamesQueryApi || !options?.streamSelector) {\n return this.fetchLabelsByLabelsEndpoint(options);\n } else {\n const data = await this.fetchSeriesLabels(options.streamSelector, { timeRange: options.timeRange });\n return Object.keys(data ?? {});\n }\n }\n\n /**\n * Fetch all label keys\n * This asynchronous function returns all available label keys from the data source.\n * It returns a promise that resolves to an array of strings containing the label keys.\n *\n * @param options - (Optional) An object containing additional options - currently only time range.\n * @param options.timeRange - (Optional) The time range for which you want to retrieve label keys. If not provided, the default time range is used.\n * @returns A promise containing an array of label keys.\n * @throws An error if the fetch operation fails.\n */\n private async fetchLabelsByLabelsEndpoint(options?: {\n streamSelector?: string;\n timeRange?: TimeRange;\n }): Promise<string[]> {\n const url = 'labels';\n const range = options?.timeRange ?? this.getDefaultTimeRange();\n const { start, end } = this.datasource.getTimeRangeParams(range);\n const params: Record<string, string | number> = { start, end };\n if (options?.streamSelector && options?.streamSelector !== EMPTY_SELECTOR) {\n params['query'] = options.streamSelector;\n }\n const res = await this.request(url, params);\n if (Array.isArray(res)) {\n const labels = Array.from(new Set(res))\n .slice()\n .sort()\n .filter((label: string) => HIDDEN_LABELS.includes(label) === false);\n this.labelKeys = labels;\n return this.labelKeys;\n }\n\n return [];\n }\n\n /**\n * Fetch series labels for a selector\n *\n * This method fetches labels for a given stream selector, such as `{job=\"grafana\"}`.\n * It returns a promise that resolves to a record mapping label names to their corresponding values.\n *\n * @param streamSelector - The stream selector for which you want to retrieve labels.\n * @param options - (Optional) An object containing additional options - currently only time range.\n * @param options.timeRange - (Optional) The time range for which you want to retrieve label keys. If not provided, the default time range is used.\n * @returns A promise containing a record of label names and their values.\n * @throws An error if the fetch operation fails.\n */\n fetchSeriesLabels = async (\n streamSelector: string,\n options?: { timeRange?: TimeRange }\n ): Promise<Record<string, string[]>> => {\n const interpolatedMatch = this.datasource.interpolateString(streamSelector);\n const url = 'series';\n const range = options?.timeRange ?? this.getDefaultTimeRange();\n const { start, end } = this.datasource.getTimeRangeParams(range);\n\n const cacheKey = this.generateCacheKey(url, start, end, interpolatedMatch);\n let value = this.seriesCache.get(cacheKey);\n if (!value) {\n const params = { 'match[]': interpolatedMatch, start, end };\n const data = await this.request(url, params);\n if (!Array.isArray(data)) {\n return {};\n }\n const { values } = processLabels(data);\n value = values;\n this.seriesCache.set(cacheKey, value);\n }\n return value;\n };\n\n /**\n * Fetch series for a selector. Use this for raw results. Use fetchSeriesLabels() to get labels.\n * @param match\n * @param streamSelector - The stream selector for which you want to retrieve labels.\n * @param options - (Optional) An object containing additional options.\n * @param options.timeRange - (Optional) The time range for which you want to retrieve label keys. If not provided, the default time range is used.\n * @returns A promise containing array with records of label names and their value.\n */\n fetchSeries = async (match: string, options?: { timeRange?: TimeRange }): Promise<Array<Record<string, string>>> => {\n const url = 'series';\n const range = options?.timeRange ?? this.getDefaultTimeRange();\n const { start, end } = this.datasource.getTimeRangeParams(range);\n const params = { 'match[]': match, start, end };\n return await this.request(url, params);\n };\n\n // Cache key is a bit different here. We round up to a minute the intervals.\n // The rounding may seem strange but makes relative intervals like now-1h less prone to need separate request every\n // millisecond while still actually getting all the keys for the correct interval. This still can create problems\n // when user does not the newest values for a minute if already cached.\n private generateCacheKey(url: string, start: number, end: number, param: string): string {\n return [url, this.roundTime(start), this.roundTime(end), param].join();\n }\n\n // Round nanoseconds epoch to nearest 5 minute interval\n private roundTime(nanoseconds: number): number {\n return nanoseconds ? Math.floor(nanoseconds / NS_IN_MS / 1000 / 60 / 5) : 0;\n }\n\n async fetchDetectedFields(\n queryOptions: {\n expr: string;\n timeRange?: TimeRange;\n limit?: number;\n scopedVars?: ScopedVars;\n },\n requestOptions?: Partial<BackendSrvRequest>\n ): Promise<DetectedFieldsResult | Error> {\n const interpolatedExpr =\n queryOptions.expr && queryOptions.expr !== EMPTY_SELECTOR\n ? this.datasource.interpolateString(queryOptions.expr, queryOptions.scopedVars)\n : undefined;\n\n if (!interpolatedExpr) {\n throw new Error('fetchDetectedFields requires query expression');\n }\n\n const url = `detected_fields`;\n const range = queryOptions?.timeRange ?? this.getDefaultTimeRange();\n const rangeParams = this.datasource.getTimeRangeParams(range);\n const { start, end } = rangeParams;\n const params: KeyValue<string | number> = { start, end, limit: queryOptions?.limit ?? 1000 };\n params.query = interpolatedExpr;\n\n return new Promise(async (resolve, reject) => {\n try {\n const data = await this.request(url, params, true, requestOptions);\n resolve(data);\n } catch (error) {\n console.error('error', error);\n reject(error);\n }\n });\n }\n\n async fetchDetectedFieldValues(\n labelName: string,\n queryOptions?: {\n expr?: string;\n timeRange?: TimeRange;\n limit?: number;\n scopedVars?: ScopedVars;\n throwError?: boolean;\n },\n requestOptions?: Partial<BackendSrvRequest>\n ): Promise<string[] | Error> {\n // This function was named poorly, it's not detected label values, it's detected field values! :facepalm\n return this.fetchDetectedLabelValues(labelName, queryOptions, requestOptions);\n }\n\n /**\n * @deprecated: use fetchDetectedFieldValues instead\n */\n async fetchDetectedLabelValues(\n labelName: string,\n queryOptions?: {\n expr?: string;\n timeRange?: TimeRange;\n limit?: number;\n scopedVars?: ScopedVars;\n throwError?: boolean;\n },\n requestOptions?: Partial<BackendSrvRequest>\n ): Promise<string[] | Error> {\n const label = encodeURIComponent(this.datasource.interpolateString(labelName));\n\n const interpolatedExpr =\n queryOptions?.expr && queryOptions.expr !== EMPTY_SELECTOR\n ? this.datasource.interpolateString(queryOptions.expr, queryOptions.scopedVars)\n : undefined;\n\n const url = `detected_field/${label}/values`;\n const range = queryOptions?.timeRange ?? this.getDefaultTimeRange();\n const rangeParams = this.datasource.getTimeRangeParams(range);\n const { start, end } = rangeParams;\n const params: KeyValue<string | number> = { start, end, limit: queryOptions?.limit ?? 1000 };\n let paramCacheKey = label;\n\n if (interpolatedExpr) {\n params.query = interpolatedExpr;\n paramCacheKey += interpolatedExpr;\n }\n\n const cacheKey = this.generateCacheKey(url, start, end, paramCacheKey);\n\n // Values in cache, return\n const labelValues = this.detectedFieldValuesCache.get(cacheKey);\n if (labelValues) {\n return labelValues;\n }\n\n // Promise in cache, return\n let labelValuesPromise = this.detectedLabelValuesPromisesCache.get(cacheKey);\n if (labelValuesPromise) {\n return labelValuesPromise;\n }\n\n labelValuesPromise = new Promise(async (resolve, reject) => {\n try {\n const data = await this.request(url, params, queryOptions?.throwError, requestOptions);\n if (Array.isArray(data)) {\n const labelValues = data.slice().sort();\n this.detectedFieldValuesCache.set(cacheKey, labelValues);\n this.detectedLabelValuesPromisesCache.delete(cacheKey);\n resolve(labelValues);\n }\n } catch (error) {\n if (queryOptions?.throwError) {\n reject(error);\n } else {\n console.error(error);\n resolve([]);\n }\n }\n });\n this.detectedLabelValuesPromisesCache.set(cacheKey, labelValuesPromise);\n\n return labelValuesPromise;\n }\n\n /**\n * Fetch label values\n *\n * This asynchronous function fetches values associated with a specified label name.\n * It returns a promise that resolves to an array of strings containing the label values.\n *\n * @param labelName - The name of the label for which you want to retrieve values.\n * @param options - (Optional) An object containing additional options.\n * @param options.streamSelector - (Optional) The stream selector to filter label values. If not provided, all label values are fetched.\n * @param options.timeRange - (Optional) The time range for which you want to retrieve label values. If not provided, the default time range is used.\n * @returns A promise containing an array of label values.\n * @throws An error if the fetch operation fails.\n */\n async fetchLabelValues(\n labelName: string,\n options?: { streamSelector?: string; timeRange?: TimeRange }\n ): Promise<string[]> {\n const label = encodeURIComponent(this.datasource.interpolateString(labelName));\n // Loki doesn't allow empty streamSelector {}, so we should not send it.\n const streamParam =\n options?.streamSelector && options.streamSelector !== EMPTY_SELECTOR\n ? this.datasource.interpolateString(options.streamSelector)\n : undefined;\n\n const url = `label/${label}/values`;\n const range = options?.timeRange ?? this.getDefaultTimeRange();\n const rangeParams = this.datasource.getTimeRangeParams(range);\n const { start, end } = rangeParams;\n const params: KeyValue<string | number> = { start, end };\n let paramCacheKey = label;\n\n if (streamParam) {\n params.query = streamParam;\n paramCacheKey += streamParam;\n }\n\n const cacheKey = this.generateCacheKey(url, start, end, paramCacheKey);\n\n // Values in cache, return\n const labelValues = this.labelsCache.get(cacheKey);\n if (labelValues) {\n return labelValues;\n }\n\n // Promise in cache, return\n let labelValuesPromise = this.labelsPromisesCache.get(cacheKey);\n if (labelValuesPromise) {\n return labelValuesPromise;\n }\n\n labelValuesPromise = new Promise(async (resolve) => {\n try {\n const data = await this.request(url, params);\n if (Array.isArray(data)) {\n const labelValues = data.slice().sort();\n this.labelsCache.set(cacheKey, labelValues);\n this.labelsPromisesCache.delete(cacheKey);\n resolve(labelValues);\n }\n } catch (error) {\n console.error(error);\n resolve([]);\n }\n });\n this.labelsPromisesCache.set(cacheKey, labelValuesPromise);\n return labelValuesPromise;\n }\n\n /**\n * Get parser and label keys for a selector\n *\n * This asynchronous function is used to fetch parsers and label keys for a selected log stream based on sampled lines.\n * It returns a promise that resolves to an object with the following properties:\n *\n * - `extractedLabelKeys`: An array of available label keys associated with the log stream.\n * - `hasJSON`: A boolean indicating whether JSON parsing is available for the stream.\n * - `hasLogfmt`: A boolean indicating whether Logfmt parsing is available for the stream.\n * - `hasPack`: A boolean indicating whether Pack parsing is available for the stream.\n * - `unwrapLabelKeys`: An array of label keys that can be used for unwrapping log data.\n *\n * @param streamSelector - The selector for the log stream you want to analyze.\n * @param options - (Optional) An object containing additional options.\n * @param options.maxLines - (Optional) The number of log lines requested when determining parsers and label keys.\n * @param options.timeRange - (Optional) The time range for which you want to retrieve label keys. If not provided, the default time range is used.\n * Smaller maxLines is recommended for improved query performance. The default count is 10.\n * @returns A promise containing an object with parser and label key information.\n * @throws An error if the fetch operation fails.\n */\n async getParserAndLabelKeys(\n streamSelector: string,\n options?: { maxLines?: number; timeRange?: TimeRange }\n ): Promise<ParserAndLabelKeysResult> {\n const empty = {\n extractedLabelKeys: [],\n structuredMetadataKeys: [],\n unwrapLabelKeys: [],\n hasJSON: false,\n hasLogfmt: false,\n hasPack: false,\n };\n\n const series = await this.datasource.getDataSamples(\n {\n expr: streamSelector,\n refId: 'data-samples',\n maxLines: options?.maxLines || DEFAULT_MAX_LINES_SAMPLE,\n },\n options?.timeRange ?? this.getDefaultTimeRange()\n );\n\n if (!series.length) {\n return empty;\n }\n\n const { hasLogfmt, hasJSON, hasPack } = extractLogParserFromDataFrame(series[0]);\n\n return {\n extractedLabelKeys: [\n ...extractLabelKeysFromDataFrame(series[0], LabelType.Indexed),\n ...extractLabelKeysFromDataFrame(series[0], LabelType.Parsed),\n ],\n structuredMetadataKeys: extractLabelKeysFromDataFrame(series[0], LabelType.StructuredMetadata),\n unwrapLabelKeys: extractUnwrapLabelKeysFromDataFrame(series[0]),\n hasJSON,\n hasPack,\n hasLogfmt,\n };\n }\n\n /**\n * Get the default time range\n *\n * @returns {TimeRange} The default time range\n */\n getDefaultTimeRange(): TimeRange {\n return getDefaultTimeRange();\n }\n}\n","import { __assign, __extends } from \"tslib\";\nimport { Subject, AnonymousSubject } from '../../Subject';\nimport { Subscriber } from '../../Subscriber';\nimport { Observable } from '../../Observable';\nimport { Subscription } from '../../Subscription';\nimport { ReplaySubject } from '../../ReplaySubject';\nvar DEFAULT_WEBSOCKET_CONFIG = {\n url: '',\n deserializer: function (e) { return JSON.parse(e.data); },\n serializer: function (value) { return JSON.stringify(value); },\n};\nvar WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT = 'WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }';\nvar WebSocketSubject = (function (_super) {\n __extends(WebSocketSubject, _super);\n function WebSocketSubject(urlConfigOrSource, destination) {\n var _this = _super.call(this) || this;\n _this._socket = null;\n if (urlConfigOrSource instanceof Observable) {\n _this.destination = destination;\n _this.source = urlConfigOrSource;\n }\n else {\n var config = (_this._config = __assign({}, DEFAULT_WEBSOCKET_CONFIG));\n _this._output = new Subject();\n if (typeof urlConfigOrSource === 'string') {\n config.url = urlConfigOrSource;\n }\n else {\n for (var key in urlConfigOrSource) {\n if (urlConfigOrSource.hasOwnProperty(key)) {\n config[key] = urlConfigOrSource[key];\n }\n }\n }\n if (!config.WebSocketCtor && WebSocket) {\n config.WebSocketCtor = WebSocket;\n }\n else if (!config.WebSocketCtor) {\n throw new Error('no WebSocket constructor can be found');\n }\n _this.destination = new ReplaySubject();\n }\n return _this;\n }\n WebSocketSubject.prototype.lift = function (operator) {\n var sock = new WebSocketSubject(this._config, this.destination);\n sock.operator = operator;\n sock.source = this;\n return sock;\n };\n WebSocketSubject.prototype._resetState = function () {\n this._socket = null;\n if (!this.source) {\n this.destination = new ReplaySubject();\n }\n this._output = new Subject();\n };\n WebSocketSubject.prototype.multiplex = function (subMsg, unsubMsg, messageFilter) {\n var self = this;\n return new Observable(function (observer) {\n try {\n self.next(subMsg());\n }\n catch (err) {\n observer.error(err);\n }\n var subscription = self.subscribe({\n next: function (x) {\n try {\n if (messageFilter(x)) {\n observer.next(x);\n }\n }\n catch (err) {\n observer.error(err);\n }\n },\n error: function (err) { return observer.error(err); },\n complete: function () { return observer.complete(); },\n });\n return function () {\n try {\n self.next(unsubMsg());\n }\n catch (err) {\n observer.error(err);\n }\n subscription.unsubscribe();\n };\n });\n };\n WebSocketSubject.prototype._connectSocket = function () {\n var _this = this;\n var _a = this._config, WebSocketCtor = _a.WebSocketCtor, protocol = _a.protocol, url = _a.url, binaryType = _a.binaryType;\n var observer = this._output;\n var socket = null;\n try {\n socket = protocol ? new WebSocketCtor(url, protocol) : new WebSocketCtor(url);\n this._socket = socket;\n if (binaryType) {\n this._socket.binaryType = binaryType;\n }\n }\n catch (e) {\n observer.error(e);\n return;\n }\n var subscription = new Subscription(function () {\n _this._socket = null;\n if (socket && socket.readyState === 1) {\n socket.close();\n }\n });\n socket.onopen = function (evt) {\n var _socket = _this._socket;\n if (!_socket) {\n socket.close();\n _this._resetState();\n return;\n }\n var openObserver = _this._config.openObserver;\n if (openObserver) {\n openObserver.next(evt);\n }\n var queue = _this.destination;\n _this.destination = Subscriber.create(function (x) {\n if (socket.readyState === 1) {\n try {\n var serializer = _this._config.serializer;\n socket.send(serializer(x));\n }\n catch (e) {\n _this.destination.error(e);\n }\n }\n }, function (err) {\n var closingObserver = _this._config.closingObserver;\n if (closingObserver) {\n closingObserver.next(undefined);\n }\n if (err && err.code) {\n socket.close(err.code, err.reason);\n }\n else {\n observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));\n }\n _this._resetState();\n }, function () {\n var closingObserver = _this._config.closingObserver;\n if (closingObserver) {\n closingObserver.next(undefined);\n }\n socket.close();\n _this._resetState();\n });\n if (queue && queue instanceof ReplaySubject) {\n subscription.add(queue.subscribe(_this.destination));\n }\n };\n socket.onerror = function (e) {\n _this._resetState();\n observer.error(e);\n };\n socket.onclose = function (e) {\n if (socket === _this._socket) {\n _this._resetState();\n }\n var closeObserver = _this._config.closeObserver;\n if (closeObserver) {\n closeObserver.next(e);\n }\n if (e.wasClean) {\n observer.complete();\n }\n else {\n observer.error(e);\n }\n };\n socket.onmessage = function (e) {\n try {\n var deserializer = _this._config.deserializer;\n observer.next(deserializer(e));\n }\n catch (err) {\n observer.error(err);\n }\n };\n };\n WebSocketSubject.prototype._subscribe = function (subscriber) {\n var _this = this;\n var source = this.source;\n if (source) {\n return source.subscribe(subscriber);\n }\n if (!this._socket) {\n this._connectSocket();\n }\n this._output.subscribe(subscriber);\n subscriber.add(function () {\n var _socket = _this._socket;\n if (_this._output.observers.length === 0) {\n if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {\n _socket.close();\n }\n _this._resetState();\n }\n });\n return subscriber;\n };\n WebSocketSubject.prototype.unsubscribe = function () {\n var _socket = this._socket;\n if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {\n _socket.close();\n }\n this._resetState();\n _super.prototype.unsubscribe.call(this);\n };\n return WebSocketSubject;\n}(AnonymousSubject));\nexport { WebSocketSubject };\n//# sourceMappingURL=WebSocketSubject.js.map","import { WebSocketSubject } from './WebSocketSubject';\nexport function webSocket(urlConfigOrSource) {\n return new WebSocketSubject(urlConfigOrSource);\n}\n//# sourceMappingURL=webSocket.js.map","function f(s, x, y, z) {\n switch (s) {\n case 0:\n return (x & y) ^ (~x & z);\n case 1:\n return x ^ y ^ z;\n case 2:\n return (x & y) ^ (x & z) ^ (y & z);\n case 3:\n return x ^ y ^ z;\n }\n}\nfunction ROTL(x, n) {\n return (x << n) | (x >>> (32 - n));\n}\nfunction sha1(bytes) {\n const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n const newBytes = new Uint8Array(bytes.length + 1);\n newBytes.set(bytes);\n newBytes[bytes.length] = 0x80;\n bytes = newBytes;\n const l = bytes.length / 4 + 2;\n const N = Math.ceil(l / 16);\n const M = new Array(N);\n for (let i = 0; i < N; ++i) {\n const arr = new Uint32Array(16);\n for (let j = 0; j < 16; ++j) {\n arr[j] =\n (bytes[i * 64 + j * 4] << 24) |\n (bytes[i * 64 + j * 4 + 1] << 16) |\n (bytes[i * 64 + j * 4 + 2] << 8) |\n bytes[i * 64 + j * 4 + 3];\n }\n M[i] = arr;\n }\n M[N - 1][14] = ((bytes.length - 1) * 8) / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = ((bytes.length - 1) * 8) & 0xffffffff;\n for (let i = 0; i < N; ++i) {\n const W = new Uint32Array(80);\n for (let t = 0; t < 16; ++t) {\n W[t] = M[i][t];\n }\n for (let t = 16; t < 80; ++t) {\n W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);\n }\n let a = H[0];\n let b = H[1];\n let c = H[2];\n let d = H[3];\n let e = H[4];\n for (let t = 0; t < 80; ++t) {\n const s = Math.floor(t / 20);\n const T = (ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t]) >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n H[0] = (H[0] + a) >>> 0;\n H[1] = (H[1] + b) >>> 0;\n H[2] = (H[2] + c) >>> 0;\n H[3] = (H[3] + d) >>> 0;\n H[4] = (H[4] + e) >>> 0;\n }\n return Uint8Array.of(H[0] >> 24, H[0] >> 16, H[0] >> 8, H[0], H[1] >> 24, H[1] >> 16, H[1] >> 8, H[1], H[2] >> 24, H[2] >> 16, H[2] >> 8, H[2], H[3] >> 24, H[3] >> 16, H[3] >> 8, H[3], H[4] >> 24, H[4] >> 16, H[4] >> 8, H[4]);\n}\nexport default sha1;\n","import validate from './validate.js';\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n let v;\n return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff);\n}\nexport default parse;\n","import parse from './parse.js';\nimport { unsafeStringify } from './stringify.js';\nexport function stringToBytes(str) {\n str = unescape(encodeURIComponent(str));\n const bytes = new Uint8Array(str.length);\n for (let i = 0; i < str.length; ++i) {\n bytes[i] = str.charCodeAt(i);\n }\n return bytes;\n}\nexport const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function v35(version, hash, value, namespace, buf, offset) {\n const valueBytes = typeof value === 'string' ? stringToBytes(value) : value;\n const namespaceBytes = typeof namespace === 'string' ? parse(namespace) : namespace;\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n if (namespace?.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n }\n let bytes = new Uint8Array(16 + valueBytes.length);\n bytes.set(namespaceBytes);\n bytes.set(valueBytes, namespaceBytes.length);\n bytes = hash(bytes);\n bytes[6] = (bytes[6] & 0x0f) | version;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n return buf;\n }\n return unsafeStringify(bytes);\n}\n","import sha1 from './sha1.js';\nimport v35, { DNS, URL } from './v35.js';\nexport { DNS, URL } from './v35.js';\nfunction v5(value, namespace, buf, offset) {\n return v35(0x50, sha1, value, namespace, buf, offset);\n}\nv5.DNS = DNS;\nv5.URL = URL;\nexport default v5;\n","import { v5 as uuidv5 } from 'uuid';\n\nimport { MutableDataFrame } from '@grafana/data';\n\nimport { LokiStreamResult, LokiTailResponse } from './types';\n\nconst UUID_NAMESPACE = '6ec946da-0f49-47a8-983a-1d76d17e7c92';\n\n/**\n * Transform LokiResponse data and appends it to MutableDataFrame. Used for streaming where the dataFrame can be\n * a CircularDataFrame creating a fixed size rolling buffer.\n * TODO: Probably could be unified with the logStreamToDataFrame function.\n * @param response\n * @param data Needs to have ts, line, labels, id as fields\n */\nexport function appendResponseToBufferedData(response: LokiTailResponse, data: MutableDataFrame) {\n // Should we do anything with: response.dropped_entries?\n\n const streams: LokiStreamResult[] = response.streams;\n if (!streams || !streams.length) {\n return;\n }\n\n const tsField = data.fields[0];\n const lineField = data.fields[1];\n const idField = data.fields[2];\n\n // We are comparing used ids only within the received stream. This could be a problem if the same line + labels + nanosecond timestamp came in 2 separate batches.\n // As this is very unlikely, and the result would only affect live-tailing css animation we have decided to not compare all received uids from data param as this would slow down processing.\n const usedUids: Record<string, number> = {};\n\n for (const stream of streams) {\n // Find unique labels\n const allLabelsString = Object.entries(stream.stream)\n .map(([key, val]) => `${key}=\"${val}\"`)\n .sort()\n .join('');\n\n // Add each line\n for (const [ts, line] of stream.values) {\n tsField.values.push(new Date(parseInt(ts.slice(0, -6), 10)).toISOString());\n lineField.values.push(line);\n idField.values.push(createUid(ts, allLabelsString, line, usedUids, data.refId));\n }\n }\n}\n\nfunction createUid(\n ts: string,\n labelsString: string,\n line: string,\n usedUids: Record<string, number>,\n refId?: string\n): string {\n // Generate id as hashed nanosecond timestamp, labels and line (this does not have to be unique)\n let id = uuidv5(`${ts}_${labelsString}_${line}`, UUID_NAMESPACE);\n\n // Check if generated id is unique\n // If not and we've already used it, append its count after it\n if (id in usedUids) {\n // Increase the count\n const newCount = usedUids[id] + 1;\n usedUids[id] = newCount;\n // Append count to generated id to make it unique\n id = `${id}_${newCount}`;\n } else {\n // If id is unique and wasn't used, add it to usedUids and start count at 0\n usedUids[id] = 0;\n }\n // Return unique id\n if (refId) {\n return `${refId}_${id}`;\n }\n return id;\n}\n","import { Observable, throwError, timer } from 'rxjs';\nimport { finalize, map, retryWhen, mergeMap } from 'rxjs/operators';\nimport { webSocket } from 'rxjs/webSocket';\n\nimport { DataFrame, FieldType, KeyValue, CircularDataFrame } from '@grafana/data';\n\nimport { appendResponseToBufferedData } from './liveStreamsResultTransformer';\nimport { LokiTailResponse } from './types';\n\n/**\n * Maps directly to a query in the UI (refId is key)\n */\nexport interface LokiLiveTarget {\n query: string;\n url: string;\n refId: string;\n size: number;\n}\n\n/**\n * Cache of websocket streams that can be returned as observable. In case there already is a stream for particular\n * target it is returned and on subscription returns the latest dataFrame.\n */\nexport class LiveStreams {\n private streams: KeyValue<Observable<DataFrame[]>> = {};\n\n getStream(target: LokiLiveTarget, retryInterval = 5000): Observable<DataFrame[]> {\n let stream = this.streams[target.url];\n\n if (stream) {\n return stream;\n }\n\n const data = new CircularDataFrame({ capacity: target.size });\n data.addField({ name: 'Time', type: FieldType.time, config: {} });\n data.addField({ name: 'Line', type: FieldType.string });\n data.addField({ name: 'id', type: FieldType.string });\n data.meta = { ...data.meta, preferredVisualisationType: 'logs' };\n data.refId = target.refId;\n\n stream = webSocket<LokiTailResponse>(target.url).pipe(\n map((response: LokiTailResponse) => {\n appendResponseToBufferedData(response, data);\n return [data];\n }),\n retryWhen((attempts) =>\n attempts.pipe(\n mergeMap((error, i) => {\n const retryAttempt = i + 1;\n // Code 1006 is used to indicate that a connection was closed abnormally.\n // Added hard limit of 30 on number of retries.\n // If connection was closed abnormally, and we wish to retry, otherwise throw error.\n if (error.code === 1006 && retryAttempt < 30) {\n if (retryAttempt > 10) {\n // If more than 10 times retried, consol.warn, but keep reconnecting\n console.warn(\n `Websocket connection is being disrupted. We keep reconnecting but consider starting new live tailing again. Error: ${error.reason}`\n );\n }\n // Retry every 5s\n return timer(retryInterval);\n }\n return throwError(error);\n })\n )\n ),\n finalize(() => {\n delete this.streams[target.url];\n })\n );\n this.streams[target.url] = stream;\n\n return stream;\n }\n}\n","import { css } from '@emotion/css';\nimport { useRef, useCallback, useEffect, useMemo, useState } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { dateTime, GrafanaTheme2, LogRowModel, renderMarkdown, SelectableValue } from '@grafana/data';\nimport { RawQuery } from '@grafana/plugin-ui';\nimport { reportInteraction } from '@grafana/runtime';\nimport {\n Alert,\n Button,\n Collapse,\n Icon,\n InlineField,\n InlineFieldRow,\n InlineSwitch,\n Label,\n MultiSelect,\n RenderUserContentAsHTML,\n Spinner,\n Tooltip,\n useStyles2,\n} from '@grafana/ui';\n\nimport {\n LogContextProvider,\n LOKI_LOG_CONTEXT_PRESERVED_LABELS,\n PreservedLabels,\n SHOULD_INCLUDE_PIPELINE_OPERATIONS,\n} from '../LogContextProvider';\nimport { escapeLabelValueInSelector } from '../languageUtils';\nimport { lokiGrammar } from '../syntax';\nimport { ContextFilter, LokiQuery } from '../types';\n\nexport interface LokiContextUiProps {\n logContextProvider: LogContextProvider;\n row: LogRowModel;\n updateFilter: (value: ContextFilter[]) => void;\n onClose: () => void;\n origQuery?: LokiQuery;\n runContextQuery?: () => void;\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n labels: css({\n display: 'flex',\n gap: theme.spacing(0.5),\n }),\n wrapper: css({\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n gap: theme.spacing(0.5),\n position: 'relative',\n }),\n textWrapper: css({\n display: 'flex',\n alignItems: 'center',\n }),\n hidden: css({\n visibility: 'hidden',\n }),\n label: css({\n maxWidth: '100%',\n '&:first-of-type': {\n marginBottom: theme.spacing(2),\n },\n '&:not(:first-of-type)': {\n margin: theme.spacing(2, 0),\n },\n }),\n rawQueryContainer: css({\n textAlign: 'start',\n lineBreak: 'anywhere',\n marginTop: theme.spacing(-0.25),\n marginRight: theme.spacing(6),\n minHeight: theme.spacing(4),\n }),\n ui: css({\n backgroundColor: theme.colors.background.secondary,\n padding: theme.spacing(2),\n }),\n notification: css({\n position: 'absolute',\n zIndex: theme.zIndex.portal,\n top: 0,\n right: 0,\n }),\n rawQuery: css({\n display: 'inline',\n }),\n queryDescription: css({\n marginLeft: theme.spacing(0.5),\n }),\n iconButton: css({\n position: 'absolute',\n top: theme.spacing(1),\n right: theme.spacing(1),\n zIndex: theme.zIndex.navbarFixed,\n }),\n operationsToggle: css({\n margin: theme.spacing(1, 0, -1, 0),\n '& > div': {\n margin: 0,\n '& > label': {\n padding: 0,\n },\n },\n }),\n };\n}\n\nexport const IS_LOKI_LOG_CONTEXT_UI_OPEN = 'isLogContextQueryUiOpen';\n\nexport function LokiContextUi(props: LokiContextUiProps) {\n const { row, logContextProvider, updateFilter, onClose, origQuery, runContextQuery } = props;\n const styles = useStyles2(getStyles);\n\n const [contextFilters, setContextFilters] = useState<ContextFilter[]>([]);\n const [showPreservedFiltersAppliedNotification, setShowPreservedFiltersAppliedNotification] = useState(false);\n\n const [initialized, setInitialized] = useState(false);\n const [loading, setLoading] = useState(false);\n const [isOpen, setIsOpen] = useState(window.localStorage.getItem(IS_LOKI_LOG_CONTEXT_UI_OPEN) === 'true');\n const [includePipelineOperations, setIncludePipelineOperations] = useState(\n window.localStorage.getItem(SHOULD_INCLUDE_PIPELINE_OPERATIONS) === 'true'\n );\n\n const timerHandle = useRef<number>();\n const previousInitialized = useRef<boolean>(false);\n const previousContextFilters = useRef<ContextFilter[]>([]);\n\n const isInitialState = useMemo(() => {\n // Initial query has all regular labels enabled and all parsed labels disabled\n if (initialized && contextFilters.some((filter) => filter.nonIndexed === filter.enabled)) {\n return false;\n }\n\n // if we include pipeline operations, we also want to enable the revert button\n if (includePipelineOperations && logContextProvider.queryContainsValidPipelineStages(origQuery)) {\n return false;\n }\n\n return true;\n }, [contextFilters, includePipelineOperations, initialized, logContextProvider, origQuery]);\n\n useEffect(() => {\n if (!initialized) {\n return;\n }\n\n // don't trigger if we initialized, this will be the same query anyways.\n if (!previousInitialized.current) {\n previousInitialized.current = initialized;\n return;\n }\n\n if (contextFilters.filter(({ enabled, nonIndexed }) => enabled && !nonIndexed).length === 0) {\n setContextFilters(previousContextFilters.current);\n return;\n }\n\n previousContextFilters.current = structuredClone(contextFilters);\n\n if (timerHandle.current) {\n clearTimeout(timerHandle.current);\n }\n setLoading(true);\n timerHandle.current = window.setTimeout(() => {\n updateFilter(contextFilters.filter(({ enabled }) => enabled));\n // We are storing the removed labels and selected extracted labels in local storage so we can\n // preselect the labels in the UI in the next log context view.\n const preservedLabels: PreservedLabels = {\n removedLabels: [],\n selectedExtractedLabels: [],\n };\n\n contextFilters.forEach(({ enabled, nonIndexed, label }) => {\n // We only want to store real labels that were removed from the initial query\n if (!enabled && !nonIndexed) {\n preservedLabels.removedLabels.push(label);\n }\n // Or extracted labels that were added to the initial query\n if (enabled && nonIndexed) {\n preservedLabels.selectedExtractedLabels.push(label);\n }\n });\n\n window.localStorage.setItem(LOKI_LOG_CONTEXT_PRESERVED_LABELS, JSON.stringify(preservedLabels));\n setLoading(false);\n }, 1500);\n\n return () => {\n clearTimeout(timerHandle.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [contextFilters, initialized]);\n\n useEffect(() => {\n return () => {\n clearTimeout(timerHandle.current);\n onClose();\n };\n }, [onClose]);\n\n useAsync(async () => {\n setLoading(true);\n const initContextFilters = await logContextProvider.getInitContextFilters(row, origQuery, {\n from: dateTime(row.timeEpochMs),\n to: dateTime(row.timeEpochMs),\n raw: { from: dateTime(row.timeEpochMs), to: dateTime(row.timeEpochMs) },\n });\n setContextFilters(initContextFilters.contextFilters);\n setShowPreservedFiltersAppliedNotification(initContextFilters.preservedFiltersApplied);\n setInitialized(true);\n setLoading(false);\n });\n\n // To hide previousContextFiltersApplied notification after 2 seconds\n useEffect(() => {\n if (showPreservedFiltersAppliedNotification) {\n setTimeout(() => {\n setShowPreservedFiltersAppliedNotification(false);\n }, 2000);\n }\n }, [showPreservedFiltersAppliedNotification]);\n\n useEffect(() => {\n reportInteraction('grafana_explore_logs_loki_log_context_loaded', {\n logRowUid: row.uid,\n type: 'load',\n });\n\n return () => {\n reportInteraction('grafana_explore_logs_loki_log_context_loaded', {\n logRowUid: row.uid,\n type: 'unload',\n });\n };\n }, [row.uid]);\n\n const realLabels = contextFilters.filter(({ nonIndexed }) => !nonIndexed);\n const realLabelsEnabled = realLabels.filter(({ enabled }) => enabled);\n\n const parsedLabels = contextFilters.filter(({ nonIndexed }) => nonIndexed);\n const parsedLabelsEnabled = parsedLabels.filter(({ enabled }) => enabled);\n\n const contextFilterToSelectFilter = useCallback((contextFilter: ContextFilter): SelectableValue<string> => {\n return {\n label: `${contextFilter.label}=\"${escapeLabelValueInSelector(contextFilter.value)}\"`,\n value: contextFilter.label,\n };\n }, []);\n\n // If there's any nonIndexed labels, that includes structured metadata and parsed labels, we show the nonIndexed labels input\n const showNonIndexedLabels = parsedLabels.length > 0;\n\n let queryExpr = logContextProvider.prepareExpression(\n contextFilters.filter(({ enabled }) => enabled),\n origQuery\n );\n return (\n <div className={styles.wrapper}>\n {showPreservedFiltersAppliedNotification && (\n <Alert\n className={styles.notification}\n title=\"Previously used filters have been applied.\"\n severity=\"info\"\n elevated={true}\n ></Alert>\n )}\n <div className={styles.iconButton}>\n <Button\n tooltip=\"Revert to initial log context query\"\n data-testid=\"revert-button\"\n icon=\"history-alt\"\n variant=\"secondary\"\n disabled={isInitialState}\n onClick={(e) => {\n reportInteraction('grafana_explore_logs_loki_log_context_reverted', {\n logRowUid: row.uid,\n });\n setContextFilters((contextFilters) => {\n return contextFilters.map((contextFilter) => ({\n ...contextFilter,\n // For revert to initial query we need to enable all labels and disable all parsed labels\n enabled: !contextFilter.nonIndexed,\n }));\n });\n // We are removing the preserved labels from local storage so we can preselect the labels in the UI\n window.localStorage.removeItem(LOKI_LOG_CONTEXT_PRESERVED_LABELS);\n window.localStorage.removeItem(SHOULD_INCLUDE_PIPELINE_OPERATIONS);\n setIncludePipelineOperations(false);\n }}\n />\n </div>\n\n <Collapse\n isOpen={isOpen}\n onToggle={() => {\n window.localStorage.setItem(IS_LOKI_LOG_CONTEXT_UI_OPEN, (!isOpen).toString());\n setIsOpen((isOpen) => !isOpen);\n reportInteraction('grafana_explore_logs_loki_log_context_toggled', {\n logRowUid: row.uid,\n action: !isOpen ? 'open' : 'close',\n });\n }}\n label={\n <div className={styles.rawQueryContainer}>\n {initialized ? (\n <>\n <RawQuery\n language={{ grammar: lokiGrammar, name: 'loki' }}\n query={queryExpr}\n className={styles.rawQuery}\n />\n <Tooltip content=\"The initial log context query is created from all labels defining the stream for the selected log line. Use the editor below to customize the log context query.\">\n <Icon name=\"info-circle\" size=\"sm\" className={styles.queryDescription} />\n </Tooltip>\n </>\n ) : (\n <Spinner />\n )}\n </div>\n }\n >\n <div className={styles.ui}>\n <Label\n className={styles.label}\n description=\"The initial log context query is created from all labels defining the stream for the selected log line. You can broaden your search by removing one or more of the label filters.\"\n >\n Widen the search\n </Label>\n <MultiSelect\n isLoading={loading}\n options={realLabels.map(contextFilterToSelectFilter)}\n value={realLabelsEnabled.map(contextFilterToSelectFilter)}\n closeMenuOnSelect={true}\n maxMenuHeight={200}\n noOptionsMessage=\"No further labels available\"\n onChange={(keys, actionMeta) => {\n if (actionMeta.action === 'select-option') {\n reportInteraction('grafana_explore_logs_loki_log_context_filtered', {\n logRowUid: row.uid,\n type: 'label',\n action: 'select',\n });\n }\n if (actionMeta.action === 'remove-value') {\n reportInteraction('grafana_explore_logs_loki_log_context_filtered', {\n logRowUid: row.uid,\n type: 'label',\n action: 'remove',\n });\n }\n return setContextFilters(\n contextFilters.map((filter) => {\n if (filter.nonIndexed) {\n return filter;\n }\n filter.enabled = keys.some((key) => key.value === filter.label);\n return filter;\n })\n );\n }}\n />\n {showNonIndexedLabels && (\n <>\n <Label\n className={styles.label}\n description={`By using a parser in your original query, you can use filters for extracted labels. Refine your search by applying extracted labels created from the selected log line.`}\n >\n Refine the search\n </Label>\n <MultiSelect\n isLoading={loading}\n options={parsedLabels.map(contextFilterToSelectFilter)}\n value={parsedLabelsEnabled.map(contextFilterToSelectFilter)}\n closeMenuOnSelect={true}\n maxMenuHeight={200}\n noOptionsMessage=\"No further labels available\"\n isClearable={true}\n onChange={(keys, actionMeta) => {\n if (actionMeta.action === 'select-option') {\n reportInteraction('grafana_explore_logs_loki_log_context_filtered', {\n logRowUid: row.uid,\n type: 'parsed_label',\n action: 'select',\n });\n }\n if (actionMeta.action === 'remove-value') {\n reportInteraction('grafana_explore_logs_loki_log_context_filtered', {\n logRowUid: row.uid,\n type: 'parsed_label',\n action: 'remove',\n });\n }\n setContextFilters(\n contextFilters.map((filter) => {\n if (!filter.nonIndexed) {\n return filter;\n }\n filter.enabled = keys.some((key) => key.value === filter.label);\n return filter;\n })\n );\n }}\n />\n </>\n )}\n {logContextProvider.queryContainsValidPipelineStages(origQuery) && (\n <InlineFieldRow className={styles.operationsToggle}>\n <InlineField\n label=\"Include LogQL pipeline operations\"\n tooltip={\n <RenderUserContentAsHTML\n content={renderMarkdown(\n \"This will include LogQL operations such as `line_format` or `label_format`. It won't include line or label filter operations.\"\n )}\n />\n }\n >\n <InlineSwitch\n value={includePipelineOperations}\n showLabel={true}\n transparent={true}\n onChange={(e) => {\n reportInteraction('grafana_explore_logs_loki_log_context_pipeline_toggled', {\n logRowUid: row.uid,\n action: e.currentTarget.checked ? 'enable' : 'disable',\n });\n window.localStorage.setItem(SHOULD_INCLUDE_PIPELINE_OPERATIONS, e.currentTarget.checked.toString());\n setIncludePipelineOperations(e.currentTarget.checked);\n if (runContextQuery) {\n runContextQuery();\n }\n }}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n </div>\n </Collapse>\n </div>\n );\n}\n","import { DataFrame, Field, FieldType } from '@grafana/data';\n\nexport enum SortDirection {\n Ascending,\n Descending,\n}\n\n// creates the `index` for the sorting.\n// this is needed by the `SortedVector`.\n// the index is an array of numbers, and it defines an order.\n// at every slot in the index the values is the position of\n// the sorted item.\n// for example, an index of [3,1,2] means that\n// in the dataframe, that has 3 rows, after sorting:\n// - the third row will become the first\n// - the first row will become the second\n// - the second row will become the third\nfunction makeIndex(field: Field<number>, dir: SortDirection): number[] {\n const fieldValues: number[] = field.values;\n const { nanos } = field;\n\n // we first build an array which is [0,1,2,3....]\n const index = Array(fieldValues.length);\n for (let i = 0; i < index.length; i++) {\n index[i] = i;\n }\n\n const isAsc = dir === SortDirection.Ascending;\n\n index.sort((a: number, b: number): number => {\n // we need to answer this question:\n // in the field-used-for-sorting, how would we compare value-at-index-a to value-at-index-b?\n const valA = fieldValues[a];\n const valB = fieldValues[b];\n if (valA < valB) {\n return isAsc ? -1 : 1;\n }\n\n if (valA > valB) {\n return isAsc ? 1 : -1;\n }\n\n // the millisecond timestamps are equal,\n // compare the nanosecond part, if available\n\n if (nanos === undefined) {\n return 0;\n }\n\n const nanoA = nanos[a];\n const nanoB = nanos[b];\n\n if (nanoA < nanoB) {\n return isAsc ? -1 : 1;\n }\n\n if (nanoA > nanoB) {\n return isAsc ? 1 : -1;\n }\n\n return 0;\n });\n\n return index;\n}\n\n// sort a dataframe that is in the Loki dataframe format ascending or desceding based on time,\n// with nanosecond precision.\nexport function sortDataFrameByTime(frame: DataFrame, dir: SortDirection): DataFrame {\n const { fields, ...rest } = frame;\n\n // we use the approach used in @grafana/data/sortDataframe.\n // we cannot use it directly, because it does not take `.nanos` into account\n // (see https://github.com/grafana/grafana/issues/72351).\n // we can switch to to @grafana/data/sortDataframe when the issue is fixed.\n\n const timeField = fields.find((field) => field.type === FieldType.time);\n if (timeField === undefined) {\n throw new Error('missing timestamp field. should never happen');\n }\n\n const index = makeIndex(timeField, dir);\n\n return {\n ...rest,\n fields: fields.map((field) => ({\n ...field,\n values: sorted(field.values, index),\n nanos: field.nanos === undefined ? undefined : sorted(field.nanos, index),\n })),\n };\n}\n\nfunction sorted<T>(vals: T[], index: number[]): T[] {\n return vals.map((_, idx) => vals[index[idx]]);\n}\n","import { isEmpty } from 'lodash';\nimport { catchError, lastValueFrom, of, switchMap } from 'rxjs';\n\nimport {\n CoreApp,\n DataFrame,\n DataQueryError,\n DataQueryResponse,\n FieldCache,\n FieldType,\n LogRowModel,\n TimeRange,\n toUtc,\n LogRowContextQueryDirection,\n LogRowContextOptions,\n dateTime,\n ScopedVars,\n} from '@grafana/data';\nimport { LabelParser, LabelFilter, LineFilters, PipelineStage, Logfmt, Json } from '@grafana/lezer-logql';\n\nimport { LokiContextUi } from './components/LokiContextUi';\nimport { LokiDatasource, makeRequest, REF_ID_STARTER_LOG_ROW_CONTEXT } from './datasource';\nimport { escapeLabelValueInExactSelector, getLabelTypeFromFrame } from './languageUtils';\nimport { addLabelToQuery, addParserToQuery } from './modifyQuery';\nimport {\n getNodePositionsFromQuery,\n getParserFromQuery,\n getStreamSelectorsFromQuery,\n isQueryWithParser,\n} from './queryUtils';\nimport { sortDataFrameByTime, SortDirection } from './sortDataFrame';\nimport { ContextFilter, LabelType, LokiQuery, LokiQueryDirection, LokiQueryType } from './types';\n\nexport const LOKI_LOG_CONTEXT_PRESERVED_LABELS = 'lokiLogContextPreservedLabels';\nexport const SHOULD_INCLUDE_PIPELINE_OPERATIONS = 'lokiLogContextShouldIncludePipelineOperations';\n\nexport type PreservedLabels = {\n removedLabels: string[];\n selectedExtractedLabels: string[];\n};\n\nexport class LogContextProvider {\n datasource: LokiDatasource;\n cachedContextFilters: ContextFilter[];\n onContextClose: (() => void) | undefined;\n\n constructor(datasource: LokiDatasource) {\n this.datasource = datasource;\n this.cachedContextFilters = [];\n }\n\n private async getQueryAndRange(\n row: LogRowModel,\n options?: LogRowContextOptions,\n origQuery?: LokiQuery,\n cacheFilters = true\n ) {\n const direction = (options && options.direction) || LogRowContextQueryDirection.Backward;\n const limit = (options && options.limit) || this.datasource.maxLines;\n // If the user doesn't have any filters applied already, or if we don't want\n // to use the cached filters, we need to reinitialize them.\n if (this.cachedContextFilters.length === 0 || !cacheFilters) {\n const filters = (\n await this.getInitContextFilters(row, origQuery, {\n from: dateTime(row.timeEpochMs),\n to: dateTime(row.timeEpochMs),\n raw: { from: dateTime(row.timeEpochMs), to: dateTime(row.timeEpochMs) },\n })\n ).contextFilters.filter((filter) => filter.enabled);\n\n this.cachedContextFilters = filters;\n }\n\n return await this.prepareLogRowContextQueryTarget(row, limit, direction, origQuery, options?.timeWindowMs);\n }\n\n getLogRowContextQuery = async (\n row: LogRowModel,\n options?: LogRowContextOptions,\n origQuery?: LokiQuery,\n cacheFilters = true\n ): Promise<LokiQuery> => {\n if (origQuery && options?.scopedVars) {\n origQuery = this.datasource.applyTemplateVariables(origQuery, options?.scopedVars);\n }\n const { query } = await this.getQueryAndRange(row, options, origQuery, cacheFilters);\n\n if (!cacheFilters) {\n // If the caller doesn't want to cache the filters, we need to reset them.\n this.cachedContextFilters = [];\n }\n\n return query;\n };\n\n getLogRowContext = async (\n row: LogRowModel,\n options?: LogRowContextOptions,\n origQuery?: LokiQuery\n ): Promise<{ data: DataFrame[] }> => {\n if (origQuery && options?.scopedVars) {\n origQuery = this.datasource.applyTemplateVariables(origQuery, options?.scopedVars);\n }\n const direction = (options && options.direction) || LogRowContextQueryDirection.Backward;\n const { query, range } = await this.getQueryAndRange(row, options, origQuery);\n\n const processResults = (result: DataQueryResponse): DataQueryResponse => {\n const frames: DataFrame[] = result.data;\n const processedFrames = frames.map((frame) => sortDataFrameByTime(frame, SortDirection.Descending));\n\n return {\n ...result,\n data: processedFrames,\n };\n };\n\n // this can only be called from explore currently\n const app = CoreApp.Explore;\n\n return lastValueFrom(\n this.datasource.query(makeRequest(query, range, app, `${REF_ID_STARTER_LOG_ROW_CONTEXT}${direction}`)).pipe(\n catchError((err) => {\n const error: DataQueryError = {\n message: 'Error during context query. Please check JS console logs.',\n status: err.status,\n statusText: err.statusText,\n };\n throw error;\n }),\n switchMap((res) => of(processResults(res)))\n )\n );\n };\n\n async prepareLogRowContextQueryTarget(\n row: LogRowModel,\n limit: number,\n direction: LogRowContextQueryDirection,\n origQuery?: LokiQuery,\n timeWindowMs = 2 * 60 * 60 * 1000\n ): Promise<{ query: LokiQuery; range: TimeRange }> {\n const expr = this.prepareExpression(this.cachedContextFilters, origQuery);\n\n const queryDirection =\n direction === LogRowContextQueryDirection.Forward ? LokiQueryDirection.Forward : LokiQueryDirection.Backward;\n\n const query: LokiQuery = {\n expr,\n queryType: LokiQueryType.Range,\n // refId has to be:\n // - always different (temporarily, will be fixed later)\n // - not increase in size\n // because it may be called many times from logs-context\n refId: `${REF_ID_STARTER_LOG_ROW_CONTEXT}_${Math.random().toString()}`,\n maxLines: limit,\n direction: queryDirection,\n datasource: { uid: this.datasource.uid, type: this.datasource.type },\n };\n\n const fieldCache = new FieldCache(row.dataFrame);\n const tsField = fieldCache.getFirstFieldOfType(FieldType.time);\n if (tsField === undefined) {\n throw new Error('loki: data frame missing time-field, should never happen');\n }\n const tsValue = tsField.values[row.rowIndex];\n const timestamp = toUtc(tsValue);\n\n const range =\n queryDirection === LokiQueryDirection.Forward\n ? {\n // start param in Loki API is inclusive so we'll have to filter out the row that this request is based from\n // and any other that were logged in the same ns but before the row. Right now these rows will be lost\n // because the are before but came it he response that should return only rows after.\n from: timestamp,\n // convert to ns, we lose some precision here but it is not that important at the far points of the context\n to: toUtc(row.timeEpochMs + timeWindowMs),\n }\n : {\n // convert to ns, we lose some precision here but it is not that important at the far points of the context\n from: toUtc(row.timeEpochMs - timeWindowMs),\n to: timestamp,\n };\n\n return {\n query,\n range: {\n from: range.from,\n to: range.to,\n raw: range,\n },\n };\n }\n\n getLogRowContextUi(\n row: LogRowModel,\n runContextQuery?: () => void,\n origQuery?: LokiQuery,\n scopedVars?: ScopedVars\n ): React.ReactNode {\n if (origQuery && scopedVars) {\n origQuery = this.datasource.applyTemplateVariables(origQuery, scopedVars);\n }\n const updateFilter = (contextFilters: ContextFilter[]) => {\n this.cachedContextFilters = contextFilters;\n\n if (runContextQuery) {\n runContextQuery();\n }\n };\n\n // we need to cache this function so that it doesn't get recreated on every render\n this.onContextClose =\n this.onContextClose ??\n (() => {\n this.cachedContextFilters = [];\n });\n\n return LokiContextUi({\n row,\n origQuery,\n updateFilter,\n onClose: this.onContextClose,\n logContextProvider: this,\n runContextQuery,\n });\n }\n\n prepareExpression(contextFilters: ContextFilter[], query: LokiQuery | undefined): string {\n let preparedExpression = this.processContextFiltersToExpr(contextFilters, query);\n if (window.localStorage.getItem(SHOULD_INCLUDE_PIPELINE_OPERATIONS) === 'true') {\n preparedExpression = this.processPipelineStagesToExpr(preparedExpression, query);\n }\n return preparedExpression;\n }\n\n processContextFiltersToExpr = (contextFilters: ContextFilter[], query: LokiQuery | undefined): string => {\n const labelFilters = contextFilters\n .map((filter) => {\n if (!filter.nonIndexed && filter.enabled) {\n // escape backslashes in label as users can't escape them by themselves\n return `${filter.label}=\"${escapeLabelValueInExactSelector(filter.value)}\"`;\n }\n return '';\n })\n // Filter empty strings\n .filter((label) => !!label)\n .join(',');\n\n let expr = `{${labelFilters}}`;\n\n // We need to have original query to get parser and include parsed labels\n // We only add parser and parsed labels if there is only one parser in query\n if (query) {\n let hasParser = false;\n if (isQueryWithParser(query.expr).parserCount === 1) {\n hasParser = true;\n const parser = getParserFromQuery(query.expr);\n if (parser) {\n expr = addParserToQuery(expr, parser);\n }\n }\n\n const nonIndexedLabels = contextFilters.filter((filter) => filter.nonIndexed && filter.enabled);\n for (const parsedLabel of nonIndexedLabels) {\n if (parsedLabel.enabled) {\n expr = addLabelToQuery(\n expr,\n parsedLabel.label,\n '=',\n parsedLabel.value,\n hasParser ? LabelType.Parsed : LabelType.StructuredMetadata\n );\n }\n }\n }\n\n return expr;\n };\n\n processPipelineStagesToExpr = (currentExpr: string, query: LokiQuery | undefined): string => {\n let newExpr = currentExpr;\n const origExpr = query?.expr ?? '';\n\n if (isQueryWithParser(origExpr).parserCount > 1) {\n return newExpr;\n }\n\n const allNodePositions = getNodePositionsFromQuery(origExpr, [\n PipelineStage,\n LabelParser,\n Logfmt,\n Json,\n LineFilters,\n LabelFilter,\n ]);\n const pipelineStagePositions = allNodePositions.filter((position) => position.type?.id === PipelineStage);\n const otherNodePositions = allNodePositions.filter((position) => position.type?.id !== PipelineStage);\n\n for (const pipelineStagePosition of pipelineStagePositions) {\n // we don't process pipeline stages that contain label parsers, line filters or label filters\n if (otherNodePositions.some((position) => pipelineStagePosition.contains(position))) {\n continue;\n }\n\n newExpr += ` ${pipelineStagePosition.getExpression(origExpr)}`;\n }\n\n return newExpr;\n };\n\n queryContainsValidPipelineStages = (query: LokiQuery | undefined): boolean => {\n const origExpr = query?.expr ?? '';\n const allNodePositions = getNodePositionsFromQuery(origExpr, [\n PipelineStage,\n LabelParser,\n LineFilters,\n LabelFilter,\n ]);\n const pipelineStagePositions = allNodePositions.filter((position) => position.type?.id === PipelineStage);\n const otherNodePositions = allNodePositions.filter((position) => position.type?.id !== PipelineStage);\n\n return pipelineStagePositions.some((pipelineStagePosition) =>\n otherNodePositions.every((position) => pipelineStagePosition.contains(position) === false)\n );\n };\n\n getInitContextFilters = async (\n row: LogRowModel,\n query?: LokiQuery,\n timeRange?: TimeRange\n ): Promise<{ contextFilters: ContextFilter[]; preservedFiltersApplied: boolean }> => {\n let preservedFiltersApplied = false;\n if (!query || isEmpty(row.labels)) {\n return { contextFilters: [], preservedFiltersApplied };\n }\n const rowLabels = row.labels;\n\n // 1. First we need to get all labels from the log row's label\n // and correctly set parsed and not parsed labels\n let allLabels: string[] = [];\n if (!isQueryWithParser(query.expr).queryWithParser) {\n // If there is no parser, we use getLabelKeys because it has better caching\n // and all labels should already be fetched\n await this.datasource.languageProvider.start(timeRange);\n allLabels = this.datasource.languageProvider.getLabelKeys();\n } else {\n // If we have parser, we use fetchLabels to fetch actual labels for selected stream\n const stream = getStreamSelectorsFromQuery(query.expr);\n // We are using stream[0] as log query can always have just 1 stream selector\n allLabels = await this.datasource.languageProvider.fetchLabels({ streamSelector: stream[0], timeRange });\n }\n\n const contextFilters: ContextFilter[] = [];\n Object.entries(rowLabels).forEach(([label, value]) => {\n const labelType = getLabelTypeFromFrame(label, row.dataFrame, row.rowIndex);\n const filter: ContextFilter = {\n label,\n value: value,\n enabled: allLabels.includes(label),\n nonIndexed: labelType !== null && labelType !== LabelType.Indexed,\n };\n\n contextFilters.push(filter);\n });\n\n // Secondly we check for preserved labels and update enabled state of filters based on that\n let preservedLabels: undefined | PreservedLabels = undefined;\n const preservedLabelsString = window.localStorage.getItem(LOKI_LOG_CONTEXT_PRESERVED_LABELS);\n if (preservedLabelsString) {\n try {\n preservedLabels = JSON.parse(preservedLabelsString);\n // Do nothing when error occurs\n } catch (e) {}\n }\n\n if (!preservedLabels) {\n // If we don't have preservedLabels, we return contextFilters as they are\n return { contextFilters, preservedFiltersApplied };\n } else {\n // Otherwise, we need to update filters based on preserved labels\n let arePreservedLabelsUsed = false;\n const newContextFilters = contextFilters.map((contextFilter) => {\n // We checked for undefined above\n if (preservedLabels!.removedLabels.includes(contextFilter.label)) {\n arePreservedLabelsUsed = true;\n return { ...contextFilter, enabled: false };\n }\n // We checked for undefined above\n if (preservedLabels!.selectedExtractedLabels.includes(contextFilter.label)) {\n arePreservedLabelsUsed = true;\n return { ...contextFilter, enabled: true };\n }\n return { ...contextFilter };\n });\n\n const isAtLeastOneRealLabelEnabled = newContextFilters.some(({ enabled, nonIndexed }) => enabled && !nonIndexed);\n if (!isAtLeastOneRealLabelEnabled) {\n // If we end up with no real labels enabled, we need to reset the init filters\n return { contextFilters, preservedFiltersApplied };\n } else {\n if (arePreservedLabelsUsed) {\n preservedFiltersApplied = true;\n }\n return { contextFilters: newContextFilters, preservedFiltersApplied };\n }\n }\n };\n}\n","import { LokiVariableQuery, LokiVariableQueryType } from '../types';\n\nexport const labelNamesRegex = /^label_names\\(\\)\\s*$/;\nexport const labelValuesRegex = /^label_values\\((?:(.+),\\s*)?([a-zA-Z_$][a-zA-Z0-9_]*)\\)\\s*$/;\n\nexport function migrateVariableQuery(rawQuery: string | LokiVariableQuery): LokiVariableQuery {\n // If not string, we assume LokiVariableQuery\n if (typeof rawQuery !== 'string') {\n return rawQuery;\n }\n\n const queryBase = {\n refId: 'LokiVariableQueryEditor-VariableQuery',\n type: LokiVariableQueryType.LabelNames,\n };\n\n const labelNames = rawQuery.match(labelNamesRegex);\n if (labelNames) {\n return {\n ...queryBase,\n type: LokiVariableQueryType.LabelNames,\n };\n }\n\n const labelValues = rawQuery.match(labelValuesRegex);\n if (labelValues) {\n return {\n ...queryBase,\n type: LokiVariableQueryType.LabelValues,\n label: labelValues[2] ? labelValues[2] : labelValues[1],\n stream: labelValues[2] ? labelValues[1] : undefined,\n };\n }\n\n return queryBase;\n}\n","import { FormEvent, useState, useEffect } from 'react';\nimport { usePrevious } from 'react-use';\n\nimport { QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { InlineField, InlineFieldRow, Input, Select } from '@grafana/ui';\n\nimport { LokiDatasource } from '../datasource';\nimport { migrateVariableQuery } from '../migrations/variableQueryMigrations';\nimport { LokiOptions, LokiQuery, LokiVariableQuery, LokiVariableQueryType as QueryType } from '../types';\n\nconst variableOptions = [\n { label: 'Label names', value: QueryType.LabelNames },\n { label: 'Label values', value: QueryType.LabelValues },\n];\n\nexport type Props = QueryEditorProps<LokiDatasource, LokiQuery, LokiOptions, LokiVariableQuery>;\n\nconst refId = 'LokiVariableQueryEditor-VariableQuery';\n\nexport const LokiVariableQueryEditor = ({ onChange, query, datasource, range }: Props) => {\n const [type, setType] = useState<number | undefined>(undefined);\n const [label, setLabel] = useState('');\n const [labelOptions, setLabelOptions] = useState<Array<SelectableValue<string>>>([]);\n const [stream, setStream] = useState('');\n const previousType = usePrevious(type);\n\n useEffect(() => {\n if (!query) {\n return;\n }\n\n const variableQuery = typeof query === 'string' ? migrateVariableQuery(query) : query;\n setType(variableQuery.type);\n setLabel(variableQuery.label || '');\n setStream(variableQuery.stream || '');\n }, [query]);\n\n useEffect(() => {\n // Fetch label names when the query type is LabelValues, and the previous type was not the same\n if (type !== QueryType.LabelValues || previousType === type) {\n return;\n }\n\n datasource.languageProvider.fetchLabels({ timeRange: range }).then((labelNames) => {\n setLabelOptions(labelNames.map((labelName) => ({ label: labelName, value: labelName })));\n });\n }, [datasource, type, range, previousType]);\n\n const onQueryTypeChange = (newType: SelectableValue<QueryType>) => {\n setType(newType.value);\n if (newType.value !== undefined) {\n onChange({\n type: newType.value,\n label,\n stream,\n refId,\n });\n }\n };\n\n const onLabelChange = (newLabel: SelectableValue<string>) => {\n setLabel(newLabel.value || '');\n };\n\n const onStreamChange = (e: FormEvent<HTMLInputElement>) => {\n setStream(e.currentTarget.value);\n };\n\n const handleBlur = () => {\n if (type !== undefined) {\n onChange({ type, label, stream, refId: 'LokiVariableQueryEditor-VariableQuery' });\n }\n };\n\n return (\n <>\n <InlineFieldRow>\n <InlineField label=\"Query type\" labelWidth={20}>\n <Select\n aria-label=\"Query type\"\n onChange={onQueryTypeChange}\n onBlur={handleBlur}\n value={type}\n options={variableOptions}\n width={16}\n />\n </InlineField>\n {type === QueryType.LabelValues && (\n <>\n <InlineField label=\"Label\" labelWidth={20}>\n <Select\n aria-label=\"Label\"\n onChange={onLabelChange}\n onBlur={handleBlur}\n value={{ label: label, value: label }}\n options={labelOptions}\n width={16}\n allowCustomValue\n />\n </InlineField>\n </>\n )}\n </InlineFieldRow>\n {type === QueryType.LabelValues && (\n <InlineFieldRow>\n <InlineField\n label=\"Stream selector\"\n labelWidth={20}\n grow={true}\n tooltip={\n <div>\n {\n 'Optional. If defined, a list of values for the specified log stream selector is returned. For example: {label=\"value\"} or {label=\"$variable\"}'\n }\n </div>\n }\n >\n <Input\n type=\"text\"\n aria-label=\"Stream selector\"\n placeholder=\"Optional stream selector\"\n value={stream}\n onChange={onStreamChange}\n onBlur={handleBlur}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n </>\n );\n};\n","import { from, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { CustomVariableSupport, DataQueryRequest, MetricFindValue, ScopedVars, TimeRange } from '@grafana/data';\n\nimport { LokiVariableQueryEditor } from './components/VariableQueryEditor';\nimport { LokiDatasource } from './datasource';\nimport { LokiVariableQuery } from './types';\n\nexport class LokiVariableSupport extends CustomVariableSupport<LokiDatasource, LokiVariableQuery> {\n editor = LokiVariableQueryEditor;\n\n constructor(private datasource: LokiDatasource) {\n super();\n }\n\n async execute(query: LokiVariableQuery, scopedVars: ScopedVars, range: TimeRange) {\n return this.datasource.metricFindQuery(query, { scopedVars, range });\n }\n\n query(request: DataQueryRequest<LokiVariableQuery>): Observable<{ data: MetricFindValue[] }> {\n const result = this.execute(request.targets[0], request.scopedVars, request.range);\n\n return from(result).pipe(map((data) => ({ data })));\n }\n}\n","import { groupBy } from 'lodash';\n\nimport { FieldType, DataFrame, DataLink, Field } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\nimport { DerivedFieldConfig } from './types';\n\nexport function getDerivedFields(dataFrame: DataFrame, derivedFieldConfigs: DerivedFieldConfig[]): Field[] {\n if (!derivedFieldConfigs.length) {\n return [];\n }\n const derivedFieldsGrouped = groupBy(derivedFieldConfigs, 'name');\n\n const newFields = Object.values(derivedFieldsGrouped).map(fieldFromDerivedFieldConfig);\n\n // line-field is the first string-field\n // NOTE: we should create some common log-frame-extra-string-field code somewhere\n const lineField = dataFrame.fields.find((f) => f.type === FieldType.string);\n\n if (lineField === undefined) {\n // if this is happening, something went wrong, let's raise an error\n throw new Error('invalid logs-dataframe, string-field missing');\n }\n\n const labelFields = dataFrame.fields.find((f) => f.type === FieldType.other && f.name === 'labels');\n\n for (let i = 0; i < lineField.values.length; i++) {\n for (const field of newFields) {\n // `matcherRegex` can be either a RegExp that is used to extract the value from the log line, or it can be a label key to derive the field from the labels\n if (derivedFieldsGrouped[field.name][0].matcherType === 'label' && labelFields) {\n const label = labelFields.values[i];\n if (label) {\n // Find the key that matches the regex pattern in `matcherRegex`\n const intersectingKey = Object.keys(label).find((key) => {\n const regex = new RegExp(derivedFieldsGrouped[field.name][0].matcherRegex);\n return regex.test(key);\n });\n\n if (intersectingKey) {\n field.values.push(label[intersectingKey]);\n continue;\n }\n }\n field.values.push(null);\n } else if (\n derivedFieldsGrouped[field.name][0].matcherType === 'regex' ||\n derivedFieldsGrouped[field.name][0].matcherType === undefined\n ) {\n // `matcherRegex` will actually be used as a RegExp here\n const line = lineField.values[i];\n const logMatch = line.match(derivedFieldsGrouped[field.name][0].matcherRegex);\n\n if (logMatch && logMatch[1]) {\n field.values.push(logMatch[1]);\n continue;\n }\n\n field.values.push(null);\n } else {\n field.values.push(null);\n }\n }\n }\n\n return newFields;\n}\n\n/**\n * Transform derivedField config into dataframe field with config that contains link.\n */\nfunction fieldFromDerivedFieldConfig(derivedFieldConfigs: DerivedFieldConfig[]): Field {\n const dataSourceSrv = getDataSourceSrv();\n\n const dataLinks = derivedFieldConfigs.reduce<DataLink[]>((acc, derivedFieldConfig) => {\n // Having field.datasourceUid means it is an internal link.\n if (derivedFieldConfig.datasourceUid) {\n const dsSettings = dataSourceSrv.getInstanceSettings(derivedFieldConfig.datasourceUid);\n const queryType = (type: string | undefined): string | undefined => {\n switch (type) {\n case 'tempo':\n return 'traceql';\n case 'grafana-x-ray-datasource':\n return 'getTrace';\n default:\n return undefined;\n }\n };\n\n acc.push({\n // Will be filled out later\n title: derivedFieldConfig.urlDisplayLabel || '',\n url: '',\n // This is hardcoded for Jaeger or Zipkin not way right now to specify datasource specific query object\n internal: {\n query: { query: derivedFieldConfig.url, queryType: queryType(dsSettings?.type) },\n datasourceUid: derivedFieldConfig.datasourceUid,\n datasourceName: dsSettings?.name ?? 'Data source not found',\n },\n targetBlank: derivedFieldConfig.targetBlank,\n });\n } else if (derivedFieldConfig.url) {\n acc.push({\n // We do not know what title to give here so we count on presentation layer to create a title from metadata.\n title: derivedFieldConfig.urlDisplayLabel || '',\n // This is hardcoded for Jaeger or Zipkin not way right now to specify datasource specific query object\n url: derivedFieldConfig.url,\n targetBlank: derivedFieldConfig.targetBlank,\n });\n }\n return acc;\n }, []);\n\n return {\n name: derivedFieldConfigs[0].name,\n type: FieldType.string,\n config: {\n links: dataLinks,\n },\n // We are adding values later on\n values: [],\n };\n}\n","import { groupBy } from 'lodash';\n\nimport { DataFrame, Field, FieldType } from '@grafana/data';\n\nexport function makeTableFrames(instantMetricFrames: DataFrame[]): DataFrame[] {\n // first we remove frames that have no refId\n // (we will group them by refId, so we need it to be set)\n const framesWithRefId = instantMetricFrames.filter((f) => f.refId !== undefined);\n\n const framesByRefId = groupBy(framesWithRefId, (frame) => frame.refId);\n\n return Object.entries(framesByRefId).map(([refId, frames]) => makeTableFrame(frames, refId));\n}\n\ntype NumberField = Field<number>;\ntype StringField = Field<string>;\n\nfunction makeTableFrame(instantMetricFrames: DataFrame[], refId: string): DataFrame {\n const tableTimeField: NumberField = { name: 'Time', config: {}, values: [], type: FieldType.time };\n const tableValueField: NumberField = {\n name: `Value #${refId}`,\n config: {},\n values: [],\n type: FieldType.number,\n };\n\n // Sort metric labels, create columns for them and record their index\n const allLabelNames = new Set(\n instantMetricFrames.map((frame) => frame.fields.map((field) => Object.keys(field.labels ?? {})).flat()).flat()\n );\n\n const sortedLabelNames = Array.from(allLabelNames).sort();\n\n const labelFields: StringField[] = sortedLabelNames.map((labelName) => ({\n name: labelName,\n config: { filterable: true },\n values: [],\n type: FieldType.string,\n }));\n\n instantMetricFrames.forEach((frame) => {\n const timeField = frame.fields.find((field) => field.type === FieldType.time);\n const valueField = frame.fields.find((field) => field.type === FieldType.number);\n if (timeField == null || valueField == null) {\n return;\n }\n\n const timeArray = timeField.values;\n const valueArray = valueField.values;\n\n for (let x of timeArray) {\n tableTimeField.values.push(x);\n }\n\n for (let x of valueArray) {\n tableValueField.values.push(x);\n }\n\n const labels = valueField.labels ?? {};\n\n for (let f of labelFields) {\n const text = labels[f.name] ?? '';\n // we insert the labels as many times as we have values\n for (let i = 0; i < valueArray.length; i++) {\n f.values.push(text);\n }\n }\n });\n\n return {\n fields: [tableTimeField, ...labelFields, tableValueField],\n refId,\n meta: { preferredVisualisationType: 'table' },\n length: tableTimeField.values.length,\n };\n}\n","import { DataQueryResponse, DataFrame, isDataFrame, FieldType, QueryResultMeta, DataQueryError } from '@grafana/data';\n\nimport { getDerivedFields } from './getDerivedFields';\nimport { makeTableFrames } from './makeTableFrames';\nimport { getExpressionFromExecutedQuery, getHighlighterExpressionsFromQuery } from './queryUtils';\nimport { dataFrameHasLokiError } from './responseUtils';\nimport { DerivedFieldConfig, LokiQuery, LokiQueryType } from './types';\n\nfunction isMetricFrame(frame: DataFrame): boolean {\n return frame.fields.every((field) => field.type === FieldType.time || field.type === FieldType.number);\n}\n\n// returns a new frame, with meta shallow merged with its original meta\nfunction setFrameMeta(frame: DataFrame, meta: QueryResultMeta): DataFrame {\n const { meta: oldMeta, ...rest } = frame;\n // meta maybe be undefined, we need to handle that\n const newMeta = { ...oldMeta, ...meta };\n return {\n ...rest,\n meta: newMeta,\n };\n}\n\nfunction processStreamFrame(\n frame: DataFrame,\n query: LokiQuery | undefined,\n derivedFieldConfigs: DerivedFieldConfig[]\n): DataFrame {\n const custom: Record<string, string> = {\n ...frame.meta?.custom, // keep the original meta.custom\n // used by logsModel\n lokiQueryStatKey: 'Summary: total bytes processed',\n };\n\n if (dataFrameHasLokiError(frame)) {\n custom.error = 'Error when parsing some of the logs';\n }\n\n const meta: QueryResultMeta = {\n preferredVisualisationType: 'logs',\n limit: query?.maxLines,\n searchWords: query ? getHighlighterExpressionsFromQuery(query.expr) : undefined,\n custom,\n };\n\n const newFrame = setFrameMeta(frame, meta);\n const derivedFields = getDerivedFields(newFrame, derivedFieldConfigs);\n return {\n ...newFrame,\n fields: [...newFrame.fields, ...derivedFields],\n };\n}\n\nfunction processStreamsFrames(\n frames: DataFrame[],\n queryMap: Map<string, LokiQuery>,\n derivedFieldConfigs: DerivedFieldConfig[]\n): DataFrame[] {\n return frames.map((frame) => {\n const query = frame.refId !== undefined ? queryMap.get(frame.refId) : undefined;\n return processStreamFrame(frame, query, derivedFieldConfigs);\n });\n}\n\nfunction processMetricInstantFrames(frames: DataFrame[]): DataFrame[] {\n return frames.length > 0 ? makeTableFrames(frames) : [];\n}\n\nfunction processMetricRangeFrames(frames: DataFrame[]): DataFrame[] {\n const meta: QueryResultMeta = { preferredVisualisationType: 'graph' };\n return frames.map((frame) => setFrameMeta(frame, meta));\n}\n\n// we split the frames into 3 groups, because we will handle\n// each group slightly differently\nfunction groupFrames(\n frames: DataFrame[],\n queryMap: Map<string, LokiQuery>\n): {\n streamsFrames: DataFrame[];\n metricInstantFrames: DataFrame[];\n metricRangeFrames: DataFrame[];\n} {\n const streamsFrames: DataFrame[] = [];\n const metricInstantFrames: DataFrame[] = [];\n const metricRangeFrames: DataFrame[] = [];\n\n frames.forEach((frame) => {\n if (!isMetricFrame(frame)) {\n streamsFrames.push(frame);\n } else {\n const isInstantFrame = frame.refId != null && queryMap.get(frame.refId)?.queryType === LokiQueryType.Instant;\n if (isInstantFrame) {\n metricInstantFrames.push(frame);\n } else {\n metricRangeFrames.push(frame);\n }\n }\n });\n\n return { streamsFrames, metricInstantFrames, metricRangeFrames };\n}\n\nfunction improveError(error: DataQueryError | undefined, queryMap: Map<string, LokiQuery>): DataQueryError | undefined {\n // many things are optional in an error-object, we need an error-message to exist,\n // and we need to find the loki-query, based on the refId in the error-object.\n if (error === undefined) {\n return error;\n }\n\n const { refId, message } = error;\n if (refId === undefined || message === undefined) {\n return error;\n }\n\n const query = queryMap.get(refId);\n if (query === undefined) {\n return error;\n }\n\n if (message.includes('escape') && query.expr.includes('\\\\')) {\n return {\n ...error,\n message: `${message}. Make sure that all special characters are escaped with \\\\. For more information on escaping of special characters visit LogQL documentation at https://grafana.com/docs/loki/latest/logql/.`,\n };\n }\n\n return error;\n}\n\nexport function transformBackendResult(\n response: DataQueryResponse,\n queries: LokiQuery[],\n derivedFieldConfigs: DerivedFieldConfig[]\n): DataQueryResponse {\n const { data, error, ...rest } = response;\n\n // in the typescript type, data is an array of basically anything.\n // we do know that they have to be dataframes, so we make a quick check,\n // this way we can be sure, and also typescript is happy.\n const dataFrames = data.map((d) => {\n if (!isDataFrame(d)) {\n throw new Error('transformation only supports dataframe responses');\n }\n return d;\n });\n\n const queryMap = new Map(\n queries.map((query) => {\n const executedExpr = response.data.find((data) => data.refId === query.refId)?.meta.executedQueryString;\n const executedQuery = {\n ...query,\n expr: executedExpr ? getExpressionFromExecutedQuery(executedExpr) : query.expr,\n };\n\n return [query.refId, executedQuery];\n })\n );\n\n const { streamsFrames, metricInstantFrames, metricRangeFrames } = groupFrames(dataFrames, queryMap);\n\n return {\n ...rest,\n error: improveError(error, queryMap),\n data: [\n ...processMetricRangeFrames(metricRangeFrames),\n ...processMetricInstantFrames(metricInstantFrames),\n ...processStreamsFrames(streamsFrames, queryMap, derivedFieldConfigs),\n ],\n };\n}\n","import { memo } from 'react';\nimport * as React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { config, reportInteraction } from '@grafana/runtime';\nimport { InlineField, Input, Stack } from '@grafana/ui';\n\nimport { LokiQuery, LokiQueryDirection, LokiQueryType } from '../types';\n\nexport interface LokiOptionFieldsProps {\n lineLimitValue: string;\n query: LokiQuery;\n onChange: (value: LokiQuery) => void;\n onRunQuery: () => void;\n runOnBlur?: boolean;\n}\n\nexport const queryTypeOptions: Array<SelectableValue<LokiQueryType>> = [\n { value: LokiQueryType.Range, label: 'Range', description: 'Run query over a range of time.' },\n {\n value: LokiQueryType.Instant,\n label: 'Instant',\n description: 'Run query against a single point in time. For this query, the \"To\" time is used.',\n },\n];\n\nexport const queryDirections: Array<SelectableValue<LokiQueryDirection>> = [\n { value: LokiQueryDirection.Backward, label: 'Backward', description: 'Search in backward direction.' },\n {\n value: LokiQueryDirection.Forward,\n label: 'Forward',\n description: 'Search in forward direction.',\n },\n];\n\nif (config.featureToggles.lokiShardSplitting) {\n queryDirections.push({\n value: LokiQueryDirection.Scan,\n label: 'Scan',\n description: 'Experimental. Split the query into smaller units and stop at the requested log line limit.',\n icon: 'exclamation-triangle',\n });\n}\n\nif (config.featureToggles.lokiExperimentalStreaming) {\n queryTypeOptions.push({\n value: LokiQueryType.Stream,\n label: 'Stream',\n description: 'Run a query and keep sending results on an interval',\n });\n}\n\nexport function getQueryDirectionLabel(direction: LokiQueryDirection) {\n return queryDirections.find((queryDirection) => queryDirection.value === direction)?.label ?? 'Unknown';\n}\n\nexport function LokiOptionFields(props: LokiOptionFieldsProps) {\n const { lineLimitValue, onRunQuery, runOnBlur, onChange } = props;\n const query = props.query ?? {};\n\n function onChangeQueryLimit(value: string) {\n const maxLines = preprocessMaxLines(value);\n const nextQuery = { ...query, maxLines };\n onChange(nextQuery);\n reportInteraction('grafana_loki_max_lines_changed', {\n maxLines,\n });\n }\n\n function onMaxLinesChange(e: React.SyntheticEvent<HTMLInputElement>) {\n if (query.maxLines !== preprocessMaxLines(e.currentTarget.value)) {\n onChangeQueryLimit(e.currentTarget.value);\n }\n }\n\n function onReturnKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n if (e.key === 'Enter') {\n onRunQuery();\n }\n }\n\n return (\n <Stack alignItems=\"flex-start\" gap={0.5} aria-label=\"Loki extra field\">\n {/*Line limit field*/}\n <Stack wrap=\"nowrap\" gap={0} data-testid=\"lineLimitField\" aria-label=\"Line limit field\">\n <InlineField label=\"Line limit\" tooltip={'Upper limit for number of log lines returned by query.'}>\n <Input\n className=\"width-4\"\n placeholder=\"auto\"\n type=\"number\"\n min={0}\n onChange={onMaxLinesChange}\n onKeyDown={onReturnKeyDown}\n value={lineLimitValue}\n onBlur={() => {\n if (runOnBlur) {\n onRunQuery();\n }\n }}\n />\n </InlineField>\n </Stack>\n </Stack>\n );\n}\n\nexport default memo(LokiOptionFields);\n\nexport function preprocessMaxLines(value: string): number | undefined {\n const maxLines = parseInt(value, 10);\n if (isNaN(maxLines) || maxLines < 0) {\n return undefined;\n }\n\n return maxLines;\n}\n","import { lazy, Suspense } from 'react';\n\nimport { Props } from './MonacoQueryFieldProps';\n\nconst Field = lazy(() => import(/* webpackChunkName: \"loki-query-field\" */ './MonacoQueryField'));\n\nexport const MonacoQueryFieldLazy = (props: Props) => {\n return (\n <Suspense fallback={null}>\n <Field {...props} />\n </Suspense>\n );\n};\n","import { useRef } from 'react';\n\nimport { MonacoQueryFieldLazy } from './MonacoQueryFieldLazy';\nimport { Props as MonacoProps } from './MonacoQueryFieldProps';\n\nexport type Props = Omit<MonacoProps, 'onRunQuery' | 'onBlur'> & {\n onChange: (query: string) => void;\n onRunQuery: () => void;\n onQueryType?: (query: string) => 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} onChange={onChange} {...rest} />;\n};\n","import { PureComponent, ReactNode } from 'react';\n\nimport { QueryEditorProps } from '@grafana/data';\n\nimport { LokiDatasource } from '../datasource';\nimport { shouldRefreshLabels } from '../languageUtils';\nimport { LokiQuery, LokiOptions } from '../types';\n\nimport { MonacoQueryFieldWrapper } from './monaco-query-field/MonacoQueryFieldWrapper';\n\nexport interface LokiQueryFieldProps extends QueryEditorProps<LokiDatasource, LokiQuery, LokiOptions> {\n ExtraFieldElement?: ReactNode;\n placeholder?: string;\n 'data-testid'?: string;\n}\n\ninterface LokiQueryFieldState {\n labelsLoaded: boolean;\n}\n\nexport class LokiQueryField extends PureComponent<LokiQueryFieldProps, LokiQueryFieldState> {\n _isMounted = false;\n\n constructor(props: LokiQueryFieldProps) {\n super(props);\n\n this.state = { labelsLoaded: false };\n }\n\n async componentDidMount() {\n this._isMounted = true;\n await this.props.datasource.languageProvider.start(this.props.range);\n if (this._isMounted) {\n this.setState({ labelsLoaded: true });\n }\n }\n\n componentWillUnmount() {\n this._isMounted = false;\n }\n\n componentDidUpdate(prevProps: LokiQueryFieldProps) {\n const {\n range,\n datasource: { languageProvider },\n } = this.props;\n const refreshLabels = shouldRefreshLabels(range, prevProps.range);\n // We want to refresh labels when range changes (we round up intervals to a minute)\n if (refreshLabels) {\n languageProvider.fetchLabels({ timeRange: range });\n }\n }\n\n onChangeQuery = (value: string, override?: boolean) => {\n // Send text change to parent\n const { query, onChange, onRunQuery } = this.props;\n if (onChange) {\n const nextQuery = { ...query, expr: value };\n onChange(nextQuery);\n\n if (override && onRunQuery) {\n onRunQuery();\n }\n }\n };\n\n render() {\n const { ExtraFieldElement, query, datasource, history, onRunQuery, range } = this.props;\n const placeholder = this.props.placeholder ?? 'Enter a Loki query (run with Shift+Enter)';\n\n return (\n <>\n <div\n className=\"gf-form-inline gf-form-inline--xs-view-flex-column flex-grow-1\"\n data-testid={this.props['data-testid']}\n >\n <div className=\"gf-form--grow flex-shrink-1 min-width-15\">\n <MonacoQueryFieldWrapper\n datasource={datasource}\n history={history ?? []}\n onChange={this.onChangeQuery}\n onRunQuery={onRunQuery}\n initialValue={query.expr ?? ''}\n placeholder={placeholder}\n timeRange={range}\n />\n </div>\n </div>\n {ExtraFieldElement}\n </>\n );\n }\n}\n","import { memo } from 'react';\n\nimport { AnnotationQuery } from '@grafana/data';\nimport { EditorField, EditorRow } from '@grafana/plugin-ui';\nimport { Input, Stack } from '@grafana/ui';\n\nimport { LokiQuery } from '../types';\n\nimport { LokiOptionFields } from './LokiOptionFields';\nimport { LokiQueryField } from './LokiQueryField';\nimport { LokiQueryEditorProps } from './types';\n\ntype Props = LokiQueryEditorProps & {\n annotation?: AnnotationQuery<LokiQuery>;\n onAnnotationChange?: (annotation: AnnotationQuery<LokiQuery>) => void;\n};\n\nexport const LokiAnnotationsQueryEditor = memo(function LokiAnnotationQueryEditor(props: Props) {\n const { annotation, onAnnotationChange, history } = props;\n\n // this should never happen, but we want to keep typescript happy\n if (annotation === undefined || onAnnotationChange === undefined) {\n return null;\n }\n\n const onChangeQuery = (query: LokiQuery) => {\n onAnnotationChange({\n ...annotation,\n expr: query.expr,\n maxLines: query.maxLines,\n queryType: 'range',\n });\n };\n\n const queryWithRefId: LokiQuery = {\n refId: '',\n expr: annotation.expr,\n maxLines: annotation.maxLines,\n instant: annotation.instant,\n queryType: annotation.queryType,\n };\n return (\n <Stack gap={5} direction=\"column\">\n <Stack gap={0} direction=\"column\">\n <LokiQueryField\n datasource={props.datasource}\n query={queryWithRefId}\n onChange={onChangeQuery}\n onRunQuery={() => {}}\n history={history}\n ExtraFieldElement={\n <LokiOptionFields\n lineLimitValue={queryWithRefId?.maxLines?.toString() || ''}\n query={queryWithRefId}\n onRunQuery={() => {}}\n onChange={onChangeQuery}\n />\n }\n />\n </Stack>\n <EditorRow>\n <EditorField\n label=\"Title\"\n tooltip={\n 'Use either the name or a pattern. For example, {{instance}} is replaced with label value for the label instance.'\n }\n >\n <Input\n type=\"text\"\n placeholder=\"alertname\"\n value={annotation.titleFormat}\n onChange={(event) => {\n onAnnotationChange({\n ...annotation,\n titleFormat: event.currentTarget.value,\n });\n }}\n />\n </EditorField>\n <EditorField label=\"Tags\">\n <Input\n type=\"text\"\n placeholder=\"label1,label2\"\n value={annotation.tagKeys}\n onChange={(event) => {\n onAnnotationChange({\n ...annotation,\n tagKeys: event.currentTarget.value,\n });\n }}\n />\n </EditorField>\n <EditorField\n label=\"Text\"\n tooltip={\n 'Use either the name or a pattern. For example, {{instance}} is replaced with label value for the label instance.'\n }\n >\n <Input\n type=\"text\"\n placeholder=\"instance\"\n value={annotation.textFormat}\n onChange={(event) => {\n onAnnotationChange({\n ...annotation,\n textFormat: event.currentTarget.value,\n });\n }}\n />\n </EditorField>\n </EditorRow>\n </Stack>\n );\n});\n","import { DataFrame, QueryHint } from '@grafana/data';\n\nimport {\n isQueryWithLabelFilter,\n isQueryPipelineErrorFiltering,\n isQueryWithLabelFormat,\n isQueryWithParser,\n isQueryWithLineFilter,\n} from './queryUtils';\nimport {\n dataFrameHasLevelLabel,\n extractHasErrorLabelFromDataFrame,\n extractLevelLikeLabelFromDataFrame,\n extractLogParserFromDataFrame,\n} from './responseUtils';\n\nexport function getQueryHints(query: string, series: DataFrame[]): QueryHint[] {\n if (series.length === 0) {\n return [];\n }\n\n const hints: QueryHint[] = [];\n const { queryWithParser, parserCount } = isQueryWithParser(query);\n\n if (!queryWithParser) {\n const { hasLogfmt, hasJSON, hasPack } = extractLogParserFromDataFrame(series[0]);\n if (hasJSON) {\n if (hasPack) {\n hints.push({\n type: 'ADD_UNPACK_PARSER',\n label: 'Selected log stream selector has packed logs.',\n fix: {\n title: 'add unpack parser',\n label: 'Consider using unpack parser.',\n action: {\n type: 'ADD_UNPACK_PARSER',\n query,\n },\n },\n });\n } else {\n hints.push({\n type: 'ADD_JSON_PARSER',\n label: 'Selected log stream selector has JSON formatted logs.',\n fix: {\n title: 'add json parser',\n label: 'Consider using JSON parser.',\n action: {\n type: 'ADD_JSON_PARSER',\n query,\n },\n },\n });\n }\n }\n\n if (hasLogfmt) {\n hints.push({\n type: 'ADD_LOGFMT_PARSER',\n label: 'Selected log stream selector has logfmt formatted logs.',\n fix: {\n title: 'add logfmt parser',\n label: 'Consider using logfmt parser to turn key-value pairs in your log lines to labels.',\n action: {\n type: 'ADD_LOGFMT_PARSER',\n query,\n },\n },\n });\n }\n }\n\n if (queryWithParser) {\n // To keep this simple, we consider pipeline error filtering hint only is query has up to 1 parser\n if (parserCount === 1) {\n const hasPipelineErrorFiltering = isQueryPipelineErrorFiltering(query);\n const hasError = extractHasErrorLabelFromDataFrame(series[0]);\n if (hasError && !hasPipelineErrorFiltering) {\n hints.push({\n type: 'ADD_NO_PIPELINE_ERROR',\n label: 'Some logs in your selected log streams have parsing error.',\n fix: {\n title: 'remove pipeline errors',\n label: 'Consider filtering out logs with parsing errors.',\n action: {\n type: 'ADD_NO_PIPELINE_ERROR',\n query,\n },\n },\n });\n }\n }\n\n const hasLabelFilter = isQueryWithLabelFilter(query);\n\n if (!hasLabelFilter) {\n hints.push({\n type: 'ADD_LABEL_FILTER',\n label: 'Consider filtering logs by their label and value.',\n fix: {\n title: 'add label filter',\n label: '',\n action: {\n type: 'ADD_LABEL_FILTER',\n query,\n },\n },\n });\n }\n }\n\n const queryWithLabelFormat = isQueryWithLabelFormat(query);\n if (!queryWithLabelFormat) {\n const hasLevel = dataFrameHasLevelLabel(series[0]);\n const levelLikeLabel = extractLevelLikeLabelFromDataFrame(series[0]);\n\n // Add hint only if we don't have \"level\" label and have level-like label\n if (!hasLevel && levelLikeLabel) {\n hints.push({\n type: 'ADD_LEVEL_LABEL_FORMAT',\n label: `Some logs in your selected log stream have \"${levelLikeLabel}\" label.`,\n fix: {\n title: 'add label level format',\n label: `If ${levelLikeLabel} label has level values, consider using label_format to rename it to \"level\". Level label can be then visualized in log volumes.`,\n action: {\n type: 'ADD_LEVEL_LABEL_FORMAT',\n query,\n options: {\n renameTo: 'level',\n originalLabel: levelLikeLabel,\n },\n },\n },\n });\n }\n }\n\n const hasLineFilter = isQueryWithLineFilter(query);\n\n if (!hasLineFilter) {\n hints.push({\n type: 'ADD_LINE_FILTER',\n label: 'Consider filtering logs for specific string.',\n fix: {\n title: 'add line filter',\n label: '',\n action: {\n type: 'ADD_LINE_FILTER',\n query,\n },\n },\n });\n }\n\n return hints;\n}\n","import { groupBy, partition } from 'lodash';\nimport { Observable, Subscriber, Subscription } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { DataQueryRequest, LoadingState, DataQueryResponse, QueryResultMetaStat } from '@grafana/data';\n\nimport { LokiDatasource } from './datasource';\nimport { combineResponses, replaceResponses } from './mergeResponses';\nimport { adjustTargetsFromResponseState, runSplitQuery } from './querySplitting';\nimport { getSelectorForShardValues, interpolateShardingSelector, requestSupportsSharding } from './queryUtils';\nimport { isRetriableError } from './responseUtils';\nimport { LokiQuery } from './types';\n\n/**\n * Query splitting by stream shards.\n * Query splitting was introduced in Loki to optimize querying for long intervals and high volume of data,\n * dividing a big request into smaller sub-requests, combining and displaying the results as they arrive.\n *\n * This approach, inspired by the time-based query splitting, takes advantage of the __stream_shard__\n * internal label, representing how data is spread into different sources that can be queried individually.\n *\n * The main entry point of this module is runShardSplitQuery(), which prepares the query for execution and\n * passes it to splitQueriesByStreamShard() to begin the querying loop.\n *\n * splitQueriesByStreamShard() has the following structure:\n * - Creates and returns an Observable to which the UI will subscribe\n * - Requests the __stream_shard__ values of the selected service:\n * . If there are no shard values, it falls back to the standard querying approach of the data source in runNonSplitRequest()\n * . If there are shards:\n * - It sorts them by value, descending. Higher shard numbers correspond with the least volume.\n * - It defines an initial group size, roughly Math.sqrt(amountOfShards).\n * - It begins the querying loop with runNextRequest().\n * - runNextRequest() will create a group of groupSize shards from the nth shard (cycle), and has the following internal structure:\n * . groupShardRequests() returns an array of shards from cycle to cycle + groupSize.\n * . interpolateShardingSelector() will update the stream selector with the shard numbers in the current group.\n * . After query execution:\n * - If the response is successful:\n * . It will add new data to the response with combineResponses()\n * . Using the data and meta data of the response, updateGroupSizeFromResponse() will increase or decrease the group size.\n * . nextRequest() will use the current cycle and group size to determine the next request or complete execution with done().\n * - If the response is unsuccessful:\n * . If the response is not a query error, and the group size bigger than 1, it will decrease the group size.\n * . If the group size is already 1, it will retry the request up to 2 times.\n * . If there are retry attempts, it will retry the current cycle, or else stop querying.\n * - Once all request groups have been executed, it will be done().\n */\n\nexport function runShardSplitQuery(datasource: LokiDatasource, request: DataQueryRequest<LokiQuery>) {\n const queries = request.targets\n .filter((query) => query.expr)\n .filter((query) => !query.hide)\n .map((query) => datasource.applyTemplateVariables(query, request.scopedVars, request.filters));\n\n return splitQueriesByStreamShard(datasource, request, queries);\n}\n\nfunction splitQueriesByStreamShard(\n datasource: LokiDatasource,\n request: DataQueryRequest<LokiQuery>,\n splittingTargets: LokiQuery[]\n) {\n let shouldStop = false;\n let mergedResponse: DataQueryResponse = { data: [], state: LoadingState.Streaming, key: uuidv4() };\n let subquerySubscription: Subscription | null = null;\n let retriesMap = new Map<string, number>();\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n const runNextRequest = (subscriber: Subscriber<DataQueryResponse>, group: number, groups: ShardedQueryGroup[]) => {\n let nextGroupSize = groups[group].groupSize;\n const { shards, groupSize, cycle } = groups[group];\n let retrying = false;\n\n if (subquerySubscription != null) {\n subquerySubscription.unsubscribe();\n subquerySubscription = null;\n }\n\n const done = () => {\n mergedResponse.state = shouldStop ? LoadingState.Error : LoadingState.Done;\n subscriber.next(mergedResponse);\n subscriber.complete();\n };\n\n if (shouldStop) {\n done();\n return;\n }\n\n const nextRequest = () => {\n // Find the next group to execute, which can be queries with pending shards to execute, or the next query with no shards.\n const nextGroup =\n groups[group + 1] && (groups[group + 1].shards === undefined || groupHasPendingRequests(groups[group + 1]))\n ? groups[group + 1]\n : groups.find((shardGroup) => groupHasPendingRequests(shardGroup));\n\n if (nextGroup === undefined) {\n done();\n return;\n }\n groups[group].groupSize = nextGroupSize;\n runNextRequest(subscriber, groups.indexOf(nextGroup), groups);\n };\n\n const retry = (errorResponse?: DataQueryResponse) => {\n try {\n if (errorResponse && !isRetriableError(errorResponse)) {\n return false;\n }\n } catch (e) {\n console.error(e);\n shouldStop = true;\n return false;\n }\n\n if (groupSize !== undefined && groupSize > 1) {\n groups[group].groupSize = Math.floor(Math.sqrt(groupSize));\n debug(`Possible time out, new group size ${groups[group].groupSize}`);\n retrying = true;\n runNextRequest(subscriber, group, groups);\n return true;\n }\n\n const key = `${group}_${cycle}`;\n const retries = retriesMap.get(key) ?? 0;\n\n if (retries > 1) {\n shouldStop = true;\n return false;\n }\n\n retriesMap.set(key, retries + 1);\n\n retryTimer = setTimeout(\n () => {\n console.warn(`Retrying ${group} ${cycle} (${retries + 1})`);\n runNextRequest(subscriber, group, groups);\n retryTimer = null;\n },\n 1500 * Math.pow(2, retries)\n ); // Exponential backoff\n\n retrying = true;\n\n return true;\n };\n\n const targets = adjustTargetsFromResponseState(groups[group].targets, mergedResponse);\n if (!targets.length) {\n nextRequest();\n return;\n }\n\n const shardsToQuery =\n shards && cycle !== undefined && groupSize ? groupShardRequests(shards, cycle, groupSize) : [];\n const subRequest = { ...request, targets: interpolateShardingSelector(targets, shardsToQuery) };\n // Request may not have a request id\n if (request.requestId) {\n subRequest.requestId =\n shardsToQuery.length > 0 ? `${request.requestId}_shard_${group}_${cycle}_${groupSize}` : request.requestId;\n }\n\n debug(shardsToQuery.length ? `Querying ${shardsToQuery.join(', ')}` : 'Running regular query');\n\n subquerySubscription = runSplitQuery(datasource, subRequest, {\n skipPartialUpdates: true,\n disableRetry: true,\n }).subscribe({\n next: (partialResponse: DataQueryResponse) => {\n if ((partialResponse.errors ?? []).length > 0 || partialResponse.error != null) {\n if (retry(partialResponse)) {\n return;\n }\n }\n if (groupSize && cycle !== undefined && shards !== undefined) {\n nextGroupSize = constrainGroupSize(\n cycle + groupSize,\n updateGroupSizeFromResponse(partialResponse, groups[group]),\n shards.length\n );\n if (nextGroupSize !== groupSize) {\n debug(`New group size ${nextGroupSize}`);\n }\n }\n mergedResponse =\n shardsToQuery.length > 0\n ? combineResponses(mergedResponse, partialResponse)\n : replaceResponses(mergedResponse, partialResponse);\n\n // When we delegate query running to runSplitQuery(), we will receive partial updates here, and complete\n // will be called when all the sub-requests were completed, so we need to show partial progress here.\n if (shardsToQuery.length === 0) {\n subscriber.next(mergedResponse);\n }\n },\n complete: () => {\n if (retrying) {\n return;\n }\n subscriber.next(mergedResponse);\n nextRequest();\n },\n error: (error: unknown) => {\n console.error(error, { msg: 'failed to shard' });\n subscriber.next(mergedResponse);\n if (retry()) {\n return;\n }\n nextRequest();\n },\n });\n };\n\n const response = new Observable<DataQueryResponse>((subscriber) => {\n groupTargetsByQueryType(splittingTargets, datasource, request).then((groupedRequests) => {\n runNextRequest(subscriber, 0, groupedRequests);\n });\n return () => {\n shouldStop = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n }\n if (subquerySubscription != null) {\n subquerySubscription.unsubscribe();\n subquerySubscription = null;\n }\n };\n });\n\n return response;\n}\n\ninterface ShardedQueryGroup {\n targets: LokiQuery[];\n shards?: number[];\n groupSize?: number;\n cycle?: number;\n}\n\nasync function groupTargetsByQueryType(\n targets: LokiQuery[],\n datasource: LokiDatasource,\n request: DataQueryRequest<LokiQuery>\n) {\n const [shardedQueries, otherQueries] = partition(targets, (query) => requestSupportsSharding([query]));\n const groups: ShardedQueryGroup[] = [];\n\n if (otherQueries.length) {\n groups.push({\n targets: otherQueries,\n });\n }\n\n const selectorPartition = groupBy(shardedQueries, (query) => getSelectorForShardValues(query.expr));\n for (const selector in selectorPartition) {\n try {\n const values = await datasource.languageProvider.fetchLabelValues('__stream_shard__', {\n timeRange: request.range,\n streamSelector: selector,\n });\n const shards = values.map((value) => parseInt(value, 10));\n if (shards) {\n shards.sort((a, b) => b - a);\n debug(`Querying ${selector} with shards ${shards.join(', ')}`);\n }\n groups.push({\n targets: selectorPartition[selector],\n shards: shards.length ? shards : undefined,\n groupSize: shards.length ? getInitialGroupSize(shards) : undefined,\n cycle: 0,\n });\n } catch (error) {\n console.error(error, { msg: 'failed to fetch label values for __stream_shard__' });\n groups.push({\n targets: selectorPartition[selector],\n });\n }\n }\n\n return groups;\n}\n\nfunction groupHasPendingRequests(group: ShardedQueryGroup) {\n if (group.cycle === undefined || !group.groupSize || !group.shards) {\n return false;\n }\n const { cycle, groupSize, shards } = group;\n const nextCycle = Math.min(cycle + groupSize, shards.length);\n group.cycle = nextCycle;\n return cycle < shards.length && nextCycle <= shards.length;\n}\n\nfunction updateGroupSizeFromResponse(response: DataQueryResponse, group: ShardedQueryGroup) {\n const { groupSize: currentSize } = group;\n if (!currentSize) {\n return 1;\n }\n if (!response.data.length) {\n // Empty response, increase group size\n return currentSize + 1;\n }\n\n const metaExecutionTime: QueryResultMetaStat | undefined = response.data[0].meta?.stats?.find(\n (stat: QueryResultMetaStat) => stat.displayName === 'Summary: exec time'\n );\n\n if (metaExecutionTime) {\n const executionTime = Math.round(metaExecutionTime.value);\n debug(`${metaExecutionTime.value}`);\n // Positive scenarios\n if (executionTime <= 1) {\n return Math.floor(currentSize * 1.5);\n } else if (executionTime < 6) {\n return Math.ceil(currentSize * 1.1);\n }\n\n // Negative scenarios\n if (currentSize === 1) {\n return currentSize;\n } else if (executionTime < 20) {\n return Math.ceil(currentSize * 0.9);\n } else {\n return Math.floor(currentSize / 2);\n }\n }\n\n return currentSize;\n}\n\n/**\n * Prevents the group size for ever being more than maxFactor% of the pending shards.\n */\nfunction constrainGroupSize(cycle: number, groupSize: number, shards: number) {\n const maxFactor = 0.7;\n return Math.min(groupSize, Math.max(Math.floor((shards - cycle) * maxFactor), 1));\n}\n\nfunction groupShardRequests(shards: number[], start: number, groupSize: number) {\n if (start === shards.length) {\n return [-1];\n }\n return shards.slice(start, start + groupSize);\n}\n\nfunction getInitialGroupSize(shards: number[]) {\n return Math.floor(Math.sqrt(shards.length));\n}\n\n// Enable to output debugging logs\nconst DEBUG_ENABLED = Boolean(localStorage.getItem(`loki.sharding_debug_enabled`));\nfunction debug(message: string) {\n if (!DEBUG_ENABLED) {\n return;\n }\n console.log(message);\n}\n","import { map, Observable, defer, mergeMap } from 'rxjs';\n\nimport {\n DataFrameJSON,\n DataQueryRequest,\n DataQueryResponse,\n LiveChannelEvent,\n LiveChannelScope,\n LoadingState,\n StreamingDataFrame,\n} from '@grafana/data';\nimport { getGrafanaLiveSrv, config } from '@grafana/runtime';\n\nimport { LokiDatasource } from './datasource';\nimport { LokiQuery } from './types';\n\n/**\n * Calculate a unique key for the query. The key is used to pick a channel and should\n * be unique for each distinct query execution plan. This key is not secure and is only picked to avoid\n * possible collisions\n */\nexport async function getLiveStreamKey(query: LokiQuery): Promise<string> {\n const str = JSON.stringify({ expr: query.expr });\n\n const msgUint8 = new TextEncoder().encode(str); // encode as (utf-8) Uint8Array\n const hashBuffer = await crypto.subtle.digest('SHA-1', msgUint8); // hash the message\n const hashArray = Array.from(new Uint8Array(hashBuffer.slice(0, 8))); // first 8 bytes\n return `${query.datasource?.uid}/${hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')}/${config.bootData.user.orgId}`;\n}\n\n// This will get both v1 and v2 result formats\nexport function doLokiChannelStream(\n query: LokiQuery,\n ds: LokiDatasource,\n options: DataQueryRequest<LokiQuery>\n): Observable<DataQueryResponse> {\n // maximum time to keep values\n const range = options.range;\n const maxDelta = range.to.valueOf() - range.from.valueOf() + 1000;\n let maxLength = options.maxDataPoints ?? 1000;\n if (maxLength > 100) {\n // for small buffers, keep them small\n maxLength *= 2;\n }\n\n let frame: StreamingDataFrame | undefined = undefined;\n const updateFrame = (msg: LiveChannelEvent<unknown>) => {\n if ('message' in msg && msg.message) {\n const p: DataFrameJSON = msg.message;\n if (!frame) {\n frame = StreamingDataFrame.fromDataFrameJSON(p, {\n maxLength,\n maxDelta,\n displayNameFormat: query.legendFormat,\n });\n } else {\n frame.push(p);\n }\n }\n return frame;\n };\n\n return defer(() => getLiveStreamKey(query)).pipe(\n mergeMap((key) => {\n return getGrafanaLiveSrv()\n .getStream({\n scope: LiveChannelScope.DataSource,\n namespace: ds.uid,\n path: `tail/${key}`,\n data: {\n ...query,\n timeRange: {\n from: range.from.valueOf().toString(),\n to: range.to.valueOf().toString(),\n },\n },\n })\n .pipe(\n map((evt) => {\n const frame = updateFrame(evt);\n return {\n data: frame ? [frame] : [],\n state: LoadingState.Streaming,\n };\n })\n );\n })\n );\n}\n\nexport const convertToWebSocketUrl = (url: string) => {\n const protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';\n let backend = `${protocol}${window.location.host}${config.appSubUrl}`;\n if (backend.endsWith('/')) {\n backend = backend.slice(0, -1);\n }\n return `${backend}${url}`;\n};\n","import { cloneDeep, map as lodashMap } from 'lodash';\nimport { lastValueFrom, merge, Observable, of, throwError } from 'rxjs';\nimport { catchError, map, switchMap, tap } from 'rxjs/operators';\n\nimport {\n AbstractQuery,\n AnnotationEvent,\n AnnotationQueryRequest,\n CoreApp,\n DataFrame,\n DataFrameView,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n DataSourceWithLogsContextSupport,\n DataSourceWithSupplementaryQueriesSupport,\n SupplementaryQueryType,\n DataSourceWithQueryExportSupport,\n DataSourceWithQueryImportSupport,\n Labels,\n LoadingState,\n LogRowModel,\n QueryFixAction,\n QueryHint,\n rangeUtil,\n ScopedVars,\n SupplementaryQueryOptions,\n TimeRange,\n LogRowContextOptions,\n DataSourceWithToggleableQueryFiltersSupport,\n ToggleFilterAction,\n QueryFilterOptions,\n renderLegendFormat,\n LegacyMetricFindQueryOptions,\n AdHocVariableFilter,\n urlUtil,\n MetricFindValue,\n DataSourceGetTagValuesOptions,\n DataSourceGetTagKeysOptions,\n DataSourceWithQueryModificationSupport,\n LogsVolumeOption,\n LogsSampleOptions,\n QueryVariableModel,\n CustomVariableModel,\n} from '@grafana/data';\nimport { Duration } from '@grafana/lezer-logql';\nimport { BackendSrvRequest, config, DataSourceWithBackend, getTemplateSrv, TemplateSrv } from '@grafana/runtime';\nimport { DataQuery } from '@grafana/schema';\n\nimport LanguageProvider from './LanguageProvider';\nimport { LiveStreams, LokiLiveTarget } from './LiveStreams';\nimport { LogContextProvider } from './LogContextProvider';\nimport { LokiVariableSupport } from './LokiVariableSupport';\nimport { transformBackendResult } from './backendResultTransformer';\nimport { LokiAnnotationsQueryEditor } from './components/AnnotationsQueryEditor';\nimport { placeHolderScopedVars } from './components/monaco-query-field/monaco-completion-provider/validation';\nimport { escapeLabelValueInSelector, isRegexSelector, getLabelTypeFromFrame } from './languageUtils';\nimport { labelNamesRegex, labelValuesRegex } from './migrations/variableQueryMigrations';\nimport {\n addLabelFormatToQuery,\n addLabelToQuery,\n addNoPipelineErrorToQuery,\n addParserToQuery,\n removeCommentsFromQuery,\n addFilterAsLabelFilter,\n getParserPositions,\n toLabelFilter,\n addLineFilter,\n findLastPosition,\n getLabelFilterPositions,\n queryHasFilter,\n removeLabelFromQuery,\n} from './modifyQuery';\nimport { getQueryHints } from './queryHints';\nimport { runSplitQuery } from './querySplitting';\nimport {\n getLogQueryFromMetricsQuery,\n getLokiQueryFromDataQuery,\n getNodesFromQuery,\n getNormalizedLokiQuery,\n getStreamSelectorsFromQuery,\n isLogsQuery,\n isQueryWithError,\n requestSupportsSharding,\n requestSupportsSplitting,\n} from './queryUtils';\nimport { replaceVariables, returnVariables } from './querybuilder/parsingUtils';\nimport { runShardSplitQuery } from './shardQuerySplitting';\nimport { convertToWebSocketUrl, doLokiChannelStream } from './streaming';\nimport { trackQuery } from './tracking';\nimport {\n LokiOptions,\n LokiQuery,\n LokiQueryType,\n LokiVariableQuery,\n LokiVariableQueryType,\n QueryStats,\n SupportingQueryType,\n} from './types';\n\nexport type RangeQueryOptions = DataQueryRequest<LokiQuery> | AnnotationQueryRequest<LokiQuery>;\nexport const DEFAULT_MAX_LINES = 1000;\nexport const DEFAULT_MAX_LINES_SAMPLE = 10;\nexport const LOKI_ENDPOINT = '/loki/api/v1';\nexport const REF_ID_DATA_SAMPLES = 'loki-data-samples';\nexport const REF_ID_STARTER_ANNOTATION = 'annotation-';\nexport const REF_ID_STARTER_LOG_ROW_CONTEXT = 'log-row-context-query-';\nexport const REF_ID_STARTER_LOG_VOLUME = 'log-volume-';\nexport const REF_ID_STARTER_LOG_SAMPLE = 'log-sample-';\nexport const REF_ID_STARTER_STATS = 'log-stats-';\n\nconst NS_IN_MS = 1000000;\n\nexport function makeRequest(\n query: LokiQuery,\n range: TimeRange,\n app: CoreApp,\n requestId: string,\n hideFromInspector?: boolean\n): DataQueryRequest<LokiQuery> {\n const intervalInfo = rangeUtil.calculateInterval(range, 1);\n return {\n targets: [query],\n requestId,\n interval: intervalInfo.interval,\n intervalMs: intervalInfo.intervalMs,\n range: range,\n scopedVars: {},\n timezone: 'UTC',\n app,\n startTime: Date.now(),\n hideFromInspector,\n };\n}\n\nexport class LokiDatasource\n extends DataSourceWithBackend<LokiQuery, LokiOptions>\n implements\n DataSourceWithLogsContextSupport,\n DataSourceWithSupplementaryQueriesSupport<LokiQuery>,\n DataSourceWithQueryImportSupport<LokiQuery>,\n DataSourceWithQueryExportSupport<LokiQuery>,\n DataSourceWithToggleableQueryFiltersSupport<LokiQuery>,\n DataSourceWithQueryModificationSupport<LokiQuery>\n{\n private streams = new LiveStreams();\n private logContextProvider: LogContextProvider;\n languageProvider: LanguageProvider;\n maxLines: number;\n\n constructor(\n private instanceSettings: DataSourceInstanceSettings<LokiOptions>,\n private readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n\n this.languageProvider = new LanguageProvider(this);\n const settingsData = instanceSettings.jsonData || {};\n this.maxLines = parseInt(settingsData.maxLines ?? '0', 10) || DEFAULT_MAX_LINES;\n this.annotations = {\n QueryEditor: LokiAnnotationsQueryEditor,\n };\n this.variables = new LokiVariableSupport(this);\n this.logContextProvider = new LogContextProvider(this);\n this.supportsAdjustableWindow = true;\n }\n\n // Flag marking datasource as supporting adjusting the time range window in the logs context window: https://github.com/grafana/grafana/pull/109901\n public supportsAdjustableWindow;\n\n /**\n * Implemented for DataSourceWithSupplementaryQueriesSupport.\n * It generates a DataQueryRequest for a specific supplementary query type.\n * @returns A DataQueryRequest for the supplementary queries or undefined if not supported.\n */\n getSupplementaryRequest(\n type: SupplementaryQueryType,\n request: DataQueryRequest<LokiQuery>,\n options?: SupplementaryQueryOptions\n ): DataQueryRequest<LokiQuery> | undefined {\n switch (type) {\n case SupplementaryQueryType.LogsVolume:\n const logsVolumeOption: LogsVolumeOption =\n options?.type === SupplementaryQueryType.LogsVolume ? options : { type };\n return this.getLogsVolumeDataProvider(request, logsVolumeOption);\n case SupplementaryQueryType.LogsSample:\n const logsSampleOption: LogsSampleOptions =\n options?.type === SupplementaryQueryType.LogsSample ? options : { type };\n return this.getLogsSampleDataProvider(request, logsSampleOption);\n default:\n return undefined;\n }\n }\n\n /**\n * Implemented for DataSourceWithSupplementaryQueriesSupport.\n * It returns the supplementary types that the data source supports.\n * @returns An array of supported supplementary query types.\n */\n getSupportedSupplementaryQueryTypes(): SupplementaryQueryType[] {\n return [SupplementaryQueryType.LogsVolume, SupplementaryQueryType.LogsSample];\n }\n\n /**\n * Implemented for DataSourceWithSupplementaryQueriesSupport.\n * It retrieves supplementary queries based on the provided options and Loki query.\n * @returns A supplemented Loki query or undefined if unsupported.\n */\n getSupplementaryQuery(options: SupplementaryQueryOptions, query: LokiQuery): LokiQuery | undefined {\n if (query.hide) {\n return undefined;\n }\n\n const normalizedQuery = getNormalizedLokiQuery(query);\n let expr = removeCommentsFromQuery(normalizedQuery.expr);\n let isQuerySuitable = false;\n\n switch (options.type) {\n case SupplementaryQueryType.LogsVolume:\n // it has to be a logs-producing range-query\n isQuerySuitable = !!(expr && isLogsQuery(expr) && normalizedQuery.queryType === LokiQueryType.Range);\n if (!isQuerySuitable) {\n return undefined;\n }\n\n const dropErrorExpression = `${expr} | drop __error__`;\n const field = options.field || 'level, detected_level';\n if (isQueryWithError(this.interpolateString(dropErrorExpression, placeHolderScopedVars)) === false) {\n expr = dropErrorExpression;\n }\n\n return {\n ...normalizedQuery,\n refId: `${REF_ID_STARTER_LOG_VOLUME}${normalizedQuery.refId}`,\n queryType: LokiQueryType.Range,\n supportingQueryType: SupportingQueryType.LogsVolume,\n expr: `sum by (${field}) (count_over_time(${expr}[$__auto]))`,\n };\n\n case SupplementaryQueryType.LogsSample:\n // it has to be a metric query\n isQuerySuitable = !!(expr && !isLogsQuery(expr));\n if (!isQuerySuitable) {\n return undefined;\n }\n return {\n ...normalizedQuery,\n queryType: LokiQueryType.Range,\n refId: `${REF_ID_STARTER_LOG_SAMPLE}${normalizedQuery.refId}`,\n expr: getLogQueryFromMetricsQuery(expr),\n maxLines: Number.isNaN(Number(options.limit)) ? this.maxLines : Number(options.limit),\n supportingQueryType: SupportingQueryType.LogsSample,\n };\n\n default:\n return undefined;\n }\n }\n\n /**\n * Private method used in the `getDataProvider` for DataSourceWithSupplementaryQueriesSupport, specifically for Logs volume queries.\n * @returns A DataQueryRequest or undefined if no suitable queries are found.\n */\n private getLogsVolumeDataProvider(\n request: DataQueryRequest<LokiQuery>,\n options: LogsVolumeOption\n ): DataQueryRequest<LokiQuery> | undefined {\n const logsVolumeRequest = cloneDeep(request);\n const targets = logsVolumeRequest.targets\n .map((query) => this.getSupplementaryQuery(options, query))\n .filter((query): query is LokiQuery => !!query);\n\n if (!targets.length) {\n return undefined;\n }\n\n return { ...logsVolumeRequest, targets };\n }\n\n /**\n * Private method used in the `getDataProvider` for DataSourceWithSupplementaryQueriesSupport, specifically for Logs sample queries.\n * @returns A DataQueryRequest or undefined if no suitable queries are found.\n */\n private getLogsSampleDataProvider(\n request: DataQueryRequest<LokiQuery>,\n options?: LogsSampleOptions\n ): DataQueryRequest<LokiQuery> | undefined {\n const logsSampleRequest = cloneDeep(request);\n const targets = logsSampleRequest.targets\n .map((query) => this.getSupplementaryQuery({ type: SupplementaryQueryType.LogsSample, limit: 100 }, query))\n .filter((query): query is LokiQuery => !!query);\n\n if (!targets.length) {\n return undefined;\n }\n return { ...logsSampleRequest, targets };\n }\n\n /**\n * Required by DataSourceApi. It executes queries based on the provided DataQueryRequest.\n * @returns An Observable of DataQueryResponse containing the query results.\n */\n query(request: DataQueryRequest<LokiQuery>): Observable<DataQueryResponse> {\n const queries = request.targets\n .map(getNormalizedLokiQuery) // used to \"fix\" the deprecated `.queryType` prop\n .map((q) => ({\n ...q,\n maxLines: q.maxLines ?? this.maxLines,\n scopes:\n config.featureToggles.scopeFilters && config.featureToggles.logQLScope\n ? request.scopes?.flatMap((scope) => scope.spec.filters)\n : undefined,\n }));\n\n const fixedRequest: DataQueryRequest<LokiQuery> = {\n ...request,\n targets: queries,\n };\n\n const streamQueries = fixedRequest.targets.filter((q) => q.queryType === LokiQueryType.Stream);\n if (\n config.featureToggles.lokiExperimentalStreaming &&\n streamQueries.length > 0 &&\n fixedRequest.rangeRaw?.to === 'now'\n ) {\n // this is still an in-development feature,\n // we do not support mixing stream-queries with normal-queries for now.\n const streamRequest = {\n ...fixedRequest,\n targets: streamQueries,\n };\n return merge(\n ...streamQueries.map((q) =>\n doLokiChannelStream(\n this.applyTemplateVariables(q, request.scopedVars, request.filters),\n this, // the datasource\n streamRequest\n )\n )\n );\n }\n\n if (fixedRequest.liveStreaming) {\n return this.runLiveQueryThroughBackend(fixedRequest);\n }\n\n if (config.featureToggles.lokiShardSplitting && requestSupportsSharding(fixedRequest.targets)) {\n return runShardSplitQuery(this, fixedRequest);\n } else if (config.featureToggles.lokiQuerySplitting && requestSupportsSplitting(fixedRequest.targets)) {\n return runSplitQuery(this, fixedRequest);\n }\n\n const startTime = new Date();\n return this.runQuery(fixedRequest).pipe(tap((response) => trackQuery(response, fixedRequest, startTime)));\n }\n\n /**\n * Executes requests through the backend using the `super.query()`, as part of the `query` method in DataSourceWithBackend.\n * @returns An Observable of transformed DataQueryResponse results from the backend.\n */\n runQuery(fixedRequest: DataQueryRequest<LokiQuery>) {\n return super\n .query(fixedRequest)\n .pipe(\n map((response) =>\n transformBackendResult(response, fixedRequest.targets, this.instanceSettings.jsonData.derivedFields ?? [])\n )\n );\n }\n\n /**\n * Used within the `query` to execute live queries.\n * It is intended for logs-queries, not metric queries.\n * @returns An Observable of DataQueryResponse with live query results or an empty response if no suitable queries are found.\n * @todo: The name says \"backend\" but it's actually running the query through the frontend. We should fix this.\n */\n private runLiveQueryThroughBackend(request: DataQueryRequest<LokiQuery>): Observable<DataQueryResponse> {\n // and only for logs-queries, not metric queries\n const logsQueries = request.targets.filter((query) => query.expr !== '' && isLogsQuery(query.expr));\n if (logsQueries.length === 0) {\n return of({\n data: [],\n state: LoadingState.Done,\n });\n }\n\n const subQueries = logsQueries.map((query) => {\n const interpolatedQuery = this.applyTemplateVariables(query, request.scopedVars, request.filters);\n const maxDataPoints = interpolatedQuery.maxLines || this.maxLines;\n // FIXME: currently we are running it through the frontend still.\n return this.runLiveQuery(interpolatedQuery, maxDataPoints);\n });\n\n return merge(...subQueries);\n }\n\n /**\n * Used within the `runLiveQuery` to create a live target for a Loki query.\n * @returns A LokiLiveTarget object containing the necessary information for a live query.\n */\n private createLiveTarget(target: LokiQuery, maxDataPoints: number): LokiLiveTarget {\n const query = target.expr;\n const baseUrl = this.instanceSettings.url;\n const params = urlUtil.serializeParams({ query });\n\n return {\n query,\n url: convertToWebSocketUrl(`${baseUrl}/loki/api/v1/tail?${params}`),\n refId: target.refId,\n size: maxDataPoints,\n };\n }\n\n /**\n * Runs live queries, which involves creating a WebSocket connection to listen for new logs.\n * It returns a slightly different DataQueryResponse compared to runQueries. It provides a single DataFrame\n * even if there are multiple Loki streams. Common labels are set on dataFrame.labels, and unique labels per row are\n * available in dataFrame.fields.labels.\n * @returns An Observable of DataQueryResponse with streaming data or an error message if live tailing encounters an issue.\n */\n private runLiveQuery = (target: LokiQuery, maxDataPoints: number): Observable<DataQueryResponse> => {\n const liveTarget = this.createLiveTarget(target, maxDataPoints);\n\n return this.streams.getStream(liveTarget).pipe(\n map((data) => ({\n data: data || [],\n key: `loki-${liveTarget.refId}`,\n state: LoadingState.Streaming,\n })),\n catchError((err) => {\n return throwError(() => `Live tailing was stopped due to following error: ${err.reason}`);\n })\n );\n };\n\n /**\n * Implemented as a part of DataSourceApi. Interpolates variables and adds ad hoc filters to a list of Loki queries.\n * @returns An array of expanded Loki queries with interpolated variables and ad hoc filters.\n */\n interpolateVariablesInQueries(\n queries: LokiQuery[],\n scopedVars: ScopedVars,\n adhocFilters?: AdHocVariableFilter[]\n ): LokiQuery[] {\n let expandedQueries = queries;\n if (queries && queries.length) {\n expandedQueries = queries.map((query) => ({\n ...query,\n datasource: this.getRef(),\n expr: this.addAdHocFilters(\n this.templateSrv.replace(query.expr, scopedVars, this.interpolateQueryExpr),\n adhocFilters\n ),\n }));\n }\n\n return expandedQueries;\n }\n\n /**\n * Implemented as part of DataSourceApi. Converts a Loki query to a simple text string.\n * Used, for example, in Query history.\n * @returns A text representation of the query.\n */\n getQueryDisplayText(query: LokiQuery) {\n return query.expr;\n }\n\n /**\n * Given a time range, returns it as Loki parameters.\n * @returns An object containing the start and end times in nanoseconds since the Unix epoch.\n */\n getTimeRangeParams(timeRange: TimeRange) {\n return { start: timeRange.from.valueOf() * NS_IN_MS, end: timeRange.to.valueOf() * NS_IN_MS };\n }\n\n /**\n * Implemented as part of DataSourceWithQueryImportSupport.\n * Imports queries from AbstractQuery objects when switching between different data source types.\n * @returns A Promise that resolves to an array of Loki queries.\n */\n async importFromAbstractQueries(abstractQueries: AbstractQuery[]): Promise<LokiQuery[]> {\n await this.languageProvider.start();\n const existingKeys = this.languageProvider.labelKeys;\n\n if (existingKeys && existingKeys.length) {\n abstractQueries = abstractQueries.map((abstractQuery) => {\n abstractQuery.labelMatchers = abstractQuery.labelMatchers.filter((labelMatcher) => {\n return existingKeys.includes(labelMatcher.name);\n });\n return abstractQuery;\n });\n }\n\n return abstractQueries.map((abstractQuery) => this.languageProvider.importFromAbstractQuery(abstractQuery));\n }\n\n /**\n * Implemented as part of DataSourceWithQueryImportSupport.\n * Exports Loki queries to AbstractQuery objects when switching between different data source types.\n * @returns A Promise that resolves to an array of AbstractQuery objects.\n */\n async exportToAbstractQueries(queries: LokiQuery[]): Promise<AbstractQuery[]> {\n return queries.map((query) => this.languageProvider.exportToAbstractQuery(query));\n }\n\n /**\n * A method that wraps `getResource` from DataSourceWithBackend to perform metadata requests, with an additional check for valid URL values.\n * @returns A Promise that resolves to the data retrieved from the metadata request, or an empty array if no data is available.\n */\n async metadataRequest(url: string, params?: Record<string, string | number>, options?: Partial<BackendSrvRequest>) {\n // url must not start with a `/`, otherwise the AJAX-request\n // going from the browser will contain `//`, which can cause problems.\n if (url.startsWith('/')) {\n throw new Error(`invalid metadata request url: ${url}`);\n }\n\n const res = await this.getResource(url, params, options);\n\n // detected_field/${label}/values has different structure then other metadata responses\n if (!res.data && res.values) {\n return res.values ?? [];\n }\n\n // detected_fields has a different return structure then other metadata responses\n if (!res.data && res.fields) {\n return res.fields ?? [];\n }\n return res.data ?? [];\n }\n\n /**\n * Used in `getQueryStats`. It wraps `getResource` from DataSourceWithBackend to perform a stats request\n * Specifically designed for the stats endpoint, which does not return data but includes stats directly in the response object.\n * @returns A Promise that resolves to a QueryStats object containing the statistics retrieved from the stats request.\n */\n async statsMetadataRequest(\n url: string,\n params?: Record<string, string | number>,\n options?: Partial<BackendSrvRequest>\n ): Promise<QueryStats> {\n if (url.startsWith('/')) {\n throw new Error(`invalid metadata request url: ${url}`);\n }\n\n return await this.getResource(url, params, options);\n }\n\n /**\n * Used in `getStats`. Retrieves statistics for a Loki query and processes them into a QueryStats object.\n * @returns A Promise that resolves to a QueryStats object containing the query statistics or undefined if the query is invalid.\n */\n async getQueryStats(query: LokiQuery, timeRange: TimeRange): Promise<QueryStats | undefined> {\n // if query is invalid, clear stats, and don't request\n if (isQueryWithError(this.interpolateString(query.expr, placeHolderScopedVars))) {\n return undefined;\n }\n\n const labelMatchers = getStreamSelectorsFromQuery(query.expr);\n let statsForAll: QueryStats = { streams: 0, chunks: 0, bytes: 0, entries: 0 };\n\n for (const idx in labelMatchers) {\n const { start, end } = this.getStatsTimeRange(query, Number(idx), timeRange);\n\n if (start === undefined || end === undefined) {\n return { streams: 0, chunks: 0, bytes: 0, entries: 0, message: 'Query size estimate not available.' };\n }\n\n try {\n const data = await this.statsMetadataRequest(\n 'index/stats',\n {\n query: labelMatchers[idx],\n start: start,\n end: end,\n },\n { showErrorAlert: false, requestId: `${REF_ID_STARTER_STATS}${query.refId}` }\n );\n\n statsForAll = {\n streams: statsForAll.streams + data.streams,\n chunks: statsForAll.chunks + data.chunks,\n bytes: statsForAll.bytes + data.bytes,\n entries: statsForAll.entries + data.entries,\n };\n } catch (e) {\n break;\n }\n }\n\n return statsForAll;\n }\n\n /**\n * Used within the `getQueryStats`. Retrieves the time range for a Loki stats query, adjusting it to cover the requested period.\n * In metric queries, this means extending it over the range interval.\n * @returns An object containing the start and end time in nanoseconds (NS_IN_MS) or undefined if the time range cannot be estimated.\n */\n\n getStatsTimeRange(\n query: LokiQuery,\n idx: number,\n timeRange: TimeRange\n ): { start: number | undefined; end: number | undefined } {\n let start: number, end: number;\n const NS_IN_MS = 1000000;\n const durationNodes = getNodesFromQuery(query.expr, [Duration]);\n const durations = durationNodes.map((d) => query.expr.substring(d.from, d.to));\n\n if (isLogsQuery(query.expr)) {\n // logs query with instant type can not be estimated\n if (query.queryType === LokiQueryType.Instant) {\n return { start: undefined, end: undefined };\n }\n // logs query with range type\n return this.getTimeRangeParams(timeRange);\n }\n\n if (query.queryType === LokiQueryType.Instant) {\n // metric query with instant type\n\n if (!!durations[idx]) {\n // if query has a duration e.g. [1m]\n end = this.getTimeRangeParams(timeRange).end;\n start = end - rangeUtil.intervalToMs(durations[idx]) * NS_IN_MS;\n return { start, end };\n } else {\n // if query has no duration e.g. [$__interval]\n\n if (/(\\$__auto|\\$__range)/.test(query.expr)) {\n // if $__auto or $__range is used, we can estimate the time range using the selected range\n return this.getTimeRangeParams(timeRange);\n }\n\n // otherwise we cant estimate the time range\n return { start: undefined, end: undefined };\n }\n }\n\n // metric query with range type\n return this.getTimeRangeParams(timeRange);\n }\n\n /**\n * Retrieves statistics for a Loki query and returns the QueryStats object.\n * @returns A Promise that resolves to a QueryStats object or null if the query is invalid or has no statistics.\n */\n async getStats(query: LokiQuery, timeRange: TimeRange): Promise<QueryStats | null> {\n if (!query.expr) {\n return null;\n }\n\n const response = await this.getQueryStats(query, timeRange);\n\n if (!response) {\n return null;\n }\n\n return Object.values(response).every((v) => v === 0) ? null : response;\n }\n\n /**\n * Implemented as part of DataSourceAPI and used for template variable queries.\n * @returns A Promise that resolves to an array of results from the metric find query.\n */\n async metricFindQuery(\n query: LokiVariableQuery | string,\n options?: LegacyMetricFindQueryOptions\n ): Promise<MetricFindValue[]> {\n if (!query) {\n return Promise.resolve([]);\n }\n\n let interpolatedVariableQuery: LokiVariableQuery | undefined;\n\n if (typeof query === 'string') {\n interpolatedVariableQuery = this.parseStringToVariableQuery(this.interpolateString(query, options?.scopedVars));\n } else {\n interpolatedVariableQuery = {\n ...query,\n label: this.interpolateString(query.label || '', options?.scopedVars),\n stream: this.interpolateString(query.stream || '', options?.scopedVars),\n };\n }\n\n if (interpolatedVariableQuery) {\n return await this.processMetricFindQuery(interpolatedVariableQuery, options?.range);\n }\n\n return Promise.resolve([]);\n }\n\n /**\n * Used within the `metricFindQuery`. Retrieves the correct variable results based on the provided LokiVariableQuery.\n * @returns A Promise that resolves to an array of variable results based on the query type and parameters.\n */\n\n private async processMetricFindQuery(query: LokiVariableQuery, timeRange?: TimeRange): Promise<MetricFindValue[]> {\n if (query.type === LokiVariableQueryType.LabelNames) {\n const result = await this.languageProvider.fetchLabels({ timeRange });\n return result.map((value: string) => ({ text: value }));\n }\n\n if (!query.label) {\n return [];\n }\n\n const result = await this.languageProvider.fetchLabelValues(query.label, {\n streamSelector: query.stream,\n timeRange,\n });\n return result.map((value: string) => ({ text: value }));\n }\n\n /**\n * Used in `metricFindQuery` to process legacy query strings (label_name() and label_values()) to variable query objects.\n * @returns LokiVariableQuery object based on the provided query string, or undefined if string can't be parsed.\n */\n private parseStringToVariableQuery(query: string): LokiVariableQuery | undefined {\n const refId = 'LokiVariableQueryEditor-VariableQuery';\n const labelNames = query.match(labelNamesRegex);\n if (labelNames) {\n return {\n type: LokiVariableQueryType.LabelNames,\n refId,\n };\n }\n\n const labelValues = query.match(labelValuesRegex);\n if (labelValues) {\n return {\n type: LokiVariableQueryType.LabelValues,\n label: labelValues[2],\n stream: labelValues[1],\n refId,\n };\n }\n return undefined;\n }\n\n /**\n * Used to fetch data samples, typically for autocompletion and query building to recommend parsers, labels, and values based on sampled data.\n * Currently, it works for logs data only.\n * @returns A Promise that resolves to an array of DataFrames containing data samples.\n */\n async getDataSamples(\n query: LokiQuery,\n timeRange: TimeRange,\n options?: { convertMetricQueryToLogQuery?: boolean }\n ): Promise<DataFrame[]> {\n let queryExpr = query.expr;\n if (isQueryWithError(this.interpolateString(queryExpr, placeHolderScopedVars))) {\n return [];\n }\n\n if (!isLogsQuery(queryExpr)) {\n // If it is not a logs query, we need to check if we need to convert it to a logs query\n if (options?.convertMetricQueryToLogQuery) {\n queryExpr = getLogQueryFromMetricsQuery(queryExpr);\n } else {\n // Otherwise, we return an empty array, as data samples are only supported for logs queries\n return [];\n }\n }\n\n const lokiLogsQuery: LokiQuery = {\n expr: queryExpr,\n queryType: LokiQueryType.Range,\n refId: REF_ID_DATA_SAMPLES,\n maxLines: query.maxLines || DEFAULT_MAX_LINES_SAMPLE,\n supportingQueryType: SupportingQueryType.DataSample,\n };\n\n const request = makeRequest(lokiLogsQuery, timeRange, CoreApp.Unknown, REF_ID_DATA_SAMPLES, true);\n return await lastValueFrom(this.query(request).pipe(switchMap((res) => of(res.data))));\n }\n\n /**\n * Implemented as part of the DataSourceAPI. Retrieves tag keys that can be used for ad-hoc filtering.\n * @returns A Promise that resolves to an array of label names represented as MetricFindValue objects.\n */\n async getTagKeys(options?: DataSourceGetTagKeysOptions<LokiQuery>): Promise<MetricFindValue[]> {\n let streamSelector = '{}';\n for (const filter of options?.filters ?? []) {\n streamSelector = addLabelToQuery(streamSelector, filter.key, filter.operator, filter.value);\n }\n const result = await this.languageProvider.fetchLabels({ timeRange: options?.timeRange, streamSelector });\n return result.map((value: string) => ({ text: value }));\n }\n\n /**\n * Implemented as part of the DataSourceAPI. Retrieves tag values that can be used for ad-hoc filtering.\n * @returns A Promise that resolves to an array of label values represented as MetricFindValue objects\n */\n async getTagValues(options: DataSourceGetTagValuesOptions<LokiQuery>): Promise<MetricFindValue[]> {\n let streamSelector = '{}';\n for (const filter of options?.filters ?? []) {\n streamSelector = addLabelToQuery(streamSelector, filter.key, filter.operator, filter.value);\n }\n const result = await this.languageProvider.fetchLabelValues(options.key, {\n timeRange: options.timeRange,\n streamSelector,\n });\n return result.map((value: string) => ({ text: value }));\n }\n\n /**\n * Used for interpolation logic in `interpolateVariablesInQueries` and `applyTemplateVariables`.\n * Handles escaping of special characters based on variable type and value.\n * @returns The interpolated value with appropriate character escaping.\n */\n interpolateQueryExpr(value: any, variable: QueryVariableModel | CustomVariableModel) {\n // if no multi or include all do not regexEscape\n if (!variable.multi && !variable.includeAll) {\n return value;\n }\n\n if (typeof value === 'string') {\n return lokiSpecialRegexEscape(value);\n }\n\n const escapedValues = lodashMap(value, lokiSpecialRegexEscape);\n return escapedValues.join('|');\n }\n\n /**\n * Implemented for `DataSourceWithToggleableQueryFiltersSupport`. Toggles a filter on or off based on the provided filter action.\n * It is used for example in Explore to toggle fields on and off trough log details.\n * @returns A new LokiQuery with the filter toggled as specified.\n */\n toggleQueryFilter(query: LokiQuery, filter: ToggleFilterAction): LokiQuery {\n let expression = query.expr ?? '';\n const labelType = getLabelTypeFromFrame(filter.options.key, filter.frame, 0);\n switch (filter.type) {\n case 'FILTER_FOR': {\n if (filter.options?.key && filter.options?.value) {\n const value = escapeLabelValueInSelector(filter.options.value);\n\n // This gives the user the ability to toggle a filter on and off.\n expression = queryHasFilter(expression, filter.options.key, '=', value)\n ? removeLabelFromQuery(expression, filter.options.key, '=', value)\n : addLabelToQuery(expression, filter.options.key, '=', value, labelType);\n }\n break;\n }\n case 'FILTER_OUT': {\n if (filter.options?.key && filter.options?.value) {\n const value = escapeLabelValueInSelector(filter.options.value);\n\n /**\n * If there is a filter with the same key and value, remove it.\n * This prevents the user from seeing no changes in the query when they apply\n * this filter.\n */\n if (queryHasFilter(expression, filter.options.key, '=', value)) {\n expression = removeLabelFromQuery(expression, filter.options.key, '=', value);\n }\n\n expression = addLabelToQuery(expression, filter.options.key, '!=', value, labelType);\n }\n break;\n }\n default:\n break;\n }\n return { ...query, expr: expression };\n }\n\n /**\n * Implemented for `DataSourceWithToggleableQueryFiltersSupport`. Checks if a query expression contains a filter based on the provided filter options.\n * @returns A boolean value indicating whether the filter exists in the query expression.\n */\n queryHasFilter(query: LokiQuery, filter: QueryFilterOptions): boolean {\n let expression = query.expr ?? '';\n return queryHasFilter(expression, filter.key, '=', filter.value);\n }\n\n /**\n * Implemented as part of `DataSourceWithQueryModificationSupport`. Used to modify a query based on the provided action.\n * It is used, for example, in the Query Builder to apply hints such as parsers, operations, etc.\n * @returns A new LokiQuery with the specified modification applied.\n */\n modifyQuery(query: LokiQuery, action: QueryFixAction): LokiQuery {\n let expression = query.expr ?? '';\n // NB: Usually the labelKeys should be fetched and cached in the datasource,\n // but there might be some edge cases where this wouldn't be the case.\n // However the changed would make this method `async`.\n switch (action.type) {\n case 'ADD_FILTER': {\n if (action.options?.key && action.options?.value) {\n const labelType = getLabelTypeFromFrame(action.options.key, action.frame, 0);\n const value = escapeLabelValueInSelector(action.options.value);\n expression = addLabelToQuery(expression, action.options.key, '=', value, labelType);\n }\n break;\n }\n case 'ADD_FILTER_OUT': {\n if (action.options?.key && action.options?.value) {\n const labelType = getLabelTypeFromFrame(action.options.key, action.frame, 0);\n const value = escapeLabelValueInSelector(action.options.value);\n expression = addLabelToQuery(expression, action.options.key, '!=', value, labelType);\n }\n break;\n }\n case 'ADD_LOGFMT_PARSER': {\n expression = addParserToQuery(expression, 'logfmt');\n break;\n }\n case 'ADD_JSON_PARSER': {\n expression = addParserToQuery(expression, 'json');\n break;\n }\n case 'ADD_UNPACK_PARSER': {\n expression = addParserToQuery(expression, 'unpack');\n break;\n }\n case 'ADD_NO_PIPELINE_ERROR': {\n expression = addNoPipelineErrorToQuery(expression);\n break;\n }\n case 'ADD_LEVEL_LABEL_FORMAT': {\n if (action.options?.originalLabel && action.options?.renameTo) {\n expression = addLabelFormatToQuery(expression, {\n renameTo: action.options.renameTo,\n originalLabel: action.options.originalLabel,\n });\n }\n break;\n }\n case 'ADD_LABEL_FILTER': {\n const parserPositions = getParserPositions(query.expr);\n const labelFilterPositions = getLabelFilterPositions(query.expr);\n const lastPosition = findLastPosition([...parserPositions, ...labelFilterPositions]);\n const filter = toLabelFilter('', '', '=');\n expression = addFilterAsLabelFilter(expression, [lastPosition], filter);\n break;\n }\n case 'ADD_STRING_FILTER':\n case 'ADD_LINE_FILTER': {\n expression = addLineFilter(expression, action.options?.value);\n break;\n }\n case 'ADD_STRING_FILTER_OUT':\n case 'ADD_LINE_FILTER_OUT': {\n expression = addLineFilter(expression, action.options?.value, '!=');\n break;\n }\n default:\n break;\n }\n return { ...query, expr: expression };\n }\n\n /**\n * Implemented as part of `DataSourceWithQueryModificationSupport`. Returns a list of operation\n * types that are supported by `modifyQuery()`.\n */\n getSupportedQueryModifications() {\n return [\n 'ADD_FILTER',\n 'ADD_FILTER_OUT',\n 'ADD_LOGFMT_PARSER',\n 'ADD_JSON_PARSER',\n 'ADD_UNPACK_PARSER',\n 'ADD_NO_PIPELINE_ERROR',\n 'ADD_LEVEL_LABEL_FORMAT',\n 'ADD_LABEL_FILTER',\n 'ADD_STRING_FILTER',\n 'ADD_STRING_FILTER_OUT',\n ];\n }\n\n /**\n * Part of `DataSourceWithLogsContextSupport`, used to retrieve log context for a log row.\n * @returns A promise that resolves to an object containing the log context data as DataFrames.\n */\n getLogRowContext = async (\n row: LogRowModel,\n options?: LogRowContextOptions,\n origQuery?: DataQuery\n ): Promise<{ data: DataFrame[] }> => {\n return await this.logContextProvider.getLogRowContext(row, options, getLokiQueryFromDataQuery(origQuery));\n };\n /**\n * Part of `DataSourceWithLogsContextSupport`, used to retrieve the log context query for the provided log row and original query.\n * @returns A promise that resolves to a DataQuery representing the log context query.\n */\n getLogRowContextQuery = async (\n row: LogRowModel,\n options?: LogRowContextOptions,\n origQuery?: DataQuery,\n cacheFilters?: boolean\n ): Promise<DataQuery> => {\n return await this.logContextProvider.getLogRowContextQuery(\n row,\n options,\n getLokiQueryFromDataQuery(origQuery),\n cacheFilters\n );\n };\n\n /**\n * Part of `DataSourceWithLogsContextSupport`, used to retrieve the log context UI for the provided log row and original query.\n * @returns A React component or element representing the log context UI for the log row.\n */\n getLogRowContextUi(\n row: LogRowModel,\n runContextQuery: () => void,\n origQuery: DataQuery,\n scopedVars?: ScopedVars\n ): React.ReactNode {\n return this.logContextProvider.getLogRowContextUi(\n row,\n runContextQuery,\n getLokiQueryFromDataQuery(origQuery),\n scopedVars\n );\n }\n\n /**\n * Implemented as part of the DataSourceAPI. It allows the datasource to serve as a source of annotations for a dashboard.\n * @returns A promise that resolves to an array of AnnotationEvent objects representing the annotations for the dashboard.\n * @todo This is deprecated and it is recommended to use the `AnnotationSupport` feature for annotations.\n */\n async annotationQuery(options: any): Promise<AnnotationEvent[]> {\n const { expr, maxLines, instant, tagKeys = '', titleFormat = '', textFormat = '' } = options.annotation;\n\n if (!expr) {\n return [];\n }\n\n const id = `${REF_ID_STARTER_ANNOTATION}${options.annotation.name}`;\n\n const query: LokiQuery = {\n refId: id,\n expr,\n maxLines,\n instant,\n queryType: instant ? LokiQueryType.Instant : LokiQueryType.Range,\n };\n\n const request = makeRequest(query, options.range, CoreApp.Dashboard, id);\n\n const { data } = await lastValueFrom(this.query(request));\n\n const annotations: AnnotationEvent[] = [];\n const splitKeys: string[] = tagKeys.split(',').filter((v: string) => v !== '');\n\n const isDataplaneLog = config.featureToggles.lokiLogsDataplane;\n\n for (const frame of data) {\n const view = new DataFrameView<{ timestamp: string; Time: string; body: string; Line: string; labels: Labels }>(\n frame\n );\n\n view.forEach((row) => {\n const { labels } = row;\n\n const maybeDuplicatedTags = Object.entries(labels)\n .map(([key, val]) => [key, val.trim()]) // trim all label-values\n .filter(([key, val]) => {\n if (val === '') {\n // remove empty\n return false;\n }\n\n // if tags are specified, remove label if does not match tags\n if (splitKeys.length && !splitKeys.includes(key)) {\n return false;\n }\n\n return true;\n })\n .map(([_, val]) => val); // keep only the label-value\n\n // remove duplicates\n const tags = Array.from(new Set(maybeDuplicatedTags));\n\n const logLine = isDataplaneLog ? row.body : row.Line;\n\n annotations.push({\n time: isDataplaneLog ? new Date(row.timestamp).valueOf() : new Date(row.Time).valueOf(),\n title: renderLegendFormat(titleFormat, labels),\n text: renderLegendFormat(textFormat, labels) || logLine,\n tags,\n });\n });\n }\n\n return annotations;\n }\n\n /**\n * Adds ad hoc filters to a query expression, handling proper escaping of filter values.\n * @returns The query expression with ad hoc filters and correctly escaped values.\n * @todo this.templateSrv.getAdhocFilters() is deprecated\n */\n addAdHocFilters(queryExpr: string, adhocFilters?: AdHocVariableFilter[]) {\n if (!adhocFilters?.length) {\n return queryExpr;\n }\n\n let expr = replaceVariables(queryExpr);\n\n expr = adhocFilters.reduce((acc: string, filter: { key: string; operator: string; value: string }) => {\n const { key, operator } = filter;\n let { value } = filter;\n if (!isRegexSelector(operator)) {\n // We want to escape special characters in value for non-regex selectors to match the same char in the log line as the user types in the input\n value = escapeLabelValueInSelector(value, operator);\n }\n return addLabelToQuery(acc, key, operator, value);\n }, expr);\n\n return returnVariables(expr);\n }\n\n /**\n * Filters out queries that are empty or hidden. Used when running queries through backend.\n * It is called from DatasourceWithBackend.\n * @returns `true` if the query is not hidden and its expression is not empty; `false` otherwise.\n */\n filterQuery(query: LokiQuery): boolean {\n if (query.hide || query.expr === '') {\n return false;\n }\n return true;\n }\n\n /**\n * Applies template variables and add hoc filters to a query. Used when running queries through backend.\n * It is called from DatasourceWithBackend.\n * @returns A modified Loki query with template variables and ad hoc filters applied.\n */\n applyTemplateVariables(target: LokiQuery, scopedVars: ScopedVars, adhocFilters?: AdHocVariableFilter[]): LokiQuery {\n // We want to interpolate these variables on backend because we support using them in\n // alerting/ML queries and we want to have consistent interpolation for all queries\n const { __auto, __interval, __interval_ms, __range, __range_s, __range_ms, ...rest } = scopedVars || {};\n\n const variables = {\n ...rest,\n\n // pass through for backend interpolation. Need to be in scopedVars for Scenes though\n __interval: {\n value: '$__interval',\n },\n __interval_ms: {\n value: '$__interval_ms',\n },\n };\n\n const exprWithAdHoc = this.addAdHocFilters(\n this.templateSrv.replace(target.expr, variables, this.interpolateQueryExpr),\n adhocFilters\n );\n\n const step = this.templateSrv.replace(target.step, variables);\n const legendFormat = this.templateSrv.replace(target.legendFormat, variables);\n\n return {\n ...target,\n expr: exprWithAdHoc,\n step,\n legendFormat,\n };\n }\n\n /**\n * Interpolates template variables in a given string. Template variables are passed trough scopedVars.\n * @returns The string with template variables replaced by their values.\n */\n interpolateString(string: string, scopedVars?: ScopedVars) {\n return this.templateSrv.replace(string, scopedVars, this.interpolateQueryExpr);\n }\n\n /**\n * Retrieves and returns a list of variable names used in the template service.\n * Used for example in the Query Builder to populate the variable dropdown with template variables.\n * @returns An array of variable names, each prefixed with '$'.\n */\n getVariables(): string[] {\n return this.templateSrv.getVariables().map((v) => `$${v.name}`);\n }\n /**\n * Retrieves query hints for query improvements based on a Loki query and its result data.\n * Used in Query builder to provide hints for query improvements, such as adding a parser, etc.\n * @returns An array of query hints for potential query improvements.\n */\n getQueryHints(query: LokiQuery, result: DataFrame[]): QueryHint[] {\n return getQueryHints(query.expr, result);\n }\n\n /**\n * Get a default LokiQuery based on the specified app. Currently used in UnifiedAlerting.\n * @returns A default LokiQuery object with appropriate settings for the given application.\n */\n getDefaultQuery(app: CoreApp): LokiQuery {\n const defaults = { refId: 'A', expr: '' };\n\n if (app === CoreApp.UnifiedAlerting) {\n return {\n ...defaults,\n queryType: LokiQueryType.Instant,\n };\n }\n\n return {\n ...defaults,\n queryType: LokiQueryType.Range,\n };\n }\n}\nexport function lokiSpecialRegexEscape<T>(value: T) {\n if (typeof value === 'string') {\n return value.replace(/\\\\/g, '\\\\\\\\\\\\\\\\').replace(/[$^*{}\\[\\]+?.()|]/g, '\\\\\\\\$&');\n }\n return value;\n}\n","import { CoreApp, DashboardLoadedEvent, DataQueryRequest, DataQueryResponse } from '@grafana/data';\nimport { QueryEditorMode } from '@grafana/plugin-ui';\nimport { reportInteraction, config } from '@grafana/runtime';\n\nimport {\n REF_ID_STARTER_ANNOTATION,\n REF_ID_DATA_SAMPLES,\n REF_ID_STARTER_LOG_ROW_CONTEXT,\n REF_ID_STARTER_LOG_VOLUME,\n REF_ID_STARTER_LOG_SAMPLE,\n} from './datasource';\nimport pluginJson from './plugin.json';\nimport { getNormalizedLokiQuery, isLogsQuery, obfuscate } from './queryUtils';\nimport { variableRegex } from './querybuilder/parsingUtils';\nimport { LokiGroupedRequest, LokiQuery, LokiQueryType } from './types';\n\ntype LokiOnDashboardLoadedTrackingEvent = {\n grafana_version?: string;\n dashboard_id?: string;\n org_id?: number;\n\n /* The number of Loki queries present in the dashboard*/\n queries_count: number;\n\n /* The number of Loki logs queries present in the dashboard*/\n logs_queries_count: number;\n\n /* The number of Loki metric queries present in the dashboard*/\n metric_queries_count: number;\n\n /* The number of Loki instant queries present in the dashboard*/\n instant_queries_count: number;\n\n /* The number of Loki range queries present in the dashboard*/\n range_queries_count: number;\n\n /* The number of Loki queries created in builder mode present in the dashboard*/\n builder_mode_queries_count: number;\n\n /* The number of Loki queries created in code mode present in the dashboard*/\n code_mode_queries_count: number;\n\n /* The number of Loki queries with used template variables present in the dashboard*/\n queries_with_template_variables_count: number;\n\n /* The number of Loki queries with changed resolution present in the dashboard*/\n queries_with_changed_resolution_count: number;\n\n /* The number of Loki queries with changed line limit present in the dashboard*/\n queries_with_changed_line_limit_count: number;\n\n /* The number of Loki queries with changed legend present in the dashboard*/\n queries_with_changed_legend_count: number;\n};\n\nexport const onDashboardLoadedHandler = ({\n payload: { dashboardId, orgId, grafanaVersion, queries },\n}: DashboardLoadedEvent<LokiQuery>) => {\n try {\n // We only want to track visible Loki queries\n const lokiQueries = queries[pluginJson.id]\n ?.filter((query) => !query.hide)\n ?.map((query) => getNormalizedLokiQuery(query));\n\n if (!lokiQueries?.length) {\n return;\n }\n\n const logsQueries = lokiQueries.filter((query) => isLogsQuery(query.expr));\n const metricQueries = lokiQueries.filter((query) => !isLogsQuery(query.expr));\n const instantQueries = lokiQueries.filter((query) => query.queryType === LokiQueryType.Instant);\n const rangeQueries = lokiQueries.filter((query) => query.queryType === LokiQueryType.Range);\n const builderModeQueries = lokiQueries.filter((query) => query.editorMode === QueryEditorMode.Builder);\n const codeModeQueries = lokiQueries.filter((query) => query.editorMode === QueryEditorMode.Code);\n const queriesWithTemplateVariables = lokiQueries.filter(isQueryWithTemplateVariables);\n const queriesWithChangedResolution = lokiQueries.filter(isQueryWithChangedResolution);\n const queriesWithChangedLineLimit = lokiQueries.filter(isQueryWithChangedLineLimit);\n const queriesWithChangedLegend = lokiQueries.filter(isQueryWithChangedLegend);\n\n const event: LokiOnDashboardLoadedTrackingEvent = {\n grafana_version: grafanaVersion,\n dashboard_id: dashboardId,\n org_id: orgId,\n queries_count: lokiQueries.length,\n logs_queries_count: logsQueries.length,\n metric_queries_count: metricQueries.length,\n instant_queries_count: instantQueries.length,\n range_queries_count: rangeQueries.length,\n builder_mode_queries_count: builderModeQueries.length,\n code_mode_queries_count: codeModeQueries.length,\n queries_with_template_variables_count: queriesWithTemplateVariables.length,\n queries_with_changed_resolution_count: queriesWithChangedResolution.length,\n queries_with_changed_line_limit_count: queriesWithChangedLineLimit.length,\n queries_with_changed_legend_count: queriesWithChangedLegend.length,\n };\n\n reportInteraction('grafana_loki_dashboard_loaded', event);\n } catch (error) {\n console.error('error in loki tracking handler', error);\n }\n};\n\nconst isQueryWithTemplateVariables = (query: LokiQuery): boolean => {\n return variableRegex.test(query.expr);\n};\n\nconst isQueryWithChangedResolution = (query: LokiQuery): boolean => {\n if (!query.resolution) {\n return false;\n }\n // 1 is the default resolution\n return query.resolution !== 1;\n};\n\nconst isQueryWithChangedLineLimit = (query: LokiQuery): boolean => {\n return query.maxLines !== null && query.maxLines !== undefined;\n};\n\nconst isQueryWithChangedLegend = (query: LokiQuery): boolean => {\n if (!query.legendFormat) {\n return false;\n }\n return query.legendFormat !== '';\n};\n\nconst shouldNotReportBasedOnRefId = (refId: string): boolean => {\n const starters = [\n REF_ID_STARTER_ANNOTATION,\n REF_ID_STARTER_LOG_ROW_CONTEXT,\n REF_ID_STARTER_LOG_VOLUME,\n REF_ID_STARTER_LOG_SAMPLE,\n REF_ID_DATA_SAMPLES,\n ];\n\n if (starters.some((starter) => refId.startsWith(starter))) {\n return true;\n }\n return false;\n};\n\nconst calculateTotalBytes = (response: DataQueryResponse): number => {\n let totalBytes = 0;\n for (const frame of response.data) {\n const byteKey = frame.meta?.custom?.lokiQueryStatKey;\n if (byteKey) {\n totalBytes +=\n frame.meta?.stats?.find((stat: { displayName: string }) => stat.displayName === byteKey)?.value ?? 0;\n }\n }\n return totalBytes;\n};\n\nexport function trackQuery(\n response: DataQueryResponse,\n request: DataQueryRequest<LokiQuery>,\n startTime: Date,\n extraPayload: Record<string, unknown> = {}\n): void {\n // We only want to track usage for these specific apps\n const { app, targets: queries } = request;\n\n if (app !== CoreApp.Explore) {\n return;\n }\n\n let totalBytes = calculateTotalBytes(response);\n\n for (const query of queries) {\n if (shouldNotReportBasedOnRefId(query.refId)) {\n return;\n }\n\n reportInteraction('grafana_explore_loki_query_executed', {\n grafana_version: config.buildInfo.version,\n editor_mode: query.editorMode,\n has_data: response.data.some((frame) => frame.length > 0),\n has_error: response.error !== undefined,\n legend: query.legendFormat,\n line_limit: query.maxLines,\n obfuscated_query: obfuscate(query.expr),\n query_type: isLogsQuery(query.expr) ? 'logs' : 'metric',\n query_vector_type: query.queryType,\n resolution: query.resolution,\n simultaneously_executed_query_count: queries.filter((query) => !query.hide).length,\n simultaneously_hidden_query_count: queries.filter((query) => query.hide).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 bytes_processed: totalBytes,\n is_split: false,\n ...extraPayload,\n });\n }\n}\n\nexport function trackGroupedQueries(\n response: DataQueryResponse,\n groupedRequests: LokiGroupedRequest[],\n originalRequest: DataQueryRequest<LokiQuery>,\n startTime: Date\n): void {\n const splittingPayload = {\n split_query_group_count: groupedRequests.length,\n split_query_largest_partition_size: Math.max(...groupedRequests.map(({ partition }) => partition.length)),\n split_query_total_request_count: groupedRequests.reduce((total, { partition }) => total + partition.length, 0),\n is_split: true,\n simultaneously_executed_query_count: originalRequest.targets.filter((query) => !query.hide).length,\n simultaneously_hidden_query_count: originalRequest.targets.filter((query) => query.hide).length,\n };\n\n for (const group of groupedRequests) {\n const split_query_partition_size = group.partition.length;\n trackQuery(response, group.request, startTime, {\n ...splittingPayload,\n split_query_partition_size,\n });\n }\n}\n","import { groupBy, partition } from 'lodash';\nimport { Observable, Subscriber, Subscription, tap } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n arrayToDataFrame,\n DataQueryRequest,\n DataQueryResponse,\n DataTopic,\n dateTime,\n rangeUtil,\n TimeRange,\n LoadingState,\n} from '@grafana/data';\n\nimport { LokiDatasource } from './datasource';\nimport { splitTimeRange as splitLogsTimeRange } from './logsTimeSplitting';\nimport { combineResponses } from './mergeResponses';\nimport { splitTimeRange as splitMetricTimeRange } from './metricTimeSplitting';\nimport { isLogsQuery, isQueryWithRangeVariable } from './queryUtils';\nimport { isRetriableError } from './responseUtils';\nimport { trackGroupedQueries } from './tracking';\nimport { LokiGroupedRequest, LokiQuery, LokiQueryDirection, LokiQueryType } from './types';\n\nexport function partitionTimeRange(\n isLogsQuery: boolean,\n originalTimeRange: TimeRange,\n stepMs: number,\n duration: number\n): TimeRange[] {\n const start = originalTimeRange.from.toDate().getTime();\n const end = originalTimeRange.to.toDate().getTime();\n\n const ranges = isLogsQuery\n ? splitLogsTimeRange(start, end, duration)\n : splitMetricTimeRange(start, end, stepMs, duration);\n\n return ranges.map(([start, end]) => {\n const from = dateTime(start);\n const to = dateTime(end);\n return {\n from,\n to,\n raw: { from, to },\n };\n });\n}\n\ninterface QuerySplittingOptions {\n /**\n * Tells the query splitting code to not emit partial updates. Only emit on error or when it finishes querying.\n */\n skipPartialUpdates?: boolean;\n /**\n * Do not retry failed queries.\n */\n disableRetry?: boolean;\n}\n\n/**\n * Based in the state of the current response, if any, adjust target parameters such as `maxLines`.\n * For `maxLines`, we will update it as `maxLines - current amount of lines`.\n * At the end, we will filter the targets that don't need to be executed in the next request batch,\n * becasue, for example, the `maxLines` have been reached.\n */\nexport function adjustTargetsFromResponseState(targets: LokiQuery[], response: DataQueryResponse | null): LokiQuery[] {\n if (!response) {\n return targets;\n }\n\n return targets\n .map((target) => {\n if (!target.maxLines || !isLogsQuery(target.expr)) {\n return target;\n }\n const targetFrame = response.data.find((frame) => frame.refId === target.refId);\n if (!targetFrame) {\n return target;\n }\n const updatedMaxLines = target.maxLines - targetFrame.length;\n return {\n ...target,\n maxLines: updatedMaxLines < 0 ? 0 : updatedMaxLines,\n };\n })\n .filter((target) => target.maxLines === undefined || target.maxLines > 0);\n}\nexport function runSplitGroupedQueries(\n datasource: LokiDatasource,\n requests: LokiGroupedRequest[],\n options: QuerySplittingOptions = {}\n) {\n const responseKey = requests.length ? requests[0].request.queryGroupId : uuidv4();\n let mergedResponse: DataQueryResponse = { data: [], state: LoadingState.Streaming, key: responseKey };\n const totalRequests = Math.max(...requests.map(({ partition }) => partition.length));\n const longestPartition = requests.filter(({ partition }) => partition.length === totalRequests)[0].partition;\n\n let shouldStop = false;\n let subquerySubscription: Subscription | null = null;\n let retriesMap = new Map<string, number>();\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n const runNextRequest = (subscriber: Subscriber<DataQueryResponse>, requestN: number, requestGroup: number) => {\n let retrying = false;\n\n if (subquerySubscription != null) {\n subquerySubscription.unsubscribe();\n subquerySubscription = null;\n }\n\n if (shouldStop) {\n subscriber.complete();\n return;\n }\n\n const done = () => {\n mergedResponse.state = LoadingState.Done;\n subscriber.next(mergedResponse);\n subscriber.complete();\n };\n\n const nextRequest = () => {\n const { nextRequestN, nextRequestGroup } = getNextRequestPointers(requests, requestGroup, requestN);\n if (nextRequestN > 0 && nextRequestGroup >= 0) {\n runNextRequest(subscriber, nextRequestN, nextRequestGroup);\n return;\n }\n done();\n };\n\n const retry = (errorResponse?: DataQueryResponse) => {\n if (options.disableRetry) {\n return false;\n }\n try {\n if (errorResponse && !isRetriableError(errorResponse)) {\n return false;\n }\n } catch (e) {\n console.error(e);\n shouldStop = true;\n return false;\n }\n\n const key = `${requestN}-${requestGroup}`;\n const retries = retriesMap.get(key) ?? 0;\n if (retries > 0) {\n return false;\n }\n\n retriesMap.set(key, retries + 1);\n\n retryTimer = setTimeout(\n () => {\n runNextRequest(subscriber, requestN, requestGroup);\n },\n 1500 * Math.pow(2, retries)\n ); // Exponential backoff\n\n retrying = true;\n\n return true;\n };\n\n const group = requests[requestGroup];\n const range = group.partition[requestN - 1];\n const targets = adjustTargetsFromResponseState(group.request.targets, mergedResponse);\n\n if (!targets.length) {\n nextRequest();\n return;\n }\n\n const subRequest = { ...requests[requestGroup].request, range, targets };\n // request may not have a request id\n if (group.request.requestId) {\n subRequest.requestId = `${group.request.requestId}_${requestN}`;\n }\n\n subquerySubscription = datasource.runQuery(subRequest).subscribe({\n next: (partialResponse) => {\n if ((partialResponse.errors ?? []).length > 0 || partialResponse.error != null) {\n if (retry(partialResponse)) {\n return;\n }\n shouldStop = true;\n }\n mergedResponse = combineResponses(mergedResponse, partialResponse);\n if (!options.skipPartialUpdates) {\n mergedResponse = updateLoadingFrame(mergedResponse, subRequest, longestPartition, requestN);\n }\n },\n complete: () => {\n if (retrying) {\n return;\n }\n if (!options.skipPartialUpdates) {\n subscriber.next(mergedResponse);\n }\n nextRequest();\n },\n error: (error) => {\n subscriber.error(error);\n if (retry()) {\n return;\n }\n },\n });\n };\n\n const response = new Observable<DataQueryResponse>((subscriber) => {\n runNextRequest(subscriber, totalRequests, 0);\n return () => {\n shouldStop = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n if (subquerySubscription != null) {\n subquerySubscription.unsubscribe();\n subquerySubscription = null;\n }\n };\n });\n\n return response;\n}\n\nexport const LOADING_FRAME_NAME = 'loki-splitting-progress';\n\nfunction updateLoadingFrame(\n response: DataQueryResponse,\n request: DataQueryRequest<LokiQuery>,\n partition: TimeRange[],\n requestN: number\n): DataQueryResponse {\n if (isLogsQuery(request.targets[0].expr)) {\n return response;\n }\n response.data = response.data.filter((frame) => frame.name !== LOADING_FRAME_NAME);\n\n if (requestN <= 1) {\n return response;\n }\n\n const loadingFrame = arrayToDataFrame([\n {\n time: partition[0].from.valueOf(),\n timeEnd: partition[requestN - 2].to.valueOf(),\n isRegion: true,\n color: 'rgba(120, 120, 120, 0.1)',\n },\n ]);\n loadingFrame.name = LOADING_FRAME_NAME;\n loadingFrame.meta = {\n dataTopic: DataTopic.Annotations,\n };\n\n response.data.push(loadingFrame);\n\n return response;\n}\n\nfunction getNextRequestPointers(requests: LokiGroupedRequest[], requestGroup: number, requestN: number) {\n // There's a pending request from the next group:\n for (let i = requestGroup + 1; i < requests.length; i++) {\n const group = requests[i];\n if (group.partition[requestN - 1]) {\n return {\n nextRequestGroup: i,\n nextRequestN: requestN,\n };\n }\n }\n return {\n // Find the first group where `[requestN - 1]` is defined\n nextRequestGroup: requests.findIndex((group) => group?.partition[requestN - 1] !== undefined),\n nextRequestN: requestN - 1,\n };\n}\n\nfunction querySupportsSplitting(query: LokiQuery) {\n return (\n query.queryType !== LokiQueryType.Instant &&\n // Queries with $__range variable should not be split because then the interpolated $__range variable is incorrect\n // because it is interpolated on the backend with the split timeRange\n !isQueryWithRangeVariable(query.expr)\n );\n}\n\nexport function runSplitQuery(\n datasource: LokiDatasource,\n request: DataQueryRequest<LokiQuery>,\n options: QuerySplittingOptions = {}\n) {\n const queries = request.targets\n .filter((query) => !query.hide)\n .filter((query) => query.expr)\n .map((query) => datasource.applyTemplateVariables(query, request.scopedVars, request.filters));\n const [nonSplittingQueries, normalQueries] = partition(queries, (query) => !querySupportsSplitting(query));\n const [logQueries, metricQueries] = partition(normalQueries, (query) => isLogsQuery(query.expr));\n\n request.queryGroupId = uuidv4();\n const oneDayMs = 24 * 60 * 60 * 1000;\n const directionPartitionedLogQueries = groupBy(logQueries, (query) =>\n query.direction === LokiQueryDirection.Forward ? LokiQueryDirection.Forward : LokiQueryDirection.Backward\n );\n const requests: LokiGroupedRequest[] = [];\n\n for (const direction in directionPartitionedLogQueries) {\n const queries = directionPartitionedLogQueries[direction];\n const resolutionPartition = groupBy(queries, (query) => query.resolution || 1);\n for (const resolution in resolutionPartition) {\n const groupedRequest = {\n request: { ...request, targets: resolutionPartition[resolution] },\n partition: partitionTimeRange(true, request.range, request.intervalMs, oneDayMs),\n };\n\n if (direction === LokiQueryDirection.Forward) {\n groupedRequest.partition.reverse();\n }\n\n requests.push(groupedRequest);\n }\n }\n\n const stepMsPartition = groupBy(metricQueries, (query) =>\n calculateStep(request.intervalMs, request.range, query.resolution || 1, query.step)\n );\n\n for (const stepMs in stepMsPartition) {\n const targets = stepMsPartition[stepMs].map((q) => {\n const { maxLines, ...query } = q;\n return query;\n });\n requests.push({\n request: { ...request, targets },\n partition: partitionTimeRange(false, request.range, Number(stepMs), oneDayMs),\n });\n }\n\n if (nonSplittingQueries.length) {\n requests.push({\n request: { ...request, targets: nonSplittingQueries },\n partition: [request.range],\n });\n }\n\n const startTime = new Date();\n return runSplitGroupedQueries(datasource, requests, options).pipe(\n tap((response) => {\n if (response.state === LoadingState.Done) {\n trackGroupedQueries(response, requests, request, startTime);\n }\n })\n );\n}\n\n// Replicate from backend for split queries for now, until we can move query splitting to the backend\n// https://github.com/grafana/grafana/blob/main/pkg/tsdb/loki/step.go#L23\nfunction calculateStep(intervalMs: number, range: TimeRange, resolution: number, step: string | undefined) {\n // If we can parse step,the we use it\n // Otherwise we will calculate step based on interval\n const interval_regex = /(-?\\d+(?:\\.\\d+)?)(ms|[Mwdhmsy])/;\n if (step?.match(interval_regex)) {\n return rangeUtil.intervalToMs(step) * resolution;\n }\n\n const newStep = intervalMs * resolution;\n const safeStep = Math.round((range.to.valueOf() - range.from.valueOf()) / 11000);\n return Math.max(newStep, safeStep);\n}\n","import {\n closestIdx,\n DataFrame,\n DataFrameType,\n DataQueryResponse,\n DataQueryResponseData,\n Field,\n FieldType,\n LoadingState,\n QueryResultMetaNotice,\n QueryResultMetaStat,\n shallowCompare,\n} from '@grafana/data';\n\nimport { LOADING_FRAME_NAME } from './querySplitting';\n\nfunction getFrameKey(frame: DataFrame): string | undefined {\n // Metric range query data\n if (frame.meta?.type === DataFrameType.TimeSeriesMulti) {\n const field = frame.fields.find((f) => f.type === FieldType.number);\n if (!field) {\n throw new Error(`Unable to find number field on sharded dataframe!`);\n }\n let key = '';\n if (frame.refId) {\n key += frame.refId;\n }\n if (frame.name) {\n key += frame.name;\n }\n if (field.labels) {\n key += JSON.stringify(field.labels);\n }\n return key !== '' ? key : undefined;\n }\n return frame.refId ?? frame.name;\n}\n\nexport function combineResponses(currentResponse: DataQueryResponse | null, newResponse: DataQueryResponse) {\n if (!currentResponse) {\n return cloneQueryResponse(newResponse);\n }\n\n const currentResponseLabelsMap = new Map<string, DataFrame>();\n currentResponse.data.forEach((frame: DataFrame) => {\n const key = getFrameKey(frame);\n // It is expected that all frames contain a refId or a name, but since the type allows for it\n // we need to account for possibly undefined cases.\n if (key) {\n currentResponseLabelsMap.set(key, frame);\n }\n });\n\n newResponse.data.forEach((newFrame: DataFrame) => {\n let currentFrame: DataFrame | undefined = undefined;\n const key = getFrameKey(newFrame);\n if (key !== undefined && currentResponseLabelsMap.has(key)) {\n currentFrame = currentResponseLabelsMap.get(key);\n mergeFrames(currentFrame!, newFrame);\n } else {\n currentResponse.data.push(cloneDataFrame(newFrame));\n }\n });\n\n const mergedErrors = [...(currentResponse.errors ?? []), ...(newResponse.errors ?? [])];\n if (mergedErrors.length > 0) {\n currentResponse.errors = mergedErrors;\n }\n\n // the `.error` attribute is obsolete now,\n // but we have to maintain it, otherwise\n // some grafana parts do not behave well.\n // we just choose the old error, if it exists,\n // otherwise the new error, if it exists.\n const mergedError = currentResponse.error ?? newResponse.error;\n if (mergedError != null) {\n currentResponse.error = mergedError;\n }\n\n const mergedTraceIds = [...(currentResponse.traceIds ?? []), ...(newResponse.traceIds ?? [])];\n if (mergedTraceIds.length > 0) {\n currentResponse.traceIds = mergedTraceIds;\n }\n\n return currentResponse;\n}\n\n/**\n * Given an existing DataQueryResponse, replace any data frame present in newResponse with those in newResponse\n */\nexport function replaceResponses(currentResponse: DataQueryResponse | null, newResponse: DataQueryResponse) {\n if (!currentResponse) {\n return cloneQueryResponse(newResponse);\n }\n\n newResponse.data.forEach((newFrame) => {\n const currentFrameIndex = currentResponse.data.findIndex((frame) => shouldCombine(frame, newFrame));\n if (currentFrameIndex < 0) {\n currentResponse.data.push(cloneDataFrame(newFrame));\n return;\n }\n currentResponse.data[currentFrameIndex] = newFrame;\n });\n\n // Clean up loading frame when newResponse contains the final response\n if (newResponse.state === LoadingState.Done) {\n currentResponse.data = currentResponse.data.filter((frame) => frame.name !== LOADING_FRAME_NAME);\n }\n\n const mergedErrors = [...(currentResponse.errors ?? []), ...(newResponse.errors ?? [])];\n if (mergedErrors.length > 0) {\n currentResponse.errors = mergedErrors;\n }\n\n const mergedError = currentResponse.error ?? newResponse.error;\n if (mergedError != null) {\n currentResponse.error = mergedError;\n }\n\n const mergedTraceIds = [...(currentResponse.traceIds ?? []), ...(newResponse.traceIds ?? [])];\n if (mergedTraceIds.length > 0) {\n currentResponse.traceIds = mergedTraceIds;\n }\n\n return currentResponse;\n}\n\n/**\n * Given two data frames, merge their values. Overlapping values will be added together.\n */\nexport function mergeFrames(dest: DataFrame, source: DataFrame) {\n const destTimeField = dest.fields.find((field) => field.type === FieldType.time);\n const destIdField = dest.fields.find((field) => field.type === FieldType.string && field.name === 'id');\n const sourceTimeField = source.fields.find((field) => field.type === FieldType.time);\n const sourceIdField = source.fields.find((field) => field.type === FieldType.string && field.name === 'id');\n\n if (!destTimeField || !sourceTimeField) {\n console.error(new Error(`Time fields not found in the data frames`));\n return;\n }\n\n const sourceTimeValues = sourceTimeField?.values.slice(0) ?? [];\n const totalFields = Math.max(dest.fields.length, source.fields.length);\n\n for (let i = 0; i < sourceTimeValues.length; i++) {\n const destIdx = resolveIdx(destTimeField, sourceTimeField, i);\n\n const entryExistsInDest = compareEntries(destTimeField, destIdField, destIdx, sourceTimeField, sourceIdField, i);\n\n for (let f = 0; f < totalFields; f++) {\n // For now, skip undefined fields that exist in the new frame\n if (!dest.fields[f]) {\n continue;\n }\n // Index is not reliable when frames have disordered fields, or an extra/missing field, so we find them by name.\n // If the field has no name, we fallback to the old index version.\n const sourceField = findSourceField(dest.fields[f], source.fields, f);\n if (!sourceField) {\n continue;\n }\n // Same value, accumulate\n if (entryExistsInDest) {\n if (dest.fields[f].type === FieldType.time) {\n // Time already exists, skip\n continue;\n } else if (dest.fields[f].type === FieldType.number) {\n // Number, add\n dest.fields[f].values[destIdx] = (dest.fields[f].values[destIdx] ?? 0) + sourceField.values[i];\n } else if (dest.fields[f].type === FieldType.other) {\n // Possibly labels, combine\n if (typeof sourceField.values[i] === 'object') {\n dest.fields[f].values[destIdx] = {\n ...dest.fields[f].values[destIdx],\n ...sourceField.values[i],\n };\n } else if (sourceField.values[i]) {\n dest.fields[f].values[destIdx] = sourceField.values[i];\n }\n } else {\n // Replace value\n dest.fields[f].values[destIdx] = sourceField.values[i];\n }\n } else if (sourceField.values[i] !== undefined) {\n // Insert in the `destIdx` position\n dest.fields[f].values.splice(destIdx, 0, sourceField.values[i]);\n if (sourceField.nanos) {\n dest.fields[f].nanos = dest.fields[f].nanos ?? new Array(dest.fields[f].values.length - 1).fill(0);\n dest.fields[f].nanos?.splice(destIdx, 0, sourceField.nanos[i]);\n } else if (dest.fields[f].nanos) {\n dest.fields[f].nanos?.splice(destIdx, 0, 0);\n }\n }\n }\n }\n\n dest.length = dest.fields[0].values.length;\n\n dest.meta = {\n ...dest.meta,\n stats: getCombinedMetadataStats(dest.meta?.stats ?? [], source.meta?.stats ?? []),\n notices: getCombinedNotices(dest.meta?.notices ?? [], source.meta?.notices ?? []),\n };\n}\n\nfunction resolveIdx(destField: Field, sourceField: Field, index: number) {\n const idx = closestIdx(sourceField.values[index], destField.values);\n if (idx < 0) {\n return 0;\n }\n if (sourceField.values[index] === destField.values[idx] && sourceField.nanos && destField.nanos) {\n return sourceField.nanos[index] > destField.nanos[idx] ? idx + 1 : idx;\n }\n if (sourceField.values[index] > destField.values[idx]) {\n return idx + 1;\n }\n return idx;\n}\n\nfunction compareEntries(\n destTimeField: Field,\n destIdField: Field | undefined,\n destIndex: number,\n sourceTimeField: Field,\n sourceIdField: Field | undefined,\n sourceIndex: number\n) {\n const sameTimestamp = compareNsTimestamps(destTimeField, destIndex, sourceTimeField, sourceIndex);\n if (!sameTimestamp) {\n return false;\n }\n if (!destIdField || !sourceIdField) {\n return true;\n }\n // Log frames, check indexes\n return (\n destIdField.values[destIndex] !== undefined && destIdField.values[destIndex] === sourceIdField.values[sourceIndex]\n );\n}\n\nfunction compareNsTimestamps(destField: Field, destIndex: number, sourceField: Field, sourceIndex: number) {\n if (destField.nanos && sourceField.nanos) {\n return (\n destField.values[destIndex] !== undefined &&\n destField.values[destIndex] === sourceField.values[sourceIndex] &&\n destField.nanos[destIndex] !== undefined &&\n destField.nanos[destIndex] === sourceField.nanos[sourceIndex]\n );\n }\n return destField.values[destIndex] !== undefined && destField.values[destIndex] === sourceField.values[sourceIndex];\n}\n\nfunction findSourceField(referenceField: Field, sourceFields: Field[], index: number) {\n const candidates = sourceFields.filter((f) => f.name === referenceField.name);\n\n if (candidates.length === 1) {\n return candidates[0];\n }\n\n if (referenceField.labels) {\n return candidates.find((candidate) => shallowCompare(referenceField.labels ?? {}, candidate.labels ?? {}));\n }\n\n return sourceFields[index];\n}\n\nconst TOTAL_BYTES_STAT = 'Summary: total bytes processed';\nconst EXEC_TIME_STAT = 'Summary: exec time';\n// This is specific for Loki\nfunction getCombinedMetadataStats(\n destStats: QueryResultMetaStat[],\n sourceStats: QueryResultMetaStat[]\n): QueryResultMetaStat[] {\n // in the current approach, we only handle a single stat\n const stats: QueryResultMetaStat[] = [];\n for (const stat of [TOTAL_BYTES_STAT, EXEC_TIME_STAT]) {\n const destStat = destStats.find((s) => s.displayName === stat);\n const sourceStat = sourceStats.find((s) => s.displayName === stat);\n\n if (sourceStat != null && destStat != null) {\n stats.push({ value: sourceStat.value + destStat.value, displayName: stat, unit: destStat.unit });\n continue;\n }\n\n // maybe one of them exist\n const eitherStat = sourceStat ?? destStat;\n if (eitherStat != null) {\n stats.push(eitherStat);\n }\n }\n return stats;\n}\n\nfunction getCombinedNotices(\n destNotices: QueryResultMetaNotice[],\n sourceNotices: QueryResultMetaNotice[]\n): QueryResultMetaNotice[] {\n // Combine notices from both frames and filter out null/undefined values\n const allNotices = [...destNotices, ...sourceNotices].filter(\n (notice): notice is QueryResultMetaNotice => notice != null\n );\n\n // Deduplicate notices based on text to avoid showing the same warning twice\n const uniqueNotices = allNotices.reduce((acc: QueryResultMetaNotice[], notice) => {\n const exists = acc.some((n) => n.severity === notice.severity && n.text === notice.text);\n if (!exists) {\n acc.push(notice);\n }\n return acc;\n }, []);\n\n return uniqueNotices;\n}\n\n/**\n * Deep clones a DataQueryResponse\n */\nexport function cloneQueryResponse(response: DataQueryResponse): DataQueryResponse {\n const newResponse = {\n ...response,\n data: response.data.map(cloneDataFrame),\n };\n return newResponse;\n}\n\nfunction cloneDataFrame(frame: DataQueryResponseData): DataQueryResponseData {\n return {\n ...frame,\n fields: frame.fields.map((field: Field) => ({\n ...field,\n values: field.values,\n })),\n };\n}\n\nfunction shouldCombine(frame1: DataFrame, frame2: DataFrame): boolean {\n if (frame1.refId !== frame2.refId || frame1.name !== frame2.name) {\n return false;\n }\n\n const frameType1 = frame1.meta?.type;\n const frameType2 = frame2.meta?.type;\n\n if (frameType1 !== frameType2) {\n // we do not join things that have a different type\n return false;\n }\n\n // metric range query data\n if (frameType1 === DataFrameType.TimeSeriesMulti) {\n const field1 = frame1.fields.find((f) => f.type === FieldType.number);\n const field2 = frame2.fields.find((f) => f.type === FieldType.number);\n if (field1 === undefined || field2 === undefined) {\n // should never happen\n return false;\n }\n\n return shallowCompare(field1.labels ?? {}, field2.labels ?? {});\n }\n\n // logs query data\n // logs use a special attribute in the dataframe's \"custom\" section\n // because we do not have a good \"frametype\" value for them yet.\n const customType1 = frame1.meta?.custom?.frameType;\n const customType2 = frame2.meta?.custom?.frameType;\n // Legacy frames have this custom type\n if (customType1 === 'LabeledTimeValues' && customType2 === 'LabeledTimeValues') {\n return true;\n } else if (customType1 === customType2) {\n // Data plane frames don't\n return true;\n }\n\n // should never reach here\n return false;\n}\n","import React, { ReactNode } from 'react';\n\nimport { CoreApp, DataFrame, Field, LinkModel, ScopedVars } from '@grafana/data';\nimport { LogLineMenuCustomItem } from 'app/features/logs/components/panel/LogLineMenu';\nimport { LogListOptions } from 'app/features/logs/components/panel/LogList';\n\ntype onClickFilterLabelType = (key: string, value: string, frame?: DataFrame) => void;\ntype onClickFilterOutLabelType = (key: string, value: string, frame?: DataFrame) => void;\ntype onClickFilterValueType = (value: string, refId?: string) => void;\ntype onClickFilterOutStringType = (value: string, refId?: string) => void;\ntype filterLabelActiveType = (key: string, value: string, refId?: string) => Promise<boolean>;\ntype onClickShowFieldType = (value: string) => void;\ntype onClickHideFieldType = (value: string) => void;\nexport type onNewLogsReceivedType = (allLogs: DataFrame[], newLogs: DataFrame[]) => void;\ntype onLogOptionsChangeType = (option: LogListOptions, value: string | boolean | string[]) => void;\ntype setDisplayedFieldsType = (fields: string[]) => void;\n\nexport type GetFieldLinksFn = (\n field: Field,\n rowIndex: number,\n dataFrame: DataFrame,\n vars: ScopedVars\n) => Array<LinkModel<Field>>;\n\nexport function isOnClickFilterLabel(callback: unknown): callback is onClickFilterLabelType {\n return typeof callback === 'function';\n}\n\nexport function isOnClickFilterOutLabel(callback: unknown): callback is onClickFilterOutLabelType {\n return typeof callback === 'function';\n}\n\nexport function isOnClickFilterString(callback: unknown): callback is onClickFilterValueType {\n return typeof callback === 'function';\n}\n\nexport function isOnClickFilterOutString(callback: unknown): callback is onClickFilterOutStringType {\n return typeof callback === 'function';\n}\n\nexport function isIsFilterLabelActive(callback: unknown): callback is filterLabelActiveType {\n return typeof callback === 'function';\n}\n\nexport function isOnClickShowField(callback: unknown): callback is onClickShowFieldType {\n return typeof callback === 'function';\n}\n\nexport function isOnClickHideField(callback: unknown): callback is onClickHideFieldType {\n return typeof callback === 'function';\n}\n\nexport function isSetDisplayedFields(callback: unknown): callback is setDisplayedFieldsType {\n return typeof callback === 'function';\n}\n\nexport function isOnNewLogsReceivedType(callback: unknown): callback is onNewLogsReceivedType {\n return typeof callback === 'function';\n}\n\nexport function isOnLogOptionsChange(callback: unknown): callback is onLogOptionsChangeType {\n return typeof callback === 'function';\n}\n\nexport function isReactNodeArray(node: unknown): node is ReactNode[] {\n return Array.isArray(node) && node.every(React.isValidElement);\n}\n\nexport function isCoreApp(app: unknown): app is CoreApp {\n const apps = Object.values(CoreApp).map((coreApp) => coreApp.toString());\n return typeof app === 'string' && apps.includes(app);\n}\n\nexport function isLogLineMenuCustomItems(items: unknown): items is LogLineMenuCustomItem[] {\n return Array.isArray(items) && items.every((item) => 'divider' in item || ('onClick' in item && 'label' in item));\n}\n","import { useState } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { DataSourceApi } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { DataQuery } from '@grafana/schema';\n\nexport const useDatasourcesFromTargets = (targets: DataQuery[] | undefined): Map<string, DataSourceApi> => {\n const [dataSourcesMap, setDataSourcesMap] = useState(new Map<string, DataSourceApi>());\n\n useAsync(async () => {\n if (!targets) {\n setDataSourcesMap(new Map<string, DataSourceApi>());\n return;\n }\n\n const raw = await Promise.all(\n targets\n .filter((target) => !!target.datasource?.uid)\n .map((target) =>\n getDataSourceSrv()\n .get(target.datasource?.uid)\n .then((ds) => ({ key: target.refId, ds }))\n )\n );\n\n setDataSourcesMap(new Map<string, DataSourceApi>(raw.map(({ key, ds }) => [key, ds])));\n }, [targets]);\n\n return dataSourcesMap;\n};\n","import { css, cx } from '@emotion/css';\nimport { groupBy } from 'lodash';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport * as React from 'react';\nimport { isObservable, lastValueFrom } from 'rxjs';\n\nimport {\n AbsoluteTimeRange,\n CoreApp,\n DataFrame,\n DataHoverClearEvent,\n DataHoverEvent,\n DataQueryResponse,\n DataSourceApi,\n dateTimeForTimeZone,\n GrafanaTheme2,\n hasLogsContextSupport,\n hasLogsContextUiSupport,\n Labels,\n LogRowContextOptions,\n LogRowModel,\n LogsSortOrder,\n PanelData,\n PanelProps,\n TimeRange,\n TimeZone,\n toUtc,\n urlUtil,\n LogSortOrderChangeEvent,\n LoadingState,\n rangeUtil,\n} from '@grafana/data';\nimport { Trans } from '@grafana/i18n';\nimport { config, getAppEvents } from '@grafana/runtime';\nimport { ScrollContainer, usePanelContext, useStyles2 } from '@grafana/ui';\nimport { getFieldLinksForExplore } from 'app/features/explore/utils/links';\nimport { ControlledLogRows } from 'app/features/logs/components/ControlledLogRows';\nimport { InfiniteScroll } from 'app/features/logs/components/InfiniteScroll';\nimport { LogRowContextModal } from 'app/features/logs/components/log-context/LogRowContextModal';\nimport { LogLineContext } from 'app/features/logs/components/panel/LogLineContext';\nimport { LogList } from 'app/features/logs/components/panel/LogList';\nimport { PanelDataErrorView } from 'app/features/panel/components/PanelDataErrorView';\nimport { combineResponses } from 'app/plugins/datasource/loki/mergeResponses';\n\nimport { createAndCopyShortLink, getLogsPermalinkRange } from '../../../core/utils/shortLinks';\nimport { LogLabels } from '../../../features/logs/components/LogLabels';\nimport { LogRows } from '../../../features/logs/components/LogRows';\nimport { COMMON_LABELS, dataFrameToLogsModel, dedupLogRows } from '../../../features/logs/logsModel';\n\nimport type { Options } from './panelcfg.gen';\nimport {\n GetFieldLinksFn,\n isCoreApp,\n isIsFilterLabelActive,\n isLogLineMenuCustomItems,\n isOnClickFilterLabel,\n isOnClickFilterOutLabel,\n isOnClickFilterOutString,\n isOnClickFilterString,\n isOnClickHideField,\n isOnClickShowField,\n isOnLogOptionsChange,\n isOnNewLogsReceivedType,\n isReactNodeArray,\n isSetDisplayedFields,\n onNewLogsReceivedType,\n} from './types';\nimport { useDatasourcesFromTargets } from './useDatasourcesFromTargets';\n\ninterface LogsPanelProps extends PanelProps<Options> {\n /**\n * Adds a key => value filter to the query referenced by the provided DataFrame refId. Used by Log details and Logs table.\n * onClickFilterLabel?: (key: string, value: string, frame?: DataFrame) => void;\n *\n * Adds a negative key => value filter to the query referenced by the provided DataFrame refId. Used by Log details and Logs table.\n * onClickFilterOutLabel?: (key: string, value: string, frame?: DataFrame) => void;\n *\n * Adds a string filter to the query referenced by the provided DataFrame refId. Used by the Logs popover menu.\n * onClickFilterOutString?: (value: string, refId?: string) => void;\n *\n * Removes a string filter to the query referenced by the provided DataFrame refId. Used by the Logs popover menu.\n * onClickFilterString?: (value: string, refId?: string) => void;\n *\n * Determines if a given key => value filter is active in a given query. Used by Log details.\n * isFilterLabelActive?: (key: string, value: string, refId?: string) => Promise<boolean>;\n *\n * Array of field names to display instead of the log line. Pass a list of fields or an empty array to enable hide/show fields in Log Details.\n * displayedFields?: string[]\n *\n * Called from the \"eye\" icon in Log Details to request showing the displayed field. If ommited, a default implementation is used.\n * onClickShowField?: (key: string) => void;\n *\n * Called from the \"eye\" icon in Log Details to request hiding the displayed field. If ommited, a default implementation is used.\n * onClickHideField?: (key: string) => void;\n *\n * Called from the new Log Details Panel when fields are reordered. If ommited, a default implementation is used.\n * setDisplayedFields?: (key: string) => void;\n *\n * Passed to the LogRowMenuCell component to be rendered before the default actions in the menu.\n * logRowMenuIconsBefore?: ReactNode[];\n *\n * Passed to the LogRowMenuCell component to be rendered after the default actions in the menu.\n * logRowMenuIconsAfter?: ReactNode[];\n *\n * Callback to be invoked when enableInfiniteScrolling and new logs have been received after an scroll event.\n * onNewLogsReceived?: (allLogs: DataFrame[], newLogs: DataFrame[]) => void;\n *\n * Log Controls props:\n *\n * Enables a sidebar with controls for scrolling, sort order, deduplication, filtering, timestamps, wrapping, etc.\n * showControls?: boolean\n *\n * If controls are enabled, the component will use this key to store changes to the aforementioned options.\n * controlsStorageKey?: string\n *\n * If controls are enabled, this function is called when a change is made in one of the options from the controls.\n * onLogOptionsChange?: (option: LogListOptions, value: string | boolean | string[]) => void;\n *\n * When the feature toggle newLogsPanel is enabled, you can pass extra options to the LogLineMenu component.\n * These options are an array of items with { label, onClick } or { divider: true } for dividers.\n * logLineMenuCustomItems?: LogLineMenuCustomItem[];\n *\n * Use the default, bigger, font size, or a smaller one. Defaults to \"default\".\n * fontSize?: 'default' | 'small'\n *\n * Set the mode used by the Log Details panel. Displayed as a sidebar, or inline below the log line. Defaults to \"inline\".\n * detailsMode?: 'inline' | 'sidebar'\n *\n * When showing timestamps, toggle between showing nanoseconds or milliseconds.\n * timestampResolution?: 'ms' | 'ns'\n *\n * Experimental. When OTel logs are displayed, add an extra displayed field with relevant key-value pairs from labels and metadata.\n * Requires the `otelLogsFormatting`.\n * @alpha\n * showLogAttributes?: boolean\n */\n}\ninterface LogsPermalinkUrlState {\n logs?: {\n id?: string;\n };\n}\n\nconst noCommonLabels: Labels = {};\n\nexport const LogsPanel = ({\n data,\n timeZone,\n fieldConfig,\n options: {\n showControls,\n showFieldSelector,\n controlsStorageKey,\n showLabels,\n showTime,\n wrapLogMessage,\n showCommonLabels,\n prettifyLogMessage,\n sortOrder,\n dedupStrategy,\n enableLogDetails,\n showLogContextToggle,\n onClickFilterLabel,\n onClickFilterOutLabel,\n onClickFilterOutString,\n onClickFilterString,\n onLogOptionsChange,\n isFilterLabelActive,\n logRowMenuIconsBefore,\n logRowMenuIconsAfter,\n logLineMenuCustomItems,\n enableInfiniteScrolling,\n onNewLogsReceived,\n fontSize,\n syntaxHighlighting,\n detailsMode: detailsModeProp,\n noInteractions,\n timestampResolution,\n showLogAttributes,\n ...options\n },\n height,\n id,\n}: LogsPanelProps) => {\n const isAscending = sortOrder === LogsSortOrder.Ascending;\n const style = useStyles2(getStyles);\n const logsContainerRef = useRef<HTMLDivElement>(null);\n const [contextRow, setContextRow] = useState<LogRowModel | null>(null);\n const [scrollElement, setScrollElement] = useState<HTMLDivElement | null>(null);\n const [displayedFields, setDisplayedFields] = useState<string[]>(options.displayedFields ?? []);\n // Loading state to be passed as a prop to the <InfiniteScroll> component\n const [infiniteScrolling, setInfiniteScrolling] = useState(false);\n // Loading ref to prevent firing multiple requests\n const loadingRef = useRef(false);\n const [panelData, setPanelData] = useState(data);\n const dataSourcesMap = useDatasourcesFromTargets(panelData.request?.targets);\n // Prevents the scroll position to change when new data from infinite scrolling is received\n const keepScrollPositionRef = useRef<null | 'infinite-scroll' | 'user'>(null);\n let closeCallback = useRef<() => void>();\n const { app, eventBus, onAddAdHocFilter } = usePanelContext();\n\n useEffect(() => {\n getAppEvents().publish(\n new LogSortOrderChangeEvent({\n order: sortOrder,\n })\n );\n }, [sortOrder]);\n\n const onLogRowHover = useCallback(\n (row?: LogRowModel) => {\n if (row) {\n eventBus.publish(\n new DataHoverEvent({\n point: {\n time: row.timeEpochMs,\n },\n })\n );\n }\n },\n [eventBus]\n );\n\n const onLogContainerMouseLeave = useCallback(() => {\n eventBus.publish(new DataHoverClearEvent());\n }, [eventBus]);\n\n const onCloseContext = useCallback(() => {\n setContextRow(null);\n if (closeCallback.current) {\n closeCallback.current();\n }\n }, [closeCallback]);\n\n const onOpenContext = useCallback(\n (row: LogRowModel, onClose: () => void) => {\n setContextRow(row);\n closeCallback.current = onClose;\n },\n [closeCallback]\n );\n\n const showContextToggle = useCallback(\n (row: LogRowModel): boolean => {\n if (\n !row.dataFrame.refId ||\n !dataSourcesMap ||\n (!showLogContextToggle &&\n panelData.request?.app !== CoreApp.Dashboard &&\n panelData.request?.app !== CoreApp.PanelEditor &&\n panelData.request?.app !== CoreApp.PanelViewer)\n ) {\n return false;\n }\n\n const dataSource = dataSourcesMap.get(row.dataFrame.refId);\n return hasLogsContextSupport(dataSource);\n },\n [dataSourcesMap, showLogContextToggle, panelData.request?.app]\n );\n\n const showPermaLink = useCallback(() => {\n return !(\n panelData.request?.app !== CoreApp.Dashboard &&\n panelData.request?.app !== CoreApp.PanelEditor &&\n panelData.request?.app !== CoreApp.PanelViewer\n );\n }, [panelData.request?.app]);\n\n const getLogRowContext = useCallback(\n async (row: LogRowModel, origRow: LogRowModel, options: LogRowContextOptions): Promise<DataQueryResponse> => {\n if (!origRow.dataFrame.refId || !dataSourcesMap) {\n return Promise.resolve({ data: [] });\n }\n\n const query = panelData.request?.targets[0];\n if (!query) {\n return Promise.resolve({ data: [] });\n }\n\n const dataSource = dataSourcesMap.get(origRow.dataFrame.refId);\n if (!hasLogsContextSupport(dataSource)) {\n return Promise.resolve({ data: [] });\n }\n\n options.scopedVars = panelData.request?.scopedVars;\n\n return dataSource.getLogRowContext(row, options, query);\n },\n [panelData.request?.targets, panelData.request?.scopedVars, dataSourcesMap]\n );\n\n const getLogRowContextUi = useCallback(\n (origRow: LogRowModel, runContextQuery?: () => void): React.ReactNode => {\n if (!origRow.dataFrame.refId || !dataSourcesMap) {\n return <></>;\n }\n\n const query = panelData.request?.targets[0];\n if (!query) {\n return <></>;\n }\n\n const dataSource = dataSourcesMap.get(origRow.dataFrame.refId);\n if (!hasLogsContextUiSupport(dataSource)) {\n return <></>;\n }\n\n if (!dataSource.getLogRowContextUi) {\n return <></>;\n }\n\n return dataSource.getLogRowContextUi(origRow, runContextQuery, query, panelData.request?.scopedVars);\n },\n [panelData.request?.targets, panelData.request?.scopedVars, dataSourcesMap]\n );\n\n // Important to memoize stuff here, as panel rerenders a lot for example when resizing.\n const [logRows, deduplicatedRows, commonLabels] = useMemo(() => {\n const logs = panelData\n ? dataFrameToLogsModel(\n panelData.series,\n panelData.request?.intervalMs,\n undefined,\n panelData.request?.targets,\n Boolean(enableInfiniteScrolling)\n )\n : null;\n const logRows = logs?.rows || [];\n const commonLabels = logs?.meta?.find((m) => m.label === COMMON_LABELS);\n const deduplicatedRows = dedupLogRows(logRows, dedupStrategy);\n return [logRows, deduplicatedRows, commonLabels];\n }, [dedupStrategy, enableInfiniteScrolling, panelData]);\n\n const onPermalinkClick = useCallback(\n async (row: LogRowModel) => {\n return await copyDashboardUrl(row, logRows, panelData.timeRange);\n },\n [panelData.timeRange, logRows]\n );\n\n useEffect(() => {\n if (data.state !== LoadingState.Loading) {\n setPanelData(data);\n }\n }, [data]);\n\n useLayoutEffect(() => {\n if (config.featureToggles.newLogsPanel) {\n return;\n }\n if (!logsContainerRef.current || !scrollElement || keepScrollPositionRef.current) {\n keepScrollPositionRef.current =\n keepScrollPositionRef.current === 'infinite-scroll' ? null : keepScrollPositionRef.current;\n return;\n }\n /**\n * In dashboards, users with newest logs at the bottom have the expectation of keeping the scroll at the bottom\n * when new data is received. See https://github.com/grafana/grafana/pull/37634\n */\n if (panelData.request?.app === CoreApp.Dashboard || panelData.request?.app === CoreApp.PanelEditor) {\n scrollElement.scrollTo(0, isAscending ? logsContainerRef.current.scrollHeight : 0);\n }\n }, [panelData.request?.app, isAscending, scrollElement, logRows]);\n\n const getFieldLinks: GetFieldLinksFn = useCallback(\n (field, rowIndex, dataFrame, vars) => {\n return getFieldLinksForExplore({\n field,\n rowIndex,\n range: panelData.timeRange,\n dataFrame: dataFrame,\n vars,\n });\n },\n [panelData]\n );\n\n /**\n * Scrolls the given row into view.\n */\n const scrollIntoView = useCallback(\n (row: HTMLElement) => {\n scrollElement?.scrollTo({\n top: row.offsetTop,\n behavior: 'smooth',\n });\n },\n [scrollElement]\n );\n\n const handleOnClickFilterLabel = useCallback(\n (key: string, value: string) => {\n onAddAdHocFilter?.({\n key,\n value,\n operator: '=',\n });\n },\n [onAddAdHocFilter]\n );\n\n const handleOnClickFilterOutLabel = useCallback(\n (key: string, value: string) => {\n onAddAdHocFilter?.({\n key,\n value,\n operator: '!=',\n });\n },\n [onAddAdHocFilter]\n );\n\n const showField = useCallback(\n (key: string) => {\n const index = displayedFields?.indexOf(key);\n if (index === -1) {\n setDisplayedFields(displayedFields?.concat(key));\n }\n },\n [displayedFields]\n );\n\n const hideField = useCallback(\n (key: string) => {\n const index = displayedFields?.indexOf(key);\n if (index !== undefined && index > -1) {\n setDisplayedFields(displayedFields?.filter((k) => key !== k));\n }\n },\n [displayedFields]\n );\n\n useEffect(() => {\n if (options.displayedFields) {\n setDisplayedFields(options.displayedFields);\n }\n }, [options.displayedFields]);\n\n // Respect the scroll position when refreshing the panel\n useEffect(() => {\n function handleScroll() {\n if (!scrollElement) {\n return;\n }\n // Signal to keep the user scroll position\n keepScrollPositionRef.current = 'user';\n const atTheBottom = scrollElement.scrollHeight - scrollElement.scrollTop - scrollElement.clientHeight === 0;\n // Except when the user resets the scroll to the original position depending on the sort direction\n if (scrollElement.scrollTop === 0 && !isAscending) {\n keepScrollPositionRef.current = null;\n } else if (atTheBottom && isAscending) {\n keepScrollPositionRef.current = null;\n }\n }\n scrollElement?.addEventListener('scroll', handleScroll);\n scrollElement?.addEventListener('wheel', handleScroll);\n return () => {\n scrollElement?.removeEventListener('scroll', handleScroll);\n scrollElement?.removeEventListener('wheel', handleScroll);\n };\n }, [isAscending, scrollElement]);\n\n const loadMoreLogs = useCallback(\n async (scrollRange: AbsoluteTimeRange) => {\n if (!data.request || !config.featureToggles.logsInfiniteScrolling || loadingRef.current) {\n return;\n }\n\n loadingRef.current = true;\n setInfiniteScrolling(true);\n\n const onNewLogsReceivedCallback = isOnNewLogsReceivedType(onNewLogsReceived) ? onNewLogsReceived : undefined;\n\n let newSeries: DataFrame[] = [];\n try {\n newSeries = await requestMoreLogs(dataSourcesMap, panelData, scrollRange, timeZone, onNewLogsReceivedCallback);\n } catch (e) {\n console.error(e);\n } finally {\n setInfiniteScrolling(false);\n loadingRef.current = false;\n }\n\n keepScrollPositionRef.current = 'infinite-scroll';\n setPanelData({\n ...panelData,\n series: newSeries,\n });\n },\n [data.request, dataSourcesMap, onNewLogsReceived, panelData, timeZone]\n );\n\n const renderCommonLabels = () => (\n <div className={cx(style.labelContainer, isAscending && style.labelContainerAscending)}>\n <span className={style.label}>\n <Trans i18nKey=\"logs.logs-panel.render-common-labels.common-labels\">Common labels:</Trans>\n </span>\n <LogLabels\n labels={typeof commonLabels?.value === 'object' ? commonLabels?.value : noCommonLabels}\n emptyMessage=\"(no common labels)\"\n />\n </div>\n );\n\n const initialScrollPosition = useMemo(() => {\n /**\n * In dashboards, users with newest logs at the bottom have the expectation of keeping the scroll at the bottom\n * when new data is received. See https://github.com/grafana/grafana/pull/37634\n */\n if (app === CoreApp.Dashboard || app === CoreApp.PanelEditor) {\n return sortOrder === LogsSortOrder.Ascending ? 'bottom' : 'top';\n }\n return 'top';\n }, [app, sortOrder]);\n\n const storageKey = useMemo(() => {\n if (controlsStorageKey) {\n return controlsStorageKey;\n }\n if (!data.request) {\n return undefined;\n }\n return `${data.request?.dashboardUID}.${id}`;\n }, [controlsStorageKey, data.request, id]);\n\n if (!data || logRows.length === 0) {\n return <PanelDataErrorView fieldConfig={fieldConfig} panelId={id} data={data} needsStringField />;\n }\n\n // Passing callbacks control the display of the filtering buttons. We want to pass it only if onAddAdHocFilter is defined.\n const defaultOnClickFilterLabel = onAddAdHocFilter ? handleOnClickFilterLabel : undefined;\n const defaultOnClickFilterOutLabel = onAddAdHocFilter ? handleOnClickFilterOutLabel : undefined;\n\n const onClickShowField = isOnClickShowField(options.onClickShowField) ? options.onClickShowField : showField;\n const onClickHideField = isOnClickHideField(options.onClickHideField) ? options.onClickHideField : hideField;\n const setDisplayedFieldsFn = isSetDisplayedFields(options.setDisplayedFields)\n ? options.setDisplayedFields\n : setDisplayedFields;\n\n // In Dashboards, default to inline. Otherwise, let apps control or have automatic behavior.\n const detailsMode = detailsModeProp ? detailsModeProp : app === CoreApp.Dashboard ? 'inline' : undefined;\n\n return (\n <>\n {(!config.featureToggles.newLogsPanel || !config.featureToggles.newLogContext) && contextRow && (\n <LogRowContextModal\n open={contextRow !== null}\n row={contextRow}\n onClose={onCloseContext}\n getRowContext={(row, options) => getLogRowContext(row, contextRow, options)}\n logsSortOrder={sortOrder}\n timeZone={timeZone}\n getLogRowContextUi={getLogRowContextUi}\n />\n )}\n {config.featureToggles.newLogsPanel && config.featureToggles.newLogContext && getLogRowContext && contextRow && (\n <LogLineContext\n open={contextRow !== null}\n log={contextRow}\n onClose={onCloseContext}\n getRowContext={(row, options) => getLogRowContext(row, contextRow, options)}\n getLogRowContextUi={getLogRowContextUi}\n logOptionsStorageKey={controlsStorageKey}\n logLineMenuCustomItems={isLogLineMenuCustomItems(logLineMenuCustomItems) ? logLineMenuCustomItems : undefined}\n timeZone={timeZone}\n displayedFields={displayedFields}\n onPermalinkClick={showPermaLink() ? onPermalinkClick : undefined}\n onClickShowField={showField}\n onClickHideField={hideField}\n />\n )}\n {config.featureToggles.newLogsPanel && (\n <div\n onMouseLeave={onLogContainerMouseLeave}\n className={style.logListContainer}\n style={height ? { minHeight: height } : undefined}\n ref={(element: HTMLDivElement) => setScrollElement(element)}\n >\n {deduplicatedRows.length > 0 && scrollElement && (\n <LogList\n app={isCoreApp(app) ? app : CoreApp.Dashboard}\n containerElement={scrollElement}\n dataFrames={panelData.series}\n dedupStrategy={dedupStrategy}\n detailsMode={detailsMode}\n displayedFields={displayedFields}\n enableLogDetails={enableLogDetails}\n fontSize={fontSize}\n getFieldLinks={getFieldLinks}\n isLabelFilterActive={isIsFilterLabelActive(isFilterLabelActive) ? isFilterLabelActive : undefined}\n initialScrollPosition={initialScrollPosition}\n loading={infiniteScrolling}\n logLineMenuCustomItems={\n isLogLineMenuCustomItems(logLineMenuCustomItems) ? logLineMenuCustomItems : undefined\n }\n logs={deduplicatedRows}\n logSupportsContext={showContextToggle}\n loadMore={enableInfiniteScrolling ? loadMoreLogs : undefined}\n noInteractions={noInteractions}\n onClickFilterLabel={\n isOnClickFilterLabel(onClickFilterLabel) ? onClickFilterLabel : defaultOnClickFilterLabel\n }\n onClickFilterOutLabel={\n isOnClickFilterOutLabel(onClickFilterOutLabel) ? onClickFilterOutLabel : defaultOnClickFilterOutLabel\n }\n onClickFilterString={isOnClickFilterString(onClickFilterString) ? onClickFilterString : undefined}\n onClickFilterOutString={\n isOnClickFilterOutString(onClickFilterOutString) ? onClickFilterOutString : undefined\n }\n onClickShowField={displayedFields !== undefined ? onClickShowField : undefined}\n onClickHideField={displayedFields !== undefined ? onClickHideField : undefined}\n onLogLineHover={onLogRowHover}\n onLogOptionsChange={isOnLogOptionsChange(onLogOptionsChange) ? onLogOptionsChange : undefined}\n onOpenContext={onOpenContext}\n onPermalinkClick={showPermaLink() ? onPermalinkClick : undefined}\n permalinkedLogId={getLogsPanelState()?.logs?.id ?? undefined}\n prettifyJSON={prettifyLogMessage}\n setDisplayedFields={setDisplayedFieldsFn}\n showControls={Boolean(showControls)}\n showFieldSelector={showFieldSelector}\n showLogAttributes={showLogAttributes}\n showTime={showTime}\n showUniqueLabels={showLabels}\n sortOrder={sortOrder}\n logOptionsStorageKey={storageKey}\n syntaxHighlighting={syntaxHighlighting}\n timeRange={data.timeRange}\n timestampResolution={timestampResolution}\n timeZone={timeZone}\n wrapLogMessage={wrapLogMessage}\n />\n )}\n </div>\n )}\n {!config.featureToggles.newLogsPanel && !showControls && (\n <ScrollContainer ref={(scrollElement) => setScrollElement(scrollElement)}>\n <div onMouseLeave={onLogContainerMouseLeave} className={style.container} ref={logsContainerRef}>\n {showCommonLabels && !isAscending && renderCommonLabels()}\n <InfiniteScroll\n loading={infiniteScrolling}\n loadMoreLogs={enableInfiniteScrolling ? loadMoreLogs : undefined}\n range={data.timeRange}\n timeZone={timeZone}\n rows={logRows}\n scrollElement={scrollElement}\n sortOrder={sortOrder}\n >\n <LogRows\n scrollElement={scrollElement}\n scrollIntoView={scrollIntoView}\n permalinkedRowId={getLogsPanelState()?.logs?.id ?? undefined}\n onPermalinkClick={showPermaLink() ? onPermalinkClick : undefined}\n logRows={logRows}\n showContextToggle={showContextToggle}\n deduplicatedRows={deduplicatedRows}\n dedupStrategy={dedupStrategy}\n showLabels={showLabels}\n showTime={showTime}\n wrapLogMessage={wrapLogMessage}\n prettifyLogMessage={prettifyLogMessage}\n timeZone={timeZone}\n getFieldLinks={getFieldLinks}\n logsSortOrder={sortOrder}\n enableLogDetails={enableLogDetails}\n previewLimit={isAscending ? logRows.length : undefined}\n onLogRowHover={onLogRowHover}\n app={isCoreApp(app) ? app : CoreApp.Dashboard}\n onOpenContext={onOpenContext}\n onClickFilterLabel={\n isOnClickFilterLabel(onClickFilterLabel) ? onClickFilterLabel : defaultOnClickFilterLabel\n }\n onClickFilterOutLabel={\n isOnClickFilterOutLabel(onClickFilterOutLabel) ? onClickFilterOutLabel : defaultOnClickFilterOutLabel\n }\n onClickFilterString={isOnClickFilterString(onClickFilterString) ? onClickFilterString : undefined}\n onClickFilterOutString={\n isOnClickFilterOutString(onClickFilterOutString) ? onClickFilterOutString : undefined\n }\n isFilterLabelActive={isIsFilterLabelActive(isFilterLabelActive) ? isFilterLabelActive : undefined}\n displayedFields={displayedFields}\n onClickShowField={displayedFields !== undefined ? onClickShowField : undefined}\n onClickHideField={displayedFields !== undefined ? onClickHideField : undefined}\n logRowMenuIconsBefore={isReactNodeArray(logRowMenuIconsBefore) ? logRowMenuIconsBefore : undefined}\n logRowMenuIconsAfter={isReactNodeArray(logRowMenuIconsAfter) ? logRowMenuIconsAfter : undefined}\n // Ascending order causes scroll to stick to the bottom, so previewing is futile\n renderPreview={isAscending ? false : true}\n timeRange={data.timeRange}\n />\n </InfiniteScroll>\n {showCommonLabels && isAscending && renderCommonLabels()}\n </div>\n </ScrollContainer>\n )}\n {!config.featureToggles.newLogsPanel && showControls && (\n <div onMouseLeave={onLogContainerMouseLeave} className={style.controlledLogsContainer}>\n {showCommonLabels && !isAscending && renderCommonLabels()}\n <ControlledLogRows\n ref={(scrollElement: HTMLDivElement | null) => setScrollElement(scrollElement)}\n visualisationType=\"logs\"\n loading={infiniteScrolling}\n loadMoreLogs={enableInfiniteScrolling ? loadMoreLogs : undefined}\n range={data.timeRange}\n logRows={logRows}\n deduplicatedRows={deduplicatedRows}\n dedupStrategy={dedupStrategy}\n onClickFilterLabel={\n isOnClickFilterLabel(onClickFilterLabel) ? onClickFilterLabel : defaultOnClickFilterLabel\n }\n onClickFilterOutLabel={\n isOnClickFilterOutLabel(onClickFilterOutLabel) ? onClickFilterOutLabel : defaultOnClickFilterOutLabel\n }\n showContextToggle={showContextToggle}\n showLabels={showLabels}\n showTime={showTime}\n enableLogDetails={enableLogDetails}\n wrapLogMessage={wrapLogMessage}\n prettifyLogMessage={prettifyLogMessage}\n timeZone={timeZone}\n getFieldLinks={getFieldLinks}\n logsSortOrder={sortOrder}\n displayedFields={displayedFields}\n onClickShowField={displayedFields !== undefined ? onClickShowField : undefined}\n onClickHideField={displayedFields !== undefined ? onClickHideField : undefined}\n app={isCoreApp(app) ? app : CoreApp.Dashboard}\n onLogRowHover={onLogRowHover}\n onOpenContext={onOpenContext}\n onPermalinkClick={onPermalinkClick}\n permalinkedRowId={getLogsPanelState()?.logs?.id ?? undefined}\n scrollIntoView={scrollIntoView}\n isFilterLabelActive={isIsFilterLabelActive(isFilterLabelActive) ? isFilterLabelActive : undefined}\n onClickFilterString={isOnClickFilterString(onClickFilterString) ? onClickFilterString : undefined}\n onClickFilterOutString={\n isOnClickFilterOutString(onClickFilterOutString) ? onClickFilterOutString : undefined\n }\n logRowMenuIconsBefore={isReactNodeArray(logRowMenuIconsBefore) ? logRowMenuIconsBefore : undefined}\n logRowMenuIconsAfter={isReactNodeArray(logRowMenuIconsAfter) ? logRowMenuIconsAfter : undefined}\n onLogOptionsChange={isOnLogOptionsChange(onLogOptionsChange) ? onLogOptionsChange : undefined}\n logOptionsStorageKey={controlsStorageKey}\n // Ascending order causes scroll to stick to the bottom, so previewing is futile\n renderPreview={isAscending ? false : true}\n timeRange={data.timeRange}\n />\n {showCommonLabels && isAscending && renderCommonLabels()}\n </div>\n )}\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css({\n marginBottom: theme.spacing(1.5),\n }),\n logListContainer: css({\n minHeight: '100%',\n maxHeight: '100%',\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n overflow: 'hidden',\n }),\n controlledLogsContainer: css({\n height: '100%',\n }),\n labelContainer: css({\n margin: theme.spacing(0, 0, 0.5, 0.5),\n display: 'flex',\n alignItems: 'center',\n }),\n labelContainerAscending: css({\n margin: theme.spacing(0.5, 0, 0.5, 0),\n }),\n label: css({\n marginRight: theme.spacing(0.5),\n fontSize: theme.typography.bodySmall.fontSize,\n fontWeight: theme.typography.fontWeightMedium,\n }),\n});\n\nfunction getLogsPanelState(): LogsPermalinkUrlState | undefined {\n const urlParams = urlUtil.getUrlSearchParams();\n const panelStateEncoded = urlParams?.panelState;\n if (\n panelStateEncoded &&\n Array.isArray(panelStateEncoded) &&\n panelStateEncoded?.length > 0 &&\n typeof panelStateEncoded[0] === 'string'\n ) {\n try {\n return JSON.parse(panelStateEncoded[0]);\n } catch (e) {\n console.error('error parsing logsPanelState', e);\n }\n }\n\n return undefined;\n}\n\nasync function copyDashboardUrl(row: LogRowModel, rows: LogRowModel[], timeRange: TimeRange) {\n // this is an extra check, to be sure that we are not\n // creating permalinks for logs without an id-field.\n // normally it should never happen, because we do not\n // display the permalink button in such cases.\n if (row.rowId === undefined || !row.dataFrame.refId) {\n return;\n }\n\n // get panel state, add log-row-id\n const panelState = {\n logs: { id: row.uid },\n };\n\n // Grab the current dashboard URL\n const currentURL = new URL(window.location.href);\n\n // Add panel state containing the rowId, and absolute time range from the current query, but leave everything else the same, if the user is in edit mode when grabbing the link, that's what will be linked to, etc.\n currentURL.searchParams.set('panelState', JSON.stringify(panelState));\n const range = getLogsPermalinkRange(row, rows, {\n from: toUtc(timeRange.from).valueOf(),\n to: toUtc(timeRange.to).valueOf(),\n });\n currentURL.searchParams.set('from', range.from.toString());\n currentURL.searchParams.set('to', range.to.toString());\n\n await createAndCopyShortLink(currentURL.toString());\n\n return Promise.resolve();\n}\n\nexport async function requestMoreLogs(\n dataSourcesMap: Map<string, DataSourceApi>,\n panelData: PanelData,\n timeRange: AbsoluteTimeRange,\n timeZone: TimeZone,\n onNewLogsReceived?: onNewLogsReceivedType\n) {\n if (!panelData.request) {\n return [];\n }\n\n const range: TimeRange = rangeUtil.convertRawToRange({\n from: dateTimeForTimeZone(timeZone, timeRange.from),\n to: dateTimeForTimeZone(timeZone, timeRange.to),\n });\n\n const targetGroups = groupBy(panelData.request.targets, 'datasource.uid');\n const dataRequests = [];\n\n for (const uid in targetGroups) {\n const dataSource = dataSourcesMap.get(panelData.request.targets[0].refId);\n if (!dataSource) {\n console.warn(`Could not resolve data source for target ${panelData.request.targets[0].refId}`);\n continue;\n }\n dataRequests.push(\n dataSource.query({\n ...panelData.request,\n range,\n targets: targetGroups[uid],\n })\n );\n }\n\n const responses = await Promise.all(dataRequests);\n let updatedSeries = panelData.series;\n for (const response of responses) {\n const newData = isObservable(response) ? await lastValueFrom(response) : response;\n\n updatedSeries = combineResponses(\n {\n data: updatedSeries,\n },\n { data: newData.data }\n ).data;\n\n if (onNewLogsReceived) {\n onNewLogsReceived(updatedSeries, newData.data);\n }\n }\n\n return updatedSeries;\n}\n","import { VisualizationSuggestionsBuilder, VisualizationSuggestionScore } from '@grafana/data';\nimport { SuggestionName } from 'app/types/suggestions';\n\nimport { Options } from './panelcfg.gen';\n\nexport class LogsPanelSuggestionsSupplier {\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const list = builder.getListAppender<Options, {}>({\n name: '',\n pluginId: 'logs',\n options: {},\n fieldConfig: {\n defaults: {\n custom: {},\n },\n overrides: [],\n },\n });\n\n const { dataSummary: ds } = builder;\n\n // Require a string & time field\n if (!ds.hasData || !ds.hasTimeField || !ds.hasStringField) {\n return;\n }\n\n if (ds.preferredVisualisationType === 'logs') {\n list.append({ name: SuggestionName.Logs, score: VisualizationSuggestionScore.Best });\n } else {\n list.append({ name: SuggestionName.Logs });\n }\n }\n}\n","import { PanelPlugin, LogsSortOrder, LogsDedupStrategy, LogsDedupDescription } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { config } from '@grafana/runtime';\n\nimport { LogsPanel } from './LogsPanel';\nimport { Options } from './panelcfg.gen';\nimport { LogsPanelSuggestionsSupplier } from './suggestions';\n\nexport const plugin = new PanelPlugin<Options>(LogsPanel)\n .setPanelOptions((builder, context) => {\n const category = [t('logs.category-logs', 'Logs')];\n builder\n .addBooleanSwitch({\n path: 'showTime',\n name: t('logs.name-time', 'Show timestamps'),\n category,\n description: '',\n defaultValue: false,\n })\n .addBooleanSwitch({\n path: 'showLabels',\n name: t('logs.name-unique-labels', 'Unique labels'),\n category,\n description: '',\n });\n\n if (!config.featureToggles.newLogsPanel) {\n builder.addBooleanSwitch({\n path: 'showCommonLabels',\n name: t('logs.name-common-labels', 'Common labels'),\n category,\n description: '',\n defaultValue: false,\n });\n } else if (context.options?.showTime) {\n builder.addRadio({\n path: 'timestampResolution',\n name: t('logs.timestamp-format', 'Timestamp resolution'),\n category,\n description: '',\n defaultValue: 'ms',\n settings: {\n options: [\n { value: 'ms', label: t('logs.logs.timestamp-resolution.label-milliseconds', 'Milliseconds') },\n {\n value: 'ns',\n label: t('logs.logs.timestamp-resolution.label-nanoseconds', 'Nanoseconds'),\n },\n ],\n },\n });\n }\n\n builder.addBooleanSwitch({\n path: 'wrapLogMessage',\n name: t('logs.name-wrap-lines', 'Wrap lines'),\n category,\n description: '',\n defaultValue: false,\n });\n\n // In the old panel this is an independent option, in the new panel is linked to wrapLogMessage\n if (!config.featureToggles.newLogsPanel || context.options?.wrapLogMessage) {\n builder.addBooleanSwitch({\n path: 'prettifyLogMessage',\n name: t('logs.name-prettify-json', 'Prettify JSON'),\n category,\n description: '',\n defaultValue: false,\n });\n }\n\n if (config.featureToggles.newLogsPanel) {\n builder.addBooleanSwitch({\n path: 'syntaxHighlighting',\n name: t('logs.name-enable-logs-highlighting', 'Enable logs highlighting'),\n category,\n description: t(\n 'logs.description-enable-logs-highlighting',\n 'Use a predefined coloring scheme to highlight relevant parts of the log lines'\n ),\n });\n }\n\n builder.addBooleanSwitch({\n path: 'enableLogDetails',\n name: t('logs.name-enable-log-details', 'Enable log details'),\n category,\n description: '',\n defaultValue: true,\n });\n\n if (config.featureToggles.newLogsPanel && context.options?.enableLogDetails) {\n builder.addRadio({\n path: 'detailsMode',\n name: t('logs.name-details-mode', 'Log details panel mode'),\n category,\n description: '',\n settings: {\n options: [\n { value: 'inline', label: t('logs.name-details-options.label-inline', 'Inline') },\n {\n value: 'sidebar',\n label: t('logs.name-details-options.label-sidebar', 'Sidebar'),\n },\n ],\n },\n });\n }\n\n builder.addBooleanSwitch({\n path: 'enableInfiniteScrolling',\n name: t('logs.name-enable-infinite-scrolling', 'Enable infinite scrolling'),\n category,\n description: t(\n 'logs.description-enable-infinite-scrolling',\n 'Experimental. Request more results by scrolling to the bottom of the logs list.'\n ),\n defaultValue: false,\n });\n\n if (config.featureToggles.otelLogsFormatting) {\n builder.addBooleanSwitch({\n path: 'showLogAttributes',\n name: t('logs.show-log-attributes', 'Display log attributes for OTel logs'),\n category,\n description: t(\n 'logs.description-show-log-attributes',\n 'Experimental. When OTel logs are displayed, add an extra displayed field with relevant key-value pairs from labels and metadata.'\n ),\n defaultValue: true,\n });\n }\n\n if (config.featureToggles.newLogsPanel) {\n builder\n .addBooleanSwitch({\n path: 'showControls',\n name: t('logs.name-show-controls', 'Show controls'),\n category,\n description: t(\n 'logs.description-show-controls',\n 'Display controls to jump to the last or first log line, and filters by log level'\n ),\n defaultValue: false,\n })\n .addRadio({\n path: 'fontSize',\n name: t('logs.name-font-size', 'Font size'),\n category,\n description: '',\n settings: {\n options: [\n { value: 'default', label: t('logs.font-size-options.label-default', 'Default') },\n {\n value: 'small',\n label: t('logs.font-size-options.label-small', 'Small'),\n },\n ],\n },\n });\n }\n\n builder\n .addRadio({\n path: 'dedupStrategy',\n name: t('logs.name-deduplication', 'Deduplication'),\n category,\n description: '',\n settings: {\n options: [\n {\n value: LogsDedupStrategy.none,\n label: t('logs.deduplication-options.label-none', 'None'),\n description: LogsDedupDescription[LogsDedupStrategy.none],\n },\n {\n value: LogsDedupStrategy.exact,\n label: t('logs.deduplication-options.label-exact', 'Exact'),\n description: LogsDedupDescription[LogsDedupStrategy.exact],\n },\n {\n value: LogsDedupStrategy.numbers,\n label: t('logs.deduplication-options.label-numbers', 'Numbers'),\n description: LogsDedupDescription[LogsDedupStrategy.numbers],\n },\n {\n value: LogsDedupStrategy.signature,\n label: t('logs.deduplication-options.label-signature', 'Signature'),\n description: LogsDedupDescription[LogsDedupStrategy.signature],\n },\n ],\n },\n defaultValue: LogsDedupStrategy.none,\n })\n .addRadio({\n path: 'sortOrder',\n name: t('logs.name-order', 'Order'),\n category,\n description: '',\n settings: {\n options: [\n { value: LogsSortOrder.Descending, label: t('logs.order-options.label-newest-first', 'Newest first') },\n { value: LogsSortOrder.Ascending, label: t('logs.order-options.label-oldest-first', 'Oldest first') },\n ],\n },\n defaultValue: LogsSortOrder.Descending,\n });\n })\n .setSuggestionsSupplier(new LogsPanelSuggestionsSupplier());\n"],"names":["validateQuery","query","interpolatedQuery","queryLines","parser","interpolatedErrors","parseQuery","parseErrors","queryErrors","interpolatedError","queryError","parseError","findErrorBoundary","isErrorBoundary","nodeRef","node","isEmptyString","errorNode","error","startPos","endPos","line","boundary","placeHolderScopedVars","EditorRow","children","styles","getStyles","theme","validate","uuid","EditorStack","wrapItems","props","_a","_b","RawQuery","language","className","highlighted","defer","observableFactory","subscriber","SuggestionName","splitTimeRange","startTime","endTime","idealRangeDuration","result","chunkEndTime","chunkStartTime","step","alignedDuration","alignedStartTime","defaultPerf","warned","PROCESS","emitWarning","msg","type","code","fn","AC","AS","_","warnACPolyfill","reason","printACPolyfillWarning","shouldWarn","TYPE","isPosInt","n","getUintArray","max","ZeroArray","size","Stack","#constructing","HeapCls","LRUCache","#max","#maxSize","#dispose","#onInsert","#disposeAfter","#fetchMethod","#memoMethod","#perf","#size","#calculatedSize","#keyMap","#keyList","#valList","#next","#prev","#head","#tail","#free","#disposed","#sizes","#starts","#ttls","#hasDispose","#hasFetchMethod","#hasDisposeAfter","#hasOnInsert","c","p","#isBackgroundFetch","k","index","options","context","#backgroundFetch","#moveToTail","#indexes","#rindexes","#isStale","ttl","ttlResolution","ttlAutopurge","updateAgeOnGet","updateAgeOnHas","allowStale","dispose","onInsert","disposeAfter","noDisposeOnSet","noUpdateTTL","maxSize","maxEntrySize","sizeCalculation","fetchMethod","memoMethod","noDeleteOnFetchRejection","noDeleteOnStaleGet","allowStaleOnFetchRejection","allowStaleOnFetchAbort","ignoreFetchAbort","perf","UintArray","#initializeSizeTracking","#initializeTTLTracking","key","ttls","starts","#setItemTTL","start","t","#delete","#updateItemAge","#statusTTL","status","cachedNow","getNow","age","s","sizes","#removeItemSize","#requireSize","v","#addItemSize","#evict","_i","_s","_st","_k","_v","i","#isValidIndex","getOptions","value","thisp","deleted","entry","remain","arr","setOptions","oldVal","oldValue","dt","task","val","free","head","hasOptions","peekOptions","ac","signal","fetchOpts","cb","updateCache","aborted","ignoreAbort","fetchFail","bf","vl","eb","er","allowStaleAborted","noDelete","pcall","res","rej","fmp","b","fetchOptions","forceRefresh","stale","isStale","staleVal","memoOptions","vv","fetching","#connect","#clear","pi","ni","NS_IN_MS","EMPTY_SELECTOR","HIDDEN_LABELS","LokiLanguageProvider","datasource","url","params","throwError","requestOptions","timeRange","range","newRangeParams","prevRangeParams","streamSelector","interpolatedMatch","end","cacheKey","data","values","match","labelBasedQuery","labelMatchers","label","config","labels","param","nanoseconds","queryOptions","interpolatedExpr","rangeParams","resolve","reject","labelName","paramCacheKey","labelValues","labelValuesPromise","streamParam","empty","series","DEFAULT_MAX_LINES_SAMPLE","hasLogfmt","hasJSON","hasPack","DEFAULT_WEBSOCKET_CONFIG","e","WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT","WebSocketSubject","_super","urlConfigOrSource","destination","_this","Observable","Subject","ReplaySubject","operator","sock","subMsg","unsubMsg","messageFilter","self","observer","err","subscription","x","WebSocketCtor","protocol","binaryType","socket","Subscription","evt","_socket","openObserver","queue","Subscriber","serializer","closingObserver","closeObserver","deserializer","source","webSocket","f","y","z","ROTL","sha1","bytes","K","H","newBytes","l","N","M","j","W","a","d","T","parse","stringToBytes","str","DNS","v35","version","hash","namespace","buf","offset","valueBytes","namespaceBytes","v5","UUID_NAMESPACE","appendResponseToBufferedData","response","streams","tsField","lineField","idField","usedUids","stream","allLabelsString","ts","createUid","labelsString","refId","id","newCount","LiveStreams","target","retryInterval","CircularDataFrame","map","retryWhen","attempts","mergeMap","retryAttempt","timer","finalize","IS_LOKI_LOG_CONTEXT_UI_OPEN","LokiContextUi","row","logContextProvider","updateFilter","onClose","origQuery","runContextQuery","contextFilters","setContextFilters","showPreservedFiltersAppliedNotification","setShowPreservedFiltersAppliedNotification","initialized","setInitialized","loading","setLoading","isOpen","setIsOpen","includePipelineOperations","setIncludePipelineOperations","SHOULD_INCLUDE_PIPELINE_OPERATIONS","timerHandle","previousInitialized","previousContextFilters","isInitialState","filter","enabled","nonIndexed","preservedLabels","LOKI_LOG_CONTEXT_PRESERVED_LABELS","useAsync","initContextFilters","realLabels","realLabelsEnabled","parsedLabels","parsedLabelsEnabled","contextFilterToSelectFilter","contextFilter","showNonIndexedLabels","queryExpr","Alert","Button","Collapse","Tooltip","Icon","Spinner","Label","keys","actionMeta","InlineFieldRow","InlineField","RenderUserContentAsHTML","SortDirection","makeIndex","field","dir","fieldValues","nanos","isAsc","valA","valB","nanoA","nanoB","sortDataFrameByTime","frame","fields","rest","timeField","sorted","vals","idx","LogContextProvider","cacheFilters","direction","processResults","processedFrames","app","lastValueFrom","makeRequest","REF_ID_STARTER_LOG_ROW_CONTEXT","catchError","switchMap","of","expr","hasParser","nonIndexedLabels","parsedLabel","currentExpr","newExpr","origExpr","allNodePositions","pipelineStagePositions","position","otherNodePositions","pipelineStagePosition","preservedFiltersApplied","rowLabels","allLabels","labelType","preservedLabelsString","arePreservedLabelsUsed","newContextFilters","limit","filters","timeWindowMs","queryDirection","FieldCache","tsValue","timestamp","scopedVars","preparedExpression","labelNamesRegex","labelValuesRegex","migrateVariableQuery","rawQuery","queryBase","variableOptions","LokiVariableQueryEditor","onChange","setType","setLabel","labelOptions","setLabelOptions","setStream","previousType","usePrevious","variableQuery","labelNames","onQueryTypeChange","newType","onLabelChange","newLabel","onStreamChange","handleBlur","Select","Input","LokiVariableSupport","request","from","getDerivedFields","dataFrame","derivedFieldConfigs","derivedFieldsGrouped","newFields","fieldFromDerivedFieldConfig","labelFields","intersectingKey","logMatch","dataSourceSrv","dataLinks","acc","derivedFieldConfig","dsSettings","queryType","makeTableFrames","instantMetricFrames","framesWithRefId","framesByRefId","frames","makeTableFrame","tableTimeField","tableValueField","allLabelNames","valueField","timeArray","valueArray","text","isMetricFrame","setFrameMeta","meta","oldMeta","newMeta","processStreamFrame","custom","newFrame","derivedFields","processStreamsFrames","queryMap","processMetricInstantFrames","processMetricRangeFrames","groupFrames","streamsFrames","metricInstantFrames","metricRangeFrames","improveError","message","transformBackendResult","queries","dataFrames","executedExpr","executedQuery","queryTypeOptions","queryDirections","getQueryDirectionLabel","LokiOptionFields","lineLimitValue","onRunQuery","runOnBlur","onChangeQueryLimit","maxLines","preprocessMaxLines","nextQuery","onMaxLinesChange","onReturnKeyDown","Field","MonacoQueryFieldLazy","MonacoQueryFieldWrapper","lastRunValueRef","handleRunQuery","LokiQueryField","override","prevProps","languageProvider","ExtraFieldElement","history","placeholder","LokiAnnotationsQueryEditor","annotation","onAnnotationChange","onChangeQuery","queryWithRefId","EditorField","event","getQueryHints","hints","queryWithParser","parserCount","hasPipelineErrorFiltering","hasLevel","levelLikeLabel","runShardSplitQuery","splitQueriesByStreamShard","splittingTargets","shouldStop","mergedResponse","subquerySubscription","retriesMap","retryTimer","runNextRequest","group","groups","nextGroupSize","shards","groupSize","cycle","retrying","done","nextRequest","nextGroup","groupHasPendingRequests","shardGroup","retry","errorResponse","debug","retries","targets","adjustTargetsFromResponseState","shardsToQuery","groupShardRequests","subRequest","runSplitQuery","partialResponse","constrainGroupSize","updateGroupSizeFromResponse","combineResponses","replaceResponses","groupTargetsByQueryType","groupedRequests","shardedQueries","otherQueries","selectorPartition","selector","getInitialGroupSize","nextCycle","currentSize","metaExecutionTime","stat","executionTime","DEBUG_ENABLED","getLiveStreamKey","msgUint8","hashBuffer","hashArray","doLokiChannelStream","ds","maxDelta","maxLength","updateFrame","StreamingDataFrame","convertToWebSocketUrl","backend","DEFAULT_MAX_LINES","LOKI_ENDPOINT","REF_ID_DATA_SAMPLES","REF_ID_STARTER_ANNOTATION","REF_ID_STARTER_LOG_VOLUME","REF_ID_STARTER_LOG_SAMPLE","REF_ID_STARTER_STATS","requestId","hideFromInspector","intervalInfo","LokiDatasource","DataSourceWithBackend","instanceSettings","templateSrv","maxDataPoints","liveTarget","settingsData","logsVolumeOption","logsSampleOption","normalizedQuery","isQuerySuitable","dropErrorExpression","logsVolumeRequest","logsSampleRequest","q","scope","fixedRequest","streamQueries","streamRequest","merge","tap","trackQuery","logsQueries","subQueries","baseUrl","adhocFilters","expandedQueries","abstractQueries","existingKeys","abstractQuery","labelMatcher","statsForAll","durations","interpolatedVariableQuery","lokiLogsQuery","variable","lokiSpecialRegexEscape","lodash","expression","action","parserPositions","labelFilterPositions","lastPosition","instant","tagKeys","titleFormat","textFormat","annotations","splitKeys","isDataplaneLog","DataFrameView","maybeDuplicatedTags","tags","logLine","__auto","__interval","__interval_ms","__range","__range_s","__range_ms","variables","exprWithAdHoc","legendFormat","string","defaults","onDashboardLoadedHandler","dashboardId","orgId","grafanaVersion","lokiQueries","metricQueries","instantQueries","rangeQueries","builderModeQueries","codeModeQueries","queriesWithTemplateVariables","isQueryWithTemplateVariables","queriesWithChangedResolution","isQueryWithChangedResolution","queriesWithChangedLineLimit","isQueryWithChangedLineLimit","queriesWithChangedLegend","isQueryWithChangedLegend","shouldNotReportBasedOnRefId","starter","calculateTotalBytes","totalBytes","byteKey","extraPayload","trackGroupedQueries","originalRequest","splittingPayload","partition","total","split_query_partition_size","partitionTimeRange","isLogsQuery","originalTimeRange","stepMs","duration","to","targetFrame","updatedMaxLines","runSplitGroupedQueries","requests","responseKey","totalRequests","longestPartition","requestN","requestGroup","nextRequestN","nextRequestGroup","getNextRequestPointers","updateLoadingFrame","LOADING_FRAME_NAME","loadingFrame","querySupportsSplitting","nonSplittingQueries","normalQueries","logQueries","oneDayMs","directionPartitionedLogQueries","resolutionPartition","resolution","groupedRequest","stepMsPartition","calculateStep","intervalMs","interval_regex","newStep","safeStep","getFrameKey","currentResponse","newResponse","cloneQueryResponse","currentResponseLabelsMap","currentFrame","mergeFrames","cloneDataFrame","mergedErrors","mergedError","mergedTraceIds","currentFrameIndex","shouldCombine","dest","destTimeField","destIdField","sourceTimeField","sourceIdField","sourceTimeValues","totalFields","destIdx","resolveIdx","entryExistsInDest","compareEntries","sourceField","findSourceField","getCombinedMetadataStats","getCombinedNotices","destField","destIndex","sourceIndex","compareNsTimestamps","referenceField","sourceFields","candidates","candidate","TOTAL_BYTES_STAT","EXEC_TIME_STAT","destStats","sourceStats","stats","destStat","sourceStat","eitherStat","destNotices","sourceNotices","notice","frame1","frame2","frameType1","frameType2","field1","field2","customType1","customType2","isOnClickFilterLabel","callback","isOnClickFilterOutLabel","isOnClickFilterString","isOnClickFilterOutString","isIsFilterLabelActive","isOnClickShowField","isOnClickHideField","isSetDisplayedFields","isOnNewLogsReceivedType","isOnLogOptionsChange","isReactNodeArray","isCoreApp","apps","coreApp","isLogLineMenuCustomItems","items","item","useDatasourcesFromTargets","dataSourcesMap","setDataSourcesMap","raw","noCommonLabels","LogsPanel","timeZone","fieldConfig","showControls","showFieldSelector","controlsStorageKey","showLabels","showTime","wrapLogMessage","showCommonLabels","prettifyLogMessage","sortOrder","dedupStrategy","enableLogDetails","showLogContextToggle","onClickFilterLabel","onClickFilterOutLabel","onClickFilterOutString","onClickFilterString","onLogOptionsChange","isFilterLabelActive","logRowMenuIconsBefore","logRowMenuIconsAfter","logLineMenuCustomItems","enableInfiniteScrolling","onNewLogsReceived","fontSize","syntaxHighlighting","detailsModeProp","noInteractions","timestampResolution","showLogAttributes","height","isAscending","style","logsContainerRef","contextRow","setContextRow","scrollElement","setScrollElement","displayedFields","setDisplayedFields","infiniteScrolling","setInfiniteScrolling","loadingRef","panelData","setPanelData","keepScrollPositionRef","closeCallback","eventBus","onAddAdHocFilter","onLogRowHover","onLogContainerMouseLeave","onCloseContext","onOpenContext","showContextToggle","dataSource","showPermaLink","getLogRowContext","origRow","getLogRowContextUi","logRows","deduplicatedRows","commonLabels","logs","m","onPermalinkClick","copyDashboardUrl","getFieldLinks","rowIndex","vars","scrollIntoView","handleOnClickFilterLabel","handleOnClickFilterOutLabel","showField","hideField","handleScroll","atTheBottom","loadMoreLogs","scrollRange","onNewLogsReceivedCallback","newSeries","requestMoreLogs","renderCommonLabels","LogLabels","initialScrollPosition","storageKey","PanelDataErrorView","defaultOnClickFilterLabel","defaultOnClickFilterOutLabel","onClickShowField","onClickHideField","setDisplayedFieldsFn","detailsMode","LogRowContextModal","LogLineContext","element","LogList","getLogsPanelState","ScrollContainer","InfiniteScroll","LogRows","ControlledLogRows","panelStateEncoded","rows","panelState","currentURL","targetGroups","dataRequests","uid","responses","updatedSeries","newData","isObservable","LogsPanelSuggestionsSupplier","builder","list","PanelPlugin","category"],"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