{"version":3,"sources":["../../../../src/parser/index.ts","../../../../src/parser/matcher.ts","../../../../src/complete/index.ts","pages/targets/TargetLabels.module.css","../../../../src/complete/hybrid.ts","../../../../src/types/function.ts","../../../../src/types/matcher.ts","../../../../src/types/vector.ts","../../../../src/parser/parser.ts","../../../../src/parser/type.ts","../../../../src/parser/vector.ts","../../../../src/complete/promql.terms.ts","../../../../src/client/prometheus.ts","vendor/flot/jquery.flot.js","vendor/flot/jquery.flot.stack.js","vendor/flot/jquery.flot.time.js","vendor/flot/jquery.flot.crosshair.js","vendor/flot/jquery.flot.selection.js","globals.ts","contexts/PathPrefixContext.tsx","contexts/ThemeContext.tsx","Theme.tsx","Navbar.tsx","pages/agent/Agent.tsx","constants/constants.tsx","hooks/useFetch.ts","components/withStatusIndicator.tsx","pages/graph/CMTheme.tsx","pages/graph/MetricsExplorer.tsx","../../../../src/grammar/parser.terms.js","../../../../src/grammar/tokens.js","../../../../src/grammar/parser.js","../../../../src/parser/path-finder.ts","../../../../src/lint/hybrid.ts","../../../src/promql.ts","../../../../src/lint/index.ts","pages/graph/ExpressionInput.tsx","pages/graph/TimeInput.tsx","pages/graph/GraphControls.tsx","pages/graph/SeriesName.tsx","pages/graph/Legend.tsx","pages/graph/GraphHelpers.ts","pages/graph/Graph.tsx","pages/graph/Panel.tsx","pages/graph/GraphTabContent.tsx","pages/graph/DataTable.tsx","pages/graph/QueryStatsView.tsx","utils/index.ts","pages/alerts/CollapsibleAlertPanel.tsx","components/Checkbox.tsx","hooks/useLocalStorage.tsx","pages/alerts/AlertContents.tsx","pages/alerts/Alerts.tsx","pages/config/Config.tsx","pages/flags/Flags.tsx","pages/rules/RulesContent.tsx","pages/rules/Rules.tsx","components/ToggleMoreLess.tsx","pages/serviceDiscovery/LabelsTable.tsx","pages/serviceDiscovery/Services.tsx","pages/status/Status.tsx","pages/targets/Filter.tsx","pages/targets/EndpointLink.tsx","pages/targets/TargetLabels.tsx","pages/targets/TargetScrapeDuration.tsx","pages/targets/ScrapePoolPanel.tsx","pages/targets/target.ts","pages/targets/ScrapePoolList.tsx","pages/targets/Targets.tsx","pages/graph/PanelList.tsx","pages/tsdbStatus/TSDBStatus.tsx","components/withStartingIndicator.tsx","pages/index.ts","hooks/useMedia.ts","App.tsx","index.tsx","fonts/codicon.ttf","pages/targets/ScrapePoolPanel.module.css","../../../../src/types/index.ts"],"names":["module","exports","result","VectorMatchCardinality","a","this","ValueType","$","color","make","r","g","b","o","add","c","d","i","length","charAt","normalize","scale","f","toString","join","clamp","min","value","max","parseInt","clone","extract","elem","css","toLowerCase","parent","nodeName","get","parse","str","res","m","exec","parseFloat","name","trim","lookupColors","aqua","azure","beige","black","blue","brown","cyan","darkblue","darkcyan","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkviolet","fuchsia","gold","green","indigo","khaki","lightblue","lightcyan","lightgreen","lightgrey","lightpink","lightyellow","lime","magenta","maroon","navy","olive","orange","pink","purple","violet","red","silver","white","yellow","window","jQuery","hasOwnProperty","Object","prototype","Canvas","cls","container","element","children","document","createElement","className","direction","position","left","top","appendTo","getContext","G_vmlCanvasManager","Error","initElement","context","devicePixelRatio","backingStoreRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","pixelRatio","resize","width","height","textContainer","text","_textCache","_textSizeCache","flotTextSizeCache","Plot","placeholder","data_","options_","plugins","series","options","colors","legend","show","noColumns","labelFormatter","labelBoxBorderColor","margin","backgroundColor","backgroundOpacity","sorted","xaxis","mode","font","tickColor","transform","inverseTransform","autoscaleMargin","ticks","tickFormatter","labelWidth","labelHeight","reserveSpace","tickLength","alignTicksWithAxis","tickDecimals","tickSize","minTickSize","yaxis","xaxes","yaxes","points","radius","lineWidth","fill","fillColor","symbol","lines","steps","bars","barWidth","align","horizontal","zero","shadowSize","highlightColor","grid","aboveData","borderColor","labelMargin","eventSectionHeight","axisMargin","borderWidth","minBorderMargin","markings","markingsColor","markingsLineWidth","clickable","hoverable","autoHighlight","mouseActiveRadius","interaction","redrawOverlayInterval","hooks","surface","overlay","eventHolder","ctx","octx","plotOffset","right","bottom","plotWidth","plotHeight","processOptions","processRawData","processDatapoints","processOffset","processRange","drawBackground","drawSeries","draw","bindEvents","drawOverlay","shutdown","plot","executeHooks","hook","args","concat","apply","setData","s","extend","data","push","parseData","neededColors","maxIndex","sc","colorPool","colorPoolSize","variation","colori","v","getOrCreateAxis","axisNumber","fillInSeriesOptions","j","k","ps","val","p","format","topSentry","Number","POSITIVE_INFINITY","bottomSentry","NEGATIVE_INFINITY","fakeInfinity","MAX_VALUE","updateAxis","axis","datamin","datamax","each","allAxes","_","used","datapoints","x","number","required","y","stack","autoscale","defaultValue","pointsize","insertSteps","nullify","isNaN","Infinity","xmin","ymin","xmax","ymax","delta","processData","obj","coord","n","grep","canvasToAxisCoords","pos","c2p","undefined","x1","y1","axes","redrawTimeout","clearTimeout","unbind","onMouseMove","onMouseLeave","onClick","measureTickLabels","opts","maxWidth","Math","floor","legacyStyles","layer","t","label","info","getTextInfo","allocateAxisBoxFirstPhase","lw","lh","isXAxis","padding","eventSectionPadding","innermost","outermost","first","found","box","setupGrid","allocatedAxes","showGrid","axisOpts","wideFactor","widen","abs","setRange","snaped","setupTickGeneration","setTicks","snapRangeToTicks","minMargin","margins","ceil","adjustLayoutForThingsStickingOut","allocateAxisBoxSecondPhase","identity","it","p2c","setTransformationHelpers","tick","halign","valign","removeText","addText","html","find","remove","fragments","entries","rowStarted","lf","isFunction","sort","reverse","ascending","entry","table","replace","div","prependTo","insertLegend","noTicks","sqrt","dec","log","LN10","maxDec","size","magn","pow","norm","scaledDecimals","tickGenerator","prev","base","start","NaN","factor","formatted","round","decimal","indexOf","precision","substr","otherAxis","niceTicks","extraDec","ts","test","toFixed","oticks","changed","clear","save","translate","fillStyle","getColorOrGradient","fillRect","restore","drawGrid","render","triggerRedrawOverlay","extractRange","ranges","from","to","key","tmp","bw","bc","getAxes","xrange","yrange","xequal","yequal","subPixel","beginPath","strokeStyle","moveTo","lineTo","stroke","xoff","yoff","strokeRect","plotLine","xoffset","yoffset","axisx","axisy","prevx","prevy","x2","y2","plotLineArea","areaOpen","ypos","segmentStart","segmentEnd","x1old","x2old","lineJoin","sw","angle","PI","sin","cos","getFillStyle","drawSeriesLines","abandonedPoints","beforeX","afterX","emptyPoints","olddatapoints","drawSeriesPoints","drawOrphanedPoints","plotBars","barLeft","barRight","fillStyleCallback","drawBar","drawSeriesBars","plotPoints","offset","shadow","arc","closePath","w","drawLeft","drawRight","drawTop","drawBottom","filloptions","seriesColor","getPlaceholder","getCanvas","getPlotOffset","getData","getXAxes","getYAxes","getOptions","highlight","unhighlight","pointOffset","point","destroy","removeData","empty","highlights","classes","init","initPlugins","axisOptions","axisCount","fontSize","fontSizeDefault","fontDefaults","style","variant","weight","family","lineHeight","x2axis","y2axis","coloredAreas","coloredAreasColor","parseOptions","existing","setupCanvases","mousemove","bind","click","e","triggerClickHoverEvent","isSelecting","eventname","event","seriesFilter","canvasX","pageX","canvasY","pageY","ctrlKey","metaKey","item","mouseX","mouseY","maxDistance","smallestDistance","mx","my","maxx","maxy","dx","dy","dist","datapoint","slice","dataIndex","seriesIndex","findNearbyItem","h","auto","trigger","setTimeout","hi","drawBarHighlight","drawPointHighlight","indexOfHighlight","splice","pointRadius","spec","defaultColor","gradient","createLinearGradient","l","co","brightness","opacity","addColorStop","fn","detach","parentNode","removeChild","clearRect","cache","layerKey","call","getTextLayer","layerCache","styleKey","hide","styleCache","positions","active","rendered","append","insertAfter","addClass","textStyle","outerWidth","outerHeight","version","other","allseries","findMatchingSeries","px","py","intery","qx","qy","otherps","otherpoints","newpoints","withlines","withbottom","withsteps","keyOffset","accumulateOffset","floorInBase","formatDate","fmt","monthNames","dayNames","strftime","hours12","leftPad","pad","escape","hours","getHours","isAM","getDay","getMonth","getDate","getMinutes","getSeconds","getFullYear","makeUtcWrapper","addProxyMethod","sourceObj","sourceMethod","targetObj","targetMethod","arguments","utc","date","props","dateGenerator","timezone","Date","timeUnitSize","second","minute","hour","day","month","quarter","year","baseSpec","specMonths","specQuarters","axisName","minSize","unit","step","setSeconds","setMinutes","setHours","setMonth","setFullYear","setMilliseconds","setDate","carry","getTime","end","setTime","timeformat","useQuarters","span","suffix","twelveHourClock","hourCode","crosshair","locked","onMouseOut","getSelection","setCrosshair","clearCrosshair","lockCrosshair","unlockCrosshair","mouseout","adj","drawX","drawY","selection","savedhandlers","mouseUpHandler","updateSelection","onMouseDown","which","body","focus","onselectstart","ondrag","setSelectionPos","onMouseUp","one","selectionIsSane","triggerSelectedEvent","c1","c2","p1","p2","clearSelection","preventEvent","setSelection","range","mousedown","shape","jquery","moment","require","PathPrefixContext","React","createContext","usePathPrefix","useContext","ThemeContext","theme","userPreference","setTheme","useTheme","Theme","useEffect","classList","toggle","ThemeToggle","Form","inline","ButtonGroup","Button","title","icon","faSun","faMoon","faAdjust","Navigation","consolesLink","agentMode","useState","isOpen","setIsOpen","pathPrefix","Navbar","dark","expand","fixed","NavbarToggler","Collapse","navbar","justifyContent","Nav","NavItem","NavLink","href","tag","Link","UncontrolledDropdown","nav","inNavbar","DropdownToggle","caret","DropdownMenu","DropdownItem","location","search","Agent","API_PATH","useFetch","url","status","response","setResponse","error","setError","isLoading","setIsLoading","fetchData","fetch","credentials","ok","statusText","json","wasReady","withStatusIndicator","Component","customErrorMsg","componentTitle","rest","Alert","displayName","message","faSpinner","spin","baseTheme","EditorView","outline","outline_fallback","overflow","fontFamily","fontWeight","maxHeight","minWidth","float","marginTop","border","content","borderStyle","marginLeft","marginRight","textDecoration","borderLeft","boxSizing","verticalAlign","paddingRight","lightTheme","borderRightColor","borderLeftColor","darkTheme","caretColor","promqlHighlighter","HighlightStyle","define","tags","string","keyword","function","variableName","labelName","operator","modifier","paren","squareBracket","brace","invalid","comment","fontStyle","fuz","Fuzzy","pre","post","shouldSort","MetricsExplorer","handleSearchTerm","setState","searchTerm","target","handleMetricClick","query","insertAtCursor","updateShow","state","Modal","scrollable","ModalHeader","ModalBody","Input","type","onChange","filter","metrics","map","original","dangerouslySetInnerHTML","__html","metric","spec_Identifier","deserialize","states","stateData","goto","nodeNames","maxTerm","skippedNodes","repeatNodeCount","tokenData","tokenizers","topRules","specialized","tokenPrec","cursor","node","cursorIsMoving","promqlExtension","PromQLExtension","dynamicConfigCompartment","Compartment","HistoryCompleteStrategy","complete","queryHistory","Promise","resolve","promQL","then","tree","syntaxTree","historyItems","q","detail","ExpressionInput","onExpressionChange","metricNames","executeQuery","loading","enableAutocomplete","enableHighlighting","enableLinter","containerRef","useRef","viewRef","showMetricsExplorer","setShowMetricsExplorer","activateCompletion","activateLinter","setComplete","completeStrategy","newCompleteStrategy","remote","initialMetricList","dynamicConfig","asExtension","view","current","startState","EditorState","create","doc","extensions","highlightSpecialChars","history","allowMultipleSelections","of","indentOnInput","bracketMatching","closeBrackets","autocompletion","highlightSelectionMatches","lineWrapping","keymap","closeBracketsKeymap","defaultKeymap","historyKeymap","commentKeymap","completionKeymap","lintKeymap","run","contentDOM","blur","Prec","override","insertNewlineAndIndent","updateListener","update","dispatch","effects","reconfigure","InputGroup","InputGroupAddon","addonType","InputGroupText","faSearch","ref","faGlobeEurope","changes","insert","library","faChevronLeft","faChevronRight","faCalendarCheck","faArrowUp","faArrowDown","faTimes","dom","watch","TimeInput","timeInputRef","createRef","$time","getBaseTime","time","valueOf","calcShiftRange","increaseTime","onChangeTime","decreaseTime","clearTime","useLocalTime","tz","guess","datetimepicker","icons","today","buttons","showClose","showToday","sideBySide","locale","timeZone","defaultDate","on","trunc","prevProps","fixedWidth","innerRef","onFocus","onBlur","onKeyDown","includes","GraphControls","rangeRef","resolutionRef","rangeSteps","onChangeRangeInput","rangeText","parseDuration","changeRangeInput","onChangeRange","setCurrentRangeValue","formatDuration","increaseRange","decreaseRange","resolution","onSubmit","preventDefault","faMinus","faPlus","endTime","onChangeEndTime","onChangeResolution","bsSize","onChangeStacking","stacked","faChartLine","faChartArea","showExemplars","onChangeShowExemplars","SeriesName","labels","labelNodes","__name__","renderFormatted","metricToSeriesName","Legend","selectedIndexes","handleSeriesSelect","index","ev","selected","chartData","idx","reduce","acc","onSeriesToggle","shouldReset","onLegendMouseOut","onHover","canUseHover","onMouseOver","navigator","platform","PureComponent","formatValue","absY","getHoverColor","toHoverColor","showTicks","showMinorTicks","timeBase","tooltip","cssClass","xval","yval","both","dateTime","formatLabels","keys","escapeHTML","seriesLabels","trimEnd","defaultTheme","normalizeData","queryParams","exemplars","getColors","startTime","sum","values","buckets","exemplar","timestamp","parsed","parseValue","bucketTime","exemplarSymbol","deviation","stdDeviation","currentValue","flatMap","bucket","exValue","canvas","clientWidth","clientHeight","rotate","avg","squaredAvg","PanelType","Graph","chartRef","$chart","rafID","selectedSeriesIndexes","selectedExemplarLabels","destroyPlot","isPresent","selectedIndex","handleSeriesHover","cancelAnimationFrame","requestAnimationFrame","plotSetAndDraw","handleLegendMouseOut","handleResize","id","handleTimeRangeSelection","selectedLabels","handleWidth","onResize","skipOnMount","GraphTabContent","lastQueryParams","resultType","limitSeries","DataTable","rows","limited","doFormat","valueText","whiteSpace","Table","hover","QueryStatsView","loadTime","resultSeries","PanelDefaultOptions","expr","Panel","abortInFlightFetch","debounceExecuteQuery","exprInputValue","queryStart","now","onExecuteQuery","setOptions","abortController","AbortController","abort","getEndTime","params","URLSearchParams","path","signal","resp","delete","warnings","stats","handleExpressionChange","handleChangeRange","handleChangeEndTime","handleChangeResolution","handleChangeType","handleChangeStacking","handleChangeShowExemplars","func","timeout","timer","debounce","prevOpts","newOpts","onOptionsChanged","pastQueries","Row","Col","warning","tabs","TabContent","activeTab","TabPane","tabId","removePanel","generateID","random","byEmptyString","entityMap","String","tsName","labelStrings","durationStr","durationRE","RegExp","matches","match","dur","mult","ms","exact","parseTime","timeText","humanizeDuration","milliseconds","sign","unsignedMillis","duration","seconds","minutes","asDays","formatRelative","startStr","paramFormat","decodePanelOptionsFromQueryString","urlParams","substring","split","panels","urlParam","panelsCount","prefix","startsWith","prefixLen","param","parseOption","opt","decodedValue","decodeURIComponent","toQueryString","formatWithKey","paramName","encodeURIComponent","formatParam","formatTime","createExpressionLink","mapObjEntries","cb","callAll","fns","Boolean","forEach","alertColors","firing","pending","inactive","Annotations","annotations","colSpan","CollapsibleAlertPanel","rule","showAnnotations","open","fade","faChevronDown","alerts","bordered","alert","Badge","activeAt","Checkbox","wrapperStyles","FormGroup","Label","userSelect","for","memo","useLocalStorage","localStorageKey","initialState","localStorageState","JSON","localStorage","getItem","stringify","setValue","serializedState","setItem","stateColorTuples","AlertsContent","groups","statsCount","setFilter","checked","setShowAnnotations","ruleState","group","rules","some","file","GroupInfo","statesCounter","AlertsWithStatusIndicator","Alerts","ruleStatsCount","el","YamlContent","yaml","ConfigWithStatusIndicator","ConfigContent","copied","setCopied","config","onCopy","disabled","Config","FlagsContent","searchState","setSearchState","alpha","focused","sortState","setSortState","searchable","k1","v1","k2","v2","localeCompare","flag","filtered","autoFocus","striped","col","faSort","faSortDown","faSortUp","flagMatchStr","valueMatchStr","sanitizeOpts","allowedTags","sanitizeHTML","FlagsWithStatusIndicator","Flags","GraphExpressionLink","RulesWithStatusIndicator","getBadgeColor","lastEvaluation","evaluationTime","health","toUpperCase","lastError","Rules","ToggleMoreLess","showMore","LabelsTable","setShowMore","discoveredLabels","isDropped","ServiceDiscoveryContent","activeTargets","droppedTargets","targets","scrapePool","total","job","processSummary","processTargets","ServicesWithStatusIndicator","ServiceDiscovery","statusConfig","customizeValue","toUTCString","CWD","reloadConfigSuccess","lastConfigTime","corruptionCount","goroutineCount","storageRetention","activeAlertmanagers","customRow","alertMgrs","URL","origin","pathname","droppedAlertmanagers","skip","StatusContent","StatusWithStatusIndicator","StatusResult","fetchPath","Status","Filter","expanded","setExpanded","showHealthy","allExpanded","every","btnProps","all","unhealthy","expansionState","next","EndpointLink","endpoint","globalUrl","invalidURL","err","host","protocol","searchParams","Array","displayLink","labelValue","TargetLabels","tooltipOpen","setTooltipOpen","Tooltip","CSS","textAlign","styles","discovered","TargetScrapeDuration","interval","scrapeTooltipOpen","setScrapeTooltipOpen","columns","ScrapePoolPanel","targetGroup","toggleExpanded","upCount","anchorProps","column","scrapeUrl","lastScrape","lastScrapeDuration","scrapeInterval","scrapeTimeout","getColor","errors","ScrapePoolContent","targetGroups","pools","up","showUnhealthy","isHealthy","ScrapePoolListWithStatusIndicator","ScrapePoolList","responseStatus","badResponse","Targets","updateURL","nextPanels","pushState","PanelListContent","queryHistoryEnabled","setPanels","setLocalStorageHistoryItems","addPanel","onpopstate","handleExecuteQuery","extendedItems","panel","PanelList","setDelta","setUseLocalTime","enableQueryHistory","setEnableQueryHistory","setEnableAutocomplete","setEnableHighlighting","setEnableLinter","metricsRes","metricsErr","browserTime","timeRes","timeErr","serverTime","display","defaultChecked","TSDBStatusContent","headStats","labelValueCountByLabelName","seriesCountByMetricName","memoryInBytesByLabelName","seriesCountByLabelValuePair","unixToTime","unix","toISOString","numSeries","chunkCount","numLabelPairs","minTime","maxTime","header","TSDBStatusContentWithStatusIndicator","TSDBStatus","StartingContent","isUnexpected","Progress","animated","withStartingIndicator","Page","ready","setReady","setIsUnexpected","walReplayStatus","setWALReplayStatus","mounted","fetchStatus","clearInterval","setInterval","useFetchReadyInterval","AgentPage","AlertsPage","ConfigPage","FlagsPage","RulesPage","ServiceDiscoveryPage","StatusPage","TSDBStatusPage","TargetsPage","PanelListPage","useMedia","mediaQuery","matchMedia","setMatches","handler","addEventListener","removeEventListener","App","basePath","paths","endsWith","userTheme","setUserTheme","browserHasThemes","browserWantsDarkTheme","Provider","basename","Container","fluid","paddingTop","GLOBAL_CONSOLES_LINK","GLOBAL_AGENT_MODE","ReactDOM","getElementById"],"mappings":"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","file":"static/js/main.a00f3aa4.chunk.js","sourcesContent":["// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nexport { buildLabelMatchers, labelMatchersToString } from './matcher';\nexport { Parser } from './parser';\nexport { walkBackward, walkThrough, containsAtLeastOneChild, containsChild, retrieveAllRecursiveNodes } from './path-finder';\n//# sourceMappingURL=index.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { EqlRegex, EqlSingle, LabelName, MatchOp, Neq, NeqRegex, StringLiteral } from '../grammar/parser.terms';\nimport { Matcher } from '../types';\nfunction createMatcher(labelMatcher, state) {\n const matcher = new Matcher(0, '', '');\n const cursor = labelMatcher.cursor;\n if (!cursor.next()) {\n // weird case, that would mean the labelMatcher doesn't have any child.\n return matcher;\n }\n do {\n switch (cursor.type.id) {\n case LabelName:\n matcher.name = state.sliceDoc(cursor.from, cursor.to);\n break;\n case MatchOp:\n const ope = cursor.node.firstChild;\n if (ope) {\n matcher.type = ope.type.id;\n }\n break;\n case StringLiteral:\n matcher.value = state.sliceDoc(cursor.from, cursor.to).slice(1, -1);\n break;\n }\n } while (cursor.nextSibling());\n return matcher;\n}\nexport function buildLabelMatchers(labelMatchers, state) {\n const matchers = [];\n labelMatchers.forEach((value) => {\n matchers.push(createMatcher(value, state));\n });\n return matchers;\n}\nexport function labelMatchersToString(metricName, matchers, labelName) {\n if (!matchers || matchers.length === 0) {\n return metricName;\n }\n let matchersAsString = '';\n for (const matcher of matchers) {\n if (matcher.name === labelName || matcher.value === '') {\n continue;\n }\n let type = '';\n switch (matcher.type) {\n case EqlSingle:\n type = '=';\n break;\n case Neq:\n type = '!=';\n break;\n case NeqRegex:\n type = '!~';\n break;\n case EqlRegex:\n type = '=~';\n break;\n default:\n type = '=';\n }\n const m = `${matcher.name}${type}\"${matcher.value}\"`;\n if (matchersAsString === '') {\n matchersAsString = m;\n }\n else {\n matchersAsString = `${matchersAsString},${m}`;\n }\n }\n return `${metricName}{${matchersAsString}}`;\n}\n//# sourceMappingURL=matcher.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { HybridComplete } from './hybrid';\nimport { CachedPrometheusClient, HTTPPrometheusClient } from '../client/prometheus';\nfunction isPrometheusConfig(remoteConfig) {\n return remoteConfig.url !== undefined;\n}\nexport function newCompleteStrategy(conf) {\n if (conf === null || conf === void 0 ? void 0 : conf.completeStrategy) {\n return conf.completeStrategy;\n }\n if (conf === null || conf === void 0 ? void 0 : conf.remote) {\n if (!isPrometheusConfig(conf.remote)) {\n return new HybridComplete(conf.remote, conf.maxMetricsMetadata);\n }\n return new HybridComplete(new CachedPrometheusClient(new HTTPPrometheusClient(conf.remote), conf.remote.cache), conf.maxMetricsMetadata);\n }\n return new HybridComplete();\n}\n//# sourceMappingURL=index.js.map","// extracted by mini-css-extract-plugin\nmodule.exports = {\"discovered\":\"TargetLabels_discovered__2eSl4\"};","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { Add, AggregateExpr, And, BinaryExpr, BinModifiers, Bool, Div, Duration, Eql, EqlRegex, EqlSingle, Expr, FunctionCallArgs, FunctionCallBody, GroupingLabel, GroupingLabels, Gte, Gtr, Identifier, LabelMatcher, LabelMatchers, LabelMatchList, LabelName, Lss, Lte, MatchOp, MatrixSelector, MetricIdentifier, Mod, Mul, Neq, NeqRegex, NumberLiteral, OffsetExpr, Or, Pow, PromQL, StepInvariantExpr, StringLiteral, Sub, SubqueryExpr, Unless, VectorSelector, } from '../grammar/parser.terms';\nimport { buildLabelMatchers, containsAtLeastOneChild, containsChild, retrieveAllRecursiveNodes, walkBackward, walkThrough } from '../parser';\nimport { aggregateOpModifierTerms, aggregateOpTerms, atModifierTerms, binOpModifierTerms, binOpTerms, durationTerms, functionIdentifierTerms, matchOpTerms, numberTerms, snippets, } from './promql.terms';\nimport { syntaxTree } from '@codemirror/language';\nconst autocompleteNodes = {\n matchOp: matchOpTerms,\n binOp: binOpTerms,\n duration: durationTerms,\n binOpModifier: binOpModifierTerms,\n atModifier: atModifierTerms,\n functionIdentifier: functionIdentifierTerms,\n aggregateOp: aggregateOpTerms,\n aggregateOpModifier: aggregateOpModifierTerms,\n number: numberTerms,\n};\n// ContextKind is the different possible value determinate by the autocompletion\nexport var ContextKind;\n(function (ContextKind) {\n // dynamic autocompletion (required a distant server)\n ContextKind[ContextKind[\"MetricName\"] = 0] = \"MetricName\";\n ContextKind[ContextKind[\"LabelName\"] = 1] = \"LabelName\";\n ContextKind[ContextKind[\"LabelValue\"] = 2] = \"LabelValue\";\n // static autocompletion\n ContextKind[ContextKind[\"Function\"] = 3] = \"Function\";\n ContextKind[ContextKind[\"Aggregation\"] = 4] = \"Aggregation\";\n ContextKind[ContextKind[\"BinOpModifier\"] = 5] = \"BinOpModifier\";\n ContextKind[ContextKind[\"BinOp\"] = 6] = \"BinOp\";\n ContextKind[ContextKind[\"MatchOp\"] = 7] = \"MatchOp\";\n ContextKind[ContextKind[\"AggregateOpModifier\"] = 8] = \"AggregateOpModifier\";\n ContextKind[ContextKind[\"Duration\"] = 9] = \"Duration\";\n ContextKind[ContextKind[\"Offset\"] = 10] = \"Offset\";\n ContextKind[ContextKind[\"Bool\"] = 11] = \"Bool\";\n ContextKind[ContextKind[\"AtModifiers\"] = 12] = \"AtModifiers\";\n ContextKind[ContextKind[\"Number\"] = 13] = \"Number\";\n})(ContextKind || (ContextKind = {}));\nfunction getMetricNameInVectorSelector(tree, state) {\n // Find if there is a defined metric name. Should be used to autocomplete a labelValue or a labelName\n // First find the parent \"VectorSelector\" to be able to find then the subChild \"MetricIdentifier\" if it exists.\n let currentNode = walkBackward(tree, VectorSelector);\n if (!currentNode) {\n // Weird case that shouldn't happen, because \"VectorSelector\" is by definition the parent of the LabelMatchers.\n return '';\n }\n currentNode = walkThrough(currentNode, MetricIdentifier, Identifier);\n if (!currentNode) {\n return '';\n }\n return state.sliceDoc(currentNode.from, currentNode.to);\n}\nfunction arrayToCompletionResult(data, from, to, includeSnippet = false, span = true) {\n const options = data;\n if (includeSnippet) {\n options.push(...snippets);\n }\n return {\n from: from,\n to: to,\n options: options,\n span: span ? /^[a-zA-Z0-9_:]+$/ : undefined,\n };\n}\n// computeStartCompleteLabelPositionInLabelMatcherOrInGroupingLabel calculates the start position only when the node is a LabelMatchers or a GroupingLabels\nfunction computeStartCompleteLabelPositionInLabelMatcherOrInGroupingLabel(node, pos) {\n // Here we can have two different situations:\n // 1. `metric{}` or `sum by()` with the cursor between the bracket\n // and so we have increment the starting position to avoid to consider the open bracket when filtering the autocompletion list.\n // 2. `metric{foo=\"bar\",} or `sum by(foo,) with the cursor after the comma.\n // Then the start number should be the current position to avoid to consider the previous labelMatcher/groupingLabel when filtering the autocompletion list.\n let start = node.from + 1;\n if (node.firstChild !== null) {\n // here that means the LabelMatchers / GroupingLabels has a child, which is not possible if we have the expression `metric{}`. So we are likely trying to autocomplete the label list after a comma\n start = pos;\n }\n return start;\n}\n// computeStartCompletePosition calculates the start position of the autocompletion.\n// It is an important step because the start position will be used by CMN to find the string and then to use it to filter the CompletionResult.\n// A wrong `start` position will lead to have the completion not working.\n// Note: this method is exported only for testing purpose.\nexport function computeStartCompletePosition(node, pos) {\n var _a, _b, _c, _d, _e, _f;\n let start = node.from;\n if (node.type.id === LabelMatchers || node.type.id === GroupingLabels) {\n start = computeStartCompleteLabelPositionInLabelMatcherOrInGroupingLabel(node, pos);\n }\n else if (node.type.id === FunctionCallBody || (node.type.id === StringLiteral && ((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type.id) === LabelMatcher)) {\n // When the cursor is between bracket, quote, we need to increment the starting position to avoid to consider the open bracket/ first string.\n start++;\n }\n else if (node.type.id === OffsetExpr ||\n (node.type.id === NumberLiteral && ((_b = node.parent) === null || _b === void 0 ? void 0 : _b.type.id) === 0 && ((_c = node.parent.parent) === null || _c === void 0 ? void 0 : _c.type.id) === SubqueryExpr) ||\n (node.type.id === 0 &&\n (((_d = node.parent) === null || _d === void 0 ? void 0 : _d.type.id) === OffsetExpr ||\n ((_e = node.parent) === null || _e === void 0 ? void 0 : _e.type.id) === MatrixSelector ||\n (((_f = node.parent) === null || _f === void 0 ? void 0 : _f.type.id) === SubqueryExpr && containsAtLeastOneChild(node.parent, Duration))))) {\n start = pos;\n }\n return start;\n}\n// analyzeCompletion is going to determinate what should be autocompleted.\n// The value of the autocompletion is then calculate by the function buildCompletion.\n// Note: this method is exported for testing purpose only. Do not use it directly.\nexport function analyzeCompletion(state, node) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;\n const result = [];\n switch (node.type.id) {\n case 0: // 0 is the id of the error node\n if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type.id) === OffsetExpr) {\n // we are likely in the given situation:\n // `metric_name offset 5` that leads to this tree:\n // `Expr(OffsetExpr(Expr(VectorSelector(MetricIdentifier(Identifier))),Offset,⚠))`\n // Here we can just autocomplete a duration.\n result.push({ kind: ContextKind.Duration });\n break;\n }\n if (((_b = node.parent) === null || _b === void 0 ? void 0 : _b.type.id) === LabelMatcher) {\n // In this case the current token is not itself a valid match op yet:\n // metric_name{labelName!}\n result.push({ kind: ContextKind.MatchOp });\n break;\n }\n if (((_c = node.parent) === null || _c === void 0 ? void 0 : _c.type.id) === MatrixSelector) {\n // we are likely in the given situation:\n // `metric_name{}[5]`\n // We can also just autocomplete a duration\n result.push({ kind: ContextKind.Duration });\n break;\n }\n if (((_d = node.parent) === null || _d === void 0 ? void 0 : _d.type.id) === SubqueryExpr && containsAtLeastOneChild(node.parent, Duration)) {\n // we are likely in the given situation:\n // `rate(foo[5d:5])`\n // so we should autocomplete a duration\n result.push({ kind: ContextKind.Duration });\n break;\n }\n // when we are in the situation 'metric_name !', we have the following tree\n // Expr(VectorSelector(MetricIdentifier(Identifier),⚠))\n // We should try to know if the char '!' is part of a binOp.\n // Note: as it is quite experimental, maybe it requires more condition and to check the current tree (parent, other child at the same level ..etc.).\n const operator = state.sliceDoc(node.from, node.to);\n if (binOpTerms.filter((term) => term.label.includes(operator)).length > 0) {\n result.push({ kind: ContextKind.BinOp });\n }\n break;\n case Identifier:\n // sometimes an Identifier has an error has parent. This should be treated in priority\n if (((_e = node.parent) === null || _e === void 0 ? void 0 : _e.type.id) === 0) {\n const errorNodeParent = node.parent.parent;\n if ((errorNodeParent === null || errorNodeParent === void 0 ? void 0 : errorNodeParent.type.id) === StepInvariantExpr) {\n // we are likely in the given situation:\n // `expr @ s`\n // we can autocomplete start / end\n result.push({ kind: ContextKind.AtModifiers });\n break;\n }\n if ((errorNodeParent === null || errorNodeParent === void 0 ? void 0 : errorNodeParent.type.id) === AggregateExpr) {\n // it matches 'sum() b'. So here we can autocomplete:\n // - the aggregate operation modifier\n // - the binary operation (since it's not mandatory to have an aggregate operation modifier)\n result.push({ kind: ContextKind.AggregateOpModifier }, { kind: ContextKind.BinOp });\n break;\n }\n if ((errorNodeParent === null || errorNodeParent === void 0 ? void 0 : errorNodeParent.type.id) === VectorSelector) {\n // it matches 'sum b'. So here we also have to autocomplete the aggregate operation modifier only\n // if the associated metricIdentifier is matching an aggregation operation.\n // Note: here is the corresponding tree in order to understand the situation:\n // Expr(\n // \tVectorSelector(\n // \t\tMetricIdentifier(Identifier),\n // \t\t⚠(Identifier)\n // \t)\n // )\n const operator = getMetricNameInVectorSelector(node, state);\n if (aggregateOpTerms.filter((term) => term.label === operator).length > 0) {\n result.push({ kind: ContextKind.AggregateOpModifier });\n }\n // It's possible it also match the expr 'metric_name unle'.\n // It's also possible that the operator is also a metric even if it matches the list of aggregation function.\n // So we also have to autocomplete the binary operator.\n //\n // The expr `metric_name off` leads to the same tree. So we have to provide the offset keyword too here.\n result.push({ kind: ContextKind.BinOp }, { kind: ContextKind.Offset });\n break;\n }\n if (errorNodeParent && containsChild(errorNodeParent, Expr)) {\n // this last case can appear with the following expression:\n // 1. http_requests_total{method=\"GET\"} off\n // 2. rate(foo[5m]) un\n // 3. sum(http_requests_total{method=\"GET\"} off)\n // For these different cases we have this kind of tree:\n // Parent (\n // Expr(),\n // ⚠(Identifier)\n // )\n // We don't really care about the parent, here we are more interested if in the siblings of the error node, there is the node 'Expr'\n // If it is the case, then likely we should autocomplete the BinOp or the offset.\n result.push({ kind: ContextKind.BinOp }, { kind: ContextKind.Offset });\n break;\n }\n }\n // As the leaf Identifier is coming for different cases, we have to take a bit time to analyze the tree\n // in order to know what we have to autocomplete exactly.\n // Here is some cases:\n // 1. metric_name / ignor --> we should autocomplete the BinOpModifier + metric/function/aggregation\n // 2. sum(http_requests_total{method=\"GET\"} / o) --> BinOpModifier + metric/function/aggregation\n // Examples above give a different tree each time and ends up to be treated in this case.\n // But they all have the following common tree pattern:\n // Parent( Expr(...),\n // ... ,\n // Expr(VectorSelector(MetricIdentifier(Identifier)))\n // )\n //\n // So the first things to do is to get the `Parent` and to determinate if we are in this configuration.\n // Otherwise we would just have to autocomplete the metric / function / aggregation.\n const parent = (_h = (_g = (_f = node.parent) === null || _f === void 0 ? void 0 : _f.parent) === null || _g === void 0 ? void 0 : _g.parent) === null || _h === void 0 ? void 0 : _h.parent;\n if (!parent) {\n // this case can be possible if the topNode is not anymore PromQL but MetricName.\n // In this particular case, then we just want to autocomplete the metric\n result.push({ kind: ContextKind.MetricName, metricName: state.sliceDoc(node.from, node.to) });\n break;\n }\n // now we have to know if we have two Expr in the direct children of the `parent`\n const containExprTwice = containsChild(parent, Expr, Expr);\n if (containExprTwice) {\n if (parent.type.id === BinaryExpr && !containsAtLeastOneChild(parent, 0)) {\n // We are likely in the case 1 or 5\n result.push({ kind: ContextKind.MetricName, metricName: state.sliceDoc(node.from, node.to) }, { kind: ContextKind.Function }, { kind: ContextKind.Aggregation }, { kind: ContextKind.BinOpModifier }, { kind: ContextKind.Number });\n // in case the BinaryExpr is a comparison, we should autocomplete the `bool` keyword. But only if it is not present.\n // When the `bool` keyword is NOT present, then the expression looks like this:\n // \t\t\tBinaryExpr( Expr(...), Gtr , BinModifiers, Expr(...) )\n // When the `bool` keyword is present, then the expression looks like this:\n // BinaryExpr( Expr(...), Gtr , BinModifiers(Bool), Expr(...) )\n // To know if it is not present, we just have to check if the Bool is not present as a child of the BinModifiers.\n if (containsAtLeastOneChild(parent, Eql, Gte, Gtr, Lte, Lss, Neq) && !walkThrough(parent, BinModifiers, Bool)) {\n result.push({ kind: ContextKind.Bool });\n }\n }\n }\n else {\n result.push({ kind: ContextKind.MetricName, metricName: state.sliceDoc(node.from, node.to) }, { kind: ContextKind.Function }, { kind: ContextKind.Aggregation });\n if (parent.type.id !== FunctionCallArgs && parent.type.id !== MatrixSelector) {\n // it's too avoid to autocomplete a number in situation where it shouldn't.\n // Like with `sum by(rat)`\n result.push({ kind: ContextKind.Number });\n }\n }\n break;\n case PromQL:\n if (!node.firstChild) {\n // this situation can happen when there is nothing in the text area and the user is explicitly triggering the autocompletion (with ctrl + space)\n result.push({ kind: ContextKind.MetricName, metricName: '' }, { kind: ContextKind.Function }, { kind: ContextKind.Aggregation }, { kind: ContextKind.Number });\n }\n break;\n case GroupingLabels:\n // In this case we are in the given situation:\n // sum by ()\n // So we have to autocomplete any labelName\n result.push({ kind: ContextKind.LabelName });\n break;\n case LabelMatchers:\n // In that case we are in the given situation:\n // metric_name{} or {}\n // so we have or to autocomplete any kind of labelName or to autocomplete only the labelName associated to the metric\n result.push({ kind: ContextKind.LabelName, metricName: getMetricNameInVectorSelector(node, state) });\n break;\n case LabelName:\n if (((_j = node.parent) === null || _j === void 0 ? void 0 : _j.type.id) === GroupingLabel) {\n // In this case we are in the given situation:\n // sum by (myL)\n // So we have to continue to autocomplete any kind of labelName\n result.push({ kind: ContextKind.LabelName });\n }\n else if (((_k = node.parent) === null || _k === void 0 ? void 0 : _k.type.id) === LabelMatcher) {\n // In that case we are in the given situation:\n // metric_name{myL} or {myL}\n // so we have or to continue to autocomplete any kind of labelName or\n // to continue to autocomplete only the labelName associated to the metric\n result.push({ kind: ContextKind.LabelName, metricName: getMetricNameInVectorSelector(node, state) });\n }\n break;\n case StringLiteral:\n if (((_l = node.parent) === null || _l === void 0 ? void 0 : _l.type.id) === LabelMatcher) {\n // In this case we are in the given situation:\n // metric_name{labelName=\"\"}\n // So we can autocomplete the labelValue\n // Get the labelName.\n // By definition it's the firstChild: https://github.com/promlabs/lezer-promql/blob/0ef65e196a8db6a989ff3877d57fd0447d70e971/src/promql.grammar#L250\n let labelName = '';\n if (((_m = node.parent.firstChild) === null || _m === void 0 ? void 0 : _m.type.id) === LabelName) {\n labelName = state.sliceDoc(node.parent.firstChild.from, node.parent.firstChild.to);\n }\n // then find the metricName if it exists\n const metricName = getMetricNameInVectorSelector(node, state);\n // finally get the full matcher available\n const labelMatchers = buildLabelMatchers(retrieveAllRecursiveNodes(walkBackward(node, LabelMatchList), LabelMatchList, LabelMatcher), state);\n result.push({\n kind: ContextKind.LabelValue,\n metricName: metricName,\n labelName: labelName,\n matchers: labelMatchers,\n });\n }\n break;\n case NumberLiteral:\n if (((_o = node.parent) === null || _o === void 0 ? void 0 : _o.type.id) === 0 && ((_p = node.parent.parent) === null || _p === void 0 ? void 0 : _p.type.id) === SubqueryExpr) {\n // Here we are likely in this situation:\n // `go[5d:4]`\n // and we have the given tree:\n // Expr( SubqueryExpr(\n // \t\tExpr(VectorSelector(MetricIdentifier(Identifier))),\n // \t\tDuration, Duration, ⚠(NumberLiteral)\n // ))\n // So we should continue to autocomplete a duration\n result.push({ kind: ContextKind.Duration });\n }\n else {\n result.push({ kind: ContextKind.Number });\n }\n break;\n case Duration:\n case OffsetExpr:\n result.push({ kind: ContextKind.Duration });\n break;\n case FunctionCallBody:\n // In this case we are in the given situation:\n // sum() or in rate()\n // with the cursor between the bracket. So we can autocomplete the metric, the function and the aggregation.\n result.push({ kind: ContextKind.MetricName, metricName: '' }, { kind: ContextKind.Function }, { kind: ContextKind.Aggregation });\n break;\n case Neq:\n if (((_q = node.parent) === null || _q === void 0 ? void 0 : _q.type.id) === MatchOp) {\n result.push({ kind: ContextKind.MatchOp });\n }\n else if (((_r = node.parent) === null || _r === void 0 ? void 0 : _r.type.id) === BinaryExpr) {\n result.push({ kind: ContextKind.BinOp });\n }\n break;\n case EqlSingle:\n case EqlRegex:\n case NeqRegex:\n case MatchOp:\n result.push({ kind: ContextKind.MatchOp });\n break;\n case Pow:\n case Mul:\n case Div:\n case Mod:\n case Add:\n case Sub:\n case Eql:\n case Gte:\n case Gtr:\n case Lte:\n case Lss:\n case And:\n case Unless:\n case Or:\n case BinaryExpr:\n result.push({ kind: ContextKind.BinOp });\n break;\n }\n return result;\n}\n// HybridComplete provides a full completion result with or without a remote prometheus.\nexport class HybridComplete {\n constructor(prometheusClient, maxMetricsMetadata = 10000) {\n this.prometheusClient = prometheusClient;\n this.maxMetricsMetadata = maxMetricsMetadata;\n }\n getPrometheusClient() {\n return this.prometheusClient;\n }\n promQL(context) {\n const { state, pos } = context;\n const tree = syntaxTree(state).resolve(pos, -1);\n const contexts = analyzeCompletion(state, tree);\n let asyncResult = Promise.resolve([]);\n let completeSnippet = false;\n let span = true;\n for (const context of contexts) {\n switch (context.kind) {\n case ContextKind.Aggregation:\n completeSnippet = true;\n asyncResult = asyncResult.then((result) => {\n return result.concat(autocompleteNodes.aggregateOp);\n });\n break;\n case ContextKind.Function:\n completeSnippet = true;\n asyncResult = asyncResult.then((result) => {\n return result.concat(autocompleteNodes.functionIdentifier);\n });\n break;\n case ContextKind.BinOpModifier:\n asyncResult = asyncResult.then((result) => {\n return result.concat(autocompleteNodes.binOpModifier);\n });\n break;\n case ContextKind.BinOp:\n asyncResult = asyncResult.then((result) => {\n return result.concat(autocompleteNodes.binOp);\n });\n break;\n case ContextKind.MatchOp:\n asyncResult = asyncResult.then((result) => {\n return result.concat(autocompleteNodes.matchOp);\n });\n break;\n case ContextKind.AggregateOpModifier:\n asyncResult = asyncResult.then((result) => {\n return result.concat(autocompleteNodes.aggregateOpModifier);\n });\n break;\n case ContextKind.Duration:\n span = false;\n asyncResult = asyncResult.then((result) => {\n return result.concat(autocompleteNodes.duration);\n });\n break;\n case ContextKind.Offset:\n asyncResult = asyncResult.then((result) => {\n return result.concat([{ label: 'offset' }]);\n });\n break;\n case ContextKind.Bool:\n asyncResult = asyncResult.then((result) => {\n return result.concat([{ label: 'bool' }]);\n });\n break;\n case ContextKind.AtModifiers:\n asyncResult = asyncResult.then((result) => {\n return result.concat(autocompleteNodes.atModifier);\n });\n break;\n case ContextKind.Number:\n asyncResult = asyncResult.then((result) => {\n return result.concat(autocompleteNodes.number);\n });\n break;\n case ContextKind.MetricName:\n asyncResult = asyncResult.then((result) => {\n return this.autocompleteMetricName(result, context);\n });\n break;\n case ContextKind.LabelName:\n asyncResult = asyncResult.then((result) => {\n return this.autocompleteLabelName(result, context);\n });\n break;\n case ContextKind.LabelValue:\n asyncResult = asyncResult.then((result) => {\n return this.autocompleteLabelValue(result, context);\n });\n }\n }\n return asyncResult.then((result) => {\n return arrayToCompletionResult(result, computeStartCompletePosition(tree, pos), pos, completeSnippet, span);\n });\n }\n autocompleteMetricName(result, context) {\n if (!this.prometheusClient) {\n return result;\n }\n const metricCompletion = new Map();\n return this.prometheusClient\n .metricNames(context.metricName)\n .then((metricNames) => {\n var _a;\n for (const metricName of metricNames) {\n metricCompletion.set(metricName, { label: metricName, type: 'constant' });\n }\n // avoid to get all metric metadata if the prometheus server is too big\n if (metricNames.length <= this.maxMetricsMetadata) {\n // in order to enrich the completion list of the metric,\n // we are trying to find the associated metadata\n return (_a = this.prometheusClient) === null || _a === void 0 ? void 0 : _a.metricMetadata();\n }\n })\n .then((metricMetadata) => {\n if (metricMetadata) {\n for (const [metricName, node] of metricCompletion) {\n // For histograms and summaries, the metadata is only exposed for the base metric name,\n // not separately for the _count, _sum, and _bucket time series.\n const metadata = metricMetadata[metricName.replace(/(_count|_sum|_bucket)$/, '')];\n if (metadata) {\n if (metadata.length > 1) {\n // it means the metricName has different possible helper and type\n for (const m of metadata) {\n if (node.detail === '') {\n node.detail = m.type;\n }\n else if (node.detail !== m.type) {\n node.detail = 'unknown';\n node.info = 'multiple different definitions for this metric';\n }\n if (node.info === '') {\n node.info = m.help;\n }\n else if (node.info !== m.help) {\n node.info = 'multiple different definitions for this metric';\n }\n }\n }\n else if (metadata.length === 1) {\n let { type, help } = metadata[0];\n if (type === 'histogram' || type === 'summary') {\n if (metricName.endsWith('_count')) {\n type = 'counter';\n help = `The total number of observations for: ${help}`;\n }\n if (metricName.endsWith('_sum')) {\n type = 'counter';\n help = `The total sum of observations for: ${help}`;\n }\n if (metricName.endsWith('_bucket')) {\n type = 'counter';\n help = `The total count of observations for a bucket in the histogram: ${help}`;\n }\n }\n node.detail = type;\n node.info = help;\n }\n }\n }\n }\n return result.concat(Array.from(metricCompletion.values()));\n });\n }\n autocompleteLabelName(result, context) {\n if (!this.prometheusClient) {\n return result;\n }\n return this.prometheusClient.labelNames(context.metricName).then((labelNames) => {\n return result.concat(labelNames.map((value) => ({ label: value, type: 'constant' })));\n });\n }\n autocompleteLabelValue(result, context) {\n if (!this.prometheusClient || !context.labelName) {\n return result;\n }\n return this.prometheusClient.labelValues(context.labelName, context.metricName, context.matchers).then((labelValues) => {\n return result.concat(labelValues.map((value) => ({ label: value, type: 'text' })));\n });\n }\n}\n//# sourceMappingURL=hybrid.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { Abs, Absent, AbsentOverTime, Acos, Acosh, Asin, Asinh, Atan, Atanh, AvgOverTime, Ceil, Changes, Clamp, ClampMax, ClampMin, Cos, Cosh, CountOverTime, DayOfMonth, DayOfWeek, DaysInMonth, Deg, Delta, Deriv, Exp, Floor, HistogramQuantile, HoltWinters, Hour, Idelta, Increase, Irate, LabelJoin, LabelReplace, LastOverTime, Ln, Log10, Log2, MaxOverTime, MinOverTime, Minute, Month, Pi, PredictLinear, PresentOverTime, QuantileOverTime, Rad, Rate, Resets, Round, Scalar, Sgn, Sin, Sinh, Sort, SortDesc, Sqrt, StddevOverTime, StdvarOverTime, SumOverTime, Tan, Tanh, Time, Timestamp, Vector, Year, } from '../grammar/parser.terms';\nexport var ValueType;\n(function (ValueType) {\n ValueType[\"none\"] = \"none\";\n ValueType[\"vector\"] = \"vector\";\n ValueType[\"scalar\"] = \"scalar\";\n ValueType[\"matrix\"] = \"matrix\";\n ValueType[\"string\"] = \"string\";\n})(ValueType || (ValueType = {}));\n// promqlFunctions is a list of all functions supported by PromQL, including their types.\n// Based on https://github.com/prometheus/prometheus/blob/master/promql/parser/functions.go#L26\nconst promqlFunctions = {\n [Abs]: {\n name: 'abs',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Absent]: {\n name: 'absent',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [AbsentOverTime]: {\n name: 'absent_over_time',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Acos]: {\n name: 'acos',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Acosh]: {\n name: 'acosh',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Asin]: {\n name: 'asin',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Asinh]: {\n name: 'asinh',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Atan]: {\n name: 'atan',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Atanh]: {\n name: 'atanh',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [AvgOverTime]: {\n name: 'avg_over_time',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Ceil]: {\n name: 'ceil',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Changes]: {\n name: 'changes',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Clamp]: {\n name: 'clamp',\n argTypes: [ValueType.vector, ValueType.scalar, ValueType.scalar],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [ClampMax]: {\n name: 'clamp_max',\n argTypes: [ValueType.vector, ValueType.scalar],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [ClampMin]: {\n name: 'clamp_min',\n argTypes: [ValueType.vector, ValueType.scalar],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Cos]: {\n name: 'cos',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Cosh]: {\n name: 'Cosh',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [CountOverTime]: {\n name: 'count_over_time',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [DaysInMonth]: {\n name: 'days_in_month',\n argTypes: [ValueType.vector],\n variadic: 1,\n returnType: ValueType.vector,\n },\n [DayOfMonth]: {\n name: 'day_of_month',\n argTypes: [ValueType.vector],\n variadic: 1,\n returnType: ValueType.vector,\n },\n [DayOfWeek]: {\n name: 'day_of_week',\n argTypes: [ValueType.vector],\n variadic: 1,\n returnType: ValueType.vector,\n },\n [Deg]: {\n name: 'deg',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Delta]: {\n name: 'delta',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Deriv]: {\n name: 'deriv',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Exp]: {\n name: 'exp',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Floor]: {\n name: 'floor',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [HistogramQuantile]: {\n name: 'histogram_quantile',\n argTypes: [ValueType.scalar, ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [HoltWinters]: {\n name: 'holt_winters',\n argTypes: [ValueType.matrix, ValueType.scalar, ValueType.scalar],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Hour]: {\n name: 'hour',\n argTypes: [ValueType.vector],\n variadic: 1,\n returnType: ValueType.vector,\n },\n [Idelta]: {\n name: 'idelta',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Increase]: {\n name: 'increase',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Irate]: {\n name: 'irate',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [LabelReplace]: {\n name: 'label_replace',\n argTypes: [ValueType.vector, ValueType.string, ValueType.string, ValueType.string, ValueType.string],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [LabelJoin]: {\n name: 'label_join',\n argTypes: [ValueType.vector, ValueType.string, ValueType.string, ValueType.string],\n variadic: -1,\n returnType: ValueType.vector,\n },\n [LastOverTime]: {\n name: 'last_over_time',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Ln]: {\n name: 'ln',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Log10]: {\n name: 'log10',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Log2]: {\n name: 'log2',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [MaxOverTime]: {\n name: 'max_over_time',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [MinOverTime]: {\n name: 'min_over_time',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Minute]: {\n name: 'minute',\n argTypes: [ValueType.vector],\n variadic: 1,\n returnType: ValueType.vector,\n },\n [Month]: {\n name: 'month',\n argTypes: [ValueType.vector],\n variadic: 1,\n returnType: ValueType.vector,\n },\n [Pi]: {\n name: 'pi',\n argTypes: [],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [PredictLinear]: {\n name: 'predict_linear',\n argTypes: [ValueType.matrix, ValueType.scalar],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [PresentOverTime]: {\n name: 'present_over_time',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [QuantileOverTime]: {\n name: 'quantile_over_time',\n argTypes: [ValueType.scalar, ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Rad]: {\n name: 'rad',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Rate]: {\n name: 'rate',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Resets]: {\n name: 'resets',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Round]: {\n name: 'round',\n argTypes: [ValueType.vector, ValueType.scalar],\n variadic: 1,\n returnType: ValueType.vector,\n },\n [Scalar]: {\n name: 'scalar',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.scalar,\n },\n [Sgn]: {\n name: 'sgn',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Sin]: {\n name: 'sin',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Sinh]: {\n name: 'Sinh',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Sort]: {\n name: 'sort',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [SortDesc]: {\n name: 'sort_desc',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Sqrt]: {\n name: 'sqrt',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [StddevOverTime]: {\n name: 'stddev_over_time',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [StdvarOverTime]: {\n name: 'stdvar_over_time',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [SumOverTime]: {\n name: 'sum_over_time',\n argTypes: [ValueType.matrix],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Tan]: {\n name: 'tan',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Tanh]: {\n name: 'tanh',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Time]: {\n name: 'time',\n argTypes: [],\n variadic: 0,\n returnType: ValueType.scalar,\n },\n [Timestamp]: {\n name: 'timestamp',\n argTypes: [ValueType.vector],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Vector]: {\n name: 'vector',\n argTypes: [ValueType.scalar],\n variadic: 0,\n returnType: ValueType.vector,\n },\n [Year]: {\n name: 'year',\n argTypes: [ValueType.vector],\n variadic: 1,\n returnType: ValueType.vector,\n },\n};\nexport function getFunction(id) {\n return promqlFunctions[id];\n}\n//# sourceMappingURL=function.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { EqlSingle, Neq } from '../grammar/parser.terms';\nexport class Matcher {\n constructor(type, name, value) {\n this.type = type;\n this.name = name;\n this.value = value;\n }\n matchesEmpty() {\n switch (this.type) {\n case EqlSingle:\n return this.value === '';\n case Neq:\n return this.value !== '';\n default:\n return false;\n }\n }\n}\n//# sourceMappingURL=matcher.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nexport var VectorMatchCardinality;\n(function (VectorMatchCardinality) {\n VectorMatchCardinality[\"CardOneToOne\"] = \"one-to-one\";\n VectorMatchCardinality[\"CardManyToOne\"] = \"many-to-one\";\n VectorMatchCardinality[\"CardOneToMany\"] = \"one-to-many\";\n VectorMatchCardinality[\"CardManyToMany\"] = \"many-to-many\";\n})(VectorMatchCardinality || (VectorMatchCardinality = {}));\n//# sourceMappingURL=vector.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { AggregateExpr, And, BinaryExpr, BinModifiers, Bool, Bottomk, CountValues, Eql, EqlSingle, Expr, FunctionCall, FunctionCallArgs, FunctionCallBody, Gte, Gtr, Identifier, LabelMatcher, LabelMatchers, LabelMatchList, Lss, Lte, MatrixSelector, MetricIdentifier, Neq, Or, ParenExpr, Quantile, StepInvariantExpr, SubqueryExpr, Topk, UnaryExpr, Unless, VectorSelector, } from '../grammar/parser.terms';\nimport { containsAtLeastOneChild, retrieveAllRecursiveNodes, walkThrough } from './path-finder';\nimport { getType } from './type';\nimport { buildLabelMatchers } from './matcher';\nimport { syntaxTree } from '@codemirror/language';\nimport { getFunction, Matcher, VectorMatchCardinality, ValueType } from '../types';\nimport { buildVectorMatching } from './vector';\nexport class Parser {\n constructor(state) {\n this.tree = syntaxTree(state);\n this.state = state;\n this.diagnostics = [];\n }\n getDiagnostics() {\n return this.diagnostics.sort((a, b) => {\n return a.from - b.from;\n });\n }\n analyze() {\n // when you are at the root of the tree, the first node is not `Expr` but a node with no name.\n // So to be able to iterate other the node relative to the promql node, we have to get the first child at the beginning\n this.checkAST(this.tree.topNode.firstChild);\n this.diagnoseAllErrorNodes();\n }\n diagnoseAllErrorNodes() {\n const cursor = this.tree.cursor();\n while (cursor.next()) {\n // usually there is an error node at the end of the expression when user is typing\n // so it's not really a useful information to say the expression is wrong.\n // Hopefully if there is an error node at the end of the tree, checkAST should yell more precisely\n if (cursor.type.id === 0 && cursor.to !== this.tree.topNode.to) {\n const node = cursor.node.parent;\n this.diagnostics.push({\n severity: 'error',\n message: 'unexpected expression',\n from: node ? node.from : cursor.from,\n to: node ? node.to : cursor.to,\n });\n }\n }\n }\n // checkAST is inspired of the same named method from prometheus/prometheus:\n // https://github.com/prometheus/prometheus/blob/3470ee1fbf9d424784eb2613bab5ab0f14b4d222/promql/parser/parse.go#L433\n checkAST(node) {\n if (!node) {\n return ValueType.none;\n }\n switch (node.type.id) {\n case Expr:\n return this.checkAST(node.firstChild);\n case AggregateExpr:\n this.checkAggregationExpr(node);\n break;\n case BinaryExpr:\n this.checkBinaryExpr(node);\n break;\n case FunctionCall:\n this.checkCallFunction(node);\n break;\n case ParenExpr:\n this.checkAST(walkThrough(node, Expr));\n break;\n case UnaryExpr:\n const unaryExprType = this.checkAST(walkThrough(node, Expr));\n if (unaryExprType !== ValueType.scalar && unaryExprType !== ValueType.vector) {\n this.addDiagnostic(node, `unary expression only allowed on expressions of type scalar or instant vector, got ${unaryExprType}`);\n }\n break;\n case SubqueryExpr:\n const subQueryExprType = this.checkAST(walkThrough(node, Expr));\n if (subQueryExprType !== ValueType.vector) {\n this.addDiagnostic(node, `subquery is only allowed on instant vector, got ${subQueryExprType} in ${node.name} instead`);\n }\n break;\n case MatrixSelector:\n this.checkAST(walkThrough(node, Expr));\n break;\n case VectorSelector:\n this.checkVectorSelector(node);\n break;\n case StepInvariantExpr:\n const exprValue = this.checkAST(walkThrough(node, Expr));\n if (exprValue !== ValueType.vector && exprValue !== ValueType.matrix) {\n this.addDiagnostic(node, `@ modifier must be preceded by an instant selector vector or range vector selector or a subquery`);\n }\n // if you are looking at the Prometheus code, you will likely find that some checks are missing here.\n // Specially the one checking if the timestamp after the `@` is ok: https://github.com/prometheus/prometheus/blob/ad5ed416ba635834370bfa06139258b31f8c33f9/promql/parser/parse.go#L722-L725\n // Since Javascript is managing the number as a float64 and so on 53 bits, we cannot validate that the maxInt64 number is a valid value.\n // So, to manage properly this issue, we would need to use the BigInt which is possible or by using ES2020.BigInt, or by using the lib: https://github.com/GoogleChromeLabs/jsbi.\n // * Introducing a lib just for theses checks is quite overkilled\n // * Using ES2020 would be the way to go. Unfortunately moving to ES2020 is breaking the build of the lib.\n // So far I didn't find the way to fix it. I think it's likely due to the fact we are building an ESM package which is now something stable in nodeJS/javascript but still experimental in typescript.\n // For the above reason, we decided to drop these checks.\n break;\n }\n return getType(node);\n }\n checkAggregationExpr(node) {\n var _a;\n // according to https://github.com/promlabs/lezer-promql/blob/master/src/promql.grammar#L26\n // the name of the aggregator function is stored in the first child\n const aggregateOp = (_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.firstChild;\n if (!aggregateOp) {\n this.addDiagnostic(node, 'aggregation operator expected in aggregation expression but got nothing');\n return;\n }\n const expr = walkThrough(node, FunctionCallBody, FunctionCallArgs, Expr);\n if (!expr) {\n this.addDiagnostic(node, 'unable to find the parameter for the expression');\n return;\n }\n this.expectType(expr, ValueType.vector, 'aggregation expression');\n // get the parameter of the aggregation operator\n const params = walkThrough(node, FunctionCallBody, FunctionCallArgs, FunctionCallArgs, Expr);\n if (aggregateOp.type.id === Topk || aggregateOp.type.id === Bottomk || aggregateOp.type.id === Quantile) {\n if (!params) {\n this.addDiagnostic(node, 'no parameter found');\n return;\n }\n this.expectType(params, ValueType.scalar, 'aggregation parameter');\n }\n if (aggregateOp.type.id === CountValues) {\n if (!params) {\n this.addDiagnostic(node, 'no parameter found');\n return;\n }\n this.expectType(params, ValueType.string, 'aggregation parameter');\n }\n }\n checkBinaryExpr(node) {\n // Following the definition of the BinaryExpr, the left and the right\n // expression are respectively the first and last child\n // https://github.com/promlabs/lezer-promql/blob/master/src/promql.grammar#L52\n const lExpr = node.firstChild;\n const rExpr = node.lastChild;\n if (!lExpr || !rExpr) {\n this.addDiagnostic(node, 'left or right expression is missing in binary expression');\n return;\n }\n const lt = this.checkAST(lExpr);\n const rt = this.checkAST(rExpr);\n const boolModifierUsed = walkThrough(node, BinModifiers, Bool);\n const isComparisonOperator = containsAtLeastOneChild(node, Eql, Neq, Lte, Lss, Gte, Gtr);\n const isSetOperator = containsAtLeastOneChild(node, And, Or, Unless);\n // BOOL modifier check\n if (boolModifierUsed) {\n if (!isComparisonOperator) {\n this.addDiagnostic(node, 'bool modifier can only be used on comparison operators');\n }\n }\n else {\n if (isComparisonOperator && lt === ValueType.scalar && rt === ValueType.scalar) {\n this.addDiagnostic(node, 'comparisons between scalars must use BOOL modifier');\n }\n }\n const vectorMatching = buildVectorMatching(this.state, node);\n if (vectorMatching !== null && vectorMatching.on) {\n for (const l1 of vectorMatching.matchingLabels) {\n for (const l2 of vectorMatching.include) {\n if (l1 === l2) {\n this.addDiagnostic(node, `label \"${l1}\" must not occur in ON and GROUP clause at once`);\n }\n }\n }\n }\n if (lt !== ValueType.scalar && lt !== ValueType.vector) {\n this.addDiagnostic(lExpr, 'binary expression must contain only scalar and instant vector types');\n }\n if (rt !== ValueType.scalar && rt !== ValueType.vector) {\n this.addDiagnostic(rExpr, 'binary expression must contain only scalar and instant vector types');\n }\n if ((lt !== ValueType.vector || rt !== ValueType.vector) && vectorMatching !== null) {\n if (vectorMatching.matchingLabels.length > 0) {\n this.addDiagnostic(node, 'vector matching only allowed between instant vectors');\n }\n }\n else {\n if (isSetOperator) {\n if ((vectorMatching === null || vectorMatching === void 0 ? void 0 : vectorMatching.card) === VectorMatchCardinality.CardOneToMany || (vectorMatching === null || vectorMatching === void 0 ? void 0 : vectorMatching.card) === VectorMatchCardinality.CardManyToOne) {\n this.addDiagnostic(node, 'no grouping allowed for set operations');\n }\n if ((vectorMatching === null || vectorMatching === void 0 ? void 0 : vectorMatching.card) !== VectorMatchCardinality.CardManyToMany) {\n this.addDiagnostic(node, 'set operations must always be many-to-many');\n }\n }\n }\n if ((lt === ValueType.scalar || rt === ValueType.scalar) && isSetOperator) {\n this.addDiagnostic(node, 'set operator not allowed in binary scalar expression');\n }\n }\n checkCallFunction(node) {\n var _a;\n const funcID = (_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.firstChild;\n if (!funcID) {\n this.addDiagnostic(node, 'function not defined');\n return;\n }\n const args = retrieveAllRecursiveNodes(walkThrough(node, FunctionCallBody), FunctionCallArgs, Expr);\n const funcSignature = getFunction(funcID.type.id);\n const nargs = funcSignature.argTypes.length;\n if (funcSignature.variadic === 0) {\n if (args.length !== nargs) {\n this.addDiagnostic(node, `expected ${nargs} argument(s) in call to \"${funcSignature.name}\", got ${args.length}`);\n }\n }\n else {\n const na = nargs - 1;\n if (na > args.length) {\n this.addDiagnostic(node, `expected at least ${na} argument(s) in call to \"${funcSignature.name}\", got ${args.length}`);\n }\n else {\n const nargsmax = na + funcSignature.variadic;\n if (funcSignature.variadic > 0 && nargsmax < args.length) {\n this.addDiagnostic(node, `expected at most ${nargsmax} argument(s) in call to \"${funcSignature.name}\", got ${args.length}`);\n }\n }\n }\n let j = 0;\n for (let i = 0; i < args.length; i++) {\n j = i;\n if (j >= funcSignature.argTypes.length) {\n if (funcSignature.variadic === 0) {\n // This is not a vararg function so we should not check the\n // type of the extra arguments.\n break;\n }\n j = funcSignature.argTypes.length - 1;\n }\n this.expectType(args[i], funcSignature.argTypes[j], `call to function \"${funcSignature.name}\"`);\n }\n }\n checkVectorSelector(node) {\n const labelMatchers = buildLabelMatchers(retrieveAllRecursiveNodes(walkThrough(node, LabelMatchers, LabelMatchList), LabelMatchList, LabelMatcher), this.state);\n let vectorSelectorName = '';\n // VectorSelector ( MetricIdentifier ( Identifier ) )\n // https://github.com/promlabs/lezer-promql/blob/71e2f9fa5ae6f5c5547d5738966cd2512e6b99a8/src/promql.grammar#L200\n const vectorSelectorNodeName = walkThrough(node, MetricIdentifier, Identifier);\n if (vectorSelectorNodeName) {\n vectorSelectorName = this.state.sliceDoc(vectorSelectorNodeName.from, vectorSelectorNodeName.to);\n }\n if (vectorSelectorName !== '') {\n // In this case the last LabelMatcher is checking for the metric name\n // set outside the braces. This checks if the name has already been set\n // previously\n const labelMatcherMetricName = labelMatchers.find((lm) => lm.name === '__name__');\n if (labelMatcherMetricName) {\n this.addDiagnostic(node, `metric name must not be set twice: ${vectorSelectorName} or ${labelMatcherMetricName.value}`);\n }\n // adding the metric name as a Matcher to avoid a false positive for this kind of expression:\n // foo{bare=''}\n labelMatchers.push(new Matcher(EqlSingle, '__name__', vectorSelectorName));\n }\n // A Vector selector must contain at least one non-empty matcher to prevent\n // implicit selection of all metrics (e.g. by a typo).\n const empty = labelMatchers.every((lm) => lm.matchesEmpty());\n if (empty) {\n this.addDiagnostic(node, 'vector selector must contain at least one non-empty matcher');\n }\n }\n expectType(node, want, context) {\n const t = this.checkAST(node);\n if (t !== want) {\n this.addDiagnostic(node, `expected type ${want} in ${context}, got ${t}`);\n }\n }\n addDiagnostic(node, msg) {\n this.diagnostics.push({\n severity: 'error',\n message: msg,\n from: node.from,\n to: node.to,\n });\n }\n}\n//# sourceMappingURL=parser.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { AggregateExpr, BinaryExpr, Expr, FunctionCall, MatrixSelector, NumberLiteral, OffsetExpr, ParenExpr, StepInvariantExpr, StringLiteral, SubqueryExpr, UnaryExpr, VectorSelector, } from '../grammar/parser.terms';\nimport { walkThrough } from './path-finder';\nimport { getFunction, ValueType } from '../types';\n// Based on https://github.com/prometheus/prometheus/blob/d668a7efe3107dbdcc67bf4e9f12430ed8e2b396/promql/parser/ast.go#L191\nexport function getType(node) {\n var _a;\n if (!node) {\n return ValueType.none;\n }\n switch (node.type.id) {\n case Expr:\n return getType(node.firstChild);\n case AggregateExpr:\n return ValueType.vector;\n case VectorSelector:\n return ValueType.vector;\n case OffsetExpr:\n return getType(node.firstChild);\n case StringLiteral:\n return ValueType.string;\n case NumberLiteral:\n return ValueType.scalar;\n case MatrixSelector:\n return ValueType.matrix;\n case SubqueryExpr:\n return ValueType.matrix;\n case ParenExpr:\n return getType(walkThrough(node, Expr));\n case UnaryExpr:\n return getType(walkThrough(node, Expr));\n case BinaryExpr:\n const lt = getType(node.firstChild);\n const rt = getType(node.lastChild);\n if (lt === ValueType.scalar && rt === ValueType.scalar) {\n return ValueType.scalar;\n }\n return ValueType.vector;\n case FunctionCall:\n const funcNode = (_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.firstChild;\n if (!funcNode) {\n return ValueType.none;\n }\n return getFunction(funcNode.type.id).returnType;\n case StepInvariantExpr:\n return getType(walkThrough(node, Expr));\n default:\n return ValueType.none;\n }\n}\n//# sourceMappingURL=type.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { And, BinaryExpr, BinModifiers, GroupingLabel, GroupingLabelList, GroupingLabels, GroupLeft, GroupRight, On, OnOrIgnoring, Or, Unless, } from '../grammar/parser.terms';\nimport { VectorMatchCardinality } from '../types';\nimport { containsAtLeastOneChild, retrieveAllRecursiveNodes } from './path-finder';\nexport function buildVectorMatching(state, binaryNode) {\n if (!binaryNode || binaryNode.type.id !== BinaryExpr) {\n return null;\n }\n const result = {\n card: VectorMatchCardinality.CardOneToOne,\n matchingLabels: [],\n on: false,\n include: [],\n };\n const binModifiers = binaryNode.getChild(BinModifiers);\n if (binModifiers) {\n const onOrIgnoring = binModifiers.getChild(OnOrIgnoring);\n if (onOrIgnoring) {\n result.on = onOrIgnoring.getChild(On) !== null;\n const labels = retrieveAllRecursiveNodes(onOrIgnoring.getChild(GroupingLabels), GroupingLabelList, GroupingLabel);\n if (labels.length > 0) {\n for (const label of labels) {\n result.matchingLabels.push(state.sliceDoc(label.from, label.to));\n }\n }\n }\n const groupLeft = binModifiers.getChild(GroupLeft);\n const groupRight = binModifiers.getChild(GroupRight);\n if (groupLeft || groupRight) {\n result.card = groupLeft ? VectorMatchCardinality.CardManyToOne : VectorMatchCardinality.CardOneToMany;\n const includeLabels = retrieveAllRecursiveNodes(binModifiers.getChild(GroupingLabels), GroupingLabelList, GroupingLabel);\n if (includeLabels.length > 0) {\n for (const label of includeLabels) {\n result.include.push(state.sliceDoc(label.from, label.to));\n }\n }\n }\n }\n const isSetOperator = containsAtLeastOneChild(binaryNode, And, Or, Unless);\n if (isSetOperator && result.card === VectorMatchCardinality.CardOneToOne) {\n result.card = VectorMatchCardinality.CardManyToMany;\n }\n return result;\n}\n//# sourceMappingURL=vector.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { snippet } from '@codemirror/autocomplete';\nexport const durationTerms = [{ label: 'y' }, { label: 'w' }, { label: 'd' }, { label: 'h' }, { label: 'm' }, { label: 's' }, { label: 'ms' }];\nexport const matchOpTerms = [{ label: '=' }, { label: '!=' }, { label: '=~' }, { label: '!~' }];\nexport const binOpTerms = [\n { label: '^' },\n { label: '*' },\n { label: '/' },\n { label: '%' },\n { label: '+' },\n { label: '-' },\n { label: '==' },\n { label: '>=' },\n { label: '>' },\n { label: '<' },\n { label: '<=' },\n { label: '!=' },\n { label: 'atan2' },\n { label: 'and' },\n { label: 'or' },\n { label: 'unless' },\n];\nexport const binOpModifierTerms = [\n { label: 'on', info: 'Match only on specified labels', type: 'keyword' },\n { label: 'ignoring', info: 'Ignore specified labels for matching', type: 'keyword' },\n { label: 'group_left', info: 'Allow many-to-one matching', type: 'keyword' },\n { label: 'group_right', info: 'Allow one-to-many matching', type: 'keyword' },\n];\nexport const atModifierTerms = [\n { label: 'start()', info: 'resolve to the start of the query', type: 'keyword' },\n { label: 'end()', info: 'resolve to the end of the query', type: 'keyword' },\n];\nexport const functionIdentifierTerms = [\n {\n label: 'abs',\n detail: 'function',\n info: 'Return absolute values of input series',\n type: 'function',\n },\n {\n label: 'absent',\n detail: 'function',\n info: 'Determine whether input vector is empty',\n type: 'function',\n },\n {\n label: 'absent_over_time',\n detail: 'function',\n info: 'Determine whether input range vector is empty',\n type: 'function',\n },\n {\n label: 'acos',\n detail: 'function',\n info: 'Calculate the arccosine, in radians, for input series',\n type: 'function',\n },\n {\n label: 'acosh',\n detail: 'function',\n info: 'Calculate the inverse hyperbolic cosine, in radians, for input series',\n type: 'function',\n },\n {\n label: 'asin',\n detail: 'function',\n info: 'Calculate the arcsine, in radians, for input series',\n type: 'function',\n },\n {\n label: 'asinh',\n detail: 'function',\n info: 'Calculate the inverse hyperbolic sine, in radians, for input series',\n type: 'function',\n },\n {\n label: 'atan',\n detail: 'function',\n info: 'Calculate the arctangent, in radians, for input series',\n type: 'function',\n },\n {\n label: 'atanh',\n detail: 'function',\n info: 'Calculate the inverse hyperbolic tangent, in radians, for input series',\n type: 'function',\n },\n {\n label: 'avg_over_time',\n detail: 'function',\n info: 'Average series values over time',\n type: 'function',\n },\n {\n label: 'ceil',\n detail: 'function',\n info: 'Round up values of input series to nearest integer',\n type: 'function',\n },\n {\n label: 'changes',\n detail: 'function',\n info: 'Return number of value changes in input series over time',\n type: 'function',\n },\n {\n label: 'clamp',\n detail: 'function',\n info: 'Limit the value of input series between a minimum and a maximum',\n type: 'function',\n },\n {\n label: 'clamp_max',\n detail: 'function',\n info: 'Limit the value of input series to a maximum',\n type: 'function',\n },\n {\n label: 'clamp_min',\n detail: 'function',\n info: 'Limit the value of input series to a minimum',\n type: 'function',\n },\n {\n label: 'cos',\n detail: 'function',\n info: 'Calculate the cosine, in radians, for input series',\n type: 'function',\n // Avoid ranking higher than `count`.\n boost: -1,\n },\n {\n label: 'cosh',\n detail: 'function',\n info: 'Calculate the hyperbolic cosine, in radians, for input series',\n type: 'function',\n // Avoid ranking higher than `count`.\n boost: -1,\n },\n {\n label: 'count_over_time',\n detail: 'function',\n info: 'Count the number of values for each input series',\n type: 'function',\n },\n {\n label: 'days_in_month',\n detail: 'function',\n info: 'Return the number of days in current month for provided timestamps',\n type: 'function',\n },\n {\n label: 'day_of_month',\n detail: 'function',\n info: 'Return the day of the month for provided timestamps',\n type: 'function',\n },\n {\n label: 'day_of_week',\n detail: 'function',\n info: 'Return the day of the week for provided timestamps',\n type: 'function',\n },\n {\n label: 'deg',\n detail: 'function',\n info: 'Convert radians to degrees for input series',\n type: 'function',\n // Avoid ranking higher than `delta`.\n boost: -1,\n },\n {\n label: 'delta',\n detail: 'function',\n info: 'Calculate the difference between beginning and end of a range vector (for gauges)',\n type: 'function',\n },\n {\n label: 'deriv',\n detail: 'function',\n info: 'Calculate the per-second derivative over series in a range vector (for gauges)',\n type: 'function',\n },\n {\n label: 'exp',\n detail: 'function',\n info: 'Calculate exponential function for input vector values',\n type: 'function',\n },\n {\n label: 'floor',\n detail: 'function',\n info: 'Round down values of input series to nearest integer',\n type: 'function',\n },\n {\n label: 'histogram_quantile',\n detail: 'function',\n info: 'Calculate quantiles from histogram buckets',\n type: 'function',\n },\n {\n label: 'holt_winters',\n detail: 'function',\n info: 'Calculate smoothed value of input series',\n type: 'function',\n },\n {\n label: 'hour',\n detail: 'function',\n info: 'Return the hour of the day for provided timestamps',\n type: 'function',\n },\n {\n label: 'idelta',\n detail: 'function',\n info: 'Calculate the difference between the last two samples of a range vector (for counters)',\n type: 'function',\n },\n {\n label: 'increase',\n detail: 'function',\n info: 'Calculate the increase in value over a range of time (for counters)',\n type: 'function',\n },\n {\n label: 'irate',\n detail: 'function',\n info: 'Calculate the per-second increase over the last two samples of a range vector (for counters)',\n type: 'function',\n },\n {\n label: 'label_replace',\n detail: 'function',\n info: 'Set or replace label values',\n type: 'function',\n },\n {\n label: 'label_join',\n detail: 'function',\n info: 'Join together label values into new label',\n type: 'function',\n },\n {\n label: 'last_over_time',\n detail: 'function',\n info: 'The most recent point value in specified interval.',\n type: 'function',\n },\n {\n label: 'ln',\n detail: 'function',\n info: 'Calculate natural logarithm of input series',\n type: 'function',\n },\n {\n label: 'log10',\n detail: 'function',\n info: 'Calulcate base-10 logarithm of input series',\n type: 'function',\n },\n {\n label: 'log2',\n detail: 'function',\n info: 'Calculate base-2 logarithm of input series',\n type: 'function',\n },\n {\n label: 'max_over_time',\n detail: 'function',\n info: 'Return the maximum value over time for input series',\n type: 'function',\n },\n {\n label: 'min_over_time',\n detail: 'function',\n info: 'Return the minimum value over time for input series',\n type: 'function',\n },\n {\n label: 'minute',\n detail: 'function',\n info: 'Return the minute of the hour for provided timestamps',\n type: 'function',\n },\n {\n label: 'month',\n detail: 'function',\n info: 'Return the month for provided timestamps',\n type: 'function',\n },\n {\n label: 'pi',\n detail: 'function',\n info: 'Return pi',\n type: 'function',\n },\n {\n label: 'predict_linear',\n detail: 'function',\n info: 'Predict the value of a gauge into the future',\n type: 'function',\n },\n {\n label: 'present_over_time',\n detail: 'function',\n info: 'the value 1 for any series in the specified interval',\n type: 'function',\n },\n {\n label: 'quantile_over_time',\n detail: 'function',\n info: 'Calculate value quantiles over time for input series',\n type: 'function',\n },\n {\n label: 'rad',\n detail: 'function',\n info: 'Convert degrees to radians for input series',\n type: 'function',\n // Avoid ranking higher than `rate`.\n boost: -1,\n },\n {\n label: 'rate',\n detail: 'function',\n info: 'Calculate per-second increase over a range vector (for counters)',\n type: 'function',\n },\n {\n label: 'resets',\n detail: 'function',\n info: 'Return number of value decreases (resets) in input series of time',\n type: 'function',\n },\n {\n label: 'round',\n detail: 'function',\n info: 'Round values of input series to nearest integer',\n type: 'function',\n },\n {\n label: 'scalar',\n detail: 'function',\n info: 'Convert single-element series vector into scalar value',\n type: 'function',\n },\n {\n label: 'sgn',\n detail: 'function',\n info: 'Returns the sign of the instant vector',\n type: 'function',\n },\n {\n label: 'sin',\n detail: 'function',\n info: 'Calculate the sine, in radians, for input series',\n type: 'function',\n },\n {\n label: 'sinh',\n detail: 'function',\n info: 'Calculate the hyperbolic sine, in radians, for input series',\n type: 'function',\n },\n {\n label: 'sort',\n detail: 'function',\n info: 'Sort input series ascendingly by value',\n type: 'function',\n },\n {\n label: 'sort_desc',\n detail: 'function',\n info: 'Sort input series descendingly by value',\n type: 'function',\n },\n {\n label: 'sqrt',\n detail: 'function',\n info: 'Return the square root for input series',\n type: 'function',\n },\n {\n label: 'stddev_over_time',\n detail: 'function',\n info: 'Calculate the standard deviation within input series over time',\n type: 'function',\n },\n {\n label: 'stdvar_over_time',\n detail: 'function',\n info: 'Calculate the standard variation within input series over time',\n type: 'function',\n },\n {\n label: 'sum_over_time',\n detail: 'function',\n info: 'Calculate the sum over the values of input series over time',\n type: 'function',\n },\n {\n label: 'tan',\n detail: 'function',\n info: 'Calculate the tangent, in radians, for input series',\n type: 'function',\n },\n {\n label: 'tanh',\n detail: 'function',\n info: 'Calculate the hyperbolic tangent, in radians, for input series',\n type: 'function',\n },\n {\n label: 'time',\n detail: 'function',\n info: 'Return the Unix timestamp at the current evaluation time',\n type: 'function',\n },\n {\n label: 'timestamp',\n detail: 'function',\n info: 'Return the Unix timestamp for the samples in the input vector',\n type: 'function',\n },\n {\n label: 'vector',\n detail: 'function',\n info: 'Convert a scalar value into a single-element series vector',\n type: 'function',\n },\n {\n label: 'year',\n detail: 'function',\n info: 'Return the year for provided timestamps',\n type: 'function',\n },\n];\nexport const aggregateOpTerms = [\n {\n label: 'avg',\n detail: 'aggregation',\n info: 'Calculate the average over dimensions',\n type: 'keyword',\n },\n {\n label: 'bottomk',\n detail: 'aggregation',\n info: 'Smallest k elements by sample value',\n type: 'keyword',\n },\n {\n label: 'count',\n detail: 'aggregation',\n info: 'Count number of elements in the vector',\n type: 'keyword',\n },\n {\n label: 'count_values',\n detail: 'aggregation',\n info: 'Count number of elements with the same value',\n type: 'keyword',\n },\n {\n label: 'group',\n detail: 'aggregation',\n info: 'Group series, while setting the sample value to 1',\n type: 'keyword',\n },\n {\n label: 'max',\n detail: 'aggregation',\n info: 'Select maximum over dimensions',\n type: 'keyword',\n },\n {\n label: 'min',\n detail: 'aggregation',\n info: 'Select minimum over dimensions',\n type: 'keyword',\n },\n {\n label: 'quantile',\n detail: 'aggregation',\n info: 'Calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions',\n type: 'keyword',\n },\n {\n label: 'stddev',\n detail: 'aggregation',\n info: 'Calculate population standard deviation over dimensions',\n type: 'keyword',\n },\n {\n label: 'stdvar',\n detail: 'aggregation',\n info: 'Calculate population standard variance over dimensions',\n type: 'keyword',\n },\n {\n label: 'sum',\n detail: 'aggregation',\n info: 'Calculate sum over dimensions',\n type: 'keyword',\n },\n {\n label: 'topk',\n detail: 'aggregation',\n info: 'Largest k elements by sample value',\n type: 'keyword',\n },\n];\nexport const aggregateOpModifierTerms = [\n {\n label: 'by',\n info: 'Keep the listed labels, remove all others.',\n type: 'keyword',\n },\n {\n label: 'without',\n info: 'Remove the listed labels, preserve all others.',\n type: 'keyword',\n },\n];\nexport const numberTerms = [\n { label: 'nan', info: 'Floating-point NaN value', type: 'constant' },\n { label: 'inf', info: 'Floating-point infinity', type: 'constant' },\n];\nexport const snippets = [\n {\n label: 'sum(rate(__input_vector__[5m]))',\n type: 'function',\n detail: 'snippet',\n info: 'Sum over rates of increase',\n apply: snippet('sum(rate(${__input_vector__}[5m]))'),\n },\n {\n label: 'histogram_quantile(__quantile__, sum by(le) (rate(__histogram_metric__[5m])))',\n type: 'function',\n detail: 'snippet',\n info: 'Approximate a quantile value from an aggregated histogram',\n apply: snippet('histogram_quantile(${__quantile__}, sum by(le) (rate(${__histogram_metric__}[5m])))'),\n },\n {\n label: 'label_replace(__input_vector__, \"__dst__\", \"__replacement__\", \"__src__\", \"__regex__\")',\n type: 'function',\n detail: 'snippet',\n info: 'Set or replace a label value in an input vector',\n apply: snippet('label_replace(${__input_vector__}, \"${__dst__}\", \"${__replacement__}\", \"${__src__}\", \"${__regex__}\")'),\n },\n {\n label: 'topk(__rank_number__, __input_vector__)',\n type: 'function',\n detail: 'snippet',\n info: 'Largest k elements by sample value',\n apply: snippet('topk(${__rank_number__}, ${__input_vector__})'),\n },\n {\n label: 'bottomk(__rank_number__, __input_vector__)',\n type: 'function',\n detail: 'snippet',\n info: 'Smallest k elements by sample value',\n apply: snippet('bottomk(${__rank_number__}, ${__input_vector__})'),\n },\n {\n label: 'count_values(\"__label_name__\", __input_vector__)',\n type: 'function',\n detail: 'snippet',\n info: 'Count the number of series per distinct sample value',\n apply: snippet('count_values(\"${__label_name__}\", ${__metric__})'),\n },\n];\n//# sourceMappingURL=promql.terms.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { labelMatchersToString } from '../parser';\nimport LRUCache from 'lru-cache';\n// These are status codes where the Prometheus API still returns a valid JSON body,\n// with an error encoded within the JSON.\nconst badRequest = 400;\nconst unprocessableEntity = 422;\nconst serviceUnavailable = 503;\n// HTTPPrometheusClient is the HTTP client that should be used to get some information from the different endpoint provided by prometheus.\nexport class HTTPPrometheusClient {\n constructor(config) {\n this.lookbackInterval = 60 * 60 * 1000 * 12; //12 hours\n this.httpMethod = 'POST';\n this.apiPrefix = '/api/v1';\n // For some reason, just assigning via \"= fetch\" here does not end up executing fetch correctly\n // when calling it, thus the indirection via another function wrapper.\n this.fetchFn = (input, init) => fetch(input, init);\n this.url = config.url;\n this.errorHandler = config.httpErrorHandler;\n if (config.lookbackInterval) {\n this.lookbackInterval = config.lookbackInterval;\n }\n if (config.fetchFn) {\n this.fetchFn = config.fetchFn;\n }\n if (config.httpMethod) {\n this.httpMethod = config.httpMethod;\n }\n if (config.apiPrefix) {\n this.apiPrefix = config.apiPrefix;\n }\n }\n labelNames(metricName) {\n const end = new Date();\n const start = new Date(end.getTime() - this.lookbackInterval);\n if (metricName === undefined || metricName === '') {\n const request = this.buildRequest(this.labelsEndpoint(), new URLSearchParams({\n start: start.toISOString(),\n end: end.toISOString(),\n }));\n // See https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names\n return this.fetchAPI(request.uri, {\n method: this.httpMethod,\n body: request.body,\n }).catch((error) => {\n if (this.errorHandler) {\n this.errorHandler(error);\n }\n return [];\n });\n }\n return this.series(metricName).then((series) => {\n const labelNames = new Set();\n for (const labelSet of series) {\n for (const [key] of Object.entries(labelSet)) {\n if (key === '__name__') {\n continue;\n }\n labelNames.add(key);\n }\n }\n return Array.from(labelNames);\n });\n }\n // labelValues return a list of the value associated to the given labelName.\n // In case a metric is provided, then the list of values is then associated to the couple \n labelValues(labelName, metricName, matchers) {\n const end = new Date();\n const start = new Date(end.getTime() - this.lookbackInterval);\n if (!metricName || metricName.length === 0) {\n const params = new URLSearchParams({\n start: start.toISOString(),\n end: end.toISOString(),\n });\n // See https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values\n return this.fetchAPI(`${this.labelValuesEndpoint().replace(/:name/gi, labelName)}?${params}`).catch((error) => {\n if (this.errorHandler) {\n this.errorHandler(error);\n }\n return [];\n });\n }\n return this.series(metricName, matchers, labelName).then((series) => {\n const labelValues = new Set();\n for (const labelSet of series) {\n for (const [key, value] of Object.entries(labelSet)) {\n if (key === '__name__') {\n continue;\n }\n if (key === labelName) {\n labelValues.add(value);\n }\n }\n }\n return Array.from(labelValues);\n });\n }\n metricMetadata() {\n return this.fetchAPI(this.metricMetadataEndpoint()).catch((error) => {\n if (this.errorHandler) {\n this.errorHandler(error);\n }\n return {};\n });\n }\n series(metricName, matchers, labelName) {\n const end = new Date();\n const start = new Date(end.getTime() - this.lookbackInterval);\n const request = this.buildRequest(this.seriesEndpoint(), new URLSearchParams({\n start: start.toISOString(),\n end: end.toISOString(),\n 'match[]': labelMatchersToString(metricName, matchers, labelName),\n }));\n // See https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers\n return this.fetchAPI(request.uri, {\n method: this.httpMethod,\n body: request.body,\n }).catch((error) => {\n if (this.errorHandler) {\n this.errorHandler(error);\n }\n return [];\n });\n }\n metricNames() {\n return this.labelValues('__name__');\n }\n fetchAPI(resource, init) {\n return this.fetchFn(this.url + resource, init)\n .then((res) => {\n if (!res.ok && ![badRequest, unprocessableEntity, serviceUnavailable].includes(res.status)) {\n throw new Error(res.statusText);\n }\n return res;\n })\n .then((res) => res.json())\n .then((apiRes) => {\n if (apiRes.status === 'error') {\n throw new Error(apiRes.error !== undefined ? apiRes.error : 'missing \"error\" field in response JSON');\n }\n if (apiRes.data === undefined) {\n throw new Error('missing \"data\" field in response JSON');\n }\n return apiRes.data;\n });\n }\n buildRequest(endpoint, params) {\n let uri = endpoint;\n let body = params;\n if (this.httpMethod === 'GET') {\n uri = `${uri}?${params}`;\n body = null;\n }\n return { uri, body };\n }\n labelsEndpoint() {\n return `${this.apiPrefix}/labels`;\n }\n labelValuesEndpoint() {\n return `${this.apiPrefix}/label/:name/values`;\n }\n seriesEndpoint() {\n return `${this.apiPrefix}/series`;\n }\n metricMetadataEndpoint() {\n return `${this.apiPrefix}/metadata`;\n }\n}\nclass Cache {\n constructor(config) {\n const maxAge = config && config.maxAge ? config.maxAge : 5 * 60 * 1000;\n this.completeAssociation = new LRUCache(maxAge);\n this.metricMetadata = {};\n this.labelValues = new LRUCache(maxAge);\n this.labelNames = [];\n if (config === null || config === void 0 ? void 0 : config.initialMetricList) {\n this.setLabelValues('__name__', config.initialMetricList);\n }\n }\n setAssociations(metricName, series) {\n series.forEach((labelSet) => {\n let currentAssociation = this.completeAssociation.get(metricName);\n if (!currentAssociation) {\n currentAssociation = new Map();\n this.completeAssociation.set(metricName, currentAssociation);\n }\n for (const [key, value] of Object.entries(labelSet)) {\n if (key === '__name__') {\n continue;\n }\n const labelValues = currentAssociation.get(key);\n if (labelValues === undefined) {\n currentAssociation.set(key, new Set([value]));\n }\n else {\n labelValues.add(value);\n }\n }\n });\n }\n setMetricMetadata(metadata) {\n this.metricMetadata = metadata;\n }\n getMetricMetadata() {\n return this.metricMetadata;\n }\n setLabelNames(labelNames) {\n this.labelNames = labelNames;\n }\n getLabelNames(metricName) {\n if (!metricName || metricName.length === 0) {\n return this.labelNames;\n }\n const labelSet = this.completeAssociation.get(metricName);\n return labelSet ? Array.from(labelSet.keys()) : [];\n }\n setLabelValues(labelName, labelValues) {\n this.labelValues.set(labelName, labelValues);\n }\n getLabelValues(labelName, metricName) {\n if (!metricName || metricName.length === 0) {\n const result = this.labelValues.get(labelName);\n return result ? result : [];\n }\n const labelSet = this.completeAssociation.get(metricName);\n if (labelSet) {\n const labelValues = labelSet.get(labelName);\n return labelValues ? Array.from(labelValues) : [];\n }\n return [];\n }\n}\nexport class CachedPrometheusClient {\n constructor(client, config) {\n this.client = client;\n this.cache = new Cache(config);\n }\n labelNames(metricName) {\n const cachedLabel = this.cache.getLabelNames(metricName);\n if (cachedLabel && cachedLabel.length > 0) {\n return Promise.resolve(cachedLabel);\n }\n if (metricName === undefined || metricName === '') {\n return this.client.labelNames().then((labelNames) => {\n this.cache.setLabelNames(labelNames);\n return labelNames;\n });\n }\n return this.series(metricName).then(() => {\n return this.cache.getLabelNames(metricName);\n });\n }\n labelValues(labelName, metricName) {\n const cachedLabel = this.cache.getLabelValues(labelName, metricName);\n if (cachedLabel && cachedLabel.length > 0) {\n return Promise.resolve(cachedLabel);\n }\n if (metricName === undefined || metricName === '') {\n return this.client.labelValues(labelName).then((labelValues) => {\n this.cache.setLabelValues(labelName, labelValues);\n return labelValues;\n });\n }\n return this.series(metricName).then(() => {\n return this.cache.getLabelValues(labelName, metricName);\n });\n }\n metricMetadata() {\n const cachedMetadata = this.cache.getMetricMetadata();\n if (cachedMetadata && Object.keys(cachedMetadata).length > 0) {\n return Promise.resolve(cachedMetadata);\n }\n return this.client.metricMetadata().then((metadata) => {\n this.cache.setMetricMetadata(metadata);\n return this.cache.getMetricMetadata();\n });\n }\n series(metricName) {\n return this.client.series(metricName).then((series) => {\n this.cache.setAssociations(metricName, series);\n return series;\n });\n }\n metricNames() {\n return this.labelValues('__name__');\n }\n}\n//# sourceMappingURL=prometheus.js.map","/**\n *\n * THIS FILE WAS COPIED INTO PROMETHEUS FROM GRAFANA'S VENDORED FORK OF FLOT\n * (LIVING AT https://github.com/grafana/grafana/tree/master/public/vendor/flot),\n * WHICH CONTAINS FIXES FOR DISPLAYING NULL VALUES IN STACKED GRAPHS. THE ORIGINAL\n * FLOT CODE WAS LICENSED UNDER THE MIT LICENSE AS STATED BELOW. ADDITIONAL\n * CHANGES HAVE BEEN CONTRIBUTED TO THE GRAFANA FORK UNDER AN APACHE 2 LICENSE, SEE\n * https://github.com/grafana/grafana/blob/master/license.\n *\n */\n\n/* eslint-disable prefer-spread */\n/* eslint-disable no-loop-func */\n/* eslint-disable @typescript-eslint/no-this-alias */\n/* eslint-disable no-redeclare */\n/* eslint-disable no-useless-escape */\n/* eslint-disable prefer-const */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/no-use-before-define */\n/* eslint-disable eqeqeq */\n/* eslint-disable no-var */\n/* Javascript plotting library for jQuery, version 0.8.3.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\n*/\n\n// first an inline dependency, jquery.colorhelpers.js, we inline it here\n// for convenience\n\n/* Plugin for jQuery for working with colors.\n *\n * Version 1.1.\n *\n * Inspiration from jQuery color animation plugin by John Resig.\n *\n * Released under the MIT license by Ole Laursen, October 2009.\n *\n * Examples:\n *\n * $.color.parse(\"#fff\").scale('rgb', 0.25).add('a', -0.5).toString()\n * var c = $.color.extract($(\"#mydiv\"), 'background-color');\n * console.log(c.r, c.g, c.b, c.a);\n * $.color.make(100, 50, 25, 0.4).toString() // returns \"rgba(100,50,25,0.4)\"\n *\n * Note that .scale() and .add() return the same modified object\n * instead of making a new one.\n *\n * V. 1.1: Fix error handling so e.g. parsing an empty string does\n * produce a color rather than just crashing.\n */\n\n(function($) {\n $.color = {};\n $.color.make = function(r, g, b, a) {\n var o = {};\n o.r = r || 0;\n o.g = g || 0;\n o.b = b || 0;\n o.a = a != null ? a : 1;\n o.add = function(c, d) {\n for (var i = 0; i < c.length; ++i) o[c.charAt(i)] += d;\n return o.normalize();\n };\n o.scale = function(c, f) {\n for (var i = 0; i < c.length; ++i) o[c.charAt(i)] *= f;\n return o.normalize();\n };\n o.toString = function() {\n if (o.a >= 1) {\n return 'rgb(' + [o.r, o.g, o.b].join(',') + ')';\n } else {\n return 'rgba(' + [o.r, o.g, o.b, o.a].join(',') + ')';\n }\n };\n o.normalize = function() {\n function clamp(min, value, max) {\n return value < min ? min : value > max ? max : value;\n }\n o.r = clamp(0, parseInt(o.r), 255);\n o.g = clamp(0, parseInt(o.g), 255);\n o.b = clamp(0, parseInt(o.b), 255);\n o.a = clamp(0, o.a, 1);\n return o;\n };\n o.clone = function() {\n return $.color.make(o.r, o.b, o.g, o.a);\n };\n return o.normalize();\n };\n $.color.extract = function(elem, css) {\n var c;\n do {\n c = elem.css(css).toLowerCase();\n if (c != '' && c != 'transparent') break;\n elem = elem.parent();\n } while (elem.length && !$.nodeName(elem.get(0), 'body'));\n if (c == 'rgba(0, 0, 0, 0)') c = 'transparent';\n return $.color.parse(c);\n };\n $.color.parse = function(str) {\n var res,\n m = $.color.make;\n if ((res = /rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/.exec(str)))\n return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10));\n if ((res = /rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\s*\\)/.exec(str)))\n return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10), parseFloat(res[4]));\n if ((res = /rgb\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*\\)/.exec(str)))\n return m(parseFloat(res[1]) * 2.55, parseFloat(res[2]) * 2.55, parseFloat(res[3]) * 2.55);\n if (\n (res = /rgba\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\s*\\)/.exec(\n str\n ))\n )\n return m(parseFloat(res[1]) * 2.55, parseFloat(res[2]) * 2.55, parseFloat(res[3]) * 2.55, parseFloat(res[4]));\n if ((res = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str)))\n return m(parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16));\n if ((res = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str)))\n return m(parseInt(res[1] + res[1], 16), parseInt(res[2] + res[2], 16), parseInt(res[3] + res[3], 16));\n var name = $.trim(str).toLowerCase();\n if (name == 'transparent') return m(255, 255, 255, 0);\n else {\n res = lookupColors[name] || [0, 0, 0];\n return m(res[0], res[1], res[2]);\n }\n };\n var lookupColors = {\n aqua: [0, 255, 255],\n azure: [240, 255, 255],\n beige: [245, 245, 220],\n black: [0, 0, 0],\n blue: [0, 0, 255],\n brown: [165, 42, 42],\n cyan: [0, 255, 255],\n darkblue: [0, 0, 139],\n darkcyan: [0, 139, 139],\n darkgrey: [169, 169, 169],\n darkgreen: [0, 100, 0],\n darkkhaki: [189, 183, 107],\n darkmagenta: [139, 0, 139],\n darkolivegreen: [85, 107, 47],\n darkorange: [255, 140, 0],\n darkorchid: [153, 50, 204],\n darkred: [139, 0, 0],\n darksalmon: [233, 150, 122],\n darkviolet: [148, 0, 211],\n fuchsia: [255, 0, 255],\n gold: [255, 215, 0],\n green: [0, 128, 0],\n indigo: [75, 0, 130],\n khaki: [240, 230, 140],\n lightblue: [173, 216, 230],\n lightcyan: [224, 255, 255],\n lightgreen: [144, 238, 144],\n lightgrey: [211, 211, 211],\n lightpink: [255, 182, 193],\n lightyellow: [255, 255, 224],\n lime: [0, 255, 0],\n magenta: [255, 0, 255],\n maroon: [128, 0, 0],\n navy: [0, 0, 128],\n olive: [128, 128, 0],\n orange: [255, 165, 0],\n pink: [255, 192, 203],\n purple: [128, 0, 128],\n violet: [128, 0, 128],\n red: [255, 0, 0],\n silver: [192, 192, 192],\n white: [255, 255, 255],\n yellow: [255, 255, 0],\n };\n})(window.jQuery);\n\n// the actual Flot code\n(function($) {\n // Cache the prototype hasOwnProperty for faster access\n\n let hasOwnProperty = Object.prototype.hasOwnProperty;\n\n // A shim to provide 'detach' to jQuery versions prior to 1.4. Using a DOM\n // operation produces the same effect as detach, i.e. removing the element\n // without touching its jQuery data.\n\n // Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+.\n\n if (!$.fn.detach) {\n $.fn.detach = function() {\n return this.each(function() {\n if (this.parentNode) {\n this.parentNode.removeChild(this);\n }\n });\n };\n }\n\n ///////////////////////////////////////////////////////////////////////////\n // The Canvas object is a wrapper around an HTML5 tag.\n //\n // @constructor\n // @param {string} cls List of classes to apply to the canvas.\n // @param {element} container Element onto which to append the canvas.\n //\n // Requiring a container is a little iffy, but unfortunately canvas\n // operations don't work unless the canvas is attached to the DOM.\n\n function Canvas(cls, container) {\n var element = container.children('.' + cls)[0];\n\n if (element == null) {\n element = document.createElement('canvas');\n element.className = cls;\n\n $(element)\n .css({ direction: 'ltr', position: 'absolute', left: 0, top: 0 })\n .appendTo(container);\n\n // If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas\n\n if (!element.getContext) {\n if (window.G_vmlCanvasManager) {\n element = window.G_vmlCanvasManager.initElement(element);\n } else {\n throw new Error(\n \"Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.\"\n );\n }\n }\n }\n\n this.element = element;\n\n var context = (this.context = element.getContext('2d'));\n\n // Determine the screen's ratio of physical to device-independent\n // pixels. This is the ratio between the canvas width that the browser\n // advertises and the number of pixels actually present in that space.\n\n // The iPhone 4, for example, has a device-independent width of 320px,\n // but its screen is actually 640px wide. It therefore has a pixel\n // ratio of 2, while most normal devices have a ratio of 1.\n\n let devicePixelRatio = window.devicePixelRatio || 1,\n backingStoreRatio =\n context.webkitBackingStorePixelRatio ||\n context.mozBackingStorePixelRatio ||\n context.msBackingStorePixelRatio ||\n context.oBackingStorePixelRatio ||\n context.backingStorePixelRatio ||\n 1;\n\n this.pixelRatio = devicePixelRatio / backingStoreRatio;\n\n // Size the canvas to match the internal dimensions of its container\n\n this.resize(container.width(), container.height());\n\n // Collection of HTML div layers for text overlaid onto the canvas\n\n this.textContainer = null;\n this.text = {};\n\n // Cache of text fragments and metrics, so we can avoid expensively\n // re-calculating them when the plot is re-rendered in a loop.\n\n this._textCache = {};\n this._textSizeCache = window.flotTextSizeCache = window.flotTextSizeCache || {};\n }\n\n // Resizes the canvas to the given dimensions.\n //\n // @param {number} width New width of the canvas, in pixels.\n // @param {number} width New height of the canvas, in pixels.\n\n Canvas.prototype.resize = function(width, height) {\n if (width <= 0 || height <= 0) {\n throw new Error('Invalid dimensions for plot, width = ' + width + ', height = ' + height);\n }\n\n let element = this.element,\n context = this.context,\n pixelRatio = this.pixelRatio;\n\n // Resize the canvas, increasing its density based on the display's\n // pixel ratio; basically giving it more pixels without increasing the\n // size of its element, to take advantage of the fact that retina\n // displays have that many more pixels in the same advertised space.\n\n // Resizing should reset the state (excanvas seems to be buggy though)\n\n if (this.width != width) {\n element.width = width * pixelRatio;\n element.style.width = width + 'px';\n this.width = width;\n }\n\n if (this.height != height) {\n element.height = height * pixelRatio;\n element.style.height = height + 'px';\n this.height = height;\n }\n\n // Save the context, so we can reset in case we get replotted. The\n // restore ensure that we're really back at the initial state, and\n // should be safe even if we haven't saved the initial state yet.\n\n context.restore();\n context.save();\n\n // Scale the coordinate space to match the display density; so even though we\n // may have twice as many pixels, we still want lines and other drawing to\n // appear at the same size; the extra pixels will just make them crisper.\n\n context.scale(pixelRatio, pixelRatio);\n };\n\n // Clears the entire canvas area, not including any overlaid HTML text\n\n Canvas.prototype.clear = function() {\n this.context.clearRect(0, 0, this.width, this.height);\n };\n\n // Finishes rendering the canvas, including managing the text overlay.\n\n Canvas.prototype.render = function() {\n let cache = this._textCache;\n\n // For each text layer, add elements marked as active that haven't\n // already been rendered, and remove those that are no longer active.\n\n for (let layerKey in cache) {\n if (hasOwnProperty.call(cache, layerKey)) {\n let layer = this.getTextLayer(layerKey),\n layerCache = cache[layerKey];\n\n layer.hide();\n\n for (let styleKey in layerCache) {\n if (hasOwnProperty.call(layerCache, styleKey)) {\n let styleCache = layerCache[styleKey];\n for (let key in styleCache) {\n if (hasOwnProperty.call(styleCache, key)) {\n let positions = styleCache[key].positions;\n\n for (var i = 0, position; (position = positions[i]); i++) {\n if (position.active) {\n if (!position.rendered) {\n layer.append(position.element);\n position.rendered = true;\n }\n } else {\n positions.splice(i--, 1);\n if (position.rendered) {\n position.element.detach();\n }\n }\n }\n\n if (positions.length == 0) {\n delete styleCache[key];\n }\n }\n }\n }\n }\n\n layer.show();\n }\n }\n };\n\n // Creates (if necessary) and returns the text overlay container.\n //\n // @param {string} classes String of space-separated CSS classes used to\n // uniquely identify the text layer.\n // @return {object} The jQuery-wrapped text-layer div.\n\n Canvas.prototype.getTextLayer = function(classes) {\n let layer = this.text[classes];\n\n // Create the text layer if it doesn't exist\n\n if (layer == null) {\n // Create the text layer container, if it doesn't exist\n\n if (this.textContainer == null) {\n this.textContainer = $(\"
\")\n .css({\n position: 'absolute',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n 'font-size': 'smaller',\n color: '#545454',\n })\n .insertAfter(this.element);\n }\n\n layer = this.text[classes] = $('
')\n .addClass(classes)\n .css({\n position: 'absolute',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n })\n .appendTo(this.textContainer);\n }\n\n return layer;\n };\n\n // Creates (if necessary) and returns a text info object.\n //\n // The object looks like this:\n //\n // {\n // width: Width of the text's wrapper div.\n // height: Height of the text's wrapper div.\n // element: The jQuery-wrapped HTML div containing the text.\n // positions: Array of positions at which this text is drawn.\n // }\n //\n // The positions array contains objects that look like this:\n //\n // {\n // active: Flag indicating whether the text should be visible.\n // rendered: Flag indicating whether the text is currently visible.\n // element: The jQuery-wrapped HTML div containing the text.\n // x: X coordinate at which to draw the text.\n // y: Y coordinate at which to draw the text.\n // }\n //\n // Each position after the first receives a clone of the original element.\n //\n // The idea is that that the width, height, and general 'identity' of the\n // text is constant no matter where it is placed; the placements are a\n // secondary property.\n //\n // Canvas maintains a cache of recently-used text info objects; getTextInfo\n // either returns the cached element or creates a new entry.\n //\n // @param {string} layer A string of space-separated CSS classes uniquely\n // identifying the layer containing this text.\n // @param {string} text Text string to retrieve info for.\n // @param {(string|object)=} font Either a string of space-separated CSS\n // classes or a font-spec object, defining the text's font and style.\n // @param {number=} angle Angle at which to rotate the text, in degrees.\n // Angle is currently unused, it will be implemented in the future.\n // @param {number=} width Maximum width of the text before it wraps.\n // @return {object} a text info object.\n\n Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) {\n let textStyle, layerCache, styleCache, info;\n\n // Cast the value to a string, in case we were given a number or such\n\n text = '' + text;\n\n // If the font is a font-spec object, generate a CSS font definition\n\n if (typeof font === 'object') {\n textStyle =\n font.style +\n ' ' +\n font.variant +\n ' ' +\n font.weight +\n ' ' +\n font.size +\n 'px/' +\n font.lineHeight +\n 'px ' +\n font.family;\n } else {\n textStyle = font;\n }\n\n // Retrieve (or create) the cache for the text's layer and styles\n\n layerCache = this._textCache[layer];\n\n if (layerCache == null) {\n layerCache = this._textCache[layer] = {};\n }\n\n styleCache = layerCache[textStyle];\n\n if (styleCache == null) {\n styleCache = layerCache[textStyle] = {};\n }\n\n info = styleCache[text];\n\n // If we can't find a matching element in our cache, create a new one\n\n if (info == null) {\n var element = $('
')\n .html(text)\n .css({\n position: 'absolute',\n 'max-width': width,\n top: -9999,\n })\n .appendTo(this.getTextLayer(layer));\n\n if (typeof font === 'object') {\n element.css({\n font: textStyle,\n color: font.color,\n });\n } else if (typeof font === 'string') {\n element.addClass(font);\n }\n\n info = styleCache[text] = { element: element, positions: [] };\n\n let size = this._textSizeCache[text];\n if (size) {\n info.width = size.width;\n info.height = size.height;\n } else {\n info.width = element.outerWidth(true);\n info.height = element.outerHeight(true);\n this._textSizeCache[text] = { width: info.width, height: info.height };\n }\n element.detach();\n }\n\n return info;\n };\n\n // Adds a text string to the canvas text overlay.\n //\n // The text isn't drawn immediately; it is marked as rendering, which will\n // result in its addition to the canvas on the next render pass.\n //\n // @param {string} layer A string of space-separated CSS classes uniquely\n // identifying the layer containing this text.\n // @param {number} x X coordinate at which to draw the text.\n // @param {number} y Y coordinate at which to draw the text.\n // @param {string} text Text string to draw.\n // @param {(string|object)=} font Either a string of space-separated CSS\n // classes or a font-spec object, defining the text's font and style.\n // @param {number=} angle Angle at which to rotate the text, in degrees.\n // Angle is currently unused, it will be implemented in the future.\n // @param {number=} width Maximum width of the text before it wraps.\n // @param {string=} halign Horizontal alignment of the text; either \"left\",\n // \"center\" or \"right\".\n // @param {string=} valign Vertical alignment of the text; either \"top\",\n // \"middle\" or \"bottom\".\n\n Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {\n let info = this.getTextInfo(layer, text, font, angle, width),\n positions = info.positions;\n\n // Tweak the div's position to match the text's alignment\n\n if (halign == 'center') {\n x -= info.width / 2;\n } else if (halign == 'right') {\n x -= info.width;\n }\n\n if (valign == 'middle') {\n y -= info.height / 2;\n } else if (valign == 'bottom') {\n y -= info.height;\n }\n\n // Determine whether this text already exists at this position.\n // If so, mark it for inclusion in the next render pass.\n\n for (var i = 0, position; (position = positions[i]); i++) {\n if (position.x == x && position.y == y) {\n position.active = true;\n return;\n }\n }\n\n // If the text doesn't exist at this position, create a new entry\n\n // For the very first position we'll re-use the original element,\n // while for subsequent ones we'll clone it.\n\n position = {\n active: true,\n rendered: false,\n element: positions.length ? info.element.clone() : info.element,\n x: x,\n y: y,\n };\n\n positions.push(position);\n\n // Move the element to its final position within the container\n\n position.element.css({\n top: Math.round(y),\n left: Math.round(x),\n 'text-align': halign, // In case the text wraps\n });\n };\n\n // Removes one or more text strings from the canvas text overlay.\n //\n // If no parameters are given, all text within the layer is removed.\n //\n // Note that the text is not immediately removed; it is simply marked as\n // inactive, which will result in its removal on the next render pass.\n // This avoids the performance penalty for 'clear and redraw' behavior,\n // where we potentially get rid of all text on a layer, but will likely\n // add back most or all of it later, as when redrawing axes, for example.\n //\n // @param {string} layer A string of space-separated CSS classes uniquely\n // identifying the layer containing this text.\n // @param {number=} x X coordinate of the text.\n // @param {number=} y Y coordinate of the text.\n // @param {string=} text Text string to remove.\n // @param {(string|object)=} font Either a string of space-separated CSS\n // classes or a font-spec object, defining the text's font and style.\n // @param {number=} angle Angle at which the text is rotated, in degrees.\n // Angle is currently unused, it will be implemented in the future.\n\n Canvas.prototype.removeText = function(layer, x, y, text, font, angle) {\n if (text == null) {\n let layerCache = this._textCache[layer];\n if (layerCache != null) {\n for (let styleKey in layerCache) {\n if (hasOwnProperty.call(layerCache, styleKey)) {\n let styleCache = layerCache[styleKey];\n for (let key in styleCache) {\n if (hasOwnProperty.call(styleCache, key)) {\n var positions = styleCache[key].positions;\n for (var i = 0, position; (position = positions[i]); i++) {\n position.active = false;\n }\n }\n }\n }\n }\n }\n } else {\n var positions = this.getTextInfo(layer, text, font, angle).positions;\n for (var i = 0, position; (position = positions[i]); i++) {\n if (position.x == x && position.y == y) {\n position.active = false;\n }\n }\n }\n };\n\n ///////////////////////////////////////////////////////////////////////////\n // The top-level container for the entire plot.\n\n function Plot(placeholder, data_, options_, plugins) {\n // data is on the form:\n // [ series1, series2 ... ]\n // where series is either just the data as [ [x1, y1], [x2, y2], ... ]\n // or { data: [ [x1, y1], [x2, y2], ... ], label: \"some label\", ... }\n\n let series = [],\n options = {\n // the color theme used for graphs\n colors: ['#edc240', '#afd8f8', '#cb4b4b', '#4da74d', '#9440ed'],\n legend: {\n show: true,\n noColumns: 1, // number of colums in legend table\n labelFormatter: null, // fn: string -> string\n labelBoxBorderColor: '#ccc', // border color for the little label boxes\n container: null, // container (as jQuery object) to put legend in, null means default on top of graph\n position: 'ne', // position of default legend container within plot\n margin: 5, // distance from grid edge to default legend container within plot\n backgroundColor: null, // null means auto-detect\n backgroundOpacity: 0.85, // set to 0 to avoid background\n sorted: null, // default to no legend sorting\n },\n xaxis: {\n show: null, // null = auto-detect, true = always, false = never\n position: 'bottom', // or \"top\"\n mode: null, // null or \"time\"\n font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: \"italic\", weight: \"bold\", family: \"sans-serif\", variant: \"small-caps\" }\n color: null, // base color, labels, ticks\n tickColor: null, // possibly different color of ticks, e.g. \"rgba(0,0,0,0.15)\"\n transform: null, // null or f: number -> number to transform axis\n inverseTransform: null, // if transform is set, this should be the inverse function\n min: null, // min. value to show, null means set automatically\n max: null, // max. value to show, null means set automatically\n autoscaleMargin: null, // margin in % to add if auto-setting min/max\n ticks: null, // either [1, 3] or [[1, \"a\"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks\n tickFormatter: null, // fn: number -> string\n labelWidth: null, // size of tick labels in pixels\n labelHeight: null,\n reserveSpace: null, // whether to reserve space even if axis isn't shown\n tickLength: null, // size in pixels of ticks, or \"full\" for whole line\n alignTicksWithAxis: null, // axis number or null for no sync\n tickDecimals: null, // no. of decimals, null means auto\n tickSize: null, // number or [number, \"unit\"]\n minTickSize: null, // number or [number, \"unit\"]\n },\n yaxis: {\n autoscaleMargin: 0.02,\n position: 'left', // or \"right\"\n },\n xaxes: [],\n yaxes: [],\n series: {\n points: {\n show: false,\n radius: 3,\n lineWidth: 2, // in pixels\n fill: true,\n fillColor: '#ffffff',\n symbol: 'circle', // or callback\n },\n lines: {\n // we don't put in show: false so we can see\n // whether lines were actively disabled\n lineWidth: 2, // in pixels\n fill: false,\n fillColor: null,\n steps: false,\n // Omit 'zero', so we can later default its value to\n // match that of the 'fill' option.\n },\n bars: {\n show: false,\n lineWidth: 2, // in pixels\n barWidth: 1, // in units of the x axis\n fill: true,\n fillColor: null,\n align: 'left', // \"left\", \"right\", or \"center\"\n horizontal: false,\n zero: true,\n },\n shadowSize: 3,\n highlightColor: null,\n },\n grid: {\n show: true,\n aboveData: false,\n color: '#545454', // primary color used for outline and labels\n backgroundColor: null, // null for transparent, else color\n borderColor: null, // set if different from the grid color\n tickColor: null, // color for the ticks, e.g. \"rgba(0,0,0,0.15)\"\n margin: 0, // distance from the canvas edge to the grid\n labelMargin: 5, // in pixels\n eventSectionHeight: 0, // space for event section\n axisMargin: 8, // in pixels\n borderWidth: 2, // in pixels\n minBorderMargin: null, // in pixels, null means taken from points radius\n markings: null, // array of ranges or fn: axes -> array of ranges\n markingsColor: '#f4f4f4',\n markingsLineWidth: 2,\n // interactive stuff\n clickable: false,\n hoverable: false,\n autoHighlight: true, // highlight in case mouse is near\n mouseActiveRadius: 10, // how far the mouse can be away to activate an item\n },\n interaction: {\n redrawOverlayInterval: 1000 / 60, // time between updates, -1 means in same flow\n },\n hooks: {},\n },\n surface = null, // the canvas for the plot itself\n overlay = null, // canvas for interactive stuff on top of plot\n eventHolder = null, // jQuery object that events should be bound to\n ctx = null,\n octx = null,\n xaxes = [],\n yaxes = [],\n plotOffset = { left: 0, right: 0, top: 0, bottom: 0 },\n plotWidth = 0,\n plotHeight = 0,\n hooks = {\n processOptions: [],\n processRawData: [],\n processDatapoints: [],\n processOffset: [],\n processRange: [],\n drawBackground: [],\n drawSeries: [],\n draw: [],\n bindEvents: [],\n drawOverlay: [],\n shutdown: [],\n },\n plot = this;\n\n // public functions\n plot.setData = setData;\n plot.setupGrid = setupGrid;\n plot.draw = draw;\n plot.getPlaceholder = function() {\n return placeholder;\n };\n plot.getCanvas = function() {\n return surface.element;\n };\n plot.getPlotOffset = function() {\n return plotOffset;\n };\n plot.width = function() {\n return plotWidth;\n };\n plot.height = function() {\n return plotHeight;\n };\n plot.offset = function() {\n let o = eventHolder.offset();\n o.left += plotOffset.left;\n o.top += plotOffset.top;\n return o;\n };\n plot.getData = function() {\n return series;\n };\n plot.getAxes = function() {\n var res = {};\n $.each(xaxes.concat(yaxes), function(_, axis) {\n if (axis) res[axis.direction + (axis.n != 1 ? axis.n : '') + 'axis'] = axis;\n });\n return res;\n };\n plot.getXAxes = function() {\n return xaxes;\n };\n plot.getYAxes = function() {\n return yaxes;\n };\n plot.c2p = canvasToAxisCoords;\n plot.p2c = axisToCanvasCoords;\n plot.getOptions = function() {\n return options;\n };\n plot.highlight = highlight;\n plot.unhighlight = unhighlight;\n plot.triggerRedrawOverlay = triggerRedrawOverlay;\n plot.pointOffset = function(point) {\n return {\n left: parseInt(xaxes[axisNumber(point, 'x') - 1].p2c(+point.x) + plotOffset.left, 10),\n top: parseInt(yaxes[axisNumber(point, 'y') - 1].p2c(+point.y) + plotOffset.top, 10),\n };\n };\n plot.shutdown = shutdown;\n plot.destroy = function() {\n shutdown();\n placeholder.removeData('plot').empty();\n\n series = [];\n options = null;\n surface = null;\n overlay = null;\n eventHolder = null;\n ctx = null;\n octx = null;\n xaxes = [];\n yaxes = [];\n hooks = null;\n highlights = [];\n plot = null;\n };\n plot.resize = function() {\n let width = placeholder.width(),\n height = placeholder.height();\n surface.resize(width, height);\n overlay.resize(width, height);\n };\n\n // public attributes\n plot.hooks = hooks;\n\n // initialize\n initPlugins(plot);\n parseOptions(options_);\n setupCanvases();\n setData(data_);\n setupGrid();\n draw();\n bindEvents();\n\n function executeHooks(hook, args) {\n args = [plot].concat(args);\n for (var i = 0; i < hook.length; ++i) hook[i].apply(this, args);\n }\n\n function initPlugins() {\n // References to key classes, allowing plugins to modify them\n\n let classes = {\n Canvas: Canvas,\n };\n\n for (let i = 0; i < plugins.length; ++i) {\n let p = plugins[i];\n p.init(plot, classes);\n if (p.options) $.extend(true, options, p.options);\n }\n }\n\n function parseOptions(opts) {\n $.extend(true, options, opts);\n\n // $.extend merges arrays, rather than replacing them. When less\n // colors are provided than the size of the default palette, we\n // end up with those colors plus the remaining defaults, which is\n // not expected behavior; avoid it by replacing them here.\n\n if (opts && opts.colors) {\n options.colors = opts.colors;\n }\n\n if (options.xaxis.color == null)\n options.xaxis.color = $.color\n .parse(options.grid.color)\n .scale('a', 0.22)\n .toString();\n if (options.yaxis.color == null)\n options.yaxis.color = $.color\n .parse(options.grid.color)\n .scale('a', 0.22)\n .toString();\n\n if (options.xaxis.tickColor == null)\n // grid.tickColor for back-compatibility\n options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;\n if (options.yaxis.tickColor == null)\n // grid.tickColor for back-compatibility\n options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;\n\n if (options.grid.borderColor == null) options.grid.borderColor = options.grid.color;\n if (options.grid.tickColor == null)\n options.grid.tickColor = $.color\n .parse(options.grid.color)\n .scale('a', 0.22)\n .toString();\n\n // Fill in defaults for axis options, including any unspecified\n // font-spec fields, if a font-spec was provided.\n\n // If no x/y axis options were provided, create one of each anyway,\n // since the rest of the code assumes that they exist.\n\n var i,\n axisOptions,\n axisCount,\n fontSize = placeholder.css('font-size'),\n fontSizeDefault = fontSize ? +fontSize.replace('px', '') : 13,\n fontDefaults = {\n style: placeholder.css('font-style'),\n size: Math.round(0.8 * fontSizeDefault),\n variant: placeholder.css('font-variant'),\n weight: placeholder.css('font-weight'),\n family: placeholder.css('font-family'),\n };\n\n axisCount = options.xaxes.length || 1;\n for (i = 0; i < axisCount; ++i) {\n axisOptions = options.xaxes[i];\n if (axisOptions && !axisOptions.tickColor) {\n axisOptions.tickColor = axisOptions.color;\n }\n\n axisOptions = $.extend(true, {}, options.xaxis, axisOptions);\n options.xaxes[i] = axisOptions;\n\n if (axisOptions.font) {\n axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\n if (!axisOptions.font.color) {\n axisOptions.font.color = axisOptions.color;\n }\n if (!axisOptions.font.lineHeight) {\n axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\n }\n }\n }\n\n axisCount = options.yaxes.length || 1;\n for (i = 0; i < axisCount; ++i) {\n axisOptions = options.yaxes[i];\n if (axisOptions && !axisOptions.tickColor) {\n axisOptions.tickColor = axisOptions.color;\n }\n\n axisOptions = $.extend(true, {}, options.yaxis, axisOptions);\n options.yaxes[i] = axisOptions;\n\n if (axisOptions.font) {\n axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\n if (!axisOptions.font.color) {\n axisOptions.font.color = axisOptions.color;\n }\n if (!axisOptions.font.lineHeight) {\n axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\n }\n }\n }\n\n // backwards compatibility, to be removed in future\n if (options.xaxis.noTicks && options.xaxis.ticks == null) options.xaxis.ticks = options.xaxis.noTicks;\n if (options.yaxis.noTicks && options.yaxis.ticks == null) options.yaxis.ticks = options.yaxis.noTicks;\n if (options.x2axis) {\n options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);\n options.xaxes[1].position = 'top';\n // Override the inherit to allow the axis to auto-scale\n if (options.x2axis.min == null) {\n options.xaxes[1].min = null;\n }\n if (options.x2axis.max == null) {\n options.xaxes[1].max = null;\n }\n }\n if (options.y2axis) {\n options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);\n options.yaxes[1].position = 'right';\n // Override the inherit to allow the axis to auto-scale\n if (options.y2axis.min == null) {\n options.yaxes[1].min = null;\n }\n if (options.y2axis.max == null) {\n options.yaxes[1].max = null;\n }\n }\n if (options.grid.coloredAreas) options.grid.markings = options.grid.coloredAreas;\n if (options.grid.coloredAreasColor) options.grid.markingsColor = options.grid.coloredAreasColor;\n if (options.lines) $.extend(true, options.series.lines, options.lines);\n if (options.points) $.extend(true, options.series.points, options.points);\n if (options.bars) $.extend(true, options.series.bars, options.bars);\n if (options.shadowSize != null) options.series.shadowSize = options.shadowSize;\n if (options.highlightColor != null) options.series.highlightColor = options.highlightColor;\n\n // save options on axes for future reference\n for (i = 0; i < options.xaxes.length; ++i) getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];\n for (i = 0; i < options.yaxes.length; ++i) getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];\n\n // add hooks from options\n for (var n in hooks) if (options.hooks[n] && options.hooks[n].length) hooks[n] = hooks[n].concat(options.hooks[n]);\n\n executeHooks(hooks.processOptions, [options]);\n }\n\n function setData(d) {\n series = parseData(d);\n fillInSeriesOptions();\n processData();\n }\n\n function parseData(d) {\n let res = [];\n for (let i = 0; i < d.length; ++i) {\n let s = $.extend(true, {}, options.series);\n\n if (d[i].data != null) {\n s.data = d[i].data; // move the data instead of deep-copy\n delete d[i].data;\n\n $.extend(true, s, d[i]);\n\n d[i].data = s.data;\n } else s.data = d[i];\n res.push(s);\n }\n\n return res;\n }\n\n function axisNumber(obj, coord) {\n var a = obj[coord + 'axis'];\n if (typeof a == 'object')\n // if we got a real axis, extract number\n a = a.n;\n if (typeof a != 'number') a = 1; // default to first axis\n return a;\n }\n\n function allAxes() {\n // return flat array without annoying null entries\n return $.grep(xaxes.concat(yaxes), function(a) {\n return a;\n });\n }\n\n function canvasToAxisCoords(pos) {\n // return an object with x/y corresponding to all used axes\n var res = {},\n i,\n axis;\n for (i = 0; i < xaxes.length; ++i) {\n axis = xaxes[i];\n if (axis) res['x' + axis.n] = axis.c2p(pos.left);\n }\n\n for (i = 0; i < yaxes.length; ++i) {\n axis = yaxes[i];\n if (axis) res['y' + axis.n] = axis.c2p(pos.top);\n }\n\n if (res.x1 !== undefined) res.x = res.x1;\n if (res.y1 !== undefined) res.y = res.y1;\n\n return res;\n }\n\n function axisToCanvasCoords(pos) {\n // get canvas coords from the first pair of x/y found in pos\n var res = {},\n i,\n axis,\n key;\n\n for (i = 0; i < xaxes.length; ++i) {\n axis = xaxes[i];\n if (axis && axis.used) {\n key = 'x' + axis.n;\n if (pos[key] == null && axis.n == 1) key = 'x';\n\n if (pos[key] != null) {\n res.left = axis.p2c(pos[key]);\n break;\n }\n }\n }\n\n for (i = 0; i < yaxes.length; ++i) {\n axis = yaxes[i];\n if (axis && axis.used) {\n key = 'y' + axis.n;\n if (pos[key] == null && axis.n == 1) key = 'y';\n\n if (pos[key] != null) {\n res.top = axis.p2c(pos[key]);\n break;\n }\n }\n }\n\n return res;\n }\n\n function getOrCreateAxis(axes, number) {\n if (!axes[number - 1])\n axes[number - 1] = {\n n: number, // save the number for future reference\n direction: axes == xaxes ? 'x' : 'y',\n options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis),\n };\n\n return axes[number - 1];\n }\n\n function fillInSeriesOptions() {\n var neededColors = series.length,\n maxIndex = -1,\n i;\n\n // Subtract the number of series that already have fixed colors or\n // color indexes from the number that we still need to generate.\n\n for (i = 0; i < series.length; ++i) {\n let sc = series[i].color;\n if (sc != null) {\n neededColors--;\n if (typeof sc == 'number' && sc > maxIndex) {\n maxIndex = sc;\n }\n }\n }\n\n // If any of the series have fixed color indexes, then we need to\n // generate at least as many colors as the highest index.\n\n if (neededColors <= maxIndex) {\n neededColors = maxIndex + 1;\n }\n\n // Generate all the colors, using first the option colors and then\n // variations on those colors once they're exhausted.\n\n var c,\n colors = [],\n colorPool = options.colors,\n colorPoolSize = colorPool.length,\n variation = 0;\n\n for (i = 0; i < neededColors; i++) {\n c = $.color.parse(colorPool[i % colorPoolSize] || '#666');\n\n // Each time we exhaust the colors in the pool we adjust\n // a scaling factor used to produce more variations on\n // those colors. The factor alternates negative/positive\n // to produce lighter/darker colors.\n\n // Reset the variation after every few cycles, or else\n // it will end up producing only white or black colors.\n\n if (i % colorPoolSize == 0 && i) {\n if (variation >= 0) {\n if (variation < 0.5) {\n variation = -variation - 0.2;\n } else variation = 0;\n } else variation = -variation;\n }\n\n colors[i] = c.scale('rgb', 1 + variation);\n }\n\n // Finalize the series options, filling in their colors\n\n var colori = 0,\n s;\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n\n // assign colors\n if (s.color == null) {\n s.color = colors[colori].toString();\n ++colori;\n } else if (typeof s.color == 'number') s.color = colors[s.color].toString();\n\n // turn on lines automatically in case nothing is set\n if (s.lines.show == null) {\n var v,\n show = true;\n for (v in s)\n if (s[v] && s[v].show) {\n show = false;\n break;\n }\n if (show) s.lines.show = true;\n }\n\n // If nothing was provided for lines.zero, default it to match\n // lines.fill, since areas by default should extend to zero.\n\n if (s.lines.zero == null) {\n s.lines.zero = !!s.lines.fill;\n }\n\n // setup axes\n s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, 'x'));\n s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, 'y'));\n }\n }\n\n function processData() {\n let topSentry = Number.POSITIVE_INFINITY,\n bottomSentry = Number.NEGATIVE_INFINITY,\n fakeInfinity = Number.MAX_VALUE,\n i,\n j,\n k,\n m,\n s,\n points,\n ps,\n val,\n f,\n p,\n data,\n format;\n\n function updateAxis(axis, min, max) {\n if (min < axis.datamin && min != -fakeInfinity) axis.datamin = min;\n if (max > axis.datamax && max != fakeInfinity) axis.datamax = max;\n }\n\n $.each(allAxes(), function(_, axis) {\n // init axis\n axis.datamin = topSentry;\n axis.datamax = bottomSentry;\n axis.used = false;\n });\n\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n s.datapoints = { points: [] };\n\n executeHooks(hooks.processRawData, [s, s.data, s.datapoints]);\n }\n\n // first pass: clean and copy data\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n\n data = s.data;\n format = s.datapoints.format;\n\n if (!format) {\n format = [];\n // find out how to copy\n format.push({ x: true, number: true, required: true });\n format.push({ y: true, number: true, required: true });\n\n if (s.stack || s.bars.show || (s.lines.show && s.lines.fill)) {\n let autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));\n format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });\n if (s.bars.horizontal) {\n delete format[format.length - 1].y;\n format[format.length - 1].x = true;\n }\n }\n\n s.datapoints.format = format;\n }\n\n if (s.datapoints.pointsize != null) continue; // already filled in\n\n s.datapoints.pointsize = format.length;\n\n ps = s.datapoints.pointsize;\n points = s.datapoints.points;\n\n let insertSteps = s.lines.show && s.lines.steps;\n s.xaxis.used = s.yaxis.used = true;\n\n for (j = k = 0; j < data.length; ++j, k += ps) {\n p = data[j];\n\n let nullify = p == null;\n if (!nullify) {\n for (m = 0; m < ps; ++m) {\n val = p[m];\n f = format[m];\n\n if (f) {\n if (f.number && val != null) {\n val = +val; // convert to number\n if (isNaN(val)) val = null;\n else if (val == Infinity) val = fakeInfinity;\n else if (val == -Infinity) val = -fakeInfinity;\n }\n\n if (val == null) {\n if (f.required) nullify = true;\n\n if (f.defaultValue != null) val = f.defaultValue;\n }\n }\n\n points[k + m] = val;\n }\n }\n\n if (nullify) {\n for (m = 0; m < ps; ++m) {\n val = points[k + m];\n if (val != null) {\n f = format[m];\n // extract min/max info\n if (f.autoscale !== false) {\n if (f.x) {\n updateAxis(s.xaxis, val, val);\n }\n if (f.y) {\n updateAxis(s.yaxis, val, val);\n }\n }\n }\n points[k + m] = null;\n }\n }\n\n if (insertSteps && k > 0 && (!nullify || points[k - ps] != null)) {\n // copy the point to make room for a middle point\n for (m = 0; m < ps; ++m) points[k + ps + m] = points[k + m];\n\n // middle point has same y\n points[k + 1] = points[k - ps + 1] || 0;\n\n // if series has null values, let's give the last !null value a nice step\n if (nullify) points[k] = p[0];\n\n // we've added a point, better reflect that\n k += ps;\n }\n }\n }\n\n // give the hooks a chance to run\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n points = s.datapoints.points;\n ps = s.datapoints.pointsize;\n\n // grafana\n if (s.transform === 'negative-Y') {\n for (j = 0; j < points.length; j += ps) {\n if (points[j] == null) continue;\n\n val = points[j + 1];\n points[j + 1] = -val;\n }\n }\n\n executeHooks(hooks.processDatapoints, [s, s.datapoints]);\n }\n\n // second pass: find datamax/datamin for auto-scaling\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n points = s.datapoints.points;\n ps = s.datapoints.pointsize;\n format = s.datapoints.format;\n\n var xmin = topSentry,\n ymin = topSentry,\n xmax = bottomSentry,\n ymax = bottomSentry;\n\n for (j = 0; j < points.length; j += ps) {\n if (points[j] == null) continue;\n\n for (m = 0; m < ps; ++m) {\n val = points[j + m];\n f = format[m];\n if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity) continue;\n\n if (f.x) {\n if (val < xmin) xmin = val;\n if (val > xmax) xmax = val;\n }\n if (f.y) {\n if (val < ymin) ymin = val;\n if (val > ymax) ymax = val;\n }\n }\n }\n\n if (s.bars.show) {\n // make sure we got room for the bar on the dancing floor\n var delta;\n\n switch (s.bars.align) {\n case 'left':\n delta = 0;\n break;\n case 'right':\n delta = -s.bars.barWidth;\n break;\n default:\n delta = -s.bars.barWidth / 2;\n }\n\n if (s.bars.horizontal) {\n ymin += delta;\n ymax += delta + s.bars.barWidth;\n } else {\n xmin += delta;\n xmax += delta + s.bars.barWidth;\n }\n }\n\n updateAxis(s.xaxis, xmin, xmax);\n updateAxis(s.yaxis, ymin, ymax);\n }\n\n $.each(allAxes(), function(_, axis) {\n if (axis.datamin == topSentry) axis.datamin = null;\n if (axis.datamax == bottomSentry) axis.datamax = null;\n });\n }\n\n function setupCanvases() {\n // Make sure the placeholder is clear of everything except canvases\n // from a previous plot in this container that we'll try to re-use.\n\n placeholder.find('.flot-temp-elem').remove();\n\n if (placeholder.css('position') == 'static') placeholder.css('position', 'relative'); // for positioning labels and overlay\n\n surface = new Canvas('flot-base', placeholder);\n overlay = new Canvas('flot-overlay', placeholder); // overlay canvas for interactive features\n\n ctx = surface.context;\n octx = overlay.context;\n\n // define which element we're listening for events on\n eventHolder = $(overlay.element).unbind();\n\n // If we're re-using a plot object, shut down the old one\n\n var existing = placeholder.data('plot');\n\n if (existing) {\n existing.shutdown();\n overlay.clear();\n }\n\n // save in case we get replotted\n placeholder.data('plot', plot);\n }\n\n function bindEvents() {\n // bind events\n if (options.grid.hoverable) {\n eventHolder.mousemove(onMouseMove);\n\n // Use bind, rather than .mouseleave, because we officially\n // still support jQuery 1.2.6, which doesn't define a shortcut\n // for mouseenter or mouseleave. This was a bug/oversight that\n // was fixed somewhere around 1.3.x. We can return to using\n // .mouseleave when we drop support for 1.2.6.\n\n eventHolder.bind('mouseleave', onMouseLeave);\n }\n\n if (options.grid.clickable) eventHolder.click(onClick);\n\n executeHooks(hooks.bindEvents, [eventHolder]);\n }\n\n function shutdown() {\n if (redrawTimeout) clearTimeout(redrawTimeout);\n\n eventHolder.unbind('mousemove', onMouseMove);\n eventHolder.unbind('mouseleave', onMouseLeave);\n eventHolder.unbind('click', onClick);\n\n executeHooks(hooks.shutdown, [eventHolder]);\n }\n\n function setTransformationHelpers(axis) {\n // set helper functions on the axis, assumes plot area\n // has been computed already\n\n function identity(x) {\n return x;\n }\n\n var s,\n m,\n t = axis.options.transform || identity,\n it = axis.options.inverseTransform;\n\n // precompute how much the axis is scaling a point\n // in canvas space\n if (axis.direction == 'x') {\n s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));\n m = Math.min(t(axis.max), t(axis.min));\n } else {\n s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));\n s = -s;\n m = Math.max(t(axis.max), t(axis.min));\n }\n\n // data point to canvas coordinate\n if (t == identity)\n // slight optimization\n axis.p2c = function(p) {\n return (p - m) * s;\n };\n else\n axis.p2c = function(p) {\n return (t(p) - m) * s;\n };\n // canvas coordinate to data point\n if (!it)\n axis.c2p = function(c) {\n return m + c / s;\n };\n else\n axis.c2p = function(c) {\n return it(m + c / s);\n };\n }\n\n function measureTickLabels(axis) {\n let opts = axis.options,\n ticks = axis.ticks || [],\n labelWidth = opts.labelWidth || 0,\n labelHeight = opts.labelHeight || 0,\n maxWidth = labelWidth || (axis.direction == 'x' ? Math.floor(surface.width / (ticks.length || 1)) : null),\n legacyStyles = axis.direction + 'Axis ' + axis.direction + axis.n + 'Axis',\n layer = 'flot-' + axis.direction + '-axis flot-' + axis.direction + axis.n + '-axis ' + legacyStyles,\n font = opts.font || 'flot-tick-label tickLabel';\n\n for (let i = 0; i < ticks.length; ++i) {\n let t = ticks[i];\n\n if (!t.label) continue;\n\n let info = surface.getTextInfo(layer, t.label, font, null, maxWidth);\n\n /// Grafana fix, add +1 to label width\n labelWidth = Math.max(labelWidth, info.width + 1);\n labelHeight = Math.max(labelHeight, info.height);\n }\n\n axis.labelWidth = opts.labelWidth || labelWidth;\n axis.labelHeight = opts.labelHeight || labelHeight;\n }\n\n function allocateAxisBoxFirstPhase(axis) {\n // find the bounding box of the axis by looking at label\n // widths/heights and ticks, make room by diminishing the\n // plotOffset; this first phase only looks at one\n // dimension per axis, the other dimension depends on the\n // other axes so will have to wait\n\n let lw = axis.labelWidth,\n lh = axis.labelHeight,\n pos = axis.options.position,\n isXAxis = axis.direction === 'x',\n tickLength = axis.options.tickLength,\n axisMargin = options.grid.axisMargin,\n padding = options.grid.labelMargin,\n eventSectionPadding = options.grid.eventSectionHeight,\n innermost = true,\n outermost = true,\n first = true,\n found = false;\n\n // Determine the axis's position in its direction and on its side\n\n $.each(isXAxis ? xaxes : yaxes, function(i, a) {\n if (a && (a.show || a.reserveSpace)) {\n if (a === axis) {\n found = true;\n } else if (a.options.position === pos) {\n if (found) {\n outermost = false;\n } else {\n innermost = false;\n }\n }\n if (!found) {\n first = false;\n }\n }\n });\n\n // The outermost axis on each side has no margin\n\n if (outermost) {\n axisMargin = 0;\n }\n\n // The ticks for the first axis in each direction stretch across\n\n if (tickLength == null) {\n tickLength = first ? 'full' : 5;\n }\n\n if (!isNaN(+tickLength)) padding += +tickLength;\n\n if (isXAxis) {\n // Add space for event section\n lh += padding;\n lh += eventSectionPadding;\n\n if (pos == 'bottom') {\n plotOffset.bottom += lh + axisMargin;\n axis.box = { top: surface.height - plotOffset.bottom, height: lh };\n } else {\n axis.box = { top: plotOffset.top + axisMargin, height: lh };\n plotOffset.top += lh + axisMargin;\n }\n } else {\n lw += padding;\n\n if (pos == 'left') {\n axis.box = { left: plotOffset.left + axisMargin, width: lw };\n plotOffset.left += lw + axisMargin;\n } else {\n plotOffset.right += lw + axisMargin;\n axis.box = { left: surface.width - plotOffset.right, width: lw };\n }\n }\n\n // save for future reference\n axis.position = pos;\n axis.tickLength = tickLength;\n axis.box.padding = padding;\n axis.box.eventSectionPadding = eventSectionPadding;\n axis.innermost = innermost;\n }\n\n function allocateAxisBoxSecondPhase(axis) {\n // now that all axis boxes have been placed in one\n // dimension, we can set the remaining dimension coordinates\n if (axis.direction == 'x') {\n axis.box.left = plotOffset.left - axis.labelWidth / 2;\n axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;\n } else {\n axis.box.top = plotOffset.top - axis.labelHeight / 2;\n axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;\n }\n }\n\n function adjustLayoutForThingsStickingOut() {\n // possibly adjust plot offset to ensure everything stays\n // inside the canvas and isn't clipped off\n\n let minMargin = options.grid.minBorderMargin,\n i;\n\n // check stuff from the plot (FIXME: this should just read\n // a value from the series, otherwise it's impossible to\n // customize)\n if (minMargin == null) {\n minMargin = 0;\n for (i = 0; i < series.length; ++i)\n minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth / 2));\n }\n\n let margins = {\n left: minMargin,\n right: minMargin,\n top: minMargin,\n bottom: minMargin,\n };\n\n // check axis labels, note we don't check the actual\n // labels but instead use the overall width/height to not\n // jump as much around with replots\n $.each(allAxes(), function(_, axis) {\n if (axis.reserveSpace && axis.ticks && axis.ticks.length) {\n if (axis.direction === 'x') {\n margins.left = Math.max(margins.left, axis.labelWidth / 2);\n margins.right = Math.max(margins.right, axis.labelWidth / 2);\n } else {\n margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2);\n margins.top = Math.max(margins.top, axis.labelHeight / 2);\n }\n }\n });\n\n plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left));\n plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right));\n plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top));\n plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom));\n }\n\n function setupGrid() {\n var i,\n axes = allAxes(),\n showGrid = options.grid.show;\n\n // Initialize the plot's offset from the edge of the canvas\n\n for (var a in plotOffset) {\n let margin = options.grid.margin || 0;\n plotOffset[a] = typeof margin == 'number' ? margin : margin[a] || 0;\n }\n\n executeHooks(hooks.processOffset, [plotOffset]);\n\n // If the grid is visible, add its border width to the offset\n\n for (var a in plotOffset) {\n if (typeof options.grid.borderWidth == 'object') {\n plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;\n } else {\n plotOffset[a] += showGrid ? options.grid.borderWidth : 0;\n }\n }\n\n $.each(axes, function(_, axis) {\n let axisOpts = axis.options;\n axis.show = axisOpts.show == null ? axis.used : axisOpts.show;\n axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace;\n setRange(axis);\n });\n\n executeHooks(hooks.processRange, []);\n\n if (showGrid) {\n var allocatedAxes = $.grep(axes, function(axis) {\n return axis.show || axis.reserveSpace;\n });\n\n let snaped = false;\n for (var i = 0; i < 2; i++) {\n $.each(allocatedAxes, function(_, axis) {\n // make the ticks\n setupTickGeneration(axis);\n setTicks(axis);\n snaped = snapRangeToTicks(axis, axis.ticks) || snaped;\n // find labelWidth/Height for axis\n measureTickLabels(axis);\n });\n\n if (snaped && hooks.processRange.length > 0) {\n executeHooks(hooks.processRange, []);\n snaped = false;\n } else {\n break;\n }\n }\n\n // with all dimensions calculated, we can compute the\n // axis bounding boxes, start from the outside\n // (reverse order)\n for (i = allocatedAxes.length - 1; i >= 0; --i) allocateAxisBoxFirstPhase(allocatedAxes[i]);\n\n // make sure we've got enough space for things that\n // might stick out\n adjustLayoutForThingsStickingOut();\n\n $.each(allocatedAxes, function(_, axis) {\n allocateAxisBoxSecondPhase(axis);\n });\n }\n\n plotWidth = surface.width - plotOffset.left - plotOffset.right;\n plotHeight = surface.height - plotOffset.bottom - plotOffset.top;\n\n // now we got the proper plot dimensions, we can compute the scaling\n $.each(axes, function(_, axis) {\n setTransformationHelpers(axis);\n });\n\n if (showGrid) {\n drawAxisLabels();\n }\n\n insertLegend();\n }\n\n function setRange(axis) {\n let opts = axis.options,\n min = +(opts.min != null ? opts.min : axis.datamin),\n max = +(opts.max != null ? opts.max : axis.datamax),\n delta = max - min;\n\n if (delta == 0.0) {\n // Grafana fix: wide Y min and max using increased wideFactor\n // when all series values are the same\n let wideFactor = 0.25;\n let widen = Math.abs(max == 0 ? 1 : max * wideFactor);\n\n if (opts.min == null) {\n min -= widen;\n }\n // always widen max if we couldn't widen min to ensure we\n // don't fall into min == max which doesn't work\n if (opts.max == null || opts.min != null) {\n max += widen;\n }\n } else {\n // consider autoscaling\n let margin = opts.autoscaleMargin;\n if (margin != null) {\n if (opts.min == null) {\n min -= delta * margin;\n // make sure we don't go below zero if all values\n // are positive\n if (min < 0 && axis.datamin != null && axis.datamin >= 0) min = 0;\n }\n if (opts.max == null) {\n max += delta * margin;\n if (max > 0 && axis.datamax != null && axis.datamax <= 0) max = 0;\n }\n }\n }\n axis.min = min;\n axis.max = max;\n }\n\n function setupTickGeneration(axis) {\n let opts = axis.options;\n\n // estimate number of ticks\n let noTicks;\n if (typeof opts.ticks == 'number' && opts.ticks > 0) noTicks = opts.ticks;\n // heuristic based on the model a*sqrt(x) fitted to\n // some data points that seemed reasonable\n else noTicks = 0.3 * Math.sqrt(axis.direction == 'x' ? surface.width : surface.height);\n\n let delta = (axis.max - axis.min) / noTicks,\n dec = -Math.floor(Math.log(delta) / Math.LN10),\n maxDec = opts.tickDecimals;\n\n if (maxDec != null && dec > maxDec) {\n dec = maxDec;\n }\n\n let magn = Math.pow(10, -dec),\n norm = delta / magn, // norm is between 1.0 and 10.0\n size;\n\n if (norm < 1.5) {\n size = 1;\n } else if (norm < 3) {\n size = 2;\n // special case for 2.5, requires an extra decimal\n if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {\n size = 2.5;\n ++dec;\n }\n } else if (norm < 7.5) {\n size = 5;\n } else {\n size = 10;\n }\n\n size *= magn;\n\n if (opts.minTickSize != null && size < opts.minTickSize) {\n size = opts.minTickSize;\n }\n\n axis.delta = delta;\n axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);\n axis.tickSize = opts.tickSize || size;\n\n // grafana addition\n if (opts.tickDecimals === null || opts.tickDecimals === undefined) {\n axis.scaledDecimals = axis.tickDecimals + dec;\n }\n\n // Time mode was moved to a plug-in in 0.8, and since so many people use it\n // we'll add an especially friendly reminder to make sure they included it.\n\n if (opts.mode == 'time' && !axis.tickGenerator) {\n throw new Error('Time mode requires the flot.time plugin.');\n }\n\n // Flot supports base-10 axes; any other mode else is handled by a plug-in,\n // like flot.time.js.\n\n if (!axis.tickGenerator) {\n axis.tickGenerator = function(axis) {\n let ticks = [],\n start = floorInBase(axis.min, axis.tickSize),\n i = 0,\n v = Number.NaN,\n prev;\n\n do {\n prev = v;\n v = start + i * axis.tickSize;\n ticks.push(v);\n ++i;\n } while (v < axis.max && v != prev);\n return ticks;\n };\n\n axis.tickFormatter = function(value, axis) {\n let factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;\n var formatted = '' + Math.round(value * factor) / factor;\n\n // If tickDecimals was specified, ensure that we have exactly that\n // much precision; otherwise default to the value's own precision.\n\n if (axis.tickDecimals != null) {\n var decimal = formatted.indexOf('.');\n let precision = decimal == -1 ? 0 : formatted.length - decimal - 1;\n if (precision < axis.tickDecimals) {\n return (precision ? formatted : formatted + '.') + ('' + factor).substr(1, axis.tickDecimals - precision);\n }\n }\n\n return formatted;\n };\n }\n\n if ($.isFunction(opts.tickFormatter))\n axis.tickFormatter = function(v, axis) {\n return '' + opts.tickFormatter(v, axis);\n };\n\n if (opts.alignTicksWithAxis != null) {\n var otherAxis = (axis.direction == 'x' ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];\n if (otherAxis && otherAxis.used && otherAxis != axis) {\n // consider snapping min/max to outermost nice ticks\n let niceTicks = axis.tickGenerator(axis);\n if (niceTicks.length > 0) {\n if (opts.min == null) axis.min = Math.min(axis.min, niceTicks[0]);\n if (opts.max == null && niceTicks.length > 1) axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);\n }\n\n axis.tickGenerator = function(axis) {\n // copy ticks, scaled to this axis\n var ticks = [],\n v,\n i;\n for (i = 0; i < otherAxis.ticks.length; ++i) {\n v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);\n v = axis.min + v * (axis.max - axis.min);\n ticks.push(v);\n }\n return ticks;\n };\n\n // we might need an extra decimal since forced\n // ticks don't necessarily fit naturally\n if (!axis.mode && opts.tickDecimals == null) {\n let extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),\n ts = axis.tickGenerator(axis);\n\n // only proceed if the tick interval rounded\n // with an extra decimal doesn't give us a\n // zero at end\n if (!(ts.length > 1 && /\\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) axis.tickDecimals = extraDec;\n }\n }\n }\n }\n\n function setTicks(axis) {\n var oticks = axis.options.ticks,\n ticks = [];\n if (oticks == null || (typeof oticks == 'number' && oticks > 0)) ticks = axis.tickGenerator(axis);\n else if (oticks) {\n if ($.isFunction(oticks))\n // generate the ticks\n ticks = oticks(axis);\n else ticks = oticks;\n }\n\n // clean up/labelify the supplied ticks, copy them over\n let i, v;\n axis.ticks = [];\n for (i = 0; i < ticks.length; ++i) {\n let label = null;\n let t = ticks[i];\n if (typeof t == 'object') {\n v = +t[0];\n if (t.length > 1) label = t[1];\n } else v = +t;\n if (label == null) label = axis.tickFormatter(v, axis);\n if (!isNaN(v)) axis.ticks.push({ v: v, label: label });\n }\n }\n\n function snapRangeToTicks(axis, ticks) {\n let changed = false;\n if (axis.options.autoscaleMargin && ticks.length > 0) {\n // snap to ticks\n if (axis.options.min == null) {\n axis.min = Math.min(axis.min, ticks[0].v);\n changed = true;\n }\n if (axis.options.max == null && ticks.length > 1) {\n axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);\n changed = true;\n }\n }\n return changed;\n }\n\n function draw() {\n surface.clear();\n\n executeHooks(hooks.drawBackground, [ctx]);\n\n let grid = options.grid;\n\n // draw background, if any\n if (grid.show && grid.backgroundColor) drawBackground();\n\n if (grid.show && !grid.aboveData) {\n drawGrid();\n }\n\n for (let i = 0; i < series.length; ++i) {\n executeHooks(hooks.drawSeries, [ctx, series[i]]);\n drawSeries(series[i]);\n }\n\n executeHooks(hooks.draw, [ctx]);\n\n if (grid.show && grid.aboveData) {\n drawGrid();\n }\n\n surface.render();\n\n // A draw implies that either the axes or data have changed, so we\n // should probably update the overlay highlights as well.\n\n triggerRedrawOverlay();\n }\n\n function extractRange(ranges, coord) {\n var axis,\n from,\n to,\n key,\n axes = allAxes();\n\n for (let i = 0; i < axes.length; ++i) {\n axis = axes[i];\n if (axis.direction == coord) {\n key = coord + axis.n + 'axis';\n if (!ranges[key] && axis.n == 1) key = coord + 'axis'; // support x1axis as xaxis\n if (ranges[key]) {\n from = ranges[key].from;\n to = ranges[key].to;\n break;\n }\n }\n }\n\n // backwards-compat stuff - to be removed in future\n if (!ranges[key]) {\n axis = coord == 'x' ? xaxes[0] : yaxes[0];\n from = ranges[coord + '1'];\n to = ranges[coord + '2'];\n }\n\n // auto-reverse as an added bonus\n if (from != null && to != null && from > to) {\n let tmp = from;\n from = to;\n to = tmp;\n }\n\n return { from: from, to: to, axis: axis };\n }\n\n function drawBackground() {\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n\n ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, 'rgba(255, 255, 255, 0)');\n ctx.fillRect(0, 0, plotWidth, plotHeight);\n ctx.restore();\n }\n\n function drawGrid() {\n let i, axes, bw, bc;\n\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n\n // draw markings\n let markings = options.grid.markings;\n if (markings) {\n if ($.isFunction(markings)) {\n axes = plot.getAxes();\n // xmin etc. is backwards compatibility, to be\n // removed in the future\n axes.xmin = axes.xaxis.min;\n axes.xmax = axes.xaxis.max;\n axes.ymin = axes.yaxis.min;\n axes.ymax = axes.yaxis.max;\n\n markings = markings(axes);\n }\n\n for (i = 0; i < markings.length; ++i) {\n let m = markings[i],\n xrange = extractRange(m, 'x'),\n yrange = extractRange(m, 'y');\n\n // fill in missing\n if (xrange.from == null) xrange.from = xrange.axis.min;\n if (xrange.to == null) xrange.to = xrange.axis.max;\n if (yrange.from == null) yrange.from = yrange.axis.min;\n if (yrange.to == null) yrange.to = yrange.axis.max;\n\n // clip\n if (\n xrange.to < xrange.axis.min ||\n xrange.from > xrange.axis.max ||\n yrange.to < yrange.axis.min ||\n yrange.from > yrange.axis.max\n )\n continue;\n\n xrange.from = Math.max(xrange.from, xrange.axis.min);\n xrange.to = Math.min(xrange.to, xrange.axis.max);\n yrange.from = Math.max(yrange.from, yrange.axis.min);\n yrange.to = Math.min(yrange.to, yrange.axis.max);\n\n let xequal = xrange.from === xrange.to,\n yequal = yrange.from === yrange.to;\n\n if (xequal && yequal) {\n continue;\n }\n\n // then draw\n xrange.from = Math.floor(xrange.axis.p2c(xrange.from));\n xrange.to = Math.floor(xrange.axis.p2c(xrange.to));\n yrange.from = Math.floor(yrange.axis.p2c(yrange.from));\n yrange.to = Math.floor(yrange.axis.p2c(yrange.to));\n\n if (xequal || yequal) {\n let lineWidth = m.lineWidth || options.grid.markingsLineWidth,\n subPixel = lineWidth % 2 ? 0.5 : 0;\n ctx.beginPath();\n ctx.strokeStyle = m.color || options.grid.markingsColor;\n ctx.lineWidth = lineWidth;\n if (xequal) {\n ctx.moveTo(xrange.to + subPixel, yrange.from);\n ctx.lineTo(xrange.to + subPixel, yrange.to);\n } else {\n ctx.moveTo(xrange.from, yrange.to + subPixel);\n ctx.lineTo(xrange.to, yrange.to + subPixel);\n }\n ctx.stroke();\n } else {\n ctx.fillStyle = m.color || options.grid.markingsColor;\n ctx.fillRect(xrange.from, yrange.to, xrange.to - xrange.from, yrange.from - yrange.to);\n }\n }\n }\n\n // draw the ticks\n axes = allAxes();\n bw = options.grid.borderWidth;\n\n for (let j = 0; j < axes.length; ++j) {\n var axis = axes[j],\n box = axis.box,\n t = axis.tickLength,\n x,\n y,\n xoff,\n yoff;\n if (!axis.show || axis.ticks.length == 0) continue;\n\n ctx.lineWidth = 1;\n\n // find the edges\n if (axis.direction == 'x') {\n x = 0;\n if (t == 'full') y = axis.position == 'top' ? 0 : plotHeight;\n else y = box.top - plotOffset.top + (axis.position == 'top' ? box.height : 0);\n } else {\n y = 0;\n if (t == 'full') x = axis.position == 'left' ? 0 : plotWidth;\n else x = box.left - plotOffset.left + (axis.position == 'left' ? box.width : 0);\n }\n\n // draw tick bar\n if (!axis.innermost) {\n ctx.strokeStyle = axis.options.color;\n ctx.beginPath();\n xoff = yoff = 0;\n if (axis.direction == 'x') xoff = plotWidth + 1;\n else yoff = plotHeight + 1;\n\n if (ctx.lineWidth == 1) {\n if (axis.direction == 'x') {\n y = Math.floor(y) + 0.5;\n } else {\n x = Math.floor(x) + 0.5;\n }\n }\n\n ctx.moveTo(x, y);\n ctx.lineTo(x + xoff, y + yoff);\n ctx.stroke();\n }\n\n // draw ticks\n\n ctx.strokeStyle = axis.options.tickColor;\n\n ctx.beginPath();\n for (i = 0; i < axis.ticks.length; ++i) {\n let v = axis.ticks[i].v;\n\n xoff = yoff = 0;\n\n if (\n isNaN(v) ||\n v < axis.min ||\n v > axis.max ||\n // skip those lying on the axes if we got a border\n (t == 'full' && ((typeof bw == 'object' && bw[axis.position] > 0) || bw > 0) && (v == axis.min || v == axis.max))\n )\n continue;\n\n if (axis.direction == 'x') {\n x = axis.p2c(v);\n yoff = t == 'full' ? -plotHeight : t;\n\n if (axis.position == 'top') yoff = -yoff;\n } else {\n y = axis.p2c(v);\n xoff = t == 'full' ? -plotWidth : t;\n\n if (axis.position == 'left') xoff = -xoff;\n }\n\n if (ctx.lineWidth == 1) {\n if (axis.direction == 'x') x = Math.floor(x) + 0.5;\n else y = Math.floor(y) + 0.5;\n }\n\n ctx.moveTo(x, y);\n ctx.lineTo(x + xoff, y + yoff);\n }\n\n ctx.stroke();\n }\n\n // draw border\n if (bw) {\n // If either borderWidth or borderColor is an object, then draw the border\n // line by line instead of as one rectangle\n bc = options.grid.borderColor;\n if (typeof bw == 'object' || typeof bc == 'object') {\n if (typeof bw !== 'object') {\n bw = { top: bw, right: bw, bottom: bw, left: bw };\n }\n if (typeof bc !== 'object') {\n bc = { top: bc, right: bc, bottom: bc, left: bc };\n }\n\n if (bw.top > 0) {\n ctx.strokeStyle = bc.top;\n ctx.lineWidth = bw.top;\n ctx.beginPath();\n ctx.moveTo(0 - bw.left, 0 - bw.top / 2);\n ctx.lineTo(plotWidth, 0 - bw.top / 2);\n ctx.stroke();\n }\n\n if (bw.right > 0) {\n ctx.strokeStyle = bc.right;\n ctx.lineWidth = bw.right;\n ctx.beginPath();\n ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);\n ctx.lineTo(plotWidth + bw.right / 2, plotHeight);\n ctx.stroke();\n }\n\n if (bw.bottom > 0) {\n ctx.strokeStyle = bc.bottom;\n ctx.lineWidth = bw.bottom;\n ctx.beginPath();\n ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);\n ctx.lineTo(0, plotHeight + bw.bottom / 2);\n ctx.stroke();\n }\n\n if (bw.left > 0) {\n ctx.strokeStyle = bc.left;\n ctx.lineWidth = bw.left;\n ctx.beginPath();\n ctx.moveTo(0 - bw.left / 2, plotHeight + bw.bottom);\n ctx.lineTo(0 - bw.left / 2, 0);\n ctx.stroke();\n }\n } else {\n ctx.lineWidth = bw;\n ctx.strokeStyle = options.grid.borderColor;\n ctx.strokeRect(-bw / 2, -bw / 2, plotWidth + bw, plotHeight + bw);\n }\n }\n\n ctx.restore();\n }\n\n function drawAxisLabels() {\n $.each(allAxes(), function(_, axis) {\n let box = axis.box,\n legacyStyles = axis.direction + 'Axis ' + axis.direction + axis.n + 'Axis',\n layer = 'flot-' + axis.direction + '-axis flot-' + axis.direction + axis.n + '-axis ' + legacyStyles,\n font = axis.options.font || 'flot-tick-label tickLabel',\n tick,\n x,\n y,\n halign,\n valign;\n\n // Remove text before checking for axis.show and ticks.length;\n // otherwise plugins, like flot-tickrotor, that draw their own\n // tick labels will end up with both theirs and the defaults.\n\n surface.removeText(layer);\n\n if (!axis.show || axis.ticks.length == 0) return;\n\n for (let i = 0; i < axis.ticks.length; ++i) {\n tick = axis.ticks[i];\n if (!tick.label || tick.v < axis.min || tick.v > axis.max) continue;\n\n if (axis.direction == 'x') {\n halign = 'center';\n x = plotOffset.left + axis.p2c(tick.v);\n if (axis.position == 'bottom') {\n y = box.top + box.padding + box.eventSectionPadding;\n } else {\n y = box.top + box.height - box.padding;\n valign = 'bottom';\n }\n } else {\n valign = 'middle';\n y = plotOffset.top + axis.p2c(tick.v);\n if (axis.position == 'left') {\n x = box.left + box.width - box.padding;\n halign = 'right';\n } else {\n x = box.left + box.padding;\n }\n }\n\n surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);\n }\n });\n }\n\n function drawOrphanedPoints(series) {\n /* Filters series data for points with no neighbors before or after\n * and plots single 0.5 radius points for them so that they are displayed.\n */\n let abandonedPoints = [];\n let beforeX = null;\n let afterX = null;\n let datapoints = series.datapoints;\n // find any points with no neighbors before or after\n let emptyPoints = [];\n for (let j = 0; j < datapoints.pointsize - 2; j++) {\n emptyPoints.push(0);\n }\n for (let i = 0; i < datapoints.points.length; i += datapoints.pointsize) {\n var x = datapoints.points[i],\n y = datapoints.points[i + 1];\n if (i === datapoints.points.length - datapoints.pointsize) {\n afterX = null;\n } else {\n afterX = datapoints.points[i + datapoints.pointsize];\n }\n if (x !== null && y !== null && beforeX === null && afterX === null) {\n abandonedPoints.push(x);\n abandonedPoints.push(y);\n abandonedPoints.push.apply(abandonedPoints, emptyPoints);\n }\n beforeX = x;\n }\n var olddatapoints = datapoints.points;\n datapoints.points = abandonedPoints;\n\n series.points.radius = series.lines.lineWidth / 2;\n // plot the orphan points with a radius of lineWidth/2\n drawSeriesPoints(series);\n // reset old info\n datapoints.points = olddatapoints;\n }\n\n function drawSeries(series) {\n if (series.lines.show) {\n drawSeriesLines(series);\n if (!series.points.show && !series.bars.show) {\n // not necessary if user wants points displayed for everything\n drawOrphanedPoints(series);\n }\n }\n if (series.bars.show) drawSeriesBars(series);\n if (series.points.show) drawSeriesPoints(series);\n }\n\n function drawSeriesLines(series) {\n function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {\n let points = datapoints.points,\n ps = datapoints.pointsize,\n prevx = null,\n prevy = null;\n\n ctx.beginPath();\n for (let i = ps; i < points.length; i += ps) {\n var x1 = points[i - ps],\n y1 = points[i - ps + 1],\n x2 = points[i],\n y2 = points[i + 1];\n\n if (x1 == null || x2 == null) continue;\n\n // clip with ymin\n if (y1 <= y2 && y1 < axisy.min) {\n if (y2 < axisy.min) continue; // line segment is outside\n // compute new intersection point\n x1 = ((axisy.min - y1) / (y2 - y1)) * (x2 - x1) + x1;\n y1 = axisy.min;\n } else if (y2 <= y1 && y2 < axisy.min) {\n if (y1 < axisy.min) continue;\n x2 = ((axisy.min - y1) / (y2 - y1)) * (x2 - x1) + x1;\n y2 = axisy.min;\n }\n\n // clip with ymax\n if (y1 >= y2 && y1 > axisy.max) {\n if (y2 > axisy.max) continue;\n x1 = ((axisy.max - y1) / (y2 - y1)) * (x2 - x1) + x1;\n y1 = axisy.max;\n } else if (y2 >= y1 && y2 > axisy.max) {\n if (y1 > axisy.max) continue;\n x2 = ((axisy.max - y1) / (y2 - y1)) * (x2 - x1) + x1;\n y2 = axisy.max;\n }\n\n // clip with xmin\n if (x1 <= x2 && x1 < axisx.min) {\n if (x2 < axisx.min) continue;\n y1 = ((axisx.min - x1) / (x2 - x1)) * (y2 - y1) + y1;\n x1 = axisx.min;\n } else if (x2 <= x1 && x2 < axisx.min) {\n if (x1 < axisx.min) continue;\n y2 = ((axisx.min - x1) / (x2 - x1)) * (y2 - y1) + y1;\n x2 = axisx.min;\n }\n\n // clip with xmax\n if (x1 >= x2 && x1 > axisx.max) {\n if (x2 > axisx.max) continue;\n y1 = ((axisx.max - x1) / (x2 - x1)) * (y2 - y1) + y1;\n x1 = axisx.max;\n } else if (x2 >= x1 && x2 > axisx.max) {\n if (x1 > axisx.max) continue;\n y2 = ((axisx.max - x1) / (x2 - x1)) * (y2 - y1) + y1;\n x2 = axisx.max;\n }\n\n if (x1 != prevx || y1 != prevy) ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);\n\n prevx = x2;\n prevy = y2;\n ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);\n }\n ctx.stroke();\n }\n\n function plotLineArea(datapoints, axisx, axisy) {\n let points = datapoints.points,\n ps = datapoints.pointsize,\n bottom = Math.min(Math.max(0, axisy.min), axisy.max),\n i = 0,\n areaOpen = false,\n ypos = 1,\n segmentStart = 0,\n segmentEnd = 0;\n\n // we process each segment in two turns, first forward\n // direction to sketch out top, then once we hit the\n // end we go backwards to sketch the bottom\n while (true) {\n if (ps > 0 && i > points.length + ps) break;\n\n i += ps; // ps is negative if going backwards\n\n let x1 = points[i - ps],\n y1 = points[i - ps + ypos],\n x2 = points[i],\n y2 = points[i + ypos];\n\n if (areaOpen) {\n if (ps > 0 && x1 != null && x2 == null) {\n // at turning point\n segmentEnd = i;\n ps = -ps;\n ypos = 2;\n continue;\n }\n\n if (ps < 0 && i == segmentStart + ps) {\n // done with the reverse sweep\n ctx.fill();\n areaOpen = false;\n ps = -ps;\n ypos = 1;\n i = segmentStart = segmentEnd + ps;\n continue;\n }\n }\n\n if (x1 == null || x2 == null) continue;\n\n // clip x values\n\n // clip with xmin\n if (x1 <= x2 && x1 < axisx.min) {\n if (x2 < axisx.min) continue;\n y1 = ((axisx.min - x1) / (x2 - x1)) * (y2 - y1) + y1;\n x1 = axisx.min;\n } else if (x2 <= x1 && x2 < axisx.min) {\n if (x1 < axisx.min) continue;\n y2 = ((axisx.min - x1) / (x2 - x1)) * (y2 - y1) + y1;\n x2 = axisx.min;\n }\n\n // clip with xmax\n if (x1 >= x2 && x1 > axisx.max) {\n if (x2 > axisx.max) continue;\n y1 = ((axisx.max - x1) / (x2 - x1)) * (y2 - y1) + y1;\n x1 = axisx.max;\n } else if (x2 >= x1 && x2 > axisx.max) {\n if (x1 > axisx.max) continue;\n y2 = ((axisx.max - x1) / (x2 - x1)) * (y2 - y1) + y1;\n x2 = axisx.max;\n }\n\n if (!areaOpen) {\n // open area\n ctx.beginPath();\n ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));\n areaOpen = true;\n }\n\n // now first check the case where both is outside\n if (y1 >= axisy.max && y2 >= axisy.max) {\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));\n continue;\n } else if (y1 <= axisy.min && y2 <= axisy.min) {\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));\n continue;\n }\n\n // else it's a bit more complicated, there might\n // be a flat maxed out rectangle first, then a\n // triangular cutout or reverse; to find these\n // keep track of the current x values\n var x1old = x1,\n x2old = x2;\n\n // clip the y values, without shortcutting, we\n // go through all cases in turn\n\n // clip with ymin\n if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {\n x1 = ((axisy.min - y1) / (y2 - y1)) * (x2 - x1) + x1;\n y1 = axisy.min;\n } else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {\n x2 = ((axisy.min - y1) / (y2 - y1)) * (x2 - x1) + x1;\n y2 = axisy.min;\n }\n\n // clip with ymax\n if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {\n x1 = ((axisy.max - y1) / (y2 - y1)) * (x2 - x1) + x1;\n y1 = axisy.max;\n } else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {\n x2 = ((axisy.max - y1) / (y2 - y1)) * (x2 - x1) + x1;\n y2 = axisy.max;\n }\n\n // if the x value was changed we got a rectangle\n // to fill\n if (x1 != x1old) {\n ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));\n // it goes to (x1, y1), but we fill that below\n }\n\n // fill triangular section, this sometimes result\n // in redundant points if (x1, y1) hasn't changed\n // from previous line to, but we just ignore that\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\n\n // fill the other rectangle if it's there\n if (x2 != x2old) {\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\n ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));\n }\n }\n }\n\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n ctx.lineJoin = 'round';\n\n let lw = series.lines.lineWidth,\n sw = series.shadowSize;\n // FIXME: consider another form of shadow when filling is turned on\n if (lw > 0 && sw > 0) {\n // draw shadow as a thick and thin line with transparency\n ctx.lineWidth = sw;\n ctx.strokeStyle = 'rgba(0,0,0,0.1)';\n // position shadow at angle from the mid of line\n var angle = Math.PI / 18;\n plotLine(\n series.datapoints,\n Math.sin(angle) * (lw / 2 + sw / 2),\n Math.cos(angle) * (lw / 2 + sw / 2),\n series.xaxis,\n series.yaxis\n );\n ctx.lineWidth = sw / 2;\n plotLine(\n series.datapoints,\n Math.sin(angle) * (lw / 2 + sw / 4),\n Math.cos(angle) * (lw / 2 + sw / 4),\n series.xaxis,\n series.yaxis\n );\n }\n\n ctx.lineWidth = lw;\n ctx.strokeStyle = series.color;\n let fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);\n if (fillStyle) {\n ctx.fillStyle = fillStyle;\n plotLineArea(series.datapoints, series.xaxis, series.yaxis);\n }\n\n if (lw > 0) plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);\n ctx.restore();\n }\n\n function drawSeriesPoints(series) {\n function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {\n var points = datapoints.points,\n ps = datapoints.pointsize;\n\n for (let i = 0; i < points.length; i += ps) {\n var x = points[i],\n y = points[i + 1];\n if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) continue;\n\n ctx.beginPath();\n x = axisx.p2c(x);\n y = axisy.p2c(y) + offset;\n if (symbol == 'circle') ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);\n else symbol(ctx, x, y, radius, shadow);\n ctx.closePath();\n\n if (fillStyle) {\n ctx.fillStyle = fillStyle;\n ctx.fill();\n }\n ctx.stroke();\n }\n }\n\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n\n let lw = series.points.lineWidth,\n sw = series.shadowSize,\n radius = series.points.radius,\n symbol = series.points.symbol;\n\n // If the user sets the line width to 0, we change it to a very\n // small value. A line width of 0 seems to force the default of 1.\n // Doing the conditional here allows the shadow setting to still be\n // optional even with a lineWidth of 0.\n\n if (lw == 0) lw = 0.0001;\n\n if (lw > 0 && sw > 0) {\n // draw shadow in two steps\n let w = sw / 2;\n ctx.lineWidth = w;\n ctx.strokeStyle = 'rgba(0,0,0,0.1)';\n plotPoints(series.datapoints, radius, null, w + w / 2, true, series.xaxis, series.yaxis, symbol);\n\n ctx.strokeStyle = 'rgba(0,0,0,0.2)';\n plotPoints(series.datapoints, radius, null, w / 2, true, series.xaxis, series.yaxis, symbol);\n }\n\n ctx.lineWidth = lw;\n ctx.strokeStyle = series.color;\n plotPoints(\n series.datapoints,\n radius,\n getFillStyle(series.points, series.color),\n 0,\n false,\n series.xaxis,\n series.yaxis,\n symbol\n );\n ctx.restore();\n }\n\n function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {\n var left, right, bottom, top, drawLeft, drawRight, drawTop, drawBottom, tmp;\n\n // in horizontal mode, we start the bar from the left\n // instead of from the bottom so it appears to be\n // horizontal rather than vertical\n if (horizontal) {\n drawBottom = drawRight = drawTop = true;\n drawLeft = false;\n left = b;\n right = x;\n top = y + barLeft;\n bottom = y + barRight;\n\n // account for negative bars\n if (right < left) {\n tmp = right;\n right = left;\n left = tmp;\n drawLeft = true;\n drawRight = false;\n }\n } else {\n drawLeft = drawRight = drawTop = true;\n drawBottom = false;\n left = x + barLeft;\n right = x + barRight;\n bottom = b;\n top = y;\n\n // account for negative bars\n if (top < bottom) {\n tmp = top;\n top = bottom;\n bottom = tmp;\n drawBottom = true;\n drawTop = false;\n }\n }\n\n // clip\n if (right < axisx.min || left > axisx.max || top < axisy.min || bottom > axisy.max) return;\n\n if (left < axisx.min) {\n left = axisx.min;\n drawLeft = false;\n }\n\n if (right > axisx.max) {\n right = axisx.max;\n drawRight = false;\n }\n\n if (bottom < axisy.min) {\n bottom = axisy.min;\n drawBottom = false;\n }\n\n if (top > axisy.max) {\n top = axisy.max;\n drawTop = false;\n }\n\n left = axisx.p2c(left);\n bottom = axisy.p2c(bottom);\n right = axisx.p2c(right);\n top = axisy.p2c(top);\n\n // fill the bar\n if (fillStyleCallback) {\n c.fillStyle = fillStyleCallback(bottom, top);\n c.fillRect(left, top, right - left, bottom - top);\n }\n\n // draw outline\n if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {\n c.beginPath();\n\n // FIXME: inline moveTo is buggy with excanvas\n c.moveTo(left, bottom);\n if (drawLeft) c.lineTo(left, top);\n else c.moveTo(left, top);\n if (drawTop) c.lineTo(right, top);\n else c.moveTo(right, top);\n if (drawRight) c.lineTo(right, bottom);\n else c.moveTo(right, bottom);\n if (drawBottom) c.lineTo(left, bottom);\n else c.moveTo(left, bottom);\n c.stroke();\n }\n }\n\n function drawSeriesBars(series) {\n function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {\n var points = datapoints.points,\n ps = datapoints.pointsize;\n\n for (let i = 0; i < points.length; i += ps) {\n if (points[i] == null) continue;\n drawBar(\n points[i],\n points[i + 1],\n points[i + 2],\n barLeft,\n barRight,\n fillStyleCallback,\n axisx,\n axisy,\n ctx,\n series.bars.horizontal,\n series.bars.lineWidth\n );\n }\n }\n\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n\n // FIXME: figure out a way to add shadows (for instance along the right edge)\n ctx.lineWidth = series.bars.lineWidth;\n ctx.strokeStyle = series.color;\n\n let barLeft;\n\n switch (series.bars.align) {\n case 'left':\n barLeft = 0;\n break;\n case 'right':\n barLeft = -series.bars.barWidth;\n break;\n default:\n barLeft = -series.bars.barWidth / 2;\n }\n\n var fillStyleCallback = series.bars.fill\n ? function(bottom, top) {\n return getFillStyle(series.bars, series.color, bottom, top);\n }\n : null;\n plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);\n ctx.restore();\n }\n\n function getFillStyle(filloptions, seriesColor, bottom, top) {\n let fill = filloptions.fill;\n if (!fill) return null;\n\n if (filloptions.fillColor) return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);\n\n let c = $.color.parse(seriesColor);\n c.a = typeof fill == 'number' ? fill : 0.4;\n c.normalize();\n return c.toString();\n }\n\n function insertLegend() {\n if (options.legend.container != null) {\n $(options.legend.container).html('');\n } else {\n placeholder.find('.legend').remove();\n }\n\n if (!options.legend.show) {\n return;\n }\n\n var fragments = [],\n entries = [],\n rowStarted = false,\n lf = options.legend.labelFormatter,\n s,\n label;\n\n // Build a list of legend entries, with each having a label and a color\n\n for (var i = 0; i < series.length; ++i) {\n s = series[i];\n if (s.label) {\n label = lf ? lf(s.label, s) : s.label;\n if (label) {\n entries.push({\n label: label,\n color: s.color,\n });\n }\n }\n }\n\n // Sort the legend using either the default or a custom comparator\n\n if (options.legend.sorted) {\n if ($.isFunction(options.legend.sorted)) {\n entries.sort(options.legend.sorted);\n } else if (options.legend.sorted == 'reverse') {\n entries.reverse();\n } else {\n var ascending = options.legend.sorted != 'descending';\n entries.sort(function(a, b) {\n // eslint-disable-next-line\n return a.label == b.label ? 0 : a.label < b.label != ascending ? 1 : -1; // Logical XOR\n });\n }\n }\n\n // Generate markup for the list of entries, in their final order\n\n for (var i = 0; i < entries.length; ++i) {\n let entry = entries[i];\n\n if (i % options.legend.noColumns == 0) {\n if (rowStarted) fragments.push('');\n fragments.push('');\n rowStarted = true;\n }\n\n fragments.push(\n '
' +\n '' +\n entry.label +\n ''\n );\n }\n\n if (rowStarted) fragments.push('');\n\n if (fragments.length == 0) return;\n\n var table = '' + fragments.join('') + '
';\n if (options.legend.container != null) $(options.legend.container).html(table);\n else {\n var pos = '',\n p = options.legend.position,\n m = options.legend.margin;\n if (m[0] == null) m = [m, m];\n if (p.charAt(0) == 'n') pos += 'top:' + (m[1] + plotOffset.top) + 'px;';\n else if (p.charAt(0) == 's') pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';\n if (p.charAt(1) == 'e') pos += 'right:' + (m[0] + plotOffset.right) + 'px;';\n else if (p.charAt(1) == 'w') pos += 'left:' + (m[0] + plotOffset.left) + 'px;';\n var legend = $(\n '
' + table.replace('style=\"', 'style=\"position:absolute;' + pos + ';') + '
'\n ).appendTo(placeholder);\n if (options.legend.backgroundOpacity != 0.0) {\n // put in the transparent background\n // separately to avoid blended labels and\n // label boxes\n let c = options.legend.backgroundColor;\n if (c == null) {\n c = options.grid.backgroundColor;\n if (c && typeof c == 'string') c = $.color.parse(c);\n else c = $.color.extract(legend, 'background-color');\n c.a = 1;\n c = c.toString();\n }\n let div = legend.children();\n $(\n '
'\n )\n .prependTo(legend)\n .css('opacity', options.legend.backgroundOpacity);\n }\n }\n }\n\n // interactive features\n\n var highlights = [],\n redrawTimeout = null;\n\n // returns the data item the mouse is over, or null if none is found\n function findNearbyItem(mouseX, mouseY, seriesFilter) {\n let maxDistance = options.grid.mouseActiveRadius,\n smallestDistance = maxDistance * maxDistance + 1,\n item = null,\n i,\n j,\n ps;\n\n for (i = series.length - 1; i >= 0; --i) {\n if (!seriesFilter(series[i])) continue;\n\n let s = series[i],\n axisx = s.xaxis,\n axisy = s.yaxis,\n points = s.datapoints.points,\n mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster\n my = axisy.c2p(mouseY),\n maxx = maxDistance / axisx.scale,\n maxy = maxDistance / axisy.scale;\n\n ps = s.datapoints.pointsize;\n // with inverse transforms, we can't use the maxx/maxy\n // optimization, sadly\n if (axisx.options.inverseTransform) maxx = Number.MAX_VALUE;\n if (axisy.options.inverseTransform) maxy = Number.MAX_VALUE;\n\n if (s.lines.show || s.points.show) {\n for (j = 0; j < points.length; j += ps) {\n var x = points[j],\n y = points[j + 1];\n if (x == null) continue;\n\n // For points and lines, the cursor must be within a\n // certain distance to the data point\n if (x - mx > maxx || x - mx < -maxx || y - my > maxy || y - my < -maxy) continue;\n\n // We have to calculate distances in pixels, not in\n // data units, because the scales of the axes may be different\n let dx = Math.abs(axisx.p2c(x) - mouseX),\n dy = Math.abs(axisy.p2c(y) - mouseY),\n dist = dx * dx + dy * dy; // we save the sqrt\n\n // use <= to ensure last point takes precedence\n // (last generally means on top of)\n if (dist < smallestDistance) {\n smallestDistance = dist;\n item = [i, j / ps];\n }\n }\n }\n\n if (s.bars.show && !item) {\n // no other point can be nearby\n\n var barLeft, barRight;\n\n switch (s.bars.align) {\n case 'left':\n barLeft = 0;\n break;\n case 'right':\n barLeft = -s.bars.barWidth;\n break;\n default:\n barLeft = -s.bars.barWidth / 2;\n }\n\n barRight = barLeft + s.bars.barWidth;\n\n for (j = 0; j < points.length; j += ps) {\n var x = points[j],\n y = points[j + 1],\n b = points[j + 2];\n if (x == null) continue;\n\n // for a bar graph, the cursor must be inside the bar\n if (\n series[i].bars.horizontal\n ? mx <= Math.max(b, x) && mx >= Math.min(b, x) && my >= y + barLeft && my <= y + barRight\n : mx >= x + barLeft && mx <= x + barRight && my >= Math.min(b, y) && my <= Math.max(b, y)\n )\n item = [i, j / ps];\n }\n }\n }\n\n if (item) {\n i = item[0];\n j = item[1];\n ps = series[i].datapoints.pointsize;\n\n return {\n datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),\n dataIndex: j,\n series: series[i],\n seriesIndex: i,\n };\n }\n\n return null;\n }\n\n function onMouseMove(e) {\n if (options.grid.hoverable)\n triggerClickHoverEvent('plothover', e, function(s) {\n return s['hoverable'] != false;\n });\n }\n\n function onMouseLeave(e) {\n if (options.grid.hoverable)\n triggerClickHoverEvent('plothover', e, function() {\n return false;\n });\n }\n\n function onClick(e) {\n if (plot.isSelecting) {\n return;\n }\n\n triggerClickHoverEvent('plotclick', e, function(s) {\n return s['clickable'] != false;\n });\n }\n\n // trigger click or hover event (they send the same parameters\n // so we share their code)\n function triggerClickHoverEvent(eventname, event, seriesFilter) {\n let offset = eventHolder.offset(),\n canvasX = event.pageX - offset.left - plotOffset.left,\n canvasY = event.pageY - offset.top - plotOffset.top,\n pos = canvasToAxisCoords({ left: canvasX, top: canvasY });\n\n pos.pageX = event.pageX;\n pos.pageY = event.pageY;\n\n // Add ctrlKey and metaKey to event\n pos.ctrlKey = event.ctrlKey;\n pos.metaKey = event.metaKey;\n\n let item = findNearbyItem(canvasX, canvasY, seriesFilter);\n\n if (item) {\n // fill in mouse pos for any listeners out there\n item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10);\n item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10);\n }\n\n if (options.grid.autoHighlight) {\n // clear auto-highlights\n for (let i = 0; i < highlights.length; ++i) {\n let h = highlights[i];\n if (\n h.auto == eventname &&\n !(item && h.series == item.series && h.point[0] == item.datapoint[0] && h.point[1] == item.datapoint[1])\n )\n unhighlight(h.series, h.point);\n }\n\n if (item) highlight(item.series, item.datapoint, eventname);\n }\n\n placeholder.trigger(eventname, [pos, item]);\n }\n\n function triggerRedrawOverlay() {\n let t = options.interaction.redrawOverlayInterval;\n if (t == -1) {\n // skip event queue\n drawOverlay();\n return;\n }\n\n if (!redrawTimeout) redrawTimeout = setTimeout(drawOverlay, t);\n }\n\n function drawOverlay() {\n redrawTimeout = null;\n\n // draw highlights\n octx.save();\n overlay.clear();\n octx.translate(plotOffset.left, plotOffset.top);\n\n let i, hi;\n for (i = 0; i < highlights.length; ++i) {\n hi = highlights[i];\n\n if (hi.series.bars.show) drawBarHighlight(hi.series, hi.point);\n else drawPointHighlight(hi.series, hi.point);\n }\n octx.restore();\n\n executeHooks(hooks.drawOverlay, [octx]);\n }\n\n function highlight(s, point, auto) {\n if (typeof s == 'number') s = series[s];\n\n if (typeof point == 'number') {\n let ps = s.datapoints.pointsize;\n point = s.datapoints.points.slice(ps * point, ps * (point + 1));\n }\n\n let i = indexOfHighlight(s, point);\n if (i == -1) {\n highlights.push({ series: s, point: point, auto: auto });\n\n triggerRedrawOverlay();\n } else if (!auto) highlights[i].auto = false;\n }\n\n function unhighlight(s, point) {\n if (s == null && point == null) {\n highlights = [];\n triggerRedrawOverlay();\n return;\n }\n\n if (typeof s == 'number') s = series[s];\n\n if (typeof point == 'number') {\n let ps = s.datapoints.pointsize;\n point = s.datapoints.points.slice(ps * point, ps * (point + 1));\n }\n\n let i = indexOfHighlight(s, point);\n if (i != -1) {\n highlights.splice(i, 1);\n\n triggerRedrawOverlay();\n }\n }\n\n function indexOfHighlight(s, p) {\n for (let i = 0; i < highlights.length; ++i) {\n let h = highlights[i];\n if (h.series == s && h.point[0] == p[0] && h.point[1] == p[1]) return i;\n }\n return -1;\n }\n\n function drawPointHighlight(series, point) {\n var x = point[0],\n y = point[1],\n axisx = series.xaxis,\n axisy = series.yaxis,\n highlightColor =\n typeof series.highlightColor === 'string'\n ? series.highlightColor\n : $.color\n .parse(series.color)\n .scale('a', 0.5)\n .toString();\n\n if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) return;\n\n let pointRadius = series.points.radius + series.points.lineWidth / 2;\n octx.lineWidth = pointRadius;\n octx.strokeStyle = highlightColor;\n let radius = 1.5 * pointRadius;\n x = axisx.p2c(x);\n y = axisy.p2c(y);\n\n octx.beginPath();\n if (series.points.symbol == 'circle') octx.arc(x, y, radius, 0, 2 * Math.PI, false);\n else series.points.symbol(octx, x, y, radius, false);\n octx.closePath();\n octx.stroke();\n }\n\n function drawBarHighlight(series, point) {\n var highlightColor =\n typeof series.highlightColor === 'string'\n ? series.highlightColor\n : $.color\n .parse(series.color)\n .scale('a', 0.5)\n .toString(),\n fillStyle = highlightColor,\n barLeft;\n\n switch (series.bars.align) {\n case 'left':\n barLeft = 0;\n break;\n case 'right':\n barLeft = -series.bars.barWidth;\n break;\n default:\n barLeft = -series.bars.barWidth / 2;\n }\n\n octx.lineWidth = series.bars.lineWidth;\n octx.strokeStyle = highlightColor;\n\n drawBar(\n point[0],\n point[1],\n point[2] || 0,\n barLeft,\n barLeft + series.bars.barWidth,\n function() {\n return fillStyle;\n },\n series.xaxis,\n series.yaxis,\n octx,\n series.bars.horizontal,\n series.bars.lineWidth\n );\n }\n\n function getColorOrGradient(spec, bottom, top, defaultColor) {\n if (typeof spec == 'string') return spec;\n else {\n // assume this is a gradient spec; IE currently only\n // supports a simple vertical gradient properly, so that's\n // what we support too\n let gradient = ctx.createLinearGradient(0, top, 0, bottom);\n\n for (let i = 0, l = spec.colors.length; i < l; ++i) {\n let c = spec.colors[i];\n if (typeof c != 'string') {\n let co = $.color.parse(defaultColor);\n if (c.brightness != null) co = co.scale('rgb', c.brightness);\n if (c.opacity != null) co.a *= c.opacity;\n c = co.toString();\n }\n gradient.addColorStop(i / (l - 1), c);\n }\n\n return gradient;\n }\n }\n }\n\n // Add the plot function to the top level of the jQuery object\n\n $.plot = function(placeholder, data, options) {\n //var t0 = new Date();\n let plot = new Plot($(placeholder), data, options, $.plot.plugins);\n //(window.console ? console.log : alert)(\"time used (msecs): \" + ((new Date()).getTime() - t0.getTime()));\n return plot;\n };\n\n $.plot.version = '0.8.3';\n\n $.plot.plugins = [];\n\n // Also add the plot function as a chainable property\n\n $.fn.plot = function(data, options) {\n return this.each(function() {\n $.plot(this, data, options);\n });\n };\n\n // round to nearby lower multiple of base\n function floorInBase(n, base) {\n return base * Math.floor(n / base);\n }\n})(window.jQuery);\n","/**\n *\n * THIS FILE WAS COPIED INTO PROMETHEUS FROM GRAFANA'S VENDORED FORK OF FLOT\n * (LIVING AT https://github.com/grafana/grafana/tree/master/public/vendor/flot),\n * WHICH CONTAINS FIXES FOR DISPLAYING NULL VALUES IN STACKED GRAPHS. THE ORIGINAL\n * FLOT CODE WAS LICENSED UNDER THE MIT LICENSE AS STATED BELOW. ADDITIONAL\n * CHANGES HAVE BEEN CONTRIBUTED TO THE GRAFANA FORK UNDER AN APACHE 2 LICENSE, SEE\n * https://github.com/grafana/grafana/blob/master/license.\n *\n */\n\n/* eslint-disable prefer-spread */\n/* eslint-disable no-loop-func */\n/* eslint-disable @typescript-eslint/no-this-alias */\n/* eslint-disable no-redeclare */\n/* eslint-disable no-useless-escape */\n/* eslint-disable prefer-const */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/no-use-before-define */\n/* eslint-disable eqeqeq */\n/* eslint-disable no-var */\n\n/* Flot plugin for stacking data sets rather than overlyaing them.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nThe plugin assumes the data is sorted on x (or y if stacking horizontally).\nFor line charts, it is assumed that if a line has an undefined gap (from a\nnull point), then the line above it should have the same gap - insert zeros\ninstead of \"null\" if you want another behaviour. This also holds for the start\nand end of the chart. Note that stacking a mix of positive and negative values\nin most instances doesn't make sense (so it looks weird).\n\nTwo or more series are stacked when their \"stack\" attribute is set to the same\nkey (which can be any number or string or just \"true\"). To specify the default\nstack, you can set the stack option like this:\n\n series: {\n stack: null/false, true, or a key (number/string)\n }\n\nYou can also specify it for a single series, like this:\n\n $.plot( $(\"#placeholder\"), [{\n data: [ ... ],\n stack: true\n }])\n\nThe stacking order is determined by the order of the data series in the array\n(later series end up on top of the previous).\n\nInternally, the plugin modifies the datapoints in each series, adding an\noffset to the y value. For line series, extra data points are inserted through\ninterpolation. If there's a second y value, it's also adjusted (e.g for bar\ncharts or filled areas).\n\n*/\n\n(function($) {\n const options = {\n series: { stack: null }, // or number/string\n };\n\n function init(plot) {\n function findMatchingSeries(s, allseries) {\n let res = null;\n for (let i = 0; i < allseries.length; ++i) {\n if (s == allseries[i]) break;\n\n if (allseries[i].stack == s.stack) res = allseries[i];\n }\n\n return res;\n }\n\n function stackData(plot, s, datapoints) {\n if (s.stack == null || s.stack === false) return;\n\n const other = findMatchingSeries(s, plot.getData());\n if (!other) return;\n\n let ps = datapoints.pointsize,\n points = datapoints.points,\n otherps = other.datapoints.pointsize,\n otherpoints = other.datapoints.points,\n newpoints = [],\n px,\n py,\n intery,\n qx,\n qy,\n bottom,\n withlines = s.lines.show,\n horizontal = s.bars.horizontal,\n withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y),\n withsteps = withlines && s.lines.steps,\n keyOffset = horizontal ? 1 : 0,\n accumulateOffset = horizontal ? 0 : 1,\n i = 0,\n j = 0,\n l,\n m;\n\n while (true) {\n if (i >= points.length && j >= otherpoints.length) break;\n\n l = newpoints.length;\n\n if (i < points.length && points[i] == null) {\n // take the points from the previous series\n for (m = 0; m < ps; ++m) newpoints.push(otherpoints[i + m]);\n if (withbottom) newpoints[l + 2] = otherpoints[i + accumulateOffset];\n i += ps;\n } else if (i >= points.length) {\n j += otherps;\n } else if (j >= otherpoints.length) {\n // take the remaining points from the current series\n for (m = 0; m < ps; ++m) newpoints.push(points[i + m]);\n i += ps;\n } else if (j < otherpoints.length && otherpoints[j] == null) {\n // ignore point\n j += otherps;\n } else {\n // cases where we actually got two points\n px = points[i + keyOffset];\n py = points[i + accumulateOffset];\n qx = otherpoints[j + keyOffset];\n qy = otherpoints[j + accumulateOffset];\n bottom = 0;\n\n if (px == qx) {\n for (m = 0; m < ps; ++m) newpoints.push(points[i + m]);\n\n newpoints[l + accumulateOffset] += qy;\n bottom = qy;\n\n i += ps;\n j += otherps;\n } else if (px > qx) {\n // take the point from the previous series so that next series will correctly stack\n if (i == 0) {\n for (m = 0; m < ps; ++m) newpoints.push(otherpoints[j + m]);\n bottom = qy;\n }\n // we got past point below, might need to\n // insert interpolated extra point\n if (i > 0 && points[i - ps] != null) {\n intery = py + ((points[i - ps + accumulateOffset] - py) * (qx - px)) / (points[i - ps + keyOffset] - px);\n newpoints.push(qx);\n newpoints.push(intery + qy);\n for (m = 2; m < ps; ++m) newpoints.push(points[i + m]);\n bottom = qy;\n }\n\n j += otherps;\n } else {\n // px < qx\n for (m = 0; m < ps; ++m) newpoints.push(points[i + m]);\n\n // we might be able to interpolate a point below,\n // this can give us a better y\n if (j > 0 && otherpoints[j - otherps] != null)\n bottom =\n qy +\n ((otherpoints[j - otherps + accumulateOffset] - qy) * (px - qx)) /\n (otherpoints[j - otherps + keyOffset] - qx);\n\n newpoints[l + accumulateOffset] += bottom;\n\n i += ps;\n }\n\n if (l != newpoints.length && withbottom) newpoints[l + 2] = bottom;\n }\n\n // maintain the line steps invariant\n if (\n withsteps &&\n l != newpoints.length &&\n l > 0 &&\n newpoints[l] != null &&\n newpoints[l] != newpoints[l - ps] &&\n newpoints[l + 1] != newpoints[l - ps + 1]\n ) {\n for (m = 0; m < ps; ++m) newpoints[l + ps + m] = newpoints[l + m];\n newpoints[l + 1] = newpoints[l - ps + 1];\n }\n }\n\n datapoints.points = newpoints;\n }\n\n plot.hooks.processDatapoints.push(stackData);\n }\n\n $.plot.plugins.push({\n init: init,\n options: options,\n name: 'stack',\n version: '1.2',\n });\n})(window.jQuery);\n","/**\n *\n * THIS FILE WAS COPIED INTO PROMETHEUS FROM GRAFANA'S VENDORED FORK OF FLOT\n * (LIVING AT https://github.com/grafana/grafana/tree/master/public/vendor/flot),\n * WHICH CONTAINS FIXES FOR DISPLAYING NULL VALUES IN STACKED GRAPHS. THE ORIGINAL\n * FLOT CODE WAS LICENSED UNDER THE MIT LICENSE AS STATED BELOW. ADDITIONAL\n * CHANGES HAVE BEEN CONTRIBUTED TO THE GRAFANA FORK UNDER AN APACHE 2 LICENSE, SEE\n * https://github.com/grafana/grafana/blob/master/license.\n *\n */\n\n/* eslint-disable prefer-rest-params */\n/* eslint-disable no-useless-concat */\n/* eslint-disable default-case */\n/* eslint-disable prefer-spread */\n/* eslint-disable no-loop-func */\n/* eslint-disable @typescript-eslint/no-this-alias */\n/* eslint-disable no-redeclare */\n/* eslint-disable no-useless-escape */\n/* eslint-disable prefer-const */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/no-use-before-define */\n/* eslint-disable eqeqeq */\n/* eslint-disable no-var */\n\n/* Pretty handling of time axes.\n\nCopyright (c) 2007-2013 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nSet axis.mode to \"time\" to enable. See the section \"Time series data\" in\nAPI.txt for details.\n\n*/\n\n(function($) {\n const options = {\n xaxis: {\n timezone: null, // \"browser\" for local to the client or timezone for timezone-js\n timeformat: null, // format string to use\n twelveHourClock: false, // 12 or 24 time in time mode\n monthNames: null, // list of names of months\n },\n };\n\n // round to nearby lower multiple of base\n\n function floorInBase(n, base) {\n return base * Math.floor(n / base);\n }\n\n // Returns a string with the date d formatted according to fmt.\n // A subset of the Open Group's strftime format is supported.\n\n function formatDate(d, fmt, monthNames, dayNames) {\n if (typeof d.strftime == 'function') {\n return d.strftime(fmt);\n }\n\n const leftPad = function(n, pad) {\n n = '' + n;\n pad = '' + (pad == null ? '0' : pad);\n return n.length == 1 ? pad + n : n;\n };\n\n const r = [];\n let escape = false;\n const hours = d.getHours();\n const isAM = hours < 12;\n\n if (monthNames == null) {\n monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n }\n\n if (dayNames == null) {\n dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n }\n\n let hours12;\n\n if (hours > 12) {\n hours12 = hours - 12;\n } else if (hours == 0) {\n hours12 = 12;\n } else {\n hours12 = hours;\n }\n\n for (let i = 0; i < fmt.length; ++i) {\n let c = fmt.charAt(i);\n\n if (escape) {\n switch (c) {\n case 'a':\n c = '' + dayNames[d.getDay()];\n break;\n case 'b':\n c = '' + monthNames[d.getMonth()];\n break;\n case 'd':\n c = leftPad(d.getDate(), '');\n break;\n case 'e':\n c = leftPad(d.getDate(), ' ');\n break;\n case 'h': // For back-compat with 0.7; remove in 1.0\n case 'H':\n c = leftPad(hours);\n break;\n case 'I':\n c = leftPad(hours12);\n break;\n case 'l':\n c = leftPad(hours12, ' ');\n break;\n case 'm':\n c = leftPad(d.getMonth() + 1, '');\n break;\n case 'M':\n c = leftPad(d.getMinutes());\n break;\n // quarters not in Open Group's strftime specification\n case 'q':\n c = '' + (Math.floor(d.getMonth() / 3) + 1);\n break;\n case 'S':\n c = leftPad(d.getSeconds());\n break;\n case 'y':\n c = leftPad(d.getFullYear() % 100);\n break;\n case 'Y':\n c = '' + d.getFullYear();\n break;\n case 'p':\n c = isAM ? '' + 'am' : '' + 'pm';\n break;\n case 'P':\n c = isAM ? '' + 'AM' : '' + 'PM';\n break;\n case 'w':\n c = '' + d.getDay();\n break;\n }\n r.push(c);\n escape = false;\n } else {\n if (c == '%') {\n escape = true;\n } else {\n r.push(c);\n }\n }\n }\n\n return r.join('');\n }\n\n // To have a consistent view of time-based data independent of which time\n // zone the client happens to be in we need a date-like object independent\n // of time zones. This is done through a wrapper that only calls the UTC\n // versions of the accessor methods.\n\n function makeUtcWrapper(d) {\n function addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) {\n sourceObj[sourceMethod] = function() {\n return targetObj[targetMethod].apply(targetObj, arguments);\n };\n }\n\n const utc = {\n date: d,\n };\n\n // support strftime, if found\n\n if (d.strftime != undefined) {\n addProxyMethod(utc, 'strftime', d, 'strftime');\n }\n\n addProxyMethod(utc, 'getTime', d, 'getTime');\n addProxyMethod(utc, 'setTime', d, 'setTime');\n\n const props = ['Date', 'Day', 'FullYear', 'Hours', 'Milliseconds', 'Minutes', 'Month', 'Seconds'];\n\n for (let p = 0; p < props.length; p++) {\n addProxyMethod(utc, 'get' + props[p], d, 'getUTC' + props[p]);\n addProxyMethod(utc, 'set' + props[p], d, 'setUTC' + props[p]);\n }\n\n return utc;\n }\n\n // select time zone strategy. This returns a date-like object tied to the\n // desired timezone\n\n function dateGenerator(ts, opts) {\n if (opts.timezone == 'browser') {\n return new Date(ts);\n } else if (!opts.timezone || opts.timezone == 'utc') {\n return makeUtcWrapper(new Date(ts));\n }\n // } else if (typeof timezoneJS != 'undefined' && typeof timezoneJS.Date != 'undefined') {\n // const d = new timezoneJS.Date();\n // // timezone-js is fickle, so be sure to set the time zone before\n // // setting the time.\n // d.setTimezone(opts.timezone);\n // d.setTime(ts);\n // return d;\n // }\n return makeUtcWrapper(new Date(ts));\n }\n\n // map of app. size of time units in milliseconds\n\n const timeUnitSize = {\n second: 1000,\n minute: 60 * 1000,\n hour: 60 * 60 * 1000,\n day: 24 * 60 * 60 * 1000,\n month: 30 * 24 * 60 * 60 * 1000,\n quarter: 3 * 30 * 24 * 60 * 60 * 1000,\n year: 365.2425 * 24 * 60 * 60 * 1000,\n };\n\n // the allowed tick sizes, after 1 year we use\n // an integer algorithm\n\n const baseSpec = [\n [1, 'second'],\n [2, 'second'],\n [5, 'second'],\n [10, 'second'],\n [30, 'second'],\n [1, 'minute'],\n [2, 'minute'],\n [5, 'minute'],\n [10, 'minute'],\n [30, 'minute'],\n [1, 'hour'],\n [2, 'hour'],\n [4, 'hour'],\n [8, 'hour'],\n [12, 'hour'],\n [1, 'day'],\n [2, 'day'],\n [3, 'day'],\n [0.25, 'month'],\n [0.5, 'month'],\n [1, 'month'],\n [2, 'month'],\n ];\n\n // we don't know which variant(s) we'll need yet, but generating both is\n // cheap\n\n const specMonths = baseSpec.concat([[3, 'month'], [6, 'month'], [1, 'year']]);\n const specQuarters = baseSpec.concat([[1, 'quarter'], [2, 'quarter'], [1, 'year']]);\n\n function init(plot) {\n plot.hooks.processOptions.push(function(plot) {\n $.each(plot.getAxes(), function(axisName, axis) {\n const opts = axis.options;\n\n if (opts.mode == 'time') {\n axis.tickGenerator = function(axis) {\n const ticks = [];\n const d = dateGenerator(axis.min, opts);\n let minSize = 0;\n\n // make quarter use a possibility if quarters are\n // mentioned in either of these options\n\n const spec =\n (opts.tickSize && opts.tickSize[1] === 'quarter') || (opts.minTickSize && opts.minTickSize[1] === 'quarter')\n ? specQuarters\n : specMonths;\n\n if (opts.minTickSize != null) {\n if (typeof opts.tickSize == 'number') {\n minSize = opts.tickSize;\n } else {\n minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]];\n }\n }\n\n for (var i = 0; i < spec.length - 1; ++i) {\n if (\n axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]] + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 &&\n spec[i][0] * timeUnitSize[spec[i][1]] >= minSize\n ) {\n break;\n }\n }\n\n let size = spec[i][0];\n let unit = spec[i][1];\n\n // special-case the possibility of several years\n\n if (unit == 'year') {\n // if given a minTickSize in years, just use it,\n // ensuring that it's an integer\n\n if (opts.minTickSize != null && opts.minTickSize[1] == 'year') {\n size = Math.floor(opts.minTickSize[0]);\n } else {\n const magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10));\n const norm = axis.delta / timeUnitSize.year / magn;\n\n if (norm < 1.5) {\n size = 1;\n } else if (norm < 3) {\n size = 2;\n } else if (norm < 7.5) {\n size = 5;\n } else {\n size = 10;\n }\n\n size *= magn;\n }\n\n // minimum size for years is 1\n\n if (size < 1) {\n size = 1;\n }\n }\n\n axis.tickSize = opts.tickSize || [size, unit];\n const tickSize = axis.tickSize[0];\n unit = axis.tickSize[1];\n\n const step = tickSize * timeUnitSize[unit];\n\n if (unit == 'second') {\n d.setSeconds(floorInBase(d.getSeconds(), tickSize));\n } else if (unit == 'minute') {\n d.setMinutes(floorInBase(d.getMinutes(), tickSize));\n } else if (unit == 'hour') {\n d.setHours(floorInBase(d.getHours(), tickSize));\n } else if (unit == 'month') {\n d.setMonth(floorInBase(d.getMonth(), tickSize));\n } else if (unit == 'quarter') {\n d.setMonth(3 * floorInBase(d.getMonth() / 3, tickSize));\n } else if (unit == 'year') {\n d.setFullYear(floorInBase(d.getFullYear(), tickSize));\n }\n\n // reset smaller components\n\n d.setMilliseconds(0);\n\n if (step >= timeUnitSize.minute) {\n d.setSeconds(0);\n }\n if (step >= timeUnitSize.hour) {\n d.setMinutes(0);\n }\n if (step >= timeUnitSize.day) {\n d.setHours(0);\n }\n if (step >= timeUnitSize.day * 4) {\n d.setDate(1);\n }\n if (step >= timeUnitSize.month * 2) {\n d.setMonth(floorInBase(d.getMonth(), 3));\n }\n if (step >= timeUnitSize.quarter * 2) {\n d.setMonth(floorInBase(d.getMonth(), 6));\n }\n if (step >= timeUnitSize.year) {\n d.setMonth(0);\n }\n\n let carry = 0;\n let v = Number.NaN;\n let prev;\n\n do {\n prev = v;\n v = d.getTime();\n ticks.push(v);\n\n if (unit == 'month' || unit == 'quarter') {\n if (tickSize < 1) {\n // a bit complicated - we'll divide the\n // month/quarter up but we need to take\n // care of fractions so we don't end up in\n // the middle of a day\n\n d.setDate(1);\n const start = d.getTime();\n d.setMonth(d.getMonth() + (unit == 'quarter' ? 3 : 1));\n const end = d.getTime();\n d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);\n carry = d.getHours();\n d.setHours(0);\n } else {\n d.setMonth(d.getMonth() + tickSize * (unit == 'quarter' ? 3 : 1));\n }\n } else if (unit == 'year') {\n d.setFullYear(d.getFullYear() + tickSize);\n } else {\n d.setTime(v + step);\n }\n } while (v < axis.max && v != prev);\n\n return ticks;\n };\n\n axis.tickFormatter = function(v, axis) {\n const d = dateGenerator(v, axis.options);\n\n // first check global format\n\n if (opts.timeformat != null) {\n return formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames);\n }\n\n // possibly use quarters if quarters are mentioned in\n // any of these places\n\n const useQuarters =\n (axis.options.tickSize && axis.options.tickSize[1] == 'quarter') ||\n (axis.options.minTickSize && axis.options.minTickSize[1] == 'quarter');\n\n const t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];\n const span = axis.max - axis.min;\n const suffix = opts.twelveHourClock ? ' %p' : '';\n const hourCode = opts.twelveHourClock ? '%I' : '%H';\n let fmt;\n\n if (t < timeUnitSize.minute) {\n fmt = hourCode + ':%M:%S' + suffix;\n } else if (t < timeUnitSize.day) {\n if (span < 2 * timeUnitSize.day) {\n fmt = hourCode + ':%M' + suffix;\n } else {\n fmt = '%b %d ' + hourCode + ':%M' + suffix;\n }\n } else if (t < timeUnitSize.month) {\n fmt = '%b %d';\n } else if ((useQuarters && t < timeUnitSize.quarter) || (!useQuarters && t < timeUnitSize.year)) {\n if (span < timeUnitSize.year) {\n fmt = '%b';\n } else {\n fmt = '%b %Y';\n }\n } else if (useQuarters && t < timeUnitSize.year) {\n if (span < timeUnitSize.year) {\n fmt = 'Q%q';\n } else {\n fmt = 'Q%q %Y';\n }\n } else {\n fmt = '%Y';\n }\n\n const rt = formatDate(d, fmt, opts.monthNames, opts.dayNames);\n\n return rt;\n };\n }\n });\n });\n }\n\n $.plot.plugins.push({\n init: init,\n options: options,\n name: 'time',\n version: '1.0',\n });\n\n // Time-axis support used to be in Flot core, which exposed the\n // formatDate function on the plot object. Various plugins depend\n // on the function, so we need to re-expose it here.\n\n $.plot.formatDate = formatDate;\n})(window.jQuery);\n","/**\n *\n * THIS FILE WAS COPIED INTO PROMETHEUS FROM GRAFANA'S VENDORED FORK OF FLOT\n * (LIVING AT https://github.com/grafana/grafana/tree/master/public/vendor/flot),\n * WHICH CONTAINS FIXES FOR DISPLAYING NULL VALUES IN STACKED GRAPHS. THE ORIGINAL\n * FLOT CODE WAS LICENSED UNDER THE MIT LICENSE AS STATED BELOW. ADDITIONAL\n * CHANGES HAVE BEEN CONTRIBUTED TO THE GRAFANA FORK UNDER AN APACHE 2 LICENSE, SEE\n * https://github.com/grafana/grafana/blob/master/license.\n *\n */\n\n/* eslint-disable prefer-spread */\n/* eslint-disable no-loop-func */\n/* eslint-disable @typescript-eslint/no-this-alias */\n/* eslint-disable no-redeclare */\n/* eslint-disable no-useless-escape */\n/* eslint-disable prefer-const */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/no-use-before-define */\n/* eslint-disable eqeqeq */\n/* eslint-disable no-var */\n/* Flot plugin for showing crosshairs when the mouse hovers over the plot.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nThe plugin supports these options:\n\n\tcrosshair: {\n\t\tmode: null or \"x\" or \"y\" or \"xy\"\n\t\tcolor: color\n\t\tlineWidth: number\n\t}\n\nSet the mode to one of \"x\", \"y\" or \"xy\". The \"x\" mode enables a vertical\ncrosshair that lets you trace the values on the x axis, \"y\" enables a\nhorizontal crosshair and \"xy\" enables them both. \"color\" is the color of the\ncrosshair (default is \"rgba(170, 0, 0, 0.80)\"), \"lineWidth\" is the width of\nthe drawn lines (default is 1).\n\nThe plugin also adds four public methods:\n\n - setCrosshair( pos )\n\n Set the position of the crosshair. Note that this is cleared if the user\n moves the mouse. \"pos\" is in coordinates of the plot and should be on the\n form { x: xpos, y: ypos } (you can use x2/x3/... if you're using multiple\n axes), which is coincidentally the same format as what you get from a\n \"plothover\" event. If \"pos\" is null, the crosshair is cleared.\n\n - clearCrosshair()\n\n Clear the crosshair.\n\n - lockCrosshair(pos)\n\n Cause the crosshair to lock to the current location, no longer updating if\n the user moves the mouse. Optionally supply a position (passed on to\n setCrosshair()) to move it to.\n\n Example usage:\n\n\tvar myFlot = $.plot( $(\"#graph\"), ..., { crosshair: { mode: \"x\" } } };\n\t$(\"#graph\").bind( \"plothover\", function ( evt, position, item ) {\n\t\tif ( item ) {\n\t\t\t// Lock the crosshair to the data point being hovered\n\t\t\tmyFlot.lockCrosshair({\n\t\t\t\tx: item.datapoint[ 0 ],\n\t\t\t\ty: item.datapoint[ 1 ]\n\t\t\t});\n\t\t} else {\n\t\t\t// Return normal crosshair operation\n\t\t\tmyFlot.unlockCrosshair();\n\t\t}\n\t});\n\n - unlockCrosshair()\n\n Free the crosshair to move again after locking it.\n*/\n\n(function($) {\n const options = {\n crosshair: {\n mode: null, // one of null, \"x\", \"y\" or \"xy\",\n color: 'rgba(170, 0, 0, 0.80)',\n lineWidth: 1,\n },\n };\n\n function init(plot) {\n // position of crosshair in pixels\n const crosshair = { x: -1, y: -1, locked: false };\n\n plot.setCrosshair = function setCrosshair(pos) {\n if (!pos) crosshair.x = -1;\n else {\n const o = plot.p2c(pos);\n crosshair.x = Math.max(0, Math.min(o.left, plot.width()));\n crosshair.y = Math.max(0, Math.min(o.top, plot.height()));\n }\n\n plot.triggerRedrawOverlay();\n };\n\n plot.clearCrosshair = plot.setCrosshair; // passes null for pos\n\n plot.lockCrosshair = function lockCrosshair(pos) {\n if (pos) plot.setCrosshair(pos);\n crosshair.locked = true;\n };\n\n plot.unlockCrosshair = function unlockCrosshair() {\n crosshair.locked = false;\n };\n\n function onMouseOut() {\n if (crosshair.locked) return;\n\n if (crosshair.x != -1) {\n crosshair.x = -1;\n plot.triggerRedrawOverlay();\n }\n }\n\n function onMouseMove(e) {\n if (crosshair.locked) return;\n\n if (plot.getSelection && plot.getSelection()) {\n crosshair.x = -1; // hide the crosshair while selecting\n return;\n }\n\n const offset = plot.offset();\n crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width()));\n crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height()));\n plot.triggerRedrawOverlay();\n }\n\n plot.hooks.bindEvents.push(function(plot, eventHolder) {\n if (!plot.getOptions().crosshair.mode) return;\n\n eventHolder.mouseout(onMouseOut);\n eventHolder.mousemove(onMouseMove);\n });\n\n plot.hooks.drawOverlay.push(function(plot, ctx) {\n const c = plot.getOptions().crosshair;\n if (!c.mode) return;\n\n const plotOffset = plot.getPlotOffset();\n\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n\n if (crosshair.x != -1) {\n const adj = plot.getOptions().crosshair.lineWidth % 2 ? 0.5 : 0;\n\n ctx.strokeStyle = c.color;\n ctx.lineWidth = c.lineWidth;\n ctx.lineJoin = 'round';\n\n ctx.beginPath();\n if (c.mode.indexOf('x') != -1) {\n const drawX = Math.floor(crosshair.x) + adj;\n ctx.moveTo(drawX, 0);\n ctx.lineTo(drawX, plot.height());\n }\n if (c.mode.indexOf('y') != -1) {\n const drawY = Math.floor(crosshair.y) + adj;\n ctx.moveTo(0, drawY);\n ctx.lineTo(plot.width(), drawY);\n }\n ctx.stroke();\n }\n ctx.restore();\n });\n\n plot.hooks.shutdown.push(function(plot, eventHolder) {\n eventHolder.unbind('mouseout', onMouseOut);\n eventHolder.unbind('mousemove', onMouseMove);\n });\n }\n\n $.plot.plugins.push({\n init: init,\n options: options,\n name: 'crosshair',\n version: '1.0',\n });\n})(window.jQuery);\n","/**\n *\n * THIS FILE WAS COPIED INTO PROMETHEUS FROM GRAFANA'S VENDORED FORK OF FLOT\n * (LIVING AT https://github.com/grafana/grafana/tree/v7.5.8/public/vendor/flot).\n * THE ORIGINAL FLOT CODE WAS LICENSED UNDER THE MIT LICENSE AS STATED BELOW.\n * ADDITIONAL CHANGES HAVE BEEN CONTRIBUTED TO THE GRAFANA FORK UNDER AN\n * APACHE 2 LICENSE, SEE https://github.com/grafana/grafana/blob/v7.5.8/LICENSE.\n */\n\n/* eslint-disable prefer-spread */\n/* eslint-disable no-loop-func */\n/* eslint-disable @typescript-eslint/no-this-alias */\n/* eslint-disable no-redeclare */\n/* eslint-disable no-useless-escape */\n/* eslint-disable prefer-const */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/no-use-before-define */\n/* eslint-disable eqeqeq */\n/* eslint-disable no-var */\n/* Flot plugin for selecting regions of a plot.\n\nCopyright (c) 2007-2013 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nThe plugin supports these options:\n\nselection: {\n\tmode: null or \"x\" or \"y\" or \"xy\",\n\tcolor: color,\n\tshape: \"round\" or \"miter\" or \"bevel\",\n\tminSize: number of pixels\n}\n\nSelection support is enabled by setting the mode to one of \"x\", \"y\" or \"xy\".\nIn \"x\" mode, the user will only be able to specify the x range, similarly for\n\"y\" mode. For \"xy\", the selection becomes a rectangle where both ranges can be\nspecified. \"color\" is color of the selection (if you need to change the color\nlater on, you can get to it with plot.getOptions().selection.color). \"shape\"\nis the shape of the corners of the selection.\n\n\"minSize\" is the minimum size a selection can be in pixels. This value can\nbe customized to determine the smallest size a selection can be and still\nhave the selection rectangle be displayed. When customizing this value, the\nfact that it refers to pixels, not axis units must be taken into account.\nThus, for example, if there is a bar graph in time mode with BarWidth set to 1\nminute, setting \"minSize\" to 1 will not make the minimum selection size 1\nminute, but rather 1 pixel. Note also that setting \"minSize\" to 0 will prevent\n\"plotunselected\" events from being fired when the user clicks the mouse without\ndragging.\n\nWhen selection support is enabled, a \"plotselected\" event will be emitted on\nthe DOM element you passed into the plot function. The event handler gets a\nparameter with the ranges selected on the axes, like this:\n\n\tplaceholder.bind( \"plotselected\", function( event, ranges ) {\n\t\talert(\"You selected \" + ranges.xaxis.from + \" to \" + ranges.xaxis.to)\n\t\t// similar for yaxis - with multiple axes, the extra ones are in\n\t\t// x2axis, x3axis, ...\n\t});\n\nThe \"plotselected\" event is only fired when the user has finished making the\nselection. A \"plotselecting\" event is fired during the process with the same\nparameters as the \"plotselected\" event, in case you want to know what's\nhappening while it's happening,\n\nA \"plotunselected\" event with no arguments is emitted when the user clicks the\nmouse to remove the selection. As stated above, setting \"minSize\" to 0 will\ndestroy this behavior.\n\nThe plugin allso adds the following methods to the plot object:\n\n- setSelection( ranges, preventEvent )\n\n Set the selection rectangle. The passed in ranges is on the same form as\n returned in the \"plotselected\" event. If the selection mode is \"x\", you\n should put in either an xaxis range, if the mode is \"y\" you need to put in\n an yaxis range and both xaxis and yaxis if the selection mode is \"xy\", like\n this:\n\n\tsetSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } });\n\n setSelection will trigger the \"plotselected\" event when called. If you don't\n want that to happen, e.g. if you're inside a \"plotselected\" handler, pass\n true as the second parameter. If you are using multiple axes, you can\n specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of\n xaxis, the plugin picks the first one it sees.\n\n- clearSelection( preventEvent )\n\n Clear the selection rectangle. Pass in true to avoid getting a\n \"plotunselected\" event.\n\n- getSelection()\n\n Returns the current selection in the same format as the \"plotselected\"\n event. If there's currently no selection, the function returns null.\n\n*/\n\n(function($) {\n function init(plot) {\n var selection = {\n first: { x: -1, y: -1 },\n second: { x: -1, y: -1 },\n show: false,\n active: false,\n };\n\n // FIXME: The drag handling implemented here should be\n // abstracted out, there's some similar code from a library in\n // the navigation plugin, this should be massaged a bit to fit\n // the Flot cases here better and reused. Doing this would\n // make this plugin much slimmer.\n var savedhandlers = {};\n\n var mouseUpHandler = null;\n\n function onMouseMove(e) {\n if (selection.active) {\n updateSelection(e);\n\n plot.getPlaceholder().trigger('plotselecting', [getSelection()]);\n }\n }\n\n function onMouseDown(e) {\n if (e.which != 1)\n // only accept left-click\n return;\n\n // cancel out any text selections\n document.body.focus();\n\n // prevent text selection and drag in old-school browsers\n if (document.onselectstart !== undefined && savedhandlers.onselectstart == null) {\n savedhandlers.onselectstart = document.onselectstart;\n document.onselectstart = function() {\n return false;\n };\n }\n if (document.ondrag !== undefined && savedhandlers.ondrag == null) {\n savedhandlers.ondrag = document.ondrag;\n document.ondrag = function() {\n return false;\n };\n }\n\n setSelectionPos(selection.first, e);\n\n selection.active = true;\n\n // this is a bit silly, but we have to use a closure to be\n // able to whack the same handler again\n mouseUpHandler = function(e) {\n onMouseUp(e);\n };\n\n $(document).one('mouseup', mouseUpHandler);\n }\n\n function onMouseUp(e) {\n mouseUpHandler = null;\n\n // revert drag stuff for old-school browsers\n if (document.onselectstart !== undefined) document.onselectstart = savedhandlers.onselectstart;\n if (document.ondrag !== undefined) document.ondrag = savedhandlers.ondrag;\n\n // no more dragging\n selection.active = false;\n updateSelection(e);\n\n if (selectionIsSane()) triggerSelectedEvent(e);\n else {\n // this counts as a clear\n plot.getPlaceholder().trigger('plotunselected', []);\n plot.getPlaceholder().trigger('plotselecting', [null]);\n }\n\n setTimeout(function() {\n plot.isSelecting = false;\n }, 10);\n\n return false;\n }\n\n function getSelection() {\n if (!selectionIsSane()) return null;\n\n if (!selection.show) return null;\n\n var r = {},\n c1 = selection.first,\n c2 = selection.second;\n var axes = plot.getAxes();\n // look if no axis is used\n var noAxisInUse = true;\n $.each(axes, function(name, axis) {\n if (axis.used) {\n //anyUsed = false;\n }\n });\n\n $.each(axes, function(name, axis) {\n if (axis.used || noAxisInUse) {\n var p1 = axis.c2p(c1[axis.direction]),\n p2 = axis.c2p(c2[axis.direction]);\n r[name] = { from: Math.min(p1, p2), to: Math.max(p1, p2) };\n }\n });\n return r;\n }\n\n function triggerSelectedEvent(event) {\n var r = getSelection();\n\n // Add ctrlKey and metaKey to event\n r.ctrlKey = event.ctrlKey;\n r.metaKey = event.metaKey;\n\n plot.getPlaceholder().trigger('plotselected', [r]);\n\n // backwards-compat stuff, to be removed in future\n if (r.xaxis && r.yaxis)\n plot.getPlaceholder().trigger('selected', [{ x1: r.xaxis.from, y1: r.yaxis.from, x2: r.xaxis.to, y2: r.yaxis.to }]);\n }\n\n function clamp(min, value, max) {\n return value < min ? min : value > max ? max : value;\n }\n\n function setSelectionPos(pos, e) {\n var o = plot.getOptions();\n var offset = plot.getPlaceholder().offset();\n var plotOffset = plot.getPlotOffset();\n pos.x = clamp(0, e.pageX - offset.left - plotOffset.left, plot.width());\n pos.y = clamp(0, e.pageY - offset.top - plotOffset.top, plot.height());\n\n if (o.selection.mode == 'y') pos.x = pos == selection.first ? 0 : plot.width();\n\n if (o.selection.mode == 'x') pos.y = pos == selection.first ? 0 : plot.height();\n }\n\n function updateSelection(pos) {\n if (pos.pageX == null) return;\n\n setSelectionPos(selection.second, pos);\n if (selectionIsSane()) {\n plot.isSelecting = true;\n selection.show = true;\n plot.triggerRedrawOverlay();\n } else clearSelection(true);\n }\n\n function clearSelection(preventEvent) {\n if (selection.show) {\n selection.show = false;\n plot.triggerRedrawOverlay();\n if (!preventEvent) plot.getPlaceholder().trigger('plotunselected', []);\n }\n }\n\n // function taken from markings support in Flot\n function extractRange(ranges, coord) {\n var axis,\n from,\n to,\n key,\n axes = plot.getAxes();\n\n for (var k in axes) {\n axis = axes[k];\n if (axis.direction == coord) {\n key = coord + axis.n + 'axis';\n if (!ranges[key] && axis.n == 1) key = coord + 'axis'; // support x1axis as xaxis\n if (ranges[key]) {\n from = ranges[key].from;\n to = ranges[key].to;\n break;\n }\n }\n }\n\n // backwards-compat stuff - to be removed in future\n if (!ranges[key]) {\n axis = coord == 'x' ? plot.getXAxes()[0] : plot.getYAxes()[0];\n from = ranges[coord + '1'];\n to = ranges[coord + '2'];\n }\n\n // auto-reverse as an added bonus\n if (from != null && to != null && from > to) {\n var tmp = from;\n from = to;\n to = tmp;\n }\n\n return { from: from, to: to, axis: axis };\n }\n\n function setSelection(ranges, preventEvent) {\n var range,\n o = plot.getOptions();\n\n if (o.selection.mode == 'y') {\n selection.first.x = 0;\n selection.second.x = plot.width();\n } else {\n range = extractRange(ranges, 'x');\n\n selection.first.x = range.axis.p2c(range.from);\n selection.second.x = range.axis.p2c(range.to);\n }\n\n if (o.selection.mode == 'x') {\n selection.first.y = 0;\n selection.second.y = plot.height();\n } else {\n range = extractRange(ranges, 'y');\n\n selection.first.y = range.axis.p2c(range.from);\n selection.second.y = range.axis.p2c(range.to);\n }\n\n selection.show = true;\n plot.triggerRedrawOverlay();\n if (!preventEvent && selectionIsSane()) triggerSelectedEvent();\n }\n\n function selectionIsSane() {\n var minSize = plot.getOptions().selection.minSize;\n return (\n Math.abs(selection.second.x - selection.first.x) >= minSize &&\n Math.abs(selection.second.y - selection.first.y) >= minSize\n );\n }\n\n plot.clearSelection = clearSelection;\n plot.setSelection = setSelection;\n plot.getSelection = getSelection;\n\n plot.hooks.bindEvents.push(function(plot, eventHolder) {\n var o = plot.getOptions();\n if (o.selection.mode != null) {\n eventHolder.mousemove(onMouseMove);\n eventHolder.mousedown(onMouseDown);\n }\n });\n\n plot.hooks.drawOverlay.push(function(plot, ctx) {\n // draw selection\n if (selection.show && selectionIsSane()) {\n var plotOffset = plot.getPlotOffset();\n var o = plot.getOptions();\n\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n\n var c = $.color.parse(o.selection.color);\n\n ctx.strokeStyle = c.scale('a', 0.8).toString();\n ctx.lineWidth = 1;\n ctx.lineJoin = o.selection.shape;\n ctx.fillStyle = c.scale('a', 0.4).toString();\n\n var x = Math.min(selection.first.x, selection.second.x) + 0.5,\n y = Math.min(selection.first.y, selection.second.y) + 0.5,\n w = Math.abs(selection.second.x - selection.first.x) - 1,\n h = Math.abs(selection.second.y - selection.first.y) - 1;\n\n ctx.fillRect(x, y, w, h);\n ctx.strokeRect(x, y, w, h);\n\n ctx.restore();\n }\n });\n\n plot.hooks.shutdown.push(function(plot, eventHolder) {\n eventHolder.unbind('mousemove', onMouseMove);\n eventHolder.unbind('mousedown', onMouseDown);\n\n if (mouseUpHandler) {\n $(document).unbind('mouseup', mouseUpHandler);\n // grafana addition\n // In L114 this plugin is overrinding document.onselectstart handler to prevent default or custom behaviour\n // Then this patch is being restored during mouseup event. But, mouseup handler is unbound when this plugin is destroyed\n // and the overridden onselectstart handler is not restored. The problematic behaviour surfaces when flot is re-rendered\n // as a consequence of panel's model update. When i.e. options are applied via onBlur\n // event on some input which results in flot re-render. The mouseup handler should be called to resture the original handlers\n // but by the time the document mouseup event occurs, the event handler is no longer there, so onselectstart is permanently overridden.\n // To fix that we are making sure that the overrides are reverted when this plugin is destroyed, the same way as they would\n // via mouseup event handler (L138)\n\n if (document.onselectstart !== undefined) document.onselectstart = savedhandlers.onselectstart;\n if (document.ondrag !== undefined) document.ondrag = savedhandlers.ondrag;\n }\n });\n }\n\n $.plot.plugins.push({\n init: init,\n options: {\n selection: {\n mode: null, // one of null, \"x\", \"y\" or \"xy\"\n color: '#e8cfac',\n shape: 'round', // one of \"round\", \"miter\", or \"bevel\"\n minSize: 5, // minimum number of pixels\n },\n },\n name: 'selection',\n version: '1.1',\n });\n})(window.jQuery);\n","import jquery from 'jquery';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(window as any).jQuery = jquery;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(window as any).moment = require('moment');\n","import React from 'react';\n\nconst PathPrefixContext = React.createContext('');\n\nfunction usePathPrefix(): string {\n return React.useContext(PathPrefixContext);\n}\n\nexport { usePathPrefix, PathPrefixContext };\n","import React from 'react';\n\nexport type themeName = 'light' | 'dark';\nexport type themeSetting = themeName | 'auto';\n\nexport interface ThemeCtx {\n theme: themeName;\n userPreference: themeSetting;\n setTheme: (t: themeSetting) => void;\n}\n\n// defaults, will be overriden in App.tsx\nexport const ThemeContext = React.createContext({\n theme: 'light',\n userPreference: 'auto',\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n setTheme: (s: themeSetting) => {},\n});\n\nexport const useTheme = (): ThemeCtx => {\n return React.useContext(ThemeContext);\n};\n","import React, { FC, useEffect } from 'react';\nimport { Form, Button, ButtonGroup } from 'reactstrap';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faMoon, faSun, faAdjust } from '@fortawesome/free-solid-svg-icons';\nimport { useTheme } from './contexts/ThemeContext';\n\nexport const themeLocalStorageKey = 'user-prefers-color-scheme';\n\nexport const Theme: FC = () => {\n const { theme } = useTheme();\n\n useEffect(() => {\n document.body.classList.toggle('bootstrap-dark', theme === 'dark');\n document.body.classList.toggle('bootstrap', theme === 'light');\n }, [theme]);\n\n return null;\n};\n\nexport const ThemeToggle: FC = () => {\n const { userPreference, setTheme } = useTheme();\n\n return (\n
\n \n setTheme('light')}\n >\n \n \n \n setTheme('auto')}\n >\n \n \n \n
\n );\n};\n","import React, { FC, useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport {\n Collapse,\n Navbar,\n NavbarToggler,\n Nav,\n NavItem,\n NavLink,\n UncontrolledDropdown,\n DropdownToggle,\n DropdownMenu,\n DropdownItem,\n} from 'reactstrap';\nimport { usePathPrefix } from './contexts/PathPrefixContext';\nimport { ThemeToggle } from './Theme';\n\ninterface NavbarProps {\n consolesLink: string | null;\n agentMode: boolean;\n}\n\nconst Navigation: FC = ({ consolesLink, agentMode }) => {\n const [isOpen, setIsOpen] = useState(false);\n const toggle = () => setIsOpen(!isOpen);\n const pathPrefix = usePathPrefix();\n return (\n \n \n \n Prometheus{agentMode && ' Agent'}\n \n \n \n \n \n \n );\n};\n\nexport default Navigation;\n","import React, { FC } from 'react';\n\nconst Agent: FC = () => {\n return (\n <>\n

Prometheus Agent

\n

\n This Prometheus instance is running in agent mode. In this mode, Prometheus is only used to scrape\n discovered targets and forward the scraped metrics to remote write endpoints.\n

\n

Some features are not available in this mode, such as querying and alerting.

\n \n );\n};\n\nexport default Agent;\n","export const API_PATH = 'api/v1';\n","import { useState, useEffect } from 'react';\nimport { API_PATH } from '../constants/constants';\nimport { WALReplayStatus } from '../types/types';\n\nexport type APIResponse = { status: string; data: T };\n\nexport interface FetchState {\n response: APIResponse;\n error?: Error;\n isLoading: boolean;\n}\n\nexport interface FetchStateReadyInterval {\n ready: boolean;\n isUnexpected: boolean;\n walReplayStatus: WALReplayStatus;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const useFetch = >(url: string, options?: RequestInit): FetchState => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [response, setResponse] = useState>({ status: 'start fetching' } as any);\n const [error, setError] = useState();\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const fetchData = async () => {\n setIsLoading(true);\n try {\n const res = await fetch(url, { cache: 'no-store', credentials: 'same-origin', ...options });\n if (!res.ok) {\n throw new Error(res.statusText);\n }\n const json = (await res.json()) as APIResponse;\n setResponse(json);\n setIsLoading(false);\n } catch (err: unknown) {\n const error = err as Error;\n setError(error);\n }\n };\n fetchData();\n }, [url, options]);\n return { response, error, isLoading };\n};\n\nlet wasReady = false;\n\n// This is used on the starting page to periodically check if the server is ready yet,\n// and check the status of the WAL replay.\nexport const useFetchReadyInterval = (pathPrefix: string, options?: RequestInit): FetchStateReadyInterval => {\n const [ready, setReady] = useState(false);\n const [isUnexpected, setIsUnexpected] = useState(false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [walReplayStatus, setWALReplayStatus] = useState({} as any);\n\n useEffect(() => {\n if (wasReady) {\n setReady(true);\n } else {\n // This helps avoid a memory leak.\n let mounted = true;\n\n const fetchStatus = async () => {\n try {\n let res = await fetch(`${pathPrefix}/-/ready`, { cache: 'no-store', credentials: 'same-origin', ...options });\n if (res.status === 200) {\n if (mounted) {\n setReady(true);\n }\n wasReady = true;\n clearInterval(interval);\n } else if (res.status !== 503) {\n if (mounted) {\n setIsUnexpected(true);\n }\n clearInterval(interval);\n return;\n } else {\n if (mounted) {\n setIsUnexpected(false);\n }\n\n res = await fetch(`${pathPrefix}/${API_PATH}/status/walreplay`, {\n cache: 'no-store',\n credentials: 'same-origin',\n });\n if (res.ok) {\n const data = (await res.json()) as WALReplayStatus;\n if (mounted) {\n setWALReplayStatus(data);\n }\n }\n }\n } catch (error) {\n if (mounted) {\n setIsUnexpected(true);\n }\n clearInterval(interval);\n return;\n }\n };\n\n fetchStatus();\n const interval = setInterval(fetchStatus, 1000);\n return () => {\n clearInterval(interval);\n mounted = false;\n };\n }\n }, [pathPrefix, options]);\n\n return { ready, isUnexpected, walReplayStatus };\n};\n","import React, { FC, ComponentType } from 'react';\nimport { Alert } from 'reactstrap';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faSpinner } from '@fortawesome/free-solid-svg-icons';\n\ninterface StatusIndicatorProps {\n error?: Error;\n isLoading?: boolean;\n customErrorMsg?: JSX.Element;\n componentTitle?: string;\n}\n\nexport const withStatusIndicator =\n >( // eslint-disable-line @typescript-eslint/no-explicit-any\n Component: ComponentType\n ): FC =>\n ({ error, isLoading, customErrorMsg, componentTitle, ...rest }) => {\n if (error) {\n return (\n \n {customErrorMsg ? (\n customErrorMsg\n ) : (\n <>\n Error: Error fetching {componentTitle || Component.displayName}: {error.message}\n \n )}\n \n );\n }\n\n if (isLoading) {\n return (\n \n );\n }\n return ;\n };\n","import { HighlightStyle, tags } from '@codemirror/highlight';\nimport { EditorView } from '@codemirror/view';\n\nexport const baseTheme = EditorView.theme({\n '&.cm-editor': {\n '&.cm-focused': {\n outline: 'none',\n outline_fallback: 'none',\n },\n },\n '.cm-scroller': {\n overflow: 'hidden',\n fontFamily: '\"DejaVu Sans Mono\", monospace',\n },\n '.cm-placeholder': {\n fontFamily:\n '-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",\"Liberation Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\"',\n },\n\n '.cm-matchingBracket': {\n color: '#000',\n backgroundColor: '#dedede',\n fontWeight: 'bold',\n outline: '1px dashed transparent',\n },\n '.cm-nonmatchingBracket': { borderColor: 'red' },\n\n '.cm-tooltip.cm-tooltip-autocomplete': {\n '& > ul': {\n maxHeight: '350px',\n fontFamily: '\"DejaVu Sans Mono\", monospace',\n maxWidth: 'unset',\n },\n '& > ul > li': {\n padding: '2px 1em 2px 3px',\n },\n minWidth: '30%',\n },\n\n '.cm-completionDetail': {\n float: 'right',\n color: '#999',\n },\n\n '.cm-tooltip.cm-completionInfo': {\n marginTop: '-11px',\n padding: '10px',\n fontFamily: \"'Open Sans', 'Lucida Sans Unicode', 'Lucida Grande', sans-serif;\",\n border: 'none',\n minWidth: '250px',\n maxWidth: 'min-content',\n },\n\n '.cm-completionInfo.cm-completionInfo-right': {\n '&:before': {\n content: \"' '\",\n height: '0',\n position: 'absolute',\n width: '0',\n left: '-20px',\n borderWidth: '10px',\n borderStyle: 'solid',\n borderColor: 'transparent',\n },\n marginLeft: '12px',\n },\n '.cm-completionInfo.cm-completionInfo-left': {\n '&:before': {\n content: \"' '\",\n height: '0',\n position: 'absolute',\n width: '0',\n right: '-20px',\n borderWidth: '10px',\n borderStyle: 'solid',\n borderColor: 'transparent',\n },\n marginRight: '12px',\n },\n\n '.cm-completionMatchedText': {\n textDecoration: 'none',\n fontWeight: 'bold',\n color: '#0066bf',\n },\n\n '.cm-selectionMatch': {\n backgroundColor: '#e6f3ff',\n },\n\n '.cm-diagnostic': {\n '&.cm-diagnostic-error': {\n borderLeft: '3px solid #e65013',\n },\n },\n\n '.cm-completionIcon': {\n boxSizing: 'content-box',\n fontSize: '16px',\n lineHeight: '1',\n marginRight: '10px',\n verticalAlign: 'top',\n '&:after': { content: \"'\\\\ea88'\" },\n fontFamily: 'codicon',\n paddingRight: '0',\n opacity: '1',\n color: '#007acc',\n },\n\n '.cm-completionIcon-function, .cm-completionIcon-method': {\n '&:after': { content: \"'\\\\ea8c'\" },\n color: '#652d90',\n },\n '.cm-completionIcon-class': {\n '&:after': { content: \"'○'\" },\n },\n '.cm-completionIcon-interface': {\n '&:after': { content: \"'◌'\" },\n },\n '.cm-completionIcon-variable': {\n '&:after': { content: \"'𝑥'\" },\n },\n '.cm-completionIcon-constant': {\n '&:after': { content: \"'\\\\eb5f'\" },\n color: '#007acc',\n },\n '.cm-completionIcon-type': {\n '&:after': { content: \"'𝑡'\" },\n },\n '.cm-completionIcon-enum': {\n '&:after': { content: \"'∪'\" },\n },\n '.cm-completionIcon-property': {\n '&:after': { content: \"'□'\" },\n },\n '.cm-completionIcon-keyword': {\n '&:after': { content: \"'\\\\eb62'\" },\n color: '#616161',\n },\n '.cm-completionIcon-namespace': {\n '&:after': { content: \"'▢'\" },\n },\n '.cm-completionIcon-text': {\n '&:after': { content: \"'\\\\ea95'\" },\n color: '#ee9d28',\n },\n});\n\nexport const lightTheme = EditorView.theme(\n {\n '.cm-tooltip': {\n backgroundColor: '#f8f8f8',\n borderColor: 'rgba(52, 79, 113, 0.2)',\n },\n\n '.cm-tooltip.cm-tooltip-autocomplete': {\n '& li:hover': {\n backgroundColor: '#ddd',\n },\n '& > ul > li[aria-selected]': {\n backgroundColor: '#d6ebff',\n color: 'unset',\n },\n },\n\n '.cm-tooltip.cm-completionInfo': {\n backgroundColor: '#d6ebff',\n },\n\n '.cm-tooltip > .cm-completionInfo.cm-completionInfo-right': {\n '&:before': {\n borderRightColor: '#d6ebff',\n },\n },\n '.cm-tooltip > .cm-completionInfo.cm-completionInfo-left': {\n '&:before': {\n borderLeftColor: '#d6ebff',\n },\n },\n\n '.cm-line': {\n '&::selection': {\n backgroundColor: '#add6ff',\n },\n '& > span::selection': {\n backgroundColor: '#add6ff',\n },\n },\n },\n { dark: false }\n);\n\nexport const darkTheme = EditorView.theme(\n {\n '.cm-content': {\n caretColor: '#fff',\n },\n\n '.cm-tooltip.cm-completionInfo': {\n backgroundColor: '#333338',\n },\n\n '.cm-tooltip > .cm-completionInfo.cm-completionInfo-right': {\n '&:before': {\n borderRightColor: '#333338',\n },\n },\n '.cm-tooltip > .cm-completionInfo.cm-completionInfo-left': {\n '&:before': {\n borderLeftColor: '#333338',\n },\n },\n\n '.cm-line': {\n '&::selection': {\n backgroundColor: '#767676',\n },\n '& > span::selection': {\n backgroundColor: '#767676',\n },\n },\n },\n { dark: true }\n);\n\nexport const promqlHighlighter = HighlightStyle.define([\n { tag: tags.name, color: '#000' },\n { tag: tags.number, color: '#09885a' },\n { tag: tags.string, color: '#a31515' },\n { tag: tags.keyword, color: '#008080' },\n { tag: tags.function(tags.variableName), color: '#008080' },\n { tag: tags.labelName, color: '#800000' },\n { tag: tags.operator },\n { tag: tags.modifier, color: '#008080' },\n { tag: tags.paren },\n { tag: tags.squareBracket },\n { tag: tags.brace },\n { tag: tags.invalid, color: 'red' },\n { tag: tags.comment, color: '#888', fontStyle: 'italic' },\n]);\n","import React, { Component, ChangeEvent } from 'react';\nimport { Modal, ModalBody, ModalHeader, Input } from 'reactstrap';\nimport { Fuzzy, FuzzyResult } from '@nexucis/fuzzy';\n\nconst fuz = new Fuzzy({ pre: '', post: '', shouldSort: true });\n\ninterface MetricsExplorerProps {\n show: boolean;\n updateShow(show: boolean): void;\n metrics: string[];\n insertAtCursor(value: string): void;\n}\n\ntype MetricsExplorerState = {\n searchTerm: string;\n};\n\nclass MetricsExplorer extends Component {\n constructor(props: MetricsExplorerProps) {\n super(props);\n this.state = { searchTerm: '' };\n }\n handleSearchTerm = (event: ChangeEvent): void => {\n this.setState({ searchTerm: event.target.value });\n };\n handleMetricClick = (query: string): void => {\n this.props.insertAtCursor(query);\n this.props.updateShow(false);\n this.setState({ searchTerm: '' });\n };\n\n toggle = (): void => {\n this.props.updateShow(!this.props.show);\n };\n render(): JSX.Element {\n return (\n \n Metrics Explorer\n \n \n {this.state.searchTerm.length > 0 &&\n fuz\n .filter(this.state.searchTerm, this.props.metrics)\n .map((result: FuzzyResult) => (\n

\n ))}\n {this.state.searchTerm.length === 0 &&\n this.props.metrics.map((metric) => (\n

\n {metric}\n

\n ))}\n
\n
\n );\n }\n}\n\nexport default MetricsExplorer;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Eql = exports.Sub = exports.Add = exports.Mod = exports.Div = exports.Mul = exports.OnOrIgnoring = exports.BinModifiers = exports.Pow = exports.BinaryExpr = exports.FunctionCallArgs = exports.FunctionCallBody = exports.LabelName = exports.GroupingLabel = exports.GroupingLabelList = exports.GroupingLabels = exports.AggregateModifier = exports.AggregateOp = exports.AggregateExpr = exports.Expr = exports.PromQL = exports.LineComment = exports.End = exports.Start = exports.Unless = exports.Or = exports.And = exports.Without = exports.By = exports.Topk = exports.Sum = exports.Stdvar = exports.Stddev = exports.Quantile = exports.Min = exports.Max = exports.Group = exports.CountValues = exports.Count = exports.Bottomk = exports.Avg = exports.Atan2 = exports.Offset = exports.GroupRight = exports.GroupLeft = exports.On = exports.Ignoring = exports.Bool = exports.nan = exports.inf = void 0;\nexports.Month = exports.Minute = exports.MinOverTime = exports.MaxOverTime = exports.Log2 = exports.Log10 = exports.Ln = exports.LastOverTime = exports.LabelJoin = exports.LabelReplace = exports.Irate = exports.Increase = exports.Idelta = exports.Hour = exports.HoltWinters = exports.HistogramQuantile = exports.Floor = exports.Exp = exports.Deriv = exports.Delta = exports.Deg = exports.DayOfWeek = exports.DayOfMonth = exports.DaysInMonth = exports.CountOverTime = exports.Cosh = exports.Cos = exports.ClampMin = exports.ClampMax = exports.Clamp = exports.Changes = exports.Ceil = exports.AvgOverTime = exports.Atanh = exports.Atan = exports.Asinh = exports.Asin = exports.Acosh = exports.Acos = exports.Abs = exports.Absent = exports.Identifier = exports.AbsentOverTime = exports.FunctionIdentifier = exports.FunctionCall = exports.Neq = exports.Lss = exports.Lte = exports.Gtr = exports.Gte = void 0;\nexports.MetricName = exports.AtModifierPreprocessors = exports.At = exports.StepInvariantExpr = exports.NeqRegex = exports.EqlRegex = exports.EqlSingle = exports.MatchOp = exports.LabelMatcher = exports.LabelMatchList = exports.LabelMatchers = exports.MetricIdentifier = exports.VectorSelector = exports.UnaryOp = exports.UnaryExpr = exports.SubqueryExpr = exports.StringLiteral = exports.ParenExpr = exports.OffsetExpr = exports.NumberLiteral = exports.Duration = exports.MatrixSelector = exports.Year = exports.Vector = exports.Time = exports.Timestamp = exports.Tanh = exports.Tan = exports.SumOverTime = exports.StdvarOverTime = exports.StddevOverTime = exports.Sqrt = exports.SortDesc = exports.Sort = exports.Sinh = exports.Sin = exports.Sgn = exports.Scalar = exports.Round = exports.Resets = exports.Rate = exports.Rad = exports.QuantileOverTime = exports.PresentOverTime = exports.PredictLinear = exports.Pi = void 0;\n// This file was generated by lezer-generator. You probably shouldn't edit it.\nexports.inf = 146, exports.nan = 147, exports.Bool = 1, exports.Ignoring = 2, exports.On = 3, exports.GroupLeft = 4, exports.GroupRight = 5, exports.Offset = 6, exports.Atan2 = 7, exports.Avg = 8, exports.Bottomk = 9, exports.Count = 10, exports.CountValues = 11, exports.Group = 12, exports.Max = 13, exports.Min = 14, exports.Quantile = 15, exports.Stddev = 16, exports.Stdvar = 17, exports.Sum = 18, exports.Topk = 19, exports.By = 20, exports.Without = 21, exports.And = 22, exports.Or = 23, exports.Unless = 24, exports.Start = 25, exports.End = 26, exports.LineComment = 27, exports.PromQL = 28, exports.Expr = 29, exports.AggregateExpr = 30, exports.AggregateOp = 31, exports.AggregateModifier = 32, exports.GroupingLabels = 33, exports.GroupingLabelList = 34, exports.GroupingLabel = 35, exports.LabelName = 36, exports.FunctionCallBody = 37, exports.FunctionCallArgs = 38, exports.BinaryExpr = 39, exports.Pow = 40, exports.BinModifiers = 41, exports.OnOrIgnoring = 42, exports.Mul = 43, exports.Div = 44, exports.Mod = 45, exports.Add = 46, exports.Sub = 47, exports.Eql = 48, exports.Gte = 49, exports.Gtr = 50, exports.Lte = 51, exports.Lss = 52, exports.Neq = 53, exports.FunctionCall = 54, exports.FunctionIdentifier = 55, exports.AbsentOverTime = 56, exports.Identifier = 57, exports.Absent = 58, exports.Abs = 59, exports.Acos = 60, exports.Acosh = 61, exports.Asin = 62, exports.Asinh = 63, exports.Atan = 64, exports.Atanh = 65, exports.AvgOverTime = 66, exports.Ceil = 67, exports.Changes = 68, exports.Clamp = 69, exports.ClampMax = 70, exports.ClampMin = 71, exports.Cos = 72, exports.Cosh = 73, exports.CountOverTime = 74, exports.DaysInMonth = 75, exports.DayOfMonth = 76, exports.DayOfWeek = 77, exports.Deg = 78, exports.Delta = 79, exports.Deriv = 80, exports.Exp = 81, exports.Floor = 82, exports.HistogramQuantile = 83, exports.HoltWinters = 84, exports.Hour = 85, exports.Idelta = 86, exports.Increase = 87, exports.Irate = 88, exports.LabelReplace = 89, exports.LabelJoin = 90, exports.LastOverTime = 91, exports.Ln = 92, exports.Log10 = 93, exports.Log2 = 94, exports.MaxOverTime = 95, exports.MinOverTime = 96, exports.Minute = 97, exports.Month = 98, exports.Pi = 99, exports.PredictLinear = 100, exports.PresentOverTime = 101, exports.QuantileOverTime = 102, exports.Rad = 103, exports.Rate = 104, exports.Resets = 105, exports.Round = 106, exports.Scalar = 107, exports.Sgn = 108, exports.Sin = 109, exports.Sinh = 110, exports.Sort = 111, exports.SortDesc = 112, exports.Sqrt = 113, exports.StddevOverTime = 114, exports.StdvarOverTime = 115, exports.SumOverTime = 116, exports.Tan = 117, exports.Tanh = 118, exports.Timestamp = 119, exports.Time = 120, exports.Vector = 121, exports.Year = 122, exports.MatrixSelector = 123, exports.Duration = 124, exports.NumberLiteral = 125, exports.OffsetExpr = 126, exports.ParenExpr = 127, exports.StringLiteral = 128, exports.SubqueryExpr = 129, exports.UnaryExpr = 130, exports.UnaryOp = 131, exports.VectorSelector = 132, exports.MetricIdentifier = 133, exports.LabelMatchers = 134, exports.LabelMatchList = 135, exports.LabelMatcher = 136, exports.MatchOp = 137, exports.EqlSingle = 138, exports.EqlRegex = 139, exports.NeqRegex = 140, exports.StepInvariantExpr = 141, exports.At = 142, exports.AtModifierPreprocessors = 143, exports.MetricName = 144;\n//# sourceMappingURL=parser.terms.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { And, Avg, Atan2, Bool, Bottomk, By, Count, CountValues, End, Group, GroupLeft, GroupRight, Ignoring, inf, Max, Min, nan, Offset, On, Or, Quantile, Start, Stddev, Stdvar, Sum, Topk, Unless, Without, } from './parser.terms.js';\nconst keywordTokens = {\n inf: inf,\n nan: nan,\n bool: Bool,\n ignoring: Ignoring,\n on: On,\n group_left: GroupLeft,\n group_right: GroupRight,\n offset: Offset,\n};\nexport const specializeIdentifier = (value, stack) => {\n return keywordTokens[value.toLowerCase()] || -1;\n};\nconst contextualKeywordTokens = {\n avg: Avg,\n atan2: Atan2,\n bottomk: Bottomk,\n count: Count,\n count_values: CountValues,\n group: Group,\n max: Max,\n min: Min,\n quantile: Quantile,\n stddev: Stddev,\n stdvar: Stdvar,\n sum: Sum,\n topk: Topk,\n by: By,\n without: Without,\n and: And,\n or: Or,\n unless: Unless,\n start: Start,\n end: End,\n};\nexport const extendIdentifier = (value, stack) => {\n return contextualKeywordTokens[value.toLowerCase()] || -1;\n};\n//# sourceMappingURL=tokens.js.map","// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport { LRParser } from \"@lezer/lr\";\nimport { specializeIdentifier, extendIdentifier } from \"./tokens\";\nconst spec_Identifier = { __proto__: null, absent_over_time: 307, absent: 309, abs: 311, acos: 313, acosh: 315, asin: 317, asinh: 319, atan: 321, atanh: 323, avg_over_time: 325, ceil: 327, changes: 329, clamp: 331, clamp_max: 333, clamp_min: 335, cos: 337, cosh: 339, count_over_time: 341, days_in_month: 343, day_of_month: 345, day_of_week: 347, deg: 349, delta: 351, deriv: 353, exp: 355, floor: 357, histogram_quantile: 359, holt_winters: 361, hour: 363, idelta: 365, increase: 367, irate: 369, label_replace: 371, label_join: 373, last_over_time: 375, ln: 377, log10: 379, log2: 381, max_over_time: 383, min_over_time: 385, minute: 387, month: 389, pi: 391, predict_linear: 393, present_over_time: 395, quantile_over_time: 397, rad: 399, rate: 401, resets: 403, round: 405, scalar: 407, sgn: 409, sin: 411, sinh: 413, sort: 415, sort_desc: 417, sqrt: 419, stddev_over_time: 421, stdvar_over_time: 423, sum_over_time: 425, tan: 427, tanh: 429, timestamp: 431, time: 433, vector: 435, year: 437 };\nexport const parser = LRParser.deserialize({\n version: 13,\n states: \"6[OYQPOOO&{QPOOOOQO'#C{'#C{O'QQPO'#CzQ']QQOOOOQO'#De'#DeO'WQPO'#DdOOQO'#E}'#E}O(jQPO'#FTOYQPO'#FPOYQPO'#FSOOQO'#FV'#FVO.fQSO'#FWO.nQQO'#FUOOQO'#FU'#FUOOQO'#Cy'#CyOOQO'#Df'#DfOOQO'#Dh'#DhOOQO'#Di'#DiOOQO'#Dj'#DjOOQO'#Dk'#DkOOQO'#Dl'#DlOOQO'#Dm'#DmOOQO'#Dn'#DnOOQO'#Do'#DoOOQO'#Dp'#DpOOQO'#Dq'#DqOOQO'#Dr'#DrOOQO'#Ds'#DsOOQO'#Dt'#DtOOQO'#Du'#DuOOQO'#Dv'#DvOOQO'#Dw'#DwOOQO'#Dx'#DxOOQO'#Dy'#DyOOQO'#Dz'#DzOOQO'#D{'#D{OOQO'#D|'#D|OOQO'#D}'#D}OOQO'#EO'#EOOOQO'#EP'#EPOOQO'#EQ'#EQOOQO'#ER'#EROOQO'#ES'#ESOOQO'#ET'#ETOOQO'#EU'#EUOOQO'#EV'#EVOOQO'#EW'#EWOOQO'#EX'#EXOOQO'#EY'#EYOOQO'#EZ'#EZOOQO'#E['#E[OOQO'#E]'#E]OOQO'#E^'#E^OOQO'#E_'#E_OOQO'#E`'#E`OOQO'#Ea'#EaOOQO'#Eb'#EbOOQO'#Ec'#EcOOQO'#Ed'#EdOOQO'#Ee'#EeOOQO'#Ef'#EfOOQO'#Eg'#EgOOQO'#Eh'#EhOOQO'#Ei'#EiOOQO'#Ej'#EjOOQO'#Ek'#EkOOQO'#El'#ElOOQO'#Em'#EmOOQO'#En'#EnOOQO'#Eo'#EoOOQO'#Ep'#EpOOQO'#Eq'#EqOOQO'#Er'#ErOOQO'#Es'#EsOOQO'#Et'#EtOOQO'#Eu'#EuOOQO'#Ev'#EvOOQO'#Ew'#EwOOQO'#Ex'#ExOOQO'#Ey'#EyOOQO'#Ez'#EzQOQPOOO0XQPO'#C|O0^QPO'#DRO'WQPO,59fO0eQQO,59fO2RQPO,59oO2RQPO,59oO2RQPO,59oO2RQPO,59oO2RQPO,59oO7}QQO,5;gO8SQQO,5;jO8[QPO,5;yOOQO,5:O,5:OOOQO,5;i,5;iO8sQQO,5;kO8zQQO,5;nO:bQPO'#FYO:pQPO,5;rOOQO'#FX'#FXOOQO,5;r,5;rOOQO,5;p,5;pO:xQSO'#C}OOQO,59h,59hO;QQPO,59mO;YQQO'#DSOOQO,59m,59mOOQO1G/Q1G/QO0XQPO'#DWOAVQPO'#DVOAaQPO'#DVOYQPO1G/ZOYQPO1G/ZOYQPO1G/ZOYQPO1G/ZOYQPO1G/ZOAkQSO1G1ROOQO1G1U1G1UOAsQQO1G1UOAxQPO'#E}OOQO'#Fa'#FaOOQO1G1e1G1eOBTQPO1G1eOOQO1G1V1G1VOOQO'#FZ'#FZOBYQPO,5;tOB_QSO1G1^OOQO1G1^1G1^OOQO'#DP'#DPOBgQPO,59iOOQO'#DO'#DOOOQO,59i,59iOYQPO,59nOOQO1G/X1G/XOOQO,59r,59rOH_QPO,59qOHfQPO,59qOI}QQO7+$uOJ_QQO7+$uOKsQQO7+$uOLZQQO7+$uOMrQQO7+$uOOQO7+&m7+&mON]QQO7+&sOOQO7+&p7+&pONeQPO7+'POOQO1G1`1G1`OOQO1G1_1G1_OOQO7+&x7+&xONjQSO1G/TOOQO1G/T1G/TONrQQO1G/YOOQO1G/]1G/]ON|QPO1G/]OOQO< (specializeIdentifier(value, stack) << 1) }, { term: 57, get: (value, stack) => (extendIdentifier(value, stack) << 1) | 1 }, { term: 57, get: value => spec_Identifier[value] || -1 }],\n tokenPrec: 0\n});\n//# sourceMappingURL=parser.js.map","\"use strict\";\n// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.retrieveAllRecursiveNodes = exports.containsChild = exports.containsAtLeastOneChild = exports.walkThrough = exports.walkBackward = void 0;\n// walkBackward will iterate other the tree from the leaf to the root until it founds the given `exit` node.\n// It returns null if the exit is not found.\nfunction walkBackward(node, exit) {\n var cursor = node.cursor;\n var cursorIsMoving = true;\n while (cursorIsMoving && cursor.type.id !== exit) {\n cursorIsMoving = cursor.parent();\n }\n return cursor.type.id === exit ? cursor.node : null;\n}\nexports.walkBackward = walkBackward;\n// walkThrough is going to follow the path passed in parameter.\n// If it succeeds to reach the last id/name of the path, then it will return the corresponding Subtree.\n// Otherwise if it's not possible to reach the last id/name of the path, it will return `null`\n// Note: the way followed during the iteration of the tree to find the given path, is only from the root to the leaf.\nfunction walkThrough(node) {\n var path = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n path[_i - 1] = arguments[_i];\n }\n var cursor = node.cursor;\n var i = 0;\n var cursorIsMoving = true;\n path.unshift(cursor.type.id);\n while (i < path.length && cursorIsMoving) {\n if (cursor.type.id === path[i] || cursor.type.name === path[i]) {\n i++;\n if (i < path.length) {\n cursorIsMoving = cursor.next();\n }\n }\n else {\n cursorIsMoving = cursor.nextSibling();\n }\n }\n if (i >= path.length) {\n return cursor.node;\n }\n return null;\n}\nexports.walkThrough = walkThrough;\nfunction containsAtLeastOneChild(node) {\n var child = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n child[_i - 1] = arguments[_i];\n }\n var cursor = node.cursor;\n if (!cursor.next()) {\n // let's try to move directly to the children level and\n // return false immediately if the current node doesn't have any child\n return false;\n }\n var result = false;\n do {\n result = child.some(function (n) { return cursor.type.id === n || cursor.type.name === n; });\n } while (!result && cursor.nextSibling());\n return result;\n}\nexports.containsAtLeastOneChild = containsAtLeastOneChild;\nfunction containsChild(node) {\n var child = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n child[_i - 1] = arguments[_i];\n }\n var cursor = node.cursor;\n if (!cursor.next()) {\n // let's try to move directly to the children level and\n // return false immediately if the current node doesn't have any child\n return false;\n }\n var i = 0;\n do {\n if (cursor.type.id === child[i] || cursor.type.name === child[i]) {\n i++;\n }\n } while (i < child.length && cursor.nextSibling());\n return i >= child.length;\n}\nexports.containsChild = containsChild;\nfunction retrieveAllRecursiveNodes(parentNode, recursiveNode, leaf) {\n var nodes = [];\n function recursiveRetrieveNode(node, nodes) {\n var subNode = node === null || node === void 0 ? void 0 : node.getChild(recursiveNode);\n var le = node === null || node === void 0 ? void 0 : node.lastChild;\n if (subNode && subNode.type.id === recursiveNode) {\n recursiveRetrieveNode(subNode, nodes);\n }\n if (le && le.type.id === leaf) {\n nodes.push(le);\n }\n }\n recursiveRetrieveNode(parentNode, nodes);\n return nodes;\n}\nexports.retrieveAllRecursiveNodes = retrieveAllRecursiveNodes;\n//# sourceMappingURL=path-finder.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { Parser } from '../parser';\n// HybridLint will provide a promQL linter with static analysis\nexport class HybridLint {\n promQL() {\n return (view) => {\n const parser = new Parser(view.state);\n parser.analyze();\n return parser.getDiagnostics();\n };\n }\n}\n//# sourceMappingURL=hybrid.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { parser } from './grammar/parser';\nimport { styleTags, tags } from '@codemirror/highlight';\nimport { newCompleteStrategy } from './complete';\nimport { newLintStrategy, promQLLinter } from './lint';\nimport { LRLanguage } from '@codemirror/language';\nexport var LanguageType;\n(function (LanguageType) {\n LanguageType[\"PromQL\"] = \"PromQL\";\n LanguageType[\"MetricName\"] = \"MetricName\";\n})(LanguageType || (LanguageType = {}));\nexport function promQLLanguage(top) {\n return LRLanguage.define({\n parser: parser.configure({\n top: top,\n props: [\n styleTags({\n LineComment: tags.comment,\n LabelName: tags.labelName,\n StringLiteral: tags.string,\n NumberLiteral: tags.number,\n Duration: tags.number,\n 'Abs Absent AbsentOverTime Acos Acosh Asin Asinh Atan Atanh AvgOverTime Ceil Changes Clamp ClampMax ClampMin Cos Cosh CountOverTime DaysInMonth DayOfMonth DayOfWeek Deg Delta Deriv Exp Floor HistogramQuantile HoltWinters Hour Idelta Increase Irate LabelReplace LabelJoin LastOverTime Ln Log10 Log2 MaxOverTime MinOverTime Minute Month Pi PredictLinear PresentOverTime QuantileOverTime Rad Rate Resets Round Scalar Sgn Sin Sinh Sort SortDesc Sqrt StddevOverTime StdvarOverTime SumOverTime Tan Tanh Time Timestamp Vector Year': tags.function(tags.variableName),\n 'Avg Bottomk Count Count_values Group Max Min Quantile Stddev Stdvar Sum Topk': tags.operatorKeyword,\n 'By Without Bool On Ignoring GroupLeft GroupRight Offset Start End': tags.modifier,\n 'And Unless Or': tags.logicOperator,\n 'Sub Add Mul Mod Div Atan2 Eql Neq Lte Lss Gte Gtr EqlRegex EqlSingle NeqRegex Pow At': tags.operator,\n UnaryOp: tags.arithmeticOperator,\n '( )': tags.paren,\n '[ ]': tags.squareBracket,\n '{ }': tags.brace,\n '⚠': tags.invalid,\n }),\n ],\n }),\n languageData: {\n closeBrackets: { brackets: ['(', '[', '{', \"'\", '\"', '`'] },\n commentTokens: { line: '#' },\n },\n });\n}\n/**\n * This class holds the state of the completion extension for CodeMirror and allow hot-swapping the complete strategy.\n */\nexport class PromQLExtension {\n constructor() {\n this.complete = newCompleteStrategy();\n this.lint = newLintStrategy();\n this.enableLinter = true;\n this.enableCompletion = true;\n }\n setComplete(conf) {\n this.complete = newCompleteStrategy(conf);\n return this;\n }\n getComplete() {\n return this.complete;\n }\n activateCompletion(activate) {\n this.enableCompletion = activate;\n return this;\n }\n setLinter(linter) {\n this.lint = linter;\n return this;\n }\n getLinter() {\n return this.lint;\n }\n activateLinter(activate) {\n this.enableLinter = activate;\n return this;\n }\n asExtension(languageType = LanguageType.PromQL) {\n const language = promQLLanguage(languageType);\n let extension = [language];\n if (this.enableCompletion) {\n const completion = language.data.of({\n autocomplete: (context) => {\n return this.complete.promQL(context);\n },\n });\n extension = extension.concat(completion);\n }\n if (this.enableLinter) {\n extension = extension.concat(promQLLinter(this.lint.promQL, this.lint));\n }\n return extension;\n }\n}\n//# sourceMappingURL=promql.js.map","// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { linter } from '@codemirror/lint';\nimport { HybridLint } from './hybrid';\nexport function newLintStrategy() {\n return new HybridLint();\n}\nexport function promQLLinter(callbackFunc, thisArg) {\n return linter(callbackFunc.call(thisArg));\n}\n//# sourceMappingURL=index.js.map","import React, { FC, useState, useEffect, useRef } from 'react';\nimport { Button, InputGroup, InputGroupAddon, InputGroupText } from 'reactstrap';\n\nimport { EditorView, highlightSpecialChars, keymap, ViewUpdate, placeholder } from '@codemirror/view';\nimport { EditorState, Prec, Compartment } from '@codemirror/state';\nimport { indentOnInput, syntaxTree } from '@codemirror/language';\nimport { history, historyKeymap } from '@codemirror/history';\nimport { defaultKeymap, insertNewlineAndIndent } from '@codemirror/commands';\nimport { bracketMatching } from '@codemirror/matchbrackets';\nimport { closeBrackets, closeBracketsKeymap } from '@codemirror/closebrackets';\nimport { highlightSelectionMatches } from '@codemirror/search';\nimport { commentKeymap } from '@codemirror/comment';\nimport { lintKeymap } from '@codemirror/lint';\nimport { autocompletion, completionKeymap, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport { baseTheme, lightTheme, darkTheme, promqlHighlighter } from './CMTheme';\n\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faSearch, faSpinner, faGlobeEurope } from '@fortawesome/free-solid-svg-icons';\nimport MetricsExplorer from './MetricsExplorer';\nimport { usePathPrefix } from '../../contexts/PathPrefixContext';\nimport { useTheme } from '../../contexts/ThemeContext';\nimport { CompleteStrategy, PromQLExtension } from 'codemirror-promql';\nimport { newCompleteStrategy } from 'codemirror-promql/dist/cjs/complete';\n\nconst promqlExtension = new PromQLExtension();\n\ninterface CMExpressionInputProps {\n value: string;\n onExpressionChange: (expr: string) => void;\n queryHistory: string[];\n metricNames: string[];\n executeQuery: () => void;\n loading: boolean;\n enableAutocomplete: boolean;\n enableHighlighting: boolean;\n enableLinter: boolean;\n}\n\nconst dynamicConfigCompartment = new Compartment();\n\n// Autocompletion strategy that wraps the main one and enriches\n// it with past query items.\nexport class HistoryCompleteStrategy implements CompleteStrategy {\n private complete: CompleteStrategy;\n private queryHistory: string[];\n constructor(complete: CompleteStrategy, queryHistory: string[]) {\n this.complete = complete;\n this.queryHistory = queryHistory;\n }\n\n promQL(context: CompletionContext): Promise | CompletionResult | null {\n return Promise.resolve(this.complete.promQL(context)).then((res) => {\n const { state, pos } = context;\n const tree = syntaxTree(state).resolve(pos, -1);\n const start = res != null ? res.from : tree.from;\n\n if (start !== 0) {\n return res;\n }\n\n const historyItems: CompletionResult = {\n from: start,\n to: pos,\n options: this.queryHistory.map((q) => ({\n label: q.length < 80 ? q : q.slice(0, 76).concat('...'),\n detail: 'past query',\n apply: q,\n info: q.length < 80 ? undefined : q,\n })),\n span: /^[a-zA-Z0-9_:]+$/,\n };\n\n if (res !== null) {\n historyItems.options = historyItems.options.concat(res.options);\n }\n return historyItems;\n });\n }\n}\n\nconst ExpressionInput: FC = ({\n value,\n onExpressionChange,\n queryHistory,\n metricNames,\n executeQuery,\n loading,\n enableAutocomplete,\n enableHighlighting,\n enableLinter,\n}) => {\n const containerRef = useRef(null);\n const viewRef = useRef(null);\n const [showMetricsExplorer, setShowMetricsExplorer] = useState(false);\n const pathPrefix = usePathPrefix();\n const { theme } = useTheme();\n\n // (Re)initialize editor based on settings / setting changes.\n useEffect(() => {\n // Build the dynamic part of the config.\n promqlExtension\n .activateCompletion(enableAutocomplete)\n .activateLinter(enableLinter)\n .setComplete({\n completeStrategy: new HistoryCompleteStrategy(\n newCompleteStrategy({\n remote: { url: pathPrefix, cache: { initialMetricList: metricNames } },\n }),\n queryHistory\n ),\n });\n const dynamicConfig = [\n enableHighlighting ? promqlHighlighter : [],\n promqlExtension.asExtension(),\n theme === 'dark' ? darkTheme : lightTheme,\n ];\n\n // Create or reconfigure the editor.\n const view = viewRef.current;\n if (view === null) {\n // If the editor does not exist yet, create it.\n if (!containerRef.current) {\n throw new Error('expected CodeMirror container element to exist');\n }\n\n const startState = EditorState.create({\n doc: value,\n extensions: [\n baseTheme,\n highlightSpecialChars(),\n history(),\n EditorState.allowMultipleSelections.of(true),\n indentOnInput(),\n bracketMatching(),\n closeBrackets(),\n autocompletion(),\n highlightSelectionMatches(),\n EditorView.lineWrapping,\n keymap.of([\n ...closeBracketsKeymap,\n ...defaultKeymap,\n ...historyKeymap,\n ...commentKeymap,\n ...completionKeymap,\n ...lintKeymap,\n ]),\n placeholder('Expression (press Shift+Enter for newlines)'),\n dynamicConfigCompartment.of(dynamicConfig),\n // This keymap is added without precedence so that closing the autocomplete dropdown\n // via Escape works without blurring the editor.\n keymap.of([\n {\n key: 'Escape',\n run: (v: EditorView): boolean => {\n v.contentDOM.blur();\n return false;\n },\n },\n ]),\n Prec.override(\n keymap.of([\n {\n key: 'Enter',\n run: (v: EditorView): boolean => {\n executeQuery();\n return true;\n },\n },\n {\n key: 'Shift-Enter',\n run: insertNewlineAndIndent,\n },\n ])\n ),\n EditorView.updateListener.of((update: ViewUpdate): void => {\n onExpressionChange(update.state.doc.toString());\n }),\n ],\n });\n\n const view = new EditorView({\n state: startState,\n parent: containerRef.current,\n });\n\n viewRef.current = view;\n\n view.focus();\n } else {\n // The editor already exists, just reconfigure the dynamically configured parts.\n view.dispatch(\n view.state.update({\n effects: dynamicConfigCompartment.reconfigure(dynamicConfig),\n })\n );\n }\n // \"value\" is only used in the initial render, so we don't want to\n // re-run this effect every time that \"value\" changes.\n //\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enableAutocomplete, enableHighlighting, enableLinter, executeQuery, onExpressionChange, queryHistory, theme]);\n\n const insertAtCursor = (value: string) => {\n const view = viewRef.current;\n if (view === null) {\n return;\n }\n const { from, to } = view.state.selection.ranges[0];\n view.dispatch(\n view.state.update({\n changes: { from, to, insert: value },\n })\n );\n };\n\n return (\n <>\n \n \n \n {loading ? : }\n \n \n
\n \n setShowMetricsExplorer(true)}\n >\n \n \n \n \n \n\n \n \n );\n};\n\nexport default ExpressionInput;\n","import $ from 'jquery';\nimport React, { Component } from 'react';\nimport { Button, Input, InputGroup, InputGroupAddon } from 'reactstrap';\n\nimport moment from 'moment-timezone';\n\nimport 'tempusdominus-core';\nimport 'tempusdominus-bootstrap-4';\nimport 'tempusdominus-bootstrap-4/build/css/tempusdominus-bootstrap-4.min.css';\n\nimport { dom, library } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faArrowDown,\n faArrowUp,\n faCalendarCheck,\n faChevronLeft,\n faChevronRight,\n faTimes,\n} from '@fortawesome/free-solid-svg-icons';\n\nlibrary.add(faChevronLeft, faChevronRight, faCalendarCheck, faArrowUp, faArrowDown, faTimes);\n// Sadly needed to also replace within the date picker, since it's not a React component.\ndom.watch();\n\ninterface TimeInputProps {\n time: number | null; // Timestamp in milliseconds.\n useLocalTime: boolean;\n range: number; // Range in seconds.\n placeholder: string;\n onChangeTime: (time: number | null) => void;\n}\n\nclass TimeInput extends Component {\n private timeInputRef = React.createRef();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private $time: any = null;\n\n getBaseTime = (): number => {\n return this.props.time || moment().valueOf();\n };\n\n calcShiftRange = (): number => this.props.range / 2;\n\n increaseTime = (): void => {\n const time = this.getBaseTime() + this.calcShiftRange();\n this.props.onChangeTime(time);\n };\n\n decreaseTime = (): void => {\n const time = this.getBaseTime() - this.calcShiftRange();\n this.props.onChangeTime(time);\n };\n\n clearTime = (): void => {\n this.props.onChangeTime(null);\n };\n\n timezone = (): string => {\n return this.props.useLocalTime ? moment.tz.guess() : 'UTC';\n };\n\n componentDidMount(): void {\n if (!this.timeInputRef.current) {\n return;\n }\n this.$time = $(this.timeInputRef.current);\n\n this.$time.datetimepicker({\n icons: {\n today: 'fas fa-calendar-check',\n },\n buttons: {\n //showClear: true,\n showClose: true,\n showToday: true,\n },\n sideBySide: true,\n format: 'YYYY-MM-DD HH:mm:ss',\n locale: 'en',\n timeZone: this.timezone(),\n defaultDate: this.props.time,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.$time.on('change.datetimepicker', (e: any) => {\n // The end time can also be set by dragging a section on the graph,\n // and that value will have decimal places.\n if (e.date && e.date.valueOf() !== Math.trunc(this.props.time?.valueOf() || NaN)) {\n this.props.onChangeTime(e.date.valueOf());\n }\n });\n }\n\n componentWillUnmount(): void {\n this.$time.datetimepicker('destroy');\n }\n\n componentDidUpdate(prevProps: TimeInputProps): void {\n const { time, useLocalTime } = this.props;\n if (prevProps.time !== time) {\n this.$time.datetimepicker('date', time ? moment(time) : null);\n }\n if (prevProps.useLocalTime !== useLocalTime) {\n this.$time.datetimepicker('options', { timeZone: this.timezone(), defaultDate: null });\n }\n }\n\n render(): JSX.Element {\n return (\n \n \n \n \n\n this.$time.datetimepicker('show')}\n onBlur={() => this.$time.datetimepicker('hide')}\n onKeyDown={(e) => ['Escape', 'Enter'].includes(e.key) && this.$time.datetimepicker('hide')}\n />\n\n {/* CAUTION: While the datetimepicker also has an option to show a 'clear' button,\n that functionality is broken, so we create an external solution instead. */}\n {this.props.time && (\n \n \n \n )}\n\n \n \n \n \n );\n }\n}\n\nexport default TimeInput;\n","import React, { Component } from 'react';\nimport { Button, ButtonGroup, Form, Input, InputGroup, InputGroupAddon } from 'reactstrap';\n\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faChartArea, faChartLine, faMinus, faPlus } from '@fortawesome/free-solid-svg-icons';\nimport TimeInput from './TimeInput';\nimport { formatDuration, parseDuration } from '../../utils';\n\ninterface GraphControlsProps {\n range: number;\n endTime: number | null;\n useLocalTime: boolean;\n resolution: number | null;\n stacked: boolean;\n showExemplars: boolean;\n\n onChangeRange: (range: number) => void;\n onChangeEndTime: (endTime: number | null) => void;\n onChangeResolution: (resolution: number | null) => void;\n onChangeStacking: (stacked: boolean) => void;\n onChangeShowExemplars: (show: boolean) => void;\n}\n\nclass GraphControls extends Component {\n private rangeRef = React.createRef();\n private resolutionRef = React.createRef();\n\n rangeSteps = [\n 1,\n 10,\n 60,\n 5 * 60,\n 15 * 60,\n 30 * 60,\n 60 * 60,\n 2 * 60 * 60,\n 6 * 60 * 60,\n 12 * 60 * 60,\n 24 * 60 * 60,\n 48 * 60 * 60,\n 7 * 24 * 60 * 60,\n 14 * 24 * 60 * 60,\n 28 * 24 * 60 * 60,\n 56 * 24 * 60 * 60,\n 112 * 24 * 60 * 60,\n 182 * 24 * 60 * 60,\n 365 * 24 * 60 * 60,\n 730 * 24 * 60 * 60,\n ].map((s) => s * 1000);\n\n onChangeRangeInput = (rangeText: string): void => {\n const range = parseDuration(rangeText);\n if (range === null) {\n this.changeRangeInput(this.props.range);\n } else {\n this.props.onChangeRange(range);\n }\n };\n\n changeRangeInput = (range: number): void => {\n this.setCurrentRangeValue(formatDuration(range));\n };\n\n increaseRange = (): void => {\n for (const range of this.rangeSteps) {\n if (this.props.range < range) {\n this.changeRangeInput(range);\n this.props.onChangeRange(range);\n return;\n }\n }\n };\n\n decreaseRange = (): void => {\n for (const range of this.rangeSteps.slice().reverse()) {\n if (this.props.range > range) {\n this.changeRangeInput(range);\n this.props.onChangeRange(range);\n return;\n }\n }\n };\n\n componentDidUpdate(prevProps: GraphControlsProps): void {\n if (prevProps.range !== this.props.range) {\n this.changeRangeInput(this.props.range);\n }\n if (prevProps.resolution !== this.props.resolution) {\n this.setCurrentRangeValue(this.props.resolution !== null ? this.props.resolution.toString() : '');\n }\n }\n\n setCurrentRangeValue(value: string): void {\n if (this.rangeRef.current) {\n this.rangeRef.current.value = value;\n }\n }\n\n render(): JSX.Element {\n return (\n
e.preventDefault()}>\n \n \n \n \n\n {\n if (this.rangeRef.current) {\n this.onChangeRangeInput(this.rangeRef.current.value);\n }\n }}\n onKeyDown={(e: React.KeyboardEvent) =>\n e.key === 'Enter' && this.rangeRef.current && this.onChangeRangeInput(this.rangeRef.current.value)\n }\n />\n\n \n \n \n \n\n \n\n {\n if (this.resolutionRef.current) {\n const res = parseInt(this.resolutionRef.current.value);\n this.props.onChangeResolution(res ? res : null);\n }\n }}\n bsSize=\"sm\"\n />\n\n \n this.props.onChangeStacking(false)}\n active={!this.props.stacked}\n >\n \n \n \n \n\n \n {this.props.showExemplars ? (\n \n ) : (\n \n )}\n \n \n );\n }\n}\n\nexport default GraphControls;\n","import React, { FC } from 'react';\nimport { metricToSeriesName } from '../../utils';\n\ninterface SeriesNameProps {\n labels: { [key: string]: string } | null;\n format: boolean;\n}\n\nconst SeriesName: FC = ({ labels, format }) => {\n const renderFormatted = (): React.ReactElement => {\n const labelNodes: React.ReactElement[] = [];\n let first = true;\n for (const label in labels) {\n if (label === '__name__') {\n continue;\n }\n\n labelNodes.push(\n \n {!first && ', '}\n {label}=\"{labels[label]}\"\n \n );\n\n if (first) {\n first = false;\n }\n }\n\n return (\n
\n {labels ? labels.__name__ : ''}\n {'{'}\n {labelNodes}\n {'}'}\n
\n );\n };\n\n if (labels === null) {\n return <>scalar;\n }\n\n if (format) {\n return renderFormatted();\n }\n // Return a simple text node. This is much faster to scroll through\n // for longer lists (hundreds of items).\n return <>{metricToSeriesName(labels)};\n};\n\nexport default SeriesName;\n","import React, { PureComponent, SyntheticEvent } from 'react';\nimport SeriesName from './SeriesName';\nimport { GraphSeries } from './Graph';\n\ninterface LegendProps {\n chartData: GraphSeries[];\n shouldReset: boolean;\n onLegendMouseOut: (ev: SyntheticEvent) => void;\n onSeriesToggle: (selected: number[], index: number) => void;\n onHover: (index: number) => (ev: SyntheticEvent) => void;\n}\n\ninterface LegendState {\n selectedIndexes: number[];\n}\n\nexport class Legend extends PureComponent {\n state = {\n selectedIndexes: [] as number[],\n };\n componentDidUpdate(prevProps: LegendProps): void {\n if (this.props.shouldReset && prevProps.shouldReset !== this.props.shouldReset) {\n this.setState({ selectedIndexes: [] });\n }\n }\n handleSeriesSelect =\n (index: number) =>\n (ev: React.MouseEvent): void => {\n // TODO: add proper event type\n const { selectedIndexes } = this.state;\n\n let selected = [index];\n if (ev.ctrlKey || ev.metaKey) {\n const { chartData } = this.props;\n if (selectedIndexes.includes(index)) {\n selected = selectedIndexes.filter((idx) => idx !== index);\n } else {\n selected =\n // Flip the logic - In case none is selected ctrl + click should deselect clicked series.\n selectedIndexes.length === 0\n ? chartData.reduce((acc, _, i) => (i === index ? acc : [...acc, i]), [])\n : [...selectedIndexes, index]; // Select multiple.\n }\n } else if (selectedIndexes.length === 1 && selectedIndexes.includes(index)) {\n selected = [];\n }\n\n this.setState({ selectedIndexes: selected });\n this.props.onSeriesToggle(selected, index);\n };\n\n render(): JSX.Element {\n const { chartData, onLegendMouseOut, onHover } = this.props;\n const { selectedIndexes } = this.state;\n const canUseHover = chartData.length > 1 && selectedIndexes.length === 0;\n\n return (\n
\n {chartData.map(({ index, color, labels }) => (\n 1 ? this.handleSeriesSelect(index) : undefined}\n onMouseOver={canUseHover ? onHover(index) : undefined}\n key={index}\n className=\"legend-item\"\n >\n \n \n
\n ))}\n {chartData.length > 1 && (\n
\n Click: select series, {navigator.platform.includes('Mac') ? 'CMD' : 'CTRL'} + click: toggle multiple series\n
\n )}\n
\n );\n }\n}\n","import $ from 'jquery';\n\nimport { escapeHTML } from '../../utils';\nimport { Metric } from '../../types/types';\nimport { GraphProps, GraphData, GraphSeries, GraphExemplar } from './Graph';\nimport moment from 'moment-timezone';\n\nexport const formatValue = (y: number | null): string => {\n if (y === null) {\n return 'null';\n }\n const absY = Math.abs(y);\n\n if (absY >= 1e24) {\n return (y / 1e24).toFixed(2) + 'Y';\n } else if (absY >= 1e21) {\n return (y / 1e21).toFixed(2) + 'Z';\n } else if (absY >= 1e18) {\n return (y / 1e18).toFixed(2) + 'E';\n } else if (absY >= 1e15) {\n return (y / 1e15).toFixed(2) + 'P';\n } else if (absY >= 1e12) {\n return (y / 1e12).toFixed(2) + 'T';\n } else if (absY >= 1e9) {\n return (y / 1e9).toFixed(2) + 'G';\n } else if (absY >= 1e6) {\n return (y / 1e6).toFixed(2) + 'M';\n } else if (absY >= 1e3) {\n return (y / 1e3).toFixed(2) + 'k';\n } else if (absY >= 1) {\n return y.toFixed(2);\n } else if (absY === 0) {\n return y.toFixed(2);\n } else if (absY < 1e-23) {\n return (y / 1e-24).toFixed(2) + 'y';\n } else if (absY < 1e-20) {\n return (y / 1e-21).toFixed(2) + 'z';\n } else if (absY < 1e-17) {\n return (y / 1e-18).toFixed(2) + 'a';\n } else if (absY < 1e-14) {\n return (y / 1e-15).toFixed(2) + 'f';\n } else if (absY < 1e-11) {\n return (y / 1e-12).toFixed(2) + 'p';\n } else if (absY < 1e-8) {\n return (y / 1e-9).toFixed(2) + 'n';\n } else if (absY < 1e-5) {\n return (y / 1e-6).toFixed(2) + 'µ';\n } else if (absY < 1e-2) {\n return (y / 1e-3).toFixed(2) + 'm';\n } else if (absY <= 1) {\n return y.toFixed(2);\n }\n throw Error(\"couldn't format a value, this is a bug\");\n};\n\nexport const getHoverColor = (color: string, opacity: number, stacked: boolean): string => {\n const { r, g, b } = $.color.parse(color);\n if (!stacked) {\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n /*\n Unfortunately flot doesn't take into consideration\n the alpha value when adjusting the color on the stacked series.\n TODO: find better way to set the opacity.\n */\n const base = (1 - opacity) * 255;\n return `rgb(${Math.round(base + opacity * r)},${Math.round(base + opacity * g)},${Math.round(base + opacity * b)})`;\n};\n\nexport const toHoverColor =\n (index: number, stacked: boolean) =>\n (\n series: GraphSeries,\n i: number\n ): { color: string; data: (number | null)[][]; index: number; labels: { [p: string]: string } } => ({\n ...series,\n color: getHoverColor(series.color, i !== index ? 0.3 : 1, stacked),\n });\n\nexport const getOptions = (stacked: boolean, useLocalTime: boolean): jquery.flot.plotOptions => {\n return {\n grid: {\n hoverable: true,\n clickable: true,\n autoHighlight: true,\n mouseActiveRadius: 100,\n },\n legend: {\n show: false,\n },\n xaxis: {\n mode: 'time',\n showTicks: true,\n showMinorTicks: true,\n timeBase: 'milliseconds',\n timezone: useLocalTime ? 'browser' : undefined,\n },\n yaxis: {\n tickFormatter: formatValue,\n },\n crosshair: {\n mode: 'xy',\n color: '#bbb',\n },\n tooltip: {\n show: true,\n cssClass: 'graph-tooltip',\n content: (_, xval, yval, { series }): string => {\n const both = series as GraphExemplar | GraphSeries;\n const { labels, color } = both;\n let dateTime = moment(xval);\n if (!useLocalTime) {\n dateTime = dateTime.utc();\n }\n\n const formatLabels = (labels: { [key: string]: string }): string => `\n
\n ${Object.keys(labels).length === 0 ? '
no labels
' : ''}\n ${labels['__name__'] ? `
${labels['__name__']}
` : ''}\n ${Object.keys(labels)\n .filter((k) => k !== '__name__')\n .map((k) => `
${k}: ${escapeHTML(labels[k])}
`)\n .join('')}\n
`;\n\n return `\n
${dateTime.format('YYYY-MM-DD HH:mm:ss Z')}
\n
\n \n ${labels.__name__ || 'value'}: ${yval}\n
\n
${'seriesLabels' in both ? 'Trace exemplar:' : 'Series:'}
\n ${formatLabels(labels)}\n ${\n 'seriesLabels' in both\n ? `\n
Associated series:
${formatLabels(both.seriesLabels)}\n`\n : ''\n }\n `.trimEnd();\n },\n defaultTheme: false,\n lines: true,\n },\n series: {\n stack: false, // Stacking is set on a per-series basis because exemplar symbols don't support it.\n lines: {\n lineWidth: stacked ? 1 : 2,\n steps: false,\n fill: stacked,\n },\n shadowSize: 0,\n },\n selection: {\n mode: 'x',\n },\n };\n};\n\n// This was adapted from Flot's color generation code.\nexport const getColors = (data: {\n resultType: string;\n result: Array<{ metric: Metric; values: [number, string][] }>;\n}): Color[] => {\n const colorPool = ['#edc240', '#afd8f8', '#cb4b4b', '#4da74d', '#9440ed'];\n const colorPoolSize = colorPool.length;\n let variation = 0;\n return data.result.map((_, i) => {\n // Each time we exhaust the colors in the pool we adjust\n // a scaling factor used to produce more variations on\n // those colors. The factor alternates negative/positive\n // to produce lighter/darker colors.\n\n // Reset the variation after every few cycles, or else\n // it will end up producing only white or black colors.\n\n if (i % colorPoolSize === 0 && i) {\n if (variation >= 0) {\n variation = variation < 0.5 ? -variation - 0.2 : 0;\n } else {\n variation = -variation;\n }\n }\n return $.color.parse(colorPool[i % colorPoolSize] || '#666').scale('rgb', 1 + variation);\n });\n};\n\nexport const normalizeData = ({ queryParams, data, exemplars, stacked }: GraphProps): GraphData => {\n const colors = getColors(data);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const { startTime, endTime, resolution } = queryParams!;\n\n let sum = 0;\n const values: number[] = [];\n // Exemplars are grouped into buckets by time to use for de-densifying.\n const buckets: { [time: number]: GraphExemplar[] } = {};\n for (const exemplar of exemplars || []) {\n for (const { labels, value, timestamp } of exemplar.exemplars) {\n const parsed = parseValue(value) || 0;\n sum += parsed;\n values.push(parsed);\n\n const bucketTime = Math.floor((timestamp / ((endTime - startTime) / 60)) * 0.8) * 1000;\n if (!buckets[bucketTime]) {\n buckets[bucketTime] = [];\n }\n\n buckets[bucketTime].push({\n seriesLabels: exemplar.seriesLabels,\n labels: labels,\n data: [[timestamp * 1000, parsed]],\n points: { symbol: exemplarSymbol },\n color: '#0275d8',\n });\n }\n }\n const deviation = stdDeviation(sum, values);\n\n return {\n series: data.result.map(({ values, metric }, index) => {\n // Insert nulls for all missing steps.\n const data = [];\n let pos = 0;\n\n for (let t = startTime; t <= endTime; t += resolution) {\n // Allow for floating point inaccuracy.\n const currentValue = values[pos];\n if (values.length > pos && currentValue[0] < t + resolution / 100) {\n data.push([currentValue[0] * 1000, parseValue(currentValue[1])]);\n pos++;\n } else {\n data.push([t * 1000, null]);\n }\n }\n\n return {\n labels: metric !== null ? metric : {},\n color: colors[index].toString(),\n stack: stacked,\n data,\n index,\n };\n }),\n exemplars: Object.values(buckets).flatMap((bucket) => {\n if (bucket.length === 1) {\n return bucket[0];\n }\n return bucket\n .sort((a, b) => exValue(b) - exValue(a)) // Sort exemplars by value in descending order.\n .reduce((exemplars: GraphExemplar[], exemplar) => {\n if (exemplars.length === 0) {\n exemplars.push(exemplar);\n } else {\n const prev = exemplars[exemplars.length - 1];\n // Don't plot this exemplar if it's less than two times the standard\n // deviation spaced from the last.\n if (exValue(prev) - exValue(exemplar) >= 2 * deviation) {\n exemplars.push(exemplar);\n }\n }\n return exemplars;\n }, []);\n }),\n };\n};\n\nexport const parseValue = (value: string): null | number => {\n const val = parseFloat(value);\n // \"+Inf\", \"-Inf\", \"+Inf\" will be parsed into NaN by parseFloat(). They\n // can't be graphed, so show them as gaps (null).\n return isNaN(val) ? null : val;\n};\n\nconst exemplarSymbol = (ctx: CanvasRenderingContext2D, x: number, y: number) => {\n // Center the symbol on the point.\n y = y - 3.5;\n\n // Correct if the symbol is overflowing off the grid.\n if (x > ctx.canvas.clientWidth - 59) {\n x = ctx.canvas.clientWidth - 59;\n }\n if (y > ctx.canvas.clientHeight - 40) {\n y = ctx.canvas.clientHeight - 40;\n }\n\n ctx.translate(x, y);\n ctx.rotate(Math.PI / 4);\n ctx.translate(-x, -y);\n\n ctx.fillStyle = '#92bce1';\n ctx.fillRect(x, y, 7, 7);\n\n ctx.strokeStyle = '#0275d8';\n ctx.lineWidth = 1;\n ctx.strokeRect(x, y, 7, 7);\n};\n\nconst stdDeviation = (sum: number, values: number[]): number => {\n const avg = sum / values.length;\n let squaredAvg = 0;\n values.map((value) => (squaredAvg += (value - avg) ** 2));\n squaredAvg = squaredAvg / values.length;\n return Math.sqrt(squaredAvg);\n};\n\nconst exValue = (exemplar: GraphExemplar): number => exemplar.data[0][1];\n","import $ from 'jquery';\nimport React, { PureComponent } from 'react';\nimport ReactResizeDetector from 'react-resize-detector';\n\nimport { Legend } from './Legend';\nimport { Metric, ExemplarData, QueryParams } from '../../types/types';\nimport { isPresent } from '../../utils';\nimport { normalizeData, getOptions, toHoverColor } from './GraphHelpers';\nimport { Button } from 'reactstrap';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\n\nrequire('../../vendor/flot/jquery.flot');\nrequire('../../vendor/flot/jquery.flot.stack');\nrequire('../../vendor/flot/jquery.flot.time');\nrequire('../../vendor/flot/jquery.flot.crosshair');\nrequire('../../vendor/flot/jquery.flot.selection');\nrequire('jquery.flot.tooltip');\n\nexport interface GraphProps {\n data: {\n resultType: string;\n result: Array<{ metric: Metric; values: [number, string][] }>;\n };\n exemplars: ExemplarData;\n stacked: boolean;\n useLocalTime: boolean;\n showExemplars: boolean;\n handleTimeRangeSelection: (startTime: number, endTime: number) => void;\n queryParams: QueryParams | null;\n id: string;\n}\n\nexport interface GraphSeries {\n labels: { [key: string]: string };\n color: string;\n data: (number | null)[][]; // [x,y][]\n index: number;\n}\n\nexport interface GraphExemplar {\n seriesLabels: { [key: string]: string };\n labels: { [key: string]: string };\n data: number[][];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n points: any; // This is used to specify the symbol.\n color: string;\n}\n\nexport interface GraphData {\n series: GraphSeries[];\n exemplars: GraphExemplar[];\n}\n\ninterface GraphState {\n chartData: GraphData;\n selectedExemplarLabels: { exemplar: { [key: string]: string }; series: { [key: string]: string } };\n}\n\nclass Graph extends PureComponent {\n private chartRef = React.createRef();\n private $chart?: jquery.flot.plot;\n private rafID = 0;\n private selectedSeriesIndexes: number[] = [];\n\n state = {\n chartData: normalizeData(this.props),\n selectedExemplarLabels: { exemplar: {}, series: {} },\n };\n\n componentDidUpdate(prevProps: GraphProps): void {\n const { data, stacked, useLocalTime, showExemplars } = this.props;\n if (prevProps.data !== data) {\n this.selectedSeriesIndexes = [];\n this.setState({ chartData: normalizeData(this.props) }, this.plot);\n } else if (prevProps.stacked !== stacked) {\n this.setState({ chartData: normalizeData(this.props) }, () => {\n if (this.selectedSeriesIndexes.length === 0) {\n this.plot();\n } else {\n this.plot([\n ...this.state.chartData.series.filter((_, i) => this.selectedSeriesIndexes.includes(i)),\n ...this.state.chartData.exemplars,\n ]);\n }\n });\n }\n\n if (prevProps.useLocalTime !== useLocalTime) {\n this.plot();\n }\n\n if (prevProps.showExemplars !== showExemplars && !showExemplars) {\n this.setState(\n {\n chartData: { series: this.state.chartData.series, exemplars: [] },\n selectedExemplarLabels: { exemplar: {}, series: {} },\n },\n () => {\n this.plot();\n }\n );\n }\n }\n\n componentDidMount(): void {\n this.plot();\n\n $(`.graph-${this.props.id}`).bind('plotclick', (event, pos, item) => {\n // If an item has the series label property that means it's an exemplar.\n if (item && 'seriesLabels' in item.series) {\n this.setState({\n selectedExemplarLabels: { exemplar: item.series.labels, series: item.series.seriesLabels },\n chartData: this.state.chartData,\n });\n } else {\n this.setState({\n chartData: this.state.chartData,\n selectedExemplarLabels: { exemplar: {}, series: {} },\n });\n }\n });\n\n $(`.graph-${this.props.id}`).bind('plotselected', (_, ranges) => {\n if (isPresent(this.$chart)) {\n // eslint-disable-next-line\n // @ts-ignore Typescript doesn't think this method exists although it actually does.\n this.$chart.clearSelection();\n this.props.handleTimeRangeSelection(ranges.xaxis.from, ranges.xaxis.to);\n }\n });\n }\n\n componentWillUnmount(): void {\n this.destroyPlot();\n }\n\n plot = (\n data: (GraphSeries | GraphExemplar)[] = [...this.state.chartData.series, ...this.state.chartData.exemplars]\n ): void => {\n if (!this.chartRef.current) {\n return;\n }\n this.destroyPlot();\n\n this.$chart = $.plot($(this.chartRef.current), data, getOptions(this.props.stacked, this.props.useLocalTime));\n };\n\n destroyPlot = (): void => {\n if (isPresent(this.$chart)) {\n this.$chart.destroy();\n }\n };\n\n plotSetAndDraw(\n data: (GraphSeries | GraphExemplar)[] = [...this.state.chartData.series, ...this.state.chartData.exemplars]\n ): void {\n if (isPresent(this.$chart)) {\n this.$chart.setData(data);\n this.$chart.draw();\n }\n }\n\n handleSeriesSelect = (selected: number[], selectedIndex: number): void => {\n const { chartData } = this.state;\n this.plot(\n this.selectedSeriesIndexes.length === 1 && this.selectedSeriesIndexes.includes(selectedIndex)\n ? [...chartData.series.map(toHoverColor(selectedIndex, this.props.stacked)), ...chartData.exemplars]\n : [\n ...chartData.series.filter((_, i) => selected.includes(i)),\n ...chartData.exemplars.filter((exemplar) => {\n series: for (const i in selected) {\n for (const name in chartData.series[selected[i]].labels) {\n if (exemplar.seriesLabels[name] !== chartData.series[selected[i]].labels[name]) {\n continue series;\n }\n }\n return true;\n }\n return false;\n }),\n ] // draw only selected\n );\n this.selectedSeriesIndexes = selected;\n };\n\n handleSeriesHover = (index: number) => (): void => {\n if (this.rafID) {\n cancelAnimationFrame(this.rafID);\n }\n this.rafID = requestAnimationFrame(() => {\n this.plotSetAndDraw([\n ...this.state.chartData.series.map(toHoverColor(index, this.props.stacked)),\n ...this.state.chartData.exemplars,\n ]);\n });\n };\n\n handleLegendMouseOut = (): void => {\n cancelAnimationFrame(this.rafID);\n this.plotSetAndDraw();\n };\n\n handleResize = (): void => {\n if (isPresent(this.$chart)) {\n this.plot(this.$chart.getData() as (GraphSeries | GraphExemplar)[]);\n }\n };\n\n render(): JSX.Element {\n const { chartData, selectedExemplarLabels } = this.state;\n const selectedLabels = selectedExemplarLabels as {\n exemplar: { [key: string]: string };\n series: { [key: string]: string };\n };\n return (\n
\n \n
\n {Object.keys(selectedLabels.exemplar).length > 0 ? (\n
\n
Selected exemplar labels:
\n
\n {Object.keys(selectedLabels.exemplar).map((k, i) => (\n
\n {k}: {selectedLabels.exemplar[k]}\n
\n ))}\n
\n
Associated series labels:
\n
\n {Object.keys(selectedLabels.series).map((k, i) => (\n
\n {k}: {selectedLabels.series[k]}\n
\n ))}\n
\n \n this.setState({\n chartData: this.state.chartData,\n selectedExemplarLabels: { exemplar: {}, series: {} },\n })\n }\n >\n \n \n
\n ) : null}\n \n {/* This is to make sure the graph box expands when the selected exemplar info pops up. */}\n
\n
\n );\n }\n}\n\nexport default Graph;\n","import React, { Component } from 'react';\n\nimport { Alert, Button, Col, Nav, NavItem, NavLink, Row, TabContent, TabPane } from 'reactstrap';\n\nimport moment from 'moment-timezone';\n\nimport ExpressionInput from './ExpressionInput';\nimport GraphControls from './GraphControls';\nimport { GraphTabContent } from './GraphTabContent';\nimport DataTable from './DataTable';\nimport TimeInput from './TimeInput';\nimport QueryStatsView, { QueryStats } from './QueryStatsView';\nimport { QueryParams, ExemplarData } from '../../types/types';\nimport { API_PATH } from '../../constants/constants';\nimport { debounce } from '../../utils';\n\ninterface PanelProps {\n options: PanelOptions;\n onOptionsChanged: (opts: PanelOptions) => void;\n useLocalTime: boolean;\n pastQueries: string[];\n metricNames: string[];\n removePanel: () => void;\n onExecuteQuery: (query: string) => void;\n pathPrefix: string;\n enableAutocomplete: boolean;\n enableHighlighting: boolean;\n enableLinter: boolean;\n id: string;\n}\n\ninterface PanelState {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any; // TODO: Type data.\n exemplars: ExemplarData;\n lastQueryParams: QueryParams | null;\n loading: boolean;\n warnings: string[] | null;\n error: string | null;\n stats: QueryStats | null;\n exprInputValue: string;\n}\n\nexport interface PanelOptions {\n expr: string;\n type: PanelType;\n range: number; // Range in milliseconds.\n endTime: number | null; // Timestamp in milliseconds.\n resolution: number | null; // Resolution in seconds.\n stacked: boolean;\n showExemplars: boolean;\n}\n\nexport enum PanelType {\n Graph = 'graph',\n Table = 'table',\n}\n\nexport const PanelDefaultOptions: PanelOptions = {\n type: PanelType.Table,\n expr: '',\n range: 60 * 60 * 1000,\n endTime: null,\n resolution: null,\n stacked: false,\n showExemplars: false,\n};\n\nclass Panel extends Component {\n private abortInFlightFetch: (() => void) | null = null;\n private debounceExecuteQuery: () => void;\n\n constructor(props: PanelProps) {\n super(props);\n\n this.state = {\n data: null,\n exemplars: [],\n lastQueryParams: null,\n loading: false,\n warnings: null,\n error: null,\n stats: null,\n exprInputValue: props.options.expr,\n };\n\n this.debounceExecuteQuery = debounce(this.executeQuery.bind(this), 250);\n }\n\n componentDidUpdate({ options: prevOpts }: PanelProps): void {\n const { endTime, range, resolution, showExemplars, type } = this.props.options;\n\n if (prevOpts.endTime !== endTime || prevOpts.range !== range) {\n this.debounceExecuteQuery();\n return;\n }\n\n if (prevOpts.resolution !== resolution || prevOpts.type !== type || showExemplars !== prevOpts.showExemplars) {\n this.executeQuery();\n }\n }\n\n componentDidMount(): void {\n this.executeQuery();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n executeQuery = async (): Promise => {\n const { exprInputValue: expr } = this.state;\n const queryStart = Date.now();\n this.props.onExecuteQuery(expr);\n if (this.props.options.expr !== expr) {\n this.setOptions({ expr });\n }\n if (expr === '') {\n return;\n }\n\n if (this.abortInFlightFetch) {\n this.abortInFlightFetch();\n this.abortInFlightFetch = null;\n }\n\n const abortController = new AbortController();\n this.abortInFlightFetch = () => abortController.abort();\n this.setState({ loading: true });\n\n const endTime = this.getEndTime().valueOf() / 1000; // TODO: shouldn't valueof only work when it's a moment?\n const startTime = endTime - this.props.options.range / 1000;\n const resolution = this.props.options.resolution || Math.max(Math.floor(this.props.options.range / 250000), 1);\n const params: URLSearchParams = new URLSearchParams({\n query: expr,\n });\n\n let path: string;\n switch (this.props.options.type) {\n case 'graph':\n path = 'query_range';\n params.append('start', startTime.toString());\n params.append('end', endTime.toString());\n params.append('step', resolution.toString());\n break;\n case 'table':\n path = 'query';\n params.append('time', endTime.toString());\n break;\n default:\n throw new Error('Invalid panel type \"' + this.props.options.type + '\"');\n }\n\n let query;\n let exemplars;\n try {\n query = await fetch(`${this.props.pathPrefix}/${API_PATH}/${path}?${params}`, {\n cache: 'no-store',\n credentials: 'same-origin',\n signal: abortController.signal,\n }).then((resp) => resp.json());\n\n if (query.status !== 'success') {\n throw new Error(query.error || 'invalid response JSON');\n }\n\n if (this.props.options.type === 'graph' && this.props.options.showExemplars) {\n params.delete('step'); // Not needed for this request.\n exemplars = await fetch(`${this.props.pathPrefix}/${API_PATH}/query_exemplars?${params}`, {\n cache: 'no-store',\n credentials: 'same-origin',\n signal: abortController.signal,\n }).then((resp) => resp.json());\n\n if (exemplars.status !== 'success') {\n throw new Error(exemplars.error || 'invalid response JSON');\n }\n }\n\n let resultSeries = 0;\n if (query.data) {\n const { resultType, result } = query.data;\n if (resultType === 'scalar') {\n resultSeries = 1;\n } else if (result && result.length > 0) {\n resultSeries = result.length;\n }\n }\n\n this.setState({\n error: null,\n data: query.data,\n exemplars: exemplars?.data,\n warnings: query.warnings,\n lastQueryParams: {\n startTime,\n endTime,\n resolution,\n },\n stats: {\n loadTime: Date.now() - queryStart,\n resolution,\n resultSeries,\n },\n loading: false,\n });\n this.abortInFlightFetch = null;\n } catch (err: unknown) {\n const error = err as Error;\n if (error.name === 'AbortError') {\n // Aborts are expected, don't show an error for them.\n return;\n }\n this.setState({\n error: 'Error executing query: ' + error.message,\n loading: false,\n });\n }\n };\n\n setOptions(opts: Partial): void {\n const newOpts = { ...this.props.options, ...opts };\n this.props.onOptionsChanged(newOpts);\n }\n\n handleExpressionChange = (expr: string): void => {\n this.setState({ exprInputValue: expr });\n };\n\n handleChangeRange = (range: number): void => {\n this.setOptions({ range: range });\n };\n\n getEndTime = (): number | moment.Moment => {\n if (this.props.options.endTime === null) {\n return moment();\n }\n return this.props.options.endTime;\n };\n\n handleChangeEndTime = (endTime: number | null): void => {\n this.setOptions({ endTime: endTime });\n };\n\n handleChangeResolution = (resolution: number | null): void => {\n this.setOptions({ resolution: resolution });\n };\n\n handleChangeType = (type: PanelType): void => {\n if (this.props.options.type === type) {\n return;\n }\n\n this.setState({ data: null });\n this.setOptions({ type: type });\n };\n\n handleChangeStacking = (stacked: boolean): void => {\n this.setOptions({ stacked: stacked });\n };\n\n handleChangeShowExemplars = (show: boolean): void => {\n this.setOptions({ showExemplars: show });\n };\n\n handleTimeRangeSelection = (startTime: number, endTime: number): void => {\n this.setOptions({ range: endTime - startTime, endTime: endTime });\n };\n\n render(): JSX.Element {\n const { pastQueries, metricNames, options } = this.props;\n return (\n
\n \n \n \n \n \n \n {this.state.error && {this.state.error}}\n \n {this.state.warnings?.map((warning, index) => (\n \n {warning && {warning}}\n \n ))}\n \n \n \n \n \n {options.type === 'table' && (\n <>\n
\n \n
\n \n \n )}\n
\n \n {this.props.options.type === 'graph' && (\n <>\n \n \n \n )}\n \n
\n \n
\n \n \n \n \n \n
\n );\n }\n}\n\nexport default Panel;\n","import React, { FC } from 'react';\nimport { Alert } from 'reactstrap';\nimport Graph from './Graph';\nimport { QueryParams, ExemplarData } from '../../types/types';\nimport { isPresent } from '../../utils';\n\ninterface GraphTabContentProps {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any;\n exemplars: ExemplarData;\n stacked: boolean;\n useLocalTime: boolean;\n showExemplars: boolean;\n handleTimeRangeSelection: (startTime: number, endTime: number) => void;\n lastQueryParams: QueryParams | null;\n id: string;\n}\n\nexport const GraphTabContent: FC = ({\n data,\n exemplars,\n stacked,\n useLocalTime,\n lastQueryParams,\n showExemplars,\n handleTimeRangeSelection,\n id,\n}) => {\n if (!isPresent(data)) {\n return No data queried yet;\n }\n if (data.result.length === 0) {\n return Empty query result;\n }\n if (data.resultType !== 'matrix') {\n return (\n Query result is of wrong type '{data.resultType}', should be 'matrix' (range vector).\n );\n }\n return (\n \n );\n};\n","import React, { FC, ReactNode } from 'react';\n\nimport { Alert, Table } from 'reactstrap';\n\nimport SeriesName from './SeriesName';\nimport { Metric } from '../../types/types';\n\nexport interface QueryResult {\n data:\n | null\n | {\n resultType: 'vector';\n result: InstantSample[];\n }\n | {\n resultType: 'matrix';\n result: RangeSamples[];\n }\n | {\n resultType: 'scalar';\n result: SampleValue;\n }\n | {\n resultType: 'string';\n result: string;\n };\n}\n\ninterface InstantSample {\n metric: Metric;\n value: SampleValue;\n}\n\ninterface RangeSamples {\n metric: Metric;\n values: SampleValue[];\n}\n\ntype SampleValue = [number, string];\n\nconst limitSeries = (series: S[]): S[] => {\n const maxSeries = 10000;\n\n if (series.length > maxSeries) {\n return series.slice(0, maxSeries);\n }\n return series;\n};\n\nconst DataTable: FC = ({ data }) => {\n if (data === null) {\n return No data queried yet;\n }\n\n if (data.result === null || data.result.length === 0) {\n return Empty query result;\n }\n\n const maxFormattableSize = 1000;\n let rows: ReactNode[] = [];\n let limited = false;\n const doFormat = data.result.length <= maxFormattableSize;\n switch (data.resultType) {\n case 'vector':\n rows = (limitSeries(data.result) as InstantSample[]).map((s: InstantSample, index: number): ReactNode => {\n return (\n \n \n \n \n {s.value[1]}\n \n );\n });\n limited = rows.length !== data.result.length;\n break;\n case 'matrix':\n rows = (limitSeries(data.result) as RangeSamples[]).map((s, index) => {\n const valueText = s.values\n .map((v) => {\n return v[1] + ' @' + v[0];\n })\n .join('\\n');\n return (\n \n \n \n \n {valueText}\n \n );\n });\n limited = rows.length !== data.result.length;\n break;\n case 'scalar':\n rows.push(\n \n scalar\n {data.result[1]}\n \n );\n break;\n case 'string':\n rows.push(\n \n string\n {data.result[1]}\n \n );\n break;\n default:\n return Unsupported result value type;\n }\n\n return (\n <>\n {limited && (\n \n Warning: Fetched {data.result.length} metrics, only displaying first {rows.length}.\n \n )}\n {!doFormat && (\n \n Notice: Showing more than {maxFormattableSize} series, turning off label formatting for\n performance reasons.\n \n )}\n \n {rows}\n
\n \n );\n};\n\nexport default DataTable;\n","import React, { FC } from 'react';\n\nexport interface QueryStats {\n loadTime: number;\n resolution: number;\n resultSeries: number;\n}\n\nconst QueryStatsView: FC = (props) => {\n const { loadTime, resolution, resultSeries } = props;\n\n return (\n
\n \n Load time: {loadTime}ms   Resolution: {resolution}s   Result series: {resultSeries}\n \n
\n );\n};\n\nexport default QueryStatsView;\n","import moment from 'moment-timezone';\n\nimport { PanelOptions, PanelType, PanelDefaultOptions } from '../pages/graph/Panel';\nimport { PanelMeta } from '../pages/graph/PanelList';\n\nexport const generateID = (): string => {\n return `_${Math.random().toString(36).substr(2, 9)}`;\n};\n\nexport const byEmptyString = (p: string): boolean => p.length > 0;\n\nexport const isPresent = (obj: T): obj is NonNullable => obj !== null && obj !== undefined;\n\nexport const escapeHTML = (str: string): string => {\n const entityMap: { [key: string]: string } = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/',\n };\n\n return String(str).replace(/[&<>\"'/]/g, function (s) {\n return entityMap[s];\n });\n};\n\nexport const metricToSeriesName = (labels: { [key: string]: string }): string => {\n if (labels === null) {\n return 'scalar';\n }\n let tsName = (labels.__name__ || '') + '{';\n const labelStrings: string[] = [];\n for (const label in labels) {\n if (label !== '__name__') {\n labelStrings.push(label + '=\"' + labels[label] + '\"');\n }\n }\n tsName += labelStrings.join(', ') + '}';\n return tsName;\n};\n\nexport const parseDuration = (durationStr: string): number | null => {\n if (durationStr === '') {\n return null;\n }\n if (durationStr === '0') {\n // Allow 0 without a unit.\n return 0;\n }\n\n const durationRE = new RegExp('^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$');\n const matches = durationStr.match(durationRE);\n if (!matches) {\n return null;\n }\n\n let dur = 0;\n\n // Parse the match at pos `pos` in the regex and use `mult` to turn that\n // into ms, then add that value to the total parsed duration.\n const m = (pos: number, mult: number) => {\n if (matches[pos] === undefined) {\n return;\n }\n const n = parseInt(matches[pos]);\n dur += n * mult;\n };\n\n m(2, 1000 * 60 * 60 * 24 * 365); // y\n m(4, 1000 * 60 * 60 * 24 * 7); // w\n m(6, 1000 * 60 * 60 * 24); // d\n m(8, 1000 * 60 * 60); // h\n m(10, 1000 * 60); // m\n m(12, 1000); // s\n m(14, 1); // ms\n\n return dur;\n};\n\nexport const formatDuration = (d: number): string => {\n let ms = d;\n let r = '';\n if (ms === 0) {\n return '0s';\n }\n\n const f = (unit: string, mult: number, exact: boolean) => {\n if (exact && ms % mult !== 0) {\n return;\n }\n const v = Math.floor(ms / mult);\n if (v > 0) {\n r += `${v}${unit}`;\n ms -= v * mult;\n }\n };\n\n // Only format years and weeks if the remainder is zero, as it is often\n // easier to read 90d than 12w6d.\n f('y', 1000 * 60 * 60 * 24 * 365, true);\n f('w', 1000 * 60 * 60 * 24 * 7, true);\n\n f('d', 1000 * 60 * 60 * 24, false);\n f('h', 1000 * 60 * 60, false);\n f('m', 1000 * 60, false);\n f('s', 1000, false);\n f('ms', 1, false);\n\n return r;\n};\n\nexport function parseTime(timeText: string): number {\n return moment.utc(timeText).valueOf();\n}\n\nexport function formatTime(time: number): string {\n return moment.utc(time).format('YYYY-MM-DD HH:mm:ss');\n}\n\nexport const now = (): number => moment().valueOf();\n\nexport const humanizeDuration = (milliseconds: number): string => {\n const sign = milliseconds < 0 ? '-' : '';\n const unsignedMillis = milliseconds < 0 ? -1 * milliseconds : milliseconds;\n const duration = moment.duration(unsignedMillis, 'ms');\n const ms = Math.floor(duration.milliseconds());\n const s = Math.floor(duration.seconds());\n const m = Math.floor(duration.minutes());\n const h = Math.floor(duration.hours());\n const d = Math.floor(duration.asDays());\n if (d !== 0) {\n return `${sign}${d}d ${h}h ${m}m ${s}s`;\n }\n if (h !== 0) {\n return `${sign}${h}h ${m}m ${s}s`;\n }\n if (m !== 0) {\n return `${sign}${m}m ${s}s`;\n }\n if (s !== 0) {\n return `${sign}${s}.${ms}s`;\n }\n if (unsignedMillis > 0) {\n return `${sign}${unsignedMillis.toFixed(3)}ms`;\n }\n return '0s';\n};\n\nexport const formatRelative = (startStr: string, end: number): string => {\n const start = parseTime(startStr);\n if (start < 0) {\n return 'Never';\n }\n return humanizeDuration(end - start) + ' ago';\n};\n\nconst paramFormat = /^g\\d+\\..+=.+$/;\n\nexport const decodePanelOptionsFromQueryString = (query: string): PanelMeta[] => {\n if (query === '') {\n return [];\n }\n const urlParams = query.substring(1).split('&');\n\n return urlParams.reduce((panels, urlParam, i) => {\n const panelsCount = panels.length;\n const prefix = `g${panelsCount}.`;\n if (urlParam.startsWith(`${prefix}expr=`)) {\n const prefixLen = prefix.length;\n return [\n ...panels,\n {\n id: generateID(),\n key: `${panelsCount}`,\n options: urlParams.slice(i).reduce((opts, param) => {\n return param.startsWith(prefix) && paramFormat.test(param)\n ? { ...opts, ...parseOption(param.substring(prefixLen)) }\n : opts;\n }, PanelDefaultOptions),\n },\n ];\n }\n return panels;\n }, []);\n};\n\nexport const parseOption = (param: string): Partial => {\n const [opt, val] = param.split('=');\n const decodedValue = decodeURIComponent(val.replace(/\\+/g, ' '));\n switch (opt) {\n case 'expr':\n return { expr: decodedValue };\n\n case 'tab':\n return { type: decodedValue === '0' ? PanelType.Graph : PanelType.Table };\n\n case 'stacked':\n return { stacked: decodedValue === '1' };\n\n case 'show_exemplars':\n return { showExemplars: decodedValue === '1' };\n\n case 'range_input':\n const range = parseDuration(decodedValue);\n return isPresent(range) ? { range } : {};\n\n case 'end_input':\n case 'moment_input':\n return { endTime: parseTime(decodedValue) };\n\n case 'step_input':\n const resolution = parseInt(decodedValue);\n return resolution > 0 ? { resolution } : {};\n }\n return {};\n};\n\nexport const formatParam =\n (key: string) =>\n (paramName: string, value: number | string | boolean): string => {\n return `g${key}.${paramName}=${encodeURIComponent(value)}`;\n };\n\nexport const toQueryString = ({ key, options }: PanelMeta): string => {\n const formatWithKey = formatParam(key);\n const { expr, type, stacked, range, endTime, resolution, showExemplars } = options;\n const time = isPresent(endTime) ? formatTime(endTime) : false;\n const urlParams = [\n formatWithKey('expr', expr),\n formatWithKey('tab', type === PanelType.Graph ? 0 : 1),\n formatWithKey('stacked', stacked ? 1 : 0),\n formatWithKey('show_exemplars', showExemplars ? 1 : 0),\n formatWithKey('range_input', formatDuration(range)),\n time ? `${formatWithKey('end_input', time)}&${formatWithKey('moment_input', time)}` : '',\n isPresent(resolution) ? formatWithKey('step_input', resolution) : '',\n ];\n return urlParams.filter(byEmptyString).join('&');\n};\n\nexport const encodePanelOptionsToQueryString = (panels: PanelMeta[]): string => {\n return `?${panels.map(toQueryString).join('&')}`;\n};\n\nexport const createExpressionLink = (expr: string): string => {\n return `../graph?g0.expr=${encodeURIComponent(expr)}&g0.tab=1&g0.stacked=0&g0.show_exemplars=0.g0.range_input=1h.`;\n};\nexport const mapObjEntries = (\n o: T,\n cb: ([k, v]: [string, T[key]], i: number, arr: [string, T[key]][]) => Z\n): Z[] => Object.entries(o).map(cb);\n\nexport const callAll =\n (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...fns: Array<(...args: any) => void>\n ) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n (...args: any): void => {\n // eslint-disable-next-line prefer-spread\n fns.filter(Boolean).forEach((fn) => fn.apply(null, args));\n };\n\nexport const parsePrometheusFloat = (value: string): string | number => {\n if (isNaN(Number(value))) {\n return value;\n } else {\n return Number(value);\n }\n};\n\nexport function debounce(\n func: (...args: Params) => unknown,\n timeout: number\n): (...args: Params) => void {\n let timer: NodeJS.Timeout;\n return (...args: Params) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n func(...args);\n }, timeout);\n };\n}\n","import React, { FC, useState, Fragment } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Alert, Collapse, Table, Badge } from 'reactstrap';\nimport { RuleStatus } from './AlertContents';\nimport { Rule } from '../../types/types';\nimport { faChevronDown, faChevronRight } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { createExpressionLink, parsePrometheusFloat, formatDuration } from '../../utils/index';\n\ninterface CollapsibleAlertPanelProps {\n rule: Rule;\n showAnnotations: boolean;\n}\n\nconst alertColors: RuleStatus = {\n firing: 'danger',\n pending: 'warning',\n inactive: 'success',\n};\n\nconst CollapsibleAlertPanel: FC = ({ rule, showAnnotations }) => {\n const [open, toggle] = useState(false);\n\n return (\n <>\n toggle(!open)} color={alertColors[rule.state]} style={{ cursor: 'pointer' }}>\n \n {rule.name} ({`${rule.alerts.length} active`})\n \n \n {open && (\n <>\n
\n              \n                
\n name: {rule.name}\n
\n
\n expr: {rule.query}\n
\n {rule.duration > 0 && (\n
\n
for: {formatDuration(rule.duration * 1000)}
\n
\n )}\n {rule.labels && Object.keys(rule.labels).length > 0 && (\n
\n
labels:
\n {Object.entries(rule.labels).map(([key, value]) => (\n
\n {key}: {value}\n
\n ))}\n
\n )}\n {rule.annotations && Object.keys(rule.annotations).length > 0 && (\n
\n
annotations:
\n {Object.entries(rule.annotations).map(([key, value]) => (\n
\n {key}: {value}\n
\n ))}\n
\n )}\n
\n
\n {rule.alerts.length > 0 && (\n \n \n \n \n \n \n \n \n \n \n {rule.alerts.map((alert, i) => {\n return (\n \n \n \n \n \n \n \n {showAnnotations && }\n \n );\n })}\n \n
LabelsStateActive SinceValue
\n {Object.entries(alert.labels).map(([k, v], j) => {\n return (\n \n {k}={v}\n \n );\n })}\n \n
\n \n {alert.state}\n \n
\n
{alert.activeAt}{parsePrometheusFloat(alert.value)}
\n )}\n \n )}\n
\n \n );\n};\n\ninterface AnnotationsProps {\n annotations: Record;\n}\n\nexport const Annotations: FC = ({ annotations }) => {\n return (\n \n \n \n
Annotations
\n \n \n \n \n {Object.entries(annotations).map(([k, v], i) => {\n return (\n
\n {k}\n
{v}
\n
\n );\n })}\n \n \n
\n );\n};\n\nexport default CollapsibleAlertPanel;\n","import React, { FC, memo, CSSProperties } from 'react';\nimport { FormGroup, Label, Input, InputProps } from 'reactstrap';\n\ninterface CheckboxProps extends InputProps {\n wrapperStyles?: CSSProperties;\n}\n\nconst Checkbox: FC = ({ children, wrapperStyles, id, ...rest }) => {\n return (\n \n \n \n \n );\n};\n\nexport default memo(Checkbox);\n","import { Dispatch, SetStateAction, useEffect, useState } from 'react';\n\nexport function useLocalStorage(localStorageKey: string, initialState: S): [S, Dispatch>] {\n const localStorageState = JSON.parse(localStorage.getItem(localStorageKey) || JSON.stringify(initialState));\n const [value, setValue] = useState(localStorageState);\n\n useEffect(() => {\n const serializedState = JSON.stringify(value);\n localStorage.setItem(localStorageKey, serializedState);\n }, [localStorageKey, value]);\n\n return [value, setValue];\n}\n","import React, { FC, Fragment } from 'react';\nimport { Badge } from 'reactstrap';\nimport CollapsibleAlertPanel from './CollapsibleAlertPanel';\nimport Checkbox from '../../components/Checkbox';\nimport { isPresent } from '../../utils';\nimport { Rule } from '../../types/types';\nimport { useLocalStorage } from '../../hooks/useLocalStorage';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type RuleState = keyof RuleStatus;\n\nexport interface RuleStatus {\n firing: T;\n pending: T;\n inactive: T;\n}\n\nexport interface AlertsProps {\n groups?: RuleGroup[];\n statsCount: RuleStatus;\n}\n\nexport interface Alert {\n labels: Record;\n state: RuleState;\n value: string;\n annotations: Record;\n activeAt: string;\n}\n\ninterface RuleGroup {\n name: string;\n file: string;\n rules: Rule[];\n interval: number;\n}\n\nconst stateColorTuples: Array<[RuleState, 'success' | 'warning' | 'danger']> = [\n ['inactive', 'success'],\n ['pending', 'warning'],\n ['firing', 'danger'],\n];\n\nconst AlertsContent: FC = ({ groups = [], statsCount }) => {\n const [filter, setFilter] = useLocalStorage('alerts-status-filter', {\n firing: true,\n pending: true,\n inactive: true,\n });\n const [showAnnotations, setShowAnnotations] = useLocalStorage('alerts-annotations-status', { checked: false });\n\n const toggleFilter = (ruleState: RuleState) => () => {\n setFilter({\n ...filter,\n [ruleState]: !filter[ruleState],\n });\n };\n\n return (\n <>\n
\n {stateColorTuples.map(([state, color]) => {\n return (\n \n \n {state} ({statsCount[state]})\n \n \n );\n })}\n setShowAnnotations({ checked: target.checked })}\n >\n Show annotations\n \n
\n {groups.map((group, i) => {\n const hasFilterOn = group.rules.some((rule) => filter[rule.state]);\n return hasFilterOn ? (\n \n \n {group.file} > {group.name}\n \n {group.rules.map((rule, j) => {\n return (\n filter[rule.state] && (\n \n )\n );\n })}\n \n ) : null;\n })}\n \n );\n};\n\ninterface GroupInfoProps {\n rules: Rule[];\n}\n\nexport const GroupInfo: FC = ({ rules, children }) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const statesCounter = rules.reduce(\n (acc, r) => {\n return {\n ...acc,\n [r.state]: acc[r.state] + r.alerts.length,\n };\n },\n {\n firing: 0,\n pending: 0,\n }\n );\n\n return (\n
\n {children}\n
\n {isPresent(statesCounter.inactive) && inactive}\n {statesCounter.pending > 0 && pending ({statesCounter.pending})}\n {statesCounter.firing > 0 && firing ({statesCounter.firing})}\n
\n
\n );\n};\n\nAlertsContent.displayName = 'Alerts';\n\nexport default AlertsContent;\n","import React, { FC } from 'react';\nimport { useFetch } from '../../hooks/useFetch';\nimport { withStatusIndicator } from '../../components/withStatusIndicator';\nimport AlertsContent, { RuleStatus, AlertsProps } from './AlertContents';\nimport { usePathPrefix } from '../../contexts/PathPrefixContext';\nimport { API_PATH } from '../../constants/constants';\n\nconst AlertsWithStatusIndicator = withStatusIndicator(AlertsContent);\n\nconst Alerts: FC = () => {\n const pathPrefix = usePathPrefix();\n const { response, error, isLoading } = useFetch(`${pathPrefix}/${API_PATH}/rules?type=alert`);\n\n const ruleStatsCount: RuleStatus = {\n inactive: 0,\n pending: 0,\n firing: 0,\n };\n\n if (response.data && response.data.groups) {\n response.data.groups.forEach((el) => el.rules.forEach((r) => ruleStatsCount[r.state]++));\n }\n\n return ;\n};\n\nexport default Alerts;\n","import React, { useState, FC } from 'react';\nimport { Button } from 'reactstrap';\nimport CopyToClipboard from 'react-copy-to-clipboard';\n\nimport { withStatusIndicator } from '../../components/withStatusIndicator';\nimport { useFetch } from '../../hooks/useFetch';\nimport { usePathPrefix } from '../../contexts/PathPrefixContext';\nimport { API_PATH } from '../../constants/constants';\n\ntype YamlConfig = { yaml?: string };\n\ninterface ConfigContentProps {\n error?: Error;\n data?: YamlConfig;\n}\n\nconst YamlContent = ({ yaml }: YamlConfig) =>
{yaml}
;\nYamlContent.displayName = 'Config';\n\nconst ConfigWithStatusIndicator = withStatusIndicator(YamlContent);\n\nexport const ConfigContent: FC = ({ error, data }) => {\n const [copied, setCopied] = useState(false);\n const config = data && data.yaml;\n return (\n <>\n

\n Configuration \n {\n setCopied(result);\n setTimeout(setCopied, 1500);\n }}\n >\n \n \n

\n \n \n );\n};\n\nconst Config: FC = () => {\n const pathPrefix = usePathPrefix();\n const { response, error } = useFetch(`${pathPrefix}/${API_PATH}/status/config`);\n return ;\n};\n\nexport default Config;\n","import React, { ChangeEvent, FC, useState } from 'react';\nimport { Input, InputGroup, Table } from 'reactstrap';\nimport { withStatusIndicator } from '../../components/withStatusIndicator';\nimport { useFetch } from '../../hooks/useFetch';\nimport { usePathPrefix } from '../../contexts/PathPrefixContext';\nimport { API_PATH } from '../../constants/constants';\nimport { faSort, faSortDown, faSortUp } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-common-types';\nimport sanitizeHTML from 'sanitize-html';\nimport { Fuzzy, FuzzyResult } from '@nexucis/fuzzy';\n\nconst fuz = new Fuzzy({ pre: '', post: '', shouldSort: true });\nconst flagSeparator = '||';\n\ninterface FlagMap {\n [key: string]: string;\n}\n\ninterface FlagsProps {\n data?: FlagMap;\n}\n\nconst compareAlphaFn =\n (keys: boolean, reverse: boolean) =>\n ([k1, v1]: [string, string], [k2, v2]: [string, string]): number => {\n const a = keys ? k1 : v1;\n const b = keys ? k2 : v2;\n const reverser = reverse ? -1 : 1;\n return reverser * a.localeCompare(b);\n };\n\nconst getSortIcon = (b: boolean | undefined): IconDefinition => {\n if (b === undefined) {\n return faSort;\n }\n if (b) {\n return faSortDown;\n }\n return faSortUp;\n};\n\ninterface SortState {\n name: string;\n alpha: boolean;\n focused: boolean;\n}\n\nexport const FlagsContent: FC = ({ data = {} }) => {\n const initialSearch = '';\n const [searchState, setSearchState] = useState(initialSearch);\n const initialSort: SortState = {\n name: 'Flag',\n alpha: true,\n focused: true,\n };\n const [sortState, setSortState] = useState(initialSort);\n const searchable = Object.entries(data)\n .sort(compareAlphaFn(sortState.name === 'Flag', !sortState.alpha))\n .map(([flag, value]) => `--${flag}${flagSeparator}${value}`);\n let filtered = searchable;\n if (searchState.length > 0) {\n filtered = fuz.filter(searchState, searchable).map((value: FuzzyResult) => value.rendered);\n }\n return (\n <>\n

Command-Line Flags

\n \n ): void => {\n setSearchState(target.value);\n }}\n />\n \n \n \n \n {['Flag', 'Value'].map((col: string) => (\n \n setSortState({\n name: col,\n focused: true,\n alpha: sortState.name === col ? !sortState.alpha : true,\n })\n }\n >\n {col}\n \n \n ))}\n \n \n \n {filtered.map((result: string) => {\n const [flagMatchStr, valueMatchStr] = result.split(flagSeparator);\n const sanitizeOpts = { allowedTags: ['strong'] };\n return (\n \n \n \n \n );\n })}\n \n
\n \n \n \n
\n \n );\n};\nconst FlagsWithStatusIndicator = withStatusIndicator(FlagsContent);\n\nFlagsContent.displayName = 'Flags';\n\nconst Flags: FC = () => {\n const pathPrefix = usePathPrefix();\n const { response, error, isLoading } = useFetch(`${pathPrefix}/${API_PATH}/status/flags`);\n return ;\n};\n\nexport default Flags;\n","import React, { FC } from 'react';\nimport { APIResponse } from '../../hooks/useFetch';\nimport { Alert, Table, Badge } from 'reactstrap';\nimport { Link } from 'react-router-dom';\nimport { formatRelative, createExpressionLink, humanizeDuration, formatDuration } from '../../utils';\nimport { Rule } from '../../types/types';\nimport { now } from 'moment';\n\ninterface RulesContentProps {\n response: APIResponse;\n}\n\ninterface RuleGroup {\n name: string;\n file: string;\n rules: Rule[];\n evaluationTime: string;\n lastEvaluation: string;\n}\n\nexport interface RulesMap {\n groups: RuleGroup[];\n}\n\nconst GraphExpressionLink: FC<{ expr: string; text: string; title: string }> = (props) => {\n return (\n <>\n {props.title}:\n \n {props.text}\n \n
\n \n );\n};\n\nexport const RulesContent: FC = ({ response }) => {\n const getBadgeColor = (state: string) => {\n switch (state) {\n case 'ok':\n return 'success';\n\n case 'err':\n return 'danger';\n\n case 'unknown':\n return 'warning';\n }\n };\n\n if (response.data) {\n const groups: RuleGroup[] = response.data.groups;\n return (\n <>\n

Rules

\n {groups.map((g, i) => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {g.rules.map((r, i) => {\n return (\n \n \n \n \n \n \n \n );\n })}\n \n
\n \n

\n {g.name}\n

\n
\n
\n

{formatRelative(g.lastEvaluation, now())}

\n
\n

{humanizeDuration(parseFloat(g.evaluationTime) * 1000)}

\n
RuleStateErrorLast EvaluationEvaluation Time
\n {r.alerts ? (\n \n ) : (\n \n )}\n \n {r.duration > 0 && (\n
\n for: {formatDuration(r.duration * 1000)}\n
\n )}\n {r.labels && Object.keys(r.labels).length > 0 && (\n
\n labels:\n {Object.entries(r.labels).map(([key, value]) => (\n
\n {key}: {value}\n
\n ))}\n
\n )}\n {r.alerts && r.annotations && Object.keys(r.annotations).length > 0 && (\n
\n annotations:\n {Object.entries(r.annotations).map(([key, value]) => (\n
\n {key}: {value}\n
\n ))}\n
\n )}\n
\n {r.health.toUpperCase()}\n {r.lastError ? {r.lastError} : null}{formatRelative(r.lastEvaluation, now())}{humanizeDuration(parseFloat(r.evaluationTime) * 1000)}
\n );\n })}\n \n );\n }\n\n return null;\n};\n","import React, { FC } from 'react';\nimport { useFetch } from '../../hooks/useFetch';\nimport { withStatusIndicator } from '../../components/withStatusIndicator';\nimport { RulesMap, RulesContent } from './RulesContent';\nimport { usePathPrefix } from '../../contexts/PathPrefixContext';\nimport { API_PATH } from '../../constants/constants';\n\nconst RulesWithStatusIndicator = withStatusIndicator(RulesContent);\n\nconst Rules: FC = () => {\n const pathPrefix = usePathPrefix();\n const { response, error, isLoading } = useFetch(`${pathPrefix}/${API_PATH}/rules`);\n\n return ;\n};\n\nexport default Rules;\n","import React, { FC } from 'react';\nimport { Button } from 'reactstrap';\n\ninterface ToggleMoreLessProps {\n event(): void;\n showMore: boolean;\n}\n\nexport const ToggleMoreLess: FC = ({ children, event, showMore }) => {\n return (\n

\n {children}\n \n show {showMore ? 'less' : 'more'}\n \n

\n );\n};\n","import React, { FC, useState } from 'react';\nimport { Badge, Table } from 'reactstrap';\nimport { TargetLabels } from './Services';\nimport { ToggleMoreLess } from '../../components/ToggleMoreLess';\n\ninterface LabelProps {\n value: TargetLabels[];\n name: string;\n}\n\nconst formatLabels = (labels: Record | string) => {\n return Object.entries(labels).map(([key, value]) => {\n return (\n
\n \n {`${key}=\"${value}\"`}\n \n
\n );\n });\n};\n\nexport const LabelsTable: FC = ({ value, name }) => {\n const [showMore, setShowMore] = useState(false);\n\n return (\n <>\n
\n {\n setShowMore(!showMore);\n }}\n showMore={showMore}\n >\n {name}\n \n
\n {showMore ? (\n \n \n \n \n \n \n \n \n {value.map((_, i) => {\n return (\n \n \n {value[i].isDropped ? (\n \n ) : (\n \n )}\n \n );\n })}\n \n
Discovered LabelsTarget Labels
{formatLabels(value[i].discoveredLabels)}Dropped{formatLabels(value[i].labels)}
\n ) : null}\n \n );\n};\n","import React, { FC } from 'react';\nimport { useFetch } from '../../hooks/useFetch';\nimport { LabelsTable } from './LabelsTable';\nimport { DroppedTarget, Labels, Target } from '../targets/target';\n\nimport { withStatusIndicator } from '../../components/withStatusIndicator';\nimport { mapObjEntries } from '../../utils';\nimport { usePathPrefix } from '../../contexts/PathPrefixContext';\nimport { API_PATH } from '../../constants/constants';\n\ninterface ServiceMap {\n activeTargets: Target[];\n droppedTargets: DroppedTarget[];\n}\n\nexport interface TargetLabels {\n discoveredLabels: Labels;\n labels: Labels;\n isDropped: boolean;\n}\n\nexport const processSummary = (\n activeTargets: Target[],\n droppedTargets: DroppedTarget[]\n): Record => {\n const targets: Record = {};\n\n // Get targets of each type along with the total and active end points\n for (const target of activeTargets) {\n const { scrapePool: name } = target;\n if (!targets[name]) {\n targets[name] = {\n total: 0,\n active: 0,\n };\n }\n targets[name].total++;\n targets[name].active++;\n }\n for (const target of droppedTargets) {\n const { job: name } = target.discoveredLabels;\n if (!targets[name]) {\n targets[name] = {\n total: 0,\n active: 0,\n };\n }\n targets[name].total++;\n }\n\n return targets;\n};\n\nexport const processTargets = (activeTargets: Target[], droppedTargets: DroppedTarget[]): Record => {\n const labels: Record = {};\n\n for (const target of activeTargets) {\n const name = target.scrapePool;\n if (!labels[name]) {\n labels[name] = [];\n }\n labels[name].push({\n discoveredLabels: target.discoveredLabels,\n labels: target.labels,\n isDropped: false,\n });\n }\n\n for (const target of droppedTargets) {\n const { job: name } = target.discoveredLabels;\n if (!labels[name]) {\n labels[name] = [];\n }\n labels[name].push({\n discoveredLabels: target.discoveredLabels,\n isDropped: true,\n labels: {},\n });\n }\n\n return labels;\n};\n\nexport const ServiceDiscoveryContent: FC = ({ activeTargets, droppedTargets }) => {\n const targets = processSummary(activeTargets, droppedTargets);\n const labels = processTargets(activeTargets, droppedTargets);\n\n return (\n <>\n

Service Discovery

\n \n
\n {mapObjEntries(labels, ([k, v]) => {\n return ;\n })}\n \n );\n};\nServiceDiscoveryContent.displayName = 'ServiceDiscoveryContent';\n\nconst ServicesWithStatusIndicator = withStatusIndicator(ServiceDiscoveryContent);\n\nconst ServiceDiscovery: FC = () => {\n const pathPrefix = usePathPrefix();\n const { response, error, isLoading } = useFetch(`${pathPrefix}/${API_PATH}/targets`);\n return (\n \n );\n};\n\nexport default ServiceDiscovery;\n","import React, { Fragment, FC } from 'react';\nimport { Table } from 'reactstrap';\nimport { withStatusIndicator } from '../../components/withStatusIndicator';\nimport { useFetch } from '../../hooks/useFetch';\nimport { usePathPrefix } from '../../contexts/PathPrefixContext';\nimport { API_PATH } from '../../constants/constants';\n\ninterface StatusPageProps {\n data: Record;\n title: string;\n}\n\nexport const statusConfig: Record<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { title?: string; customizeValue?: (v: any, key: string) => any; customRow?: boolean; skip?: boolean }\n> = {\n startTime: { title: 'Start time', customizeValue: (v: string) => new Date(v).toUTCString() },\n CWD: { title: 'Working directory' },\n reloadConfigSuccess: {\n title: 'Configuration reload',\n customizeValue: (v: boolean) => (v ? 'Successful' : 'Unsuccessful'),\n },\n lastConfigTime: { title: 'Last successful configuration reload' },\n corruptionCount: { title: 'WAL corruptions' },\n goroutineCount: { title: 'Goroutines' },\n storageRetention: { title: 'Storage retention' },\n activeAlertmanagers: {\n customRow: true,\n customizeValue: (alertMgrs: { url: string }[], key) => {\n return (\n \n \n Endpoint\n \n {alertMgrs.map(({ url }) => {\n const { origin, pathname } = new URL(url);\n return (\n \n \n {origin}\n {pathname}\n \n \n );\n })}\n \n );\n },\n },\n droppedAlertmanagers: { skip: true },\n};\n\nexport const StatusContent: FC = ({ data, title }) => {\n return (\n <>\n

{title}

\n \n \n {Object.entries(data).map(([k, v]) => {\n const { title = k, customizeValue = (val: string) => val, customRow, skip } = statusConfig[k] || {};\n if (skip) {\n return null;\n }\n if (customRow) {\n return customizeValue(v, k);\n }\n return (\n \n \n \n \n );\n })}\n \n
\n {title}\n {customizeValue(v, title)}
\n \n );\n};\nconst StatusWithStatusIndicator = withStatusIndicator(StatusContent);\n\nStatusContent.displayName = 'Status';\n\nconst StatusResult: FC<{ fetchPath: string; title: string }> = ({ fetchPath, title }) => {\n const { response, isLoading, error } = useFetch(fetchPath);\n return (\n \n );\n};\n\nconst Status: FC<{ agentMode: boolean }> = ({ agentMode }) => {\n const pathPrefix = usePathPrefix();\n const path = `${pathPrefix}/${API_PATH}`;\n\n return (\n <>\n {[\n { fetchPath: `${path}/status/runtimeinfo`, title: 'Runtime Information' },\n { fetchPath: `${path}/status/buildinfo`, title: 'Build Information' },\n { fetchPath: `${path}/alertmanagers`, title: 'Alertmanagers' },\n ].map(({ fetchPath, title }) => {\n if (agentMode && title === 'Alertmanagers') {\n return null;\n }\n return ;\n })}\n \n );\n};\n\nexport default Status;\n","import React, { Dispatch, FC, SetStateAction } from 'react';\nimport { Button, ButtonGroup } from 'reactstrap';\n\nexport interface FilterData {\n showHealthy: boolean;\n showUnhealthy: boolean;\n}\n\nexport interface Expanded {\n [scrapePool: string]: boolean;\n}\n\nexport interface FilterProps {\n filter: FilterData;\n setFilter: Dispatch>;\n expanded: Expanded;\n setExpanded: Dispatch>;\n}\n\nconst Filter: FC = ({ filter, setFilter, expanded, setExpanded }) => {\n const { showHealthy } = filter;\n const allExpanded = Object.values(expanded).every((v: boolean): boolean => v);\n const mapExpansion = (next: boolean): Expanded =>\n Object.keys(expanded).reduce(\n (acc: { [scrapePool: string]: boolean }, scrapePool: string) => ({\n ...acc,\n [scrapePool]: next,\n }),\n {}\n );\n const btnProps = {\n all: {\n active: showHealthy,\n className: 'all',\n color: 'primary',\n onClick: (): void => setFilter({ ...filter, showHealthy: true }),\n },\n unhealthy: {\n active: !showHealthy,\n className: 'unhealthy',\n color: 'primary',\n onClick: (): void => setFilter({ ...filter, showHealthy: false }),\n },\n expansionState: {\n active: false,\n className: 'expansion',\n color: 'primary',\n onClick: (): void => setExpanded(mapExpansion(!allExpanded)),\n },\n };\n return (\n \n \n \n \n \n );\n};\n\nexport default Filter;\n","import React, { FC } from 'react';\nimport { Badge } from 'reactstrap';\n\nexport interface EndpointLinkProps {\n endpoint: string;\n globalUrl: string;\n}\n\nconst EndpointLink: FC = ({ endpoint, globalUrl }) => {\n let url: URL;\n let search = '';\n let invalidURL = false;\n try {\n url = new URL(endpoint);\n } catch (err: unknown) {\n // In cases of IPv6 addresses with a Zone ID, URL may not be parseable.\n // See https://github.com/prometheus/prometheus/issues/9760\n // In this case, we attempt to prepare a synthetic URL with the\n // same query parameters, for rendering purposes.\n invalidURL = true;\n if (endpoint.indexOf('?') > -1) {\n search = endpoint.substring(endpoint.indexOf('?'));\n }\n url = new URL('http://0.0.0.0' + search);\n }\n\n const { host, pathname, protocol, searchParams }: URL = url;\n const params = Array.from(searchParams.entries());\n const displayLink = invalidURL ? endpoint.replace(search, '') : `${protocol}//${host}${pathname}`;\n return (\n <>\n {displayLink}\n {params.length > 0 ?
: null}\n {params.map(([labelName, labelValue]: [string, string]) => {\n return (\n \n {`${labelName}=\"${labelValue}\"`}\n \n );\n })}\n \n );\n};\n\nexport default EndpointLink;\n","import React, { FC, Fragment, useState } from 'react';\nimport { Badge, Tooltip } from 'reactstrap';\nimport 'css.escape';\nimport styles from './TargetLabels.module.css';\n\ninterface Labels {\n [key: string]: string;\n}\n\nexport interface TargetLabelsProps {\n discoveredLabels: Labels;\n labels: Labels;\n idx: number;\n scrapePool: string;\n}\n\nconst formatLabels = (labels: Labels): string[] => Object.keys(labels).map((key) => `${key}=\"${labels[key]}\"`);\n\nconst TargetLabels: FC = ({ discoveredLabels, labels, idx, scrapePool }) => {\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n const toggle = (): void => setTooltipOpen(!tooltipOpen);\n const id = `series-labels-${scrapePool}-${idx}`;\n\n return (\n <>\n
\n {Object.keys(labels).map((labelName) => {\n return (\n \n {`${labelName}=\"${labels[labelName]}\"`}\n \n );\n })}\n
\n \n Before relabeling:\n {formatLabels(discoveredLabels).map((s: string, idx: number) => (\n \n
\n {s}\n
\n ))}\n
\n \n );\n};\n\nexport default TargetLabels;\n","import React, { FC, Fragment, useState } from 'react';\nimport { Tooltip } from 'reactstrap';\nimport 'css.escape';\nimport { humanizeDuration } from '../../utils';\n\nexport interface TargetScrapeDurationProps {\n duration: number;\n interval: string;\n timeout: string;\n idx: number;\n scrapePool: string;\n}\n\nconst TargetScrapeDuration: FC = ({ duration, interval, timeout, idx, scrapePool }) => {\n const [scrapeTooltipOpen, setScrapeTooltipOpen] = useState(false);\n const id = `scrape-duration-${scrapePool}-${idx}`;\n\n return (\n <>\n
\n {humanizeDuration(duration * 1000)}\n
\n setScrapeTooltipOpen(!scrapeTooltipOpen)}\n target={CSS.escape(id)}\n style={{ maxWidth: 'none', textAlign: 'left' }}\n >\n \n Interval: {interval}\n
\n
\n \n Timeout: {timeout}\n \n \n \n );\n};\n\nexport default TargetScrapeDuration;\n","import React, { FC } from 'react';\nimport { ScrapePool, getColor } from './target';\nimport { Collapse, Table, Badge } from 'reactstrap';\nimport styles from './ScrapePoolPanel.module.css';\nimport { Target } from './target';\nimport EndpointLink from './EndpointLink';\nimport TargetLabels from './TargetLabels';\nimport TargetScrapeDuration from './TargetScrapeDuration';\nimport { now } from 'moment';\nimport { ToggleMoreLess } from '../../components/ToggleMoreLess';\nimport { formatRelative } from '../../utils';\n\ninterface PanelProps {\n scrapePool: string;\n targetGroup: ScrapePool;\n expanded: boolean;\n toggleExpanded: () => void;\n}\n\nexport const columns = ['Endpoint', 'State', 'Labels', 'Last Scrape', 'Scrape Duration', 'Error'];\n\nconst ScrapePoolPanel: FC = ({ scrapePool, targetGroup, expanded, toggleExpanded }) => {\n const modifier = targetGroup.upCount < targetGroup.targets.length ? 'danger' : 'normal';\n const id = `pool-${scrapePool}`;\n const anchorProps = {\n href: `#${id}`,\n id,\n };\n\n return (\n
\n \n \n {`${scrapePool} (${targetGroup.upCount}/${targetGroup.targets.length} up)`}\n \n \n \n \n \n \n {columns.map((column) => (\n \n ))}\n \n \n \n {targetGroup.targets.map((target: Target, idx: number) => {\n const {\n discoveredLabels,\n labels,\n scrapePool,\n scrapeUrl,\n globalUrl,\n lastError,\n lastScrape,\n lastScrapeDuration,\n health,\n scrapeInterval,\n scrapeTimeout,\n } = target;\n const color = getColor(health);\n\n return (\n \n \n \n \n \n \n \n \n );\n })}\n \n
{column}
\n \n \n {health.toUpperCase()}\n \n \n {formatRelative(lastScrape, now())}\n \n {lastError ? {lastError} : null}
\n
\n
\n );\n};\n\nexport default ScrapePoolPanel;\n","export interface Labels {\n [key: string]: string;\n}\n\nexport interface Target {\n discoveredLabels: Labels;\n labels: Labels;\n scrapePool: string;\n scrapeUrl: string;\n globalUrl: string;\n lastError: string;\n lastScrape: string;\n lastScrapeDuration: number;\n health: string;\n scrapeInterval: string;\n scrapeTimeout: string;\n}\n\nexport interface DroppedTarget {\n discoveredLabels: Labels;\n}\n\nexport interface ScrapePool {\n upCount: number;\n targets: Target[];\n}\n\nexport interface ScrapePools {\n [scrapePool: string]: ScrapePool;\n}\n\nexport const groupTargets = (targets: Target[]): ScrapePools =>\n targets.reduce((pools: ScrapePools, target: Target) => {\n const { health, scrapePool } = target;\n const up = health.toLowerCase() === 'up' ? 1 : 0;\n if (!pools[scrapePool]) {\n pools[scrapePool] = {\n upCount: 0,\n targets: [],\n };\n }\n pools[scrapePool].targets.push(target);\n pools[scrapePool].upCount += up;\n return pools;\n }, {});\n\nexport const getColor = (health: string): string => {\n switch (health.toLowerCase()) {\n case 'up':\n return 'success';\n case 'down':\n return 'danger';\n default:\n return 'warning';\n }\n};\n","import React, { FC } from 'react';\nimport Filter, { Expanded, FilterData } from './Filter';\nimport { useFetch } from '../../hooks/useFetch';\nimport { groupTargets, Target } from './target';\nimport ScrapePoolPanel from './ScrapePoolPanel';\nimport { withStatusIndicator } from '../../components/withStatusIndicator';\nimport { usePathPrefix } from '../../contexts/PathPrefixContext';\nimport { API_PATH } from '../../constants/constants';\nimport { useLocalStorage } from '../../hooks/useLocalStorage';\n\ninterface ScrapePoolListProps {\n activeTargets: Target[];\n}\n\nexport const ScrapePoolContent: FC = ({ activeTargets }) => {\n const targetGroups = groupTargets(activeTargets);\n const initialFilter: FilterData = {\n showHealthy: true,\n showUnhealthy: true,\n };\n const [filter, setFilter] = useLocalStorage('targets-page-filter', initialFilter);\n\n const initialExpanded: Expanded = Object.keys(targetGroups).reduce(\n (acc: { [scrapePool: string]: boolean }, scrapePool: string) => ({\n ...acc,\n [scrapePool]: true,\n }),\n {}\n );\n const [expanded, setExpanded] = useLocalStorage('targets-page-expansion-state', initialExpanded);\n\n const { showHealthy, showUnhealthy } = filter;\n return (\n <>\n \n {Object.keys(targetGroups)\n .filter((scrapePool) => {\n const targetGroup = targetGroups[scrapePool];\n const isHealthy = targetGroup.upCount === targetGroup.targets.length;\n return (isHealthy && showHealthy) || (!isHealthy && showUnhealthy);\n })\n .map((scrapePool) => (\n setExpanded({ ...expanded, [scrapePool]: !expanded[scrapePool] })}\n />\n ))}\n \n );\n};\nScrapePoolContent.displayName = 'ScrapePoolContent';\n\nconst ScrapePoolListWithStatusIndicator = withStatusIndicator(ScrapePoolContent);\n\nconst ScrapePoolList: FC = () => {\n const pathPrefix = usePathPrefix();\n const { response, error, isLoading } = useFetch(`${pathPrefix}/${API_PATH}/targets?state=active`);\n const { status: responseStatus } = response;\n const badResponse = responseStatus !== 'success' && responseStatus !== 'start fetching';\n return (\n \n );\n};\n\nexport default ScrapePoolList;\n","import React, { FC } from 'react';\nimport ScrapePoolList from './ScrapePoolList';\n\nconst Targets: FC = () => {\n return (\n <>\n

Targets

\n \n \n );\n};\n\nexport default Targets;\n","import React, { FC, useState, useEffect } from 'react';\nimport { Alert, Button } from 'reactstrap';\n\nimport Panel, { PanelOptions, PanelDefaultOptions } from './Panel';\nimport Checkbox from '../../components/Checkbox';\nimport { generateID, decodePanelOptionsFromQueryString, encodePanelOptionsToQueryString, callAll } from '../../utils';\nimport { useFetch } from '../../hooks/useFetch';\nimport { useLocalStorage } from '../../hooks/useLocalStorage';\nimport { usePathPrefix } from '../../contexts/PathPrefixContext';\nimport { API_PATH } from '../../constants/constants';\n\nexport type PanelMeta = { key: string; options: PanelOptions; id: string };\n\nexport const updateURL = (nextPanels: PanelMeta[]): void => {\n const query = encodePanelOptionsToQueryString(nextPanels);\n window.history.pushState({}, '', query);\n};\n\ninterface PanelListContentProps {\n panels: PanelMeta[];\n metrics: string[];\n useLocalTime: boolean;\n queryHistoryEnabled: boolean;\n enableAutocomplete: boolean;\n enableHighlighting: boolean;\n enableLinter: boolean;\n}\n\nexport const PanelListContent: FC = ({\n metrics = [],\n useLocalTime,\n queryHistoryEnabled,\n enableAutocomplete,\n enableHighlighting,\n enableLinter,\n ...rest\n}) => {\n const [panels, setPanels] = useState(rest.panels);\n const [historyItems, setLocalStorageHistoryItems] = useLocalStorage('history', []);\n\n useEffect(() => {\n !panels.length && addPanel();\n window.onpopstate = () => {\n const panels = decodePanelOptionsFromQueryString(window.location.search);\n if (panels.length > 0) {\n setPanels(panels);\n }\n };\n // We want useEffect to act only as componentDidMount, but react still complains about the empty dependencies list.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleExecuteQuery = (query: string) => {\n const isSimpleMetric = metrics.indexOf(query) !== -1;\n if (isSimpleMetric || !query.length) {\n return;\n }\n const extendedItems = historyItems.reduce(\n (acc, metric) => {\n return metric === query ? acc : [...acc, metric]; // Prevent adding query twice.\n },\n [query]\n );\n setLocalStorageHistoryItems(extendedItems.slice(0, 50));\n };\n\n const addPanel = () => {\n callAll(\n setPanels,\n updateURL\n )([\n ...panels,\n {\n id: generateID(),\n key: `${panels.length}`,\n options: PanelDefaultOptions,\n },\n ]);\n };\n\n const pathPrefix = usePathPrefix();\n\n return (\n <>\n {panels.map(({ id, options }) => (\n \n callAll(setPanels, updateURL)(panels.map((p) => (id === p.id ? { ...p, options: opts } : p)))\n }\n removePanel={() =>\n callAll(\n setPanels,\n updateURL\n )(\n panels.reduce(\n (acc, panel) => (panel.id !== id ? [...acc, { ...panel, key: `${acc.length}` }] : acc),\n []\n )\n )\n }\n useLocalTime={useLocalTime}\n metricNames={metrics}\n pastQueries={queryHistoryEnabled ? historyItems : []}\n enableAutocomplete={enableAutocomplete}\n enableHighlighting={enableHighlighting}\n enableLinter={enableLinter}\n />\n ))}\n \n \n );\n};\n\nconst PanelList: FC = () => {\n const [delta, setDelta] = useState(0);\n const [useLocalTime, setUseLocalTime] = useLocalStorage('use-local-time', false);\n const [enableQueryHistory, setEnableQueryHistory] = useLocalStorage('enable-query-history', false);\n const [enableAutocomplete, setEnableAutocomplete] = useLocalStorage('enable-metric-autocomplete', true);\n const [enableHighlighting, setEnableHighlighting] = useLocalStorage('enable-syntax-highlighting', true);\n const [enableLinter, setEnableLinter] = useLocalStorage('enable-linter', true);\n\n const pathPrefix = usePathPrefix();\n const { response: metricsRes, error: metricsErr } = useFetch(`${pathPrefix}/${API_PATH}/label/__name__/values`);\n\n const browserTime = new Date().getTime() / 1000;\n const { response: timeRes, error: timeErr } = useFetch<{ result: number[] }>(\n `${pathPrefix}/${API_PATH}/query?query=time()`\n );\n\n useEffect(() => {\n if (timeRes.data) {\n const serverTime = timeRes.data.result[0];\n setDelta(Math.abs(browserTime - serverTime));\n }\n /**\n * React wants to include browserTime to useEffect dependencies list which will cause a delta change on every re-render\n * Basically it's not recommended to disable this rule, but this is the only way to take control over the useEffect\n * dependencies and to not include the browserTime variable.\n **/\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [timeRes.data]);\n\n return (\n <>\n
\n
\n setUseLocalTime(target.checked)}\n defaultChecked={useLocalTime}\n >\n Use local time\n \n setEnableQueryHistory(target.checked)}\n defaultChecked={enableQueryHistory}\n >\n Enable query history\n \n setEnableAutocomplete(target.checked)}\n defaultChecked={enableAutocomplete}\n >\n Enable autocomplete\n \n
\n setEnableHighlighting(target.checked)}\n defaultChecked={enableHighlighting}\n >\n Enable highlighting\n \n setEnableLinter(target.checked)}\n defaultChecked={enableLinter}\n >\n Enable linter\n \n
\n {(delta > 30 || timeErr) && (\n \n Warning: \n {timeErr && `Unexpected response status when fetching server time: ${timeErr.message}`}\n {delta >= 30 &&\n `Error fetching server time: Detected ${delta} seconds time difference between your browser and the server. Prometheus relies on accurate time and time drift might cause unexpected query results.`}\n \n )}\n {metricsErr && (\n \n Warning: \n Error fetching metrics list: Unexpected response status when fetching metric names: {metricsErr.message}\n \n )}\n \n \n );\n};\n\nexport default PanelList;\n","import React, { FC } from 'react';\nimport { Table } from 'reactstrap';\n\nimport { useFetch } from '../../hooks/useFetch';\nimport { withStatusIndicator } from '../../components/withStatusIndicator';\nimport { usePathPrefix } from '../../contexts/PathPrefixContext';\nimport { API_PATH } from '../../constants/constants';\n\ninterface Stats {\n name: string;\n value: number;\n}\n\ninterface HeadStats {\n numSeries: number;\n numLabelPairs: number;\n chunkCount: number;\n minTime: number;\n maxTime: number;\n}\n\nexport interface TSDBMap {\n headStats: HeadStats;\n seriesCountByMetricName: Stats[];\n labelValueCountByLabelName: Stats[];\n memoryInBytesByLabelName: Stats[];\n seriesCountByLabelValuePair: Stats[];\n}\n\nexport const TSDBStatusContent: FC = ({\n headStats,\n labelValueCountByLabelName,\n seriesCountByMetricName,\n memoryInBytesByLabelName,\n seriesCountByLabelValuePair,\n}) => {\n const unixToTime = (unix: number): string => {\n try {\n return `${new Date(unix).toISOString()} (${unix})`;\n } catch {\n if (numSeries === 0) {\n return 'No datapoints yet';\n }\n return `Error parsing time (${unix})`;\n }\n };\n const { chunkCount, numSeries, numLabelPairs, minTime, maxTime } = headStats;\n const stats = [\n { header: 'Number of Series', value: numSeries },\n { header: 'Number of Chunks', value: chunkCount },\n { header: 'Number of Label Pairs', value: numLabelPairs },\n { header: 'Current Min Time', value: `${unixToTime(minTime)}` },\n { header: 'Current Max Time', value: `${unixToTime(maxTime)}` },\n ];\n return (\n
\n

TSDB Status

\n

Head Stats

\n
\n \n \n \n {stats.map(({ header }) => {\n return ;\n })}\n \n \n \n \n {stats.map(({ header, value }) => {\n return ;\n })}\n \n \n
{header}
{value}
\n
\n

Head Cardinality Stats

\n {[\n { title: 'Top 10 label names with value count', stats: labelValueCountByLabelName },\n { title: 'Top 10 series count by metric names', stats: seriesCountByMetricName },\n { title: 'Top 10 label names with high memory usage', unit: 'Bytes', stats: memoryInBytesByLabelName },\n { title: 'Top 10 series count by label value pairs', stats: seriesCountByLabelValuePair },\n ].map(({ title, unit = 'Count', stats }) => {\n return (\n
\n

{title}

\n \n \n \n \n \n \n \n \n {stats.map(({ name, value }) => {\n return (\n \n \n \n \n );\n })}\n \n
Name{unit}
{name}{value}
\n
\n );\n })}\n
\n );\n};\nTSDBStatusContent.displayName = 'TSDBStatusContent';\n\nconst TSDBStatusContentWithStatusIndicator = withStatusIndicator(TSDBStatusContent);\n\nconst TSDBStatus: FC = () => {\n const pathPrefix = usePathPrefix();\n const { response, error, isLoading } = useFetch(`${pathPrefix}/${API_PATH}/status/tsdb`);\n\n return (\n \n );\n};\n\nexport default TSDBStatus;\n","import React, { FC, ComponentType } from 'react';\nimport { Progress, Alert } from 'reactstrap';\n\nimport { useFetchReadyInterval } from '../hooks/useFetch';\nimport { WALReplayData } from '../types/types';\nimport { usePathPrefix } from '../contexts/PathPrefixContext';\n\ninterface StartingContentProps {\n isUnexpected: boolean;\n status?: WALReplayData;\n}\n\nexport const StartingContent: FC = ({ status, isUnexpected }) => {\n if (isUnexpected) {\n return (\n \n Error: Server is not responding\n \n );\n }\n\n return (\n
\n
\n

Starting up...

\n {status && status.max > 0 ? (\n
\n

\n Replaying WAL ({status.current}/{status.max})\n

\n \n
\n ) : null}\n
\n
\n );\n};\n\nexport const withStartingIndicator =\n >(Page: ComponentType): FC =>\n ({ ...rest }) => {\n const pathPrefix = usePathPrefix();\n const { ready, walReplayStatus, isUnexpected } = useFetchReadyInterval(pathPrefix);\n\n if (ready || isUnexpected) {\n return ;\n }\n\n return ;\n };\n","import Agent from './agent/Agent';\nimport Alerts from './alerts/Alerts';\nimport Config from './config/Config';\nimport Flags from './flags/Flags';\nimport Rules from './rules/Rules';\nimport ServiceDiscovery from './serviceDiscovery/Services';\nimport Status from './status/Status';\nimport Targets from './targets/Targets';\nimport PanelList from './graph/PanelList';\nimport TSDBStatus from './tsdbStatus/TSDBStatus';\nimport { withStartingIndicator } from '../components/withStartingIndicator';\n\nconst AgentPage = withStartingIndicator(Agent);\nconst AlertsPage = withStartingIndicator(Alerts);\nconst ConfigPage = withStartingIndicator(Config);\nconst FlagsPage = withStartingIndicator(Flags);\nconst RulesPage = withStartingIndicator(Rules);\nconst ServiceDiscoveryPage = withStartingIndicator(ServiceDiscovery);\nconst StatusPage = withStartingIndicator(Status);\nconst TSDBStatusPage = withStartingIndicator(TSDBStatus);\nconst TargetsPage = withStartingIndicator(Targets);\nconst PanelListPage = withStartingIndicator(PanelList);\n\n// prettier-ignore\nexport {\n AgentPage,\n AlertsPage,\n ConfigPage,\n FlagsPage,\n RulesPage,\n ServiceDiscoveryPage,\n StatusPage,\n TSDBStatusPage,\n TargetsPage,\n PanelListPage\n};\n","import { useEffect, useState } from 'react';\n\n// A hook to determine whether a CSS media query finds any matches.\nconst useMedia = (query: string): boolean => {\n const mediaQuery = window.matchMedia(query);\n const [matches, setMatches] = useState(mediaQuery.matches);\n\n useEffect(() => {\n const handler = () => setMatches(mediaQuery.matches);\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n }, [mediaQuery]);\n\n return matches;\n};\n\nexport default useMedia;\n","import React, { FC } from 'react';\nimport Navigation from './Navbar';\nimport { Container } from 'reactstrap';\n\nimport { BrowserRouter as Router, Redirect, Switch, Route } from 'react-router-dom';\nimport {\n AgentPage,\n AlertsPage,\n ConfigPage,\n FlagsPage,\n RulesPage,\n ServiceDiscoveryPage,\n StatusPage,\n TargetsPage,\n TSDBStatusPage,\n PanelListPage,\n} from './pages';\nimport { PathPrefixContext } from './contexts/PathPrefixContext';\nimport { ThemeContext, themeName, themeSetting } from './contexts/ThemeContext';\nimport { Theme, themeLocalStorageKey } from './Theme';\nimport { useLocalStorage } from './hooks/useLocalStorage';\nimport useMedia from './hooks/useMedia';\n\ninterface AppProps {\n consolesLink: string | null;\n agentMode: boolean;\n}\n\nconst App: FC = ({ consolesLink, agentMode }) => {\n // This dynamically/generically determines the pathPrefix by stripping the first known\n // endpoint suffix from the window location path. It works out of the box for both direct\n // hosting and reverse proxy deployments with no additional configurations required.\n let basePath = window.location.pathname;\n const paths = [\n '/agent',\n '/graph',\n '/alerts',\n '/status',\n '/tsdb-status',\n '/flags',\n '/config',\n '/rules',\n '/targets',\n '/service-discovery',\n ];\n if (basePath.endsWith('/')) {\n basePath = basePath.slice(0, -1);\n }\n if (basePath.length > 1) {\n for (let i = 0; i < paths.length; i++) {\n if (basePath.endsWith(paths[i])) {\n basePath = basePath.slice(0, basePath.length - paths[i].length);\n break;\n }\n }\n }\n\n const [userTheme, setUserTheme] = useLocalStorage(themeLocalStorageKey, 'auto');\n const browserHasThemes = useMedia('(prefers-color-scheme)');\n const browserWantsDarkTheme = useMedia('(prefers-color-scheme: dark)');\n\n let theme: themeName;\n if (userTheme !== 'auto') {\n theme = userTheme;\n } else {\n theme = browserHasThemes ? (browserWantsDarkTheme ? 'dark' : 'light') : 'light';\n }\n\n return (\n setUserTheme(t) }}\n >\n \n \n \n \n \n \n \n {/*\n NOTE: Any route added here needs to also be added to the list of\n React-handled router paths (\"reactRouterPaths\") in /web/web.go.\n */}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default App;\n","import './globals';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport './themes/app.scss';\nimport './themes/light.scss';\nimport './themes/dark.scss';\nimport './fonts/codicon.ttf';\nimport { isPresent } from './utils';\n\n// Declared/defined in public/index.html, value replaced by Prometheus when serving bundle.\ndeclare const GLOBAL_CONSOLES_LINK: string;\ndeclare const GLOBAL_AGENT_MODE: string;\n\nlet consolesLink: string | null = GLOBAL_CONSOLES_LINK;\nconst agentMode: string | null = GLOBAL_AGENT_MODE;\n\nif (\n GLOBAL_CONSOLES_LINK === 'CONSOLES_LINK_PLACEHOLDER' ||\n GLOBAL_CONSOLES_LINK === '' ||\n !isPresent(GLOBAL_CONSOLES_LINK)\n) {\n consolesLink = null;\n}\n\nReactDOM.render(, document.getElementById('root'));\n","export default __webpack_public_path__ + \"static/media/codicon.b3726f01.ttf\";","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"ScrapePoolPanel_container__2macm\",\"title\":\"ScrapePoolPanel_title__1ppGj\",\"normal\":\"ScrapePoolPanel_normal__1AuiN ScrapePoolPanel_title__1ppGj\",\"danger\":\"ScrapePoolPanel_danger__ZoHk6 ScrapePoolPanel_title__1ppGj\",\"table\":\"ScrapePoolPanel_table__1Sdr1\",\"cell\":\"ScrapePoolPanel_cell__3LVb_\",\"endpoint\":\"ScrapePoolPanel_endpoint__1N4gx ScrapePoolPanel_cell__3LVb_\",\"labels\":\"ScrapePoolPanel_labels__1VVxb ScrapePoolPanel_cell__3LVb_\",\"state\":\"ScrapePoolPanel_state__2BqDx ScrapePoolPanel_cell__3LVb_\",\"last-scrape\":\"ScrapePoolPanel_last-scrape__192VK ScrapePoolPanel_cell__3LVb_\",\"errors\":\"ScrapePoolPanel_errors__2JBvY ScrapePoolPanel_cell__3LVb_\"};","\"use strict\";\n// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VectorMatchCardinality = exports.Matcher = exports.getFunction = exports.ValueType = void 0;\nvar function_1 = require(\"./function\");\nObject.defineProperty(exports, \"ValueType\", { enumerable: true, get: function () { return function_1.ValueType; } });\nObject.defineProperty(exports, \"getFunction\", { enumerable: true, get: function () { return function_1.getFunction; } });\nvar matcher_1 = require(\"./matcher\");\nObject.defineProperty(exports, \"Matcher\", { enumerable: true, get: function () { return matcher_1.Matcher; } });\nvar vector_1 = require(\"./vector\");\nObject.defineProperty(exports, \"VectorMatchCardinality\", { enumerable: true, get: function () { return vector_1.VectorMatchCardinality; } });\n//# sourceMappingURL=index.js.map"],"sourceRoot":""}