Submit
Path:
~
/
/
usr
/
share
/
grafana
/
public
/
app
/
plugins
/
datasource
/
grafana-pyroscope-datasource
/
dist
/
File Content:
module.js.map
{"version":3,"file":"module.js","mappings":"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","sources":["webpack://@grafana-plugins/grafana-pyroscope-datasource/../../../../../node_modules/fast-deep-equal/index.js","webpack://@grafana-plugins/grafana-pyroscope-datasource/external amd \"@emotion/css\"","webpack://@grafana-plugins/grafana-pyroscope-datasource/external amd \"@grafana/data\"","webpack://@grafana-plugins/grafana-pyroscope-datasource/external amd \"@grafana/runtime\"","webpack://@grafana-plugins/grafana-pyroscope-datasource/external amd \"@grafana/ui\"","webpack://@grafana-plugins/grafana-pyroscope-datasource/external amd \"lodash\"","webpack://@grafana-plugins/grafana-pyroscope-datasource/external amd \"prismjs\"","webpack://@grafana-plugins/grafana-pyroscope-datasource/external amd \"react\"","webpack://@grafana-plugins/grafana-pyroscope-datasource/external amd \"rxjs\"","webpack://@grafana-plugins/grafana-pyroscope-datasource/webpack/bootstrap","webpack://@grafana-plugins/grafana-pyroscope-datasource/webpack/runtime/compat get default export","webpack://@grafana-plugins/grafana-pyroscope-datasource/webpack/runtime/define property getters","webpack://@grafana-plugins/grafana-pyroscope-datasource/webpack/runtime/hasOwnProperty shorthand","webpack://@grafana-plugins/grafana-pyroscope-datasource/webpack/runtime/make namespace object","webpack://@grafana-plugins/grafana-pyroscope-datasource/./QueryEditor/ProfileTypesCascader.tsx","webpack://@grafana-plugins/grafana-pyroscope-datasource/./VariableQueryEditor.tsx","webpack://@grafana-plugins/grafana-pyroscope-datasource/./VariableSupport.ts","webpack://@grafana-plugins/grafana-pyroscope-datasource/./utils.ts","webpack://@grafana-plugins/grafana-pyroscope-datasource/./datasource.ts","webpack://@grafana-plugins/grafana-pyroscope-datasource/./dataquery.gen.ts","webpack://@grafana-plugins/grafana-pyroscope-datasource/./QueryEditor/Stack.tsx","webpack://@grafana-plugins/grafana-pyroscope-datasource/./QueryEditor/EditorRow.tsx","webpack://@grafana-plugins/grafana-pyroscope-datasource/./QueryEditor/EditorRows.tsx","webpack://@grafana-plugins/grafana-pyroscope-datasource/../../../../../node_modules/tslib/tslib.es6.mjs","webpack://@grafana-plugins/grafana-pyroscope-datasource/../../../../../node_modules/react-use/esm/useAsync.js","webpack://@grafana-plugins/grafana-pyroscope-datasource/../../../../../node_modules/react-use/esm/useAsyncFn.js","webpack://@grafana-plugins/grafana-pyroscope-datasource/../../../../../node_modules/react-use/esm/useMountedState.js","webpack://@grafana-plugins/grafana-pyroscope-datasource/./pyroscopeql/pyroscopeql.ts","webpack://@grafana-plugins/grafana-pyroscope-datasource/./pyroscopeql/index.ts","webpack://@grafana-plugins/grafana-pyroscope-datasource/./QueryEditor/autocomplete.ts","webpack://@grafana-plugins/grafana-pyroscope-datasource/./QueryEditor/LabelsEditor.tsx","webpack://@grafana-plugins/grafana-pyroscope-datasource/../../../../../node_modules/react-use/esm/useLatest.js","webpack://@grafana-plugins/grafana-pyroscope-datasource/./QueryEditor/QueryLinkExtension.tsx","webpack://@grafana-plugins/grafana-pyroscope-datasource/./QueryEditor/EditorField.tsx","webpack://@grafana-plugins/grafana-pyroscope-datasource/../../../../../node_modules/react-use/esm/useToggle.js","webpack://@grafana-plugins/grafana-pyroscope-datasource/./QueryEditor/QueryOptionGroup.tsx","webpack://@grafana-plugins/grafana-pyroscope-datasource/./QueryEditor/QueryOptions.tsx","webpack://@grafana-plugins/grafana-pyroscope-datasource/./QueryEditor/QueryEditor.tsx","webpack://@grafana-plugins/grafana-pyroscope-datasource/./module.ts","webpack://@grafana-plugins/grafana-pyroscope-datasource/./ConfigEditor.tsx"],"sourcesContent":["'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","module.exports = __WEBPACK_EXTERNAL_MODULE__89__;","module.exports = __WEBPACK_EXTERNAL_MODULE__781__;","module.exports = __WEBPACK_EXTERNAL_MODULE__531__;","module.exports = __WEBPACK_EXTERNAL_MODULE__7__;","module.exports = __WEBPACK_EXTERNAL_MODULE__241__;","module.exports = __WEBPACK_EXTERNAL_MODULE__146__;","module.exports = __WEBPACK_EXTERNAL_MODULE__959__;","module.exports = __WEBPACK_EXTERNAL_MODULE__269__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React, { useEffect, useMemo, useState } from 'react';\n\nimport { TimeRange } from '@grafana/data';\nimport { Cascader, CascaderOption } from '@grafana/ui';\n\nimport { PyroscopeDataSource } from '../datasource';\nimport { ProfileTypeMessage } from '../types';\n\ntype Props = {\n initialProfileTypeId?: string;\n profileTypes?: ProfileTypeMessage[];\n onChange: (value: string) => void;\n placeholder?: string;\n width?: number;\n};\n\nexport function ProfileTypesCascader(props: Props) {\n const cascaderOptions = useCascaderOptions(props.profileTypes);\n\n return (\n <Cascader\n placeholder={props.placeholder}\n separator={'-'}\n displayAllSelectedLevels={true}\n initialValue={props.initialProfileTypeId}\n allowCustomValue={true}\n onSelect={props.onChange}\n options={cascaderOptions}\n changeOnSelect={false}\n width={props.width ?? 26}\n />\n );\n}\n\n// Turn profileTypes into cascader options\nfunction useCascaderOptions(profileTypes?: ProfileTypeMessage[]): CascaderOption[] {\n return useMemo(() => {\n if (!profileTypes) {\n return [];\n }\n let mainTypes = new Map<string, CascaderOption>();\n // Classify profile types by name then sample type.\n // The profileTypes are something like cpu:sample:nanoseconds:sample:count or app.something.something\n for (let profileType of profileTypes) {\n let parts: string[] = [];\n if (profileType.id.indexOf(':') > -1) {\n parts = profileType.id.split(':');\n }\n\n const [name, type] = parts;\n\n if (!mainTypes.has(name)) {\n mainTypes.set(name, {\n label: name,\n value: name,\n items: [],\n });\n }\n mainTypes.get(name)?.items!.push({\n label: type,\n value: profileType.id,\n });\n }\n return Array.from(mainTypes.values());\n }, [profileTypes]);\n}\n\n/**\n * Loads the profile types.\n *\n * This is exported and not used directly in the ProfileTypesCascader component because in some case we need to know\n * the profileTypes before rendering the cascader.\n * @param datasource\n * @param range Time range for the profile types query.\n */\nexport function useProfileTypes(datasource: PyroscopeDataSource, range?: TimeRange) {\n const [profileTypes, setProfileTypes] = useState<ProfileTypeMessage[]>();\n\n const impreciseRange = {\n to: Math.ceil((range?.to.valueOf() || 0) / 60000) * 60000,\n from: Math.floor((range?.from.valueOf() || 0) / 60000) * 60000,\n };\n\n useEffect(() => {\n (async () => {\n const profileTypes = await datasource.getProfileTypes(impreciseRange.from.valueOf(), impreciseRange.to.valueOf());\n setProfileTypes(profileTypes);\n })();\n }, [datasource, impreciseRange.from, impreciseRange.to]);\n\n return profileTypes;\n}\n","import React, { useEffect, useState } from 'react';\n\nimport { QueryEditorProps, SelectableValue, TimeRange } from '@grafana/data';\nimport { InlineField, InlineFieldRow, LoadingPlaceholder, Select } from '@grafana/ui';\n\nimport { ProfileTypesCascader, useProfileTypes } from './QueryEditor/ProfileTypesCascader';\nimport { PyroscopeDataSource } from './datasource';\nimport { Query, VariableQuery } from './types';\n\nexport function VariableQueryEditor(props: QueryEditorProps<PyroscopeDataSource, Query, {}, VariableQuery>) {\n return (\n <>\n <InlineFieldRow>\n <InlineField\n label=\"Query type\"\n labelWidth={20}\n tooltip={\n <div>The Pyroscope data source plugin provides the following query types for template variables</div>\n }\n >\n <Select\n placeholder=\"Select query type\"\n aria-label=\"Query type\"\n width={25}\n options={[\n { label: 'Profile type', value: 'profileType' as const },\n { label: 'Label', value: 'label' as const },\n { label: 'Label value', value: 'labelValue' as const },\n ]}\n onChange={(value) => {\n if (value.value! === 'profileType') {\n props.onChange({\n ...props.query,\n type: value.value!,\n });\n }\n if (value.value! === 'label') {\n props.onChange({\n ...props.query,\n type: value.value!,\n profileTypeId: '',\n });\n }\n if (value.value! === 'labelValue') {\n props.onChange({\n ...props.query,\n type: value.value!,\n profileTypeId: '',\n labelName: '',\n });\n }\n }}\n value={props.query.type}\n />\n </InlineField>\n </InlineFieldRow>\n\n {(props.query.type === 'labelValue' || props.query.type === 'label') && (\n <ProfileTypeRow\n datasource={props.datasource}\n initialValue={props.query.profileTypeId}\n onChange={(val) => {\n // To make TS happy\n if (props.query.type === 'label' || props.query.type === 'labelValue') {\n props.onChange({ ...props.query, profileTypeId: val });\n }\n }}\n range={props.range}\n />\n )}\n\n {props.query.type === 'labelValue' && (\n <LabelRow\n value={props.query.labelName}\n datasource={props.datasource}\n profileTypeId={props.query.profileTypeId}\n onChange={(val) => {\n if (props.query.type === 'labelValue') {\n props.onChange({ ...props.query, labelName: val });\n }\n }}\n from={props.range?.from.valueOf() || Date.now().valueOf() - 1000 * 60 * 60 * 24}\n to={props.range?.to.valueOf() || Date.now().valueOf()}\n />\n )}\n </>\n );\n}\n\nfunction LabelRow(props: {\n datasource: PyroscopeDataSource;\n value?: string;\n profileTypeId?: string;\n from: number;\n to: number;\n onChange: (val: string) => void;\n}) {\n const [labels, setLabels] = useState<string[]>();\n useEffect(() => {\n (async () => {\n setLabels(await props.datasource.getLabelNames((props.profileTypeId || '') + '{}', props.from, props.to));\n })();\n }, [props.datasource, props.profileTypeId, props.to, props.from]);\n\n const options = labels ? labels.map<SelectableValue>((v) => ({ label: v, value: v })) : [];\n if (labels && props.value && !labels.find((v) => v === props.value)) {\n options.push({ value: props.value, label: props.value });\n }\n\n return (\n <InlineFieldRow>\n <InlineField\n label={'Label'}\n labelWidth={20}\n tooltip={<div>Select label for which to retrieve available values</div>}\n >\n <Select\n allowCustomValue={true}\n placeholder=\"Select label\"\n aria-label=\"Select label\"\n width={25}\n options={options}\n onChange={(option) => props.onChange(option.value)}\n value={props.value}\n />\n </InlineField>\n </InlineFieldRow>\n );\n}\n\nfunction ProfileTypeRow(props: {\n datasource: PyroscopeDataSource;\n onChange: (val: string) => void;\n initialValue?: string;\n range?: TimeRange;\n}) {\n const profileTypes = useProfileTypes(props.datasource, props.range);\n return (\n <InlineFieldRow>\n <InlineField\n label={'Profile type'}\n aria-label={'Profile type'}\n labelWidth={20}\n tooltip={<div>Select profile type for which to retrieve available labels</div>}\n >\n {profileTypes ? (\n <ProfileTypesCascader\n onChange={props.onChange}\n profileTypes={profileTypes}\n initialProfileTypeId={props.initialValue}\n />\n ) : (\n <LoadingPlaceholder text={'Loading'} />\n )}\n </InlineField>\n </InlineFieldRow>\n );\n}\n","import { from, map, Observable, of } from 'rxjs';\n\nimport { CustomVariableSupport, DataQueryRequest, DataQueryResponse, MetricFindValue } from '@grafana/data';\n\nimport { VariableQueryEditor } from './VariableQueryEditor';\nimport { PyroscopeDataSource } from './datasource';\nimport { ProfileTypeMessage, VariableQuery } from './types';\n\nexport interface DataAPI {\n getProfileTypes(start: number, end: number): Promise<ProfileTypeMessage[]>;\n getLabelNames(query: string, start: number, end: number): Promise<string[]>;\n getLabelValues(query: string, label: string, start: number, end: number): Promise<string[]>;\n}\n\nexport class VariableSupport extends CustomVariableSupport<PyroscopeDataSource> {\n constructor(private readonly dataAPI: DataAPI) {\n super();\n }\n\n editor = VariableQueryEditor;\n\n query(request: DataQueryRequest<VariableQuery>): Observable<DataQueryResponse> {\n if (request.targets[0].type === 'profileType') {\n return from(this.dataAPI.getProfileTypes(request.range.from.valueOf(), request.range.to.valueOf())).pipe(\n map((values) => {\n return { data: values.map<MetricFindValue>((v) => ({ text: v.label, value: v.id })) };\n })\n );\n }\n\n if (request.targets[0].type === 'label') {\n if (!request.targets[0].profileTypeId) {\n return of({ data: [] });\n }\n return from(\n this.dataAPI.getLabelNames(\n request.targets[0].profileTypeId + '{}',\n request.range.from.valueOf(),\n request.range.to.valueOf()\n )\n ).pipe(\n map((values) => {\n return { data: values.map((v) => ({ text: v })) };\n })\n );\n }\n\n if (request.targets[0].type === 'labelValue') {\n if (!request.targets[0].labelName || !request.targets[0].profileTypeId) {\n return of({ data: [] });\n }\n return from(\n this.dataAPI.getLabelValues(\n request.targets[0].profileTypeId + '{}',\n request.targets[0].labelName,\n request.range.from.valueOf(),\n request.range.to.valueOf()\n )\n ).pipe(\n map((values) => {\n return { data: values.map((v) => ({ text: v })) };\n })\n );\n }\n\n return of({ data: [] });\n }\n}\n","import { invert } from 'lodash';\nimport { Token } from 'prismjs';\n\nimport { AbstractLabelMatcher, AbstractLabelOperator, AbstractQuery } from '@grafana/data';\n\nexport function extractLabelMatchers(tokens: Array<string | Token>): AbstractLabelMatcher[] {\n const labelMatchers: AbstractLabelMatcher[] = [];\n\n for (const token of tokens) {\n if (!(token instanceof Token)) {\n continue;\n }\n\n if (token.type === 'context-labels') {\n let labelKey = '';\n let labelValue = '';\n let labelOperator = '';\n\n const contentTokens = Array.isArray(token.content) ? token.content : [token.content];\n\n for (let currentToken of contentTokens) {\n if (typeof currentToken === 'string') {\n let currentStr: string;\n currentStr = currentToken;\n if (currentStr === '=' || currentStr === '!=' || currentStr === '=~' || currentStr === '!~') {\n labelOperator = currentStr;\n }\n } else if (currentToken instanceof Token) {\n switch (currentToken.type) {\n case 'label-key':\n labelKey = getMaybeTokenStringContent(currentToken);\n break;\n case 'label-value':\n labelValue = getMaybeTokenStringContent(currentToken);\n labelValue = labelValue.substring(1, labelValue.length - 1);\n const labelComparator = FromPromLikeMap[labelOperator];\n if (labelComparator) {\n labelMatchers.push({ name: labelKey, operator: labelComparator, value: labelValue });\n }\n break;\n }\n }\n }\n }\n }\n\n return labelMatchers;\n}\n\nexport function toPromLikeExpr(labelBasedQuery: AbstractQuery): string {\n const expr = labelBasedQuery.labelMatchers\n .map((selector: AbstractLabelMatcher) => {\n const operator = ToPromLikeMap[selector.operator];\n if (operator) {\n return `${selector.name}${operator}\"${selector.value}\"`;\n } else {\n return '';\n }\n })\n .filter((e: string) => e !== '')\n .join(', ');\n\n return expr ? `{${expr}}` : '';\n}\n\nfunction getMaybeTokenStringContent(token: Token): string {\n if (typeof token.content === 'string') {\n return token.content;\n }\n\n return '';\n}\n\nconst FromPromLikeMap: Record<string, AbstractLabelOperator> = {\n '=': AbstractLabelOperator.Equal,\n '!=': AbstractLabelOperator.NotEqual,\n '=~': AbstractLabelOperator.EqualRegEx,\n '!~': AbstractLabelOperator.NotEqualRegEx,\n};\n\nconst ToPromLikeMap: Record<AbstractLabelOperator, string> = invert(FromPromLikeMap) as Record<\n AbstractLabelOperator,\n string\n>;\n","import Prism, { Grammar } from 'prismjs';\nimport { Observable, of } from 'rxjs';\n\nimport {\n AbstractQuery,\n CoreApp,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n ScopedVars,\n} from '@grafana/data';\nimport { DataSourceWithBackend, getTemplateSrv, TemplateSrv } from '@grafana/runtime';\n\nimport { VariableSupport } from './VariableSupport';\nimport { defaultGrafanaPyroscope, defaultPyroscopeQueryType } from './dataquery.gen';\nimport { PyroscopeDataSourceOptions, Query, ProfileTypeMessage } from './types';\nimport { extractLabelMatchers, toPromLikeExpr } from './utils';\n\nexport class PyroscopeDataSource extends DataSourceWithBackend<Query, PyroscopeDataSourceOptions> {\n constructor(\n instanceSettings: DataSourceInstanceSettings<PyroscopeDataSourceOptions>,\n private readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n this.variables = new VariableSupport(this);\n }\n\n query(request: DataQueryRequest<Query>): Observable<DataQueryResponse> {\n const validTargets = request.targets\n .filter((t) => t.profileTypeId)\n .map((t) => {\n // Empty string errors out but honestly seems like we can just normalize it this way\n if (t.labelSelector === '') {\n return {\n ...t,\n labelSelector: '{}',\n };\n }\n return normalizeQuery(t, request.app);\n });\n if (!validTargets.length) {\n return of({ data: [] });\n }\n return super.query({\n ...request,\n targets: validTargets,\n });\n }\n\n async getProfileTypes(start: number, end: number): Promise<ProfileTypeMessage[]> {\n return await this.getResource('profileTypes', {\n start,\n end,\n });\n }\n\n async getAllProfileTypes(): Promise<ProfileTypeMessage[]> {\n return await this.getResource('profileTypes');\n }\n\n async getLabelNames(query: string, start: number, end: number): Promise<string[]> {\n return await this.getResource('labelNames', { query: this.templateSrv.replace(query), start, end });\n }\n\n async getLabelValues(query: string, label: string, start: number, end: number): Promise<string[]> {\n return await this.getResource('labelValues', {\n label: this.templateSrv.replace(label),\n query: this.templateSrv.replace(query),\n start,\n end,\n });\n }\n\n applyTemplateVariables(query: Query, scopedVars: ScopedVars): Query {\n return {\n ...query,\n labelSelector: this.templateSrv.replace(query.labelSelector ?? '', scopedVars),\n profileTypeId: this.templateSrv.replace(query.profileTypeId ?? '', scopedVars),\n };\n }\n\n async importFromAbstractQueries(abstractQueries: AbstractQuery[]): Promise<Query[]> {\n return abstractQueries.map((abstractQuery) => this.importFromAbstractQuery(abstractQuery));\n }\n\n importFromAbstractQuery(labelBasedQuery: AbstractQuery): Query {\n return {\n refId: labelBasedQuery.refId,\n labelSelector: toPromLikeExpr(labelBasedQuery),\n queryType: 'both',\n profileTypeId: '',\n groupBy: [],\n };\n }\n\n async exportToAbstractQueries(queries: Query[]): Promise<AbstractQuery[]> {\n return queries.map((query) => this.exportToAbstractQuery(query));\n }\n\n exportToAbstractQuery(query: Query): AbstractQuery {\n const pyroscopeQuery = query.labelSelector;\n if (!pyroscopeQuery || pyroscopeQuery.length === 0) {\n return { refId: query.refId, labelMatchers: [] };\n }\n const tokens = Prism.tokenize(pyroscopeQuery, grammar);\n return {\n refId: query.refId,\n labelMatchers: extractLabelMatchers(tokens),\n };\n }\n\n getDefaultQuery(app: CoreApp): Partial<Query> {\n return defaultQuery;\n }\n}\n\nexport const defaultQuery: Partial<Query> = {\n ...defaultGrafanaPyroscope,\n queryType: defaultPyroscopeQueryType,\n};\n\nexport function normalizeQuery(query: Query, app?: CoreApp | string) {\n let normalized = { ...defaultQuery, ...query };\n if (app !== CoreApp.Explore && normalized.queryType === 'both') {\n // In dashboards and other places, we can't show both types of graphs at the same time.\n // This will also be a default when having 'both' query and adding it from explore to dashboard\n normalized.queryType = 'profile';\n }\n return normalized;\n}\n\nconst grammar: Grammar = {\n 'context-labels': {\n pattern: /\\{[^}]*(?=}?)/,\n greedy: true,\n inside: {\n comment: {\n pattern: /#.*/,\n },\n 'label-key': {\n pattern: /[a-zA-Z_]\\w*(?=\\s*(=|!=|=~|!~))/,\n alias: 'attr-name',\n greedy: true,\n },\n 'label-value': {\n pattern: /\"(?:\\\\.|[^\\\\\"])*\"/,\n greedy: true,\n alias: 'attr-value',\n },\n punctuation: /[{]/,\n },\n },\n punctuation: /[{}(),.]/,\n};\n","// Code generated - EDITING IS FUTILE. DO NOT EDIT.\n//\n// Generated by:\n// public/app/plugins/gen.go\n// Using jennies:\n// TSTypesJenny\n// PluginTSTypesJenny\n//\n// Run 'make gen-cue' from repository root to regenerate.\n\nimport * as common from '@grafana/schema';\n\nexport type PyroscopeQueryType = ('metrics' | 'profile' | 'both');\n\nexport const defaultPyroscopeQueryType: PyroscopeQueryType = 'both';\n\nexport interface GrafanaPyroscope extends common.DataQuery {\n /**\n * Allows to group the results.\n */\n groupBy: Array<string>;\n /**\n * Specifies the query label selectors.\n */\n labelSelector: string;\n /**\n * Sets the maximum number of nodes in the flamegraph.\n */\n maxNodes?: number;\n /**\n * Specifies the type of profile to query.\n */\n profileTypeId: string;\n /**\n * Specifies the query span selectors.\n */\n spanSelector?: Array<string>;\n}\n\nexport const defaultGrafanaPyroscope: Partial<GrafanaPyroscope> = {\n groupBy: [],\n labelSelector: '{}',\n spanSelector: [],\n};\n","import { css } from '@emotion/css';\nimport React, { CSSProperties } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\ninterface StackProps {\n direction?: CSSProperties['flexDirection'];\n alignItems?: CSSProperties['alignItems'];\n wrap?: boolean;\n gap?: number;\n flexGrow?: CSSProperties['flexGrow'];\n children: React.ReactNode;\n}\n\nexport function Stack(props: StackProps) {\n const styles = useStyles2(getStyles, props);\n return <div className={styles.root}>{props.children}</div>;\n}\n\nconst getStyles = (theme: GrafanaTheme2, props: StackProps) => ({\n root: css({\n display: 'flex',\n flexDirection: props.direction ?? 'row',\n flexWrap: props.wrap ?? true ? 'wrap' : undefined,\n alignItems: props.alignItems,\n gap: theme.spacing(props.gap ?? 2),\n flexGrow: props.flexGrow,\n }),\n});\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { Stack } from './Stack';\n\ninterface EditorRowProps {\n children: React.ReactNode;\n stackProps?: Partial<React.ComponentProps<typeof Stack>>;\n}\n\nexport const EditorRow = ({ children, stackProps }: EditorRowProps) => {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.root}>\n <Stack gap={2} {...stackProps}>\n {children}\n </Stack>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\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","import React from 'react';\n\nimport { Stack } from './Stack';\n\ninterface EditorRowsProps {\n children: React.ReactNode;\n}\n\nexport const EditorRows = ({ children }: EditorRowsProps) => {\n return (\n <Stack gap={0.5} direction=\"column\">\n {children}\n </Stack>\n );\n};\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n function next() {\n while (env.stack.length) {\n var rec = env.stack.pop();\n try {\n var result = rec.dispose && rec.dispose.call(rec.value);\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n catch (e) {\n fail(e);\n }\n }\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n};\n","import { useEffect } from 'react';\nimport useAsyncFn from './useAsyncFn';\nexport default function useAsync(fn, deps) {\n if (deps === void 0) { deps = []; }\n var _a = useAsyncFn(fn, deps, {\n loading: true,\n }), state = _a[0], callback = _a[1];\n useEffect(function () {\n callback();\n }, [callback]);\n return state;\n}\n","import { __assign } from \"tslib\";\nimport { useCallback, useRef, useState } from 'react';\nimport useMountedState from './useMountedState';\nexport default function useAsyncFn(fn, deps, initialState) {\n if (deps === void 0) { deps = []; }\n if (initialState === void 0) { initialState = { loading: false }; }\n var lastCallId = useRef(0);\n var isMounted = useMountedState();\n var _a = useState(initialState), state = _a[0], set = _a[1];\n var callback = useCallback(function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var callId = ++lastCallId.current;\n if (!state.loading) {\n set(function (prevState) { return (__assign(__assign({}, prevState), { loading: true })); });\n }\n return fn.apply(void 0, args).then(function (value) {\n isMounted() && callId === lastCallId.current && set({ value: value, loading: false });\n return value;\n }, function (error) {\n isMounted() && callId === lastCallId.current && set({ error: error, loading: false });\n return error;\n });\n }, deps);\n return [state, callback];\n}\n","import { useCallback, useEffect, useRef } from 'react';\nexport default function useMountedState() {\n var mountedRef = useRef(false);\n var get = useCallback(function () { return mountedRef.current; }, []);\n useEffect(function () {\n mountedRef.current = true;\n return function () {\n mountedRef.current = false;\n };\n }, []);\n return get;\n}\n","import type { languages } from 'monaco-editor';\n\nexport const languageConfiguration: languages.LanguageConfiguration = {\n // the default separators except `@$`\n wordPattern: /(-?\\d*\\.\\d\\w*)|([^`~!#%^&*()=+\\[{\\]}\\\\|;:'\",<>\\/?\\s]+)/g,\n brackets: [['{', '}']],\n autoClosingPairs: [\n { open: '{', close: '}' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n ],\n surroundingPairs: [\n { open: '{', close: '}' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n ],\n folding: {},\n};\n\nexport const language: languages.IMonarchLanguage = {\n ignoreCase: false,\n defaultToken: '',\n tokenPostfix: '.pyroscopeql',\n\n keywords: [],\n operators: [],\n\n // we include these common regular expressions\n symbols: /[=><!~?:&|+\\-*\\/^%]+/,\n escapes: /\\\\(?:[abfnrtv\\\\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,\n digits: /\\d+(_+\\d+)*/,\n octaldigits: /[0-7]+(_+[0-7]+)*/,\n binarydigits: /[0-1]+(_+[0-1]+)*/,\n hexdigits: /[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,\n integersuffix: /(ll|LL|u|U|l|L)?(ll|LL|u|U|l|L)?/,\n floatsuffix: /[fFlL]?/,\n\n tokenizer: {\n root: [\n // labels\n [/[a-z_]\\w*(?=\\s*(=|!=|=~|!~))/, 'tag'],\n\n // strings\n [/\"([^\"\\\\]|\\\\.)*$/, 'string.invalid'], // non-teminated string\n [/'([^'\\\\]|\\\\.)*$/, 'string.invalid'], // non-teminated string\n [/\"/, 'string', '@string_double'],\n [/'/, 'string', '@string_single'],\n\n // whitespace\n { include: '@whitespace' },\n\n // delimiters and operators\n [/[{}()\\[\\]]/, '@brackets'],\n [/[<>](?!@symbols)/, '@brackets'],\n [\n /@symbols/,\n {\n cases: {\n '@operators': 'delimiter',\n '@default': '',\n },\n },\n ],\n\n // numbers\n [/\\d+/, 'number'],\n [/\\d*\\d+[eE]([\\-+]?\\d+)?(@floatsuffix)/, 'number.float'],\n [/\\d*\\.\\d+([eE][\\-+]?\\d+)?(@floatsuffix)/, 'number.float'],\n [/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/, 'number.hex'],\n [/0[0-7']*[0-7](@integersuffix)/, 'number.octal'],\n [/0[bB][0-1']*[0-1](@integersuffix)/, 'number.binary'],\n [/\\d[\\d']*\\d(@integersuffix)/, 'number'],\n [/\\d(@integersuffix)/, 'number'],\n ],\n\n string_double: [\n [/[^\\\\\"]+/, 'string'],\n [/@escapes/, 'string.escape'],\n [/\\\\./, 'string.escape.invalid'],\n [/\"/, 'string', '@pop'],\n ],\n\n string_single: [\n [/[^\\\\']+/, 'string'],\n [/@escapes/, 'string.escape'],\n [/\\\\./, 'string.escape.invalid'],\n [/'/, 'string', '@pop'],\n ],\n\n clauses: [\n [/[^(,)]/, 'tag'],\n [/\\)/, 'identifier', '@pop'],\n ],\n\n whitespace: [[/[ \\t\\r\\n]+/, 'white']],\n },\n};\n","import { language, languageConfiguration } from './pyroscopeql';\n\nexport const languageDefinition = {\n id: 'pyroscopeql',\n extensions: ['.pyroscopeql'],\n aliases: ['pyroscope', 'pyroscopeql'],\n mimetypes: [],\n def: {\n language,\n languageConfiguration,\n },\n};\n","import { monacoTypes, Monaco } from '@grafana/ui';\n\n/**\n * Class that implements CompletionItemProvider interface and allows us to provide suggestion for the Monaco\n * autocomplete system.\n *\n * At this moment we just pass it all the labels/values we get from Pyroscope backend later on we may do something a bit\n * smarter if there will be lots of labels.\n */\nexport class CompletionProvider implements monacoTypes.languages.CompletionItemProvider {\n triggerCharacters = ['{', ',', '[', '(', '=', '~', ' ', '\"'];\n\n // We set these directly and ae required for the provider to function.\n monaco: Monaco | undefined;\n editor: monacoTypes.editor.IStandaloneCodeEditor | undefined;\n\n private labels: string[] = [];\n private getLabelValues: (label: string) => Promise<string[]> = () => Promise.resolve([]);\n\n init(labels: string[], getLabelValues: (label: string) => Promise<string[]>) {\n this.labels = labels;\n this.getLabelValues = getLabelValues;\n }\n\n provideCompletionItems(\n model: monacoTypes.editor.ITextModel,\n position: monacoTypes.Position\n ): monacoTypes.languages.ProviderResult<monacoTypes.languages.CompletionList> {\n // Should not happen, this should not be called before it is initialized\n if (!(this.monaco && this.editor)) {\n throw new Error('provideCompletionItems called before CompletionProvider was initialized');\n }\n\n // if the model-id does not match, then this call is from a different editor-instance,\n // not \"our instance\", so return nothing\n if (this.editor.getModel()?.id !== model.id) {\n return { suggestions: [] };\n }\n\n const { range, offset } = getRangeAndOffset(this.monaco, model, position);\n const situation = getSituation(model.getValue(), offset);\n\n return this.getCompletions(situation).then((completionItems) => {\n // monaco by-default alphabetically orders the items.\n // to stop it, we use a number-as-string sortkey,\n // so that monaco keeps the order we use\n const maxIndexDigits = completionItems.length.toString().length;\n const suggestions: monacoTypes.languages.CompletionItem[] = completionItems.map((item, index) => ({\n kind: getMonacoCompletionItemKind(item.type, this.monaco!),\n label: item.label,\n insertText: item.insertText,\n sortText: index.toString().padStart(maxIndexDigits, '0'), // to force the order we have\n range,\n }));\n return { suggestions };\n });\n }\n\n /**\n * Get suggestion based on the situation we are in like whether we should suggest label names or values.\n * @param situation\n * @private\n */\n private async getCompletions(situation: Situation): Promise<Completion[]> {\n switch (situation.type) {\n // Not really sure what would make sense to suggest in this case so just leave it\n case 'UNKNOWN': {\n return [];\n }\n case 'EMPTY': {\n return this.labels.map((key) => {\n return {\n label: key,\n insertText: `{${key}=\"`,\n type: 'LABEL_NAME',\n };\n });\n }\n case 'IN_LABEL_NAME':\n return this.labels.map((key) => {\n return {\n label: key,\n insertText: key,\n type: 'LABEL_NAME',\n };\n });\n case 'IN_LABEL_VALUE':\n let values = await this.getLabelValues(situation.labelName);\n return values\n ? values.map((key) => {\n return {\n label: key,\n insertText: situation.betweenQuotes ? key : `\"${key}\"`,\n type: 'LABEL_VALUE',\n };\n })\n : [];\n default:\n throw new Error(`Unexpected situation ${situation}`);\n }\n }\n}\n\n/**\n * Get item kind which is used for icon next to the suggestion.\n * @param type\n * @param monaco\n */\nfunction getMonacoCompletionItemKind(type: CompletionType, monaco: Monaco): monacoTypes.languages.CompletionItemKind {\n switch (type) {\n case 'LABEL_NAME':\n return monaco.languages.CompletionItemKind.Enum;\n case 'LABEL_VALUE':\n return monaco.languages.CompletionItemKind.EnumMember;\n default:\n throw new Error(`Unexpected CompletionType: ${type}`);\n }\n}\n\nexport type CompletionType = 'LABEL_NAME' | 'LABEL_VALUE';\ntype Completion = {\n type: CompletionType;\n label: string;\n insertText: string;\n};\n\nexport type Label = {\n name: string;\n value: string;\n};\n\nexport type Situation =\n | {\n type: 'UNKNOWN';\n }\n | {\n type: 'EMPTY';\n }\n | {\n type: 'IN_LABEL_NAME';\n otherLabels: Label[];\n }\n | {\n type: 'IN_LABEL_VALUE';\n labelName: string;\n betweenQuotes: boolean;\n otherLabels: Label[];\n };\n\nconst labelNameRegex = /[a-zA-Z_][a-zA-Z0-9_]*/;\nconst labelValueRegex = /[^\"]*/; // anything except a double quote\nconst labelPairsRegex = new RegExp(`(${labelNameRegex.source})=\"(${labelValueRegex.source})\"`, 'g');\nconst inLabelValueRegex = new RegExp(`(${labelNameRegex.source})=(\"?)${labelValueRegex.source}$`);\nconst inLabelNameRegex = new RegExp(/[{,]\\s*[a-zA-Z0-9_]*$/);\n\n/**\n * Figure out where is the cursor and what kind of suggestions are appropriate.\n * As currently Pyroscope handles just a simple {foo=\"bar\", baz=\"zyx\"} kind of values we can do with simple regex to figure\n * out where we are with the cursor.\n * @param text\n * @param offset\n */\nfunction getSituation(text: string, offset: number): Situation {\n if (text === '') {\n return {\n type: 'EMPTY',\n };\n }\n\n // Get all the labels so far in the query, so we can do some more filtering.\n const matches = text.matchAll(labelPairsRegex);\n const existingLabels = Array.from(matches).reduce<Label[]>((acc, match) => {\n const [_, name, value] = match[1];\n acc.push({ name, value });\n return acc;\n }, []);\n\n // Check if we are editing a label value right now. If so also get name of the label\n const matchLabelValue = text.substring(0, offset).match(inLabelValueRegex);\n if (matchLabelValue) {\n return {\n type: 'IN_LABEL_VALUE',\n labelName: matchLabelValue[1],\n betweenQuotes: !!matchLabelValue[2],\n otherLabels: existingLabels,\n };\n }\n\n // Check if we are editing a label name\n const matchLabelName = text.substring(0, offset).match(inLabelNameRegex);\n if (matchLabelName) {\n return {\n type: 'IN_LABEL_NAME',\n otherLabels: existingLabels,\n };\n }\n\n // Will happen only if user writes something that isn't really a label selector\n return {\n type: 'UNKNOWN',\n };\n}\n\nfunction getRangeAndOffset(monaco: Monaco, model: monacoTypes.editor.ITextModel, position: monacoTypes.Position) {\n const word = model.getWordAtPosition(position);\n const range =\n word != null\n ? monaco.Range.lift({\n startLineNumber: position.lineNumber,\n endLineNumber: position.lineNumber,\n startColumn: word.startColumn,\n endColumn: word.endColumn,\n })\n : monaco.Range.fromPositions(position);\n\n // documentation says `position` will be \"adjusted\" in `getOffsetAt` so we clone it here just for sure.\n const positionClone = {\n column: position.column,\n lineNumber: position.lineNumber,\n };\n\n const offset = model.getOffsetAt(positionClone);\n return { offset, range };\n}\n","import { css } from '@emotion/css';\nimport React, { useEffect, useRef } from 'react';\nimport { useAsync, useLatest } from 'react-use';\n\nimport { CodeEditor, Monaco, useStyles2, monacoTypes } from '@grafana/ui';\n\nimport { languageDefinition } from '../pyroscopeql';\n\nimport { CompletionProvider } from './autocomplete';\n\ninterface Props {\n value: string;\n onChange: (val: string) => void;\n onRunQuery: (value: string) => void;\n labels?: string[];\n getLabelValues: (label: string) => Promise<string[]>;\n}\n\nexport function LabelsEditor(props: Props) {\n const setupAutocompleteFn = useAutocomplete(props.getLabelValues, props.labels);\n const styles = useStyles2(getStyles);\n\n const onRunQueryRef = useLatest(props.onRunQuery);\n const containerRef = useRef<HTMLDivElement>(null);\n\n return (\n <div\n className={styles.wrapper}\n // NOTE: we will be setting inline-style-width/height on this element\n ref={containerRef}\n >\n <CodeEditor\n value={props.value}\n language={langId}\n onChange={props.onChange}\n containerStyles={styles.queryField}\n monacoOptions={{\n folding: false,\n fontSize: 14,\n lineNumbers: 'off',\n overviewRulerLanes: 0,\n renderLineHighlight: 'none',\n scrollbar: {\n vertical: 'hidden',\n verticalScrollbarSize: 8, // used as \"padding-right\"\n horizontal: 'hidden',\n horizontalScrollbarSize: 0,\n },\n scrollBeyondLastLine: false,\n wordWrap: 'on',\n padding: {\n top: 4,\n bottom: 5,\n },\n }}\n onBeforeEditorMount={ensurePyroscopeQL}\n onEditorDidMount={(editor, monaco) => {\n setupAutocompleteFn(editor, monaco);\n\n const updateElementHeight = () => {\n const containerDiv = containerRef.current;\n if (containerDiv !== null) {\n const pixelHeight = editor.getContentHeight();\n containerDiv.style.height = `${pixelHeight + EDITOR_HEIGHT_OFFSET}px`;\n containerDiv.style.width = '100%';\n const pixelWidth = containerDiv.clientWidth;\n editor.layout({ width: pixelWidth, height: pixelHeight });\n }\n };\n\n editor.onDidContentSizeChange(updateElementHeight);\n updateElementHeight();\n\n editor.addCommand(monaco.KeyMod.Shift | monaco.KeyCode.Enter, () => {\n onRunQueryRef.current(editor.getValue());\n });\n }}\n />\n </div>\n );\n}\n\n// this number was chosen by testing various values. it might be necessary\n// because of the width of the border, not sure.\n//it needs to do 2 things:\n// 1. when the editor is single-line, it should make the editor height be visually correct\n// 2. when the editor is multi-line, the editor should not be \"scrollable\" (meaning,\n// you do a scroll-movement in the editor, and it will scroll the content by a couple pixels\n// up & down. this we want to avoid)\nconst EDITOR_HEIGHT_OFFSET = 2;\n\n/**\n * Hook that returns function that will set up monaco autocomplete for the label selector\n */\nfunction useAutocomplete(getLabelValues: (label: string) => Promise<string[]>, labels?: string[]) {\n const providerRef = useRef<CompletionProvider>();\n if (providerRef.current === undefined) {\n providerRef.current = new CompletionProvider();\n }\n\n useAsync(async () => {\n if (providerRef.current) {\n providerRef.current.init(labels || [], getLabelValues);\n }\n }, [labels, getLabelValues]);\n\n const autocompleteDisposeFun = useRef<(() => void) | null>(null);\n useEffect(() => {\n // when we unmount, we unregister the autocomplete-function, if it was registered\n return () => {\n autocompleteDisposeFun.current?.();\n };\n }, []);\n\n // This should be run in monaco onEditorDidMount\n return (editor: monacoTypes.editor.IStandaloneCodeEditor, monaco: Monaco) => {\n if (providerRef.current) {\n providerRef.current.editor = editor;\n providerRef.current.monaco = monaco;\n\n const { dispose } = monaco.languages.registerCompletionItemProvider(langId, providerRef.current);\n autocompleteDisposeFun.current = dispose;\n }\n };\n}\n\n// we must only run the setup code once\nlet pyroscopeqlSetupDone = false;\nconst langId = 'pyroscopeql';\n\nfunction ensurePyroscopeQL(monaco: Monaco) {\n if (pyroscopeqlSetupDone === false) {\n pyroscopeqlSetupDone = true;\n const { aliases, extensions, mimetypes, def } = languageDefinition;\n monaco.languages.register({ id: langId, aliases, extensions, mimetypes });\n monaco.languages.setMonarchTokensProvider(langId, def.language);\n monaco.languages.setLanguageConfiguration(langId, def.languageConfiguration);\n }\n}\n\nconst getStyles = () => {\n return {\n queryField: css`\n label: LabelsEditorQueryField;\n flex: 1;\n // Not exactly sure but without this the editor does not shrink after resizing (so you can make it bigger but not\n // smaller). At the same time this does not actually make the editor 100px because it has flex 1 so I assume\n // this should sort of act as a flex-basis (but flex-basis does not work for this). So yeah CSS magic.\n width: 100px;\n `,\n wrapper: css`\n label: LabelsEditorWrapper;\n display: flex;\n flex: 1;\n border: 1px solid rgba(36, 41, 46, 0.3);\n border-radius: 2px;\n `,\n };\n};\n","import { useRef } from 'react';\nvar useLatest = function (value) {\n var ref = useRef(value);\n ref.current = value;\n return ref;\n};\nexport default useLatest;\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { useAsync } from 'react-use';\n\nimport { GrafanaTheme2, QueryEditorProps, TimeRange } from '@grafana/data';\nimport { getBackendSrv, getPluginLinkExtensions } from '@grafana/runtime';\nimport { LinkButton, useStyles2 } from '@grafana/ui';\n\nimport { PyroscopeDataSource } from '../datasource';\nimport { PyroscopeDataSourceOptions, Query } from '../types';\n\nconst EXTENSION_POINT_ID = 'plugins/grafana-pyroscope-datasource/query-links';\n\n/** A subset of the datasource settings that are relevant for this integration */\ntype PyroscopeDatasourceSettings = {\n uid: string;\n url: string;\n type: string;\n basicAuthUser: string;\n};\n\n/** The context object that will be shared with the link extension's configure function */\ntype ExtensionQueryLinksContext = {\n datasourceUid: string;\n query: Query;\n range?: TimeRange | undefined;\n datasourceSettings?: PyroscopeDatasourceSettings;\n};\n\n/* Global promises to fetch pyroscope datasource settings by uid as encountered */\nconst pyroscopeDatasourceSettingsByUid: Record<string, PyroscopeDatasourceSettings> = {};\n\n/* Reset promises for testing purposes */\nexport function resetPyroscopeQueryLinkExtensionsFetches() {\n Object.keys(pyroscopeDatasourceSettingsByUid).forEach((key) => delete pyroscopeDatasourceSettingsByUid[key]);\n}\n\n/** A subset of the `PyroscopeDataSource` `QueryEditorProps` */\nexport type Props = Pick<\n QueryEditorProps<PyroscopeDataSource, Query, PyroscopeDataSourceOptions>,\n 'datasource' | 'query' | 'range'\n>;\n\nexport function PyroscopeQueryLinkExtensions(props: Props) {\n const {\n datasource: { uid: datasourceUid },\n query,\n range,\n } = props;\n\n const { value: datasourceSettings } = useAsync(async () => {\n if (pyroscopeDatasourceSettingsByUid[datasourceUid]) {\n return pyroscopeDatasourceSettingsByUid[datasourceUid];\n }\n const settings = await getBackendSrv().get<PyroscopeDatasourceSettings>(`/api/datasources/uid/${datasourceUid}`);\n pyroscopeDatasourceSettingsByUid[datasourceUid] = settings;\n return settings;\n }, [datasourceUid]);\n\n const context: ExtensionQueryLinksContext = {\n datasourceUid,\n query,\n range,\n datasourceSettings,\n };\n\n const { extensions } = getPluginLinkExtensions({\n extensionPointId: EXTENSION_POINT_ID,\n context,\n });\n\n const styles = useStyles2(getStyles);\n\n if (extensions.length === 0) {\n return null;\n }\n\n return (\n <>\n {extensions.map((extension) => (\n <LinkButton\n className={styles.linkButton}\n key={`${extension.id}`}\n variant=\"secondary\"\n icon={extension.icon || 'external-link-alt'}\n tooltip={extension.description}\n target=\"_blank\"\n href={extension.path}\n onClick={extension.onClick}\n >\n {extension.title}\n </LinkButton>\n ))}\n </>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n linkButton: css({\n marginLeft: theme.spacing(1),\n }),\n };\n}\n","import { css } from '@emotion/css';\nimport React, { ComponentProps } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Field, Icon, PopoverContent, ReactUtils, Tooltip, useStyles2 } from '@grafana/ui';\n\ninterface EditorFieldProps extends ComponentProps<typeof Field> {\n label: string;\n children: React.ReactElement;\n width?: number | string;\n optional?: boolean;\n tooltip?: PopoverContent;\n}\n\nexport const EditorField = (props: EditorFieldProps) => {\n const { label, optional, tooltip, children, width, ...fieldProps } = props;\n\n const styles = useStyles2(getStyles, width);\n\n // Null check for backward compatibility\n const childInputId = fieldProps?.htmlFor || ReactUtils?.getChildId(children);\n\n const labelEl = (\n <>\n <label className={styles.label} htmlFor={childInputId}>\n {label}\n {optional && <span className={styles.optional}> - optional</span>}\n {tooltip && (\n <Tooltip placement=\"top\" content={tooltip} theme=\"info\">\n <Icon name=\"info-circle\" size=\"sm\" className={styles.icon} />\n </Tooltip>\n )}\n </label>\n <span className={styles.space} />\n </>\n );\n\n return (\n <div className={styles.root}>\n <Field className={styles.field} label={labelEl} {...fieldProps}>\n {children}\n </Field>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2, width?: number | string) => ({\n space: css({\n paddingRight: theme.spacing(0),\n paddingBottom: theme.spacing(0.5),\n }),\n root: css({\n minWidth: theme.spacing(width ?? 0),\n }),\n label: css({\n fontSize: 12,\n fontWeight: theme.typography.fontWeightMedium,\n }),\n optional: css({\n fontStyle: 'italic',\n color: theme.colors.text.secondary,\n }),\n field: css({\n marginBottom: 0, // GrafanaUI/Field has a bottom margin which we must remove\n }),\n icon: css({\n color: theme.colors.text.secondary,\n marginLeft: theme.spacing(1),\n ':hover': {\n color: theme.colors.text.primary,\n },\n }),\n});\n","import { useReducer } from 'react';\nvar toggleReducer = function (state, nextValue) {\n return typeof nextValue === 'boolean' ? nextValue : !state;\n};\nvar useToggle = function (initialValue) {\n return useReducer(toggleReducer, initialValue);\n};\nexport default useToggle;\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { useToggle } from 'react-use';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Collapse, useStyles2, Stack } from '@grafana/ui';\n\nexport interface Props {\n title: string;\n collapsedInfo: string[];\n children: React.ReactNode;\n}\n\nexport function QueryOptionGroup({ title, children, collapsedInfo }: Props) {\n const [isOpen, toggleOpen] = useToggle(false);\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.wrapper}>\n <Collapse\n className={styles.collapse}\n collapsible\n isOpen={isOpen}\n onToggle={toggleOpen}\n label={\n <Stack gap={0}>\n <h6 className={styles.title}>{title}</h6>\n {!isOpen && (\n <div className={styles.description}>\n {collapsedInfo.map((x, i) => (\n <span key={i}>{x}</span>\n ))}\n </div>\n )}\n </Stack>\n }\n >\n <div className={styles.body}>{children}</div>\n </Collapse>\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n collapse: css({\n backgroundColor: 'unset',\n border: 'unset',\n marginBottom: 0,\n\n ['> button']: {\n padding: theme.spacing(0, 1),\n },\n }),\n wrapper: css({\n width: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'baseline',\n }),\n title: css({\n flexGrow: 1,\n overflow: 'hidden',\n fontSize: theme.typography.bodySmall.fontSize,\n fontWeight: theme.typography.fontWeightMedium,\n margin: 0,\n }),\n description: css({\n color: theme.colors.text.secondary,\n fontSize: theme.typography.bodySmall.fontSize,\n fontWeight: theme.typography.bodySmall.fontWeight,\n paddingLeft: theme.spacing(2),\n gap: theme.spacing(2),\n display: 'flex',\n }),\n body: css({\n display: 'flex',\n gap: theme.spacing(2),\n flexWrap: 'wrap',\n }),\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { CoreApp, GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { useStyles2, RadioButtonGroup, MultiSelect, Input } from '@grafana/ui';\n\nimport { Query } from '../types';\n\nimport { EditorField } from './EditorField';\nimport { QueryOptionGroup } from './QueryOptionGroup';\nimport { Stack } from './Stack';\n\nexport interface Props {\n query: Query;\n onQueryChange: (query: Query) => void;\n app?: CoreApp;\n labels?: string[];\n}\n\nconst typeOptions: Array<{ value: Query['queryType']; label: string; description: string }> = [\n { value: 'metrics', label: 'Metric', description: 'Return aggregated metrics' },\n { value: 'profile', label: 'Profile', description: 'Return profile' },\n { value: 'both', label: 'Both', description: 'Return both metric and profile data' },\n];\n\nfunction getTypeOptions(app?: CoreApp) {\n if (app === CoreApp.Explore) {\n return typeOptions;\n }\n return typeOptions.filter((option) => option.value !== 'both');\n}\n\n/**\n * Base on QueryOptionGroup component from grafana/ui but that is not available yet.\n */\nexport function QueryOptions({ query, onQueryChange, app, labels }: Props) {\n const styles = useStyles2(getStyles);\n const typeOptions = getTypeOptions(app);\n const groupByOptions = labels\n ? labels.map((l) => ({\n label: l,\n value: l,\n }))\n : [];\n\n let collapsedInfo = [`Type: ${query.queryType}`];\n if (query.groupBy?.length) {\n collapsedInfo.push(`Group by: ${query.groupBy.join(', ')}`);\n }\n if (query.spanSelector?.length) {\n collapsedInfo.push(`Span ID: ${query.spanSelector.join(', ')}`);\n }\n if (query.maxNodes) {\n collapsedInfo.push(`Max nodes: ${query.maxNodes}`);\n }\n\n return (\n <Stack gap={0} direction=\"column\">\n <QueryOptionGroup title=\"Options\" collapsedInfo={collapsedInfo}>\n <div className={styles.body}>\n <EditorField label={'Query Type'}>\n <RadioButtonGroup\n options={typeOptions}\n value={query.queryType}\n onChange={(value) => onQueryChange({ ...query, queryType: value })}\n />\n </EditorField>\n <EditorField\n label={'Group by'}\n tooltip={\n <>\n Used to group the metric result by a specific label or set of labels. Does not apply to profile query.\n </>\n }\n >\n <MultiSelect\n placeholder=\"Label\"\n value={query.groupBy}\n allowCustomValue\n options={groupByOptions}\n onChange={(change) => {\n const changes = change.map((c: SelectableValue<string>) => {\n return c.value!;\n });\n onQueryChange({ ...query, groupBy: changes });\n }}\n />\n </EditorField>\n <EditorField label={'Span ID'} tooltip={<>Sets the span ID from which to search for profiles.</>}>\n <Input\n value={query.spanSelector || ['']}\n type=\"string\"\n placeholder=\"64f170a95f537095\"\n onChange={(event: React.SyntheticEvent<HTMLInputElement>) => {\n onQueryChange({\n ...query,\n spanSelector: event.currentTarget.value !== '' ? [event.currentTarget.value] : [],\n });\n }}\n />\n </EditorField>\n <EditorField label={'Max Nodes'} tooltip={<>Sets the maximum number of nodes to return in the flamegraph.</>}>\n <Input\n value={query.maxNodes || ''}\n type=\"number\"\n placeholder=\"16384\"\n onChange={(event: React.SyntheticEvent<HTMLInputElement>) => {\n let newValue = parseInt(event.currentTarget.value, 10);\n newValue = isNaN(newValue) ? 0 : newValue;\n onQueryChange({ ...query, maxNodes: newValue });\n }}\n />\n </EditorField>\n </div>\n </QueryOptionGroup>\n </Stack>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n switchLabel: css({\n color: theme.colors.text.secondary,\n cursor: 'pointer',\n fontSize: theme.typography.bodySmall.fontSize,\n '&:hover': {\n color: theme.colors.text.primary,\n },\n }),\n body: css({\n display: 'flex',\n paddingTop: theme.spacing(2),\n gap: theme.spacing(2),\n flexWrap: 'wrap',\n }),\n };\n};\n","import deepEqual from 'fast-deep-equal';\nimport { debounce } from 'lodash';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { CoreApp, QueryEditorProps, TimeRange } from '@grafana/data';\nimport { LoadingPlaceholder } from '@grafana/ui';\n\nimport { normalizeQuery, PyroscopeDataSource } from '../datasource';\nimport { ProfileTypeMessage, PyroscopeDataSourceOptions, Query } from '../types';\n\nimport { EditorRow } from './EditorRow';\nimport { EditorRows } from './EditorRows';\nimport { LabelsEditor } from './LabelsEditor';\nimport { ProfileTypesCascader, useProfileTypes } from './ProfileTypesCascader';\nimport { PyroscopeQueryLinkExtensions } from './QueryLinkExtension';\nimport { QueryOptions } from './QueryOptions';\n\nexport type Props = QueryEditorProps<PyroscopeDataSource, Query, PyroscopeDataSourceOptions>;\n\nconst labelSelectorRegex = /(\\w+)\\s*=\\s*(\"[^,\"]+\")/g;\n\nexport function QueryEditor(props: Props) {\n const { onChange, onRunQuery, datasource, query, range, app } = props;\n\n function handleRunQuery(value: string) {\n onChange({ ...query, labelSelector: value });\n onRunQuery();\n }\n\n const onLabelSelectorChange = useLabelSelector(query, onChange);\n\n const profileTypes = useProfileTypes(datasource, range);\n const { labels, getLabelValues } = useLabels(range, datasource, query);\n useNormalizeQuery(query, profileTypes, onChange, app);\n\n let cascader = <LoadingPlaceholder text={'Loading'} />;\n\n // The cascader is uncontrolled component so if we want to set some default value we can do it only on initial\n // render, so we are waiting until we have the profileTypes and know what the default value should be before\n // rendering.\n if (profileTypes && query.profileTypeId !== undefined) {\n cascader = (\n <ProfileTypesCascader\n placeholder={profileTypes.length === 0 ? 'No profile types found' : 'Select profile type'}\n profileTypes={profileTypes}\n initialProfileTypeId={query.profileTypeId}\n onChange={(val) => {\n onChange({ ...query, profileTypeId: val });\n }}\n />\n );\n }\n\n return (\n <EditorRows>\n <EditorRow stackProps={{ wrap: false, gap: 1 }}>\n {cascader}\n <LabelsEditor\n value={query.labelSelector}\n onChange={onLabelSelectorChange}\n onRunQuery={handleRunQuery}\n labels={labels}\n getLabelValues={getLabelValues}\n />\n <PyroscopeQueryLinkExtensions {...props} />\n </EditorRow>\n <EditorRow>\n <QueryOptions query={query} onQueryChange={props.onChange} app={props.app} labels={labels} />\n </EditorRow>\n </EditorRows>\n );\n}\n\nfunction useNormalizeQuery(\n query: Query,\n profileTypes: ProfileTypeMessage[] | undefined,\n onChange: (value: Query) => void,\n app?: CoreApp\n) {\n useEffect(() => {\n if (!profileTypes) {\n return;\n }\n const normalizedQuery = normalizeQuery(query, app);\n // We just check if profileTypeId is filled but don't check if it's one of the existing cause it can be template\n // variable\n if (!query.profileTypeId) {\n normalizedQuery.profileTypeId = defaultProfileType(profileTypes);\n }\n // Makes sure we don't have an infinite loop updates because the normalization creates a new object\n if (!deepEqual(query, normalizedQuery)) {\n onChange(normalizedQuery);\n }\n }, [app, query, profileTypes, onChange]);\n}\n\nfunction defaultProfileType(profileTypes: ProfileTypeMessage[]): string {\n const cpuProfiles = profileTypes.filter((p) => p.id.indexOf('cpu') >= 0);\n if (cpuProfiles.length) {\n // Prefer cpu time profile if available instead of samples\n const cpuTimeProfile = cpuProfiles.find((p) => p.id.indexOf('samples') === -1);\n if (cpuTimeProfile) {\n return cpuTimeProfile.id;\n }\n // Fallback to first cpu profile type\n return cpuProfiles[0].id;\n }\n\n // Fallback to first profile type from response data\n return profileTypes[0]?.id || '';\n}\n\nfunction useLabels(range: TimeRange | undefined, datasource: PyroscopeDataSource, query: Query) {\n // Round to nearest 5 seconds. If the range is something like last 1h then every render the range values change slightly\n // and what ever has range as dependency is rerun. So this effectively debounces the queries.\n const unpreciseRange = {\n to: Math.ceil((range?.to.valueOf() || 0) / 10000) * 10000,\n from: Math.floor((range?.from.valueOf() || 0) / 10000) * 10000,\n };\n\n // Transforms user input into a valid label selector including the profile type.\n // It can optionally remove a label, used to support editing existing label values.\n const createSelector = (rawInput: string, profileTypeId: string, labelToRemove: string): string => {\n let labels: string[] = [`__profile_type__=\\\"${profileTypeId}\\\"`];\n let match;\n while ((match = labelSelectorRegex.exec(rawInput)) !== null) {\n if (match[1] && match[2]) {\n if (match[1] === labelToRemove) {\n continue;\n }\n labels.push(`${match[1]}=${match[2]}`);\n }\n }\n return `{${labels.join(',')}}`;\n };\n\n const [labels, setLabels] = useState(() => ['']);\n\n useEffect(() => {\n const fetchData = async () => {\n const labels = await datasource.getLabelNames(\n createSelector(query.labelSelector, query.profileTypeId, ''),\n unpreciseRange.from,\n unpreciseRange.to\n );\n\n setLabels(labels);\n };\n fetchData();\n }, [query, unpreciseRange.from, unpreciseRange.to, datasource, setLabels]);\n\n // Create a function with range and query already baked in, so we don't have to send those everywhere\n const getLabelValues = useCallback(\n (label: string) => {\n const labelSelector = createSelector(query.labelSelector, query.profileTypeId, label);\n return datasource.getLabelValues(labelSelector, label, unpreciseRange.from, unpreciseRange.to);\n },\n [datasource, query.labelSelector, query.profileTypeId, unpreciseRange.to, unpreciseRange.from]\n );\n\n return { labels, getLabelValues };\n}\n\nfunction useLabelSelector(query: Query, onChange: (value: Query) => void) {\n // Need to reference the query as otherwise when the label selector is changed, only the initial value\n // of the query is passed into the LabelsEditor (onChange) which renders the CodeEditor for monaco.\n // The above needs to have a ref to the query so it can get the latest value.\n const queryRef = useRef(query);\n queryRef.current = query;\n\n const onChangeDebounced = debounce((value: string) => {\n if (onChange) {\n onChange({ ...queryRef.current, labelSelector: value });\n }\n }, 200);\n\n const onLabelSelectorChange = useCallback(\n (value: string) => {\n onChangeDebounced(value);\n },\n [onChangeDebounced]\n );\n\n return onLabelSelectorChange;\n}\n","import { DataSourcePlugin } from '@grafana/data';\n\nimport { ConfigEditor } from './ConfigEditor';\nimport { QueryEditor } from './QueryEditor/QueryEditor';\nimport { PyroscopeDataSource } from './datasource';\nimport { Query, PyroscopeDataSourceOptions } from './types';\n\nexport const plugin = new DataSourcePlugin<PyroscopeDataSource, Query, PyroscopeDataSourceOptions>(PyroscopeDataSource)\n .setConfigEditor(ConfigEditor)\n .setQueryEditor(QueryEditor);\n","import React from 'react';\n\nimport { DataSourcePluginOptionsEditorProps } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { DataSourceHttpSettings, EventsWithValidation, LegacyForms, regexValidation } from '@grafana/ui';\n\nimport { PyroscopeDataSourceOptions } from './types';\n\ninterface Props extends DataSourcePluginOptionsEditorProps<PyroscopeDataSourceOptions> {}\n\nexport const ConfigEditor = (props: Props) => {\n const { options, onOptionsChange } = props;\n\n return (\n <>\n <DataSourceHttpSettings\n defaultUrl={'http://localhost:4040'}\n dataSourceConfig={options}\n showAccessOptions={false}\n onChange={onOptionsChange}\n secureSocksDSProxyEnabled={config.secureSocksDSProxyEnabled}\n />\n\n <h3 className=\"page-heading\">Querying</h3>\n <div className=\"gf-form-group\">\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <LegacyForms.FormField\n label=\"Minimal step\"\n labelWidth={13}\n inputEl={\n <LegacyForms.Input\n className=\"width-6\"\n value={options.jsonData.minStep}\n spellCheck={false}\n placeholder=\"15s\"\n onChange={(event) => {\n onOptionsChange({\n ...options,\n jsonData: {\n ...options.jsonData,\n minStep: event.currentTarget.value,\n },\n });\n }}\n validationEvents={{\n [EventsWithValidation.onBlur]: [\n regexValidation(\n /^$|^\\d+(ms|[Mwdhmsy])$/,\n 'Value is not valid, you can use number with time unit specifier: y, M, w, d, h, m, s'\n ),\n ],\n }}\n />\n }\n tooltip=\"Minimal step used for metric query. Should be the same or higher as the scrape interval setting in the Pyroscope database.\"\n />\n </div>\n </div>\n </div>\n </>\n );\n};\n"],"names":["module","exports","equal","a","b","constructor","length","i","keys","Array","isArray","RegExp","source","flags","valueOf","Object","prototype","toString","hasOwnProperty","call","key","__WEBPACK_EXTERNAL_MODULE__89__","__WEBPACK_EXTERNAL_MODULE__781__","__WEBPACK_EXTERNAL_MODULE__531__","__WEBPACK_EXTERNAL_MODULE__7__","__WEBPACK_EXTERNAL_MODULE__241__","__WEBPACK_EXTERNAL_MODULE__146__","__WEBPACK_EXTERNAL_MODULE__959__","__WEBPACK_EXTERNAL_MODULE__269__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","definition","o","defineProperty","enumerable","get","obj","prop","r","Symbol","toStringTag","value","ProfileTypesCascader","props","cascaderOptions","profileTypes","useMemo","mainTypes","Map","profileType","parts","id","indexOf","split","name","type","has","set","label","items","push","from","values","Cascader","placeholder","separator","displayAllSelectedLevels","initialValue","initialProfileTypeId","allowCustomValue","onSelect","onChange","options","changeOnSelect","width","useProfileTypes","datasource","range","setProfileTypes","useState","impreciseRange","to","Math","ceil","floor","useEffect","getProfileTypes","VariableQueryEditor","InlineFieldRow","InlineField","labelWidth","tooltip","div","Select","aria-label","query","profileTypeId","labelName","ProfileTypeRow","val","LabelRow","Date","now","labels","setLabels","getLabelNames","map","v","find","option","LoadingPlaceholder","text","VariableSupport","CustomVariableSupport","request","targets","this","dataAPI","pipe","data","of","getLabelValues","super","editor","extractLabelMatchers","tokens","labelMatchers","token","Token","labelKey","labelValue","labelOperator","contentTokens","content","currentToken","currentStr","getMaybeTokenStringContent","substring","labelComparator","FromPromLikeMap","operator","toPromLikeExpr","labelBasedQuery","expr","selector","ToPromLikeMap","filter","e","join","AbstractLabelOperator","Equal","NotEqual","EqualRegEx","NotEqualRegEx","invert","PyroscopeDataSource","DataSourceWithBackend","validTargets","t","labelSelector","normalizeQuery","app","start","end","getResource","getAllProfileTypes","templateSrv","replace","applyTemplateVariables","scopedVars","importFromAbstractQueries","abstractQueries","abstractQuery","importFromAbstractQuery","refId","queryType","groupBy","exportToAbstractQueries","queries","exportToAbstractQuery","pyroscopeQuery","Prism","grammar","getDefaultQuery","defaultQuery","instanceSettings","getTemplateSrv","variables","spanSelector","defaultGrafanaPyroscope","normalized","CoreApp","Explore","pattern","greedy","inside","comment","alias","punctuation","Stack","styles","useStyles2","getStyles","className","root","children","theme","css","display","flexDirection","direction","flexWrap","wrap","alignItems","gap","spacing","flexGrow","EditorRow","stackProps","padding","backgroundColor","colors","background","secondary","borderRadius","shape","radius","default","EditorRows","__assign","assign","s","arguments","p","apply","useAsync","fn","deps","_a","initialState","loading","mountedRef","lastCallId","useRef","isMounted","useCallback","current","state","callback","args","_i","callId","prevState","then","error","useAsyncFn","create","SuppressedError","languageDefinition","extensions","aliases","mimetypes","def","language","ignoreCase","defaultToken","tokenPostfix","keywords","operators","symbols","escapes","digits","octaldigits","binarydigits","hexdigits","integersuffix","floatsuffix","tokenizer","include","cases","string_double","string_single","clauses","whitespace","languageConfiguration","wordPattern","brackets","autoClosingPairs","open","close","surroundingPairs","folding","CompletionProvider","init","provideCompletionItems","model","position","monaco","Error","getModel","suggestions","offset","word","getWordAtPosition","Range","lift","startLineNumber","lineNumber","endLineNumber","startColumn","endColumn","fromPositions","positionClone","column","getOffsetAt","getRangeAndOffset","situation","matches","matchAll","labelPairsRegex","existingLabels","reduce","acc","match","_","matchLabelValue","inLabelValueRegex","betweenQuotes","otherLabels","inLabelNameRegex","getSituation","getValue","getCompletions","completionItems","maxIndexDigits","item","index","kind","getMonacoCompletionItemKind","insertText","sortText","padStart","triggerCharacters","Promise","resolve","languages","CompletionItemKind","Enum","EnumMember","labelNameRegex","labelValueRegex","LabelsEditor","setupAutocompleteFn","providerRef","autocompleteDisposeFun","dispose","registerCompletionItemProvider","langId","useAutocomplete","onRunQueryRef","onRunQuery","ref","containerRef","wrapper","CodeEditor","containerStyles","queryField","monacoOptions","fontSize","lineNumbers","overviewRulerLanes","renderLineHighlight","scrollbar","vertical","verticalScrollbarSize","horizontal","horizontalScrollbarSize","scrollBeyondLastLine","wordWrap","top","bottom","onBeforeEditorMount","ensurePyroscopeQL","onEditorDidMount","updateElementHeight","containerDiv","pixelHeight","getContentHeight","style","height","EDITOR_HEIGHT_OFFSET","pixelWidth","clientWidth","layout","onDidContentSizeChange","addCommand","KeyMod","Shift","KeyCode","Enter","pyroscopeqlSetupDone","register","setMonarchTokensProvider","setLanguageConfiguration","pyroscopeDatasourceSettingsByUid","PyroscopeQueryLinkExtensions","uid","datasourceUid","datasourceSettings","settings","getBackendSrv","context","getPluginLinkExtensions","extensionPointId","extension","LinkButton","linkButton","variant","icon","description","target","href","path","onClick","title","marginLeft","EditorField","optional","fieldProps","childInputId","htmlFor","ReactUtils","getChildId","labelEl","span","Tooltip","placement","Icon","size","space","Field","field","paddingRight","paddingBottom","minWidth","fontWeight","typography","fontWeightMedium","fontStyle","color","marginBottom","primary","toggleReducer","nextValue","useReducer","QueryOptionGroup","collapsedInfo","isOpen","toggleOpen","useToggle","Collapse","collapse","collapsible","onToggle","h6","x","body","border","justifyContent","overflow","bodySmall","margin","paddingLeft","typeOptions","getTypeOptions","QueryOptions","onQueryChange","groupByOptions","l","maxNodes","RadioButtonGroup","MultiSelect","change","changes","c","Input","event","currentTarget","newValue","parseInt","isNaN","switchLabel","cursor","paddingTop","labelSelectorRegex","plugin","DataSourcePlugin","setConfigEditor","onOptionsChange","DataSourceHttpSettings","defaultUrl","dataSourceConfig","showAccessOptions","secureSocksDSProxyEnabled","config","h3","LegacyForms","FormField","inputEl","jsonData","minStep","spellCheck","validationEvents","EventsWithValidation","onBlur","regexValidation","setQueryEditor","onLabelSelectorChange","queryRef","onChangeDebounced","debounce","useLabelSelector","unpreciseRange","createSelector","rawInput","labelToRemove","exec","fetchData","useLabels","normalizedQuery","cpuProfiles","cpuTimeProfile","defaultProfileType","deepEqual","useNormalizeQuery","cascader"],"sourceRoot":""}
Submit
FILE
FOLDER
INFO
Name
Size
Permission
Action
img
---
0755
CHANGELOG.md
12 bytes
0644
LICENSE
34523 bytes
0644
README.md
965 bytes
0644
module.js
33854 bytes
0644
module.js.map
118164 bytes
0644
plugin.json
1058 bytes
0644
N4ST4R_ID | Naxtarrr