{"version":3,"sources":["pages/targets/TargetLabels.module.css","vendor/flot/jquery.flot.js","vendor/flot/jquery.flot.stack.js","vendor/flot/jquery.flot.time.js","vendor/flot/jquery.flot.crosshair.js","fonts/codicon.ttf","globals.ts","contexts/PathPrefixContext.tsx","contexts/ThemeContext.tsx","Theme.tsx","Navbar.tsx","hooks/useFetch.ts","components/withStatusIndicator.tsx","pages/graph/MetricsExplorer.tsx","pages/graph/ExpressionInput.tsx","pages/graph/CMTheme.tsx","pages/graph/CMExpressionInput.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","constants/constants.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/ScrapePoolPanel.tsx","pages/targets/target.ts","pages/targets/ScrapePoolList.tsx","pages/targets/Targets.tsx","pages/graph/PanelList.tsx","pages/tsdbStatus/TSDBStatus.tsx","App.tsx","index.tsx","pages/targets/ScrapePoolPanel.module.css"],"names":["module","exports","$","color","make","r","g","b","a","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","this","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","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","lineJoin","sw","angle","PI","sin","cos","getFillStyle","areaOpen","ypos","segmentStart","segmentEnd","x1old","x2old","plotLineArea","drawSeriesLines","abandonedPoints","beforeX","afterX","emptyPoints","olddatapoints","drawSeriesPoints","drawOrphanedPoints","barLeft","fillStyleCallback","barRight","drawBar","plotBars","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","jquery","moment","require","PathPrefixContext","React","createContext","usePathPrefix","useContext","ThemeContext","theme","userPreference","setTheme","useTheme","Theme","useEffect","body","classList","toggle","ThemeToggle","Form","inline","ButtonGroup","Button","title","icon","faSun","faMoon","faAdjust","Navigation","consolesLink","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","useFetch","url","status","response","setResponse","error","setError","isLoading","setIsLoading","fetch","credentials","ok","statusText","json","fetchData","withStatusIndicator","Component","customErrorMsg","componentTitle","rest","Alert","displayName","message","faSpinner","spin","MetricsExplorer","handleMetricClick","query","insertAtCursor","updateShow","Modal","ModalHeader","ModalBody","metrics","map","metric","ExpressionInput","exprInputRef","createRef","setHeight","current","offsetHeight","clientHeight","scrollHeight","setState","handleInput","setValue","onExpressionChange","handleKeyPress","executeQuery","shiftKey","preventDefault","getSearchMatches","input","expressions","fuzzy","filter","pre","post","createAutocompleteSection","downshift","inputValue","closeMenu","highlightedIndex","autocompleteSections","queryHistory","metricNames","index","sections","enableAutocomplete","reduce","acc","items","matches","original","string","itemProps","getItemProps","dangerouslySetInnerHTML","__html","sanitizeHTML","allowedTags","getMenuProps","openMetricsExplorer","showMetricsExplorer","updateShowMetricsExplorer","newValue","startPosition","selectionStart","endPosition","selectionEnd","previousValue","substring","state","prevProps","onSelect","InputGroup","InputGroupAddon","addonType","InputGroupText","loading","faSearch","Input","onInput","autoFocus","type","rows","onKeyPress","innerRef","getInputProps","onKeyDown","nativeEvent","preventDownshiftDefault","blur","faGlobeEurope","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","keyword","function","variableName","labelName","operator","modifier","paren","squareBracket","brace","invalid","comment","fontStyle","promqlExtension","PromQLExtension","dynamicConfigCompartment","Compartment","HistoryCompleteStrategy","complete","Promise","resolve","promQL","then","tree","syntaxTree","historyItems","q","detail","CMExpressionInput","enableHighlighting","enableLinter","containerRef","useRef","viewRef","setShowMetricsExplorer","activateCompletion","activateLinter","setComplete","completeStrategy","newCompleteStrategy","remote","initialMetricList","dynamicConfig","asExtension","view","startState","EditorState","create","doc","extensions","highlightSpecialChars","history","allowMultipleSelections","of","indentOnInput","bracketMatching","closeBrackets","autocompletion","highlightSelectionMatches","lineWrapping","keymap","closeBracketsKeymap","defaultKeymap","searchKeymap","historyKeymap","commentKeymap","completionKeymap","lintKeymap","run","contentDOM","Prec","override","insertNewlineAndIndent","updateListener","update","focus","dispatch","effects","reconfigure","ref","selection","changes","insert","library","faChevronLeft","faChevronRight","faCalendarCheck","faArrowUp","faArrowDown","faTimes","dom","watch","TimeInput","timeInputRef","$time","getBaseTime","time","valueOf","calcShiftRange","range","increaseTime","onChangeTime","decreaseTime","clearTime","useLocalTime","tz","guess","datetimepicker","icons","today","buttons","showClose","showToday","sideBySide","locale","timeZone","defaultDate","on","fixedWidth","onFocus","onBlur","includes","GraphControls","rangeRef","resolutionRef","rangeSteps","onChangeRangeInput","rangeText","parseDuration","changeRangeInput","onChangeRange","formatDuration","increaseRange","decreaseRange","resolution","onSubmit","faMinus","faPlus","endTime","onChangeEndTime","onChangeResolution","bsSize","onChangeStacking","stacked","faChartLine","faChartArea","SeriesName","labels","labelNodes","__name__","renderFormatted","metricToSeriesName","Legend","selectedIndexes","handleSeriesSelect","ev","selected","chartData","idx","onSeriesToggle","shouldReset","onLegendMouseOut","onHover","canUseHover","onMouseOver","navigator","platform","PureComponent","formatValue","absY","getHoverColor","toHoverColor","showTicks","showMinorTicks","timeBase","tooltip","cssClass","xval","yval","dateTime","keys","escapeHTML","defaultTheme","normalizeData","queryParams","result","getColors","startTime","values","currentValue","parseValue","PanelType","Graph","chartRef","$chart","rafID","selectedSeriesIndexes","destroyPlot","isPresent","selectedIndex","handleSeriesHover","cancelAnimationFrame","requestAnimationFrame","plotSetAndDraw","handleLegendMouseOut","handleResize","handleWidth","onResize","skipOnMount","GraphTabContent","lastQueryParams","resultType","limitSeries","DataTable","limited","doFormat","valueText","whiteSpace","Table","hover","QueryStatsView","loadTime","resultSeries","PanelDefaultOptions","expr","Panel","abortInFlightFetch","exprInputValue","queryStart","now","onExecuteQuery","setOptions","abortController","AbortController","abort","path","getEndTime","params","URLSearchParams","signal","resp","warnings","stats","catch","handleExpressionChange","handleChangeRange","handleChangeEndTime","handleChangeResolution","handleChangeType","handleChangeStacking","prevOpts","newOpts","onOptionsChanged","pastQueries","Row","Col","useExperimentalEditor","warning","tabs","TabContent","activeTab","TabPane","tabId","removePanel","generateID","random","byEmptyString","entityMap","String","tsName","labelStrings","durationStr","durationRE","RegExp","match","dur","mult","ms","exact","parseTime","timeText","humanizeDuration","milliseconds","sign","unsignedMillis","duration","seconds","minutes","asDays","formatRelative","startStr","paramFormat","decodePanelOptionsFromQueryString","urlParams","split","panels","urlParam","panelsCount","prefix","startsWith","prefixLen","id","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","cursor","faChevronDown","alerts","bordered","alert","Badge","activeAt","memo","wrapperStyles","FormGroup","Label","userSelect","for","useLocalStorage","localStorageKey","initialState","localStorageState","JSON","localStorage","getItem","stringify","serializedState","setItem","stateColorTuples","AlertsContent","groups","statsCount","setFilter","checked","setShowAnnotations","ruleState","onChange","target","group","rules","some","file","GroupInfo","statesCounter","AlertsWithStatusIndicator","Alerts","ruleStatsCount","el","YamlContent","yaml","ConfigWithStatusIndicator","ConfigContent","copied","setCopied","config","onCopy","disabled","Config","FlagsContent","striped","FlagsWithStatusIndicator","Flags","GraphExpressionLink","RulesWithStatusIndicator","getBadgeColor","lastEvaluation","evaluationTime","health","toUpperCase","lastError","Rules","ToggleMoreLess","showMore","formatLabels","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","Status","fetchResult","Filter","expanded","setExpanded","showHealthy","allExpanded","every","btnProps","all","unhealthy","expansionState","next","EndpointLink","endpoint","globalUrl","host","protocol","searchParams","Array","labelValue","TargetLabels","tooltipOpen","setTooltipOpen","Tooltip","CSS","textAlign","styles","discovered","columns","ScrapePoolPanel","targetGroup","toggleExpanded","upCount","anchorProps","column","scrapeUrl","lastScrape","lastScrapeDuration","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","setUseExperimentalEditor","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","App","basePath","paths","endsWith","userTheme","setUserTheme","browserHasThemes","useMedia","browserWantsDarkTheme","Provider","Container","fluid","paddingTop","basepath","noThrow","GLOBAL_CONSOLES_LINK","ReactDOM","getElementById"],"mappings":"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","file":"static/js/main.5fdc5e81.chunk.js","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"discovered\":\"TargetLabels_discovered__2eSl4\"};","/**\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","module.exports = __webpack_public_path__ + \"static/media/codicon.22349029.ttf\";","import jquery from 'jquery';\n\n(window as any).jQuery = jquery;\n(window as any).moment = require('moment');\n","import React from 'react';\n\nconst PathPrefixContext = React.createContext('');\n\nfunction usePathPrefix() {\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 = () => {\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 '@reach/router';\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}\n\nconst Navigation: FC = ({ consolesLink }) => {\n const [isOpen, setIsOpen] = useState(false);\n const toggle = () => setIsOpen(!isOpen);\n const pathPrefix = usePathPrefix();\n return (\n \n \n \n Prometheus\n \n \n \n \n \n \n );\n};\n\nexport default Navigation;\n","import { useState, useEffect } from 'react';\n\nexport type APIResponse = { status: string; data: T };\n\nexport interface FetchState {\n response: APIResponse;\n error?: Error;\n isLoading: boolean;\n}\n\nexport const useFetch = (url: string, options?: RequestInit): FetchState => {\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 (error) {\n setError(error);\n }\n };\n fetchData();\n }, [url, options]);\n return { response, error, isLoading };\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 = (Component: ComponentType): FC => ({\n error,\n isLoading,\n customErrorMsg,\n componentTitle,\n ...rest\n}) => {\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 React, { Component } from 'react';\nimport { Modal, ModalBody, ModalHeader } from 'reactstrap';\n\ninterface Props {\n show: boolean;\n updateShow(show: boolean): void;\n metrics: string[];\n insertAtCursor(value: string): void;\n}\n\nclass MetricsExplorer extends Component {\n handleMetricClick = (query: string) => {\n this.props.insertAtCursor(query);\n this.props.updateShow(false);\n };\n\n toggle = () => {\n this.props.updateShow(!this.props.show);\n };\n\n render() {\n return (\n \n Metrics Explorer\n \n {this.props.metrics.map(metric => (\n

\n {metric}\n

\n ))}\n
\n
\n );\n }\n}\n\nexport default MetricsExplorer;\n","import React, { Component } from 'react';\nimport { Button, InputGroup, InputGroupAddon, InputGroupText, Input } from 'reactstrap';\n\nimport Downshift, { ControllerStateAndHelpers } from 'downshift';\nimport fuzzy from 'fuzzy';\nimport sanitizeHTML from 'sanitize-html';\n\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faSearch, faSpinner, faGlobeEurope } from '@fortawesome/free-solid-svg-icons';\nimport MetricsExplorer from './MetricsExplorer';\n\ninterface ExpressionInputProps {\n value: string;\n onExpressionChange: (expr: string) => void;\n queryHistory: string[];\n metricNames: string[];\n executeQuery: () => void;\n loading: boolean;\n enableAutocomplete: boolean;\n}\n\ninterface ExpressionInputState {\n height: number | string;\n showMetricsExplorer: boolean;\n}\n\nclass ExpressionInput extends Component {\n private exprInputRef = React.createRef();\n\n constructor(props: ExpressionInputProps) {\n super(props);\n this.state = {\n height: 'auto',\n showMetricsExplorer: false,\n };\n }\n\n componentDidMount() {\n this.setHeight();\n }\n\n setHeight = () => {\n const { offsetHeight, clientHeight, scrollHeight } = this.exprInputRef.current!;\n const offset = offsetHeight - clientHeight; // Needed in order for the height to be more accurate.\n this.setState({ height: scrollHeight + offset });\n };\n\n handleInput = () => {\n this.setValue(this.exprInputRef.current!.value);\n };\n\n setValue = (value: string) => {\n const { onExpressionChange } = this.props;\n onExpressionChange(value);\n this.setState({ height: 'auto' }, this.setHeight);\n };\n\n componentDidUpdate(prevProps: ExpressionInputProps) {\n const { value } = this.props;\n if (value !== prevProps.value) {\n this.setValue(value);\n }\n }\n\n handleKeyPress = (event: React.KeyboardEvent) => {\n const { executeQuery } = this.props;\n if (event.key === 'Enter' && !event.shiftKey) {\n executeQuery();\n event.preventDefault();\n }\n };\n\n getSearchMatches = (input: string, expressions: string[]) => {\n return fuzzy.filter(input.replace(/ /g, ''), expressions, {\n pre: '',\n post: '',\n });\n };\n\n createAutocompleteSection = (downshift: ControllerStateAndHelpers) => {\n const { inputValue = '', closeMenu, highlightedIndex } = downshift;\n const autocompleteSections = {\n 'Query History': this.props.queryHistory,\n 'Metric Names': this.props.metricNames,\n };\n let index = 0;\n const sections =\n inputValue!.length && this.props.enableAutocomplete\n ? Object.entries(autocompleteSections).reduce((acc, [title, items]) => {\n const matches = this.getSearchMatches(inputValue!, items);\n return !matches.length\n ? acc\n : [\n ...acc,\n
    \n
  • {title}
  • \n {matches\n .slice(0, 100) // Limit DOM rendering to 100 results, as DOM rendering is sloooow.\n .map(({ original, string: text }) => {\n const itemProps = downshift.getItemProps({\n key: original,\n index,\n item: original,\n style: {\n backgroundColor: highlightedIndex === index++ ? 'lightgray' : 'white',\n },\n });\n return (\n \n );\n })}\n
,\n ];\n }, [] as JSX.Element[])\n : [];\n\n if (!sections.length) {\n // This is ugly but is needed in order to sync state updates.\n // This way we force downshift to wait React render call to complete before closeMenu to be triggered.\n setTimeout(closeMenu);\n return null;\n }\n\n return (\n
\n {sections}\n
\n );\n };\n\n openMetricsExplorer = () => {\n this.setState({\n showMetricsExplorer: true,\n });\n };\n\n updateShowMetricsExplorer = (show: boolean) => {\n this.setState({\n showMetricsExplorer: show,\n });\n };\n\n insertAtCursor = (value: string) => {\n if (!this.exprInputRef.current) return;\n\n const startPosition = this.exprInputRef.current.selectionStart;\n const endPosition = this.exprInputRef.current.selectionEnd;\n\n const previousValue = this.exprInputRef.current.value;\n let newValue: string;\n if (startPosition && endPosition) {\n newValue =\n previousValue.substring(0, startPosition) + value + previousValue.substring(endPosition, previousValue.length);\n } else {\n newValue = previousValue + value;\n }\n\n this.setValue(newValue);\n };\n\n render() {\n const { executeQuery, value } = this.props;\n const { height } = this.state;\n return (\n <>\n \n {downshift => (\n
\n \n \n \n {this.props.loading ? : }\n \n \n {\n switch (event.key) {\n case 'Home':\n case 'End':\n // We want to be able to jump to the beginning/end of the input field.\n // By default, Downshift otherwise jumps to the first/last suggestion item instead.\n (event.nativeEvent as any).preventDownshiftDefault = true;\n break;\n case 'ArrowUp':\n case 'ArrowDown':\n if (!downshift.isOpen) {\n (event.nativeEvent as any).preventDownshiftDefault = true;\n }\n break;\n case 'Enter':\n downshift.closeMenu();\n break;\n case 'Escape':\n if (!downshift.isOpen) {\n this.exprInputRef.current!.blur();\n }\n break;\n default:\n }\n },\n } as any)}\n value={value}\n />\n \n \n \n \n \n \n \n {downshift.isOpen && this.createAutocompleteSection(downshift)}\n
\n )}\n
\n\n \n \n );\n }\n}\n\nexport default ExpressionInput;\n","import { HighlightStyle, tags } from '@codemirror/highlight';\nimport { EditorView } from '@codemirror/view';\n\nexport const baseTheme = EditorView.theme({\n '&': {\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, { 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 { searchKeymap, highlightSelectionMatches } from '@codemirror/search';\nimport { commentKeymap } from '@codemirror/comment';\nimport { lintKeymap } from '@codemirror/lint';\nimport { PromQLExtension, CompleteStrategy } from 'codemirror-promql';\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 { newCompleteStrategy } from 'codemirror-promql/cjs/complete';\nimport { useTheme } from '../../contexts/ThemeContext';\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 CMExpressionInput: 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 ...searchKeymap,\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 CMExpressionInput;\n","import $ from 'jquery';\nimport React, { Component } from 'react';\nimport { Button, InputGroup, InputGroupAddon, Input } from 'reactstrap';\n\nimport moment from 'moment-timezone';\n\nimport 'tempusdominus-core';\nimport 'tempusdominus-bootstrap-4';\nimport '../../../node_modules/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 faChevronLeft,\n faChevronRight,\n faCalendarCheck,\n faArrowUp,\n faArrowDown,\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 private $time: any = null;\n\n getBaseTime = (): number => {\n return this.props.time || moment().valueOf();\n };\n\n calcShiftRange = () => 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() {\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 this.$time.on('change.datetimepicker', (e: any) => {\n if (e.date) {\n this.props.onChangeTime(e.date.valueOf());\n }\n });\n }\n\n componentWillUnmount() {\n this.$time.datetimepicker('destroy');\n }\n\n componentDidUpdate(prevProps: TimeInputProps) {\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() {\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, InputGroup, InputGroupAddon, Input } from 'reactstrap';\n\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faPlus, faMinus, faChartArea, faChartLine } from '@fortawesome/free-solid-svg-icons';\n\nimport TimeInput from './TimeInput';\nimport { parseDuration, formatDuration } from '../../utils';\n\ninterface GraphControlsProps {\n range: number;\n endTime: number | null;\n useLocalTime: boolean;\n resolution: number | null;\n stacked: 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}\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.rangeRef.current!.value = 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) {\n if (prevProps.range !== this.props.range) {\n this.changeRangeInput(this.props.range);\n }\n if (prevProps.resolution !== this.props.resolution) {\n this.resolutionRef.current!.value = this.props.resolution !== null ? this.props.resolution.toString() : '';\n }\n }\n\n render() {\n return (\n
e.preventDefault()}>\n \n \n \n \n\n this.onChangeRangeInput(this.rangeRef.current!.value)}\n onKeyDown={(e: React.KeyboardEvent) =>\n e.key === 'Enter' && this.onChangeRangeInput(this.rangeRef.current!.value)\n }\n />\n\n \n \n \n \n\n \n\n {\n const res = parseInt(this.resolutionRef.current!.value);\n this.props.onChangeResolution(res ? res : null);\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 }\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!.__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) {\n if (this.props.shouldReset && prevProps.shouldReset !== this.props.shouldReset) {\n this.setState({ selectedIndexes: [] });\n }\n }\n handleSeriesSelect = (index: number) => (ev: React.MouseEvent) => {\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() {\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, GraphSeries } 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) => {\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 = (index: number, stacked: boolean) => (series: GraphSeries, i: number) => ({\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 { labels, color } = series;\n let dateTime = moment(xval);\n if (!useLocalTime) {\n dateTime = dateTime.utc();\n }\n return `\n
${dateTime.format('YYYY-MM-DD HH:mm:ss Z')}
\n
\n \n ${labels.__name__ || 'value'}: ${yval}\n
\n
\n ${Object.keys(labels)\n .map(k =>\n k !== '__name__' ? `
${k}: ${escapeHTML(labels[k])}
` : ''\n )\n .join('')}\n
\n `;\n },\n defaultTheme: false,\n lines: true,\n },\n series: {\n stack: stacked,\n lines: {\n lineWidth: stacked ? 1 : 2,\n steps: false,\n fill: stacked,\n },\n shadowSize: 0,\n },\n };\n};\n\n// This was adapted from Flot's color generation code.\nexport const getColors = (data: { resultType: string; result: Array<{ metric: Metric; values: [number, string][] }> }) => {\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 }: GraphProps): GraphSeries[] => {\n const colors = getColors(data);\n const { startTime, endTime, resolution } = queryParams!;\n return 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 data,\n index,\n };\n });\n};\n\nexport const parseValue = (value: string) => {\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","import $ from 'jquery';\nimport React, { PureComponent } from 'react';\nimport ReactResizeDetector from 'react-resize-detector';\n\nimport { Legend } from './Legend';\nimport { Metric, QueryParams } from '../../types/types';\nimport { isPresent } from '../../utils';\nimport { normalizeData, getOptions, toHoverColor } from './GraphHelpers';\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('jquery.flot.tooltip');\n\nexport interface GraphProps {\n data: {\n resultType: string;\n result: Array<{ metric: Metric; values: [number, string][] }>;\n };\n stacked: boolean;\n useLocalTime: boolean;\n queryParams: QueryParams | null;\n}\n\nexport interface GraphSeries {\n labels: { [key: string]: string };\n color: string;\n data: (number | null)[][]; // [x,y][]\n index: number;\n}\n\ninterface GraphState {\n chartData: GraphSeries[];\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 };\n\n componentDidUpdate(prevProps: GraphProps) {\n const { data, stacked, useLocalTime } = 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(this.state.chartData.filter((_, i) => this.selectedSeriesIndexes.includes(i)));\n }\n });\n }\n\n if (prevProps.useLocalTime !== useLocalTime) {\n this.plot();\n }\n }\n\n componentDidMount() {\n this.plot();\n }\n\n componentWillUnmount() {\n this.destroyPlot();\n }\n\n plot = (data: GraphSeries[] = this.state.chartData) => {\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 = () => {\n if (isPresent(this.$chart)) {\n this.$chart.destroy();\n }\n };\n\n plotSetAndDraw(data: GraphSeries[] = this.state.chartData) {\n if (isPresent(this.$chart)) {\n this.$chart.setData(data);\n this.$chart.draw();\n }\n }\n\n handleSeriesSelect = (selected: number[], selectedIndex: number) => {\n const { chartData } = this.state;\n this.plot(\n this.selectedSeriesIndexes.length === 1 && this.selectedSeriesIndexes.includes(selectedIndex)\n ? chartData.map(toHoverColor(selectedIndex, this.props.stacked))\n : chartData.filter((_, i) => selected.includes(i)) // draw only selected\n );\n this.selectedSeriesIndexes = selected;\n };\n\n handleSeriesHover = (index: number) => () => {\n if (this.rafID) {\n cancelAnimationFrame(this.rafID);\n }\n this.rafID = requestAnimationFrame(() => {\n this.plotSetAndDraw(this.state.chartData.map(toHoverColor(index, this.props.stacked)));\n });\n };\n\n handleLegendMouseOut = () => {\n cancelAnimationFrame(this.rafID);\n this.plotSetAndDraw();\n };\n\n handleResize = () => {\n if (isPresent(this.$chart)) {\n this.plot(this.$chart.getData() as GraphSeries[]);\n }\n };\n\n render() {\n const { chartData } = this.state;\n return (\n
\n \n
\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 CMExpressionInput from './CMExpressionInput';\nimport GraphControls from './GraphControls';\nimport { GraphTabContent } from './GraphTabContent';\nimport DataTable from './DataTable';\nimport TimeInput from './TimeInput';\nimport QueryStatsView, { QueryStats } from './QueryStatsView';\nimport { QueryParams } from '../../types/types';\nimport { API_PATH } from '../../constants/constants';\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 useExperimentalEditor: boolean;\n enableAutocomplete: boolean;\n enableHighlighting: boolean;\n enableLinter: boolean;\n}\n\ninterface PanelState {\n data: any; // TODO: Type data.\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}\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};\n\nclass Panel extends Component {\n private abortInFlightFetch: (() => void) | null = null;\n\n constructor(props: PanelProps) {\n super(props);\n\n this.state = {\n data: null,\n lastQueryParams: null,\n loading: false,\n warnings: null,\n error: null,\n stats: null,\n exprInputValue: props.options.expr,\n };\n }\n\n componentDidUpdate({ options: prevOpts }: PanelProps) {\n const { endTime, range, resolution, type } = this.props.options;\n if (\n prevOpts.endTime !== endTime ||\n prevOpts.range !== range ||\n prevOpts.resolution !== resolution ||\n prevOpts.type !== type\n ) {\n this.executeQuery();\n }\n }\n\n componentDidMount() {\n this.executeQuery();\n }\n\n executeQuery = (): void => {\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 fetch(`${this.props.pathPrefix}/${API_PATH}/${path}?${params}`, {\n cache: 'no-store',\n credentials: 'same-origin',\n signal: abortController.signal,\n })\n .then(resp => resp.json())\n .then(json => {\n if (json.status !== 'success') {\n throw new Error(json.error || 'invalid response JSON');\n }\n\n let resultSeries = 0;\n if (json.data) {\n const { resultType, result } = json.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: json.data,\n warnings: json.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 })\n .catch(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: object): 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) => {\n this.setOptions({ endTime: endTime });\n };\n\n handleChangeResolution = (resolution: number | null) => {\n this.setOptions({ resolution: resolution });\n };\n\n handleChangeType = (type: PanelType) => {\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) => {\n this.setOptions({ stacked: stacked });\n };\n\n render() {\n const { pastQueries, metricNames, options } = this.props;\n return (\n
\n \n \n {this.props.useExperimentalEditor ? (\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 } from '../../types/types';\nimport { isPresent } from '../../utils';\n\ninterface GraphTabContentProps {\n data: any;\n stacked: boolean;\n useLocalTime: boolean;\n lastQueryParams: QueryParams | null;\n}\n\nexport const GraphTabContent: FC = ({ data, stacked, useLocalTime, lastQueryParams }) => {\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","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(\n (s: InstantSample, index: number): ReactNode => {\n return (\n \n \n \n \n {s.value[1]}\n \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","export const API_PATH = 'api/v1';\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 = () => {\n return `_${Math.random()\n .toString(36)\n .substr(2, 9)}`;\n};\n\nexport const byEmptyString = (p: string) => 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 }) => {\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 '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 = (key: string) => (paramName: string, value: number | string | boolean) => {\n return `g${key}.${paramName}=${encodeURIComponent(value)}`;\n};\n\nexport const toQueryString = ({ key, options }: PanelMeta) => {\n const formatWithKey = formatParam(key);\n const { expr, type, stacked, range, endTime, resolution } = 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('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[]) => {\n return `?${panels.map(toQueryString).join('&')}`;\n};\n\nexport const createExpressionLink = (expr: string) => {\n return `../graph?g0.expr=${encodeURIComponent(expr)}&g0.tab=1&g0.stacked=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) => Object.entries(o).map(cb);\n\nexport const callAll = (...fns: Array<(...args: any) => void>) => (...args: any) => {\n // eslint-disable-next-line prefer-spread\n fns.filter(Boolean).forEach(fn => fn.apply(null, args));\n};\n\nexport const parsePrometheusFloat = (value: string) => {\n if (isNaN(Number(value))) {\n return value;\n } else {\n return Number(value);\n }\n};\n","import React, { FC, useState, Fragment } from 'react';\nimport { Link } from '@reach/router';\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
\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\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\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 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 { RouteComponentProps } from '@reach/router';\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 { RouteComponentProps } from '@reach/router';\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, { FC } from 'react';\nimport { RouteComponentProps } from '@reach/router';\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 FlagMap {\n [key: string]: string;\n}\n\ninterface FlagsProps {\n data?: FlagMap;\n}\n\nexport const FlagsContent: FC = ({ data = {} }) => {\n return (\n <>\n

Command-Line Flags

\n \n \n {Object.keys(data).map(key => (\n \n \n \n \n ))}\n \n
{key}{data[key]}
\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 { RouteComponentProps } from '@reach/router';\nimport { APIResponse } from '../../hooks/useFetch';\nimport { Alert, Table, Badge } from 'reactstrap';\nimport { Link } from '@reach/router';\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 { RouteComponentProps } from '@reach/router';\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 { RouteComponentProps } from '@reach/router';\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 { RouteComponentProps } from '@reach/router';\nimport { useFetch } from '../../hooks/useFetch';\nimport { LabelsTable } from './LabelsTable';\nimport { Target, Labels, DroppedTarget } 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 = (activeTargets: Target[], droppedTargets: DroppedTarget[]) => {\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[]) => {\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 { RouteComponentProps } from '@reach/router';\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 { 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: any) => 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 Status: FC = () => {\n const pathPrefix = usePathPrefix();\n const path = `${pathPrefix}/${API_PATH}`;\n\n return (\n <>\n {[\n { fetchResult: useFetch>(`${path}/status/runtimeinfo`), title: 'Runtime Information' },\n { fetchResult: useFetch>(`${path}/status/buildinfo`), title: 'Build Information' },\n { fetchResult: useFetch>(`${path}/alertmanagers`), title: 'Alertmanagers' },\n ].map(({ fetchResult, title }) => {\n const { response, isLoading, error } = fetchResult;\n return (\n \n );\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, Alert } from 'reactstrap';\n\nexport interface EndpointLinkProps {\n endpoint: string;\n globalUrl: string;\n}\n\nconst EndpointLink: FC = ({ endpoint, globalUrl }) => {\n let url: URL;\n try {\n url = new URL(endpoint);\n } catch (e) {\n return (\n \n Error: {e.message}\n \n );\n }\n\n const { host, pathname, protocol, searchParams }: URL = url;\n const params = Array.from(searchParams.entries());\n\n return (\n <>\n {`${protocol}//${host}${pathname}`}\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 } 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 { now } from 'moment';\nimport { ToggleMoreLess } from '../../components/ToggleMoreLess';\nimport { formatRelative, humanizeDuration } 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 } = 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())}{humanizeDuration(lastScrapeDuration * 1000)}{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}\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 { RouteComponentProps } from '@reach/router';\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 { RouteComponentProps } from '@reach/router';\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[]) => {\n const query = encodePanelOptionsToQueryString(nextPanels);\n window.history.pushState({}, '', query);\n};\n\ninterface PanelListContentProps extends RouteComponentProps {\n panels: PanelMeta[];\n metrics: string[];\n useLocalTime: boolean;\n useExperimentalEditor: boolean;\n queryHistoryEnabled: boolean;\n enableAutocomplete: boolean;\n enableHighlighting: boolean;\n enableLinter: boolean;\n}\n\nexport const PanelListContent: FC = ({\n metrics = [],\n useLocalTime,\n useExperimentalEditor,\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 useExperimentalEditor={useExperimentalEditor}\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 [useExperimentalEditor, setUseExperimentalEditor] = useLocalStorage('use-new-editor', false);\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
\n setUseExperimentalEditor(target.checked)}\n defaultChecked={useExperimentalEditor}\n >\n Use experimental editor\n \n setEnableHighlighting(target.checked)}\n defaultChecked={enableHighlighting}\n disabled={!useExperimentalEditor}\n >\n Enable highlighting\n \n setEnableLinter(target.checked)}\n defaultChecked={enableLinter}\n disabled={!useExperimentalEditor}\n >\n Enable linter\n \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 { RouteComponentProps } from '@reach/router';\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 } from 'react';\nimport Navigation from './Navbar';\nimport { Container } from 'reactstrap';\n\nimport { Router, Redirect } from '@reach/router';\nimport useMedia from 'use-media';\nimport { Alerts, Config, Flags, Rules, ServiceDiscovery, Status, Targets, TSDBStatus, PanelList } from './pages';\nimport { PathPrefixContext } from './contexts/PathPrefixContext';\nimport { ThemeContext, themeName, themeSetting } from './contexts/ThemeContext';\nimport { Theme, themeLocalStorageKey } from './Theme';\nimport { useLocalStorage } from './hooks/useLocalStorage';\n\ninterface AppProps {\n consolesLink: string | null;\n}\n\nconst App: FC = ({ consolesLink }) => {\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 '/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 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\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;\n\nlet consolesLink: string | null = GLOBAL_CONSOLES_LINK;\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","// 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_\"};"],"sourceRoot":""}