/usr/share/grafana/public/build
{"version":3,"file":"8813.e5137844631f6ddedbce.js","mappings":"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","sources":["webpack://grafana/./node_modules/react-use/esm/useMount.js","webpack://grafana/./node_modules/combokeys/Combokeys/reset.js","webpack://grafana/./node_modules/combokeys/helpers/special-aliases.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/fireCallback.js","webpack://grafana/./public/app/features/explore/TraceView/components/Theme.tsx","webpack://grafana/./node_modules/@opentelemetry/api/build/esm/trace/status.js","webpack://grafana/./node_modules/combokeys/helpers/preventDefault.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/dom-event.js","webpack://grafana/./node_modules/combokeys/helpers/special-characters-map.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/pickBestAction.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/getMatches.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/AccessoryButton.js","webpack://grafana/./public/app/features/explore/TraceView/components/common/CopyIcon.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/jsonMarkup.js","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/KeyValuesTable.tsx","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/bindSingle.js","webpack://grafana/./node_modules/combokeys/helpers/characterFromEvent.js","webpack://grafana/./node_modules/combokeys/helpers/eventModifiers.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/reset.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/modifiersMatch.js","webpack://grafana/./node_modules/combokeys/helpers/keysFromString.js","webpack://grafana/./node_modules/combokeys/helpers/stopPropagation.js","webpack://grafana/./public/app/features/explore/TraceView/components/constants/span.ts","webpack://grafana/./packages/grafana-o11y-ds-frontend/src/TraceToLogs/TraceToLogsSettings.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/CriticalPath/utils/findLastFinishingChildSpan.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/CriticalPath/utils/getChildOfSpans.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/CriticalPath/utils/sanitizeOverFlowingChildren.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/CriticalPath/index.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/utils/color-generator.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TracePageHeader/SpanGraph/render-into-canvas.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TracePageHeader/SpanGraph/CanvasSpanGraph.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/utils/date.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TracePageHeader/SpanGraph/TickLabels.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/utils/DraggableManager/EUpdateTypes.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/utils/DraggableManager/DraggableManager.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TracePageHeader/SpanGraph/GraphTicks.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TracePageHeader/SpanGraph/Scrubber.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TracePageHeader/SpanGraph/ViewingLayer.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TracePageHeader/SpanGraph/index.tsx","webpack://grafana/./packages/grafana-o11y-ds-frontend/src/IntervalInput/validation.ts","webpack://grafana/./packages/grafana-o11y-ds-frontend/src/IntervalInput/IntervalInput.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/common/SearchBarInput.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/NextPrevResult.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/TracePageSearchBar.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TracePageHeader/SpanFilters/SpanFilters.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TracePageHeader/TracePageHeader.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/keyboard-mappings.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/keyboard-shortcuts.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/Ticks.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/TimelineRow.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/TimelineHeaderRow/TimelineCollapser.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/TimelineHeaderRow/TimelineColumnResizer.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/TimelineHeaderRow/TimelineViewingLayer.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/TimelineHeaderRow/TimelineHeaderRow.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/constants/tag-keys.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/ListView/Positions.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/ListView/index.tsx","webpack://grafana/./packages/grafana-o11y-ds-frontend/src/SpanBar/SpanBarSettings.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/common/Popover.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianKeyValues.markers.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/types/links.ts","webpack://grafana/./public/app/features/explore/TraceView/createSpanLink.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/common/LabeledList.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/url/ReferenceLink.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianReferences.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/ShareSpanButton.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/SpanDetailLinkButtons.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/SpanFlameGraph.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianKeyValues.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianLogs.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanBar.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanLinks.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/utils/span-ancestor-ids.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanTreeOffset.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanBarRow.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetailRow.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/utils.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/VirtualizedTraceView.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/index.tsx","webpack://grafana/./public/app/features/explore/TraceView/useChildrenState.ts","webpack://grafana/./public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/DetailState.tsx","webpack://grafana/./public/app/features/explore/TraceView/useDetailState.ts","webpack://grafana/./public/app/features/explore/TraceView/useHoverIndentGuide.ts","webpack://grafana/./public/app/features/explore/TraceView/useViewRange.ts","webpack://grafana/./public/app/features/explore/TraceView/TraceView.tsx","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/trigger.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/unbind.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/resetSequences.js","webpack://grafana/./node_modules/combokeys/helpers/special-keys-map.js","webpack://grafana/./public/app/features/explore/TraceView/components/utils/filter-spans.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/model/trace-viewer.ts","webpack://grafana/./node_modules/combokeys/helpers/shift-map.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/bind.js","webpack://grafana/./public/app/features/explore/TraceView/utils/tags.ts","webpack://grafana/./public/app/features/explore/TraceView/components/TracePageHeader/SpanFilters/SpanFiltersTags.tsx","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/bindMultiple.js","webpack://grafana/./node_modules/combokeys/Combokeys/index.js","webpack://grafana/./public/app/features/explore/TraceView/useSearch.ts","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/resetSequenceTimer.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/getKeyInfo.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/stopCallback.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/handleKeyEvent.js","webpack://grafana/./public/app/features/explore/TraceView/components/utils/TreeNode.ts","webpack://grafana/./public/app/features/explore/TraceView/components/selectors/span.ts","webpack://grafana/./public/app/features/explore/TraceView/components/selectors/trace.ts","webpack://grafana/./public/app/features/explore/TraceView/components/constants/index.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/constants/default-config.ts","webpack://grafana/./public/app/features/explore/TraceView/components/utils/config/get-config.tsx","webpack://grafana/./public/app/features/explore/TraceView/components/model/transform-trace-data.tsx","webpack://grafana/./public/app/features/explore/TraceView/utils/transform.ts","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/bindSequence.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/detach.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/handleKey.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/getReverseMap.js","webpack://grafana/./node_modules/combokeys/helpers/isModifier.js","webpack://grafana/./node_modules/combokeys/Combokeys/prototype/addEvents.js"],"sourcesContent":["import useEffectOnce from './useEffectOnce';\nvar useMount = function (fn) {\n useEffectOnce(function () {\n fn();\n });\n};\nexport default useMount;\n","/* eslint-env node, browser */\n'use strict'\n\nmodule.exports = function () {\n var self = this\n\n self.instances.forEach(function (combokeys) {\n combokeys.reset()\n })\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * this is a list of special strings you can use to map\n * to modifier keys when you specify your keyboard shortcuts\n *\n * @type {Object}\n */\nmodule.exports = {\n 'option': 'alt',\n 'command': 'meta',\n 'return': 'enter',\n 'escape': 'esc',\n 'mod': /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl'\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * actually calls the callback function\n *\n * if your callback function returns false this will use the jquery\n * convention - prevent default and stop propogation on the event\n *\n * @param {Function} callback\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (callback, e, combo, sequence) {\n var self = this\n var preventDefault\n var stopPropagation\n\n // if this event should not happen stop here\n if (self.stopCallback(e, e.target || e.srcElement, combo, sequence)) {\n return\n }\n\n if (callback(e, combo) === false) {\n preventDefault = require('../../helpers/preventDefault')\n preventDefault(e)\n stopPropagation = require('../../helpers/stopPropagation')\n stopPropagation(e)\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport tinycolor from 'tinycolor2';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\n/**\n * Tries to get a dark variant color. Either by simply inverting the luminosity and darkening or lightening the color\n * a bit, or if base is provided, tries 2 variants of lighter and darker colors and checks which is more readable with\n * the base.\n * @param theme\n * @param hex\n * @param base\n */\nexport function autoColor(theme: GrafanaTheme2, hex: string, base?: string) {\n if (theme.isLight) {\n return hex;\n } else {\n if (base) {\n const color = tinycolor(hex);\n return tinycolor\n .mostReadable(\n base,\n [\n color.clone().lighten(25),\n color.clone().lighten(10),\n color,\n color.clone().darken(10),\n color.clone().darken(25),\n ],\n {\n includeFallbackColors: false,\n }\n )\n .toHex8String();\n }\n const color = tinycolor(hex).toHsl();\n color.l = 1 - color.l;\n const newColor = tinycolor(color);\n return newColor.isLight() ? newColor.darken(5).toHex8String() : newColor.lighten(5).toHex8String();\n }\n}\n","/**\n * An enumeration of status codes.\n */\nexport var SpanStatusCode;\n(function (SpanStatusCode) {\n /**\n * The default status.\n */\n SpanStatusCode[SpanStatusCode[\"UNSET\"] = 0] = \"UNSET\";\n /**\n * The operation has been validated by an Application developer or\n * Operator to have completed successfully.\n */\n SpanStatusCode[SpanStatusCode[\"OK\"] = 1] = \"OK\";\n /**\n * The operation contains an error.\n */\n SpanStatusCode[SpanStatusCode[\"ERROR\"] = 2] = \"ERROR\";\n})(SpanStatusCode || (SpanStatusCode = {}));\n//# sourceMappingURL=status.js.map","/* eslint-env node, browser */\n'use strict'\n\n/**\n * prevents default for this event\n *\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (e) {\n if (e.preventDefault) {\n e.preventDefault()\n return\n }\n\n e.returnValue = false\n}\n","module.exports = on\nmodule.exports.on = on\nmodule.exports.off = off\n\nfunction on (element, event, callback, capture) {\n !element.addEventListener && (event = 'on' + event)\n ;(element.addEventListener || element.attachEvent).call(element, event, callback, capture)\n return callback\n}\n\nfunction off (element, event, callback, capture) {\n !element.removeEventListener && (event = 'on' + event)\n ;(element.removeEventListener || element.detachEvent).call(element, event, callback, capture)\n return callback\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * mapping for special characters so they can support\n *\n * this dictionary is only used incase you want to bind a\n * keyup or keydown event to one of these keys\n *\n * @type {Object}\n */\nmodule.exports = {\n 106: '*',\n 107: 'plus',\n 109: 'minus',\n 110: '.',\n 111: '/',\n 186: ';',\n 187: '=',\n 188: ',',\n 189: '-',\n 190: '.',\n 191: '/',\n 192: '`',\n 219: '[',\n 220: '\\\\',\n 221: ']',\n 222: \"'\"\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * picks the best action based on the key combination\n *\n * @param {string} key - character for key\n * @param {Array} modifiers\n * @param {string=} action passed in\n */\nmodule.exports = function (key, modifiers, action) {\n var self = this\n\n // if no action was picked in we should try to pick the one\n // that we think would work best for this key\n if (!action) {\n action = self.getReverseMap()[key] ? 'keydown' : 'keypress'\n }\n\n // modifier keys don't work as expected with keypress,\n // switch to keydown\n if (action === 'keypress' && modifiers.length) {\n action = 'keydown'\n }\n\n return action\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * finds all callbacks that match based on the keycode, modifiers,\n * and action\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event|Object} e\n * @param {string=} sequenceName - name of the sequence we are looking for\n * @param {string=} combination\n * @param {number=} level\n * @returns {Array}\n */\nmodule.exports = function (character, modifiers, e, sequenceName, combination, level) {\n var self = this\n var j\n var callback\n var matches = []\n var action = e.type\n var isModifier\n var modifiersMatch\n\n if (\n action === 'keypress' &&\n // Firefox fires keypress for arrows\n !(e.code && e.code.slice(0, 5) === 'Arrow')\n ) {\n // 'any-character' callbacks are only on `keypress`\n var anyCharCallbacks = self.callbacks['any-character'] || []\n anyCharCallbacks.forEach(function (callback) {\n matches.push(callback)\n })\n }\n\n if (!self.callbacks[character]) { return matches }\n\n isModifier = require('../../helpers/isModifier')\n // if a modifier key is coming up on its own we should allow it\n if (action === 'keyup' && isModifier(character)) {\n modifiers = [character]\n }\n\n // loop through all callbacks for the key that was pressed\n // and see if any of them match\n for (j = 0; j < self.callbacks[character].length; ++j) {\n callback = self.callbacks[character][j]\n\n // if a sequence name is not specified, but this is a sequence at\n // the wrong level then move onto the next match\n if (!sequenceName && callback.seq && self.sequenceLevels[callback.seq] !== callback.level) {\n continue\n }\n\n // if the action we are looking for doesn't match the action we got\n // then we should keep going\n if (action !== callback.action) {\n continue\n }\n\n // if this is a keypress event and the meta key and control key\n // are not pressed that means that we need to only look at the\n // character, otherwise check the modifiers as well\n //\n // chrome will not fire a keypress if meta or control is down\n // safari will fire a keypress if meta or meta+shift is down\n // firefox will fire a keypress if meta or control is down\n modifiersMatch = require('./modifiersMatch')\n if ((action === 'keypress' && !e.metaKey && !e.ctrlKey) || modifiersMatch(modifiers, callback.modifiers)) {\n // when you bind a combination or sequence a second time it\n // should overwrite the first one. if a sequenceName or\n // combination is specified in this call it does just that\n //\n // @todo make deleting its own method?\n var deleteCombo = !sequenceName && callback.combo === combination\n var deleteSequence = sequenceName && callback.seq === sequenceName && callback.level === level\n if (deleteCombo || deleteSequence) {\n self.callbacks[character].splice(j, 1)\n }\n\n matches.push(callback)\n }\n }\n\n return matches\n}\n","import { cx, css } from '@emotion/css';\nimport React__default from 'react';\nimport '@grafana/data';\nimport { useStyles2, Button } from '@grafana/ui';\n\nconst AccessoryButton = ({ className, ...props }) => {\n const styles = useStyles2(getButtonStyles);\n return /* @__PURE__ */ React__default.createElement(Button, { ...props, className: cx(className, styles.button) });\n};\nconst getButtonStyles = (theme) => ({\n button: css({\n paddingLeft: theme.spacing(3 / 2),\n paddingRight: theme.spacing(3 / 2)\n })\n});\n\nexport { AccessoryButton };\n//# sourceMappingURL=AccessoryButton.js.map\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport { useState } from 'react';\n\nimport { t } from '@grafana/i18n';\nimport { Button, IconName, Tooltip, useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => ({\n CopyIcon: css({\n backgroundColor: 'transparent',\n border: 'none',\n color: 'inherit',\n overflow: 'hidden',\n '&:focus': {\n backgroundColor: 'rgba(255, 255, 255, 0.25)',\n color: 'inherit',\n },\n }),\n});\n\ntype PropsType = {\n className?: string;\n copyText: string;\n icon?: IconName;\n tooltipTitle: string;\n};\n\nexport default function CopyIcon({ copyText, icon = 'copy', tooltipTitle }: PropsType) {\n const styles = useStyles2(getStyles);\n\n const [hasCopied, setHasCopied] = useState(false);\n\n const handleClick = () => {\n navigator.clipboard.writeText(copyText);\n setHasCopied(true);\n };\n\n return (\n <Tooltip content={hasCopied ? t('explore.trace-view.tooltip-copy-icon', 'Copied') : tooltipTitle}>\n <Button\n aria-label={t('explore.trace-view.aria-label-copy', 'Copy to clipboard')}\n className={cx(styles.CopyIcon)}\n type=\"button\"\n icon={icon}\n onClick={handleClick}\n />\n </Tooltip>\n );\n}\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Mathias Buus\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nconst INDENT = ' ';\n\nfunction inlineRule(objRule) {\n let str = '';\n objRule &&\n Object.keys(objRule).forEach(function (rule) {\n str += rule + ':' + objRule[rule] + ';';\n });\n return str;\n}\n\nfunction Stylize(styleFile) {\n function styleClass(cssClass) {\n return 'class=\"' + cssClass + '\"';\n }\n\n function styleInline(cssClass) {\n return 'style=\"' + inlineRule(styleFile['.' + cssClass]) + '\"';\n }\n\n if (!styleFile) {\n return styleClass;\n }\n return styleInline;\n}\n\nfunction type(doc) {\n if (doc === null) {\n return 'null';\n }\n if (Array.isArray(doc)) {\n return 'array';\n }\n if (typeof doc === 'string' && /^https?:/.test(doc)) {\n return 'link';\n }\n if (typeof doc === 'object' && typeof doc.toISOString === 'function') {\n return 'date';\n }\n\n return typeof doc;\n}\n\nfunction escape(str) {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\nexport default function jsonMarkup(doc, styleFile) {\n let indent = '';\n const style = Stylize(styleFile);\n\n let forEach = function (list, start, end, fn) {\n if (!list.length) {\n return start + ' ' + end;\n }\n\n let out = start + '\\n';\n\n indent += INDENT;\n list.forEach(function (key, i) {\n out += indent + fn(key) + (i < list.length - 1 ? ',' : '') + '\\n';\n });\n indent = indent.slice(0, -INDENT.length);\n\n return out + indent + end;\n };\n\n function visit(obj) {\n if (obj === undefined) {\n return '';\n }\n\n switch (type(obj)) {\n case 'boolean':\n return '<span ' + style('json-markup-bool') + '>' + obj + '</span>';\n\n case 'number':\n return '<span ' + style('json-markup-number') + '>' + obj + '</span>';\n\n case 'date':\n return '<span class=\"json-markup-string\">\"' + escape(obj.toISOString()) + '\"</span>';\n\n case 'null':\n return '<span ' + style('json-markup-null') + '>null</span>';\n\n case 'string':\n return '<span ' + style('json-markup-string') + '>\"' + escape(obj.replace(/\\n/g, '\\n' + indent)) + '\"</span>';\n\n case 'link':\n return (\n '<span ' + style('json-markup-string') + '>\"<a href=\"' + encodeURI(obj) + '\">' + escape(obj) + '</a>\"</span>'\n );\n\n case 'array':\n return forEach(obj, '[', ']', visit);\n\n case 'object':\n const keys = Object.keys(obj).filter(function (key) {\n return obj[key] !== undefined;\n });\n\n return forEach(keys, '{', '}', function (key) {\n return '<span ' + style('json-markup-key') + '>\"' + escape(key) + '\":</span> ' + visit(obj[key]);\n });\n }\n\n return '';\n }\n\n return '<div ' + style('json-markup') + '>' + visit(doc) + '</div>';\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport { PropsWithChildren } from 'react';\n\nimport { GrafanaTheme2, PluginExtensionLink, TraceKeyValuePair } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport CopyIcon from '../../common/CopyIcon';\nimport TNil from '../../types/TNil';\n\nimport jsonMarkup from './jsonMarkup';\n\nconst copyIconClassName = 'copyIcon';\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n return {\n KeyValueTable: css({\n label: 'KeyValueTable',\n background: autoColor(theme, '#fff'),\n border: `1px solid ${autoColor(theme, '#ddd')}`,\n marginBottom: '0.5rem',\n maxHeight: '450px',\n overflow: 'auto',\n }),\n table: css({\n width: '100%',\n }),\n body: css({\n label: 'body',\n verticalAlign: 'baseline',\n }),\n row: css({\n label: 'row',\n '& > td': {\n padding: '0 0.5rem',\n height: '30px',\n },\n '&:nth-child(2n) > td': {\n background: autoColor(theme, '#f5f5f5'),\n },\n [`&:not(:hover) .${copyIconClassName}`]: {\n visibility: 'hidden',\n },\n 'a span': {\n color: `${theme.colors.text.link} !important`,\n },\n 'a:hover span': {\n textDecoration: 'underline',\n },\n }),\n keyColumn: css({\n label: 'keyColumn',\n color: autoColor(theme, '#888'),\n whiteSpace: 'pre',\n width: '125px',\n }),\n copyColumn: css({\n label: 'copyColumn',\n textAlign: 'right',\n }),\n linkIcon: css({\n label: 'linkIcon',\n verticalAlign: 'middle',\n fontWeight: 'bold',\n }),\n jsonTable: css({\n display: 'inline-block',\n }),\n };\n};\n\nconst jsonObjectOrArrayStartRegex = /^(\\[|\\{)/;\n\nfunction parseIfComplexJson(value: unknown) {\n // if the value is a string representing actual json object or array, then use json-markup\n if (typeof value === 'string' && jsonObjectOrArrayStartRegex.test(value)) {\n // otherwise just return as is\n try {\n return JSON.parse(value);\n // eslint-disable-next-line no-empty\n } catch (_) {}\n }\n return value;\n}\n\nexport type KeyValuesTableLink = Pick<PluginExtensionLink, 'path' | 'title' | 'onClick' | 'icon'>;\n\ninterface LinkValueProps {\n link: KeyValuesTableLink;\n}\n\nexport const LinkValue = ({ link, children }: PropsWithChildren<LinkValueProps>) => {\n const { path, title = '', onClick, icon = 'external-link-alt' } = link;\n\n return (\n <a href={path} title={title} onClick={onClick} target=\"_blank\" rel=\"noopener noreferrer\">\n {children} <Icon name={icon} />\n </a>\n );\n};\n\nexport type KeyValuesTableProps = {\n data: TraceKeyValuePair[];\n linksGetter?: ((pairs: TraceKeyValuePair[], index: number) => KeyValuesTableLink[]) | TNil;\n onlyValues?: boolean;\n};\n\nexport default function KeyValuesTable(props: KeyValuesTableProps) {\n const { data, linksGetter, onlyValues } = props;\n const styles = useStyles2(getStyles);\n return (\n <div className={cx(styles.KeyValueTable)} data-testid=\"KeyValueTable\">\n <table className={styles.table}>\n <tbody className={styles.body}>\n {data.map((row, i) => {\n let markup = { __html: '' };\n if (row.type === 'code') {\n markup = {\n __html: `<pre style=\"border: none; background: none\">${row.value}</pre>`,\n };\n } else if (row.type === 'text') {\n markup = {\n __html: `<span style=\"white-space: pre-wrap;\">${row.value}</span>`,\n };\n } else {\n markup = {\n __html: jsonMarkup(parseIfComplexJson(row.value)),\n };\n }\n\n const jsonTable = <div className={styles.jsonTable} dangerouslySetInnerHTML={markup} />;\n const links = linksGetter?.(data, i);\n let valueMarkup;\n if (links && links.length) {\n // TODO: handle multiple items\n valueMarkup = (\n <div>\n <LinkValue link={links[0]}>{jsonTable}</LinkValue>\n </div>\n );\n } else {\n valueMarkup = jsonTable;\n }\n return (\n // `i` is necessary in the key because row.key can repeat\n <tr className={styles.row} key={`${row.key}-${i}`}>\n {!onlyValues && (\n <td className={styles.keyColumn} data-testid=\"KeyValueTable--keyColumn\">\n {row.key}\n </td>\n )}\n <td>{valueMarkup}</td>\n <td className={styles.copyColumn}>\n <CopyIcon\n className={copyIconClassName}\n copyText={row.type === 'code' || row.type === 'text' ? row.value : JSON.stringify(row, null, 2)}\n tooltipTitle=\"Copy\"\n />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * binds a single keyboard combination\n *\n * @param {string} combination\n * @param {Function} callback\n * @param {string=} action\n * @param {string=} sequenceName - name of sequence if part of sequence\n * @param {number=} level - what part of the sequence the command is\n * @returns void\n */\nmodule.exports = function (combination, callback, action, sequenceName, level) {\n var self = this\n\n // store a direct mapped reference for use with Combokeys.trigger\n self.directMap[combination + ':' + action] = callback\n\n // make sure multiple spaces in a row become a single space\n combination = combination.replace(/\\s+/g, ' ')\n\n var sequence = combination.split(' ')\n var info\n\n // if this pattern is a sequence of keys then run through this method\n // to reprocess each pattern one key at a time\n if (sequence.length > 1) {\n self.bindSequence(combination, sequence, callback, action)\n return\n }\n\n info = self.getKeyInfo(combination, action)\n\n // make sure to initialize array if this is the first time\n // a callback is added for this key\n self.callbacks[info.key] = self.callbacks[info.key] || []\n\n // remove an existing match if there is one\n self.getMatches(info.key, info.modifiers, {type: info.action}, sequenceName, combination, level)\n\n // add this call back to the array\n // if it is a sequence put it at the beginning\n // if not put it at the end\n //\n // this is important because the way these are processed expects\n // the sequence ones to come first\n self.callbacks[info.key][sequenceName ? 'unshift' : 'push']({\n callback: callback,\n modifiers: info.modifiers,\n action: info.action,\n seq: sequenceName,\n level: level,\n combo: combination\n })\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * takes the event and returns the key character\n *\n * @param {Event} e\n * @return {string}\n */\nmodule.exports = function (e) {\n var SPECIAL_KEYS_MAP,\n SPECIAL_CHARACTERS_MAP\n SPECIAL_KEYS_MAP = require('./special-keys-map')\n SPECIAL_CHARACTERS_MAP = require('./special-characters-map')\n\n // for keypress events we should return the character as is\n if (e.type === 'keypress') {\n var character = String.fromCharCode(e.which)\n\n // if the shift key is not pressed then it is safe to assume\n // that we want the character to be lowercase. this means if\n // you accidentally have caps lock on then your key bindings\n // will continue to work\n //\n // the only side effect that might not be desired is if you\n // bind something like 'A' cause you want to trigger an\n // event when capital A is pressed caps lock will no longer\n // trigger the event. shift+a will though.\n if (!e.shiftKey) {\n character = character.toLowerCase()\n }\n\n return character\n }\n\n // for non keypress events the special maps are needed\n if (SPECIAL_KEYS_MAP[e.which] !== undefined) {\n return SPECIAL_KEYS_MAP[e.which]\n }\n\n if (SPECIAL_CHARACTERS_MAP[e.which] !== undefined) {\n return SPECIAL_CHARACTERS_MAP[e.which]\n }\n\n // if it is not in the special map\n\n // with keydown and keyup events the character seems to always\n // come in as an uppercase character whether you are pressing shift\n // or not. we should make sure it is always lowercase for comparisons\n return String.fromCharCode(e.which).toLowerCase()\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * takes a key event and figures out what the modifiers are\n *\n * @param {Event} e\n * @returns {Array}\n */\nmodule.exports = function (e) {\n var modifiers = []\n\n if (e.shiftKey) {\n modifiers.push('shift')\n }\n\n if (e.altKey) {\n modifiers.push('alt')\n }\n\n if (e.ctrlKey) {\n modifiers.push('ctrl')\n }\n\n if (e.metaKey) {\n modifiers.push('meta')\n }\n\n return modifiers\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * resets the library back to its initial state. This is useful\n * if you want to clear out the current keyboard shortcuts and bind\n * new ones - for example if you switch to another page\n *\n * @returns void\n */\nmodule.exports = function () {\n var self = this\n self.callbacks = {}\n self.directMap = {}\n return this\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * checks if two arrays are equal\n *\n * @param {Array} modifiers1\n * @param {Array} modifiers2\n * @returns {boolean}\n */\nmodule.exports = function (modifiers1, modifiers2) {\n return modifiers1.sort().join(',') === modifiers2.sort().join(',')\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * Converts from a string key combination to an array\n *\n * @param {string} combination like \"command+shift+l\"\n * @return {Array}\n */\nmodule.exports = function (combination) {\n if (combination === '+') {\n return ['+']\n }\n\n return combination.split('+')\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * stops propogation for this event\n *\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (e) {\n if (e.stopPropagation) {\n e.stopPropagation()\n return\n }\n\n e.cancelBubble = true\n}\n","export const KIND = 'kind';\nexport const STATUS = 'status';\nexport const STATUS_MESSAGE = 'status.message';\nexport const LIBRARY_NAME = 'library.name';\nexport const LIBRARY_VERSION = 'library.version';\nexport const TRACE_STATE = 'trace.state';\nexport const ID = 'id';\n","import { css } from '@emotion/css';\nimport { useCallback, useMemo } from 'react';\nimport * as React from 'react';\n\nimport { DataSourceJsonData, DataSourceInstanceSettings, DataSourcePluginOptionsEditorProps } from '@grafana/data';\nimport { ConfigDescriptionLink, ConfigSection } from '@grafana/plugin-ui';\nimport { DataSourcePicker } from '@grafana/runtime';\nimport { InlineField, InlineFieldRow, Input, InlineSwitch } from '@grafana/ui';\n\nimport { IntervalInput } from '../IntervalInput/IntervalInput';\n\nimport { TagMappingInput } from './TagMappingInput';\n\nexport interface TraceToLogsTag {\n key: string;\n value?: string;\n}\n\n// @deprecated use getTraceToLogsOptions to get the v2 version of this config from jsonData\nexport interface TraceToLogsOptions {\n datasourceUid?: string;\n tags?: string[];\n mappedTags?: TraceToLogsTag[];\n mapTagNamesEnabled?: boolean;\n spanStartTimeShift?: string;\n spanEndTimeShift?: string;\n filterByTraceID?: boolean;\n filterBySpanID?: boolean;\n lokiSearch?: boolean; // legacy\n}\n\nexport interface TraceToLogsOptionsV2 {\n datasourceUid?: string;\n tags?: TraceToLogsTag[];\n spanStartTimeShift?: string;\n spanEndTimeShift?: string;\n filterByTraceID?: boolean;\n filterBySpanID?: boolean;\n query?: string;\n customQuery: boolean;\n}\n\nexport interface TraceToLogsData extends DataSourceJsonData {\n tracesToLogs?: TraceToLogsOptions;\n tracesToLogsV2?: TraceToLogsOptionsV2;\n}\n\n/**\n * Gets new version of the traceToLogs config from the json data either returning directly or transforming the old\n * version to new and returning that.\n */\nexport function getTraceToLogsOptions(data?: TraceToLogsData): TraceToLogsOptionsV2 | undefined {\n if (data?.tracesToLogsV2) {\n return data.tracesToLogsV2;\n }\n if (!data?.tracesToLogs) {\n return undefined;\n }\n const traceToLogs: TraceToLogsOptionsV2 = {\n customQuery: false,\n };\n traceToLogs.datasourceUid = data.tracesToLogs.datasourceUid;\n traceToLogs.tags = data.tracesToLogs.mapTagNamesEnabled\n ? data.tracesToLogs.mappedTags\n : data.tracesToLogs.tags?.map((tag) => ({ key: tag }));\n traceToLogs.filterByTraceID = data.tracesToLogs.filterByTraceID;\n traceToLogs.filterBySpanID = data.tracesToLogs.filterBySpanID;\n traceToLogs.spanStartTimeShift = data.tracesToLogs.spanStartTimeShift;\n traceToLogs.spanEndTimeShift = data.tracesToLogs.spanEndTimeShift;\n return traceToLogs;\n}\n\ninterface Props extends DataSourcePluginOptionsEditorProps<TraceToLogsData> {}\n\nexport function TraceToLogsSettings({ options, onOptionsChange }: Props) {\n const supportedDataSourceTypes = [\n 'loki',\n 'elasticsearch',\n 'grafana-splunk-datasource', // external\n 'grafana-opensearch-datasource', // external\n 'grafana-falconlogscale-datasource', // external\n 'googlecloud-logging-datasource', // external\n 'victoriametrics-logs-datasource', // external\n ];\n\n const traceToLogs = useMemo(\n (): TraceToLogsOptionsV2 => getTraceToLogsOptions(options.jsonData) || { customQuery: false },\n [options.jsonData]\n );\n const { query = '', tags, customQuery } = traceToLogs;\n\n const updateTracesToLogs = useCallback(\n (value: Partial<TraceToLogsOptionsV2>) => {\n // Cannot use updateDatasourcePluginJsonDataOption here as we need to update 2 keys, and they would overwrite each\n // other as updateDatasourcePluginJsonDataOption isn't synchronized\n onOptionsChange({\n ...options,\n jsonData: {\n ...options.jsonData,\n tracesToLogsV2: {\n ...traceToLogs,\n ...value,\n },\n tracesToLogs: undefined,\n },\n });\n },\n [onOptionsChange, options, traceToLogs]\n );\n\n return (\n <div className={css({ width: '100%' })}>\n <InlineFieldRow>\n <InlineField\n tooltip=\"The logs data source the trace is going to navigate to\"\n label=\"Data source\"\n labelWidth={26}\n >\n <DataSourcePicker\n inputId=\"trace-to-logs-data-source-picker\"\n filter={(ds) => supportedDataSourceTypes.includes(ds.type)}\n current={traceToLogs.datasourceUid}\n noDefault={true}\n width={40}\n onChange={(ds: DataSourceInstanceSettings) =>\n updateTracesToLogs({\n datasourceUid: ds.uid,\n })\n }\n onClear={() => updateTracesToLogs({ datasourceUid: undefined })}\n />\n </InlineField>\n </InlineFieldRow>\n\n <InlineFieldRow>\n <IntervalInput\n label={getTimeShiftLabel('start')}\n tooltip={getTimeShiftTooltip('start', '0')}\n value={traceToLogs.spanStartTimeShift || ''}\n onChange={(val) => {\n updateTracesToLogs({ spanStartTimeShift: val });\n }}\n isInvalidError={invalidTimeShiftError}\n />\n </InlineFieldRow>\n\n <InlineFieldRow>\n <IntervalInput\n label={getTimeShiftLabel('end')}\n tooltip={getTimeShiftTooltip('end', '0')}\n value={traceToLogs.spanEndTimeShift || ''}\n onChange={(val) => {\n updateTracesToLogs({ spanEndTimeShift: val });\n }}\n isInvalidError={invalidTimeShiftError}\n />\n </InlineFieldRow>\n\n <InlineFieldRow>\n <InlineField\n tooltip=\"Tags that will be used in the query. Default tags: 'cluster', 'hostname', 'namespace', 'pod', 'service.name', 'service.namespace'\"\n label=\"Tags\"\n labelWidth={26}\n >\n <TagMappingInput values={tags ?? []} onChange={(v) => updateTracesToLogs({ tags: v })} />\n </InlineField>\n </InlineFieldRow>\n\n <IdFilter\n disabled={customQuery}\n type={'trace'}\n id={'filterByTraceID'}\n value={Boolean(traceToLogs.filterByTraceID)}\n onChange={(val) => updateTracesToLogs({ filterByTraceID: val })}\n />\n <IdFilter\n disabled={customQuery}\n type={'span'}\n id={'filterBySpanID'}\n value={Boolean(traceToLogs.filterBySpanID)}\n onChange={(val) => updateTracesToLogs({ filterBySpanID: val })}\n />\n\n <InlineFieldRow>\n <InlineField\n tooltip=\"Use a custom query with the possibility to interpolate variables from the trace or span\"\n label=\"Use custom query\"\n labelWidth={26}\n >\n <InlineSwitch\n id={'customQuerySwitch'}\n value={customQuery}\n onChange={(event: React.SyntheticEvent<HTMLInputElement>) =>\n updateTracesToLogs({ customQuery: event.currentTarget.checked })\n }\n />\n </InlineField>\n </InlineFieldRow>\n\n {customQuery && (\n <InlineField\n label=\"Query\"\n labelWidth={26}\n tooltip=\"The query that will run when navigating from a trace to logs data source. Interpolate tags using the `$__tags` keyword\"\n grow\n >\n <Input\n label=\"Query\"\n type=\"text\"\n allowFullScreen\n value={query}\n onChange={(e) => updateTracesToLogs({ query: e.currentTarget.value })}\n />\n </InlineField>\n )}\n </div>\n );\n}\n\ninterface IdFilterProps {\n type: 'trace' | 'span';\n id: string;\n value: boolean;\n onChange: (val: boolean) => void;\n disabled: boolean;\n}\nfunction IdFilter(props: IdFilterProps) {\n return (\n <InlineFieldRow>\n <InlineField\n disabled={props.disabled}\n label={`Filter by ${props.type} ID`}\n labelWidth={26}\n grow\n tooltip={`Filters logs by ${props.type} ID, where the ${props.type} ID should be part of the log line`}\n >\n <InlineSwitch\n id={props.id}\n value={props.value}\n onChange={(event: React.SyntheticEvent<HTMLInputElement>) => props.onChange(event.currentTarget.checked)}\n />\n </InlineField>\n </InlineFieldRow>\n );\n}\n\nexport const getTimeShiftLabel = (type: 'start' | 'end') => {\n return `Span ${type} time shift`;\n};\n\nexport const getTimeShiftTooltip = (type: 'start' | 'end', defaultVal: string) => {\n return `Shifts the ${type} time of the span. Default: ${defaultVal} (Time units can be used here, for example: 5s, -1m, 3h)`;\n};\n\nexport const invalidTimeShiftError = 'Invalid time shift. See tooltip for examples.';\n\nexport const TraceToLogsSection = ({ options, onOptionsChange }: DataSourcePluginOptionsEditorProps) => {\n let suffix = options.type;\n suffix += options.type === 'tempo' ? '/configure-tempo-data-source/#trace-to-logs' : '/#trace-to-logs';\n\n return (\n <ConfigSection\n title=\"Trace to logs\"\n description={\n <ConfigDescriptionLink\n description=\"Navigate from a trace span to the selected data source's logs.\"\n suffix={suffix}\n feature=\"trace to logs\"\n />\n }\n isCollapsible={true}\n isInitiallyOpen={true}\n >\n <TraceToLogsSettings options={options} onOptionsChange={onOptionsChange} />\n </ConfigSection>\n );\n};\n","// Copyright (c) 2023 The Jaeger Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceSpan } from '../../types/trace';\n\n/**\n * @returns - Returns the span that finished last among the remaining child spans.\n * If a `returningChildStartTime` is provided as a parameter, it returns the child span that finishes\n * just before the specified `returningChildStartTime`.\n */\nconst findLastFinishingChildSpan = (\n spanMap: Map<string, TraceSpan>,\n currentSpan: TraceSpan,\n returningChildStartTime?: number\n): TraceSpan | undefined => {\n let lastFinishingChildSpanId: string | undefined;\n if (returningChildStartTime) {\n lastFinishingChildSpanId = currentSpan?.childSpanIds.find(\n (each) =>\n // Look up the span using the map\n spanMap.has(each) && spanMap.get(each)!.startTime + spanMap.get(each)!.duration < returningChildStartTime\n );\n } else {\n // If `returningChildStartTime` is not provided, select the first child span.\n // As they are sorted based on endTime\n lastFinishingChildSpanId = currentSpan.childSpanIds[0];\n }\n return lastFinishingChildSpanId ? spanMap.get(lastFinishingChildSpanId) : undefined;\n};\n\nexport default findLastFinishingChildSpan;\n","// Copyright (c) 2023 The Jaeger Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceSpan } from '../../types/trace';\n\n/**\n * Removes child spans whose refType is FOLLOWS_FROM and their descendants.\n * @param spanMap - The map containing spans.\n * @returns - A map with spans whose refType is CHILD_OF.\n */\nconst getChildOfSpans = (spanMap: Map<string, TraceSpan>): Map<string, TraceSpan> => {\n const followFromSpanIds: string[] = [];\n const followFromSpansDescendantIds: string[] = [];\n\n // First find all FOLLOWS_FROM refType spans\n spanMap.forEach((each) => {\n if (each.references[0]?.refType === 'FOLLOWS_FROM') {\n followFromSpanIds.push(each.spanID);\n // Remove the spanId from childSpanIds array of its parentSpan\n const parentSpan = spanMap.get(each.references[0].spanID)!;\n parentSpan.childSpanIds = parentSpan.childSpanIds.filter((a) => a !== each.spanID);\n spanMap.set(parentSpan.spanID, { ...parentSpan });\n }\n });\n\n // Recursively find all Descendants of FOLLOWS_FROM spans\n const findDescendantSpans = (spanIds: string[]) => {\n spanIds.forEach((spanId) => {\n const span = spanMap.get(spanId)!;\n if (span.hasChildren) {\n followFromSpansDescendantIds.push(...span.childSpanIds);\n findDescendantSpans(span.childSpanIds);\n }\n });\n };\n findDescendantSpans(followFromSpanIds);\n // Delete all FOLLOWS_FROM spans and its descendants\n const idsToBeDeleted = [...followFromSpanIds, ...followFromSpansDescendantIds];\n idsToBeDeleted.forEach((id) => spanMap.delete(id));\n\n return spanMap;\n};\nexport default getChildOfSpans;\n","// Copyright (c) 2023 The Jaeger Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceSpan } from '../../types/trace';\n\n/**\n * This function resolves overflowing child spans for each span.\n * An overflowing child span is one whose time range falls outside its parent span's time range.\n * The function adjusts the start time and duration of overflowing child spans\n * to ensure they fit within the time range of their parent span.\n * @param spanMap - A Map where span IDs are keys and the corresponding spans are values.\n * @returns - A sanitized span Map.\n */\nconst sanitizeOverFlowingChildren = (spanMap: Map<string, TraceSpan>): Map<string, TraceSpan> => {\n let spanIds: string[] = [...spanMap.keys()];\n\n spanIds.forEach((spanId) => {\n const span = spanMap.get(spanId)!;\n if (!(span && span.references.length && span.depth)) {\n return;\n }\n // parentSpan will be undefined when its parentSpan is dropped previously\n const parentSpan = spanMap.get(span.references[0].spanID);\n\n if (!parentSpan) {\n // Drop the child spans of dropped parent span\n spanMap.delete(span.spanID);\n return;\n }\n const childEndTime = span.startTime + span.duration;\n const parentEndTime = parentSpan.startTime + parentSpan.duration;\n if (span.startTime >= parentSpan.startTime) {\n if (span.startTime >= parentEndTime) {\n // child outside of parent range => drop the child span\n // |----parent----|\n // |----child--|\n // Remove the childSpan from spanMap\n spanMap.delete(span.spanID);\n\n // Remove the childSpanId from its parent span\n parentSpan.childSpanIds = parentSpan.childSpanIds.filter((id) => id !== span.spanID);\n return;\n }\n if (childEndTime > parentEndTime) {\n // child end after parent, truncate is needed\n // |----parent----|\n // |----child--|\n spanMap.set(span.spanID, {\n ...span,\n duration: parentEndTime - span.startTime,\n });\n return;\n }\n // everything looks good\n // |----parent----|\n // |----child--|\n return;\n }\n if (childEndTime <= parentSpan.startTime) {\n // child outside of parent range => drop the child span\n // |----parent----|\n // |----child--|\n\n // Remove the childSpan from spanMap\n spanMap.delete(span.spanID);\n\n // Remove the childSpanId from its parent span\n parentSpan.childSpanIds = parentSpan.childSpanIds.filter((id) => id !== span.spanID);\n } else if (childEndTime <= parentEndTime) {\n // child start before parent, truncate is needed\n // |----parent----|\n // |----child--|\n spanMap.set(span.spanID, {\n ...span,\n startTime: parentSpan.startTime,\n duration: childEndTime - parentSpan.startTime,\n });\n } else {\n // child start before parent and end after parent, truncate is needed\n // |----parent----|\n // |---------child---------|\n spanMap.set(span.spanID, {\n ...span,\n startTime: parentSpan.startTime,\n duration: parentEndTime - parentSpan.startTime,\n });\n }\n });\n\n // Updated spanIds to ensure to not include dropped spans\n spanIds = [...spanMap.keys()];\n // Update Child Span References with updated parent span\n spanIds.forEach((spanId) => {\n const span = spanMap.get(spanId)!;\n if (span.references.length) {\n const parentSpan = spanMap.get(span.references[0].spanID);\n span.references[0].span = parentSpan;\n spanMap.set(spanId, { ...span });\n }\n });\n\n return spanMap;\n};\nexport default sanitizeOverFlowingChildren;\n","// Copyright (c) 2023 The Jaeger Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport memoizeOne from 'memoize-one';\n\nimport { TraceSpan, CriticalPathSection, Trace } from '../types/trace';\n\nimport findLastFinishingChildSpan from './utils/findLastFinishingChildSpan';\nimport getChildOfSpans from './utils/getChildOfSpans';\nimport sanitizeOverFlowingChildren from './utils/sanitizeOverFlowingChildren';\n\n/**\n * Computes the critical path sections of a Jaeger trace.\n * The algorithm begins with the top-level span and iterates through the last finishing children (LFCs).\n * It recursively computes the critical path for each LFC span.\n * Upon return from recursion, the algorithm walks backward and picks another child that\n * finished just before the LFC's start.\n * @param spanMap - A map associating span IDs with spans.\n * @param spanId - The ID of the current span.\n * @param criticalPath - An array of critical path sections.\n * @param returningChildStartTime - Optional parameter representing the span's start time.\n * It is provided only during the recursive return phase.\n * @returns - An array of critical path sections for the trace.\n * @example -\n * |-------------spanA--------------|\n * |--spanB--| |--spanC--|\n * The LFC of spanA is spanC, as it finishes last among its child spans.\n * After invoking CP recursively on LFC, for spanC there is no LFC, so the algorithm walks backward.\n * At this point, it uses returningChildStartTime (startTime of spanC) to select another child that finished\n * immediately before the LFC's start.\n */\nconst computeCriticalPath = (\n spanMap: Map<string, TraceSpan>,\n spanId: string,\n criticalPath: CriticalPathSection[],\n returningChildStartTime?: number\n): CriticalPathSection[] => {\n const currentSpan = spanMap.get(spanId);\n\n if (!currentSpan) {\n return criticalPath;\n }\n\n const lastFinishingChildSpan = findLastFinishingChildSpan(spanMap, currentSpan, returningChildStartTime);\n let spanCriticalSection: CriticalPathSection;\n\n if (lastFinishingChildSpan) {\n spanCriticalSection = {\n spanId: currentSpan.spanID,\n section_start: lastFinishingChildSpan.startTime + lastFinishingChildSpan.duration,\n section_end: returningChildStartTime || currentSpan.startTime + currentSpan.duration,\n };\n if (spanCriticalSection.section_start !== spanCriticalSection.section_end) {\n criticalPath.push(spanCriticalSection);\n }\n // Now focus shifts to the lastFinishingChildSpan of cuurent span\n computeCriticalPath(spanMap, lastFinishingChildSpan.spanID, criticalPath);\n } else {\n // If there is no last finishing child then total section upto startTime of span is on critical path\n spanCriticalSection = {\n spanId: currentSpan.spanID,\n section_start: currentSpan.startTime,\n section_end: returningChildStartTime || currentSpan.startTime + currentSpan.duration,\n };\n if (spanCriticalSection.section_start !== spanCriticalSection.section_end) {\n criticalPath.push(spanCriticalSection);\n }\n // Now as there are no lfc's focus shifts to parent span from startTime of span\n // return from recursion and walk backwards to one level depth to parent span\n // provide span's startTime as returningChildStartTime\n if (currentSpan.references.length) {\n const parentSpanId: string = currentSpan.references.filter((reference) => reference.refType === 'CHILD_OF')[0]\n .spanID;\n computeCriticalPath(spanMap, parentSpanId, criticalPath, currentSpan.startTime);\n }\n }\n return criticalPath;\n};\n\nfunction criticalPathForTrace(trace: Trace) {\n let criticalPath: CriticalPathSection[] = [];\n // As spans are already sorted based on startTime first span is always rootSpan\n const rootSpanId = trace?.spans[0].spanID;\n // If there is root span then algorithm implements\n if (rootSpanId) {\n const spanMap = trace.spans.reduce((map, span) => {\n map.set(span.spanID, span);\n return map;\n }, new Map<string, TraceSpan>());\n try {\n const refinedSpanMap = getChildOfSpans(spanMap);\n const sanitizedSpanMap = sanitizeOverFlowingChildren(refinedSpanMap);\n criticalPath = computeCriticalPath(sanitizedSpanMap, rootSpanId, criticalPath);\n } catch (error) {\n /* eslint-disable no-console */\n console.log('error while computing critical path for a trace', error);\n }\n }\n return criticalPath;\n}\n\nconst memoizedTraceCriticalPath = memoizeOne(criticalPathForTrace);\n\nexport default memoizedTraceCriticalPath;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport memoizeOne from 'memoize-one';\nimport tinycolor from 'tinycolor2';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { colors } from '@grafana/ui';\n\n// TS needs the precise return type\nfunction strToRgb(s: string): [number, number, number] {\n if (s.length !== 7) {\n return [0, 0, 0];\n }\n const r = s.slice(1, 3);\n const g = s.slice(3, 5);\n const b = s.slice(5);\n return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16)];\n}\n\nclass ColorGenerator {\n colorsHex: string[];\n colorsRgb: Array<[number, number, number]>;\n cache: Map<string, number>;\n prevColorIndex: number | undefined;\n\n constructor(colorsHex: string[], theme: GrafanaTheme2) {\n const filteredColors = getFilteredColors(colorsHex, theme);\n this.colorsHex = filteredColors;\n this.colorsRgb = filteredColors.map(strToRgb);\n this.cache = new Map();\n this.prevColorIndex = undefined;\n }\n\n _getColorIndex(key: string): number {\n let i = this.cache.get(key);\n if (i == null) {\n const hash = this.hashCode(key ? key.toLowerCase() : '');\n i = Math.abs(hash % this.colorsHex.length);\n\n if (this.prevColorIndex !== undefined) {\n // disallow a color that is the same as the previous color\n if (this.prevColorIndex === i) {\n i = this.getNextIndex(i);\n }\n\n // disallow a color that looks very similar to the previous color\n const prevColor = this.colorsHex[this.prevColorIndex];\n if (tinycolor.readability(prevColor, this.colorsHex[i]) < 1.5) {\n let newIndex = i;\n for (let j = 0; j < this.colorsHex.length; j++) {\n newIndex = this.getNextIndex(newIndex);\n\n if (tinycolor.readability(prevColor, this.colorsHex[newIndex]) > 1.5) {\n i = newIndex;\n break;\n }\n }\n }\n }\n\n this.cache.set(key, i);\n this.prevColorIndex = i;\n }\n return i;\n }\n\n getNextIndex(i: number) {\n // get next index or go back to 0\n return i + 1 < this.colorsHex.length ? i + 1 : 0;\n }\n\n hashCode(key: string) {\n let hash = 0,\n i,\n chr;\n for (i = 0; i < key.length; i++) {\n chr = key.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n }\n return hash;\n }\n\n /**\n * Will assign a color to an arbitrary key.\n * If the key has been used already, it will\n * use the same color.\n */\n getColorByKey(key: string) {\n const i = this._getColorIndex(key);\n return this.colorsHex[i];\n }\n\n /**\n * Retrieve the RGB values associated with a key. Adds the key and associates\n * it with a color if the key is not recognized.\n * @returns {number[]} An array of three ints [0, 255] representing a color.\n */\n getRgbColorByKey(key: string): [number, number, number] {\n const i = this._getColorIndex(key);\n return this.colorsRgb[i];\n }\n\n clear() {\n this.cache.clear();\n }\n}\n\nconst getGenerator = memoizeOne((colors: string[], theme: GrafanaTheme2) => {\n return new ColorGenerator(colors, theme);\n});\n\nexport function clear(theme: GrafanaTheme2) {\n getGenerator([], theme);\n}\n\nexport function getColorByKey(key: string, theme: GrafanaTheme2) {\n return getGenerator(colors, theme).getColorByKey(key);\n}\n\nexport function getRgbColorByKey(key: string, theme: GrafanaTheme2): [number, number, number] {\n return getGenerator(colors, theme).getRgbColorByKey(key);\n}\n\nexport function getFilteredColors(colorsHex: string[], theme: GrafanaTheme2) {\n const filtered = [...colorsHex];\n // Remove red as a span color because it looks like an error\n const redIndex = filtered.indexOf('#E24D42');\n if (redIndex > -1) {\n filtered.splice(redIndex, 1);\n }\n const redIndex2 = colorsHex.indexOf('#BF1B00');\n if (redIndex2 > -1) {\n filtered.splice(redIndex2, 1);\n }\n\n // Only add colors that have a contrast ratio >= 3 for the current theme\n let filteredColors = [];\n for (const color of filtered) {\n if (tinycolor.readability(theme.colors.background.primary, color) >= 3) {\n filteredColors.push(color);\n }\n }\n\n return filteredColors;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport TNil from '../../types/TNil';\n\n// exported for tests\nexport const ITEM_ALPHA = 0.8;\nexport const MIN_ITEM_HEIGHT = 2;\nexport const MAX_TOTAL_HEIGHT = 200;\nexport const MIN_ITEM_WIDTH = 10;\nexport const MIN_TOTAL_HEIGHT = 60;\nexport const MAX_ITEM_HEIGHT = 6;\n\nexport default function renderIntoCanvas(\n canvas: HTMLCanvasElement,\n items: Array<{ valueWidth: number; valueOffset: number; serviceName: string }>,\n totalValueWidth: number,\n getFillColor: (serviceName: string) => [number, number, number],\n bgColor: string\n) {\n const fillCache: Map<string, string | TNil> = new Map();\n const cHeight = items.length < MIN_TOTAL_HEIGHT ? MIN_TOTAL_HEIGHT : Math.min(items.length, MAX_TOTAL_HEIGHT);\n const cWidth = window.innerWidth * 2;\n // eslint-disable-next-line no-param-reassign\n canvas.width = cWidth;\n // eslint-disable-next-line no-param-reassign\n canvas.height = cHeight;\n const itemHeight = Math.min(MAX_ITEM_HEIGHT, Math.max(MIN_ITEM_HEIGHT, cHeight / items.length));\n const itemYChange = cHeight / items.length;\n\n const ctx = canvas.getContext('2d', { alpha: false });\n if (ctx) {\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, cWidth, cHeight);\n for (let i = 0; i < items.length; i++) {\n const { valueWidth, valueOffset, serviceName } = items[i];\n const x = (valueOffset / totalValueWidth) * cWidth;\n let width = (valueWidth / totalValueWidth) * cWidth;\n if (width < MIN_ITEM_WIDTH) {\n width = MIN_ITEM_WIDTH;\n }\n let fillStyle = fillCache.get(serviceName);\n if (!fillStyle) {\n fillStyle = `rgba(${getFillColor(serviceName).concat(ITEM_ALPHA).join()})`;\n fillCache.set(serviceName, fillStyle);\n }\n ctx.fillStyle = fillStyle;\n ctx.fillRect(x, i * itemYChange, width, itemHeight);\n }\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { withTheme2, stylesFactory } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport TNil from '../../types/TNil';\nimport { getRgbColorByKey } from '../../utils/color-generator';\n\nimport renderIntoCanvas from './render-into-canvas';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n CanvasSpanGraph: css({\n label: 'CanvasSpanGraph',\n background: autoColor(theme, '#fafafa'),\n height: '60px',\n position: 'absolute',\n width: '100%',\n imageRendering: 'crisp-edges',\n }),\n };\n});\n\ntype CanvasSpanGraphProps = {\n items: Array<{ valueWidth: number; valueOffset: number; serviceName: string }>;\n valueWidth: number;\n theme: GrafanaTheme2;\n};\n\nexport class UnthemedCanvasSpanGraph extends React.PureComponent<CanvasSpanGraphProps> {\n _canvasElm: HTMLCanvasElement | TNil;\n\n constructor(props: CanvasSpanGraphProps) {\n super(props);\n this._canvasElm = undefined;\n }\n\n getColor = (key: string) => getRgbColorByKey(key, this.props.theme);\n\n componentDidMount() {\n this._draw();\n }\n\n componentDidUpdate() {\n this._draw();\n }\n\n _setCanvasRef = (elm: HTMLCanvasElement | TNil) => {\n this._canvasElm = elm;\n };\n\n _draw() {\n if (this._canvasElm) {\n const { valueWidth: totalValueWidth, items } = this.props;\n renderIntoCanvas(this._canvasElm, items, totalValueWidth, this.getColor, autoColor(this.props.theme, '#fff'));\n }\n }\n\n render() {\n return (\n <canvas\n className={getStyles(this.props.theme).CanvasSpanGraph}\n ref={this._setCanvasRef}\n data-testid=\"CanvasSpanGraph\"\n />\n );\n }\n}\n\nexport default withTheme2(UnthemedCanvasSpanGraph);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { round as _round, dropWhile as _dropWhile } from 'lodash';\nimport moment from 'moment-timezone';\n\nimport { toFloatPrecision } from './number';\n\nexport const STANDARD_DATE_FORMAT = 'YYYY-MM-DD';\nexport const STANDARD_TIME_FORMAT = 'HH:mm';\nexport const ONE_MILLISECOND = 1000;\nexport const ONE_SECOND = 1000 * ONE_MILLISECOND;\nexport const ONE_MINUTE = 60 * ONE_SECOND;\nexport const ONE_HOUR = 60 * ONE_MINUTE;\nexport const ONE_DAY = 24 * ONE_HOUR;\nexport const DEFAULT_MS_PRECISION = Math.log10(ONE_MILLISECOND);\n\nconst UNIT_STEPS: Array<{ unit: string; microseconds: number; ofPrevious: number }> = [\n { unit: 'd', microseconds: ONE_DAY, ofPrevious: 24 },\n { unit: 'h', microseconds: ONE_HOUR, ofPrevious: 60 },\n { unit: 'm', microseconds: ONE_MINUTE, ofPrevious: 60 },\n { unit: 's', microseconds: ONE_SECOND, ofPrevious: 1000 },\n { unit: 'ms', microseconds: ONE_MILLISECOND, ofPrevious: 1000 },\n { unit: 'μs', microseconds: 1, ofPrevious: 1000 },\n];\n\nconst quantizeDuration = (duration: number, floatPrecision: number, conversionFactor: number) =>\n toFloatPrecision(duration / conversionFactor, floatPrecision) * conversionFactor;\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatDate(duration: number) {\n return moment(duration / ONE_MILLISECOND).format(STANDARD_DATE_FORMAT);\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatTime(duration: number) {\n return moment(duration / ONE_MILLISECOND).format(STANDARD_TIME_FORMAT);\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatMillisecondTime(duration: number) {\n const targetDuration = quantizeDuration(duration, DEFAULT_MS_PRECISION, ONE_MILLISECOND);\n return `${moment.duration(targetDuration / ONE_MILLISECOND).asMilliseconds()}ms`;\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in seconds\n */\nexport function formatSecondTime(duration: number) {\n const targetDuration = quantizeDuration(duration, DEFAULT_MS_PRECISION, ONE_SECOND);\n return `${moment.duration(targetDuration / ONE_MILLISECOND).asSeconds()}s`;\n}\n\n/**\n * Humanizes the duration for display.\n *\n * Example:\n * 5000ms => 5s\n * 1000μs => 1ms\n * 183840s => 2d 3h\n *\n * @param {number} duration (in microseconds)\n * @return {string} formatted duration\n */\nexport function formatDuration(duration: number): string {\n // Drop all units that are too large except the last one\n const [primaryUnit, secondaryUnit] = _dropWhile(\n UNIT_STEPS,\n ({ microseconds }, index) => index < UNIT_STEPS.length - 1 && microseconds > duration\n );\n\n if (primaryUnit.ofPrevious === 1000) {\n // If the unit is decimal based, display as a decimal\n return `${_round(duration / primaryUnit.microseconds, 2)}${primaryUnit.unit}`;\n }\n\n let primaryValue = Math.floor(duration / primaryUnit.microseconds);\n let secondaryValue = (duration / secondaryUnit.microseconds) % primaryUnit.ofPrevious;\n const secondaryValueRounded = Math.round(secondaryValue);\n\n // Handle rollover case before rounding (e.g., 60s should become 1m, not 0m 60s)\n if (secondaryValueRounded === primaryUnit.ofPrevious) {\n primaryValue += 1;\n secondaryValue = 0;\n } else {\n secondaryValue = secondaryValueRounded;\n }\n\n const primaryUnitString = `${primaryValue}${primaryUnit.unit}`;\n\n if (secondaryValue === 0) {\n return primaryUnitString;\n }\n\n const secondaryUnitString = `${secondaryValue}${secondaryUnit.unit}`;\n return `${primaryUnitString} ${secondaryUnitString}`;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\n\nimport { useStyles2 } from '@grafana/ui';\n\nimport { formatDuration } from '../../utils/date';\n\nconst getStyles = () => ({\n TickLabels: css({\n label: 'TickLabels',\n height: '1rem',\n position: 'relative',\n }),\n TickLabelsLabel: css({\n label: 'TickLabelsLabel',\n color: '#717171',\n fontSize: '0.7rem',\n position: 'absolute',\n userSelect: 'none',\n }),\n});\n\ntype TickLabelsProps = {\n numTicks: number;\n duration: number;\n};\n\nexport default function TickLabels(props: TickLabelsProps) {\n const { numTicks, duration } = props;\n const styles = useStyles2(getStyles);\n\n const ticks = [];\n for (let i = 0; i < numTicks + 1; i++) {\n const portion = i / numTicks;\n const style = portion === 1 ? { right: '0%' } : { left: `${portion * 100}%` };\n ticks.push(\n <div key={portion} className={styles.TickLabelsLabel} style={style} data-testid=\"tick\">\n {formatDuration(duration * portion)}\n </div>\n );\n }\n\n return (\n <div className={styles.TickLabels} data-testid=\"TickLabels\">\n {ticks}\n </div>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// // export default {\n// const updateTypes = {\n// DRAG_END: 'DRAG_END',\n// DRAG_MOVE: 'DRAG_MOVE',\n// DRAG_START: 'DRAG_START',\n// MOUSE_ENTER: 'MOUSE_ENTER',\n// MOUSE_LEAVE: 'MOUSE_LEAVE',\n// MOUSE_MOVE: 'MOUSE_MOVE',\n// };\n\n// const typeUpdateTypes = updateTypes as { [K in keyof typeof updateTypes]: K };\n\nenum EUpdateTypes {\n DragEnd = 'DragEnd',\n DragMove = 'DragMove',\n DragStart = 'DragStart',\n MouseEnter = 'MouseEnter',\n MouseLeave = 'MouseLeave',\n MouseMove = 'MouseMove',\n}\n\nexport default EUpdateTypes;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { get as _get } from 'lodash';\n\nimport TNil from '../../types/TNil';\n\nimport EUpdateTypes from './EUpdateTypes';\nimport { DraggableBounds, DraggingUpdate } from './types';\n\nconst LEFT_MOUSE_BUTTON = 0;\n\nexport type DraggableManagerOptions = {\n getBounds: (tag: string | TNil) => DraggableBounds;\n onMouseEnter?: (update: DraggingUpdate) => void;\n onMouseLeave?: (update: DraggingUpdate) => void;\n onMouseMove?: (update: DraggingUpdate) => void;\n onDragStart?: (update: DraggingUpdate) => void;\n onDragMove?: (update: DraggingUpdate) => void;\n onDragEnd?: (update: DraggingUpdate) => void;\n resetBoundsOnResize?: boolean;\n tag?: string;\n};\n\nexport default class DraggableManager {\n // cache the last known DraggableBounds (invalidate via `#resetBounds())\n _bounds: DraggableBounds | TNil;\n _isDragging: boolean;\n // optional callbacks for various dragging events\n _onMouseEnter: ((update: DraggingUpdate) => void) | TNil;\n _onMouseLeave: ((update: DraggingUpdate) => void) | TNil;\n _onMouseMove: ((update: DraggingUpdate) => void) | TNil;\n _onDragStart: ((update: DraggingUpdate) => void) | TNil;\n _onDragMove: ((update: DraggingUpdate) => void) | TNil;\n _onDragEnd: ((update: DraggingUpdate) => void) | TNil;\n // whether to reset the bounds on window resize\n _resetBoundsOnResize: boolean;\n\n /**\n * Get the `DraggableBounds` for the current drag. The returned value is\n * cached until either `#resetBounds()` is called or the window is resized\n * (assuming `_resetBoundsOnResize` is `true`). The `DraggableBounds` defines\n * the range the current drag can span to. It also establishes the left offset\n * to adjust `clientX` by (from the `MouseEvent`s).\n */\n getBounds: (tag: string | TNil) => DraggableBounds;\n\n // convenience data\n tag: string | TNil;\n\n // handlers for integration with DOM elements\n handleMouseEnter: (event: React.MouseEvent) => void;\n handleMouseMove: (event: React.MouseEvent) => void;\n handleMouseLeave: (event: React.MouseEvent) => void;\n handleMouseDown: (event: React.MouseEvent) => void;\n\n constructor({ getBounds, tag, resetBoundsOnResize = true, ...rest }: DraggableManagerOptions) {\n this.handleMouseDown = this._handleDragEvent;\n this.handleMouseEnter = this._handleMinorMouseEvent;\n this.handleMouseMove = this._handleMinorMouseEvent;\n this.handleMouseLeave = this._handleMinorMouseEvent;\n\n this.getBounds = getBounds;\n this.tag = tag;\n this._isDragging = false;\n this._bounds = undefined;\n this._resetBoundsOnResize = Boolean(resetBoundsOnResize);\n if (this._resetBoundsOnResize) {\n window.addEventListener('resize', this.resetBounds);\n }\n this._onMouseEnter = rest.onMouseEnter;\n this._onMouseLeave = rest.onMouseLeave;\n this._onMouseMove = rest.onMouseMove;\n this._onDragStart = rest.onDragStart;\n this._onDragMove = rest.onDragMove;\n this._onDragEnd = rest.onDragEnd;\n }\n\n _getBounds(): DraggableBounds {\n if (!this._bounds) {\n this._bounds = this.getBounds(this.tag);\n }\n return this._bounds;\n }\n\n _getPosition(clientX: number) {\n const { clientXLeft, maxValue, minValue, width } = this._getBounds();\n let x = clientX - clientXLeft;\n let value = x / width;\n if (minValue != null && value < minValue) {\n value = minValue;\n x = minValue * width;\n } else if (maxValue != null && value > maxValue) {\n value = maxValue;\n x = maxValue * width;\n }\n return { value, x };\n }\n\n _stopDragging() {\n window.removeEventListener('mousemove', this._handleDragEvent);\n window.removeEventListener('mouseup', this._handleDragEvent);\n const style = _get(document, 'body.style');\n if (style) {\n style.userSelect = 'auto';\n }\n this._isDragging = false;\n }\n\n isDragging() {\n return this._isDragging;\n }\n\n dispose() {\n if (this._isDragging) {\n this._stopDragging();\n }\n if (this._resetBoundsOnResize) {\n window.removeEventListener('resize', this.resetBounds);\n }\n this._bounds = undefined;\n this._onMouseEnter = undefined;\n this._onMouseLeave = undefined;\n this._onMouseMove = undefined;\n this._onDragStart = undefined;\n this._onDragMove = undefined;\n this._onDragEnd = undefined;\n }\n\n resetBounds = () => {\n this._bounds = undefined;\n };\n\n _handleMinorMouseEvent = (event: React.MouseEvent) => {\n const { button, clientX, type: eventType } = event;\n if (this._isDragging || button !== LEFT_MOUSE_BUTTON) {\n return;\n }\n let type: EUpdateTypes | null = null;\n let handler: ((update: DraggingUpdate) => void) | TNil;\n if (eventType === 'mouseenter') {\n type = EUpdateTypes.MouseEnter;\n handler = this._onMouseEnter;\n } else if (eventType === 'mouseleave') {\n type = EUpdateTypes.MouseLeave;\n handler = this._onMouseLeave;\n } else if (eventType === 'mousemove') {\n type = EUpdateTypes.MouseMove;\n handler = this._onMouseMove;\n } else {\n throw new Error(`invalid event type: ${eventType}`);\n }\n if (!handler) {\n return;\n }\n const { value, x } = this._getPosition(clientX);\n handler({\n event,\n type,\n value,\n x,\n manager: this,\n tag: this.tag,\n });\n };\n\n _handleDragEvent = (event: MouseEvent | React.MouseEvent) => {\n const { button, clientX, type: eventType } = event;\n let type: EUpdateTypes | null = null;\n let handler: ((update: DraggingUpdate) => void) | TNil;\n if (eventType === 'mousedown') {\n if (this._isDragging || button !== LEFT_MOUSE_BUTTON) {\n return;\n }\n window.addEventListener('mousemove', this._handleDragEvent);\n window.addEventListener('mouseup', this._handleDragEvent);\n const style = _get(document, 'body.style');\n if (style) {\n style.userSelect = 'none';\n }\n this._isDragging = true;\n\n type = EUpdateTypes.DragStart;\n handler = this._onDragStart;\n } else if (eventType === 'mousemove') {\n if (!this._isDragging) {\n return;\n }\n type = EUpdateTypes.DragMove;\n handler = this._onDragMove;\n } else if (eventType === 'mouseup') {\n if (!this._isDragging) {\n return;\n }\n this._stopDragging();\n type = EUpdateTypes.DragEnd;\n handler = this._onDragEnd;\n } else {\n throw new Error(`invalid event type: ${eventType}`);\n }\n if (!handler) {\n return;\n }\n const { value, x } = this._getPosition(clientX);\n handler({\n event,\n type,\n value,\n x,\n manager: this,\n tag: this.tag,\n });\n };\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\n\nimport { useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => ({\n GraphTick: css({\n label: 'GraphTick',\n stroke: '#aaa',\n strokeWidth: '1px',\n }),\n});\n\nexport type GraphTicksProps = {\n numTicks: number;\n};\n\nexport default function GraphTicks(props: GraphTicksProps) {\n const { numTicks } = props;\n const styles = useStyles2(getStyles);\n const ticks = [];\n // i starts at 1, limit is `i < numTicks` so the first and last ticks aren't drawn\n for (let i = 1; i < numTicks; i++) {\n const x = `${(i / numTicks) * 100}%`;\n ticks.push(<line className={styles.GraphTick} x1={x} y1=\"0%\" x2={x} y2=\"100%\" key={i / numTicks} />);\n }\n\n return (\n <g data-testid=\"ticks\" aria-hidden=\"true\">\n {ticks}\n </g>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nexport const getStyles = () => ({\n ScrubberHandleExpansion: cx(\n css({\n label: 'ScrubberHandleExpansion',\n cursor: 'col-resize',\n fillOpacity: 0,\n fill: '#44f',\n }),\n 'scrubber-handle-expansion'\n ),\n ScrubberHandle: cx(\n css({\n label: 'ScrubberHandle',\n cursor: 'col-resize',\n fill: '#555',\n }),\n 'scrubber-handle'\n ),\n ScrubberLine: cx(\n css({\n label: 'ScrubberLine',\n pointerEvents: 'none',\n stroke: '#555',\n }),\n 'scrubber-line'\n ),\n ScrubberDragging: css({\n label: 'ScrubberDragging',\n '& .scrubber-handle-expansion': {\n fillOpacity: 1,\n },\n '& .scrubber-handle': {\n fill: '#44f',\n },\n '& > .scrubber-line': {\n stroke: '#44f',\n },\n }),\n ScrubberHandles: css({\n label: 'ScrubberHandles',\n '&:hover > .scrubber-handle-expansion': {\n fillOpacity: 1,\n },\n '&:hover > .scrubber-handle': {\n fill: '#44f',\n },\n '&:hover + .scrubber.line': {\n stroke: '#44f',\n },\n }),\n});\n\nexport type ScrubberProps = {\n isDragging: boolean;\n position: number;\n onMouseDown: (evt: React.MouseEvent<SVGGElement>) => void;\n onMouseEnter: (evt: React.MouseEvent<SVGGElement>) => void;\n onMouseLeave: (evt: React.MouseEvent<SVGGElement>) => void;\n};\n\nexport default function Scrubber({ isDragging, onMouseDown, onMouseEnter, onMouseLeave, position }: ScrubberProps) {\n const xPercent = `${position * 100}%`;\n const styles = useStyles2(getStyles);\n const className = cx({ [styles.ScrubberDragging]: isDragging });\n return (\n <g className={className} data-testid=\"scrubber-component\">\n <g\n data-testid=\"scrubber-component-g\"\n className={styles.ScrubberHandles}\n onMouseDown={onMouseDown}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {/* handleExpansion is only visible when `isDragging` is true */}\n <rect\n data-testid=\"scrubber-component-rect-1\"\n x={xPercent}\n className={styles.ScrubberHandleExpansion}\n style={{ transform: `translate(-4.5px)` }}\n width=\"9\"\n height=\"20\"\n />\n <rect\n data-testid=\"scrubber-component-rect-2\"\n x={xPercent}\n className={styles.ScrubberHandle}\n style={{ transform: `translate(-1.5px)` }}\n width=\"3\"\n height=\"20\"\n />\n </g>\n <line\n className={styles.ScrubberLine}\n y2=\"100%\"\n x1={xPercent}\n x2={xPercent}\n data-testid=\"scrubber-component-line\"\n />\n </g>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Trans } from '@grafana/i18n';\nimport { withTheme2, stylesFactory, Button } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TUpdateViewRangeTimeFunction, ViewRangeTimeUpdate, ViewRange } from '../../TraceTimelineViewer/types';\nimport TNil from '../../types/TNil';\nimport DraggableManager from '../../utils/DraggableManager/DraggableManager';\nimport EUpdateTypes from '../../utils/DraggableManager/EUpdateTypes';\nimport { DraggableBounds, DraggingUpdate } from '../../utils/DraggableManager/types';\n\nimport GraphTicks from './GraphTicks';\nimport Scrubber from './Scrubber';\n\nexport const getStyles = stylesFactory((theme: GrafanaTheme2) => {\n // Need this cause emotion will merge emotion generated classes into single className if used with cx from emotion\n // package and the selector won't work\n const ViewingLayerResetZoomHoverClassName = 'JaegerUiComponents__ViewingLayerResetZoomHoverClassName';\n const ViewingLayerResetZoom = css({\n label: 'ViewingLayerResetZoom',\n display: 'none',\n position: 'absolute',\n right: '1%',\n top: '10%',\n zIndex: 1,\n });\n\n return {\n ViewingLayer: css({\n label: 'ViewingLayer',\n cursor: 'vertical-text',\n position: 'relative',\n zIndex: 1,\n [`&:hover > .${ViewingLayerResetZoomHoverClassName}`]: {\n display: 'unset',\n },\n }),\n ViewingLayerGraph: css({\n label: 'ViewingLayerGraph',\n border: `1px solid ${autoColor(theme, '#999')}`,\n /* need !important here to overcome something from semantic UI */\n overflow: 'visible !important',\n position: 'relative',\n transformOrigin: '0 0',\n width: '100%',\n }),\n ViewingLayerInactive: css({\n label: 'ViewingLayerInactive',\n fill: autoColor(theme, 'rgba(214, 214, 214, 0.5)'),\n }),\n ViewingLayerCursorGuide: css({\n label: 'ViewingLayerCursorGuide',\n stroke: autoColor(theme, '#f44'),\n strokeWidth: 1,\n }),\n ViewingLayerDraggedShift: css({\n label: 'ViewingLayerDraggedShift',\n fillOpacity: 0.2,\n }),\n ViewingLayerDrag: css({\n label: 'ViewingLayerDrag',\n fill: autoColor(theme, '#44f'),\n }),\n ViewingLayerFullOverlay: css({\n label: 'ViewingLayerFullOverlay',\n bottom: 0,\n cursor: 'col-resize',\n left: 0,\n position: 'fixed',\n right: 0,\n top: 0,\n userSelect: 'none',\n }),\n ViewingLayerResetZoom,\n ViewingLayerResetZoomHoverClassName,\n };\n});\n\nexport type ViewingLayerProps = {\n height: number;\n numTicks: number;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n viewRange: ViewRange;\n theme: GrafanaTheme2;\n};\n\ntype ViewingLayerState = {\n /**\n * Cursor line should not be drawn when the mouse is over the scrubber handle.\n */\n preventCursorLine: boolean;\n};\n\n/**\n * Designate the tags for the different dragging managers. Exported for tests.\n */\nexport const dragTypes = {\n /**\n * Tag for dragging the right scrubber, e.g. end of the current view range.\n */\n SHIFT_END: 'SHIFT_END',\n /**\n * Tag for dragging the left scrubber, e.g. start of the current view range.\n */\n SHIFT_START: 'SHIFT_START',\n /**\n * Tag for dragging a new view range.\n */\n REFRAME: 'REFRAME',\n};\n\n/**\n * Returns the layout information for drawing the view-range differential, e.g.\n * show what will change when the mouse is released. Basically, this is the\n * difference from the start of the drag to the current position.\n *\n * @returns {{ x: string, width: string, leadginX: string }}\n */\nfunction getNextViewLayout(start: number, position: number) {\n const [left, right] = start < position ? [start, position] : [position, start];\n return {\n x: `${left * 100}%`,\n width: `${(right - left) * 100}%`,\n leadingX: `${position * 100}%`,\n };\n}\n\n/**\n * `ViewingLayer` is rendered on top of the Canvas rendering of the minimap and\n * handles showing the current view range and handles mouse UX for modifying it.\n */\nexport class UnthemedViewingLayer extends React.PureComponent<ViewingLayerProps, ViewingLayerState> {\n state: ViewingLayerState;\n\n _root: Element | TNil;\n\n /**\n * `_draggerReframe` handles clicking and dragging on the `ViewingLayer` to\n * redefined the view range.\n */\n _draggerReframe: DraggableManager;\n\n /**\n * `_draggerStart` handles dragging the left scrubber to adjust the start of\n * the view range.\n */\n _draggerStart: DraggableManager;\n\n /**\n * `_draggerEnd` handles dragging the right scrubber to adjust the end of\n * the view range.\n */\n _draggerEnd: DraggableManager;\n\n constructor(props: ViewingLayerProps) {\n super(props);\n\n this._draggerReframe = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleReframeDragEnd,\n onDragMove: this._handleReframeDragUpdate,\n onDragStart: this._handleReframeDragUpdate,\n onMouseMove: this._handleReframeMouseMove,\n onMouseLeave: this._handleReframeMouseLeave,\n tag: dragTypes.REFRAME,\n });\n\n this._draggerStart = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleScrubberDragEnd,\n onDragMove: this._handleScrubberDragUpdate,\n onDragStart: this._handleScrubberDragUpdate,\n onMouseEnter: this._handleScrubberEnterLeave,\n onMouseLeave: this._handleScrubberEnterLeave,\n tag: dragTypes.SHIFT_START,\n });\n\n this._draggerEnd = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleScrubberDragEnd,\n onDragMove: this._handleScrubberDragUpdate,\n onDragStart: this._handleScrubberDragUpdate,\n onMouseEnter: this._handleScrubberEnterLeave,\n onMouseLeave: this._handleScrubberEnterLeave,\n tag: dragTypes.SHIFT_END,\n });\n\n this._root = undefined;\n this.state = {\n preventCursorLine: false,\n };\n }\n\n componentWillUnmount() {\n this._draggerReframe.dispose();\n this._draggerEnd.dispose();\n this._draggerStart.dispose();\n }\n\n _setRoot = (elm: SVGElement | TNil) => {\n this._root = elm;\n };\n\n _getDraggingBounds = (tag: string | TNil): DraggableBounds => {\n if (!this._root) {\n throw new Error('invalid state');\n }\n const { left: clientXLeft, width } = this._root.getBoundingClientRect();\n const [viewStart, viewEnd] = this.props.viewRange.time.current;\n let maxValue = 1;\n let minValue = 0;\n if (tag === dragTypes.SHIFT_START) {\n maxValue = viewEnd;\n } else if (tag === dragTypes.SHIFT_END) {\n minValue = viewStart;\n }\n return { clientXLeft, maxValue, minValue, width };\n };\n\n _handleReframeMouseMove = ({ value }: DraggingUpdate) => {\n this.props.updateNextViewRangeTime({ cursor: value });\n };\n\n _handleReframeMouseLeave = () => {\n this._draggerReframe.resetBounds();\n this.props.updateNextViewRangeTime({ cursor: null });\n };\n\n _handleReframeDragUpdate = ({ value }: DraggingUpdate) => {\n const shift = value;\n const { time } = this.props.viewRange;\n const anchor = time.reframe ? time.reframe.anchor : shift;\n const update = { reframe: { anchor, shift } };\n this.props.updateNextViewRangeTime(update);\n };\n\n _handleReframeDragEnd = ({ manager, value }: DraggingUpdate) => {\n const { time } = this.props.viewRange;\n const anchor = time.reframe ? time.reframe.anchor : value;\n const [start, end] = value < anchor ? [value, anchor] : [anchor, value];\n manager.resetBounds();\n this.props.updateViewRangeTime(start, end, 'minimap');\n };\n\n _handleScrubberEnterLeave = ({ type }: DraggingUpdate) => {\n const preventCursorLine = type === EUpdateTypes.MouseEnter;\n this.setState({ preventCursorLine });\n };\n\n _handleScrubberDragUpdate = ({ event, tag, type, value }: DraggingUpdate) => {\n if (type === EUpdateTypes.DragStart) {\n event.stopPropagation();\n }\n if (tag === dragTypes.SHIFT_START) {\n this.props.updateNextViewRangeTime({ shiftStart: value });\n } else if (tag === dragTypes.SHIFT_END) {\n this.props.updateNextViewRangeTime({ shiftEnd: value });\n }\n };\n\n _handleScrubberDragEnd = ({ manager, tag, value }: DraggingUpdate) => {\n const [viewStart, viewEnd] = this.props.viewRange.time.current;\n let update: [number, number];\n if (tag === dragTypes.SHIFT_START) {\n update = [value, viewEnd];\n } else if (tag === dragTypes.SHIFT_END) {\n update = [viewStart, value];\n } else {\n // to satisfy flow\n throw new Error('bad state');\n }\n manager.resetBounds();\n this.setState({ preventCursorLine: false });\n this.props.updateViewRangeTime(update[0], update[1], 'minimap');\n };\n\n /**\n * Resets the zoom to fully zoomed out.\n */\n _resetTimeZoomClickHandler = () => {\n this.props.updateViewRangeTime(0, 1);\n };\n\n /**\n * Renders the difference between where the drag started and the current\n * position, e.g. the red or blue highlight.\n *\n * @returns React.Node[]\n */\n _getMarkers(from: number, to: number) {\n const styles = getStyles(this.props.theme);\n const layout = getNextViewLayout(from, to);\n return [\n <rect\n key=\"fill\"\n className={cx(styles.ViewingLayerDraggedShift, styles.ViewingLayerDrag)}\n x={layout.x}\n y=\"0\"\n width={layout.width}\n height={this.props.height - 2}\n />,\n <rect\n key=\"edge\"\n className={cx(styles.ViewingLayerDrag)}\n x={layout.leadingX}\n y=\"0\"\n width=\"1\"\n height={this.props.height - 2}\n />,\n ];\n }\n\n render() {\n const { height, viewRange, numTicks, theme } = this.props;\n const { preventCursorLine } = this.state;\n const { current, cursor, shiftStart, shiftEnd, reframe } = viewRange.time;\n const haveNextTimeRange = shiftStart != null || shiftEnd != null || reframe != null;\n const [viewStart, viewEnd] = current;\n let leftInactive = 0;\n if (viewStart) {\n leftInactive = viewStart * 100;\n }\n let rightInactive = 100;\n if (viewEnd) {\n rightInactive = 100 - viewEnd * 100;\n }\n let cursorPosition: string | undefined;\n if (!haveNextTimeRange && cursor != null && !preventCursorLine) {\n cursorPosition = `${cursor * 100}%`;\n }\n const styles = getStyles(theme);\n\n return (\n <div aria-hidden className={styles.ViewingLayer} style={{ height }}>\n {(viewStart !== 0 || viewEnd !== 1) && (\n <Button\n onClick={this._resetTimeZoomClickHandler}\n className={cx(styles.ViewingLayerResetZoom, styles.ViewingLayerResetZoomHoverClassName)}\n type=\"button\"\n variant=\"secondary\"\n >\n <Trans i18nKey=\"explore.unthemed-viewing-layer.reset-selection\">Reset selection</Trans>\n </Button>\n )}\n <svg\n height={height}\n className={styles.ViewingLayerGraph}\n ref={this._setRoot}\n onMouseDown={this._draggerReframe.handleMouseDown}\n onMouseLeave={this._draggerReframe.handleMouseLeave}\n onMouseMove={this._draggerReframe.handleMouseMove}\n >\n {leftInactive > 0 && (\n <rect\n x={0}\n y={0}\n height=\"100%\"\n width={`${leftInactive}%`}\n className={styles.ViewingLayerInactive}\n data-testid=\"left-ViewingLayerInactive\"\n />\n )}\n {rightInactive > 0 && (\n <rect\n x={`${100 - rightInactive}%`}\n y={0}\n height=\"100%\"\n width={`${rightInactive}%`}\n className={styles.ViewingLayerInactive}\n data-testid=\"right-ViewingLayerInactive\"\n />\n )}\n <GraphTicks numTicks={numTicks} />\n {cursorPosition && (\n <line\n className={styles.ViewingLayerCursorGuide}\n x1={cursorPosition}\n y1=\"0\"\n x2={cursorPosition}\n y2={height - 2}\n strokeWidth=\"1\"\n data-testid=\"ViewingLayerCursorGuide\"\n />\n )}\n {shiftStart != null && this._getMarkers(viewStart, shiftStart)}\n {shiftEnd != null && this._getMarkers(viewEnd, shiftEnd)}\n <Scrubber\n isDragging={shiftStart != null}\n onMouseDown={this._draggerStart.handleMouseDown}\n onMouseEnter={this._draggerStart.handleMouseEnter}\n onMouseLeave={this._draggerStart.handleMouseLeave}\n position={viewStart || 0}\n />\n <Scrubber\n isDragging={shiftEnd != null}\n position={viewEnd || 1}\n onMouseDown={this._draggerEnd.handleMouseDown}\n onMouseEnter={this._draggerEnd.handleMouseEnter}\n onMouseLeave={this._draggerEnd.handleMouseLeave}\n />\n {reframe != null && this._getMarkers(reframe.anchor, reframe.shift)}\n </svg>\n {/* fullOverlay updates the mouse cursor blocks mouse events */}\n {haveNextTimeRange && <div className={styles.ViewingLayerFullOverlay} />}\n </div>\n );\n }\n}\n\nexport default withTheme2(UnthemedViewingLayer);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport memoizeOne from 'memoize-one';\nimport { memo } from 'react';\n\nimport { ViewRange, TUpdateViewRangeTimeFunction, ViewRangeTimeUpdate } from '../../TraceTimelineViewer/types';\nimport { Trace, TraceSpan } from '../../types/trace';\n\nimport CanvasSpanGraph from './CanvasSpanGraph';\nimport TickLabels from './TickLabels';\nimport ViewingLayer from './ViewingLayer';\n\nconst getStyles = () => {\n return {\n container: css({\n padding: '0 0.5rem 0.5rem 0.5rem',\n }),\n canvasContainer: css({\n position: 'relative',\n }),\n };\n};\n\nconst DEFAULT_HEIGHT = 60;\nexport const TIMELINE_TICK_INTERVAL = 4;\n\nexport type SpanGraphProps = {\n height?: number;\n trace: Trace;\n viewRange: ViewRange;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n updateNextViewRangeTime: (nextUpdate: ViewRangeTimeUpdate) => void;\n};\n\ntype SpanItem = {\n valueOffset: number;\n valueWidth: number;\n serviceName: string;\n};\n\nfunction getItem(span: TraceSpan): SpanItem {\n return {\n valueOffset: span.relativeStartTime,\n valueWidth: span.duration,\n serviceName: span.process.serviceName,\n };\n}\n\nfunction getItems(trace: Trace): SpanItem[] {\n return trace.spans.map(getItem);\n}\n\nconst memoizedGetitems = memoizeOne(getItems);\n\nconst SpanGraph = memo(\n ({ height = DEFAULT_HEIGHT, trace, viewRange, updateNextViewRangeTime, updateViewRangeTime }: SpanGraphProps) => {\n const styles = getStyles();\n\n if (!trace) {\n return <div />;\n }\n\n const items = memoizedGetitems(trace);\n return (\n <div className={styles.container}>\n <TickLabels numTicks={TIMELINE_TICK_INTERVAL} duration={trace.duration} />\n <div className={styles.canvasContainer}>\n <CanvasSpanGraph valueWidth={trace.duration} items={items} />\n <ViewingLayer\n viewRange={viewRange}\n numTicks={TIMELINE_TICK_INTERVAL}\n height={height}\n updateViewRangeTime={updateViewRangeTime}\n updateNextViewRangeTime={updateNextViewRangeTime}\n />\n </div>\n </div>\n );\n }\n);\n\nSpanGraph.displayName = 'SpanGraph';\n\nexport default SpanGraph;\n","export const validateIntervalRegex = /^(-?\\d+(?:\\.\\d+)?)(ms|[Mwdhmsy])$/;\n\nexport const validateInterval = (val: string, regex = validateIntervalRegex) => {\n const matches = val.match(regex);\n return matches || !val ? false : true;\n};\n","import { useState } from 'react';\nimport { useDebounce } from 'react-use';\n\nimport { InlineField, Input } from '@grafana/ui';\n\nimport { validateInterval } from './validation';\n\ninterface Props {\n value: string;\n onChange: (val: string) => void;\n isInvalidError: string;\n placeholder?: string;\n width?: number;\n ariaLabel?: string;\n label?: string;\n tooltip?: string;\n disabled?: boolean;\n validationRegex?: RegExp;\n}\n\ninterface FieldProps {\n labelWidth: number;\n disabled: boolean;\n invalid: boolean;\n error: string;\n label?: string;\n tooltip?: string;\n}\n\nexport const IntervalInput = (props: Props) => {\n const [intervalIsInvalid, setIntervalIsInvalid] = useState(() => {\n return props.value ? validateInterval(props.value, props.validationRegex) : false;\n });\n\n useDebounce(\n () => {\n setIntervalIsInvalid(validateInterval(props.value, props.validationRegex));\n },\n 500,\n [props.value]\n );\n\n const fieldProps: FieldProps = {\n labelWidth: 26,\n disabled: props.disabled ?? false,\n invalid: intervalIsInvalid,\n error: props.isInvalidError,\n };\n if (props.label) {\n fieldProps.label = props.label;\n fieldProps.tooltip = props.tooltip || '';\n }\n\n return (\n <InlineField {...fieldProps}>\n <Input\n type=\"text\"\n placeholder={props.placeholder || '0'}\n width={props.width || 40}\n onChange={(e) => {\n props.onChange(e.currentTarget.value);\n }}\n value={props.value}\n aria-label={props.ariaLabel || 'interval input'}\n />\n </InlineField>\n );\n};\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { memo } from 'react';\n\nimport { t } from '@grafana/i18n';\nimport { IconButton, Input } from '@grafana/ui';\n\ntype Props = {\n value?: string;\n onChange: (value: string) => void;\n};\n\nconst SearchBarInput = memo(({ value, onChange }: Props) => {\n const clearUiFind = () => {\n onChange('');\n };\n\n const suffix = (\n <>\n {value && value.length && (\n <IconButton\n name=\"times\"\n onClick={clearUiFind}\n tooltip={t('explore.search-bar-input.suffix.tooltip-clear-input', 'Clear input')}\n />\n )}\n </>\n );\n\n return (\n <div style={{ width: '200px' }}>\n <Input\n placeholder={t('explore.search-bar-input.placeholder-find', 'Find...')}\n onChange={(e) => onChange(e.currentTarget.value)}\n suffix={suffix}\n value={value}\n />\n </div>\n );\n});\nSearchBarInput.displayName = 'SearchBarInput';\n\nexport default SearchBarInput;\n","// Copyright (c) 2018 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, cx } from '@emotion/css';\nimport { get, maxBy, values } from 'lodash';\nimport { memo, Dispatch, SetStateAction, useEffect, useCallback } from 'react';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { config, reportInteraction } from '@grafana/runtime';\nimport { Icon, PopoverContent, Tooltip, useTheme2 } from '@grafana/ui';\nimport { getButtonStyles } from '@grafana/ui/internal';\n\nimport { Trace } from '../../types/trace';\n\nexport type NextPrevResultProps = {\n trace: Trace;\n spanFilterMatches: Set<string> | undefined;\n setFocusedSpanIdForSearch: Dispatch<SetStateAction<string>>;\n focusedSpanIndexForSearch: number;\n setFocusedSpanIndexForSearch: Dispatch<SetStateAction<number>>;\n datasourceType: string;\n showSpanFilters: boolean;\n};\n\nexport default memo(function NextPrevResult(props: NextPrevResultProps) {\n const {\n trace,\n spanFilterMatches,\n setFocusedSpanIdForSearch,\n focusedSpanIndexForSearch,\n setFocusedSpanIndexForSearch,\n datasourceType,\n showSpanFilters,\n } = props;\n const styles = getStyles(useTheme2(), showSpanFilters);\n\n useEffect(() => {\n if (spanFilterMatches && focusedSpanIndexForSearch !== -1) {\n const spanMatches = Array.from(spanFilterMatches!);\n setFocusedSpanIdForSearch(spanMatches[focusedSpanIndexForSearch]);\n }\n }, [focusedSpanIndexForSearch, setFocusedSpanIdForSearch, spanFilterMatches]);\n\n const nextResult = (event: React.UIEvent, buttonEnabled: boolean) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (buttonEnabled) {\n reportInteraction('grafana_traces_trace_view_find_next_prev_clicked', {\n datasourceType: datasourceType,\n grafana_version: config.buildInfo.version,\n direction: 'next',\n });\n\n // new query || at end, go to start\n if (\n focusedSpanIndexForSearch === -1 ||\n (spanFilterMatches && focusedSpanIndexForSearch === spanFilterMatches.size - 1)\n ) {\n setFocusedSpanIndexForSearch(0);\n return;\n }\n\n // get next\n setFocusedSpanIndexForSearch(focusedSpanIndexForSearch + 1);\n }\n };\n\n const prevResult = (event: React.UIEvent, buttonEnabled: boolean) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (buttonEnabled) {\n reportInteraction('grafana_traces_trace_view_find_next_prev_clicked', {\n datasourceType: datasourceType,\n grafana_version: config.buildInfo.version,\n direction: 'prev',\n });\n\n // new query || at start, go to end\n if (spanFilterMatches && (focusedSpanIndexForSearch === -1 || focusedSpanIndexForSearch === 0)) {\n setFocusedSpanIndexForSearch(spanFilterMatches.size - 1);\n return;\n }\n\n // get prev\n setFocusedSpanIndexForSearch(focusedSpanIndexForSearch - 1);\n }\n };\n\n const nextResultOnKeyDown = (event: React.KeyboardEvent, buttonEnabled: boolean) => {\n if (event.key === 'Enter') {\n nextResult(event, buttonEnabled);\n }\n };\n\n const prevResultOnKeyDown = (event: React.KeyboardEvent, buttonEnabled: boolean) => {\n if (event.key === 'Enter') {\n prevResult(event, buttonEnabled);\n }\n };\n\n const buttonEnabled = (spanFilterMatches && spanFilterMatches?.size > 0) ?? false;\n const buttonClass = buttonEnabled ? styles.button : cx(styles.button, styles.buttonDisabled);\n\n const getTooltip = useCallback(\n (content: PopoverContent) => {\n return (\n <Tooltip content={content} placement=\"top\">\n <span className={styles.tooltip}>\n <Icon name=\"info-circle\" size=\"md\" />\n </span>\n </Tooltip>\n );\n },\n [styles.tooltip]\n );\n\n const getMatchesMetadata = useCallback(\n (depth: number, services: number) => {\n let metadata = (\n <>\n <span>{`${trace.spans.length} spans`}</span>\n {getTooltip(\n <>\n <div>\n <Trans i18nKey=\"explore.next-prev-result.services\">Services: {{ services }}</Trans>\n </div>\n <div>\n <Trans i18nKey=\"explore.next-prev-result.depth\">Depth: {{ depth }}</Trans>\n </div>\n </>\n )}\n </>\n );\n\n if (spanFilterMatches) {\n if (spanFilterMatches.size === 0) {\n metadata = (\n <>\n <span>\n <Trans i18nKey=\"explore.get-matches-metadata.matches\">0 matches</Trans>\n </span>\n {getTooltip(\n 'There are 0 span matches for the filters selected. Please try removing some of the selected filters.'\n )}\n </>\n );\n } else {\n const type = spanFilterMatches.size === 1 ? 'match' : 'matches';\n const text =\n focusedSpanIndexForSearch !== -1\n ? `${focusedSpanIndexForSearch + 1}/${spanFilterMatches.size} ${type}`\n : `${spanFilterMatches.size} ${type}`;\n\n const matchedServices: string[] = [];\n spanFilterMatches.forEach((spanID) => {\n if (trace.processes[spanID]) {\n matchedServices.push(trace.processes[spanID].serviceName);\n }\n });\n\n metadata = (\n <>\n <span>{text}</span>\n {getTooltip(\n <>\n <div>\n <Trans\n i18nKey=\"explore.next-prev-result.services-span-filter-matches\"\n values={{ total: new Set(matchedServices).size }}\n >\n Services: {'{{total}}'}/{{ services }}\n </Trans>\n </div>\n <div>\n <Trans i18nKey=\"explore.next-prev-result.depth-span-filter-matches\">Depth: {{ depth }}</Trans>\n </div>\n </>\n )}\n </>\n );\n }\n }\n\n return metadata;\n },\n [focusedSpanIndexForSearch, getTooltip, spanFilterMatches, trace.processes, trace.spans]\n );\n\n const services = new Set(values(trace.processes).map((p) => p.serviceName)).size;\n const depth = get(maxBy(trace.spans, 'depth'), 'depth', 0) + 1;\n\n return (\n <>\n <span className={styles.matches}>{getMatchesMetadata(depth, services)}</span>\n <div className={buttonEnabled ? styles.buttons : cx(styles.buttons, styles.buttonsDisabled)}>\n <div\n aria-label={t('explore.next-prev-result.aria-label-prev', 'Prev result button')}\n className={buttonClass}\n onClick={(event) => prevResult(event, buttonEnabled)}\n onKeyDown={(event) => prevResultOnKeyDown(event, buttonEnabled)}\n role=\"button\"\n tabIndex={buttonEnabled ? 0 : -1}\n >\n <Trans i18nKey=\"explore.prev\">Prev</Trans>\n </div>\n <div\n aria-label={t('explore.next-prev-result.aria-label-next', 'Next result button')}\n className={buttonClass}\n onClick={(event) => nextResult(event, buttonEnabled)}\n onKeyDown={(event) => nextResultOnKeyDown(event, buttonEnabled)}\n role=\"button\"\n tabIndex={buttonEnabled ? 0 : -1}\n >\n <Trans i18nKey=\"explore.next\">Next</Trans>\n </div>\n </div>\n </>\n );\n});\n\nexport const getStyles = (theme: GrafanaTheme2, showSpanFilters: boolean) => {\n const buttonStyles = getButtonStyles({\n theme,\n variant: 'secondary',\n size: showSpanFilters ? 'md' : 'sm',\n iconOnly: false,\n fill: 'outline',\n });\n\n return {\n buttons: css({\n display: 'inline-flex',\n gap: '4px',\n }),\n buttonsDisabled: css({\n cursor: 'not-allowed',\n }),\n button: buttonStyles.button,\n buttonDisabled: css(buttonStyles.disabled, { pointerEvents: 'none' }),\n matches: css({\n marginRight: theme.spacing(2),\n textWrap: 'nowrap',\n }),\n tooltip: css({\n color: '#aaa',\n margin: '0 0 0 5px',\n }),\n };\n};\n","// Copyright (c) 2018 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport { memo, Dispatch, SetStateAction, useMemo } from 'react';\n\nimport { GrafanaTheme2, TraceSearchProps } from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { Button, Switch, useStyles2 } from '@grafana/ui';\nimport { getButtonStyles } from '@grafana/ui/internal';\n\nimport { Trace } from '../../types/trace';\nimport { convertTimeFilter } from '../../utils/filter-spans';\n\nimport NextPrevResult from './NextPrevResult';\n\nexport type TracePageSearchBarProps = {\n trace: Trace;\n search: TraceSearchProps;\n spanFilterMatches: Set<string> | undefined;\n setShowSpanFilterMatchesOnly: (showMatchesOnly: boolean) => void;\n setShowCriticalPathSpansOnly: (showCriticalPath: boolean) => void;\n focusedSpanIndexForSearch: number;\n setFocusedSpanIndexForSearch: Dispatch<SetStateAction<number>>;\n setFocusedSpanIdForSearch: Dispatch<SetStateAction<string>>;\n datasourceType: string;\n clear: () => void;\n showSpanFilters: boolean;\n};\n\nexport default memo(function TracePageSearchBar(props: TracePageSearchBarProps) {\n const {\n trace,\n search,\n spanFilterMatches,\n setShowSpanFilterMatchesOnly,\n setShowCriticalPathSpansOnly,\n focusedSpanIndexForSearch,\n setFocusedSpanIndexForSearch,\n setFocusedSpanIdForSearch,\n datasourceType,\n clear,\n showSpanFilters,\n } = props;\n const styles = useStyles2(getStyles);\n\n const clearEnabled = useMemo(() => {\n return (\n (search.serviceName && search.serviceName !== '') ||\n (search.spanName && search.spanName !== '') ||\n convertTimeFilter(search.from || '') ||\n convertTimeFilter(search.to || '') ||\n search.tags.length > 1 ||\n search.tags.some((tag) => {\n return tag.key;\n }) ||\n (search.query && search.query !== '') ||\n search.matchesOnly\n );\n }, [search.serviceName, search.spanName, search.from, search.to, search.tags, search.query, search.matchesOnly]);\n\n return (\n <div className={styles.container}>\n <div className={styles.controls}>\n <>\n <div>\n <Button\n variant=\"destructive\"\n disabled={!clearEnabled}\n type=\"button\"\n fill=\"outline\"\n aria-label={t('explore.trace-page-search-bar.aria-label-clear-filters', 'Clear filters button')}\n onClick={clear}\n >\n <Trans i18nKey=\"explore.clear\">Clear</Trans>\n </Button>\n <div className={styles.matchesOnly}>\n <Switch\n value={search.matchesOnly}\n onChange={(value) => setShowSpanFilterMatchesOnly(value.currentTarget.checked ?? false)}\n label={t('explore.trace-page-search-bar.label-show-matches', 'Show matches only switch')}\n disabled={!spanFilterMatches?.size}\n />\n <Button\n onClick={() => setShowSpanFilterMatchesOnly(!search.matchesOnly)}\n className={styles.clearMatchesButton}\n variant=\"secondary\"\n fill=\"text\"\n disabled={!spanFilterMatches?.size}\n >\n <Trans i18nKey=\"explore.show-matches-only\">Show matches only</Trans>\n </Button>\n </div>\n <div className={styles.matchesOnly}>\n <Switch\n value={search.criticalPathOnly}\n onChange={(value) => setShowCriticalPathSpansOnly(value.currentTarget.checked ?? false)}\n label={t('explore.trace-page-search-bar.label-show-paths', 'Show critical path only switch')}\n />\n <Button\n onClick={() => setShowCriticalPathSpansOnly(!search.criticalPathOnly)}\n className={styles.clearMatchesButton}\n variant=\"secondary\"\n fill=\"text\"\n >\n <Trans i18nKey=\"explore.show-critical-path-only\">Show critical path only</Trans>\n </Button>\n </div>\n </div>\n <div className={styles.nextPrevResult}>\n <NextPrevResult\n trace={trace}\n spanFilterMatches={spanFilterMatches}\n setFocusedSpanIdForSearch={setFocusedSpanIdForSearch}\n focusedSpanIndexForSearch={focusedSpanIndexForSearch}\n setFocusedSpanIndexForSearch={setFocusedSpanIndexForSearch}\n datasourceType={datasourceType}\n showSpanFilters={showSpanFilters}\n />\n </div>\n </>\n </div>\n </div>\n );\n});\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n const buttonStyles = getButtonStyles({ theme, variant: 'secondary', size: 'md', iconOnly: false, fill: 'outline' });\n\n return {\n button: css(buttonStyles.button),\n buttonDisabled: css(buttonStyles.disabled, { pointerEvents: 'none', cursor: 'not-allowed' }),\n container: css({\n display: 'inline',\n }),\n controls: css({\n display: 'flex',\n justifyContent: 'flex-end',\n margin: '5px 0 0 0',\n }),\n matchesOnly: css({\n display: 'inline-flex',\n margin: '0 0 0 25px',\n verticalAlign: 'middle',\n alignItems: 'center',\n }),\n clearMatchesButton: css({\n color: theme.colors.text.primary,\n\n '&:hover': {\n background: 'inherit',\n },\n }),\n nextPrevResult: css({\n marginLeft: 'auto',\n display: 'flex',\n alignItems: 'center',\n }),\n };\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React, { useState, useEffect, memo, useCallback, useRef } from 'react';\n\nimport { GrafanaTheme2, TraceSearchProps, SelectableValue, toOption } from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { IntervalInput } from '@grafana/o11y-ds-frontend';\nimport { Collapse, Icon, InlineField, InlineFieldRow, Select, Stack, Tooltip, useStyles2 } from '@grafana/ui';\n\nimport { DEFAULT_SPAN_FILTERS } from '../../../../state/constants';\nimport { getTraceServiceNames, getTraceSpanNames } from '../../../utils/tags';\nimport SearchBarInput from '../../common/SearchBarInput';\nimport { Trace } from '../../types/trace';\nimport NextPrevResult from '../SearchBar/NextPrevResult';\nimport TracePageSearchBar from '../SearchBar/TracePageSearchBar';\n\nimport { SpanFiltersTags } from './SpanFiltersTags';\n\nexport type SpanFilterProps = {\n trace: Trace;\n search: TraceSearchProps;\n setSearch: (newSearch: TraceSearchProps) => void;\n showSpanFilters: boolean;\n setShowSpanFilters: (isOpen: boolean) => void;\n setFocusedSpanIdForSearch: React.Dispatch<React.SetStateAction<string>>;\n spanFilterMatches: Set<string> | undefined;\n datasourceType: string;\n};\n\nexport const SpanFilters = memo((props: SpanFilterProps) => {\n const {\n trace,\n search,\n setSearch,\n showSpanFilters,\n setShowSpanFilters,\n setFocusedSpanIdForSearch,\n spanFilterMatches,\n datasourceType,\n } = props;\n const styles = { ...useStyles2(getStyles) };\n const [serviceNames, setServiceNames] = useState<Array<SelectableValue<string>>>();\n const [spanNames, setSpanNames] = useState<Array<SelectableValue<string>>>();\n const [focusedSpanIndexForSearch, setFocusedSpanIndexForSearch] = useState(-1);\n const [tagKeys, setTagKeys] = useState<Array<SelectableValue<string>>>();\n const [tagValues, setTagValues] = useState<{ [key: string]: Array<SelectableValue<string>> }>({});\n const prevTraceIdRef = useRef<string>();\n\n const durationRegex = /^\\d+(?:\\.\\d)?\\d*(?:ns|us|µs|ms|s|m|h)$/;\n\n const clear = useCallback(() => {\n setServiceNames(undefined);\n setSpanNames(undefined);\n setTagKeys(undefined);\n setTagValues({});\n setSearch(DEFAULT_SPAN_FILTERS);\n }, [setSearch]);\n\n useEffect(() => {\n // Only clear filters when trace ID actually changes (not on initial mount)\n const currentTraceId = trace?.traceID;\n\n const traceHasChanged = prevTraceIdRef.current && prevTraceIdRef.current !== currentTraceId;\n\n if (traceHasChanged) {\n clear();\n }\n\n prevTraceIdRef.current = currentTraceId;\n }, [clear, trace]);\n\n const setShowSpanFilterMatchesOnly = useCallback(\n (showMatchesOnly: boolean) => {\n setSearch({ ...search, matchesOnly: showMatchesOnly });\n },\n [search, setSearch]\n );\n\n const setShowCriticalPathSpansOnly = useCallback(\n (showCriticalPathSpansOnly: boolean) => {\n setSearch({ ...search, criticalPathOnly: showCriticalPathSpansOnly });\n },\n [search, setSearch]\n );\n\n if (!trace) {\n return null;\n }\n\n const setSpanFiltersSearch = (spanSearch: TraceSearchProps) => {\n setFocusedSpanIndexForSearch(-1);\n setFocusedSpanIdForSearch('');\n setSearch(spanSearch);\n };\n\n const getServiceNames = () => {\n if (!serviceNames) {\n setServiceNames(getTraceServiceNames(trace).map(toOption));\n }\n };\n\n const getSpanNames = () => {\n if (!spanNames) {\n setSpanNames(getTraceSpanNames(trace).map(toOption));\n }\n };\n\n const collapseLabel = (\n <>\n <Tooltip\n content={t(\n 'explore.span-filters.tooltip-collapse',\n 'Filter your spans below. You can continue to apply filters until you have narrowed down your resulting spans to the select few you are most interested in.'\n )}\n placement=\"right\"\n >\n <span className={styles.collapseLabel}>\n <Trans i18nKey=\"explore.span-filters.label-collapse\">Span Filters</Trans>\n <Icon size=\"md\" name=\"info-circle\" />\n </span>\n </Tooltip>\n\n {!showSpanFilters && (\n <div className={styles.nextPrevResult}>\n <NextPrevResult\n trace={trace}\n spanFilterMatches={spanFilterMatches}\n setFocusedSpanIdForSearch={setFocusedSpanIdForSearch}\n focusedSpanIndexForSearch={focusedSpanIndexForSearch}\n setFocusedSpanIndexForSearch={setFocusedSpanIndexForSearch}\n datasourceType={datasourceType}\n showSpanFilters={showSpanFilters}\n />\n </div>\n )}\n </>\n );\n\n return (\n <div className={styles.container}>\n <Collapse label={collapseLabel} isOpen={showSpanFilters} onToggle={setShowSpanFilters}>\n <InlineFieldRow className={styles.flexContainer}>\n <InlineField label={t('explore.span-filters.label-service-name', 'Service name')} labelWidth={16}>\n <Stack gap={0.5}>\n <Select\n aria-label={t(\n 'explore.span-filters.aria-label-select-service-name-operator',\n 'Select service name operator'\n )}\n onChange={(v) => setSpanFiltersSearch({ ...search, serviceNameOperator: v.value! })}\n options={[toOption('='), toOption('!=')]}\n value={search.serviceNameOperator}\n />\n <Select\n aria-label={t('explore.span-filters.aria-label-select-service-name', 'Select service name')}\n isClearable\n onChange={(v) => setSpanFiltersSearch({ ...search, serviceName: v?.value || '' })}\n onOpenMenu={getServiceNames}\n options={serviceNames || (search.serviceName ? [search.serviceName].map(toOption) : [])}\n placeholder={t('explore.span-filters.placeholder-all-service-names', 'All service names')}\n value={search.serviceName || null}\n defaultValue={search.serviceName || null}\n />\n </Stack>\n </InlineField>\n <SearchBarInput\n onChange={(v) => {\n setSpanFiltersSearch({ ...search, query: v, matchesOnly: v !== '' });\n }}\n value={search.query || ''}\n />\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField label={t('explore.span-filters.label-span-name', 'Span name')} labelWidth={16}>\n <Stack gap={0.5}>\n <Select\n aria-label={t('explore.span-filters.aria-label-select-span-name-operator', 'Select span name operator')}\n onChange={(v) => setSpanFiltersSearch({ ...search, spanNameOperator: v.value! })}\n options={[toOption('='), toOption('!=')]}\n value={search.spanNameOperator}\n />\n <Select\n aria-label={t('explore.span-filters.aria-label-select-span-name', 'Select span name')}\n isClearable\n onChange={(v) => setSpanFiltersSearch({ ...search, spanName: v?.value || '' })}\n onOpenMenu={getSpanNames}\n options={spanNames || (search.spanName ? [search.spanName].map(toOption) : [])}\n placeholder={t('explore.span-filters.placeholder-all-span-names', 'All span names')}\n value={search.spanName || null}\n />\n </Stack>\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField\n label={t('explore.span-filters.label-duration', 'Duration')}\n labelWidth={16}\n tooltip={t('explore.span-filters.tooltip-duration', 'Filter by duration. Accepted units are {{units}}', {\n units: 'ns, us, ms, s, m, h',\n })}\n >\n <Stack alignItems=\"flex-start\" gap={0.5}>\n <Select\n aria-label={t('explore.span-filters.aria-label-select-min-span-operator', 'Select min span operator')}\n onChange={(v) => setSpanFiltersSearch({ ...search, fromOperator: v.value! })}\n options={[toOption('>'), toOption('>=')]}\n value={search.fromOperator}\n />\n <div className={styles.intervalInput}>\n <IntervalInput\n ariaLabel={t('explore.span-filters.ariaLabel-select-min-span-duration', 'Select min span duration')}\n onChange={(val) => setSpanFiltersSearch({ ...search, from: val })}\n isInvalidError=\"Invalid duration\"\n // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n placeholder=\"e.g. 100ms, 1.2s\"\n width={18}\n value={search.from || ''}\n validationRegex={durationRegex}\n />\n </div>\n <Select\n aria-label={t('explore.span-filters.aria-label-select-max-span-operator', 'Select max span operator')}\n onChange={(v) => setSpanFiltersSearch({ ...search, toOperator: v.value! })}\n options={[toOption('<'), toOption('<=')]}\n value={search.toOperator}\n />\n <IntervalInput\n ariaLabel={t('explore.span-filters.ariaLabel-select-max-span-duration', 'Select max span duration')}\n onChange={(val) => setSpanFiltersSearch({ ...search, to: val })}\n isInvalidError=\"Invalid duration\"\n // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n placeholder=\"e.g. 100ms, 1.2s\"\n width={18}\n value={search.to || ''}\n validationRegex={durationRegex}\n />\n </Stack>\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow className={styles.tagsRow}>\n <InlineField\n label={t('explore.span-filters.label-tags', 'Tags')}\n labelWidth={16}\n tooltip={t(\n 'explore.span-filters.tooltip-tags',\n 'Filter by tags, process tags or log fields in your spans.'\n )}\n >\n <SpanFiltersTags\n search={search}\n setSearch={setSpanFiltersSearch}\n trace={trace}\n tagKeys={tagKeys}\n setTagKeys={setTagKeys}\n tagValues={tagValues}\n setTagValues={setTagValues}\n />\n </InlineField>\n </InlineFieldRow>\n\n <TracePageSearchBar\n trace={trace}\n search={search}\n spanFilterMatches={spanFilterMatches}\n setShowSpanFilterMatchesOnly={setShowSpanFilterMatchesOnly}\n setShowCriticalPathSpansOnly={setShowCriticalPathSpansOnly}\n setFocusedSpanIdForSearch={setFocusedSpanIdForSearch}\n focusedSpanIndexForSearch={focusedSpanIndexForSearch}\n setFocusedSpanIndexForSearch={setFocusedSpanIndexForSearch}\n datasourceType={datasourceType}\n clear={clear}\n showSpanFilters={showSpanFilters}\n />\n </Collapse>\n </div>\n );\n});\n\nSpanFilters.displayName = 'SpanFilters';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css({\n label: 'SpanFilters',\n margin: `0.5em 0 -${theme.spacing(1)} 0`,\n zIndex: 5,\n\n '& > div': {\n borderLeft: 'none',\n borderRight: 'none',\n },\n }),\n collapseLabel: css({\n svg: {\n color: '#aaa',\n margin: '-2px 0 0 10px',\n },\n }),\n flexContainer: css({\n display: 'flex',\n justifyContent: 'space-between',\n }),\n intervalInput: css({\n margin: '0 -4px 0 0',\n }),\n tagsRow: css({\n margin: '-4px 0 0 0',\n }),\n nextPrevResult: css({\n flex: 1,\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'flex-end',\n marginRight: theme.spacing(1),\n }),\n});\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, cx } from '@emotion/css';\nimport { memo, useEffect, useMemo, useState } from 'react';\nimport * as React from 'react';\n\nimport {\n CoreApp,\n TraceSearchProps,\n DataFrame,\n dateTimeFormat,\n dateTimeFormatTimeAgo,\n GrafanaTheme2,\n PluginExtensionPoints,\n} from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { reportInteraction, renderLimitedComponents, usePluginComponents, usePluginLinks } from '@grafana/runtime';\nimport { TimeZone } from '@grafana/schema';\nimport {\n Badge,\n BadgeColor,\n Button,\n ButtonGroup,\n Dropdown,\n Icon,\n LinkButton,\n Menu,\n Tooltip,\n useStyles2,\n useTheme2,\n} from '@grafana/ui';\nimport { useAppNotification } from 'app/core/copy/appNotification';\n\nimport { config } from '../../../../../core/config';\nimport { downloadTraceAsJson } from '../../../../inspector/utils/download';\nimport { getHeaderTags, getTraceName } from '../model/trace-viewer';\nimport { Trace, TraceViewPluginExtensionContext } from '../types/trace';\nimport { formatDuration } from '../utils/date';\n\nimport { SpanFilters } from './SpanFilters/SpanFilters';\n\nexport type TracePageHeaderProps = {\n trace: Trace | null;\n data: DataFrame;\n app?: CoreApp;\n timeZone: TimeZone;\n search: TraceSearchProps;\n setSearch: (newSearch: TraceSearchProps) => void;\n showSpanFilters: boolean;\n setShowSpanFilters: (isOpen: boolean) => void;\n setFocusedSpanIdForSearch: React.Dispatch<React.SetStateAction<string>>;\n spanFilterMatches: Set<string> | undefined;\n datasourceType: string;\n datasourceName: string;\n datasourceUid: string;\n setHeaderHeight: (height: number) => void;\n};\n\nexport const TracePageHeader = memo((props: TracePageHeaderProps) => {\n const {\n trace,\n data,\n app,\n timeZone,\n search,\n setSearch,\n showSpanFilters,\n setShowSpanFilters,\n setFocusedSpanIdForSearch,\n spanFilterMatches,\n datasourceType,\n datasourceName,\n datasourceUid,\n setHeaderHeight,\n } = props;\n\n const styles = useStyles2(getStyles);\n const theme = useTheme2();\n const notifyApp = useAppNotification();\n const [copyTraceIdClicked, setCopyTraceIdClicked] = useState(false);\n\n useEffect(() => {\n setHeaderHeight(document.querySelector('.' + styles.header)?.scrollHeight ?? 0);\n }, [setHeaderHeight, showSpanFilters, styles.header]);\n\n // Build context for plugin extensions if trace is available\n const traceContext: TraceViewPluginExtensionContext | undefined = trace\n ? {\n ...trace,\n datasource: {\n name: datasourceName,\n uid: datasourceUid,\n type: datasourceType,\n },\n }\n : undefined;\n\n const { links: extensionLinks } = usePluginLinks({\n extensionPointId: PluginExtensionPoints.TraceViewHeaderActions,\n context: traceContext,\n limitPerPlugin: 2,\n });\n\n const { components: extensionComponents } = usePluginComponents<TraceViewPluginExtensionContext>({\n extensionPointId: PluginExtensionPoints.TraceViewHeaderActions,\n });\n\n if (!trace) {\n return null;\n }\n\n const { method, status, url } = getHeaderTags(trace.spans);\n const traceName = getTraceName(trace.spans);\n\n // Convert date from micro to milli seconds\n const formattedTimestamp = dateTimeFormat(trace.startTime / 1000, { timeZone, defaultWithMS: true });\n\n // Memoize service count to avoid recomputing on every render\n const serviceCount = useMemo(() => {\n return new Set(trace.spans.map((span) => span.process?.serviceName)).size;\n }, [trace.spans]);\n\n let statusColor: BadgeColor = 'green';\n if (status && status.length > 0) {\n if (status[0].value.toString().charAt(0) === '4') {\n statusColor = 'orange';\n } else if (status[0].value.toString().charAt(0) === '5') {\n statusColor = 'red';\n }\n }\n\n const copyTraceId = () => {\n navigator.clipboard.writeText(trace.traceID);\n setCopyTraceIdClicked(true);\n setTimeout(() => {\n setCopyTraceIdClicked(false);\n }, 5000);\n };\n\n const exportTrace = () => {\n const traceFormat = downloadTraceAsJson(data, 'Trace-' + trace.traceID.substring(trace.traceID.length - 6));\n reportInteraction('grafana_traces_download_traces_clicked', {\n app,\n grafana_version: config.buildInfo.version,\n trace_format: traceFormat,\n location: 'trace-view',\n });\n };\n\n const shareDropdownMenu = (\n <Menu>\n <Menu.Item\n label={t('explore.trace-page-header.share-copy-link', 'Copy link')}\n icon=\"link\"\n onClick={() => {\n navigator.clipboard.writeText(window.location.href);\n notifyApp.success(t('explore.trace-page-header.link-copied', 'Link copied to clipboard'));\n }}\n />\n <Menu.Item\n label={t('explore.trace-page-header.share-export-json', 'Export as JSON')}\n icon=\"download-alt\"\n onClick={() => {\n exportTrace();\n notifyApp.success(t('explore.trace-page-header.export-started', 'Export started'));\n }}\n />\n </Menu>\n );\n\n return (\n <header className={styles.header}>\n {/* Main title row */}\n <div className={styles.titleRow}>\n <div className={styles.titleSection}>\n <h1 className={styles.title}>{traceName}</h1>\n <div className={styles.badges}>\n {method && method.length > 0 && <Badge text={method[0].value} color=\"blue\" />}\n {status && status.length > 0 && <Badge text={status[0].value} color={statusColor} />}\n </div>\n </div>\n\n {/* Action buttons */}\n <div className={styles.actions}>\n {/* Plugin extension actions */}\n {extensionLinks.length > 0 && (\n <div className={styles.actions}>\n {extensionLinks.map((link) => (\n <Tooltip key={link.id} content={link.description || link.title}>\n <Button\n size=\"sm\"\n variant=\"primary\"\n fill=\"outline\"\n icon={link.icon}\n onClick={(event) => {\n if (link.path) {\n window.open(link.path, '_blank');\n }\n link.onClick?.(event);\n }}\n >\n {link.title}\n </Button>\n </Tooltip>\n ))}\n </div>\n )}\n\n <div className={styles.actions}>\n {traceContext\n ? renderLimitedComponents<TraceViewPluginExtensionContext>({\n props: traceContext,\n components: extensionComponents,\n limit: 2,\n })\n : null}\n </div>\n\n {config.feedbackLinksEnabled && (\n <Tooltip\n content={t(\n 'explore.trace-page-header.title-share-thoughts-about-tracing-grafana',\n 'Share your thoughts about tracing in Grafana.'\n )}\n >\n <LinkButton\n size=\"sm\"\n variant=\"secondary\"\n fill=\"outline\"\n icon=\"comment-alt-message\"\n href=\"https://forms.gle/RZDEx8ScyZNguDoC8\"\n target=\"_blank\"\n >\n <Trans i18nKey=\"explore.trace-page-header.give-feedback\">Feedback</Trans>\n </LinkButton>\n </Tooltip>\n )}\n\n <ButtonGroup>\n <Tooltip content={t('explore.trace-page-header.share-tooltip', 'Share trace')}>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n fill=\"outline\"\n icon=\"share-alt\"\n onClick={() => {\n navigator.clipboard.writeText(window.location.href);\n notifyApp.success(t('explore.trace-page-header.link-copied', 'Link copied to clipboard'));\n }}\n >\n {t('explore.trace-page-header.share', 'Share')}\n </Button>\n </Tooltip>\n\n <Dropdown overlay={shareDropdownMenu} placement=\"bottom-end\">\n <Button\n aria-label={t('explore.trace-page-header.aria-label-share-dropdown', 'Open share trace options menu')}\n size=\"sm\"\n variant=\"secondary\"\n fill=\"outline\"\n icon=\"angle-down\"\n />\n </Dropdown>\n </ButtonGroup>\n </div>\n </div>\n\n {/* Metadata row */}\n <div className={styles.metadataRow}>\n <div className={styles.metadataItem}>\n <span className={styles.metadataLabel}>{t('explore.trace-page-header.trace-id', 'Trace ID')}</span>\n <span className={styles.metadataValue}>\n <button className={styles.traceIdButton} onClick={copyTraceId}>\n {trace.traceID}\n <Icon name={copyTraceIdClicked ? 'check' : 'copy'} size=\"sm\" className={styles.copyIcon} />\n </button>\n </span>\n </div>\n\n <div className={styles.metadataItem}>\n <span className={styles.metadataLabel}>{t('explore.trace-page-header.start-time', 'Start time')}</span>\n <span\n className={cx(\n styles.metadataValue,\n css({\n gap: theme.spacing(0.5),\n })\n )}\n >\n <span>{formattedTimestamp}</span>\n <span className={styles.timestampDetail}>({dateTimeFormatTimeAgo(trace.startTime / 1000)})</span>\n </span>\n </div>\n\n <div className={styles.metadataItem}>\n <span className={styles.metadataLabel}>{t('explore.trace-page-header.duration', 'Duration')}</span>\n <span className={styles.metadataValue}>{formatDuration(trace.duration)}</span>\n </div>\n\n <div className={styles.metadataItem}>\n <span className={styles.metadataLabel}>{t('explore.trace-page-header.services', 'Services')}</span>\n <span className={styles.metadataValue}>{serviceCount}</span>\n </div>\n\n {url && url.length > 0 && (\n <div className={styles.metadataItem}>\n <span className={styles.metadataLabel}>\n {url[0].key === 'http.route' && t('explore.trace-page-header.route', 'Route')}\n {url[0].key === 'http.url' && t('explore.trace-page-header.url', 'URL')}\n {url[0].key === 'http.target' && t('explore.trace-page-header.target', 'Target')}\n {url[0].key === 'http.path' && t('explore.trace-page-header.path', 'Path')}\n </span>\n <span className={styles.metadataValue}>\n <Tooltip\n content={\n <div>\n <div>\n <Trans\n i18nKey=\"explore.trace-page-header.tooltip-url\"\n values={{\n route: 'http.route',\n url: 'http.url',\n target: 'http.target',\n path: 'http.path',\n }}\n >\n {'{{route}}'} or {'{{url}}'} or {'{{target}}'} or {'{{path}}'}\n </Trans>\n </div>\n <div>({url[0].value})</div>\n </div>\n }\n interactive={true}\n >\n <span className={styles.url}>{url[0].value}</span>\n </Tooltip>\n </span>\n </div>\n )}\n </div>\n\n <SpanFilters\n trace={trace}\n showSpanFilters={showSpanFilters}\n setShowSpanFilters={setShowSpanFilters}\n search={search}\n setSearch={setSearch}\n spanFilterMatches={spanFilterMatches}\n setFocusedSpanIdForSearch={setFocusedSpanIdForSearch}\n datasourceType={datasourceType}\n />\n </header>\n );\n});\n\nTracePageHeader.displayName = 'TracePageHeader';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n header: css({\n label: 'TracePageHeader',\n backgroundColor: theme.colors.background.primary,\n padding: '0.5em',\n position: 'sticky',\n top: 0,\n zIndex: 5,\n textAlign: 'left',\n }),\n\n titleRow: css({\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n marginBottom: theme.spacing(1),\n gap: theme.spacing(2),\n }),\n\n titleSection: css({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(2),\n flex: 1,\n minWidth: 0, // Allow text truncation\n }),\n\n title: css({\n color: theme.colors.text.primary,\n fontSize: theme.typography.h3.fontSize,\n fontWeight: theme.typography.h3.fontWeight,\n lineHeight: theme.typography.h3.lineHeight,\n margin: 0,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n\n badges: css({\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n flexShrink: 0,\n }),\n\n actions: css({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n flexShrink: 0,\n }),\n\n metadataRow: css({\n display: 'flex',\n alignItems: 'center',\n columnGap: theme.spacing(3),\n marginBottom: theme.spacing(1),\n fontSize: theme.typography.bodySmall.fontSize,\n color: theme.colors.text.secondary,\n flexWrap: 'wrap',\n }),\n\n metadataItem: css({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n }),\n\n metadataLabel: css({\n fontWeight: theme.typography.fontWeightMedium,\n color: theme.colors.text.secondary,\n }),\n\n metadataValue: css({\n color: theme.colors.text.primary,\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n }),\n\n traceIdButton: css({\n background: 'none',\n border: 'none',\n color: theme.colors.text.primary,\n cursor: 'pointer',\n textDecoration: 'underline',\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n padding: 0,\n font: 'inherit',\n\n '&:hover': {\n color: theme.colors.emphasize(theme.colors.text.primary, 0.15),\n },\n }),\n\n copyIcon: css({\n opacity: 0.7,\n }),\n\n copiedText: css({\n color: theme.colors.success.text,\n fontSize: theme.typography.bodySmall.fontSize,\n fontWeight: theme.typography.fontWeightMedium,\n }),\n\n timestampDetail: css({\n color: theme.colors.text.disabled,\n }),\n\n url: css({\n maxWidth: '700px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n display: 'inline-block',\n color: theme.colors.text.primary,\n }),\n };\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nconst keyboardMappings: Record<string, { binding: string | string[]; label: string }> = {\n scrollPageDown: { binding: 's', label: 'Scroll down' },\n scrollPageUp: { binding: 'w', label: 'Scroll up' },\n scrollToNextVisibleSpan: { binding: 'f', label: 'Scroll to the next visible span' },\n scrollToPrevVisibleSpan: { binding: 'b', label: 'Scroll to the previous visible span' },\n panLeft: { binding: ['a', 'left'], label: 'Pan left' },\n panLeftFast: { binding: ['shift+a', 'shift+left'], label: 'Pan left — Large' },\n panRight: { binding: ['d', 'right'], label: 'Pan right' },\n panRightFast: { binding: ['shift+d', 'shift+right'], label: 'Pan right — Large' },\n zoomIn: { binding: 'up', label: 'Zoom in' },\n zoomInFast: { binding: 'shift+up', label: 'Zoom in — Large' },\n zoomOut: { binding: 'down', label: 'Zoom out' },\n zoomOutFast: { binding: 'shift+down', label: 'Zoom out — Large' },\n collapseAll: { binding: ']', label: 'Collapse All' },\n expandAll: { binding: '[', label: 'Expand All' },\n collapseOne: { binding: 'p', label: 'Collapse One Level' },\n expandOne: { binding: 'o', label: 'Expand One Level' },\n searchSpans: { binding: 'ctrl+b', label: 'Search Spans' },\n clearSearch: { binding: 'escape', label: 'Clear Search' },\n};\n\nexport default keyboardMappings;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport Combokeys from 'combokeys';\nimport * as React from 'react';\n\nimport keyboardMappings from './keyboard-mappings';\n\nexport type CombokeysHandler =\n | (() => void)\n | ((event: React.KeyboardEvent) => void)\n | ((event: React.KeyboardEvent, s: string) => void);\n\nexport type ShortcutCallbacks = {\n [name: string]: CombokeysHandler;\n};\n\nlet instance: Combokeys | undefined;\n\nfunction getInstance(): Combokeys {\n if (instance) {\n return instance;\n }\n const local = new Combokeys(document.body);\n instance = local;\n return local;\n}\n\nexport function merge(callbacks: ShortcutCallbacks) {\n const inst = getInstance();\n Object.keys(callbacks).forEach((name) => {\n const keysHandler = callbacks[name];\n if (keysHandler) {\n inst.bind(keyboardMappings[name].binding, keysHandler);\n }\n });\n}\n\nexport function reset() {\n const combokeys = getInstance();\n combokeys.reset();\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport TNil from '../types/TNil';\nimport { formatDuration } from '../utils/date';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n Ticks: css({\n label: 'Ticks',\n pointerEvents: 'none',\n }),\n TicksTick: css({\n label: 'TicksTick',\n position: 'absolute',\n height: '100%',\n width: '1px',\n background: autoColor(theme, '#d8d8d8'),\n '&:last-child': {\n width: 0,\n },\n }),\n TicksTickLabel: css({\n label: 'TicksTickLabel',\n left: '0.25rem',\n position: 'absolute',\n whiteSpace: 'nowrap',\n }),\n TicksTickLabelEndAnchor: css({\n label: 'TicksTickLabelEndAnchor',\n left: 'initial',\n right: '0.25rem',\n }),\n});\n\ntype TicksProps = {\n endTime?: number | TNil;\n numTicks: number;\n showLabels?: boolean | TNil;\n startTime?: number | TNil;\n};\n\nexport default function Ticks({ endTime = null, numTicks, showLabels = null, startTime = null }: TicksProps) {\n let labels: undefined | string[];\n if (showLabels) {\n labels = [];\n const viewingDuration = (endTime || 0) - (startTime || 0);\n for (let i = 0; i < numTicks; i++) {\n const durationAtTick = (startTime || 0) + (i / (numTicks - 1)) * viewingDuration;\n labels.push(formatDuration(durationAtTick));\n }\n }\n const styles = useStyles2(getStyles);\n const ticks: React.ReactNode[] = [];\n for (let i = 0; i < numTicks; i++) {\n const portion = i / (numTicks - 1);\n ticks.push(\n <div\n data-testid=\"TicksID\"\n key={portion}\n className={styles.TicksTick}\n style={{\n left: `${portion * 100}%`,\n }}\n >\n {labels && (\n <span className={cx(styles.TicksTickLabel, { [styles.TicksTickLabelEndAnchor]: portion >= 1 })}>\n {labels[i]}\n </span>\n )}\n </div>\n );\n }\n return <div className={styles.Ticks}>{ticks}</div>;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n return {\n row: css({\n display: 'flex',\n flex: '0 1 auto',\n flexDirection: 'row',\n }),\n rowCell: css({\n position: 'relative',\n }),\n };\n};\n\ntype TTimelineRowProps = {\n children: React.ReactNode;\n className?: string;\n};\n\ninterface TimelineRowCellProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n width: number;\n style?: {};\n}\n\nexport default function TimelineRow({ children, className = '', ...rest }: TTimelineRowProps) {\n const styles = useStyles2(getStyles);\n return (\n <div className={cx(styles.row, className)} {...rest}>\n {children}\n </div>\n );\n}\n\nexport function TimelineRowCell({ children, className = '', width, style = {}, ...rest }: TimelineRowCellProps) {\n const widthPercent = `${width * 100}%`;\n const mergedStyle = { ...style, flexBasis: widthPercent, maxWidth: widthPercent };\n const styles = useStyles2(getStyles);\n return (\n <div className={cx(styles.rowCell, className)} style={mergedStyle} data-testid=\"TimelineRowCell\" {...rest}>\n {children}\n </div>\n );\n}\n\nTimelineRow.Cell = TimelineRowCell;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { Button, useStyles2 } from '@grafana/ui';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n TimelineCollapser: css({\n alignItems: 'center',\n display: 'flex',\n flex: 'none',\n justifyContent: 'center',\n marginRight: '0.5rem',\n }),\n buttonsContainer: css({\n display: 'flex',\n flexDirection: 'row',\n gap: '0.5rem',\n paddingRight: theme.spacing(1),\n }),\n buttonContainer: css({\n display: 'flex',\n alignItems: 'center',\n }),\n});\n\ntype CollapserProps = {\n onCollapseAll: () => void;\n onCollapseOne: () => void;\n onExpandOne: () => void;\n onExpandAll: () => void;\n};\n\nexport function TimelineCollapser(props: CollapserProps) {\n const { onExpandAll, onExpandOne, onCollapseAll, onCollapseOne } = props;\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.TimelineCollapser} data-testid=\"TimelineCollapser\">\n <div className={styles.buttonsContainer}>\n <div className={styles.buttonContainer}>\n <Button\n aria-label={t('explore.timeline-collapser.tooltip-expand', 'Expand +1')}\n tooltip={t('explore.timeline-collapser.tooltip-expand', 'Expand +1')}\n size=\"sm\"\n tooltipPlacement=\"top\"\n icon=\"angle-down\"\n onClick={onExpandOne}\n fill=\"solid\"\n variant=\"secondary\"\n />\n <Button\n aria-label={t('explore.timeline-collapser.tooltip-collapse', 'Collapse +1')}\n tooltip={t('explore.timeline-collapser.tooltip-collapse', 'Collapse +1')}\n size=\"sm\"\n tooltipPlacement=\"top\"\n icon=\"angle-up\"\n onClick={onCollapseOne}\n fill=\"solid\"\n variant=\"secondary\"\n />\n </div>\n <div className={styles.buttonContainer}>\n <Button\n aria-label={t('explore.timeline-collapser.tooltip-expand-all', 'Expand all')}\n tooltip={t('explore.timeline-collapser.tooltip-expand-all', 'Expand all')}\n size=\"sm\"\n tooltipPlacement=\"top\"\n icon=\"angle-double-down\"\n onClick={onExpandAll}\n fill=\"solid\"\n variant=\"secondary\"\n />\n <Button\n aria-label={t('explore.timeline-collapser.tooltip-collapse-all', 'Collapse all')}\n tooltip={t('explore.timeline-collapser.tooltip-collapse-all', 'Collapse all')}\n size=\"sm\"\n tooltipPlacement=\"top\"\n icon=\"angle-double-up\"\n onClick={onCollapseAll}\n fill=\"solid\"\n variant=\"secondary\"\n />\n </div>\n </div>\n </div>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport TNil from '../../types/TNil';\nimport DraggableManager from '../../utils/DraggableManager/DraggableManager';\nimport { DraggableBounds, DraggingUpdate } from '../../utils/DraggableManager/types';\n\nexport const getStyles = () => ({\n TimelineColumnResizer: css({\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n }),\n wrapper: css({\n bottom: 0,\n position: 'absolute',\n top: 0,\n }),\n dragger: css({\n borderLeft: '2px solid transparent',\n cursor: 'col-resize',\n height: '5000px',\n marginLeft: '-1px',\n position: 'absolute',\n top: 0,\n width: '1px',\n zIndex: 10,\n '&:hover': {\n borderLeft: '2px solid rgba(0, 0, 0, 0.3)',\n },\n '&::before': {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: '-8px',\n right: 0,\n content: '\" \"',\n },\n }),\n draggerDragging: css({\n background: 'rgba(136, 0, 136, 0.05)',\n width: 'unset',\n '&::before': {\n left: -2000,\n right: -2000,\n },\n }),\n draggerDraggingLeft: css({\n borderLeft: '2px solid #808',\n borderRight: '1px solid #999',\n }),\n draggerDraggingRight: css({\n borderLeft: '1px solid #999',\n borderRight: '2px solid #808',\n }),\n gripIcon: css({\n position: 'absolute',\n top: 0,\n bottom: 0,\n '&::before, &::after': {\n borderRight: '1px solid #ccc',\n content: '\" \"',\n height: '9px',\n position: 'absolute',\n right: '9px',\n top: '25px',\n },\n '&::after': {\n right: '5px',\n },\n }),\n gripIconDragging: css({\n '&::before, &::after': {\n borderRight: '1px solid rgba(136, 0, 136, 0.5)',\n },\n }),\n});\n\nexport type TimelineColumnResizerProps = {\n min: number;\n max: number;\n onChange: (newSize: number) => void;\n position: number;\n columnResizeHandleHeight: number;\n};\n\ntype TimelineColumnResizerState = {\n dragPosition: number | TNil;\n};\n\nexport default class TimelineColumnResizer extends React.PureComponent<\n TimelineColumnResizerProps,\n TimelineColumnResizerState\n> {\n state: TimelineColumnResizerState;\n\n _dragManager: DraggableManager;\n _rootElm: Element | TNil;\n\n constructor(props: TimelineColumnResizerProps) {\n super(props);\n this._dragManager = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleDragEnd,\n onDragMove: this._handleDragUpdate,\n onDragStart: this._handleDragUpdate,\n });\n this._rootElm = undefined;\n this.state = {\n dragPosition: null,\n };\n }\n\n componentWillUnmount() {\n this._dragManager.dispose();\n }\n\n _setRootElm = (elm: Element | TNil) => {\n this._rootElm = elm;\n };\n\n _getDraggingBounds = (): DraggableBounds => {\n if (!this._rootElm) {\n throw new Error('invalid state');\n }\n const { left: clientXLeft, width } = this._rootElm.getBoundingClientRect();\n const { min, max } = this.props;\n return {\n clientXLeft,\n width,\n maxValue: max,\n minValue: min,\n };\n };\n\n _handleDragUpdate = ({ value }: DraggingUpdate) => {\n this.setState({ dragPosition: value });\n };\n\n _handleDragEnd = ({ manager, value }: DraggingUpdate) => {\n manager.resetBounds();\n this.setState({ dragPosition: null });\n this.props.onChange(value);\n };\n\n render() {\n let left;\n let draggerStyle: React.CSSProperties;\n const { position, columnResizeHandleHeight } = this.props;\n const { dragPosition } = this.state;\n left = `${position * 100}%`;\n const gripStyle = { left };\n let isDraggingLeft = false;\n let isDraggingRight = false;\n const styles = getStyles();\n\n if (this._dragManager.isDragging() && this._rootElm && dragPosition != null) {\n isDraggingLeft = dragPosition < position;\n isDraggingRight = dragPosition > position;\n // Draw a highlight from the current dragged position back to the original\n // position, e.g. highlight the change. Draw the highlight via `left` and\n // `right` css styles (simpler than using `width`).\n const draggerLeft = `${Math.min(position, dragPosition) * 100}%`;\n // subtract 1px for draggerRight to deal with the right border being off\n // by 1px when dragging left\n const draggerRight = `calc(${(1 - Math.max(position, dragPosition)) * 100}% - 1px)`;\n draggerStyle = { left: draggerLeft, right: draggerRight };\n } else {\n draggerStyle = gripStyle;\n }\n draggerStyle.height = columnResizeHandleHeight;\n\n const isDragging = isDraggingLeft || isDraggingRight;\n return (\n <div className={styles.TimelineColumnResizer} ref={this._setRootElm} data-testid=\"TimelineColumnResizer\">\n <div\n className={cx(styles.gripIcon, isDragging && styles.gripIconDragging)}\n style={gripStyle}\n data-testid=\"TimelineColumnResizer--gripIcon\"\n />\n <div\n aria-hidden\n className={cx(\n styles.dragger,\n isDragging && styles.draggerDragging,\n isDraggingRight && styles.draggerDraggingRight,\n isDraggingLeft && styles.draggerDraggingLeft\n )}\n onMouseDown={this._dragManager.handleMouseDown}\n style={draggerStyle}\n data-testid=\"TimelineColumnResizer--dragger\"\n />\n </div>\n );\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, cx } from '@emotion/css';\nimport * as React from 'react';\n\nimport { stylesFactory } from '@grafana/ui';\n\nimport TNil from '../../types/TNil';\nimport DraggableManager from '../../utils/DraggableManager/DraggableManager';\nimport { DraggableBounds, DraggingUpdate } from '../../utils/DraggableManager/types';\nimport { TUpdateViewRangeTimeFunction, ViewRangeTime, ViewRangeTimeUpdate } from '../types';\n\n// exported for testing\nexport const getStyles = stylesFactory(() => {\n return {\n TimelineViewingLayer: css({\n label: 'TimelineViewingLayer',\n bottom: 0,\n cursor: 'vertical-text',\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n }),\n TimelineViewingLayerCursorGuide: css({\n label: 'TimelineViewingLayerCursorGuide',\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '1px',\n backgroundColor: 'red',\n }),\n TimelineViewingLayerDragged: css({\n label: 'TimelineViewingLayerDragged',\n position: 'absolute',\n top: 0,\n bottom: 0,\n }),\n TimelineViewingLayerDraggedDraggingLeft: css({\n label: 'TimelineViewingLayerDraggedDraggingLeft',\n borderLeft: '1px solid',\n }),\n TimelineViewingLayerDraggedDraggingRight: css({\n label: 'TimelineViewingLayerDraggedDraggingRight',\n borderRight: '1px solid',\n }),\n TimelineViewingLayerDraggedShiftDrag: css({\n label: 'TimelineViewingLayerDraggedShiftDrag',\n backgroundColor: 'rgba(68, 68, 255, 0.2)',\n borderColor: '#44f',\n }),\n TimelineViewingLayerDraggedReframeDrag: css({\n label: 'TimelineViewingLayerDraggedReframeDrag',\n backgroundColor: 'rgba(255, 68, 68, 0.2)',\n borderColor: '#f44',\n }),\n TimelineViewingLayerFullOverlay: css({\n label: 'TimelineViewingLayerFullOverlay',\n bottom: 0,\n cursor: 'col-resize',\n left: 0,\n position: 'fixed',\n right: 0,\n top: 0,\n userSelect: 'none',\n }),\n };\n});\n\nexport type TimelineViewingLayerProps = {\n /**\n * `boundsInvalidator` is an arbitrary prop that lets the component know the\n * bounds for dragging need to be recalculated. In practice, the name column\n * width serves fine for this.\n */\n boundsInvalidator: number | null | undefined;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n viewRangeTime: ViewRangeTime;\n};\n\ntype TDraggingLeftLayout = {\n isDraggingLeft: boolean;\n left: string;\n width: string;\n};\n\ntype TOutOfViewLayout = {\n isOutOfView: true;\n};\n\nfunction isOutOfView(layout: TDraggingLeftLayout | TOutOfViewLayout): layout is TOutOfViewLayout {\n return Reflect.has(layout, 'isOutOfView');\n}\n\n/**\n * Map from a sub range to the greater view range, e.g, when the view range is\n * the middle half ([0.25, 0.75]), a value of 0.25 befomes 3/8.\n * @returns {number}\n */\nfunction mapFromViewSubRange(viewStart: number, viewEnd: number, value: number) {\n return viewStart + value * (viewEnd - viewStart);\n}\n\n/**\n * Map a value from the view ([0, 1]) to a sub-range, e.g, when the view range is\n * the middle half ([0.25, 0.75]), a value of 3/8 becomes 1/4.\n * @returns {number}\n */\nfunction mapToViewSubRange(viewStart: number, viewEnd: number, value: number) {\n return (value - viewStart) / (viewEnd - viewStart);\n}\n\n/**\n * Get the layout for the \"next\" view range time, e.g. the difference from the\n * drag start and the drag end. This is driven by `shiftStart`, `shiftEnd` or\n * `reframe` on `props.viewRangeTime`, not by the current state of the\n * component. So, it reflects in-progress dragging from the span minimap.\n */\nfunction getNextViewLayout(start: number, position: number): TDraggingLeftLayout | TOutOfViewLayout {\n let [left, right] = start < position ? [start, position] : [position, start];\n if (left >= 1 || right <= 0) {\n return { isOutOfView: true };\n }\n if (left < 0) {\n left = 0;\n }\n if (right > 1) {\n right = 1;\n }\n return {\n isDraggingLeft: start > position,\n left: `${left * 100}%`,\n width: `${(right - left) * 100}%`,\n };\n}\n\n/**\n * Render the visual indication of the \"next\" view range.\n */\nfunction getMarkers(viewStart: number, viewEnd: number, from: number, to: number, isShift: boolean): React.ReactNode {\n const mappedFrom = mapToViewSubRange(viewStart, viewEnd, from);\n const mappedTo = mapToViewSubRange(viewStart, viewEnd, to);\n const layout = getNextViewLayout(mappedFrom, mappedTo);\n if (isOutOfView(layout)) {\n return null;\n }\n const { isDraggingLeft, left, width } = layout;\n const styles = getStyles();\n const cls = cx({\n [styles.TimelineViewingLayerDraggedDraggingRight]: !isDraggingLeft,\n [styles.TimelineViewingLayerDraggedReframeDrag]: !isShift,\n [styles.TimelineViewingLayerDraggedShiftDrag]: isShift,\n });\n return (\n <div\n className={cx(styles.TimelineViewingLayerDragged, styles.TimelineViewingLayerDraggedDraggingLeft, cls)}\n style={{ left, width }}\n data-testid=\"Dragged\"\n />\n );\n}\n\n/**\n * `TimelineViewingLayer` is rendered on top of the TimelineHeaderRow time\n * labels; it handles showing the current view range and handles mouse UX for\n * modifying it.\n */\nexport default class TimelineViewingLayer extends React.PureComponent<TimelineViewingLayerProps> {\n _draggerReframe: DraggableManager;\n _root: Element | TNil;\n\n constructor(props: TimelineViewingLayerProps) {\n super(props);\n this._draggerReframe = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleReframeDragEnd,\n onDragMove: this._handleReframeDragUpdate,\n onDragStart: this._handleReframeDragUpdate,\n onMouseLeave: this._handleReframeMouseLeave,\n onMouseMove: this._handleReframeMouseMove,\n });\n this._root = undefined;\n }\n\n UNSAFE_componentWillReceiveProps(nextProps: TimelineViewingLayerProps) {\n const { boundsInvalidator } = this.props;\n if (boundsInvalidator !== nextProps.boundsInvalidator) {\n this._draggerReframe.resetBounds();\n }\n }\n\n componentWillUnmount() {\n this._draggerReframe.dispose();\n }\n\n _setRoot = (elm: Element | TNil) => {\n this._root = elm;\n };\n\n _getDraggingBounds = (): DraggableBounds => {\n if (!this._root) {\n throw new Error('invalid state');\n }\n const { left: clientXLeft, width } = this._root.getBoundingClientRect();\n return { clientXLeft, width };\n };\n\n _handleReframeMouseMove = ({ value }: DraggingUpdate) => {\n const [viewStart, viewEnd] = this.props.viewRangeTime.current;\n const cursor = mapFromViewSubRange(viewStart, viewEnd, value);\n this.props.updateNextViewRangeTime({ cursor });\n };\n\n _handleReframeMouseLeave = () => {\n this.props.updateNextViewRangeTime({ cursor: undefined });\n };\n\n _handleReframeDragUpdate = ({ value }: DraggingUpdate) => {\n const { current, reframe } = this.props.viewRangeTime;\n const [viewStart, viewEnd] = current;\n const shift = mapFromViewSubRange(viewStart, viewEnd, value);\n const anchor = reframe ? reframe.anchor : shift;\n const update = { reframe: { anchor, shift } };\n this.props.updateNextViewRangeTime(update);\n };\n\n _handleReframeDragEnd = ({ manager, value }: DraggingUpdate) => {\n const { current, reframe } = this.props.viewRangeTime;\n const [viewStart, viewEnd] = current;\n const shift = mapFromViewSubRange(viewStart, viewEnd, value);\n const anchor = reframe ? reframe.anchor : shift;\n const [start, end] = shift < anchor ? [shift, anchor] : [anchor, shift];\n manager.resetBounds();\n this.props.updateViewRangeTime(start, end, 'timeline-header');\n };\n\n render() {\n const { viewRangeTime } = this.props;\n const { current, cursor, reframe, shiftEnd, shiftStart } = viewRangeTime;\n const [viewStart, viewEnd] = current;\n const haveNextTimeRange = reframe != null || shiftEnd != null || shiftStart != null;\n let cusrorPosition: string | TNil;\n if (!haveNextTimeRange && cursor != null && cursor >= viewStart && cursor <= viewEnd) {\n cusrorPosition = `${mapToViewSubRange(viewStart, viewEnd, cursor) * 100}%`;\n }\n const styles = getStyles();\n return (\n <div\n aria-hidden\n className={styles.TimelineViewingLayer}\n ref={this._setRoot}\n onMouseDown={this._draggerReframe.handleMouseDown}\n onMouseLeave={this._draggerReframe.handleMouseLeave}\n onMouseMove={this._draggerReframe.handleMouseMove}\n data-testid=\"TimelineViewingLayer\"\n >\n {cusrorPosition != null && (\n <div\n className={styles.TimelineViewingLayerCursorGuide}\n style={{ left: cusrorPosition }}\n data-testid=\"TimelineViewingLayer--cursorGuide\"\n />\n )}\n {reframe != null && getMarkers(viewStart, viewEnd, reframe.anchor, reframe.shift, false)}\n {shiftEnd != null && getMarkers(viewStart, viewEnd, viewEnd, shiftEnd, true)}\n {shiftStart != null && getMarkers(viewStart, viewEnd, viewStart, shiftStart, true)}\n </div>\n );\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Trans } from '@grafana/i18n';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport Ticks from '../Ticks';\nimport TimelineRow from '../TimelineRow';\nimport { TUpdateViewRangeTimeFunction, ViewRangeTime, ViewRangeTimeUpdate } from '../types';\n\nimport { TimelineCollapser } from './TimelineCollapser';\nimport TimelineColumnResizer from './TimelineColumnResizer';\nimport TimelineViewingLayer from './TimelineViewingLayer';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n TimelineHeaderRow: css({\n label: 'TimelineHeaderRow',\n background: autoColor(theme, '#ececec'),\n borderBottom: `1px solid ${autoColor(theme, '#ccc')}`,\n height: '38px',\n lineHeight: '38px',\n width: '100%',\n zIndex: 4,\n position: 'relative',\n }),\n TimelineHeaderRowTitle: css({\n label: 'TimelineHeaderRowTitle',\n flex: 1,\n overflow: 'hidden',\n margin: 0,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n TimelineHeaderWrapper: css({\n label: 'TimelineHeaderWrapper',\n alignItems: 'center',\n display: 'flex',\n paddingLeft: theme.spacing(1),\n paddingRight: theme.spacing(1),\n }),\n };\n};\n\nexport type TimelineHeaderRowProps = {\n duration: number;\n nameColumnWidth: number;\n numTicks: number;\n onCollapseAll: () => void;\n onCollapseOne: () => void;\n onColummWidthChange: (width: number) => void;\n onExpandAll: () => void;\n onExpandOne: () => void;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n viewRangeTime: ViewRangeTime;\n columnResizeHandleHeight: number;\n};\n\nexport default function TimelineHeaderRow(props: TimelineHeaderRowProps) {\n const {\n duration,\n nameColumnWidth,\n numTicks,\n onCollapseAll,\n onCollapseOne,\n onColummWidthChange,\n onExpandAll,\n onExpandOne,\n updateViewRangeTime,\n updateNextViewRangeTime,\n viewRangeTime,\n columnResizeHandleHeight,\n } = props;\n const [viewStart, viewEnd] = viewRangeTime.current;\n const styles = useStyles2(getStyles);\n return (\n <TimelineRow className={styles.TimelineHeaderRow} data-testid=\"TimelineHeaderRow\">\n <TimelineRow.Cell className={styles.TimelineHeaderWrapper} width={nameColumnWidth}>\n <h4 className={styles.TimelineHeaderRowTitle}>\n <Trans i18nKey=\"explore.timeline-header-row.title\">Service & Operation</Trans>\n </h4>\n <TimelineCollapser\n onCollapseAll={onCollapseAll}\n onExpandAll={onExpandAll}\n onCollapseOne={onCollapseOne}\n onExpandOne={onExpandOne}\n />\n </TimelineRow.Cell>\n <TimelineRow.Cell width={1 - nameColumnWidth}>\n <TimelineViewingLayer\n boundsInvalidator={nameColumnWidth}\n updateNextViewRangeTime={updateNextViewRangeTime}\n updateViewRangeTime={updateViewRangeTime}\n viewRangeTime={viewRangeTime}\n />\n <Ticks numTicks={numTicks} startTime={viewStart * duration} endTime={viewEnd * duration} showLabels />\n </TimelineRow.Cell>\n <TimelineColumnResizer\n columnResizeHandleHeight={columnResizeHandleHeight}\n position={nameColumnWidth}\n onChange={onColummWidthChange}\n min={0.2}\n max={0.85}\n />\n </TimelineRow>\n );\n}\n","// Copyright (c) 2018 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const PEER_SERVICE = 'peer.service';\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ntype THeightGetter = (index: number) => number;\n\n/**\n * Keeps track of the height and y-position for anything sequenctial where\n * y-positions follow one-after-another and can be derived from the height of\n * the prior entries. The height is known from an accessor function parameter\n * to the methods that require new knowledge the heights.\n *\n * @export\n * @class Positions\n */\nexport default class Positions {\n /**\n * Indicates how far past the explicitly required height or y-values should\n * checked.\n */\n bufferLen: number;\n dataLen: number;\n heights: number[];\n /**\n * `lastI` keeps track of which values have already been visited. In many\n * scenarios, values do not need to be revisited. But, revisiting is required\n * when heights have changed, so `lastI` can be forced.\n */\n lastI: number;\n ys: number[];\n\n constructor(bufferLen: number) {\n this.ys = [];\n this.heights = [];\n this.bufferLen = bufferLen;\n this.dataLen = -1;\n this.lastI = -1;\n }\n\n /**\n * Used to make sure the length of y-values and heights is consistent with\n * the context; in particular `lastI` needs to remain valid.\n */\n profileData(dataLength: number) {\n if (dataLength !== this.dataLen) {\n this.dataLen = dataLength;\n this.ys.length = dataLength;\n this.heights.length = dataLength;\n if (this.lastI >= dataLength) {\n this.lastI = dataLength - 1;\n }\n }\n }\n\n /**\n * Calculate and save the heights and y-values, based on `heightGetter`, from\n * `lastI` until the`max` index; the starting point (`lastI`) can be forced\n * via the `forcedLastI` parameter.\n * @param {number=} forcedLastI\n */\n calcHeights(max: number, heightGetter: THeightGetter, forcedLastI?: number) {\n if (forcedLastI != null) {\n this.lastI = forcedLastI;\n }\n let _max = max + this.bufferLen;\n if (_max <= this.lastI) {\n return;\n }\n if (_max >= this.heights.length) {\n _max = this.heights.length - 1;\n }\n let i = this.lastI;\n if (this.lastI === -1) {\n i = 0;\n this.ys[0] = 0;\n }\n while (i <= _max) {\n // eslint-disable-next-line no-multi-assign\n const h = (this.heights[i] = heightGetter(i));\n this.ys[i + 1] = this.ys[i] + h;\n i++;\n }\n this.lastI = _max;\n }\n\n /**\n * Verify the height and y-values from `lastI` up to `yValue`.\n */\n calcYs(yValue: number, heightGetter: THeightGetter) {\n while ((this.ys[this.lastI] == null || yValue > this.ys[this.lastI]) && this.lastI < this.dataLen - 1) {\n this.calcHeights(this.lastI, heightGetter);\n }\n }\n\n /**\n * Get the latest height for index `_i`. If it's in new terretory\n * (_i > lastI), find the heights (and y-values) leading up to it. If it's in\n * known territory (_i <= lastI) and the height is different than what is\n * known, recalculate subsequent y values, but don't confirm the heights of\n * those items, just update based on the difference.\n */\n confirmHeight(_i: number, heightGetter: THeightGetter) {\n let i = _i;\n if (i > this.lastI) {\n this.calcHeights(i, heightGetter);\n return;\n }\n const h = heightGetter(i);\n if (h === this.heights[i]) {\n return;\n }\n const chg = h - this.heights[i];\n this.heights[i] = h;\n // shift the y positions by `chg` for all known y positions\n while (++i <= this.lastI) {\n this.ys[i] += chg;\n }\n if (this.ys[this.lastI + 1] != null) {\n this.ys[this.lastI + 1] += chg;\n }\n }\n\n /**\n * Given a target y-value (`yValue`), find the closest index (in the `.ys`\n * array) that is prior to the y-value; e.g. map from y-value to index in\n * `.ys`.\n */\n findFloorIndex(yValue: number, heightGetter: THeightGetter): number {\n this.calcYs(yValue, heightGetter);\n\n let imin = 0;\n let imax = this.lastI;\n\n if (this.ys.length < 2 || yValue < this.ys[1]) {\n return 0;\n }\n if (yValue > this.ys[imax]) {\n return imax;\n }\n let i;\n while (imin < imax) {\n // eslint-disable-next-line no-bitwise\n i = (imin + 0.5 * (imax - imin)) | 0;\n if (yValue > this.ys[i]) {\n if (yValue <= this.ys[i + 1]) {\n return i;\n }\n imin = i;\n } else if (yValue < this.ys[i]) {\n if (yValue >= this.ys[i - 1]) {\n return i - 1;\n }\n imax = i;\n } else {\n return i;\n }\n }\n throw new Error(`unable to find floor index for y=${yValue}`);\n }\n\n /**\n * Get the `y` and `height` for a given row.\n *\n * @returns {{ height: number, y: number }}\n */\n getRowPosition(index: number, heightGetter: THeightGetter) {\n this.confirmHeight(index, heightGetter);\n return {\n height: this.heights[index],\n y: this.ys[index],\n };\n }\n\n /**\n * Get the estimated height of the whole shebang by extrapolating based on\n * the average known height.\n */\n getEstimatedHeight(): number {\n const known = this.ys[this.lastI] + this.heights[this.lastI];\n if (this.lastI >= this.dataLen - 1) {\n // eslint-disable-next-line no-bitwise\n return known | 0;\n }\n // eslint-disable-next-line no-bitwise\n return ((known / (this.lastI + 1)) * this.heights.length) | 0;\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport * as React from 'react';\n\nimport TNil from '../../types/TNil';\n\nimport Positions from './Positions';\n\ntype TWrapperProps = {\n style: React.CSSProperties;\n ref: (elm: HTMLDivElement) => void;\n onScroll?: () => void;\n};\n\n/**\n * @typedef\n */\nexport type TListViewProps = {\n /**\n * Number of elements in the list.\n */\n dataLength: number;\n /**\n * Convert item index (number) to the key (string). ListView uses both indexes\n * and keys to handle the addition of new rows.\n */\n getIndexFromKey: (key: string) => number;\n /**\n * Convert item key (string) to the index (number). ListView uses both indexes\n * and keys to handle the addition of new rows.\n */\n getKeyFromIndex: (index: number) => string;\n /**\n * Number of items to draw and add to the DOM, initially.\n */\n initialDraw?: number;\n /**\n * Trigger a redraw of the list view.\n */\n redraw: {};\n /**\n * The parent provides fallback height measurements when there is not a\n * rendered element to measure.\n */\n itemHeightGetter: (index: number, key: string) => number;\n /**\n * Function that renders an item; rendered items are added directly to the\n * DOM, they are not wrapped in list item wrapper HTMLElement.\n */\n // itemRenderer(itemKey, style, i, attrs)\n itemRenderer: (\n itemKey: string,\n style: Record<string, string | number>,\n index: number,\n attributes: Record<string, string>\n ) => React.ReactNode;\n /**\n * `className` for the HTMLElement that holds the items.\n */\n itemsWrapperClassName?: string;\n /**\n * When adding new items to the DOM, this is the number of items to add above\n * and below the current view. E.g. if list is 100 items and is scrolled\n * halfway down (so items [46, 55] are in view), then when a new range of\n * items is rendered, it will render items `46 - viewBuffer` to\n * `55 + viewBuffer`.\n */\n viewBuffer: number;\n /**\n * The minimum number of items offscreen in either direction; e.g. at least\n * `viewBuffer` number of items must be off screen above and below the\n * current view, or more items will be rendered.\n */\n viewBufferMin: number;\n /**\n * When `true`, expect `_wrapperElm` to have `overflow: visible` and to,\n * essentially, be tall to the point the entire page will will end up\n * scrolling as a result of the ListView. Similar to react-virtualized\n * window scroller.\n *\n * - Ref: https://bvaughn.github.io/react-virtualized/#/components/WindowScroller\n * - Ref:https://github.com/bvaughn/react-virtualized/blob/497e2a1942529560681d65a9ef9f5e9c9c9a49ba/docs/WindowScroller.md\n */\n windowScroller?: boolean;\n /**\n * You need to pass in scrollElement when windowScroller is set to false.\n * This element is responsible for tracking scrolling for lazy loading.\n */\n scrollElement?: Element;\n};\n\nconst DEFAULT_INITIAL_DRAW = 100;\n\n/**\n * Virtualized list view component, for the most part, only renders the window\n * of items that are in-view with some buffer before and after. Listens for\n * scroll events and updates which items are rendered. See react-virtualized\n * for a suite of components with similar, but generalized, functionality.\n * https://github.com/bvaughn/react-virtualized\n *\n * Note: Presently, ListView cannot be a PureComponent. This is because ListView\n * is sensitive to the underlying state that drives the list items, but it\n * doesn't actually receive that state. So, a render may still be required even\n * if ListView's props are unchanged.\n *\n * @export\n * @class ListView\n */\nexport default class ListView extends React.Component<TListViewProps> {\n /**\n * Keeps track of the height and y-value of items, by item index, in the\n * ListView.\n */\n _yPositions: Positions;\n /**\n * Keep track of the known / measured heights of the rendered items; populated\n * with values through observation and keyed on the item key, not the item\n * index.\n */\n _knownHeights: Map<string, number>;\n /**\n * The start index of the items currently drawn.\n */\n _startIndexDrawn: number;\n /**\n * The end index of the items currently drawn.\n */\n _endIndexDrawn: number;\n /**\n * The start index of the items currently in view.\n */\n _startIndex: number;\n /**\n * The end index of the items currently in view.\n */\n _endIndex: number;\n /**\n * Height of the visual window, e.g. height of the scroller element.\n */\n _viewHeight: number;\n /**\n * `scrollTop` of the current scroll position.\n */\n _scrollTop: number;\n /**\n * Used to keep track of whether or not a re-calculation of what should be\n * drawn / viewable has been scheduled.\n */\n _isScrolledOrResized: boolean;\n /**\n * If `windowScroller` is true, this notes how far down the page the scroller\n * is located. (Note: repositioning and below-the-fold views are untested)\n */\n _htmlTopOffset: number;\n _windowScrollListenerAdded: boolean;\n _htmlElm: HTMLElement;\n /**\n * Element holding the scroller.\n */\n _wrapperElm: Element | TNil;\n /**\n * HTMLElement holding the rendered items.\n */\n _itemHolderElm: HTMLElement | TNil;\n\n static defaultProps = {\n initialDraw: DEFAULT_INITIAL_DRAW,\n itemsWrapperClassName: '',\n windowScroller: false,\n };\n\n constructor(props: TListViewProps) {\n super(props);\n\n this._yPositions = new Positions(200);\n // _knownHeights is (item-key -> observed height) of list items\n this._knownHeights = new Map();\n\n this._startIndexDrawn = 2 ** 20;\n this._endIndexDrawn = -(2 ** 20);\n this._startIndex = 0;\n this._endIndex = 0;\n this._viewHeight = -1;\n this._scrollTop = -1;\n this._isScrolledOrResized = false;\n\n this._htmlTopOffset = -1;\n this._windowScrollListenerAdded = false;\n // _htmlElm is only relevant if props.windowScroller is true\n this._htmlElm = document.documentElement;\n this._wrapperElm = undefined;\n this._itemHolderElm = undefined;\n }\n\n componentDidMount() {\n if (this.props.windowScroller) {\n if (this._wrapperElm) {\n const { top } = this._wrapperElm.getBoundingClientRect();\n this._htmlTopOffset = top + this._htmlElm.scrollTop;\n }\n window.addEventListener('scroll', this._onScroll);\n this._windowScrollListenerAdded = true;\n } else {\n // The wrapper element should be the one that handles the scrolling. Once we are not using scroll-canvas we can remove this.\n this._wrapperElm = this.props.scrollElement;\n this._wrapperElm?.addEventListener('scroll', this._onScroll);\n }\n }\n\n componentDidUpdate(prevProps: TListViewProps) {\n if (this._itemHolderElm) {\n this._scanItemHeights();\n }\n // When windowScroller is set to false, we can continue to handle scrollElement\n if (this.props.windowScroller) {\n return;\n }\n // check if the scrollElement changes and update its scroll listener\n if (prevProps.scrollElement !== this.props.scrollElement) {\n prevProps.scrollElement?.removeEventListener('scroll', this._onScroll);\n this._wrapperElm = this.props.scrollElement;\n this._wrapperElm?.addEventListener('scroll', this._onScroll);\n }\n }\n\n componentWillUnmount() {\n if (this._windowScrollListenerAdded) {\n window.removeEventListener('scroll', this._onScroll);\n } else {\n this._wrapperElm?.removeEventListener('scroll', this._onScroll);\n }\n }\n\n getViewHeight = () => this._viewHeight;\n\n /**\n * Get the index of the item at the bottom of the current view.\n */\n getBottomVisibleIndex = (): number => {\n const bottomY = this._scrollTop + this._viewHeight;\n return this._yPositions.findFloorIndex(bottomY, this._getHeight);\n };\n\n /**\n * Get the index of the item at the top of the current view.\n */\n getTopVisibleIndex = (): number => this._yPositions.findFloorIndex(this._scrollTop, this._getHeight);\n\n getRowPosition = (index: number): { height: number; y: number } =>\n this._yPositions.getRowPosition(index, this._getHeight);\n\n scrollToIndex = (index: number, headerHeight: number) => {\n // calculate the position of the list view relative to the scroll parent\n const { scrollElement } = this.props;\n const scrollElementTop = scrollElement?.getBoundingClientRect().top || 0;\n const listViewTop = (scrollElement?.scrollTop || 0) + (this._itemHolderElm?.getBoundingClientRect().top || 0);\n const listViewOffset = listViewTop - scrollElementTop;\n\n const itemOffset = this.getRowPosition(index).y;\n\n // hard code a small offset to leave a little bit of space above the focused span, so it is visually clear\n // that there is content above\n this.props.scrollElement?.scrollTo({ top: itemOffset + listViewOffset - headerHeight - 80 });\n };\n\n /**\n * Scroll event listener that schedules a remeasuring of which items should be\n * rendered.\n */\n _onScroll = () => {\n if (!this._isScrolledOrResized) {\n this._isScrolledOrResized = true;\n window.requestAnimationFrame(this._positionList);\n }\n };\n\n /**\n * Returns true is the view height (scroll window) or scroll position have\n * changed.\n */\n _isViewChanged() {\n if (!this._wrapperElm) {\n return false;\n }\n const useRoot = this.props.windowScroller;\n const clientHeight = useRoot ? this._htmlElm.clientHeight : this._wrapperElm.clientHeight;\n const scrollTop = useRoot ? this._htmlElm.scrollTop : this._wrapperElm.scrollTop;\n return clientHeight !== this._viewHeight || scrollTop !== this._scrollTop;\n }\n\n /**\n * Recalculate _startIndex and _endIndex, e.g. which items are in view.\n */\n _calcViewIndexes() {\n const useRoot = this.props.windowScroller;\n // funky if statement is to satisfy flow\n if (!useRoot) {\n /* istanbul ignore next */\n if (!this._wrapperElm) {\n this._viewHeight = -1;\n this._startIndex = 0;\n this._endIndex = 0;\n return;\n }\n this._viewHeight = this._wrapperElm.clientHeight;\n this._scrollTop = this._wrapperElm.scrollTop;\n } else {\n this._viewHeight = window.innerHeight - this._htmlTopOffset;\n this._scrollTop = window.scrollY;\n }\n const yStart = this._scrollTop;\n const yEnd = this._scrollTop + this._viewHeight;\n this._startIndex = this._yPositions.findFloorIndex(yStart, this._getHeight);\n this._endIndex = this._yPositions.findFloorIndex(yEnd, this._getHeight);\n }\n\n /**\n * Checked to see if the currently rendered items are sufficient, if not,\n * force an update to trigger more items to be rendered.\n */\n _positionList = () => {\n this._isScrolledOrResized = false;\n if (!this._wrapperElm) {\n return;\n }\n this._calcViewIndexes();\n // indexes drawn should be padded by at least props.viewBufferMin\n const maxStart = this.props.viewBufferMin > this._startIndex ? 0 : this._startIndex - this.props.viewBufferMin;\n const minEnd =\n this.props.viewBufferMin < this.props.dataLength - this._endIndex\n ? this._endIndex + this.props.viewBufferMin\n : this.props.dataLength - 1;\n if (maxStart < this._startIndexDrawn || minEnd > this._endIndexDrawn) {\n this.forceUpdate();\n }\n };\n\n _initWrapper = (elm: HTMLElement | TNil) => {\n if (!this.props.windowScroller) {\n return;\n }\n this._wrapperElm = elm;\n if (elm) {\n this._viewHeight = elm.clientHeight;\n }\n };\n\n _initItemHolder = (elm: HTMLElement | TNil) => {\n this._itemHolderElm = elm;\n this._scanItemHeights();\n };\n\n /**\n * Go through all items that are rendered and save their height based on their\n * item-key (which is on a data-* attribute). If any new or adjusted heights\n * are found, re-measure the current known y-positions (via .yPositions).\n */\n _scanItemHeights = () => {\n const getIndexFromKey = this.props.getIndexFromKey;\n if (!this._itemHolderElm) {\n return;\n }\n // note the keys for the first and last altered heights, the `yPositions`\n // needs to be updated\n let lowDirtyKey = null;\n let highDirtyKey = null;\n let isDirty = false;\n // iterating childNodes is faster than children\n // https://jsperf.com/large-htmlcollection-vs-large-nodelist\n const nodes = this._itemHolderElm.childNodes;\n const max = nodes.length;\n for (let i = 0; i < max; i++) {\n const node = nodes[i];\n if (node instanceof HTMLElement) {\n // use `.getAttribute(...)` instead of `.dataset` for jest / JSDOM\n const itemKey = node.getAttribute('data-item-key');\n if (!itemKey) {\n // eslint-disable-next-line no-console\n console.warn('itemKey not found');\n continue;\n }\n // measure the first child, if it's available, otherwise the node itself\n // (likely not transferable to other contexts, and instead is specific to\n // how we have the items rendered)\n const measureSrc: Element = node.firstElementChild || node;\n const observed = measureSrc.clientHeight;\n const known = this._knownHeights.get(itemKey);\n if (observed !== known) {\n this._knownHeights.set(itemKey, observed);\n if (!isDirty) {\n isDirty = true;\n // eslint-disable-next-line no-multi-assign\n lowDirtyKey = highDirtyKey = itemKey;\n } else {\n highDirtyKey = itemKey;\n }\n }\n }\n }\n if (lowDirtyKey != null && highDirtyKey != null) {\n // update yPositions, then redraw\n const imin = getIndexFromKey(lowDirtyKey);\n const imax = highDirtyKey === lowDirtyKey ? imin : getIndexFromKey(highDirtyKey);\n this._yPositions.calcHeights(imax, this._getHeight, imin);\n this.forceUpdate();\n }\n };\n\n /**\n * Get the height of the element at index `i`; first check the known heights,\n * fallback to `.props.itemHeightGetter(...)`.\n */\n _getHeight = (i: number) => {\n const key = this.props.getKeyFromIndex(i);\n const known = this._knownHeights.get(key);\n // known !== known iff known is NaN\n // eslint-disable-next-line no-self-compare\n if (known != null && known === known) {\n return known;\n }\n return this.props.itemHeightGetter(i, key);\n };\n\n render() {\n const {\n dataLength,\n getKeyFromIndex,\n initialDraw = DEFAULT_INITIAL_DRAW,\n itemRenderer,\n viewBuffer,\n viewBufferMin,\n } = this.props;\n const heightGetter = this._getHeight;\n const items = [];\n let start;\n let end;\n\n this._yPositions.profileData(dataLength);\n\n if (!this._wrapperElm) {\n start = 0;\n end = (initialDraw < dataLength ? initialDraw : dataLength) - 1;\n } else {\n if (this._isViewChanged()) {\n this._calcViewIndexes();\n }\n const maxStart = viewBufferMin > this._startIndex ? 0 : this._startIndex - viewBufferMin;\n const minEnd = viewBufferMin < dataLength - this._endIndex ? this._endIndex + viewBufferMin : dataLength - 1;\n if (maxStart < this._startIndexDrawn || minEnd > this._endIndexDrawn) {\n start = viewBuffer > this._startIndex ? 0 : this._startIndex - viewBuffer;\n end = this._endIndex + viewBuffer;\n if (end >= dataLength) {\n end = dataLength - 1;\n }\n } else {\n start = this._startIndexDrawn > dataLength - 1 ? 0 : this._startIndexDrawn;\n end = this._endIndexDrawn > dataLength - 1 ? dataLength - 1 : this._endIndexDrawn;\n }\n }\n\n this._yPositions.calcHeights(end, heightGetter, start || -1);\n this._startIndexDrawn = start;\n this._endIndexDrawn = end;\n\n items.length = end - start + 1;\n for (let i = start; i <= end; i++) {\n const { y: top, height } = this._yPositions.getRowPosition(i, heightGetter);\n const style = {\n height,\n top,\n position: 'absolute',\n };\n const itemKey = getKeyFromIndex(i);\n const attrs = { 'data-item-key': itemKey };\n items.push(itemRenderer(itemKey, style, i, attrs));\n }\n const wrapperProps: TWrapperProps = {\n style: { position: 'relative' },\n ref: this._initWrapper,\n };\n if (!this.props.windowScroller) {\n wrapperProps.onScroll = this._onScroll;\n wrapperProps.style.height = '100%';\n wrapperProps.style.overflowY = 'auto';\n }\n const scrollerStyle = {\n position: 'relative' as const,\n height: this._yPositions.getEstimatedHeight(),\n };\n return (\n <div {...wrapperProps} data-testid=\"ListView\">\n <div style={scrollerStyle}>\n <div\n style={{\n position: 'absolute',\n top: 0,\n margin: 0,\n padding: 0,\n }}\n className={this.props.itemsWrapperClassName}\n ref={this._initItemHolder}\n >\n {items}\n </div>\n </div>\n </div>\n );\n }\n}\n","import { css } from '@emotion/css';\n\nimport {\n DataSourceJsonData,\n DataSourcePluginOptionsEditorProps,\n GrafanaTheme2,\n toOption,\n updateDatasourcePluginJsonDataOption,\n} from '@grafana/data';\nimport { ConfigDescriptionLink, ConfigSubSection } from '@grafana/plugin-ui';\nimport { InlineField, InlineFieldRow, Input, Select, useStyles2 } from '@grafana/ui';\n\nexport interface SpanBarOptions {\n type?: string;\n tag?: string;\n}\n\nexport interface SpanBarOptionsData extends DataSourceJsonData {\n spanBar?: SpanBarOptions;\n}\n\nexport const NONE = 'None';\nexport const DURATION = 'Duration';\nexport const TAG = 'Tag';\n\ninterface Props extends DataSourcePluginOptionsEditorProps<SpanBarOptionsData> {}\n\nexport default function SpanBarSettings({ options, onOptionsChange }: Props) {\n const styles = useStyles2(getStyles);\n const selectOptions = [NONE, DURATION, TAG].map(toOption);\n\n return (\n <div className={css({ width: '100%' })}>\n <InlineFieldRow className={styles.row}>\n <InlineField label=\"Label\" labelWidth={26} tooltip=\"Default: duration\" grow>\n <Select\n inputId=\"label\"\n options={selectOptions}\n value={options.jsonData.spanBar?.type || ''}\n onChange={(v) => {\n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'spanBar', {\n ...options.jsonData.spanBar,\n type: v?.value ?? '',\n });\n }}\n placeholder=\"Duration\"\n isClearable\n aria-label={'select-label-name'}\n width={40}\n />\n </InlineField>\n </InlineFieldRow>\n {options.jsonData.spanBar?.type === TAG && (\n <InlineFieldRow className={styles.row}>\n <InlineField\n label=\"Tag key\"\n labelWidth={26}\n tooltip=\"Tag key which will be used to get the tag value. A span's attributes and resources will be searched for the tag key\"\n >\n <Input\n type=\"text\"\n placeholder=\"Enter tag key\"\n onChange={(v) =>\n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'spanBar', {\n ...options.jsonData.spanBar,\n tag: v.currentTarget.value,\n })\n }\n value={options.jsonData.spanBar?.tag || ''}\n width={40}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n </div>\n );\n}\n\nexport const SpanBarSection = ({ options, onOptionsChange }: DataSourcePluginOptionsEditorProps) => {\n let suffix = options.type;\n suffix += options.type === 'tempo' ? '/configure-tempo-data-source/#span-bar' : '/#span-bar';\n\n return (\n <ConfigSubSection\n title=\"Span bar\"\n description={\n <ConfigDescriptionLink\n description=\"Add additional info next to the service and operation on a span bar row in the trace view.\"\n suffix={suffix}\n feature=\"the span bar\"\n />\n }\n >\n <SpanBarSettings options={options} onOptionsChange={onOptionsChange} />\n </ConfigSubSection>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n infoText: css({\n label: 'infoText',\n paddingBottom: theme.spacing(2),\n color: theme.colors.text.secondary,\n }),\n row: css({\n label: 'row',\n alignItems: 'baseline',\n }),\n});\n","import { cloneElement, ReactElement, useRef } from 'react';\n\nimport { Popover as GrafanaPopover, PopoverController } from '@grafana/ui';\n\nexport type PopoverProps = {\n children: ReactElement;\n content: ReactElement;\n overlayClassName?: string;\n};\n\nexport function Popover({ children, content, overlayClassName }: PopoverProps) {\n const popoverRef = useRef<HTMLElement>(null);\n\n return (\n <PopoverController content={content} hideAfter={300}>\n {(showPopper, hidePopper, popperProps) => {\n return (\n <>\n {popoverRef.current && (\n <GrafanaPopover\n {...popperProps}\n referenceElement={popoverRef.current}\n wrapperClassName={overlayClassName}\n onMouseLeave={hidePopper}\n onMouseEnter={showPopper}\n />\n )}\n\n {cloneElement(children, {\n ref: popoverRef,\n onMouseEnter: showPopper,\n onMouseLeave: hidePopper,\n })}\n </>\n );\n }}\n </PopoverController>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const LABEL = 'label';\n","import * as React from 'react';\n\nimport { Field, LinkModel, LinkTarget } from '@grafana/data';\n\nimport { TraceSpan } from './trace';\n\nexport enum SpanLinkType {\n Logs = 'log',\n Traces = 'trace',\n Metrics = 'metric',\n Profiles = 'profile',\n ProfilesDrilldown = 'profile-drilldown',\n Session = 'session',\n Unknown = 'unknown',\n}\n\nexport type SpanLinkDef = {\n href: string;\n onClick?: (event: unknown) => void;\n content: React.ReactNode;\n title?: string;\n field: Field;\n type: SpanLinkType;\n target?: LinkTarget;\n linkModel?: LinkModel;\n};\n\nexport type SpanLinkFunc = (span: TraceSpan) => SpanLinkDef[] | undefined;\n","import {\n DataFrame,\n DataLink,\n DataLinkPostProcessor,\n DataSourceInstanceSettings,\n DataSourceJsonData,\n dateTime,\n Field,\n LinkModel,\n mapInternalLinkToExplore,\n rangeUtil,\n ScopedVars,\n SplitOpen,\n TimeRange,\n} from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport {\n TraceToProfilesOptions,\n TraceToMetricsOptions,\n TraceToLogsOptionsV2,\n TraceToLogsTag,\n} from '@grafana/o11y-ds-frontend';\nimport { PromQuery } from '@grafana/prometheus';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { DataQuery } from '@grafana/schema';\nimport { Icon } from '@grafana/ui';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\n\nimport { LokiQuery } from '../../../plugins/datasource/loki/types';\nimport { ExploreFieldLinkModel, getFieldLinksForExplore, getVariableUsageInfo } from '../utils/links';\n\nimport { SpanLinkDef, SpanLinkFunc, SpanLinkType } from './components/types/links';\nimport { Trace, TraceSpan, TraceSpanReference } from './components/types/trace';\n\n/**\n * This is a factory for the link creator. It returns the function mainly so it can return undefined in which case\n * the trace view won't create any links and to capture the datasource and split function making it easier to memoize\n * with useMemo.\n */\nexport function createSpanLinkFactory({\n splitOpenFn,\n traceToLogsOptions,\n traceToMetricsOptions,\n traceToProfilesOptions,\n dataFrame,\n createFocusSpanLink,\n trace,\n dataLinkPostProcessor,\n}: {\n splitOpenFn: SplitOpen;\n traceToLogsOptions?: TraceToLogsOptionsV2;\n traceToMetricsOptions?: TraceToMetricsOptions;\n traceToProfilesOptions?: TraceToProfilesOptions;\n dataFrame?: DataFrame;\n createFocusSpanLink?: (traceId: string, spanId: string) => LinkModel<Field>;\n trace: Trace;\n dataLinkPostProcessor?: DataLinkPostProcessor;\n}): SpanLinkFunc | undefined {\n if (!dataFrame) {\n return undefined;\n }\n\n let scopedVars = scopedVarsFromTrace(trace.duration, trace.traceName, trace.traceID);\n const hasLinks = dataFrame.fields.some((f) => Boolean(f.config.links?.length));\n\n const createSpanLinks = legacyCreateSpanLinkFactory(\n splitOpenFn,\n // We need this to make the types happy but for this branch of code it does not matter which field we supply.\n dataFrame.fields[0],\n traceToLogsOptions,\n traceToMetricsOptions,\n createFocusSpanLink,\n scopedVars,\n dataFrame,\n dataLinkPostProcessor\n );\n\n return function SpanLink(span: TraceSpan): SpanLinkDef[] | undefined {\n let spanLinks = createSpanLinks(span);\n\n if (hasLinks) {\n scopedVars = {\n ...scopedVars,\n ...scopedVarsFromSpan(span),\n ...scopedVarsFromTags(span, traceToProfilesOptions),\n };\n // We should be here only if there are some links in the dataframe\n const fields = dataFrame.fields.filter((f) => Boolean(f.config.links?.length))!;\n try {\n let profilesDataSourceSettings: DataSourceInstanceSettings<DataSourceJsonData> | undefined;\n if (traceToProfilesOptions?.datasourceUid) {\n profilesDataSourceSettings = getDatasourceSrv().getInstanceSettings(traceToProfilesOptions.datasourceUid);\n }\n const hasConfiguredPyroscopeDS = profilesDataSourceSettings?.type === 'grafana-pyroscope-datasource';\n const hasPyroscopeProfile = span.tags.some((tag) => tag.key === pyroscopeProfileIdTagKey);\n const shouldCreatePyroscopeLink = hasConfiguredPyroscopeDS && hasPyroscopeProfile;\n\n let links: ExploreFieldLinkModel[] = [];\n fields.forEach((field) => {\n const fieldLinksForExplore = getFieldLinksForExplore({\n field,\n rowIndex: span.dataFrameRowIndex!,\n splitOpenFn,\n range: getTimeRangeFromSpan(span, undefined, undefined, shouldCreatePyroscopeLink),\n dataFrame,\n vars: scopedVars,\n });\n links = links.concat(fieldLinksForExplore);\n });\n\n const newSpanLinks: SpanLinkDef[] = links.map((link) => {\n return {\n title: link.title,\n href: link.href,\n onClick: link.onClick,\n content: <Icon name=\"link\" title={link.title || 'Link'} />,\n field: link.origin,\n type: shouldCreatePyroscopeLink ? SpanLinkType.Profiles : SpanLinkType.Unknown,\n target: link.target,\n };\n });\n\n spanLinks.push.apply(spanLinks, newSpanLinks);\n } catch (error) {\n // It's fairly easy to crash here for example if data source defines wrong interpolation in the data link\n console.error(error);\n return spanLinks;\n }\n }\n\n return spanLinks;\n };\n}\n\n/**\n * Default keys to use when there are no configured tags.\n */\nconst formatDefaultKeys = (keys: string[]) => {\n return keys.map((k) => ({\n key: k,\n value: k.includes('.') ? k.replace('.', '_') : undefined,\n }));\n};\nconst defaultKeys = formatDefaultKeys(['cluster', 'hostname', 'namespace', 'pod', 'service.name', 'service.namespace']);\nexport const defaultProfilingKeys = formatDefaultKeys(['service.name', 'service.namespace']);\nexport const pyroscopeProfileIdTagKey = 'pyroscope.profile.id';\nexport const feO11yTagKey = 'gf.feo11y.app.id';\n\nfunction legacyCreateSpanLinkFactory(\n splitOpenFn: SplitOpen,\n field: Field,\n traceToLogsOptions?: TraceToLogsOptionsV2,\n traceToMetricsOptions?: TraceToMetricsOptions,\n createFocusSpanLink?: (traceId: string, spanId: string) => LinkModel<Field>,\n scopedVars?: ScopedVars,\n dataFrame?: DataFrame,\n dataLinkPostProcessor?: DataLinkPostProcessor\n) {\n let logsDataSourceSettings: DataSourceInstanceSettings<DataSourceJsonData> | undefined;\n if (traceToLogsOptions?.datasourceUid) {\n logsDataSourceSettings = getDatasourceSrv().getInstanceSettings(traceToLogsOptions.datasourceUid);\n }\n const isSplunkDS = logsDataSourceSettings?.type === 'grafana-splunk-datasource';\n\n let metricsDataSourceSettings: DataSourceInstanceSettings<DataSourceJsonData> | undefined;\n if (traceToMetricsOptions?.datasourceUid) {\n metricsDataSourceSettings = getDatasourceSrv().getInstanceSettings(traceToMetricsOptions.datasourceUid);\n }\n\n return function SpanLink(span: TraceSpan): SpanLinkDef[] {\n scopedVars = {\n ...scopedVars,\n ...scopedVarsFromSpan(span),\n };\n const links: SpanLinkDef[] = [];\n let query: DataQuery | undefined;\n let tags = '';\n\n // TODO: This should eventually move into specific data sources and added to the data frame as we no longer use the\n // deprecated blob format and we can map the link easily in data frame.\n if (logsDataSourceSettings && traceToLogsOptions) {\n const customQuery = traceToLogsOptions.customQuery ? traceToLogsOptions.query : undefined;\n const tagsToUse =\n traceToLogsOptions.tags && traceToLogsOptions.tags.length > 0 ? traceToLogsOptions.tags : defaultKeys;\n switch (logsDataSourceSettings?.type) {\n case 'loki':\n tags = getFormattedTags(span, tagsToUse);\n query = getQueryForLoki(span, traceToLogsOptions, tags, customQuery);\n break;\n case 'grafana-splunk-datasource':\n tags = getFormattedTags(span, tagsToUse, { joinBy: ' ' });\n query = getQueryForSplunk(span, traceToLogsOptions, tags, customQuery);\n break;\n case 'elasticsearch':\n case 'grafana-opensearch-datasource':\n tags = getFormattedTags(span, tagsToUse, { labelValueSign: ':', joinBy: ' AND ' });\n query = getQueryForElasticsearchOrOpensearch(span, traceToLogsOptions, tags, customQuery);\n break;\n case 'grafana-falconlogscale-datasource':\n tags = getFormattedTags(span, tagsToUse, { joinBy: ' OR ' });\n query = getQueryForFalconLogScale(span, traceToLogsOptions, tags, customQuery);\n break;\n case 'googlecloud-logging-datasource':\n tags = getFormattedTags(span, tagsToUse, { joinBy: ' AND ' });\n query = getQueryForGoogleCloudLogging(span, traceToLogsOptions, tags, customQuery);\n break;\n case 'victoriametrics-logs-datasource':\n // Build tag selector using strict equality (\":=\") required by LogsQL\n // See https://docs.victoriametrics.com/victorialogs/logsql/#exact-filter\n tags = getFormattedTags(span, tagsToUse, { labelValueSign: ':=', joinBy: ' AND ' });\n query = getQueryForVictoriaLogs(span, traceToLogsOptions, tags, customQuery);\n break;\n }\n\n // query can be false in case the simple UI tag mapping is used but none of them are present in the span.\n // For custom query, this is always defined and we check if the interpolation matched all variables later on.\n if (query) {\n const dataLink: DataLink = {\n title: logsDataSourceSettings.name,\n url: '',\n internal: {\n datasourceUid: logsDataSourceSettings.uid,\n datasourceName: logsDataSourceSettings.name,\n query,\n range: getTimeRangeFromSpan(\n span,\n {\n startMs: traceToLogsOptions.spanStartTimeShift\n ? rangeUtil.intervalToMs(traceToLogsOptions.spanStartTimeShift)\n : 0,\n endMs: traceToLogsOptions.spanEndTimeShift\n ? rangeUtil.intervalToMs(traceToLogsOptions.spanEndTimeShift)\n : 0,\n },\n isSplunkDS\n ),\n },\n };\n\n scopedVars = {\n ...scopedVars,\n __tags: {\n text: t('explore.legacy-create-span-link-factory.text.tags', 'Tags'),\n value: tags,\n },\n };\n\n // Check if all variables are defined and don't show if they aren't. This is usually handled by the\n // getQueryFor* functions but this is for case of custom query supplied by the user.\n if (getVariableUsageInfo(dataLink.internal!.query, scopedVars).allVariablesDefined) {\n let link = mapInternalLinkToExplore({\n link: dataLink,\n internalLink: dataLink.internal!,\n scopedVars: scopedVars,\n range: dataLink.internal!.range,\n field: {} as Field,\n onClickFn: splitOpenFn,\n replaceVariables: getTemplateSrv().replace.bind(getTemplateSrv()),\n });\n\n link =\n (dataFrame &&\n dataLinkPostProcessor?.({\n frame: dataFrame,\n field: field,\n dataLinkScopedVars: scopedVars,\n replaceVariables: getTemplateSrv().replace.bind(getTemplateSrv()),\n config: {},\n link: dataLink,\n linkModel: link,\n })) ||\n link;\n\n links.push({\n href: link.href,\n linkModel: link,\n title: t('explore.legacy-create-span-link-factory.title.related-logs', 'Related logs'),\n onClick: link.onClick,\n content: (\n <Icon\n name=\"gf-logs\"\n title={t(\n 'explore.legacy-create-span-link-factory.title-explore-split',\n 'Explore the logs for this in split view'\n )}\n />\n ),\n field,\n type: SpanLinkType.Logs,\n });\n }\n }\n }\n\n // Get metrics links\n if (metricsDataSourceSettings && traceToMetricsOptions?.queries) {\n for (const query of traceToMetricsOptions.queries) {\n const expr =\n query.query ||\n `histogram_quantile(0.5, sum(rate(traces_spanmetrics_latency_bucket{service=\"${span.process.serviceName}\"}[5m])) by (le))`;\n const dataLink: DataLink<PromQuery> = {\n title: metricsDataSourceSettings.name,\n url: '',\n internal: {\n datasourceUid: metricsDataSourceSettings.uid,\n datasourceName: metricsDataSourceSettings.name,\n query: {\n expr,\n refId: 'A',\n },\n },\n };\n\n const tagsToUse =\n traceToMetricsOptions.tags && traceToMetricsOptions.tags.length > 0\n ? traceToMetricsOptions.tags\n : defaultKeys;\n\n scopedVars = {\n ...scopedVars,\n __tags: {\n text: t('explore.legacy-create-span-link-factory.text.tags', 'Tags'),\n value: getFormattedTags(span, tagsToUse),\n },\n };\n\n const link = mapInternalLinkToExplore({\n link: dataLink,\n internalLink: dataLink.internal!,\n scopedVars,\n range: getTimeRangeFromSpan(span, {\n startMs: traceToMetricsOptions.spanStartTimeShift\n ? rangeUtil.intervalToMs(traceToMetricsOptions.spanStartTimeShift)\n : -120000,\n endMs: traceToMetricsOptions.spanEndTimeShift\n ? rangeUtil.intervalToMs(traceToMetricsOptions.spanEndTimeShift)\n : 120000,\n }),\n field: {} as Field,\n onClickFn: splitOpenFn,\n replaceVariables: getTemplateSrv().replace.bind(getTemplateSrv()),\n });\n\n links.push({\n title: query?.name,\n href: link.href,\n onClick: link.onClick,\n content: (\n <Icon\n name=\"chart-line\"\n title={t(\n 'explore.legacy-create-span-link-factory.title-explore-metrics-for-this-span',\n 'Explore metrics for this span'\n )}\n />\n ),\n field,\n type: SpanLinkType.Metrics,\n });\n }\n }\n\n // Get trace links\n if (span.references && createFocusSpanLink) {\n for (const reference of span.references) {\n // Ignore parent-child links\n if (reference.refType === 'CHILD_OF') {\n continue;\n }\n\n const link = createFocusSpanLink(reference.traceID, reference.spanID);\n const title = getReferenceTitle(reference);\n\n links!.push({\n href: link.href,\n linkModel: link,\n title,\n content: <Icon name=\"link\" title={title} />,\n onClick: link.onClick,\n field: link.origin,\n type: SpanLinkType.Traces,\n });\n }\n }\n\n if (span.subsidiarilyReferencedBy && createFocusSpanLink) {\n for (const reference of span.subsidiarilyReferencedBy) {\n const link = createFocusSpanLink(reference.traceID, reference.spanID);\n const title = getReferenceTitle(reference);\n\n links!.push({\n href: link.href,\n title,\n content: <Icon name=\"link\" title={title} />,\n onClick: link.onClick,\n field: link.origin,\n type: SpanLinkType.Traces,\n });\n }\n }\n\n // Get session links\n const feO11yLink = getLinkForFeO11y(span);\n if (feO11yLink) {\n links.push({\n title: t('explore.legacy-create-span-link-factory.title.session-for-this-span', 'Session for this span'),\n href: feO11yLink,\n content: (\n <Icon\n name=\"frontend-observability\"\n title={t('explore.legacy-create-span-link-factory.title-session-for-this-span', 'Session for this span')}\n />\n ),\n field,\n type: SpanLinkType.Session,\n });\n }\n\n return links;\n };\n}\n\nconst getReferenceTitle = (reference: TraceSpanReference) => {\n let title = reference.span ? reference.span.operationName : 'View linked span';\n if (reference.refType === 'EXTERNAL') {\n title = 'View linked span';\n }\n return title;\n};\n\nfunction getQueryForLoki(\n span: TraceSpan,\n options: TraceToLogsOptionsV2,\n tags: string,\n customQuery?: string\n): LokiQuery | undefined {\n const { filterByTraceID, filterBySpanID } = options;\n\n if (customQuery) {\n return { expr: customQuery, refId: '' };\n }\n\n if (!tags) {\n return undefined;\n }\n\n let expr = '{${__tags}}';\n if (filterByTraceID && span.traceID) {\n expr +=\n ' | label_format log_line_contains_trace_id=`{{ contains \"${__span.traceId}\" __line__ }}` | log_line_contains_trace_id=\"true\" or trace_id=\"${__span.traceId}\"';\n }\n if (filterBySpanID && span.spanID) {\n expr +=\n ' | label_format log_line_contains_span_id=`{{ contains \"${__span.spanId}\" __line__ }}` | log_line_contains_span_id=\"true\" or span_id=\"${__span.spanId}\"';\n }\n\n return {\n expr: expr,\n refId: '',\n };\n}\n\nfunction getLinkForFeO11y(span: TraceSpan): string | undefined {\n const feO11yAppId = span.process.tags.find((tag) => tag.key === feO11yTagKey)?.value;\n const feO11ySessionId = span.tags.find((tag) => tag.key === 'session_id' || tag.key === 'session.id')?.value;\n\n return feO11yAppId && feO11ySessionId\n ? `/a/grafana-kowalski-app/apps/${feO11yAppId}/sessions/${feO11ySessionId}`\n : undefined;\n}\n\n// we do not have access to the dataquery type for opensearch,\n// so here is a minimal interface that handles both elasticsearch and opensearch.\ninterface ElasticsearchOrOpensearchQuery extends DataQuery {\n query: string;\n metrics: Array<{\n id: string;\n type: 'logs';\n }>;\n}\n\nfunction getQueryForElasticsearchOrOpensearch(\n span: TraceSpan,\n options: TraceToLogsOptionsV2,\n tags: string,\n customQuery?: string\n): ElasticsearchOrOpensearchQuery {\n const { filterByTraceID, filterBySpanID } = options;\n if (customQuery) {\n return {\n query: customQuery,\n refId: '',\n metrics: [{ id: '1', type: 'logs' }],\n };\n }\n\n let queryArr = [];\n if (filterBySpanID && span.spanID) {\n queryArr.push('\"${__span.spanId}\"');\n }\n\n if (filterByTraceID && span.traceID) {\n queryArr.push('\"${__span.traceId}\"');\n }\n\n if (tags) {\n queryArr.push('${__tags}');\n }\n\n return {\n query: queryArr.join(' AND '),\n refId: '',\n metrics: [{ id: '1', type: 'logs' }],\n };\n}\n\nfunction getQueryForSplunk(span: TraceSpan, options: TraceToLogsOptionsV2, tags: string, customQuery?: string) {\n const { filterByTraceID, filterBySpanID } = options;\n\n if (customQuery) {\n return { query: customQuery, refId: '' };\n }\n\n let query = '';\n if (tags) {\n query += '${__tags}';\n }\n if (filterByTraceID && span.traceID) {\n query += ' \"${__span.traceId}\"';\n }\n if (filterBySpanID && span.spanID) {\n query += ' \"${__span.spanId}\"';\n }\n\n return {\n query: query,\n refId: '',\n };\n}\n\nfunction getQueryForGoogleCloudLogging(\n span: TraceSpan,\n options: TraceToLogsOptionsV2,\n tags: string,\n customQuery?: string\n) {\n const { filterByTraceID, filterBySpanID } = options;\n\n if (customQuery) {\n return { query: customQuery, refId: '' };\n }\n\n let queryArr = [];\n if (filterBySpanID && span.spanID) {\n queryArr.push('\"${__span.spanId}\"');\n }\n\n if (filterByTraceID && span.traceID) {\n queryArr.push('\"${__span.traceId}\"');\n }\n\n if (tags) {\n queryArr.push('${__tags}');\n }\n\n return {\n query: queryArr.join(' AND '),\n refId: '',\n };\n}\n\nfunction getQueryForFalconLogScale(span: TraceSpan, options: TraceToLogsOptionsV2, tags: string, customQuery?: string) {\n const { filterByTraceID, filterBySpanID } = options;\n\n if (customQuery) {\n return {\n lsql: customQuery,\n refId: '',\n };\n }\n\n if (!tags) {\n return undefined;\n }\n\n let lsql = '${__tags}';\n if (filterByTraceID && span.traceID) {\n lsql += ' or \"${__span.traceId}\"';\n }\n\n if (filterBySpanID && span.spanID) {\n lsql += ' or \"${__span.spanId}\"';\n }\n\n return {\n lsql,\n refId: '',\n };\n}\n\n/**\n * Builds a LogsQL expression for victoria‑metrics‑logs‑datasource.\n * Uses := for exact‑match filters and joins parts with AND.\n * See https://docs.victoriametrics.com/victorialogs/logsql/#exact-filter\n */\nfunction getQueryForVictoriaLogs(span: TraceSpan, options: TraceToLogsOptionsV2, tags: string, customQuery?: string) {\n const { filterByTraceID, filterBySpanID } = options;\n\n // Custom user query has priority\n if (customQuery) {\n return {\n expr: customQuery,\n refId: '',\n };\n }\n\n const parts: string[] = [];\n\n if (filterBySpanID && span.spanID) {\n parts.push('span_id:=\"${__span.spanId}\"');\n }\n if (filterByTraceID && span.traceID) {\n parts.push('trace_id:=\"${__span.traceId}\"');\n }\n if (tags) {\n parts.push('${__tags}');\n }\n\n // Nothing to match against – do not create the link\n if (!parts.length) {\n return undefined;\n }\n\n return {\n expr: parts.join(' AND '),\n refId: '',\n };\n}\n\n/**\n * Creates a string representing all the tags already formatted for use in the query. The tags are filtered so that\n * only intersection of tags that exist in a span and tags that you want are serialized into the string.\n */\nexport function getFormattedTags(\n span: TraceSpan,\n tags: TraceToLogsTag[],\n { labelValueSign = '=', joinBy = ', ' }: { labelValueSign?: string; joinBy?: string } = {}\n) {\n // In order, try to use mapped tags -> tags -> default tags\n // Build tag portion of query\n return [\n ...span.process.tags,\n ...span.tags,\n { key: 'spanId', value: span.spanID },\n { key: 'traceId', value: span.traceID },\n { key: 'name', value: span.operationName },\n { key: 'duration', value: span.duration },\n ]\n .map((tag) => {\n const keyValue = tags.find((keyValue) => keyValue.key === tag.key);\n if (keyValue) {\n return `${keyValue.value ? keyValue.value : keyValue.key}${labelValueSign}\"${tag.value}\"`;\n }\n return undefined;\n })\n .filter((v) => Boolean(v))\n .join(joinBy);\n}\n\n/**\n * Gets a time range from the span.\n */\nfunction getTimeRangeFromSpan(\n span: TraceSpan,\n timeShift: { startMs: number; endMs: number } = { startMs: 0, endMs: 0 },\n isSplunkDS = false,\n shouldCreatePyroscopeLink = false\n): TimeRange {\n let adjustedStartTime = Math.floor(span.startTime / 1000 + timeShift.startMs);\n const spanEndMs = (span.startTime + span.duration) / 1000;\n let adjustedEndTime = Math.floor(spanEndMs + timeShift.endMs);\n\n // Splunk requires a time interval of >= 1s, rather than >=1ms like Loki timerange in below elseif block\n if (isSplunkDS && adjustedEndTime - adjustedStartTime < 1000) {\n adjustedEndTime = adjustedStartTime + 1000;\n } else if (shouldCreatePyroscopeLink) {\n adjustedStartTime = adjustedStartTime - 60000;\n adjustedEndTime = adjustedEndTime + 60000;\n } else if (adjustedStartTime === adjustedEndTime) {\n // Because we can only pass milliseconds in the url we need to check if they equal.\n // We need end time to be later than start time\n adjustedEndTime++;\n }\n\n const to = dateTime(adjustedEndTime);\n const from = dateTime(adjustedStartTime);\n\n // Beware that public/app/features/explore/state/main.ts SplitOpen fn uses the range from here. No matter what is in the url.\n return {\n from,\n to,\n raw: {\n from,\n to,\n },\n };\n}\n\n/**\n * Variables from trace that can be used in the query\n * @param trace\n */\nexport function scopedVarsFromTrace(duration: number, name: string, traceId: string): ScopedVars {\n return {\n __trace: {\n text: t('explore.scoped-vars-from-trace.text.trace', 'Trace'),\n value: {\n duration,\n name,\n traceId,\n },\n },\n };\n}\n\n/**\n * Variables from span that can be used in the query\n * @param span\n */\nexport function scopedVarsFromSpan(span: TraceSpan): ScopedVars {\n const tags: ScopedVars = {};\n\n // We put all these tags together similar way we do for the __tags variable. This means there can be some overriding\n // of values if there is the same tag in both process tags and span tags.\n for (const tag of span.process.tags) {\n tags[tag.key] = tag.value;\n }\n for (const tag of span.tags) {\n tags[tag.key] = tag.value;\n }\n\n return {\n __span: {\n text: t('explore.scoped-vars-from-span.text.span', 'Span'),\n value: {\n spanId: span.spanID,\n traceId: span.traceID,\n duration: span.duration,\n name: span.operationName,\n tags: tags,\n },\n },\n };\n}\n\n/**\n * Variables from tags that can be used in the query\n * @param span\n */\nexport function scopedVarsFromTags(\n span: TraceSpan,\n traceToProfilesOptions: TraceToProfilesOptions | undefined\n): ScopedVars {\n let tags: ScopedVars = {};\n\n if (traceToProfilesOptions) {\n const profileTags =\n traceToProfilesOptions.tags && traceToProfilesOptions.tags.length > 0\n ? traceToProfilesOptions.tags\n : defaultProfilingKeys;\n\n tags = {\n __tags: {\n text: t('explore.scoped-vars-from-tags.text.tags', 'Tags'),\n value: getFormattedTags(span, profileTags),\n },\n };\n }\n\n return tags;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2, IconName } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\n\nconst getStyles = (divider: boolean) => (theme: GrafanaTheme2) => {\n return {\n LabeledList: css({\n label: 'LabeledList',\n listStyle: 'none',\n margin: 0,\n padding: 0,\n ...(divider\n ? {\n marginRight: '-8px',\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'flex-end',\n }\n : {}),\n }),\n LabeledListItem: css({\n label: 'LabeledListItem',\n display: 'inline-block',\n ...(divider\n ? {\n borderRight: `1px solid ${autoColor(theme, '#ddd')}`,\n padding: '0 8px',\n }\n : { padding: '0 4px' }),\n }),\n LabeledListLabel: css({\n label: 'LabeledListLabel',\n color: theme.isLight ? '#999' : '#666',\n marginRight: '0.25rem',\n }),\n LabeledListValue: css({\n label: 'LabeledListValue',\n marginRight: divider ? undefined : '0.55rem',\n wordWrap: 'break-word',\n wordBreak: 'break-all',\n }),\n LabeledListIcon: css({\n label: 'LabeledListIcon',\n marginRight: '0.25rem',\n marginTop: '-0.1rem',\n }),\n LabeledListServiceLine: css({\n label: 'LabeledListServiceLine',\n display: 'inline-block',\n width: '1.25rem',\n height: '0.35rem',\n marginRight: '0.5rem',\n verticalAlign: 'middle',\n borderRadius: theme.shape.radius.default,\n }),\n };\n};\n\ntype LabeledListProps = {\n className?: string;\n divider?: boolean;\n items: Array<{ key: string; label: React.ReactNode; value: React.ReactNode; icon?: IconName }>;\n color?: string;\n};\n\nexport default function LabeledList(props: LabeledListProps) {\n const { className, divider = false, items, color } = props;\n const styles = useStyles2(getStyles(divider));\n\n return (\n <ul className={cx(styles.LabeledList, className)}>\n {items.map(({ key, label, value, icon }) => {\n return (\n // If label is service, create small line on left with color\n <li className={styles.LabeledListItem} key={`${key}`}>\n {label === 'Service:' && (\n <div className={styles.LabeledListServiceLine} style={{ backgroundColor: color }} />\n )}\n {icon && <Icon name={icon} className={styles.LabeledListIcon} />}\n <span className={styles.LabeledListLabel}>{label}</span>\n <strong className={styles.LabeledListValue}>{value}</strong>\n </li>\n );\n })}\n </ul>\n );\n}\n","// Copyright (c) 2019 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport * as React from 'react';\n\nimport { Field, LinkModel } from '@grafana/data';\n\nimport { TraceSpanReference } from '../types/trace';\n\ntype ReferenceLinkProps = {\n reference: TraceSpanReference;\n children: React.ReactNode;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel<Field>;\n};\n\nexport default function ReferenceLink(props: ReferenceLinkProps) {\n const { reference, children, createFocusSpanLink } = props;\n\n const link = createFocusSpanLink(reference.traceID, reference.spanID);\n\n return (\n <a\n href={link.href}\n target={link.target}\n rel=\"noopener noreferrer\"\n onClick={\n link.onClick\n ? (event) => {\n event.preventDefault();\n link.onClick!(event);\n }\n : undefined\n }\n >\n {children}\n </a>\n );\n}\n","// Copyright (c) 2019 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, cx } from '@emotion/css';\nimport * as React from 'react';\n\nimport { Field, GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { Counter, Icon, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TraceSpanReference } from '../../types/trace';\nimport ReferenceLink from '../../url/ReferenceLink';\n\nimport AccordianKeyValues from './AccordianKeyValues';\n\nimport { alignIcon } from '.';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n AccordianReferenceItem: css({\n borderBottom: `1px solid ${autoColor(theme, '#d8d8d8')}`,\n }),\n AccordianKeyValues: css({\n marginLeft: '10px',\n }),\n AccordianReferences: css({\n label: 'AccordianReferences',\n position: 'relative',\n marginBottom: '0.25rem',\n }),\n AccordianReferencesHeader: css({\n label: 'AccordianReferencesHeader',\n color: 'inherit',\n display: 'block',\n padding: '0.25rem 0',\n '&:hover': {\n background: autoColor(theme, '#dadada'),\n },\n }),\n AccordianReferencesContent: css({\n label: 'AccordianReferencesContent',\n background: autoColor(theme, '#f0f0f0'),\n borderTop: `1px solid ${autoColor(theme, '#d8d8d8')}`,\n padding: '0.5rem 0.5rem 0.25rem 0.5rem',\n }),\n AccordianReferencesFooter: css({\n label: 'AccordianReferencesFooter',\n color: autoColor(theme, '#999'),\n }),\n AccordianKeyValuesItem: css({\n marginBottom: theme.spacing(0.5),\n }),\n ReferencesList: css({\n background: '#fff',\n border: '1px solid #ddd',\n marginBottom: '0.7em',\n maxHeight: '450px',\n overflow: 'auto',\n }),\n list: css({\n width: '100%',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n background: '#fff',\n }),\n itemContent: css({\n padding: '0.25rem 0.5rem',\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n }),\n item: css({\n '&:nth-child(2n)': {\n background: '#f5f5f5',\n },\n }),\n debugInfo: css({\n letterSpacing: '0.25px',\n margin: '0.5em 0 0',\n flexWrap: 'wrap',\n display: 'flex',\n justifyContent: 'flex-end',\n }),\n debugLabel: css({\n margin: '0 5px 0 5px',\n '&::before': {\n color: '#bbb',\n content: 'attr(data-label)',\n },\n }),\n serviceName: css({\n marginRight: '8px',\n }),\n title: css({\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }),\n});\n\nexport type AccordianReferencesProps = {\n data: TraceSpanReference[];\n highContrast?: boolean;\n interactive?: boolean;\n isOpen: boolean;\n openedItems?: Set<TraceSpanReference>;\n onItemToggle?: (reference: TraceSpanReference) => void;\n onToggle?: null | (() => void);\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel<Field>;\n};\n\ntype ReferenceItemProps = {\n data: TraceSpanReference[];\n interactive?: boolean;\n openedItems?: Set<TraceSpanReference>;\n onItemToggle?: (reference: TraceSpanReference) => void;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel<Field>;\n};\n\n// export for test\nexport function References(props: ReferenceItemProps) {\n const { data, createFocusSpanLink, openedItems, onItemToggle, interactive } = props;\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.AccordianReferencesContent}>\n {data.map((reference, i) => (\n <div className={i < data.length - 1 ? styles.AccordianReferenceItem : undefined} key={i}>\n <div className={styles.item} key={`${reference.spanID}`}>\n <ReferenceLink reference={reference} createFocusSpanLink={createFocusSpanLink}>\n <span className={styles.itemContent}>\n {reference.span ? (\n <span>\n <span className={cx('span-svc-name', styles.serviceName)}>\n {reference.span.process.serviceName}\n </span>\n <small className=\"endpoint-name\">{reference.span.operationName}</small>\n </span>\n ) : (\n <span className={cx('span-svc-name', styles.title)}>\n <Trans i18nKey=\"explore.accordian-references.view-linked-span\">View Linked Span</Trans>{' '}\n <Icon name=\"external-link-alt\" />\n </span>\n )}\n <small className={styles.debugInfo}>\n <span className={styles.debugLabel} data-label=\"TraceID:\">\n {reference.traceID}\n </span>\n <span className={styles.debugLabel} data-label=\"SpanID:\">\n {reference.spanID}\n </span>\n </small>\n </span>\n </ReferenceLink>\n </div>\n {!!reference.tags?.length && (\n <div className={styles.AccordianKeyValues}>\n <AccordianKeyValues\n className={i < data.length - 1 ? styles.AccordianKeyValuesItem : null}\n data={reference.tags || []}\n highContrast\n interactive={interactive}\n isOpen={openedItems ? openedItems.has(reference) : false}\n label={t('explore.references.label-attributes', 'attributes')}\n onToggle={interactive && onItemToggle ? () => onItemToggle(reference) : null}\n />\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\n\nconst AccordianReferences = ({\n data,\n interactive = true,\n isOpen,\n onToggle,\n onItemToggle,\n openedItems,\n createFocusSpanLink,\n}: AccordianReferencesProps) => {\n const isEmpty = !Array.isArray(data) || !data.length;\n let arrow: React.ReactNode | null = null;\n let HeaderComponent: 'span' | 'a' = 'span';\n let headerProps: {} | null = null;\n if (interactive) {\n arrow = isOpen ? (\n <Icon name={'angle-down'} className={alignIcon} />\n ) : (\n <Icon name={'angle-right'} className={alignIcon} />\n );\n HeaderComponent = 'a';\n headerProps = {\n 'aria-checked': isOpen,\n onClick: isEmpty ? null : onToggle,\n role: 'switch',\n };\n }\n\n const styles = useStyles2(getStyles);\n return (\n <div className={styles.AccordianReferences}>\n <HeaderComponent className={styles.AccordianReferencesHeader} {...headerProps}>\n {arrow}\n <strong>\n <span>\n <Trans i18nKey=\"explore.accordian-references.references\">References</Trans>\n </span>\n </strong>{' '}\n <Counter value={data.length} />\n </HeaderComponent>\n {isOpen && (\n <References\n data={data}\n openedItems={openedItems}\n createFocusSpanLink={createFocusSpanLink}\n onItemToggle={onItemToggle}\n interactive={interactive}\n />\n )}\n </div>\n );\n};\n\nexport default React.memo(AccordianReferences);\n","import { LinkModel } from '@grafana/data';\nimport { Trans } from '@grafana/i18n';\nimport { Button } from '@grafana/ui';\n\ntype Props = {\n focusSpanLink: LinkModel;\n};\n\nexport function ShareSpanButton(props: Props) {\n const { focusSpanLink } = props;\n const { interpolatedParams, ...linkProps } = focusSpanLink ?? {};\n return (\n <span>\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <a\n data-testid=\"share-span-button\"\n {...linkProps}\n onClick={(e) => {\n // click handling logic copied from react router:\n // https://github.com/remix-run/react-router/blob/997b4d67e506d39ac6571cb369d6d2d6b3dda557/packages/react-router-dom/index.tsx#L392-L394s\n if (\n focusSpanLink.onClick &&\n e.button === 0 && // Ignore everything but left clicks\n (!e.currentTarget.target || e.currentTarget.target === '_self') && // Let browser handle \"target=_blank\" etc.\n !(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) // Ignore clicks with modifier keys\n ) {\n e.preventDefault();\n focusSpanLink.onClick(e);\n }\n }}\n >\n <Button variant=\"secondary\" size=\"sm\" icon=\"share-alt\" fill=\"outline\">\n <Trans i18nKey=\"explore.span-detail.share-span\">Share</Trans>\n </Button>\n </a>\n </span>\n );\n}\n","import * as React from 'react';\n\nimport { CoreApp, IconName, LinkModel, PluginExtensionPoints, RawTimeRange, TimeRange } from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { TraceToProfilesOptions } from '@grafana/o11y-ds-frontend';\nimport { config, locationService, reportInteraction, usePluginLinks } from '@grafana/runtime';\nimport { DataSourceRef } from '@grafana/schema';\nimport { DataLinkButton, Dropdown, Menu, ToolbarButton } from '@grafana/ui';\nimport { RelatedProfilesTitle } from '@grafana-plugins/tempo/resultTransformer';\n\nimport { pyroscopeProfileIdTagKey } from '../../../createSpanLink';\nimport { SpanLinkDef, SpanLinkFunc, SpanLinkType } from '../../types/links';\nimport { TraceSpan } from '../../types/trace';\n\nexport type ProfilesButtonContext = {\n serviceName: string;\n profileTypeId: string;\n spanSelector: string;\n explorationType: string;\n timeRange: RawTimeRange;\n datasource: DataSourceRef;\n};\n\nexport type Props = {\n span: TraceSpan;\n traceToProfilesOptions?: TraceToProfilesOptions;\n datasourceType: string;\n timeRange: TimeRange;\n createSpanLink?: SpanLinkFunc;\n app: CoreApp;\n};\n\n/**\n * Order in which known link types are shown in the span details\n * This was added in https://github.com/grafana/grafana/pull/101881 to preserve the order of links\n * customers might have been used to. This will be revisted in https://github.com/grafana/grafana/issues/101925\n */\nconst LINKS_ORDER = [\n SpanLinkType.Metrics,\n SpanLinkType.Logs,\n SpanLinkType.Profiles,\n SpanLinkType.ProfilesDrilldown,\n SpanLinkType.Session,\n];\n\n/**\n * Maximum number of links to show before moving them to a dropdown\n */\nconst MAX_LINKS = 3;\n\nconst ABSOLUTE_LINK_PATTERN = /^https?:\\/\\//i;\n\nexport const getSpanDetailLinkButtons = (props: Props) => {\n const { span, createSpanLink, traceToProfilesOptions, timeRange, datasourceType, app } = props;\n\n let linkToProfiles: SpanLinkDef | undefined;\n\n if (createSpanLink) {\n const links = (createSpanLink(span) || [])\n // Linked spans are shown in a separate section\n .filter((link) => link.type !== SpanLinkType.Traces)\n .map((link) => {\n if (link.type === SpanLinkType.Logs) {\n return createLinkModel(link, SpanLinkType.Logs, 'Logs for this span', 'gf-logs', datasourceType);\n }\n if (link.type === SpanLinkType.Profiles && link.title === RelatedProfilesTitle) {\n linkToProfiles = link;\n return createLinkModel(link, SpanLinkType.Profiles, 'Profiles for this span', 'link', datasourceType);\n }\n if (link.type === SpanLinkType.Session) {\n return createLinkModel(\n link,\n SpanLinkType.Session,\n 'Session for this span',\n 'frontend-observability',\n datasourceType\n );\n }\n return createLinkModel(link, SpanLinkType.Unknown, link.title || '', 'link', datasourceType);\n });\n\n // if in explore, use the plugin extension point to get the link\n // note: plugin extension point links are not currently supported in panel plugins\n // TODO: create SpanLinkDef in createSpanLink (https://github.com/grafana/grafana/issues/101925)\n if (linkToProfiles && app === CoreApp.Explore) {\n // ensure we have a profile link\n const profilesDrilldownPluginId = 'grafana-pyroscope-app';\n const context = getProfileLinkButtonsContext(span, traceToProfilesOptions, timeRange);\n const extensionPointId = PluginExtensionPoints.TraceViewDetails;\n const { links: pluginLinks } = usePluginLinks({ extensionPointId, context, limitPerPlugin: 1 });\n const link =\n pluginLinks && pluginLinks.length > 0\n ? pluginLinks.find((link) => link.pluginId === profilesDrilldownPluginId)\n : null;\n const label = 'Open in Profiles Drilldown';\n const appLink: SpanLinkDef = {\n ...linkToProfiles,\n href: '',\n onClick: () => {\n link?.onClick?.();\n },\n };\n links.push(createLinkModel(appLink, SpanLinkType.ProfilesDrilldown, label, 'link', datasourceType));\n }\n\n links.sort((a, b) => {\n const aIndex = LINKS_ORDER.indexOf(a.type);\n const bIndex = LINKS_ORDER.indexOf(b.type);\n const aValue = aIndex === -1 ? Number.MAX_SAFE_INTEGER : aIndex;\n const bValue = bIndex === -1 ? Number.MAX_SAFE_INTEGER : bIndex;\n return aValue - bValue;\n });\n\n if (links.length > MAX_LINKS) {\n return <DropDownMenu links={links}></DropDownMenu>;\n } else {\n return (\n <>\n {links.map(({ linkModel, icon, className }, index) => (\n <DataLinkButton key={index} link={linkModel} buttonProps={{ icon, className }}></DataLinkButton>\n ))}\n </>\n );\n }\n }\n\n return <></>;\n};\n\nconst DropDownMenu = ({ links }: { links: SpanLinkModel[] }) => {\n const [isOpen, setIsOpen] = React.useState(false);\n\n const menu = (\n <Menu>\n {links.map(({ linkModel }, index) => (\n <Menu.Item\n key={index}\n label={linkModel.title}\n onClick={(event: React.MouseEvent) => linkModel.onClick?.(event)}\n />\n ))}\n </Menu>\n );\n\n return (\n <Dropdown overlay={menu} placement=\"bottom-start\" onVisibleChange={setIsOpen}>\n <ToolbarButton\n variant=\"primary\"\n icon=\"link\"\n isOpen={isOpen}\n aria-label={t('explore.drop-down-menu.aria-label-links', 'Links')}\n >\n <Trans i18nKey=\"explore.drop-down-menu.links\">Links</Trans>\n </ToolbarButton>\n </Dropdown>\n );\n};\n\nexport const getProfileLinkButtonsContext = (\n span: TraceSpan,\n traceToProfilesOptions: TraceToProfilesOptions | undefined,\n timeRange: TimeRange\n) => {\n const spanSelector = span.tags.filter((tag) => tag.key === pyroscopeProfileIdTagKey);\n const context: ProfilesButtonContext = {\n serviceName: span.process.serviceName ?? '',\n profileTypeId: traceToProfilesOptions?.profileTypeId ?? '',\n spanSelector: spanSelector.length === 1 && spanSelector[0].value ? spanSelector[0].value : '',\n explorationType: 'flame-graph',\n timeRange: {\n from: timeRange.from.toISOString(),\n to: timeRange.to.toISOString(),\n },\n datasource: { uid: traceToProfilesOptions?.datasourceUid },\n };\n return context;\n};\n\ntype SpanLinkModel = {\n linkModel: LinkModel;\n icon: IconName;\n className?: string;\n type: SpanLinkType;\n};\n\nconst createLinkModel = (\n link: SpanLinkDef,\n type: SpanLinkType,\n title: string,\n icon: IconName,\n datasourceType: string,\n className?: string\n): SpanLinkModel => {\n return {\n icon,\n className,\n type,\n linkModel: {\n ...link.linkModel,\n ...link,\n title: title,\n target: '_blank',\n origin: link.field,\n onClick: (event: React.MouseEvent) => {\n // DataLinkButton assumes if you provide an onClick event you would want to prevent default behavior like navigation\n // In this case, if an onClick is not defined, restore navigation to the provided href while keeping the tracking\n // this interaction will not be tracked with link right clicks\n reportInteraction('grafana_traces_trace_view_span_link_clicked', {\n datasourceType,\n grafana_version: config.buildInfo.version,\n type,\n location: 'spanDetails',\n });\n\n if (link.onClick) {\n link.onClick?.(event);\n } else {\n // TODO: Replace with https://github.com/grafana/grafana/issues/103593\n // We need to handle absolute and relative URLs correctly because when\n // there are multiple links we group them into a dropdown and not use\n // the grafana/ui DataLinkButton component which handles relative and\n // absolute URLs nicely. A nice solution would be to have a separate\n // component that handles this for us and not pass the onClick in the\n // SpanLinkModel when link.href is defined (removing the need of having\n // if (link.onClick) in here.\n\n // if it's an absolute URL - open it in a new window\n if (!ABSOLUTE_LINK_PATTERN.test(link.href)) {\n // handle relative URLs by changing current URL:\n locationService.push(link.href);\n } else {\n window.open(link.href, '_blank', 'noopener,noreferrer');\n }\n }\n },\n },\n };\n};\n","import { css } from '@emotion/css';\nimport { useCallback, useEffect } from 'react';\nimport { useMeasure } from 'react-use';\nimport { lastValueFrom } from 'rxjs';\n\nimport {\n CoreApp,\n DataFrame,\n DataQueryRequest,\n DataSourceInstanceSettings,\n DataSourceJsonData,\n dateTime,\n TimeZone,\n} from '@grafana/data';\nimport { FlameGraph } from '@grafana/flamegraph';\nimport { Trans } from '@grafana/i18n';\nimport { TraceToProfilesOptions } from '@grafana/o11y-ds-frontend';\nimport { config, DataSourceWithBackend, getTemplateSrv } from '@grafana/runtime';\nimport { useStyles2 } from '@grafana/ui';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { Query } from 'app/plugins/datasource/grafana-pyroscope-datasource/types';\n\nimport {\n defaultProfilingKeys,\n getFormattedTags,\n pyroscopeProfileIdTagKey,\n scopedVarsFromSpan,\n scopedVarsFromTags,\n scopedVarsFromTrace,\n} from '../../../createSpanLink';\nimport { TraceSpan } from '../../types/trace';\n\nimport { TraceFlameGraphs } from '.';\n\nexport type SpanFlameGraphProps = {\n span: TraceSpan;\n traceToProfilesOptions?: TraceToProfilesOptions;\n timeZone: TimeZone;\n traceFlameGraphs: TraceFlameGraphs;\n setTraceFlameGraphs: (flameGraphs: TraceFlameGraphs) => void;\n setRedrawListView: (redraw: {}) => void;\n traceDuration: number;\n traceName: string;\n};\n\nexport default function SpanFlameGraph(props: SpanFlameGraphProps) {\n const {\n span,\n traceToProfilesOptions,\n timeZone,\n traceFlameGraphs,\n setTraceFlameGraphs,\n setRedrawListView,\n traceDuration,\n traceName,\n } = props;\n const [sizeRef, { height: containerHeight }] = useMeasure<HTMLDivElement>();\n const styles = useStyles2(getStyles);\n\n const profileTag = span.tags.filter((tag) => tag.key === pyroscopeProfileIdTagKey);\n const profileTagValue = profileTag.length > 0 ? profileTag[0].value : undefined;\n\n const getTimeRangeForProfile = useCallback(() => {\n const spanStartMs = Math.floor(span.startTime / 1000) - 30000;\n const spanEndMs = (span.startTime + span.duration) / 1000 + 30000;\n const to = dateTime(spanEndMs);\n const from = dateTime(spanStartMs);\n\n return {\n from,\n to,\n raw: {\n from,\n to,\n },\n };\n }, [span.duration, span.startTime]);\n\n const getFlameGraphData = async (request: DataQueryRequest<Query>, datasourceUid: string) => {\n const ds = await getDatasourceSrv().get(datasourceUid);\n if (ds instanceof DataSourceWithBackend) {\n const result = await lastValueFrom(ds.query(request));\n const frame = result.data.find((x: DataFrame) => {\n return x.name === 'response';\n });\n if (frame && frame.length > 1) {\n return frame;\n }\n }\n };\n\n const queryFlameGraph = useCallback(\n async (\n profilesDataSourceSettings: DataSourceInstanceSettings<DataSourceJsonData>,\n traceToProfilesOptions: TraceToProfilesOptions,\n span: TraceSpan\n ) => {\n let labelSelector = '{}';\n if (traceToProfilesOptions.customQuery && traceToProfilesOptions.query) {\n const scopedVars = {\n ...scopedVarsFromTrace(traceDuration, traceName, span.traceID),\n ...scopedVarsFromSpan(span),\n ...scopedVarsFromTags(span, traceToProfilesOptions),\n };\n labelSelector = getTemplateSrv().replace(traceToProfilesOptions.query, scopedVars);\n } else {\n const tags =\n traceToProfilesOptions.tags && traceToProfilesOptions.tags.length > 0\n ? traceToProfilesOptions.tags\n : defaultProfilingKeys;\n labelSelector = `{${getFormattedTags(span, tags)}}`;\n }\n\n const request = {\n requestId: 'span-flamegraph-requestId',\n interval: '2s',\n intervalMs: 2000,\n range: getTimeRangeForProfile(),\n scopedVars: {},\n app: CoreApp.Unknown,\n timezone: timeZone,\n startTime: span.startTime,\n targets: [\n {\n labelSelector,\n groupBy: [],\n profileTypeId: traceToProfilesOptions.profileTypeId ?? '',\n queryType: 'profile' as const,\n spanSelector: [profileTagValue],\n refId: 'span-flamegraph-refId',\n datasource: {\n type: profilesDataSourceSettings.type,\n uid: profilesDataSourceSettings.uid,\n },\n },\n ],\n };\n const flameGraph = await getFlameGraphData(request, profilesDataSourceSettings.uid);\n\n if (flameGraph && flameGraph.length > 0) {\n setTraceFlameGraphs({ ...traceFlameGraphs, [profileTagValue]: flameGraph });\n }\n },\n [getTimeRangeForProfile, profileTagValue, setTraceFlameGraphs, timeZone, traceDuration, traceFlameGraphs, traceName]\n );\n\n useEffect(() => {\n if (!Object.keys(traceFlameGraphs).includes(profileTagValue)) {\n let profilesDataSourceSettings: DataSourceInstanceSettings<DataSourceJsonData> | undefined;\n if (traceToProfilesOptions && traceToProfilesOptions?.datasourceUid) {\n profilesDataSourceSettings = getDatasourceSrv().getInstanceSettings(traceToProfilesOptions.datasourceUid);\n }\n if (traceToProfilesOptions && profilesDataSourceSettings) {\n queryFlameGraph(profilesDataSourceSettings, traceToProfilesOptions, span);\n }\n }\n }, [\n setTraceFlameGraphs,\n span,\n traceFlameGraphs,\n traceToProfilesOptions,\n getTimeRangeForProfile,\n timeZone,\n queryFlameGraph,\n profileTagValue,\n ]);\n\n useEffect(() => {\n setRedrawListView({});\n }, [containerHeight, setRedrawListView]);\n\n if (!traceFlameGraphs[profileTagValue]) {\n return <></>;\n }\n\n return (\n <div className={styles.flameGraph} ref={sizeRef}>\n <div className={styles.flameGraphTitle}>\n <Trans i18nKey=\"explore.span-flame-graph.flame-graph\">Flame graph</Trans>\n </div>\n <FlameGraph\n data={traceFlameGraphs[profileTagValue]}\n getTheme={() => config.theme2}\n showFlameGraphOnly={true}\n disableCollapsing={true}\n />\n </div>\n );\n}\n\nconst getStyles = () => {\n return {\n flameGraph: css({\n label: 'flameGraphInSpan',\n margin: '5px',\n }),\n flameGraphTitle: css({\n label: 'flameGraphTitleInSpan',\n marginBottom: '5px',\n fontWeight: 'bold',\n }),\n };\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, cx } from '@emotion/css';\nimport { SpanStatusCode } from '@opentelemetry/api';\nimport { useCallback, useMemo } from 'react';\n\nimport {\n CoreApp,\n DataFrame,\n dateTimeFormat,\n GrafanaTheme2,\n LinkModel,\n TimeRange,\n TraceKeyValuePair,\n TraceLog,\n PluginExtensionResourceAttributesContext,\n PluginExtensionPoints,\n IconName,\n} from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { TraceToProfilesOptions } from '@grafana/o11y-ds-frontend';\nimport { usePluginLinks } from '@grafana/runtime';\nimport { TimeZone } from '@grafana/schema';\nimport { Icon, useStyles2 } from '@grafana/ui';\n\nimport { pyroscopeProfileIdTagKey } from '../../../createSpanLink';\nimport { autoColor } from '../../Theme';\nimport LabeledList from '../../common/LabeledList';\nimport { KIND, LIBRARY_NAME, LIBRARY_VERSION, STATUS, STATUS_MESSAGE, TRACE_STATE } from '../../constants/span';\nimport { SpanLinkFunc } from '../../types/links';\nimport { TraceProcess, TraceSpan, TraceSpanReference } from '../../types/trace';\nimport { formatDuration } from '../../utils/date';\n\nimport AccordianKeyValues from './AccordianKeyValues';\nimport AccordianLogs from './AccordianLogs';\nimport AccordianReferences from './AccordianReferences';\nimport DetailState from './DetailState';\nimport { ShareSpanButton } from './ShareSpanButton';\nimport { getSpanDetailLinkButtons } from './SpanDetailLinkButtons';\nimport SpanFlameGraph from './SpanFlameGraph';\n\nconst useResourceAttributesExtensionLinks = ({\n process,\n spanTags,\n datasourceType,\n datasourceUid,\n timeRange,\n}: {\n process: TraceProcess;\n spanTags: TraceKeyValuePair[];\n datasourceType: string;\n datasourceUid: string;\n timeRange: TimeRange;\n}) => {\n // Stable context for useMemo inside usePluginLinks\n const context: PluginExtensionResourceAttributesContext = useMemo(() => {\n const attributes = (process.tags ?? []).reduce<Record<string, string[]>>((acc, tag) => {\n if (acc[tag.key]) {\n acc[tag.key].push(tag.value);\n } else {\n acc[tag.key] = [tag.value];\n }\n return acc;\n }, {});\n\n const spanAttributes = (spanTags ?? []).reduce<Record<string, string[]>>((acc, tag) => {\n if (acc[tag.key]) {\n acc[tag.key].push(tag.value);\n } else {\n acc[tag.key] = [tag.value];\n }\n return acc;\n }, {});\n\n return {\n attributes,\n spanAttributes,\n timeRange: { from: timeRange.from.valueOf(), to: timeRange.to.valueOf() },\n datasource: {\n type: datasourceType,\n uid: datasourceUid,\n },\n };\n }, [process.tags, spanTags, datasourceType, datasourceUid, timeRange]);\n\n const { links } = usePluginLinks({\n extensionPointId: PluginExtensionPoints.TraceViewResourceAttributes,\n limitPerPlugin: 10,\n context,\n });\n\n const resourceLinksGetter = useCallback(\n (pairs: TraceKeyValuePair[], index: number) => {\n const { key } = pairs[index] ?? {};\n return links.filter((link) => link.category === key);\n },\n [links]\n );\n\n return resourceLinksGetter;\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n header: css({\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: '0 1rem',\n marginBottom: '0.25rem',\n }),\n content: css({\n fontSize: theme.typography.bodySmall.fontSize,\n }),\n listWrapper: css({\n overflow: 'hidden',\n flexGrow: 1,\n display: 'flex',\n justifyContent: 'flex-end',\n }),\n list: css({\n textAlign: 'left',\n }),\n operationName: css({\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '50%',\n flexGrow: 0,\n flexShrink: 0,\n }),\n AccordianWarnings: css({\n label: 'AccordianWarnings',\n background: autoColor(theme, '#fafafa'),\n border: `1px solid ${autoColor(theme, '#e4e4e4')}`,\n marginBottom: '0.25rem',\n }),\n AccordianWarningsHeader: css({\n label: 'AccordianWarningsHeader',\n background: autoColor(theme, '#fff7e6'),\n padding: '0.25rem 0.5rem',\n '&:hover': {\n background: autoColor(theme, '#ffe7ba'),\n },\n }),\n AccordianWarningsHeaderOpen: css({\n label: 'AccordianWarningsHeaderOpen',\n borderBottom: `1px solid ${autoColor(theme, '#e8e8e8')}`,\n }),\n AccordianWarningsLabel: css({\n label: 'AccordianWarningsLabel',\n color: autoColor(theme, '#d36c08'),\n }),\n Textarea: css({\n wordBreak: 'break-all',\n whiteSpace: 'pre',\n }),\n linkList: css({\n display: 'flex',\n flexWrap: 'wrap',\n gap: '10px',\n marginBottom: theme.spacing(2),\n }),\n debugInfo: css({\n label: 'debugInfo',\n display: 'block',\n letterSpacing: '0.25px',\n margin: '0.5em 0 -0.75em',\n textAlign: 'right',\n }),\n debugLabel: css({\n label: 'debugLabel',\n '&::before': {\n color: autoColor(theme, '#bbb'),\n content: 'attr(data-label)',\n },\n }),\n LinkIcon: css({\n fontSize: '1.5em',\n }),\n };\n};\n\nexport const alignIcon = css({\n margin: '-0.2rem 0.25rem 0 0',\n});\n\nexport type TraceFlameGraphs = {\n [spanID: string]: DataFrame;\n};\n\nexport type SpanDetailProps = {\n color: string;\n detailState: DetailState;\n logItemToggle: (spanID: string, log: TraceLog) => void;\n logsToggle: (spanID: string) => void;\n processToggle: (spanID: string) => void;\n span: TraceSpan;\n traceToProfilesOptions?: TraceToProfilesOptions;\n timeZone: TimeZone;\n tagsToggle: (spanID: string) => void;\n traceStartTime: number;\n traceDuration: number;\n traceName: string;\n warningsToggle: (spanID: string) => void;\n stackTracesToggle: (spanID: string) => void;\n referenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n referencesToggle: (spanID: string) => void;\n createSpanLink?: SpanLinkFunc;\n focusedSpanId?: string;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n datasourceType: string;\n datasourceUid: string;\n traceFlameGraphs: TraceFlameGraphs;\n setTraceFlameGraphs: (flameGraphs: TraceFlameGraphs) => void;\n setRedrawListView: (redraw: {}) => void;\n timeRange: TimeRange;\n app: CoreApp;\n};\n\nexport default function SpanDetail(props: SpanDetailProps) {\n const {\n color,\n detailState,\n logItemToggle,\n logsToggle,\n processToggle,\n span,\n tagsToggle,\n traceStartTime,\n traceDuration,\n traceName,\n warningsToggle,\n stackTracesToggle,\n referencesToggle,\n referenceItemToggle,\n createSpanLink,\n createFocusSpanLink,\n datasourceType,\n datasourceUid,\n traceFlameGraphs,\n setTraceFlameGraphs,\n traceToProfilesOptions,\n setRedrawListView,\n timeRange,\n app,\n } = props;\n const {\n isTagsOpen,\n isProcessOpen,\n logs: logsState,\n isWarningsOpen,\n references: referencesState,\n isStackTracesOpen,\n } = detailState;\n const {\n operationName,\n process,\n duration,\n relativeStartTime,\n startTime,\n traceID,\n spanID,\n logs,\n tags,\n warnings,\n references,\n stackTraces,\n } = span;\n\n const { timeZone } = props;\n const durationIcon: IconName = 'hourglass';\n const startIcon: IconName = 'clock-nine';\n\n let overviewItems = [\n {\n key: 'svc',\n label: t('explore.span-detail.overview-items.label.service', 'Service:'),\n value: process.serviceName,\n },\n {\n key: 'duration',\n label: t('explore.span-detail.overview-items.label.duration', 'Duration:'),\n value: formatDuration(duration),\n icon: durationIcon,\n },\n {\n key: 'start',\n label: t('explore.span-detail.overview-items.label.start-time', 'Start Time:'),\n value: formatDuration(relativeStartTime) + getAbsoluteTime(startTime, timeZone),\n icon: startIcon,\n },\n ...(span.childSpanCount > 0\n ? [\n {\n key: 'child_count',\n label: t('explore.span-detail.overview-items.label.child-count', 'Child Count:'),\n value: span.childSpanCount,\n },\n ]\n : []),\n ];\n\n const styles = useStyles2(getStyles);\n if (span.kind) {\n overviewItems.push({\n key: KIND,\n label: t('explore.span-detail.label.kind', 'Kind:'),\n value: span.kind,\n });\n }\n if (span.statusCode !== undefined) {\n overviewItems.push({\n key: STATUS,\n label: t('explore.span-detail.label.status', 'Status:'),\n value: SpanStatusCode[span.statusCode].toLowerCase(),\n });\n }\n if (span.statusMessage) {\n overviewItems.push({\n key: STATUS_MESSAGE,\n label: t('explore.span-detail.label.status-message', 'Status Message:'),\n value: span.statusMessage,\n });\n }\n if (span.instrumentationLibraryName) {\n overviewItems.push({\n key: LIBRARY_NAME,\n label: t('explore.span-detail.label.library-name', 'Library Name:'),\n value: span.instrumentationLibraryName,\n });\n }\n if (span.instrumentationLibraryVersion) {\n overviewItems.push({\n key: LIBRARY_VERSION,\n label: t('explore.span-detail.label.library-version', 'Library Version:'),\n value: span.instrumentationLibraryVersion,\n });\n }\n if (span.traceState) {\n overviewItems.push({\n key: TRACE_STATE,\n label: t('explore.span-detail.label.trace-state', 'Trace State:'),\n value: span.traceState,\n });\n }\n\n const linksComponent = getSpanDetailLinkButtons({\n span,\n createSpanLink,\n datasourceType,\n traceToProfilesOptions,\n timeRange,\n app,\n });\n\n const { interpolatedParams, ...focusSpanLink } = createFocusSpanLink(traceID, spanID);\n const resourceLinksGetter = useResourceAttributesExtensionLinks({\n process,\n spanTags: tags,\n datasourceType,\n datasourceUid,\n timeRange,\n });\n\n return (\n <div data-testid=\"span-detail-component\">\n <div className={styles.header}>\n <h6 className={styles.operationName} title={operationName}>\n {operationName}\n </h6>\n <div className={styles.listWrapper}>\n <LabeledList className={styles.list} divider={false} items={overviewItems} color={color} />\n </div>\n <ShareSpanButton focusSpanLink={focusSpanLink} />\n </div>\n <div className={styles.linkList}>{linksComponent}</div>\n <div className={styles.content}>\n <div>\n <AccordianKeyValues\n data={tags}\n label={t('explore.span-detail.label-span-attributes', 'Span attributes')}\n isOpen={isTagsOpen}\n linksGetter={resourceLinksGetter}\n onToggle={() => tagsToggle(spanID)}\n />\n {process.tags && (\n <AccordianKeyValues\n data={process.tags}\n label={t('explore.span-detail.label-resource-attributes', 'Resource attributes')}\n linksGetter={resourceLinksGetter}\n isOpen={isProcessOpen}\n onToggle={() => processToggle(spanID)}\n />\n )}\n </div>\n {logs && logs.length > 0 && (\n <AccordianLogs\n logs={logs}\n isOpen={logsState.isOpen}\n openedItems={logsState.openedItems}\n onToggle={() => logsToggle(spanID)}\n onItemToggle={(logItem) => logItemToggle(spanID, logItem)}\n timestamp={traceStartTime}\n />\n )}\n\n {warnings && warnings.length > 0 && (\n <AccordianKeyValues\n data={warnings.map((warning) => ({\n key: '',\n value: warning,\n type: 'text',\n }))}\n showSummary={false}\n showCountBadge={true}\n isOpen={isWarningsOpen}\n onlyValues={true}\n onToggle={() => warningsToggle(spanID)}\n label={t('explore.span-detail.warnings', 'Warnings')}\n />\n )}\n\n {stackTraces?.length ? (\n <AccordianKeyValues\n data={stackTraces.map((stackTrace) => ({\n key: '',\n value: stackTrace,\n type: 'code',\n }))}\n onlyValues={true}\n showSummary={false}\n showCountBadge={true}\n isOpen={isStackTracesOpen}\n onToggle={() => stackTracesToggle(spanID)}\n label={t('explore.span-detail.label-stack-trace', 'Stack trace')}\n />\n ) : null}\n\n {references && references.length > 0 && (references.length > 1 || references[0].refType !== 'CHILD_OF') && (\n <AccordianReferences\n data={references}\n isOpen={referencesState.isOpen}\n openedItems={referencesState.openedItems}\n onToggle={() => referencesToggle(spanID)}\n onItemToggle={(reference) => referenceItemToggle(spanID, reference)}\n createFocusSpanLink={createFocusSpanLink}\n />\n )}\n {span.tags.some((tag) => tag.key === pyroscopeProfileIdTagKey) && (\n <SpanFlameGraph\n span={span}\n timeZone={timeZone}\n traceFlameGraphs={traceFlameGraphs}\n setTraceFlameGraphs={setTraceFlameGraphs}\n traceToProfilesOptions={traceToProfilesOptions}\n setRedrawListView={setRedrawListView}\n traceDuration={traceDuration}\n traceName={traceName}\n />\n )}\n\n <small className={styles.debugInfo}>\n {/* TODO: fix keyboard a11y */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <a\n {...focusSpanLink}\n onClick={(e) => {\n // click handling logic copied from react router:\n // https://github.com/remix-run/react-router/blob/997b4d67e506d39ac6571cb369d6d2d6b3dda557/packages/react-router-dom/index.tsx#L392-L394s\n if (\n focusSpanLink.onClick &&\n e.button === 0 && // Ignore everything but left clicks\n (!e.currentTarget.target || e.currentTarget.target === '_self') && // Let browser handle \"target=_blank\" etc.\n !(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) // Ignore clicks with modifier keys\n ) {\n e.preventDefault();\n focusSpanLink.onClick(e);\n }\n }}\n >\n <Icon name={'link'} className={cx(alignIcon, styles.LinkIcon)}></Icon>\n </a>\n <span className={styles.debugLabel} data-label=\"SpanID:\" /> {spanID}\n </small>\n </div>\n </div>\n );\n}\n\nexport const getAbsoluteTime = (startTime: number, timeZone: TimeZone) => {\n const dateStr = dateTimeFormat(startTime / 1000, { timeZone, defaultWithMS: true });\n const match = dateStr.split(' ');\n const absoluteTime = match[1] ? match[1] : dateStr;\n return ` (${absoluteTime})`;\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2, TraceKeyValuePair } from '@grafana/data';\nimport { Counter, Icon, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport TNil from '../../types/TNil';\n\nimport * as markers from './AccordianKeyValues.markers';\nimport KeyValuesTable, { KeyValuesTableLink } from './KeyValuesTable';\n\nimport { alignIcon } from '.';\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css({\n textOverflow: 'ellipsis',\n }),\n header: css({\n label: 'header',\n cursor: 'pointer',\n overflow: 'hidden',\n padding: '0.25em 0.1em',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n '&:hover': {\n background: autoColor(theme, '#e8e8e8'),\n },\n }),\n headerLabel: css({\n width: '120px',\n display: 'inline-block',\n }),\n headerEmpty: css({\n label: 'headerEmpty',\n background: 'none',\n cursor: 'initial',\n }),\n headerHighContrast: css({\n label: 'headerHighContrast',\n '&:hover': {\n background: autoColor(theme, '#ddd'),\n },\n }),\n emptyIcon: css({\n label: 'emptyIcon',\n color: autoColor(theme, '#aaa'),\n }),\n summary: css({\n label: 'summary',\n display: 'inline',\n listStyle: 'none',\n padding: 0,\n }),\n summaryItem: css({\n label: 'summaryItem',\n display: 'inline',\n paddingRight: '0.5rem',\n '&:last-child': {\n paddingRight: 0,\n borderRight: 'none',\n },\n }),\n summaryLabel: css({\n label: 'summaryLabel',\n color: autoColor(theme, '#777'),\n paddingRight: '0.5rem',\n }),\n };\n};\n\nexport type AccordianKeyValuesProps = {\n className?: string | TNil;\n data: TraceKeyValuePair[];\n logName?: string;\n highContrast?: boolean;\n interactive?: boolean;\n onlyValues?: boolean;\n showSummary?: boolean;\n showCountBadge?: boolean;\n isOpen: boolean;\n label: string | React.ReactNode;\n linksGetter?: ((pairs: TraceKeyValuePair[], index: number) => KeyValuesTableLink[]) | TNil;\n onToggle?: null | (() => void);\n};\n\ninterface KeyValuesSummaryProps {\n data?: TraceKeyValuePair[] | null;\n}\n\n// export for tests\nexport function KeyValuesSummary({ data = null }: KeyValuesSummaryProps) {\n const styles = useStyles2(getStyles);\n\n if (!Array.isArray(data) || !data.length) {\n return null;\n }\n\n return (\n <ul className={styles.summary}>\n {data.map((item, i) => (\n // `i` is necessary in the key because item.key can repeat\n <li className={styles.summaryItem} key={`${item.key}-${i}`}>\n <span className={styles.summaryLabel}>{item.key}</span>\n {String(item.value)}\n </li>\n ))}\n </ul>\n );\n}\n\nexport default function AccordianKeyValues({\n className = null,\n data,\n logName,\n highContrast = false,\n interactive = true,\n isOpen,\n label,\n linksGetter,\n onlyValues = false,\n showSummary = true,\n showCountBadge = false,\n onToggle = null,\n}: AccordianKeyValuesProps) {\n const isEmpty = (!Array.isArray(data) || !data.length) && !logName;\n const styles = useStyles2(getStyles);\n const iconCls = cx(alignIcon, { [styles.emptyIcon]: isEmpty });\n let arrow: React.ReactNode | null = null;\n let headerProps: {} | null = null;\n const tableFields = logName ? [{ key: 'event name', value: logName }, ...data] : data;\n if (interactive) {\n arrow = isOpen ? (\n <Icon name={'angle-down'} className={iconCls} />\n ) : (\n <Icon name={'angle-right'} className={iconCls} />\n );\n headerProps = {\n 'aria-checked': isOpen,\n onClick: isEmpty ? null : onToggle,\n role: 'switch',\n };\n }\n\n const showDataSummaryFields = showSummary && data.length > 0 && !isOpen;\n\n return (\n <div className={cx(className, styles.container)}>\n <div\n className={cx(styles.header, {\n [styles.headerEmpty]: isEmpty,\n [styles.headerHighContrast]: highContrast && !isEmpty,\n })}\n {...headerProps}\n data-testid=\"AccordianKeyValues--header\"\n >\n {arrow}\n <strong data-test={markers.LABEL} className={styles.headerLabel}>\n {label}\n {showCountBadge ? <Counter value={data.length} variant=\"secondary\" /> : null}\n </strong>\n {showDataSummaryFields && (\n <span className={css({ marginLeft: '0.7em' })}>\n <KeyValuesSummary data={data} />\n </span>\n )}\n </div>\n {isOpen && <KeyValuesTable data={tableFields} linksGetter={linksGetter} onlyValues={onlyValues} />}\n </div>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport { sortBy as _sortBy } from 'lodash';\nimport * as React from 'react';\n\nimport { GrafanaTheme2, TraceLog } from '@grafana/data';\nimport { Trans } from '@grafana/i18n';\nimport { Counter, Icon, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { formatDuration } from '../../utils/date';\n\nimport AccordianKeyValues from './AccordianKeyValues';\n\nimport { alignIcon } from '.';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n AccordianLogs: css({\n label: 'AccordianLogs',\n position: 'relative',\n }),\n AccordianLogsHeader: css({\n label: 'AccordianLogsHeader',\n color: 'inherit',\n display: 'flex',\n alignItems: 'center',\n '&:hover': {\n background: autoColor(theme, '#e8e8e8'),\n },\n }),\n AccordianLogsContent: css({\n label: 'AccordianLogsContent',\n background: autoColor(theme, '#f0f0f0'),\n padding: '0.5rem 0.5rem 0.25rem 0.5rem',\n }),\n AccordianLogsFooter: css({\n label: 'AccordianLogsFooter',\n color: autoColor(theme, '#999'),\n }),\n AccordianKeyValuesItem: css({\n marginBottom: theme.spacing(0.5),\n }),\n parenthesis: css({\n color: `${autoColor(theme, '#777')}`,\n }),\n };\n};\n\nexport type AccordianLogsProps = {\n interactive?: boolean;\n isOpen: boolean;\n logs: TraceLog[];\n onItemToggle?: (log: TraceLog) => void;\n onToggle?: () => void;\n openedItems?: Set<TraceLog>;\n timestamp: number;\n};\n\nexport default function AccordianLogs({\n interactive = true,\n isOpen,\n logs,\n openedItems,\n onItemToggle,\n onToggle,\n timestamp,\n}: AccordianLogsProps) {\n let arrow: React.ReactNode | null = null;\n let HeaderComponent: 'span' | 'a' = 'span';\n let headerProps: {} | null = null;\n if (interactive) {\n arrow = isOpen ? (\n <Icon name={'angle-down'} className={alignIcon} />\n ) : (\n <Icon name={'angle-right'} className=\"u-align-icon\" style={{ margin: '0 0.25rem 0 0' }} />\n );\n HeaderComponent = 'a';\n headerProps = {\n 'aria-checked': isOpen,\n onClick: onToggle,\n role: 'switch',\n };\n }\n\n const styles = useStyles2(getStyles);\n return (\n <div className={styles.AccordianLogs}>\n <HeaderComponent className={styles.AccordianLogsHeader} {...headerProps}>\n {arrow}{' '}\n <strong>\n <Trans i18nKey=\"explore.accordian-logs.events\">Events</Trans>\n </strong>{' '}\n <Counter value={logs.length} variant=\"secondary\" />\n </HeaderComponent>\n {isOpen && (\n <div className={styles.AccordianLogsContent}>\n {_sortBy(logs, 'timestamp').map((log, i) => {\n const formattedDuration = formatDuration(log.timestamp - timestamp);\n const truncateLogNameInSummary = log.name && log.name.length > 20;\n const formattedLogName = log.name && truncateLogNameInSummary ? log.name.slice(0, 20) + '...' : log.name;\n const label = formattedLogName ? (\n <span>\n {formattedDuration} <span>({formattedLogName})</span>\n </span>\n ) : (\n formattedDuration\n );\n return (\n <AccordianKeyValues\n // `i` is necessary in the key because timestamps can repeat\n key={`${log.timestamp}-${i}`}\n className={i < logs.length - 1 ? styles.AccordianKeyValuesItem : null}\n data={log.fields || []}\n logName={truncateLogNameInSummary ? log.name : undefined}\n highContrast\n interactive={interactive}\n isOpen={openedItems ? openedItems.has(log) : false}\n label={label}\n onToggle={interactive && onItemToggle ? () => onItemToggle(log) : null}\n />\n );\n })}\n <small className={styles.AccordianLogsFooter}>\n <Trans i18nKey=\"explore.accordian-logs.footer\">\n Event timestamps are relative to the start time of the full trace.\n </Trans>\n </small>\n </div>\n )}\n </div>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport { groupBy as _groupBy } from 'lodash';\nimport { useState } from 'react';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Trans } from '@grafana/i18n';\nimport { Tooltip, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { Popover } from '../common/Popover';\nimport TNil from '../types/TNil';\nimport { TraceSpan, CriticalPathSection } from '../types/trace';\n\nimport AccordianLogs from './SpanDetail/AccordianLogs';\nimport { ViewedBoundsFunctionType } from './utils';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n wrapper: css({\n label: 'wrapper',\n bottom: 0,\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n overflow: 'hidden',\n zIndex: 0,\n }),\n bar: css({\n label: 'bar',\n borderRadius: theme.shape.radius.default,\n minWidth: '2px',\n position: 'absolute',\n height: '36%',\n top: '32%',\n }),\n rpc: css({\n label: 'rpc',\n position: 'absolute',\n top: '35%',\n bottom: '35%',\n zIndex: 1,\n }),\n label: css({\n label: 'label',\n color: '#aaa',\n fontSize: '12px',\n fontFamily: \"'Helvetica Neue', Helvetica, Arial, sans - serif\",\n lineHeight: '1em',\n whiteSpace: 'nowrap',\n padding: '0 0.5em',\n position: 'absolute',\n }),\n logMarker: css({\n label: 'logMarker',\n backgroundColor: autoColor(theme, '#2c3235'),\n cursor: 'pointer',\n height: '60%',\n minWidth: '1px',\n position: 'absolute',\n top: '20%',\n '&:hover': {\n backgroundColor: autoColor(theme, '#464c54'),\n },\n '&::before, &::after': {\n content: \"''\",\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n border: '1px solid transparent',\n },\n '&::after': {\n left: 0,\n },\n }),\n criticalPath: css({\n position: 'absolute',\n top: '45%',\n height: '11%',\n zIndex: 2,\n overflow: 'hidden',\n background: autoColor(theme, '#f1f1f1'),\n borderLeft: `1px solid ${autoColor(theme, '#2c3235')}`,\n borderRight: `1px solid ${autoColor(theme, '#2c3235')}`,\n }),\n };\n};\n\nexport type Props = {\n color: string;\n onClick?: (evt: React.MouseEvent<HTMLDivElement>) => void;\n viewEnd: number;\n viewStart: number;\n getViewedBounds: ViewedBoundsFunctionType;\n rpc:\n | {\n viewStart: number;\n viewEnd: number;\n color: string;\n }\n | TNil;\n traceStartTime: number;\n span: TraceSpan;\n className?: string;\n labelClassName?: string;\n longLabel: string;\n shortLabel: string;\n criticalPath: CriticalPathSection[];\n};\n\nfunction toPercent(value: number) {\n return `${(value * 100).toFixed(1)}%`;\n}\n\nfunction toPercentInDecimal(value: number) {\n return `${value * 100}%`;\n}\n\nfunction SpanBar({\n criticalPath,\n viewEnd,\n viewStart,\n getViewedBounds,\n color,\n shortLabel,\n longLabel,\n onClick,\n rpc,\n traceStartTime,\n span,\n className,\n labelClassName,\n}: Props) {\n const [label, setLabel] = useState(shortLabel);\n const setShortLabel = () => setLabel(shortLabel);\n const setLongLabel = () => setLabel(longLabel);\n\n // group logs based on timestamps\n const logGroups = _groupBy(span.logs, (log) => {\n const posPercent = getViewedBounds(log.timestamp, log.timestamp).start;\n // round to the nearest 0.2%\n return toPercent(Math.round(posPercent * 500) / 500);\n });\n const styles = useStyles2(getStyles);\n\n return (\n <div\n className={cx(styles.wrapper, className)}\n onBlur={setShortLabel}\n onClick={onClick}\n onFocus={setLongLabel}\n onMouseOut={setShortLabel}\n onMouseOver={setLongLabel}\n aria-hidden\n data-testid={selectors.components.TraceViewer.spanBar}\n >\n <div\n aria-label={label}\n className={cx(styles.bar)}\n style={{\n background: color,\n left: toPercent(viewStart),\n width: toPercent(viewEnd - viewStart),\n }}\n >\n <div className={cx(styles.label, labelClassName)} data-testid=\"SpanBar--label\">\n {label}\n </div>\n </div>\n <div>\n {Object.keys(logGroups).map((positionKey) => (\n <Popover\n key={positionKey}\n content={\n <AccordianLogs interactive={false} isOpen logs={logGroups[positionKey]} timestamp={traceStartTime} />\n }\n >\n <div data-testid=\"SpanBar--logMarker\" className={cx(styles.logMarker)} style={{ left: positionKey }} />\n </Popover>\n ))}\n </div>\n {rpc && (\n <div\n className={cx(styles.rpc)}\n style={{\n background: rpc.color,\n left: toPercent(rpc.viewStart),\n width: toPercent(rpc.viewEnd - rpc.viewStart),\n }}\n />\n )}\n {criticalPath?.map((each, index) => {\n const critcalPathViewBounds = getViewedBounds(each.section_start, each.section_end);\n const criticalPathViewStart = critcalPathViewBounds.start;\n const criticalPathViewEnd = critcalPathViewBounds.end;\n const key = `${each.spanId}-${index}`;\n return (\n <Tooltip\n key={key}\n placement=\"top\"\n content={\n <div>\n <Trans i18nKey=\"explore.span-bar.tooltip-critical-path\">\n A segment on the <em>critical path</em> of the overall trace / request / workflow.\n </Trans>\n </div>\n }\n >\n <div\n data-testid=\"SpanBar--criticalPath\"\n className={styles.criticalPath}\n style={{\n left: toPercentInDecimal(criticalPathViewStart),\n width: toPercentInDecimal(criticalPathViewEnd - criticalPathViewStart),\n }}\n />\n </Tooltip>\n );\n })}\n </div>\n );\n}\n\nexport default React.memo(SpanBar);\n","import { css } from '@emotion/css';\nimport { useState } from 'react';\n\nimport { config, reportInteraction } from '@grafana/runtime';\nimport { useStyles2, MenuItem, Icon, ContextMenu } from '@grafana/ui';\n\nimport { SpanLinkDef } from '../types/links';\n\ninterface SpanLinksProps {\n links: SpanLinkDef[];\n datasourceType: string;\n color: string;\n}\n\nconst renderMenuItems = (\n links: SpanLinkDef[],\n styles: ReturnType<typeof getStyles>,\n closeMenu: () => void,\n datasourceType: string\n) => {\n links.sort(function (linkA, linkB) {\n return (linkA.title || 'link').toLowerCase().localeCompare((linkB.title || 'link').toLowerCase());\n });\n\n return links.map((link, i) => (\n <MenuItem\n key={i}\n label={link.title || 'Link'}\n onClick={\n link.onClick\n ? (event) => {\n reportInteraction(`grafana_traces_trace_view_span_link_clicked`, {\n datasourceType: datasourceType,\n grafana_version: config.buildInfo.version,\n type: link.type,\n location: 'menu',\n });\n event?.preventDefault();\n link.onClick!(event);\n closeMenu();\n }\n : undefined\n }\n url={link.href}\n target={link.target}\n className={styles.menuItem}\n />\n ));\n};\n\nexport const SpanLinksMenu = ({ links, datasourceType, color }: SpanLinksProps) => {\n const styles = useStyles2(() => getStyles(color));\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 });\n\n const closeMenu = () => setIsMenuOpen(false);\n\n return (\n <div data-testid=\"SpanLinksMenu\" className={styles.wrapper}>\n <button\n onClick={(e) => {\n setIsMenuOpen(true);\n setMenuPosition({\n x: e.clientX,\n y: e.clientY,\n });\n }}\n className={styles.button}\n >\n <Icon name=\"link\" className={styles.icon} />\n </button>\n\n {isMenuOpen ? (\n <ContextMenu\n onClose={() => setIsMenuOpen(false)}\n renderMenuItems={() => renderMenuItems(links, styles, closeMenu, datasourceType)}\n focusOnOpen={false}\n x={menuPosition.x}\n y={menuPosition.y}\n />\n ) : null}\n </div>\n );\n};\n\nconst getStyles = (color: string) => ({\n wrapper: css({\n border: 'none',\n background: `${color}10`,\n borderBottom: `1px solid ${color}CF`,\n paddingRight: '4px',\n }),\n button: css({\n background: 'transparent',\n border: 'none',\n padding: 0,\n }),\n icon: css({\n background: 'transparent',\n border: 'none',\n padding: 0,\n }),\n menuItem: css({\n maxWidth: '60ch',\n overflow: 'hidden',\n }),\n});\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { find as _find, get as _get } from 'lodash';\n\nimport TNil from '../types/TNil';\nimport { TraceSpan } from '../types/trace';\n\nfunction getFirstAncestor(span: TraceSpan): TraceSpan | TNil {\n return _get(\n _find(\n span.references,\n ({ span: ref, refType }) => ref && ref.spanID && (refType === 'CHILD_OF' || refType === 'FOLLOWS_FROM')\n ),\n 'span'\n );\n}\n\nexport default function spanAncestorIds(span: TraceSpan | TNil): string[] {\n const ancestorIDs: string[] = [];\n if (!span) {\n return ancestorIDs;\n }\n let ref = getFirstAncestor(span);\n while (ref) {\n ancestorIDs.push(ref.spanID);\n ref = getFirstAncestor(ref);\n }\n return ancestorIDs;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport { get as _get } from 'lodash';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { TraceSpan } from '../types/trace';\nimport spanAncestorIds from '../utils/span-ancestor-ids';\n\nexport const getStyles = stylesFactory((theme: GrafanaTheme2) => ({\n SpanTreeOffset: css({\n label: 'SpanTreeOffset',\n color: autoColor(theme, '#000'),\n position: 'relative',\n }),\n SpanTreeOffsetParent: css({\n label: 'SpanTreeOffsetParent',\n '&:hover': {\n cursor: 'pointer',\n },\n }),\n indentGuide: css({\n label: 'indentGuide',\n /* The size of the indentGuide is based off of the iconWrapper */\n paddingRight: '1rem',\n height: '100%',\n display: 'inline-flex',\n [theme.transitions.handleMotion('no-preference')]: {\n transition: 'padding 300ms ease-out',\n },\n '&::before': {\n content: '\"\"',\n paddingLeft: '1px',\n backgroundColor: autoColor(theme, 'lightgrey'),\n },\n }),\n indentGuideActive: css({\n label: 'indentGuideActive',\n '&::before': {\n backgroundColor: autoColor(theme, '#777'),\n },\n }),\n indentGuideThin: css({\n paddingRight: '0.3rem',\n }),\n iconWrapper: css({\n label: 'iconWrapper',\n position: 'absolute',\n right: 0,\n }),\n}));\n\nexport type TProps = {\n childrenVisible?: boolean;\n onClick?: () => void;\n span: TraceSpan;\n showChildrenIcon?: boolean;\n\n hoverIndentGuideIds: Set<string>;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n theme: GrafanaTheme2;\n visibleSpanIds: string[];\n};\n\nexport class UnthemedSpanTreeOffset extends React.PureComponent<TProps> {\n static displayName = 'UnthemedSpanTreeOffset';\n\n ancestorIds: string[];\n\n static defaultProps = {\n childrenVisible: false,\n showChildrenIcon: true,\n };\n\n constructor(props: TProps) {\n super(props);\n\n this.ancestorIds = spanAncestorIds(props.span);\n // Some traces have multiple root-level spans, this connects them all under one guideline and adds the\n // necessary padding for the collapse icon on root-level spans.\n this.ancestorIds.push('root');\n\n this.ancestorIds.reverse();\n }\n\n /**\n * If the mouse leaves to anywhere except another span with the same ancestor id, this span's ancestor id is\n * removed from the set of hoverIndentGuideIds.\n *\n * @param {Object} event - React Synthetic event tied to mouseleave. Includes the related target which is\n * the element the user is now hovering.\n * @param {string} ancestorId - The span id that the user was hovering over.\n */\n handleMouseLeave = (event: React.MouseEvent<HTMLSpanElement>, ancestorId: string) => {\n if (\n !(event.relatedTarget instanceof HTMLSpanElement) ||\n _get(event, 'relatedTarget.dataset.ancestorId') !== ancestorId\n ) {\n this.props.removeHoverIndentGuideId(ancestorId);\n }\n };\n\n /**\n * If the mouse entered this span from anywhere except another span with the same ancestor id, this span's\n * ancestorId is added to the set of hoverIndentGuideIds.\n *\n * @param {Object} event - React Synthetic event tied to mouseenter. Includes the related target which is\n * the last element the user was hovering.\n * @param {string} ancestorId - The span id that the user is now hovering over.\n */\n handleMouseEnter = (event: React.MouseEvent<HTMLSpanElement>, ancestorId: string) => {\n if (\n !(event.relatedTarget instanceof HTMLSpanElement) ||\n _get(event, 'relatedTarget.dataset.ancestorId') !== ancestorId\n ) {\n this.props.addHoverIndentGuideId(ancestorId);\n }\n };\n\n render() {\n const { childrenVisible, onClick, showChildrenIcon, span, theme, visibleSpanIds } = this.props;\n const { hasChildren, spanID } = span;\n const wrapperProps = hasChildren ? { onClick, role: 'switch', 'aria-checked': childrenVisible } : null;\n const icon =\n showChildrenIcon &&\n hasChildren &&\n (childrenVisible ? (\n <Icon name={'angle-down'} data-testid=\"icon-arrow-down\" size={'sm'} />\n ) : (\n <Icon name={'angle-right'} data-testid=\"icon-arrow-right\" size={'sm'} />\n ));\n const styles = getStyles(theme);\n\n return (\n <span className={cx(styles.SpanTreeOffset, { [styles.SpanTreeOffsetParent]: hasChildren })} {...wrapperProps}>\n {this.ancestorIds.map((ancestorId, index) => (\n <span\n key={ancestorId}\n className={cx(styles.indentGuide, {\n [styles.indentGuideActive]: this.props.hoverIndentGuideIds.has(ancestorId),\n [styles.indentGuideThin]:\n index !== this.ancestorIds.length - 1 && ancestorId !== 'root' && !visibleSpanIds.includes(ancestorId),\n })}\n data-ancestor-id={ancestorId}\n data-testid=\"SpanTreeOffset--indentGuide\"\n onMouseEnter={(event) => this.handleMouseEnter(event, ancestorId)}\n onMouseLeave={(event) => this.handleMouseLeave(event, ancestorId)}\n />\n ))}\n {icon && (\n <span\n className={styles.iconWrapper}\n onMouseEnter={(event) => this.handleMouseEnter(event, spanID)}\n onMouseLeave={(event) => this.handleMouseLeave(event, spanID)}\n data-testid=\"icon-wrapper\"\n >\n {icon}\n </span>\n )}\n </span>\n );\n }\n}\n\nexport default withTheme2(UnthemedSpanTreeOffset);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, keyframes } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2, TraceKeyValuePair } from '@grafana/data';\nimport { DURATION, NONE, TAG } from '@grafana/o11y-ds-frontend';\nimport { Icon, stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { SpanBarOptions } from '../settings/SpanBarSettings';\nimport TNil from '../types/TNil';\nimport { SpanLinkFunc } from '../types/links';\nimport { TraceSpan, CriticalPathSection } from '../types/trace';\nimport { formatDuration } from '../utils/date';\n\nimport SpanBar from './SpanBar';\nimport { SpanLinksMenu } from './SpanLinks';\nimport SpanTreeOffset from './SpanTreeOffset';\nimport Ticks from './Ticks';\nimport TimelineRow from './TimelineRow';\nimport { ViewedBoundsFunctionType } from './utils';\n\nconst spanBarClassName = 'spanBar';\nconst spanBarLabelClassName = 'spanBarLabel';\nconst nameWrapperClassName = 'nameWrapper';\nconst nameWrapperMatchingFilterClassName = 'nameWrapperMatchingFilter';\nconst viewClassName = 'jaegerView';\nconst nameColumnClassName = 'nameColumn';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2, showSpanFilterMatchesOnly: boolean) => {\n const animations = {\n flash: keyframes`\n from {\n background-color: ${autoColor(theme, '#68b9ff')};\n }\n to {\n background-color: 'default';\n }\n `,\n };\n const backgroundColor = showSpanFilterMatchesOnly ? '' : autoColor(theme, '#fffce4');\n\n return {\n nameWrapper: css({\n label: 'nameWrapper',\n lineHeight: '27px',\n overflow: 'hidden',\n display: 'flex',\n }),\n nameWrapperMatchingFilter: css({\n label: 'nameWrapperMatchingFilter',\n backgroundColor: backgroundColor,\n }),\n nameColumn: css({\n label: 'nameColumn',\n position: 'relative',\n whiteSpace: 'nowrap',\n zIndex: 1,\n '&:hover': {\n zIndex: 1,\n },\n }),\n endpointName: css({\n label: 'endpointName',\n color: autoColor(theme, '#484848'),\n fontSize: '0.9em',\n }),\n view: css({\n label: 'view',\n position: 'relative',\n }),\n viewExpanded: css({\n label: 'viewExpanded',\n background: autoColor(theme, '#f8f8f8'),\n outline: `1px solid ${autoColor(theme, '#ddd')}`,\n }),\n viewExpandedAndMatchingFilter: css({\n label: 'viewExpandedAndMatchingFilter',\n background: autoColor(theme, '#fff3d7'),\n outline: `1px solid ${autoColor(theme, '#ddd')}`,\n }),\n row: css({\n label: 'row',\n fontSize: '0.9em',\n [`&:hover .${spanBarClassName}`]: {\n opacity: 1,\n },\n [`&:hover .${spanBarLabelClassName}`]: {\n color: autoColor(theme, '#000'),\n },\n [`&:hover .${nameWrapperClassName}`]: {\n background: `linear-gradient(\n 90deg,\n ${autoColor(theme, '#fafafa')},\n ${autoColor(theme, '#f8f8f8')} 75%,\n ${autoColor(theme, '#eee')}\n )`,\n },\n [`&:hover .${viewClassName}`]: {\n backgroundColor: autoColor(theme, '#f5f5f5'),\n outline: `1px solid ${autoColor(theme, '#ddd')}`,\n },\n }),\n rowClippingLeft: css({\n label: 'rowClippingLeft',\n [`& .${nameColumnClassName}::before`]: {\n content: '\" \"',\n height: '100%',\n position: 'absolute',\n width: '6px',\n backgroundImage: `linear-gradient(\n to right,\n ${autoColor(theme, 'rgba(25, 25, 25, 0.25)')},\n ${autoColor(theme, 'rgba(32, 32, 32, 0)')}\n )`,\n left: '100%',\n zIndex: -1,\n },\n }),\n rowClippingRight: css({\n label: 'rowClippingRight',\n [`& .${viewClassName}::before`]: {\n content: '\" \"',\n height: '100%',\n position: 'absolute',\n width: '6px',\n backgroundImage: `linear-gradient(\n to left,\n ${autoColor(theme, 'rgba(25, 25, 25, 0.25)')},\n ${autoColor(theme, 'rgba(25, 25, 25, 0.25)')}\n )`,\n right: '0%',\n zIndex: 1,\n },\n }),\n rowExpanded: css({\n label: 'rowExpanded',\n [`& .${spanBarClassName}`]: {\n opacity: 1,\n },\n [`& .${spanBarLabelClassName}`]: {\n color: autoColor(theme, '#000'),\n },\n [`& .${nameWrapperClassName}, &:hover .${nameWrapperClassName}`]: {\n background: autoColor(theme, '#f0f0f0'),\n boxShadow: `0 1px 0 ${autoColor(theme, '#ddd')}`,\n },\n [`& .${nameWrapperMatchingFilterClassName}`]: {\n background: autoColor(theme, '#fff3d7'),\n },\n [`&:hover .${viewClassName}`]: {\n background: autoColor(theme, '#eee'),\n },\n }),\n rowMatchingFilter: css({\n label: 'rowMatchingFilter',\n // background-color: ${autoColor(theme, '#fffbde')};\n [`&:hover .${nameWrapperClassName}`]: {\n background: `linear-gradient(\n 90deg,\n ${autoColor(theme, '#fffbde')},\n ${autoColor(theme, '#fffbde')} 75%,\n ${autoColor(theme, '#f7f1c6')}\n )`,\n },\n [`&:hover .${viewClassName}`]: {\n backgroundColor: autoColor(theme, '#f7f1c6'),\n outline: `1px solid ${autoColor(theme, '#ddd')}`,\n },\n }),\n rowFocused: css({\n label: 'rowFocused',\n backgroundColor: autoColor(theme, '#cbe7ff'),\n [theme.transitions.handleMotion('no-preference', 'reduce')]: {\n animation: `${animations.flash} 1s cubic-bezier(0.12, 0, 0.39, 0)`,\n },\n [`& .${nameWrapperClassName}, .${viewClassName}, .${nameWrapperMatchingFilterClassName}`]: {\n backgroundColor: autoColor(theme, '#cbe7ff'),\n [theme.transitions.handleMotion('no-preference')]: {\n animation: `${animations.flash} 1s cubic-bezier(0.12, 0, 0.39, 0)`,\n },\n },\n [`& .${spanBarClassName}`]: {\n opacity: 1,\n },\n [`& .${spanBarLabelClassName}`]: {\n color: autoColor(theme, '#000'),\n },\n ['&:hover .${nameWrapperClassName}, :hover .${viewClassName}']: {\n background: autoColor(theme, '#d5ebff'),\n boxShadow: `0 1px 0 ${autoColor(theme, '#ddd')}`,\n },\n }),\n\n rowExpandedAndMatchingFilter: css({\n label: 'rowExpandedAndMatchingFilter',\n [`&:hover .${viewClassName}`]: {\n background: autoColor(theme, '#ffeccf'),\n },\n }),\n\n name: css({\n label: 'name',\n color: autoColor(theme, '#000'),\n cursor: 'pointer',\n flex: '1 1 auto',\n outline: 'none',\n overflowY: 'hidden',\n overflowX: 'auto',\n paddingLeft: '4px',\n paddingRight: '0.25em',\n position: 'relative',\n '-ms-overflow-style': 'none',\n scrollbarWidth: 'none',\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n '&:focus': {\n textDecoration: 'none',\n },\n '&:hover > span': {\n color: autoColor(theme, '#000'),\n },\n textAlign: 'left',\n background: 'transparent',\n border: 'none',\n borderBottomWidth: '1px',\n borderBottomStyle: 'solid',\n }),\n nameDetailExpanded: css({\n label: 'nameDetailExpanded',\n '&::before': {\n bottom: 0,\n },\n }),\n svcName: css({\n label: 'svcName',\n fontSize: '0.9em',\n fontWeight: 'bold',\n marginRight: '0.25rem',\n }),\n svcNameChildrenCollapsed: css({\n label: 'svcNameChildrenCollapsed',\n fontWeight: 'bold',\n fontStyle: 'italic',\n }),\n errorIcon: css({\n label: 'errorIcon',\n // eslint-disable-next-line @grafana/no-border-radius-literal\n borderRadius: '6.5px',\n color: autoColor(theme, '#fff'),\n fontSize: '0.85em',\n marginRight: '0.25rem',\n padding: '1px',\n }),\n rpcColorMarker: css({\n label: 'rpcColorMarker',\n // eslint-disable-next-line @grafana/no-border-radius-literal\n borderRadius: '6.5px',\n display: 'inline-block',\n fontSize: '0.85em',\n height: '1em',\n marginRight: '0.25rem',\n padding: '1px',\n width: '1em',\n verticalAlign: 'middle',\n }),\n labelRight: css({\n label: 'labelRight',\n left: '100%',\n }),\n labelLeft: css({\n label: 'labelLeft',\n right: '100%',\n }),\n };\n});\n\nexport type SpanBarRowProps = {\n className?: string;\n theme: GrafanaTheme2;\n color: string;\n spanBarOptions: SpanBarOptions | undefined;\n columnDivision: number;\n isChildrenExpanded: boolean;\n isDetailExpanded: boolean;\n isMatchingFilter: boolean;\n isFocused: boolean;\n showSpanFilterMatchesOnly: boolean;\n onDetailToggled: (spanID: string) => void;\n onChildrenToggled: (spanID: string) => void;\n numTicks: number;\n showServiceName: boolean;\n rpc?:\n | {\n viewStart: number;\n viewEnd: number;\n color: string;\n operationName: string;\n serviceName: string;\n }\n | TNil;\n noInstrumentedServer?:\n | {\n color: string;\n serviceName: string;\n }\n | TNil;\n showErrorIcon: boolean;\n getViewedBounds: ViewedBoundsFunctionType;\n traceStartTime: number;\n span: TraceSpan;\n hoverIndentGuideIds: Set<string>;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n clippingLeft?: boolean;\n clippingRight?: boolean;\n createSpanLink?: SpanLinkFunc;\n datasourceType: string;\n visibleSpanIds: string[];\n criticalPath: CriticalPathSection[];\n};\n\n/**\n * This was originally a stateless function, but changing to a PureComponent\n * reduced the render time of expanding a span row detail by ~50%. This is\n * even true in the case where the stateless function has the same prop types as\n * this class and arrow functions are created in the stateless function as\n * handlers to the onClick props. E.g. for now, the PureComponent is more\n * performance than the stateless function.\n */\nexport class UnthemedSpanBarRow extends React.PureComponent<SpanBarRowProps> {\n static displayName = 'UnthemedSpanBarRow';\n static defaultProps: Partial<SpanBarRowProps> = {\n className: '',\n rpc: null,\n };\n\n _detailToggle = () => {\n this.props.onDetailToggled(this.props.span.spanID);\n };\n\n _childrenToggle = () => {\n this.props.onChildrenToggled(this.props.span.spanID);\n };\n\n render() {\n const {\n className,\n color,\n spanBarOptions,\n columnDivision,\n isChildrenExpanded,\n isDetailExpanded,\n isMatchingFilter,\n showSpanFilterMatchesOnly,\n isFocused,\n numTicks,\n rpc,\n noInstrumentedServer,\n showErrorIcon,\n getViewedBounds,\n traceStartTime,\n span,\n hoverIndentGuideIds,\n addHoverIndentGuideId,\n removeHoverIndentGuideId,\n clippingLeft,\n clippingRight,\n theme,\n createSpanLink,\n datasourceType,\n showServiceName,\n visibleSpanIds,\n criticalPath,\n } = this.props;\n const {\n duration,\n hasChildren: isParent,\n operationName,\n process: { serviceName },\n } = span;\n const label = formatDuration(duration);\n\n const viewBounds = getViewedBounds(span.startTime, span.startTime + span.duration);\n const viewStart = viewBounds.start;\n const viewEnd = viewBounds.end;\n const styles = getStyles(theme, showSpanFilterMatchesOnly);\n\n const labelDetail = `${serviceName}::${operationName}`;\n let longLabel;\n let hintClassName;\n if (viewStart > 1 - viewEnd) {\n longLabel = `${labelDetail} | ${label}`;\n hintClassName = styles.labelLeft;\n } else {\n longLabel = `${label} | ${labelDetail}`;\n hintClassName = styles.labelRight;\n }\n\n return (\n <TimelineRow\n className={cx(\n styles.row,\n {\n [styles.rowExpanded]: isDetailExpanded,\n [styles.rowMatchingFilter]: isMatchingFilter,\n [styles.rowExpandedAndMatchingFilter]: isMatchingFilter && isDetailExpanded,\n [styles.rowFocused]: isFocused,\n [styles.rowClippingLeft]: clippingLeft,\n [styles.rowClippingRight]: clippingRight,\n },\n className\n )}\n >\n <TimelineRow.Cell className={cx(styles.nameColumn, nameColumnClassName)} width={columnDivision}>\n <div\n className={cx(styles.nameWrapper, nameWrapperClassName, {\n [styles.nameWrapperMatchingFilter]: isMatchingFilter,\n nameWrapperMatchingFilter: isMatchingFilter,\n })}\n >\n <SpanTreeOffset\n onClick={isParent ? this._childrenToggle : undefined}\n childrenVisible={isChildrenExpanded}\n span={span}\n hoverIndentGuideIds={hoverIndentGuideIds}\n addHoverIndentGuideId={addHoverIndentGuideId}\n removeHoverIndentGuideId={removeHoverIndentGuideId}\n visibleSpanIds={visibleSpanIds}\n />\n <button\n type=\"button\"\n className={cx(styles.name, { [styles.nameDetailExpanded]: isDetailExpanded })}\n aria-checked={isDetailExpanded}\n title={labelDetail}\n onClick={this._detailToggle}\n role=\"switch\"\n style={{ background: `${color}10`, borderBottomColor: `${color}CF` }}\n tabIndex={0}\n >\n {showErrorIcon && (\n <Icon\n name={'exclamation-circle'}\n style={{\n backgroundColor: span.errorIconColor\n ? autoColor(theme, span.errorIconColor)\n : autoColor(theme, '#db2828'),\n }}\n className={styles.errorIcon}\n />\n )}\n {showServiceName && (\n <span\n className={cx(styles.svcName, {\n [styles.svcNameChildrenCollapsed]: isParent && !isChildrenExpanded,\n })}\n >\n {`${serviceName} `}\n </span>\n )}\n {rpc && (\n <span>\n <Icon name={'arrow-right'} />{' '}\n <i className={styles.rpcColorMarker} style={{ background: rpc.color }} />\n {rpc.serviceName}\n </span>\n )}\n {noInstrumentedServer && (\n <span>\n <Icon name={'arrow-right'} />{' '}\n <i className={styles.rpcColorMarker} style={{ background: noInstrumentedServer.color }} />\n {noInstrumentedServer.serviceName}\n </span>\n )}\n <span className={styles.endpointName}>{rpc ? rpc.operationName : operationName}</span>\n <span className={styles.endpointName}> {this.getSpanBarLabel(span, spanBarOptions, label)}</span>\n </button>\n {createSpanLink &&\n (() => {\n const links = createSpanLink(span);\n const count = links?.length || 0;\n if (links && count === 1) {\n if (!links[0]) {\n return null;\n }\n\n return (\n <a\n href={links[0].href}\n // Needs to have target otherwise preventDefault would not work due to angularRouter.\n target={'_blank'}\n style={{ background: `${color}10`, borderBottom: `1px solid ${color}CF`, paddingRight: '4px' }}\n rel=\"noopener noreferrer\"\n onClick={\n links[0].onClick\n ? (event) => {\n if (!(event.ctrlKey || event.metaKey || event.shiftKey) && links[0].onClick) {\n event.preventDefault();\n links[0].onClick(event);\n }\n }\n : undefined\n }\n >\n {links[0].content}\n </a>\n );\n } else if (links && count > 1) {\n return <SpanLinksMenu links={links} datasourceType={datasourceType} color={color} />;\n } else {\n return null;\n }\n })()}\n </div>\n </TimelineRow.Cell>\n <TimelineRow.Cell\n className={cx(styles.view, viewClassName, {\n [styles.viewExpanded]: isDetailExpanded,\n [styles.viewExpandedAndMatchingFilter]: isMatchingFilter && isDetailExpanded,\n })}\n data-testid=\"span-view\"\n style={{ cursor: 'pointer' }}\n width={1 - columnDivision}\n onClick={this._detailToggle}\n >\n <Ticks numTicks={numTicks} />\n <SpanBar\n criticalPath={criticalPath}\n rpc={rpc}\n viewStart={viewStart}\n viewEnd={viewEnd}\n getViewedBounds={getViewedBounds}\n color={color}\n shortLabel={label}\n longLabel={longLabel}\n traceStartTime={traceStartTime}\n span={span}\n labelClassName={`${spanBarLabelClassName} ${hintClassName}`}\n className={spanBarClassName}\n />\n </TimelineRow.Cell>\n </TimelineRow>\n );\n }\n\n getSpanBarLabel = (span: TraceSpan, spanBarOptions: SpanBarOptions | undefined, duration: string) => {\n const type = spanBarOptions?.type ?? '';\n\n if (type === NONE) {\n return '';\n } else if (type === '' || type === DURATION) {\n return `(${duration})`;\n } else if (type === TAG) {\n const tagKey = spanBarOptions?.tag?.trim() ?? '';\n if (tagKey !== '' && span.tags) {\n const tag = span.tags?.find((tag: TraceKeyValuePair) => {\n return tag.key === tagKey;\n });\n if (tag) {\n return `(${tag.value})`;\n }\n\n const process = span.process?.tags?.find((process: TraceKeyValuePair) => {\n return process.key === tagKey;\n });\n if (process) {\n return `(${process.value})`;\n }\n }\n }\n\n return '';\n };\n}\n\nexport default withTheme2(UnthemedSpanBarRow);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport { PureComponent } from 'react';\n\nimport { CoreApp, GrafanaTheme2, LinkModel, TimeRange, TraceLog } from '@grafana/data';\nimport { TraceToProfilesOptions } from '@grafana/o11y-ds-frontend';\nimport { TimeZone } from '@grafana/schema';\nimport { stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { SpanLinkFunc } from '../types/links';\nimport { TraceSpan, TraceSpanReference } from '../types/trace';\n\nimport SpanDetail, { TraceFlameGraphs } from './SpanDetail';\nimport DetailState from './SpanDetail/DetailState';\nimport SpanTreeOffset from './SpanTreeOffset';\nimport TimelineRow from './TimelineRow';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n expandedAccent: css({\n cursor: 'pointer',\n height: '100%',\n overflow: 'hidden',\n position: 'absolute',\n width: '100%',\n '&::before': {\n borderLeft: '1px solid',\n pointerEvents: 'none',\n width: '1000px',\n },\n '&::after': {\n borderRight: '1000px solid',\n borderColor: 'inherit',\n cursor: 'pointer',\n opacity: 0.2,\n },\n\n /* border-color inherit must come AFTER other border declarations for accent */\n '&::before, &::after': {\n borderColor: 'inherit',\n content: '\" \"',\n position: 'absolute',\n height: '100%',\n },\n\n '&:hover::after': {\n opacity: 0.35,\n },\n }),\n infoWrapper: css({\n label: 'infoWrapper',\n padding: '0.75rem',\n }),\n cell: css({\n label: 'cell',\n display: 'flex !important',\n width: '100% !important',\n }),\n indentSpacer: css({\n label: 'indentSpacer',\n flex: 'none',\n }),\n detailWrapper: css({\n label: 'detailWrapper',\n flex: '1',\n minWidth: 0,\n }),\n };\n});\n\nexport type SpanDetailRowProps = {\n color: string;\n columnDivision: number;\n detailState: DetailState;\n onDetailToggled: (spanID: string) => void;\n logItemToggle: (spanID: string, log: TraceLog) => void;\n logsToggle: (spanID: string) => void;\n processToggle: (spanID: string) => void;\n referenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n referencesToggle: (spanID: string) => void;\n warningsToggle: (spanID: string) => void;\n stackTracesToggle: (spanID: string) => void;\n span: TraceSpan;\n traceToProfilesOptions?: TraceToProfilesOptions;\n timeZone: TimeZone;\n tagsToggle: (spanID: string) => void;\n traceStartTime: number;\n traceDuration: number;\n traceName: string;\n hoverIndentGuideIds: Set<string>;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n theme: GrafanaTheme2;\n createSpanLink?: SpanLinkFunc;\n focusedSpanId?: string;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n datasourceType: string;\n datasourceUid: string;\n visibleSpanIds: string[];\n traceFlameGraphs: TraceFlameGraphs;\n setTraceFlameGraphs: (flameGraphs: TraceFlameGraphs) => void;\n setRedrawListView: (redraw: {}) => void;\n timeRange: TimeRange;\n app: CoreApp;\n};\n\nexport class UnthemedSpanDetailRow extends PureComponent<SpanDetailRowProps> {\n _detailToggle = () => {\n this.props.onDetailToggled(this.props.span.spanID);\n };\n\n render() {\n const {\n color,\n detailState,\n logItemToggle,\n logsToggle,\n processToggle,\n referenceItemToggle,\n referencesToggle,\n warningsToggle,\n stackTracesToggle,\n span,\n traceToProfilesOptions,\n timeZone,\n tagsToggle,\n traceStartTime,\n traceDuration,\n traceName,\n theme,\n createSpanLink,\n focusedSpanId,\n createFocusSpanLink,\n datasourceType,\n datasourceUid,\n traceFlameGraphs,\n setTraceFlameGraphs,\n setRedrawListView,\n timeRange,\n app,\n hoverIndentGuideIds,\n addHoverIndentGuideId,\n removeHoverIndentGuideId,\n visibleSpanIds,\n } = this.props;\n const styles = getStyles(theme);\n return (\n <TimelineRow>\n <TimelineRow.Cell width={1} className={styles.cell}>\n <div className={styles.indentSpacer}>\n <SpanTreeOffset\n span={span}\n showChildrenIcon={false}\n hoverIndentGuideIds={hoverIndentGuideIds}\n addHoverIndentGuideId={addHoverIndentGuideId}\n removeHoverIndentGuideId={removeHoverIndentGuideId}\n visibleSpanIds={visibleSpanIds}\n />\n </div>\n <div className={styles.detailWrapper}>\n <div className={styles.infoWrapper} style={{ borderTopColor: color }}>\n <SpanDetail\n color={color}\n detailState={detailState}\n logItemToggle={logItemToggle}\n logsToggle={logsToggle}\n processToggle={processToggle}\n referenceItemToggle={referenceItemToggle}\n referencesToggle={referencesToggle}\n warningsToggle={warningsToggle}\n stackTracesToggle={stackTracesToggle}\n span={span}\n traceToProfilesOptions={traceToProfilesOptions}\n timeZone={timeZone}\n tagsToggle={tagsToggle}\n traceStartTime={traceStartTime}\n traceDuration={traceDuration}\n traceName={traceName}\n createSpanLink={createSpanLink}\n focusedSpanId={focusedSpanId}\n createFocusSpanLink={createFocusSpanLink}\n datasourceType={datasourceType}\n datasourceUid={datasourceUid}\n traceFlameGraphs={traceFlameGraphs}\n setTraceFlameGraphs={setTraceFlameGraphs}\n setRedrawListView={setRedrawListView}\n timeRange={timeRange}\n app={app}\n />\n </div>\n </div>\n </TimelineRow.Cell>\n </TimelineRow>\n );\n }\n}\n\nexport default withTheme2(UnthemedSpanDetailRow);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceSpan } from '../types/trace';\n\nexport type ViewedBoundsFunctionType = (start: number, end: number) => { start: number; end: number };\n/**\n * Given a range (`min`, `max`) and factoring in a zoom (`viewStart`, `viewEnd`)\n * a function is created that will find the position of a sub-range (`start`, `end`).\n * The calling the generated method will return the result as a `{ start, end }`\n * object with values ranging in [0, 1].\n *\n * @param {number} min The start of the outer range.\n * @param {number} max The end of the outer range.\n * @param {number} viewStart The start of the zoom, on a range of [0, 1],\n * relative to the `min`, `max`.\n * @param {number} viewEnd The end of the zoom, on a range of [0, 1],\n * relative to the `min`, `max`.\n * @returns {(number, number) => Object} Created view bounds function\n */\nexport function createViewedBoundsFunc(viewRange: { min: number; max: number; viewStart: number; viewEnd: number }) {\n const { min, max, viewStart, viewEnd } = viewRange;\n const duration = max - min;\n const viewMin = min + viewStart * duration;\n const viewMax = max - (1 - viewEnd) * duration;\n const viewWindow = viewMax - viewMin;\n\n /**\n * View bounds function\n * @param {number} start The start of the sub-range.\n * @param {number} end The end of the sub-range.\n * @returns {Object} The resultant range.\n */\n return (start: number, end: number) => ({\n start: (start - viewMin) / viewWindow,\n end: (end - viewMin) / viewWindow,\n });\n}\n\n/**\n * Returns `true` if the `span` has a tag matching `key` = `value`.\n *\n * @param {string} key The tag key to match on.\n * @param {any} value The tag value to match.\n * @param {{tag}} span An object with a `tag` property of { key, value } items.\n * @returns {boolean} True if a match was found.\n */\nexport function spanHasTag(key: string, value: unknown, span: TraceSpan) {\n if (!Array.isArray(span.tags) || !span.tags.length) {\n return false;\n }\n return span.tags.some((tag) => tag.key === key && tag.value === value);\n}\n\nconst isClientOtel = (span: TraceSpan) => span.kind === 'client';\nconst isClient = spanHasTag.bind(null, 'span.kind', 'client');\nexport const isClientSpan = (span: TraceSpan) => isClientOtel(span) || isClient(span);\nconst isServerOtel = (span: TraceSpan) => span.kind === 'server';\nconst isServer = spanHasTag.bind(null, 'span.kind', 'server');\nexport const isServerSpan = (span: TraceSpan) => isServerOtel(span) || isServer(span);\n\nconst isErrorOtel = (span: TraceSpan) => span.statusCode === 2;\nconst isErrorBool = spanHasTag.bind(null, 'error', true);\nconst isErrorStr = spanHasTag.bind(null, 'error', 'true');\nexport const isErrorSpan = (span: TraceSpan) => isErrorOtel(span) || isErrorBool(span) || isErrorStr(span);\n\n/**\n * Returns `true` if at least one of the descendants of the `parentSpanIndex`\n * span contains an error tag.\n *\n * @param {TraceSpan[]} spans The spans for a trace - should be\n * sorted with children following parents.\n * @param {number} parentSpanIndex The index of the parent span - only\n * subsequent spans with depth less than\n * the parent span will be checked.\n * @returns {boolean} Returns `true` if a descendant contains an error tag.\n */\nexport function spanContainsErredSpan(spans: TraceSpan[], parentSpanIndex: number) {\n const { depth } = spans[parentSpanIndex];\n let i = parentSpanIndex + 1;\n for (; i < spans.length && spans[i].depth > depth; i++) {\n if (isErrorSpan(spans[i])) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Expects the first span to be the parent span.\n */\nexport function findServerChildSpan(spans: TraceSpan[]) {\n if (spans.length <= 1 || !isClientSpan(spans[0])) {\n return false;\n }\n const span = spans[0];\n const spanChildDepth = span.depth + 1;\n let i = 1;\n while (i < spans.length && spans[i].depth === spanChildDepth) {\n if (isServerSpan(spans[i])) {\n return spans[i];\n }\n i++;\n }\n return null;\n}\n\nexport const isKindClient = (span: TraceSpan): Boolean => {\n if (span.kind) {\n return span.kind === 'client';\n }\n return span.tags.some(({ key, value }) => key === 'span.kind' && value === 'client');\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, cx } from '@emotion/css';\nimport { isEqual } from 'lodash';\nimport memoizeOne from 'memoize-one';\nimport * as React from 'react';\nimport { RefObject } from 'react';\n\nimport { CoreApp, GrafanaTheme2, LinkModel, TimeRange, TraceLog } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { TraceToProfilesOptions } from '@grafana/o11y-ds-frontend';\nimport { config, reportInteraction } from '@grafana/runtime';\nimport { TimeZone } from '@grafana/schema';\nimport { stylesFactory, withTheme2, ToolbarButton } from '@grafana/ui';\n\nimport { PEER_SERVICE } from '../constants/tag-keys';\nimport { SpanBarOptions } from '../settings/SpanBarSettings';\nimport TNil from '../types/TNil';\nimport TTraceTimeline from '../types/TTraceTimeline';\nimport { SpanLinkFunc } from '../types/links';\nimport { TraceSpan, Trace, TraceSpanReference, CriticalPathSection } from '../types/trace';\nimport { getColorByKey } from '../utils/color-generator';\n\nimport ListView from './ListView';\nimport SpanBarRow from './SpanBarRow';\nimport { TraceFlameGraphs } from './SpanDetail';\nimport DetailState from './SpanDetail/DetailState';\nimport SpanDetailRow from './SpanDetailRow';\nimport {\n createViewedBoundsFunc,\n findServerChildSpan,\n isErrorSpan,\n isKindClient,\n spanContainsErredSpan,\n ViewedBoundsFunctionType,\n} from './utils';\n\nconst getStyles = stylesFactory(() => ({\n rowsWrapper: css({\n width: '100%',\n }),\n row: css({\n width: '100%',\n }),\n scrollToTopButton: css({\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n width: '40px',\n height: '40px',\n position: 'absolute',\n bottom: '30px',\n right: '30px',\n zIndex: 1,\n }),\n}));\n\ntype RowState = {\n isDetail: boolean;\n span: TraceSpan;\n spanIndex: number;\n};\n\ntype TVirtualizedTraceViewOwnProps = {\n currentViewRangeTime: [number, number];\n timeZone: TimeZone;\n findMatchesIDs: Set<string> | TNil;\n trace: Trace;\n traceToProfilesOptions?: TraceToProfilesOptions;\n spanBarOptions: SpanBarOptions | undefined;\n childrenToggle: (spanID: string) => void;\n detailLogItemToggle: (spanID: string, log: TraceLog) => void;\n detailLogsToggle: (spanID: string) => void;\n detailWarningsToggle: (spanID: string) => void;\n detailStackTracesToggle: (spanID: string) => void;\n detailReferencesToggle: (spanID: string) => void;\n detailReferenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n detailProcessToggle: (spanID: string) => void;\n detailTagsToggle: (spanID: string) => void;\n detailToggle: (spanID: string) => void;\n setSpanNameColumnWidth: (width: number) => void;\n hoverIndentGuideIds: Set<string>;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n theme: GrafanaTheme2;\n createSpanLink?: SpanLinkFunc;\n scrollElement?: Element;\n focusedSpanId?: string;\n focusedSpanIdForSearch: string;\n showSpanFilterMatchesOnly: boolean;\n showCriticalPathSpansOnly: boolean;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n topOfViewRef?: RefObject<HTMLDivElement>;\n datasourceType: string;\n datasourceUid: string;\n headerHeight: number;\n criticalPath: CriticalPathSection[];\n traceFlameGraphs: TraceFlameGraphs;\n setTraceFlameGraphs: (flameGraphs: TraceFlameGraphs) => void;\n redrawListView: {};\n setRedrawListView: (redraw: {}) => void;\n timeRange: TimeRange;\n app: CoreApp;\n};\n\nexport type VirtualizedTraceViewProps = TVirtualizedTraceViewOwnProps & TTraceTimeline;\n\n// export for tests\nexport const DEFAULT_HEIGHTS = {\n bar: 28,\n detail: 161,\n detailWithLogs: 197,\n};\n\nconst NUM_TICKS = 5;\nconst BUFFER_SIZE = 33;\n\nfunction generateRowStates(\n spans: TraceSpan[] | TNil,\n childrenHiddenIDs: Set<string>,\n detailStates: Map<string, DetailState | TNil>,\n findMatchesIDs: Set<string> | TNil,\n showSpanFilterMatchesOnly: boolean,\n showCriticalPathSpansOnly: boolean,\n criticalPath: CriticalPathSection[]\n): RowState[] {\n if (!spans) {\n return [];\n }\n if (showSpanFilterMatchesOnly && findMatchesIDs) {\n spans = spans.filter((span) => findMatchesIDs.has(span.spanID));\n }\n\n if (showCriticalPathSpansOnly && criticalPath) {\n spans = spans.filter((span) => criticalPath.find((section) => section.spanId === span.spanID));\n }\n\n let collapseDepth = null;\n const rowStates = [];\n for (let i = 0; i < spans.length; i++) {\n const span = spans[i];\n const { spanID, depth } = span;\n let hidden = false;\n if (collapseDepth != null) {\n if (depth >= collapseDepth) {\n hidden = true;\n } else {\n collapseDepth = null;\n }\n }\n if (hidden) {\n continue;\n }\n if (childrenHiddenIDs.has(spanID)) {\n collapseDepth = depth + 1;\n }\n rowStates.push({\n span,\n isDetail: false,\n spanIndex: i,\n });\n if (detailStates.has(spanID)) {\n rowStates.push({\n span,\n isDetail: true,\n spanIndex: i,\n });\n }\n }\n return rowStates;\n}\n\nfunction getClipping(currentViewRange: [number, number]) {\n const [zoomStart, zoomEnd] = currentViewRange;\n return {\n left: zoomStart > 0,\n right: zoomEnd < 1,\n };\n}\n\nfunction generateRowStatesFromTrace(\n trace: Trace | TNil,\n childrenHiddenIDs: Set<string>,\n detailStates: Map<string, DetailState | TNil>,\n findMatchesIDs: Set<string> | TNil,\n showSpanFilterMatchesOnly: boolean,\n showCriticalPathSpansOnly: boolean,\n criticalPath: CriticalPathSection[]\n): RowState[] {\n return trace\n ? generateRowStates(\n trace.spans,\n childrenHiddenIDs,\n detailStates,\n findMatchesIDs,\n showSpanFilterMatchesOnly,\n showCriticalPathSpansOnly,\n criticalPath\n )\n : [];\n}\n\nfunction childSpansMap(trace: Trace | TNil) {\n const childSpansMap = new Map<string, string[]>();\n if (!trace) {\n return childSpansMap;\n }\n trace.spans.forEach((span) => {\n if (span.childSpanIds.length) {\n childSpansMap.set(span.spanID, span.childSpanIds);\n }\n });\n return childSpansMap;\n}\n\nconst memoizedGenerateRowStates = memoizeOne(generateRowStatesFromTrace);\nconst memoizedViewBoundsFunc = memoizeOne(createViewedBoundsFunc, isEqual);\nconst memoizedGetClipping = memoizeOne(getClipping, isEqual);\nconst memoizedChildSpansMap = memoizeOne(childSpansMap);\n\n// export from tests\nexport class UnthemedVirtualizedTraceView extends React.Component<VirtualizedTraceViewProps> {\n listView: ListView | TNil;\n hasScrolledToSpan = false;\n\n componentDidMount() {\n this.scrollToSpan(this.props.headerHeight, this.props.focusedSpanId);\n }\n\n shouldComponentUpdate(nextProps: VirtualizedTraceViewProps) {\n // If any prop updates, VirtualizedTraceViewImpl should update.\n let key: keyof VirtualizedTraceViewProps;\n for (key in nextProps) {\n if (nextProps[key] !== this.props[key]) {\n return true;\n }\n }\n return false;\n }\n\n componentDidUpdate(prevProps: Readonly<VirtualizedTraceViewProps>) {\n const { headerHeight, focusedSpanId, focusedSpanIdForSearch } = this.props;\n\n if (!this.hasScrolledToSpan) {\n this.scrollToSpan(headerHeight, focusedSpanId);\n this.hasScrolledToSpan = true;\n }\n\n if (focusedSpanId !== prevProps.focusedSpanId) {\n this.scrollToSpan(headerHeight, focusedSpanId);\n }\n\n if (focusedSpanIdForSearch !== prevProps.focusedSpanIdForSearch) {\n this.scrollToSpan(headerHeight, focusedSpanIdForSearch);\n }\n }\n\n getRowStates(): RowState[] {\n const {\n childrenHiddenIDs,\n detailStates,\n trace,\n findMatchesIDs,\n showSpanFilterMatchesOnly,\n showCriticalPathSpansOnly,\n criticalPath,\n } = this.props;\n return memoizedGenerateRowStates(\n trace,\n childrenHiddenIDs,\n detailStates,\n findMatchesIDs,\n showSpanFilterMatchesOnly,\n showCriticalPathSpansOnly,\n criticalPath\n );\n }\n\n getClipping(): { left: boolean; right: boolean } {\n const { currentViewRangeTime } = this.props;\n return memoizedGetClipping(currentViewRangeTime);\n }\n\n getViewedBounds(): ViewedBoundsFunctionType {\n const { currentViewRangeTime, trace } = this.props;\n const [zoomStart, zoomEnd] = currentViewRangeTime;\n\n return memoizedViewBoundsFunc({\n min: trace.startTime,\n max: trace.endTime,\n viewStart: zoomStart,\n viewEnd: zoomEnd,\n });\n }\n\n getChildSpansMap() {\n return memoizedChildSpansMap(this.props.trace);\n }\n\n getAccessors() {\n const lv = this.listView;\n if (!lv) {\n throw new Error('ListView unavailable');\n }\n return {\n getViewRange: this.getViewRange,\n getSearchedSpanIDs: this.getSearchedSpanIDs,\n getCollapsedChildren: this.getCollapsedChildren,\n getViewHeight: lv.getViewHeight,\n getBottomRowIndexVisible: lv.getBottomVisibleIndex,\n getTopRowIndexVisible: lv.getTopVisibleIndex,\n getRowPosition: lv.getRowPosition,\n mapRowIndexToSpanIndex: this.mapRowIndexToSpanIndex,\n mapSpanIndexToRowIndex: this.mapSpanIndexToRowIndex,\n };\n }\n\n getViewRange = () => this.props.currentViewRangeTime;\n\n getSearchedSpanIDs = () => this.props.findMatchesIDs;\n\n getCollapsedChildren = () => this.props.childrenHiddenIDs;\n\n mapRowIndexToSpanIndex = (index: number) => this.getRowStates()[index].spanIndex;\n\n mapSpanIndexToRowIndex = (index: number) => {\n const max = this.getRowStates().length;\n for (let i = 0; i < max; i++) {\n const { spanIndex } = this.getRowStates()[i];\n if (spanIndex === index) {\n return i;\n }\n }\n throw new Error(`unable to find row for span index: ${index}`);\n };\n\n setListView = (listView: ListView | TNil) => {\n this.listView = listView;\n };\n\n // use long form syntax to avert flow error\n // https://github.com/facebook/flow/issues/3076#issuecomment-290944051\n getKeyFromIndex = (index: number) => {\n const { isDetail, span } = this.getRowStates()[index];\n return `${span.traceID}--${span.spanID}--${isDetail ? 'detail' : 'bar'}`;\n };\n\n getIndexFromKey = (key: string) => {\n const parts = key.split('--');\n const _traceID = parts[0];\n const _spanID = parts[1];\n const _isDetail = parts[2] === 'detail';\n const max = this.getRowStates().length;\n for (let i = 0; i < max; i++) {\n const { span, isDetail } = this.getRowStates()[i];\n if (span.spanID === _spanID && span.traceID === _traceID && isDetail === _isDetail) {\n return i;\n }\n }\n return -1;\n };\n\n getRowHeight = (index: number) => {\n const { span, isDetail } = this.getRowStates()[index];\n if (!isDetail) {\n return DEFAULT_HEIGHTS.bar;\n }\n if (Array.isArray(span.logs) && span.logs.length) {\n return DEFAULT_HEIGHTS.detailWithLogs;\n }\n return DEFAULT_HEIGHTS.detail;\n };\n\n renderRow = (key: string, style: React.CSSProperties, index: number, attrs: {}) => {\n const { isDetail, span, spanIndex } = this.getRowStates()[index];\n\n // Compute the list of currently visible span IDs to pass to the row renderers.\n const start = Math.max((this.listView?.getTopVisibleIndex() || 0) - BUFFER_SIZE, 0);\n const end = (this.listView?.getBottomVisibleIndex() || 0) + BUFFER_SIZE;\n const visibleSpanIds = this.getVisibleSpanIds(start, end);\n\n return isDetail\n ? this.renderSpanDetailRow(span, key, style, attrs, visibleSpanIds)\n : this.renderSpanBarRow(span, spanIndex, key, style, attrs, visibleSpanIds);\n };\n\n scrollToSpan = (headerHeight: number, spanID?: string) => {\n if (spanID == null) {\n return;\n }\n const i = this.getRowStates().findIndex((row) => row.span.spanID === spanID);\n if (i >= 0) {\n this.listView?.scrollToIndex(i, headerHeight);\n }\n };\n\n renderSpanBarRow(\n span: TraceSpan,\n spanIndex: number,\n key: string,\n style: React.CSSProperties,\n attrs: {},\n visibleSpanIds: string[]\n ) {\n const { spanID, childSpanIds } = span;\n const { serviceName } = span.process;\n const {\n childrenHiddenIDs,\n childrenToggle,\n detailStates,\n detailToggle,\n findMatchesIDs,\n spanNameColumnWidth,\n trace,\n spanBarOptions,\n hoverIndentGuideIds,\n addHoverIndentGuideId,\n removeHoverIndentGuideId,\n createSpanLink,\n focusedSpanId,\n focusedSpanIdForSearch,\n showSpanFilterMatchesOnly,\n theme,\n datasourceType,\n criticalPath,\n } = this.props;\n // to avert flow error\n if (!trace) {\n return null;\n }\n const color = getColorByKey(serviceName, theme);\n const isCollapsed = childrenHiddenIDs.has(spanID);\n const isDetailExpanded = detailStates.has(spanID);\n const isMatchingFilter = findMatchesIDs ? findMatchesIDs.has(spanID) : false;\n const isFocused = spanID === focusedSpanId || spanID === focusedSpanIdForSearch;\n const showErrorIcon = isErrorSpan(span) || (isCollapsed && spanContainsErredSpan(trace.spans, spanIndex));\n\n // Check for direct child \"server\" span if the span is a \"client\" span.\n let rpc = null;\n if (isCollapsed) {\n const rpcSpan = findServerChildSpan(trace.spans.slice(spanIndex));\n if (rpcSpan) {\n const rpcViewBounds = this.getViewedBounds()(rpcSpan.startTime, rpcSpan.startTime + rpcSpan.duration);\n rpc = {\n color: getColorByKey(rpcSpan.process.serviceName, theme),\n operationName: rpcSpan.operationName,\n serviceName: rpcSpan.process.serviceName,\n viewEnd: rpcViewBounds.end,\n viewStart: rpcViewBounds.start,\n };\n }\n }\n\n const peerServiceKV = span.tags.find((kv) => kv.key === PEER_SERVICE);\n // Leaf, kind == client and has peer.service.tag, is likely a client span that does a request\n // to an uninstrumented/external service\n let noInstrumentedServer = null;\n if (!span.hasChildren && peerServiceKV && isKindClient(span)) {\n noInstrumentedServer = {\n serviceName: peerServiceKV.value,\n color: getColorByKey(peerServiceKV.value, theme),\n };\n }\n\n const prevSpan = spanIndex > 0 ? trace.spans[spanIndex - 1] : null;\n\n const allChildSpanIds = [spanID, ...childSpanIds];\n // This function called recursively to find all descendants of a span\n const findAllDescendants = (currentChildSpanIds: string[]) => {\n currentChildSpanIds.forEach((eachId) => {\n const childrenOfCurrent = this.getChildSpansMap().get(eachId);\n if (childrenOfCurrent?.length) {\n allChildSpanIds.push(...childrenOfCurrent);\n findAllDescendants(childrenOfCurrent);\n }\n });\n };\n findAllDescendants(childSpanIds);\n const criticalPathSections = criticalPath?.filter((each) => {\n if (isCollapsed) {\n return allChildSpanIds.includes(each.spanId);\n }\n return each.spanId === spanID;\n });\n\n const styles = getStyles();\n return (\n <div className={styles.row} key={key} style={style} {...attrs}>\n <SpanBarRow\n clippingLeft={this.getClipping().left}\n clippingRight={this.getClipping().right}\n color={color}\n spanBarOptions={spanBarOptions}\n columnDivision={spanNameColumnWidth}\n isChildrenExpanded={!isCollapsed}\n isDetailExpanded={isDetailExpanded}\n isMatchingFilter={isMatchingFilter}\n isFocused={isFocused}\n showSpanFilterMatchesOnly={showSpanFilterMatchesOnly}\n numTicks={NUM_TICKS}\n onDetailToggled={detailToggle}\n onChildrenToggled={childrenToggle}\n rpc={rpc}\n noInstrumentedServer={noInstrumentedServer}\n showErrorIcon={showErrorIcon}\n getViewedBounds={this.getViewedBounds()}\n traceStartTime={trace.startTime}\n span={span}\n hoverIndentGuideIds={hoverIndentGuideIds}\n addHoverIndentGuideId={addHoverIndentGuideId}\n removeHoverIndentGuideId={removeHoverIndentGuideId}\n createSpanLink={createSpanLink}\n datasourceType={datasourceType}\n showServiceName={prevSpan === null || prevSpan.process.serviceName !== span.process.serviceName}\n visibleSpanIds={visibleSpanIds}\n criticalPath={criticalPathSections}\n />\n </div>\n );\n }\n\n renderSpanDetailRow(span: TraceSpan, key: string, style: React.CSSProperties, attrs: {}, visibleSpanIds: string[]) {\n const { spanID } = span;\n const { serviceName } = span.process;\n const {\n detailLogItemToggle,\n detailLogsToggle,\n detailProcessToggle,\n detailReferencesToggle,\n detailReferenceItemToggle,\n detailWarningsToggle,\n detailStackTracesToggle,\n detailStates,\n detailTagsToggle,\n detailToggle,\n spanNameColumnWidth,\n trace,\n traceToProfilesOptions,\n timeZone,\n hoverIndentGuideIds,\n addHoverIndentGuideId,\n removeHoverIndentGuideId,\n createSpanLink,\n focusedSpanId,\n createFocusSpanLink,\n theme,\n datasourceType,\n datasourceUid,\n traceFlameGraphs,\n setTraceFlameGraphs,\n setRedrawListView,\n timeRange,\n app,\n } = this.props;\n const detailState = detailStates.get(spanID);\n if (!trace || !detailState) {\n return null;\n }\n const color = getColorByKey(serviceName, theme);\n const styles = getStyles();\n\n return (\n <div className={cx(styles.row, 'span-detail-row')} key={key} style={{ ...style, zIndex: 1 }} {...attrs}>\n <SpanDetailRow\n color={color}\n columnDivision={spanNameColumnWidth}\n onDetailToggled={detailToggle}\n detailState={detailState}\n logItemToggle={detailLogItemToggle}\n logsToggle={detailLogsToggle}\n processToggle={detailProcessToggle}\n referenceItemToggle={detailReferenceItemToggle}\n referencesToggle={detailReferencesToggle}\n warningsToggle={detailWarningsToggle}\n stackTracesToggle={detailStackTracesToggle}\n span={span}\n traceToProfilesOptions={traceToProfilesOptions}\n timeZone={timeZone}\n tagsToggle={detailTagsToggle}\n traceStartTime={trace.startTime}\n traceDuration={trace.duration}\n traceName={trace.traceName}\n hoverIndentGuideIds={hoverIndentGuideIds}\n addHoverIndentGuideId={addHoverIndentGuideId}\n removeHoverIndentGuideId={removeHoverIndentGuideId}\n createSpanLink={createSpanLink}\n focusedSpanId={focusedSpanId}\n createFocusSpanLink={createFocusSpanLink}\n datasourceType={datasourceType}\n datasourceUid={datasourceUid}\n visibleSpanIds={visibleSpanIds}\n traceFlameGraphs={traceFlameGraphs}\n setTraceFlameGraphs={setTraceFlameGraphs}\n setRedrawListView={setRedrawListView}\n timeRange={timeRange}\n app={app}\n />\n </div>\n );\n }\n\n scrollToTop = () => {\n const { topOfViewRef, datasourceType, trace } = this.props;\n topOfViewRef?.current?.scrollIntoView({ behavior: 'smooth' });\n reportInteraction('grafana_traces_trace_view_scroll_to_top_clicked', {\n datasourceType: datasourceType,\n grafana_version: config.buildInfo.version,\n numServices: trace.services.length,\n numSpans: trace.spans.length,\n });\n };\n\n getVisibleSpanIds = memoizeOne((start: number, end: number) => {\n const spanIds = [];\n for (let i = start; i < end; i++) {\n const rowState = this.getRowStates()[i];\n if (rowState?.span) {\n spanIds.push(rowState.span.spanID);\n }\n }\n return spanIds;\n });\n\n render() {\n const styles = getStyles();\n const { scrollElement, redrawListView } = this.props;\n\n return (\n <>\n <ListView\n ref={this.setListView}\n dataLength={this.getRowStates().length}\n itemHeightGetter={this.getRowHeight}\n itemRenderer={this.renderRow}\n viewBuffer={BUFFER_SIZE}\n viewBufferMin={BUFFER_SIZE}\n itemsWrapperClassName={styles.rowsWrapper}\n getKeyFromIndex={this.getKeyFromIndex}\n getIndexFromKey={this.getIndexFromKey}\n windowScroller={false}\n scrollElement={scrollElement}\n redraw={redrawListView}\n />\n {this.props.topOfViewRef && ( // only for panel as explore uses content outline to scroll to top\n <ToolbarButton\n className={styles.scrollToTopButton}\n onClick={this.scrollToTop}\n title={t('explore.unthemed-virtualized-trace-view.title-scroll-to-top', 'Scroll to top')}\n icon=\"arrow-up\"\n ></ToolbarButton>\n )}\n </>\n );\n }\n}\n\nexport default withTheme2(UnthemedVirtualizedTraceView);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport { PureComponent, RefObject } from 'react';\n\nimport { CoreApp, GrafanaTheme2, LinkModel, TimeRange, TraceLog } from '@grafana/data';\nimport { SpanBarOptions, TraceToProfilesOptions } from '@grafana/o11y-ds-frontend';\nimport { config, reportInteraction } from '@grafana/runtime';\nimport { TimeZone } from '@grafana/schema';\nimport { stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { merge as mergeShortcuts } from '../keyboard-shortcuts';\nimport TNil from '../types/TNil';\nimport TTraceTimeline from '../types/TTraceTimeline';\nimport { SpanLinkFunc } from '../types/links';\nimport { TraceSpan, Trace, TraceSpanReference, CriticalPathSection } from '../types/trace';\n\nimport { TraceFlameGraphs } from './SpanDetail';\nimport TimelineHeaderRow from './TimelineHeaderRow/TimelineHeaderRow';\nimport VirtualizedTraceView from './VirtualizedTraceView';\nimport { TUpdateViewRangeTimeFunction, ViewRange, ViewRangeTimeUpdate } from './types';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => ({\n TraceTimelineViewer: css({\n label: 'TraceTimelineViewer',\n borderBottom: `1px solid ${autoColor(theme, '#bbb')}`,\n\n '& .json-markup': {\n lineHeight: '17px',\n fontFamily: 'monospace',\n whiteSpace: 'pre-wrap',\n },\n\n '& .json-markup-key': {\n fontWeight: 'bold',\n },\n\n '& .json-markup-bool': {\n color: autoColor(theme, 'firebrick'),\n },\n\n '& .json-markup-string': {\n color: autoColor(theme, 'teal'),\n },\n\n '& .json-markup-null': {\n color: autoColor(theme, 'teal'),\n },\n\n '& .json-markup-number': {\n color: autoColor(theme, 'blue', 'black'),\n },\n }),\n}));\n\nexport type TProps = {\n findMatchesIDs: Set<string> | TNil;\n traceTimeline: TTraceTimeline;\n trace: Trace;\n traceToProfilesOptions?: TraceToProfilesOptions;\n datasourceType: string;\n datasourceUid: string;\n spanBarOptions: SpanBarOptions | undefined;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n viewRange: ViewRange;\n timeZone: TimeZone;\n\n setSpanNameColumnWidth: (width: number) => void;\n collapseAll: (spans: TraceSpan[]) => void;\n collapseOne: (spans: TraceSpan[]) => void;\n expandAll: () => void;\n expandOne: (spans: TraceSpan[]) => void;\n\n childrenToggle: (spanID: string) => void;\n detailLogItemToggle: (spanID: string, log: TraceLog) => void;\n detailLogsToggle: (spanID: string) => void;\n detailWarningsToggle: (spanID: string) => void;\n detailStackTracesToggle: (spanID: string) => void;\n detailReferencesToggle: (spanID: string) => void;\n detailReferenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n detailProcessToggle: (spanID: string) => void;\n detailTagsToggle: (spanID: string) => void;\n detailToggle: (spanID: string) => void;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n theme: GrafanaTheme2;\n createSpanLink?: SpanLinkFunc;\n scrollElement?: Element;\n focusedSpanId?: string;\n focusedSpanIdForSearch: string;\n showSpanFilterMatchesOnly: boolean;\n showCriticalPathSpansOnly: boolean;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n topOfViewRef?: RefObject<HTMLDivElement>;\n headerHeight: number;\n criticalPath: CriticalPathSection[];\n traceFlameGraphs: TraceFlameGraphs;\n setTraceFlameGraphs: (flameGraphs: TraceFlameGraphs) => void;\n redrawListView: {};\n setRedrawListView: (redraw: {}) => void;\n timeRange: TimeRange;\n app: CoreApp;\n};\n\ntype State = {\n // Will be set to real height of the component so it can be passed down to size some other elements.\n height: number;\n};\n\nconst NUM_TICKS = 5;\n\n/**\n * `TraceTimelineViewer` now renders the header row because it is sensitive to\n * `props.viewRange.time.cursor`. If `VirtualizedTraceView` renders it, it will\n * re-render the ListView every time the cursor is moved on the trace minimap\n * or `TimelineHeaderRow`.\n */\nexport class UnthemedTraceTimelineViewer extends PureComponent<TProps, State> {\n constructor(props: TProps) {\n super(props);\n this.state = { height: 0 };\n }\n\n componentDidMount() {\n mergeShortcuts({\n collapseAll: this.collapseAll,\n expandAll: this.expandAll,\n collapseOne: this.collapseOne,\n expandOne: this.expandOne,\n });\n }\n\n collapseAll = () => {\n this.props.collapseAll(this.props.trace.spans);\n reportInteraction('grafana_traces_traceID_expand_collapse_clicked', {\n datasourceType: this.props.datasourceType,\n grafana_version: config.buildInfo.version,\n type: 'collapseAll',\n });\n };\n\n collapseOne = () => {\n this.props.collapseOne(this.props.trace.spans);\n reportInteraction('grafana_traces_traceID_expand_collapse_clicked', {\n datasourceType: this.props.datasourceType,\n grafana_version: config.buildInfo.version,\n type: 'collapseOne',\n });\n };\n\n expandAll = () => {\n this.props.expandAll();\n reportInteraction('grafana_traces_traceID_expand_collapse_clicked', {\n datasourceType: this.props.datasourceType,\n grafana_version: config.buildInfo.version,\n type: 'expandAll',\n });\n };\n\n expandOne = () => {\n this.props.expandOne(this.props.trace.spans);\n reportInteraction('grafana_traces_traceID_expand_collapse_clicked', {\n datasourceType: this.props.datasourceType,\n grafana_version: config.buildInfo.version,\n type: 'expandOne',\n });\n };\n\n render() {\n const {\n setSpanNameColumnWidth,\n updateNextViewRangeTime,\n updateViewRangeTime,\n viewRange,\n traceTimeline,\n theme,\n topOfViewRef,\n focusedSpanIdForSearch,\n ...rest\n } = this.props;\n const { trace } = rest;\n const styles = getStyles(theme);\n\n return (\n <div\n className={styles.TraceTimelineViewer}\n ref={(ref: HTMLDivElement | null) => ref && this.setState({ height: ref.getBoundingClientRect().height })}\n >\n <TimelineHeaderRow\n duration={trace.duration}\n nameColumnWidth={traceTimeline.spanNameColumnWidth}\n numTicks={NUM_TICKS}\n onCollapseAll={this.collapseAll}\n onCollapseOne={this.collapseOne}\n onColummWidthChange={setSpanNameColumnWidth}\n onExpandAll={this.expandAll}\n onExpandOne={this.expandOne}\n viewRangeTime={viewRange.time}\n updateNextViewRangeTime={updateNextViewRangeTime}\n updateViewRangeTime={updateViewRangeTime}\n columnResizeHandleHeight={this.state.height}\n />\n <VirtualizedTraceView\n {...rest}\n {...traceTimeline}\n setSpanNameColumnWidth={setSpanNameColumnWidth}\n currentViewRangeTime={viewRange.time.current}\n topOfViewRef={topOfViewRef}\n focusedSpanIdForSearch={focusedSpanIdForSearch}\n datasourceType={this.props.datasourceType}\n datasourceUid={this.props.datasourceUid}\n />\n </div>\n );\n }\n}\n\nexport default withTheme2(UnthemedTraceTimelineViewer);\n","import { useCallback, useState } from 'react';\n\nimport { TraceSpan } from './components/types/trace';\n\n/**\n * Children state means whether spans are collapsed or not. Also provides some functions to manipulate that state.\n */\nexport function useChildrenState() {\n const [childrenHiddenIDs, setChildrenHiddenIDs] = useState(new Set<string>());\n\n const expandOne = useCallback(\n function expandOne(spans: TraceSpan[]) {\n if (childrenHiddenIDs.size === 0) {\n return;\n }\n let prevExpandedDepth = -1;\n let expandNextHiddenSpan = true;\n const newChildrenHiddenIDs = spans.reduce((res, s) => {\n if (s.depth <= prevExpandedDepth) {\n expandNextHiddenSpan = true;\n }\n if (expandNextHiddenSpan && res.has(s.spanID)) {\n res.delete(s.spanID);\n expandNextHiddenSpan = false;\n prevExpandedDepth = s.depth;\n }\n return res;\n }, new Set(childrenHiddenIDs));\n setChildrenHiddenIDs(newChildrenHiddenIDs);\n },\n [childrenHiddenIDs]\n );\n\n const collapseOne = useCallback(\n function collapseOne(spans: TraceSpan[]) {\n if (shouldDisableCollapse(spans, childrenHiddenIDs)) {\n return;\n }\n let nearestCollapsedAncestor: TraceSpan | undefined;\n const newChildrenHiddenIDs = spans.reduce((res, curSpan) => {\n if (nearestCollapsedAncestor && curSpan.depth <= nearestCollapsedAncestor.depth) {\n res.add(nearestCollapsedAncestor.spanID);\n if (curSpan.hasChildren) {\n nearestCollapsedAncestor = curSpan;\n }\n } else if (curSpan.hasChildren && !res.has(curSpan.spanID)) {\n nearestCollapsedAncestor = curSpan;\n }\n return res;\n }, new Set(childrenHiddenIDs));\n // The last one\n if (nearestCollapsedAncestor) {\n newChildrenHiddenIDs.add(nearestCollapsedAncestor.spanID);\n }\n setChildrenHiddenIDs(newChildrenHiddenIDs);\n },\n [childrenHiddenIDs]\n );\n\n const expandAll = useCallback(function expandAll() {\n setChildrenHiddenIDs(new Set<string>());\n }, []);\n\n const collapseAll = useCallback(\n function collapseAll(spans: TraceSpan[]) {\n if (shouldDisableCollapse(spans, childrenHiddenIDs)) {\n return;\n }\n const newChildrenHiddenIDs = spans.reduce((res, s) => {\n if (s.hasChildren) {\n res.add(s.spanID);\n }\n return res;\n }, new Set<string>());\n\n setChildrenHiddenIDs(newChildrenHiddenIDs);\n },\n [childrenHiddenIDs]\n );\n\n const childrenToggle = useCallback(\n function childrenToggle(spanID: string) {\n const newChildrenHiddenIDs = new Set(childrenHiddenIDs);\n if (childrenHiddenIDs.has(spanID)) {\n newChildrenHiddenIDs.delete(spanID);\n } else {\n newChildrenHiddenIDs.add(spanID);\n }\n setChildrenHiddenIDs(newChildrenHiddenIDs);\n },\n [childrenHiddenIDs]\n );\n\n return {\n childrenHiddenIDs,\n expandOne,\n collapseOne,\n expandAll,\n collapseAll,\n childrenToggle,\n };\n}\n\nfunction shouldDisableCollapse(allSpans: TraceSpan[], hiddenSpansIds: Set<string>) {\n const allParentSpans = allSpans.filter((s) => s.hasChildren);\n return allParentSpans.length === hiddenSpansIds.size;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceLog } from '@grafana/data';\n\nimport { TraceSpanReference } from '../../types/trace';\n\n/**\n * Which items of a {@link SpanDetail} component are expanded.\n */\nexport default class DetailState {\n isTagsOpen: boolean;\n isProcessOpen: boolean;\n logs: { isOpen: boolean; openedItems: Set<TraceLog> };\n references: { isOpen: boolean; openedItems: Set<TraceSpanReference> };\n isWarningsOpen: boolean;\n isStackTracesOpen: boolean;\n isReferencesOpen: boolean;\n\n constructor(oldState?: DetailState) {\n const {\n isTagsOpen,\n isProcessOpen,\n isReferencesOpen,\n isWarningsOpen,\n isStackTracesOpen,\n logs,\n references,\n }: DetailState | Record<string, undefined> = oldState || {};\n this.isTagsOpen = Boolean(isTagsOpen);\n this.isProcessOpen = Boolean(isProcessOpen);\n this.isReferencesOpen = Boolean(isReferencesOpen);\n this.isWarningsOpen = Boolean(isWarningsOpen);\n this.isStackTracesOpen = Boolean(isStackTracesOpen);\n this.logs = {\n isOpen: Boolean(logs && logs.isOpen),\n openedItems: logs && logs.openedItems ? new Set(logs.openedItems) : new Set(),\n };\n this.references = {\n isOpen: Boolean(references && references.isOpen),\n openedItems: references && references.openedItems ? new Set(references.openedItems) : new Set(),\n };\n }\n\n toggleTags() {\n const next = new DetailState(this);\n next.isTagsOpen = !this.isTagsOpen;\n return next;\n }\n\n toggleProcess() {\n const next = new DetailState(this);\n next.isProcessOpen = !this.isProcessOpen;\n return next;\n }\n\n toggleReferences() {\n const next = new DetailState(this);\n next.references.isOpen = !this.references.isOpen;\n return next;\n }\n\n toggleReferenceItem(reference: TraceSpanReference) {\n const next = new DetailState(this);\n if (next.references.openedItems.has(reference)) {\n next.references.openedItems.delete(reference);\n } else {\n next.references.openedItems.add(reference);\n }\n return next;\n }\n\n toggleWarnings() {\n const next = new DetailState(this);\n next.isWarningsOpen = !this.isWarningsOpen;\n return next;\n }\n\n toggleStackTraces() {\n const next = new DetailState(this);\n next.isStackTracesOpen = !this.isStackTracesOpen;\n return next;\n }\n\n toggleLogs() {\n const next = new DetailState(this);\n next.logs.isOpen = !this.logs.isOpen;\n return next;\n }\n\n toggleLogItem(logItem: TraceLog) {\n const next = new DetailState(this);\n if (next.logs.openedItems.has(logItem)) {\n next.logs.openedItems.delete(logItem);\n } else {\n next.logs.openedItems.add(logItem);\n }\n return next;\n }\n}\n","import { useCallback, useState, useEffect } from 'react';\n\nimport { DataFrame, TraceLog } from '@grafana/data';\n\nimport DetailState from './components/TraceTimelineViewer/SpanDetail/DetailState';\nimport { TraceSpanReference } from './components/types/trace';\n/**\n * Keeps state of the span detail. This means whether span details are open but also state of each detail subitem\n * like logs or tags.\n */\nexport function useDetailState(frame: DataFrame) {\n const [detailStates, setDetailStates] = useState(new Map<string, DetailState>());\n\n // Clear detail state when new trace arrives\n useEffect(() => {\n setDetailStates(new Map<string, DetailState>());\n }, [frame, setDetailStates]);\n\n const toggleDetail = useCallback(\n function toggleDetail(spanID: string) {\n const newDetailStates = new Map(detailStates);\n if (newDetailStates.has(spanID)) {\n newDetailStates.delete(spanID);\n } else {\n newDetailStates.set(spanID, new DetailState());\n }\n setDetailStates(newDetailStates);\n },\n [detailStates]\n );\n\n const detailLogItemToggle = useCallback(\n function detailLogItemToggle(spanID: string, log: TraceLog) {\n const old = detailStates.get(spanID);\n if (!old) {\n return;\n }\n const detailState = old.toggleLogItem(log);\n const newDetailStates = new Map(detailStates);\n newDetailStates.set(spanID, detailState);\n return setDetailStates(newDetailStates);\n },\n [detailStates]\n );\n\n const detailReferenceItemToggle = useCallback(\n function detailReferenceItemToggle(spanID: string, reference: TraceSpanReference) {\n const old = detailStates.get(spanID);\n if (!old) {\n return;\n }\n const detailState = old.toggleReferenceItem(reference);\n const newDetailStates = new Map(detailStates);\n newDetailStates.set(spanID, detailState);\n return setDetailStates(newDetailStates);\n },\n [detailStates]\n );\n\n return {\n detailStates,\n toggleDetail,\n detailLogItemToggle,\n detailLogsToggle: useCallback(\n (spanID: string) => makeDetailSubsectionToggle('logs', detailStates, setDetailStates)(spanID),\n [detailStates]\n ),\n detailWarningsToggle: useCallback(\n (spanID: string) => makeDetailSubsectionToggle('warnings', detailStates, setDetailStates)(spanID),\n [detailStates]\n ),\n detailStackTracesToggle: useCallback(\n (spanID: string) => makeDetailSubsectionToggle('stackTraces', detailStates, setDetailStates)(spanID),\n [detailStates]\n ),\n detailReferenceItemToggle,\n detailReferencesToggle: useCallback(\n (spanID: string) => makeDetailSubsectionToggle('references', detailStates, setDetailStates)(spanID),\n [detailStates]\n ),\n detailProcessToggle: useCallback(\n (spanID: string) => makeDetailSubsectionToggle('process', detailStates, setDetailStates)(spanID),\n [detailStates]\n ),\n detailTagsToggle: useCallback(\n (spanID: string) => makeDetailSubsectionToggle('tags', detailStates, setDetailStates)(spanID),\n [detailStates]\n ),\n };\n}\n\nfunction makeDetailSubsectionToggle(\n subSection: 'tags' | 'process' | 'logs' | 'warnings' | 'references' | 'stackTraces',\n detailStates: Map<string, DetailState>,\n setDetailStates: (detailStates: Map<string, DetailState>) => void\n) {\n return (spanID: string) => {\n const old = detailStates.get(spanID);\n if (!old) {\n return;\n }\n let detailState;\n if (subSection === 'tags') {\n detailState = old.toggleTags();\n } else if (subSection === 'process') {\n detailState = old.toggleProcess();\n } else if (subSection === 'warnings') {\n detailState = old.toggleWarnings();\n } else if (subSection === 'references') {\n detailState = old.toggleReferences();\n } else if (subSection === 'stackTraces') {\n detailState = old.toggleStackTraces();\n } else {\n detailState = old.toggleLogs();\n }\n const newDetailStates = new Map(detailStates);\n newDetailStates.set(spanID, detailState);\n setDetailStates(newDetailStates);\n };\n}\n","import { useCallback, useState } from 'react';\n\n/**\n * This is used internally to handle hover state of indent guide. As indent guides are separate\n * components per each row/span and you need to highlight all in multiple rows to make the effect of single line\n * they need this kind of common imperative state changes.\n *\n * Ideally would be changed to trace view internal state.\n */\nexport function useHoverIndentGuide() {\n const [hoverIndentGuideIds, setHoverIndentGuideIds] = useState(new Set<string>());\n\n const addHoverIndentGuideId = useCallback(function addHoverIndentGuideId(spanID: string) {\n setHoverIndentGuideIds((prevState) => {\n const newHoverIndentGuideIds = new Set(prevState);\n newHoverIndentGuideIds.add(spanID);\n return newHoverIndentGuideIds;\n });\n }, []);\n\n const removeHoverIndentGuideId = useCallback(function removeHoverIndentGuideId(spanID: string) {\n setHoverIndentGuideIds((prevState) => {\n const newHoverIndentGuideIds = new Set(prevState);\n newHoverIndentGuideIds.delete(spanID);\n return newHoverIndentGuideIds;\n });\n }, []);\n\n return { hoverIndentGuideIds, addHoverIndentGuideId, removeHoverIndentGuideId };\n}\n","import { useCallback, useState } from 'react';\n\nimport { ViewRange, ViewRangeTimeUpdate } from './components/TraceTimelineViewer/types';\n\n/**\n * Controls state of the zoom function that can be used through minimap in header or on the timeline. ViewRange contains\n * state not only for current range that is showing but range that is currently being selected by the user.\n */\nexport function useViewRange() {\n const [viewRange, setViewRange] = useState<ViewRange>({\n time: {\n current: [0, 1],\n },\n });\n\n const updateNextViewRangeTime = useCallback(function updateNextViewRangeTime(update: ViewRangeTimeUpdate) {\n setViewRange((prevRange): ViewRange => {\n const time = { ...prevRange.time, ...update };\n return { ...prevRange, time };\n });\n }, []);\n\n const updateViewRangeTime = useCallback(function updateViewRangeTime(start: number, end: number) {\n const current: [number, number] = [start, end];\n const time = { current };\n setViewRange((prevRange): ViewRange => {\n return { ...prevRange, time };\n });\n }, []);\n\n return { viewRange, updateViewRangeTime, updateNextViewRangeTime };\n}\n","import { css } from '@emotion/css';\nimport { RefObject, useMemo, useState } from 'react';\nimport { useToggle } from 'react-use';\n\nimport {\n CoreApp,\n DataFrame,\n DataLink,\n DataSourceApi,\n DataSourceJsonData,\n Field,\n GrafanaTheme2,\n LinkModel,\n mapInternalLinkToExplore,\n SplitOpen,\n TimeRange,\n TraceSearchProps,\n useDataLinksContext,\n} from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { getTraceToLogsOptions, TraceToMetricsData, TraceToProfilesData } from '@grafana/o11y-ds-frontend';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { DataQuery } from '@grafana/schema';\nimport { useStyles2 } from '@grafana/ui';\nimport { TempoQuery } from '@grafana-plugins/tempo/types';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { getTimeZone } from 'app/features/profile/state/selectors';\nimport { useDispatch, useSelector } from 'app/types/store';\n\nimport { changePanelState } from '../state/explorePane';\n\nimport memoizedTraceCriticalPath from './components/CriticalPath';\nimport SpanGraph from './components/TracePageHeader/SpanGraph';\nimport { TracePageHeader } from './components/TracePageHeader/TracePageHeader';\nimport TraceTimelineViewer from './components/TraceTimelineViewer';\nimport { TraceFlameGraphs } from './components/TraceTimelineViewer/SpanDetail';\nimport { SpanBarOptionsData } from './components/settings/SpanBarSettings';\nimport TTraceTimeline from './components/types/TTraceTimeline';\nimport { SpanLinkFunc } from './components/types/links';\nimport { Trace } from './components/types/trace';\nimport { createSpanLinkFactory } from './createSpanLink';\nimport { useChildrenState } from './useChildrenState';\nimport { useDetailState } from './useDetailState';\nimport { useHoverIndentGuide } from './useHoverIndentGuide';\nimport { useSearch } from './useSearch';\nimport { useViewRange } from './useViewRange';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n noDataMsg: css({\n height: '100%',\n width: '100%',\n display: 'grid',\n placeItems: 'center',\n fontSize: theme.typography.h4.fontSize,\n color: theme.colors.text.secondary,\n }),\n});\n\ntype Props = {\n dataFrames: DataFrame[];\n splitOpenFn?: SplitOpen;\n exploreId?: string;\n scrollElement?: Element;\n scrollElementClass?: string;\n traceProp: Trace;\n datasource: DataSourceApi<DataQuery, DataSourceJsonData, {}> | undefined;\n topOfViewRef?: RefObject<HTMLDivElement>;\n createSpanLink?: SpanLinkFunc;\n focusedSpanId?: string;\n createFocusSpanLink?: (traceId: string, spanId: string) => LinkModel<Field>;\n spanFilters?: TraceSearchProps;\n timeRange: TimeRange;\n};\n\nexport function TraceView(props: Props) {\n const {\n traceProp,\n datasource,\n topOfViewRef,\n exploreId,\n createSpanLink: createSpanLinkFromProps,\n focusedSpanId: focusedSpanIdFromProps,\n createFocusSpanLink: createFocusSpanLinkFromProps,\n spanFilters,\n } = props;\n\n const {\n detailStates,\n toggleDetail,\n detailLogItemToggle,\n detailLogsToggle,\n detailProcessToggle,\n detailReferencesToggle,\n detailReferenceItemToggle,\n detailTagsToggle,\n detailWarningsToggle,\n detailStackTracesToggle,\n } = useDetailState(props.dataFrames[0]);\n\n const { removeHoverIndentGuideId, addHoverIndentGuideId, hoverIndentGuideIds } = useHoverIndentGuide();\n const { viewRange, updateViewRangeTime, updateNextViewRangeTime } = useViewRange();\n const { expandOne, collapseOne, childrenToggle, collapseAll, childrenHiddenIDs, expandAll } = useChildrenState();\n const { search, setSearch, spanFilterMatches } = useSearch(exploreId, traceProp?.spans, spanFilters);\n const [focusedSpanIdForSearch, setFocusedSpanIdForSearch] = useState('');\n const [showSpanFilters, setShowSpanFilters] = useToggle(false);\n const [headerHeight, setHeaderHeight] = useState(100);\n const [traceFlameGraphs, setTraceFlameGraphs] = useState<TraceFlameGraphs>({});\n const [redrawListView, setRedrawListView] = useState({});\n\n const styles = useStyles2(getStyles);\n\n /**\n * Keeps state of resizable name column width\n */\n const [spanNameColumnWidth, setSpanNameColumnWidth] = useState(0.4);\n\n const [focusedSpanIdExplore, createFocusSpanLinkExplore] = useFocusSpanLink({\n refId: props.dataFrames[0]?.refId,\n exploreId: props.exploreId!,\n datasource,\n splitOpenFn: props.splitOpenFn!,\n });\n\n const focusedSpanId = focusedSpanIdFromProps ?? focusedSpanIdExplore;\n const createFocusSpanLink = createFocusSpanLinkFromProps ?? createFocusSpanLinkExplore;\n\n const traceTimeline: TTraceTimeline = useMemo(\n () => ({\n childrenHiddenIDs,\n detailStates,\n hoverIndentGuideIds,\n spanNameColumnWidth,\n traceID: props.traceProp?.traceID,\n }),\n [childrenHiddenIDs, detailStates, hoverIndentGuideIds, spanNameColumnWidth, props.traceProp?.traceID]\n );\n\n const instanceSettings = getDatasourceSrv().getInstanceSettings(datasource?.name);\n const traceToLogsOptions = getTraceToLogsOptions(instanceSettings?.jsonData);\n const traceToMetrics: TraceToMetricsData | undefined = instanceSettings?.jsonData;\n const traceToMetricsOptions = traceToMetrics?.tracesToMetrics;\n const traceToProfilesData: TraceToProfilesData | undefined = instanceSettings?.jsonData;\n const traceToProfilesOptions = traceToProfilesData?.tracesToProfiles;\n const spanBarOptions: SpanBarOptionsData | undefined = instanceSettings?.jsonData;\n\n const dataLinksContext = useDataLinksContext();\n\n const createSpanLink = useMemo(\n () =>\n createSpanLinkFromProps ??\n createSpanLinkFactory({\n splitOpenFn: props.splitOpenFn!,\n traceToLogsOptions,\n traceToMetricsOptions,\n traceToProfilesOptions,\n dataFrame: props.dataFrames[0],\n createFocusSpanLink,\n trace: traceProp,\n dataLinkPostProcessor: dataLinksContext?.dataLinkPostProcessor,\n }),\n [\n props.splitOpenFn,\n traceToLogsOptions,\n traceToMetricsOptions,\n traceToProfilesOptions,\n props.dataFrames,\n createFocusSpanLink,\n traceProp,\n createSpanLinkFromProps,\n dataLinksContext?.dataLinkPostProcessor,\n ]\n );\n const timeZone = useSelector((state) => getTimeZone(state.user));\n const datasourceType = datasource ? datasource?.type : 'unknown';\n const datasourceName = datasource ? datasource?.name : 'unknown';\n const datasourceUid = datasource ? datasource?.uid : '';\n const scrollElement = props.scrollElement\n ? props.scrollElement\n : document.getElementsByClassName(props.scrollElementClass ?? '')[0];\n\n const criticalPath = memoizedTraceCriticalPath(traceProp);\n\n return (\n <>\n {props.dataFrames?.length && traceProp ? (\n <>\n <TracePageHeader\n trace={traceProp}\n data={props.dataFrames[0]}\n timeZone={timeZone}\n search={search}\n setSearch={setSearch}\n showSpanFilters={showSpanFilters}\n setShowSpanFilters={setShowSpanFilters}\n setFocusedSpanIdForSearch={setFocusedSpanIdForSearch}\n spanFilterMatches={spanFilterMatches}\n datasourceType={datasourceType}\n datasourceName={datasourceName}\n datasourceUid={datasourceUid}\n setHeaderHeight={setHeaderHeight}\n app={exploreId ? CoreApp.Explore : CoreApp.Unknown}\n />\n <SpanGraph\n trace={traceProp}\n viewRange={viewRange}\n updateNextViewRangeTime={updateNextViewRangeTime}\n updateViewRangeTime={updateViewRangeTime}\n />\n <TraceTimelineViewer\n findMatchesIDs={spanFilterMatches}\n trace={traceProp}\n traceToProfilesOptions={traceToProfilesOptions}\n datasourceType={datasourceType}\n datasourceUid={datasourceUid}\n spanBarOptions={spanBarOptions?.spanBar}\n traceTimeline={traceTimeline}\n updateNextViewRangeTime={updateNextViewRangeTime}\n updateViewRangeTime={updateViewRangeTime}\n viewRange={viewRange}\n timeZone={timeZone}\n setSpanNameColumnWidth={setSpanNameColumnWidth}\n collapseAll={collapseAll}\n collapseOne={collapseOne}\n expandAll={expandAll}\n expandOne={expandOne}\n childrenToggle={childrenToggle}\n detailLogItemToggle={detailLogItemToggle}\n detailLogsToggle={detailLogsToggle}\n detailWarningsToggle={detailWarningsToggle}\n detailStackTracesToggle={detailStackTracesToggle}\n detailReferencesToggle={detailReferencesToggle}\n detailReferenceItemToggle={detailReferenceItemToggle}\n detailProcessToggle={detailProcessToggle}\n detailTagsToggle={detailTagsToggle}\n detailToggle={toggleDetail}\n addHoverIndentGuideId={addHoverIndentGuideId}\n removeHoverIndentGuideId={removeHoverIndentGuideId}\n createSpanLink={createSpanLink}\n scrollElement={scrollElement}\n focusedSpanId={focusedSpanId}\n focusedSpanIdForSearch={focusedSpanIdForSearch}\n showSpanFilterMatchesOnly={search.matchesOnly}\n showCriticalPathSpansOnly={search.criticalPathOnly}\n createFocusSpanLink={createFocusSpanLink}\n topOfViewRef={topOfViewRef}\n headerHeight={headerHeight}\n criticalPath={criticalPath}\n traceFlameGraphs={traceFlameGraphs}\n setTraceFlameGraphs={setTraceFlameGraphs}\n redrawListView={redrawListView}\n setRedrawListView={setRedrawListView}\n timeRange={props.timeRange}\n app={exploreId ? CoreApp.Explore : CoreApp.Unknown}\n />\n </>\n ) : (\n <div className={styles.noDataMsg}>\n <Trans i18nKey=\"explore.trace-view.no-data\">No data</Trans>\n </div>\n )}\n </>\n );\n}\n\n/**\n * Handles focusing a span. Returns the span id to focus to based on what is in current explore state and also a\n * function to change the focused span id.\n * @param options\n */\nfunction useFocusSpanLink(options: {\n exploreId: string;\n splitOpenFn: SplitOpen;\n refId?: string;\n datasource?: DataSourceApi;\n}): [string | undefined, (traceId: string, spanId: string) => LinkModel<Field>] {\n const panelState = useSelector((state) => state.explore.panes[options.exploreId]?.panelsState.trace);\n const focusedSpanId = panelState?.spanId;\n\n const dispatch = useDispatch();\n const setFocusedSpanId = (spanId?: string) =>\n dispatch(\n changePanelState(options.exploreId, 'trace', {\n ...panelState,\n spanId,\n })\n );\n\n const query = useSelector((state) =>\n state.explore.panes[options.exploreId]?.queries.find((query) => query.refId === options.refId)\n );\n\n const createFocusSpanLink = (traceId: string, spanId: string) => {\n const link: DataLink = {\n title: t(\n 'explore.use-focus-span-link.create-focus-span-link.link.title.deep-link-to-this-span',\n 'Deep link to this span'\n ),\n url: '',\n internal: {\n datasourceUid: options.datasource?.uid!,\n datasourceName: options.datasource?.name!,\n query: {\n ...query,\n query: traceId,\n },\n panelsState: {\n trace: {\n spanId,\n },\n },\n },\n };\n\n // Check if the link is to a different trace or not.\n // If it's the same trace, only update panel state with setFocusedSpanId (no navigation).\n // If it's a different trace, use splitOpenFn to open a new explore panel\n const sameTrace = query?.queryType === 'traceql' && (query as TempoQuery).query === traceId;\n\n return mapInternalLinkToExplore({\n link,\n internalLink: link.internal!,\n scopedVars: {},\n field: {} as Field,\n onClickFn: sameTrace\n ? () => setFocusedSpanId(focusedSpanId === spanId ? undefined : spanId)\n : options.splitOpenFn\n ? () =>\n options.splitOpenFn({\n datasourceUid: options.datasource?.uid!,\n queries: [\n {\n ...query!,\n query: traceId,\n },\n ],\n panelsState: {\n trace: {\n spanId,\n },\n },\n })\n : undefined,\n replaceVariables: getTemplateSrv().replace.bind(getTemplateSrv()),\n });\n };\n\n return [focusedSpanId, createFocusSpanLink];\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * triggers an event that has already been bound\n *\n * @param {string} keys\n * @param {string=} action\n * @returns void\n */\nmodule.exports = function (keys, action) {\n var self = this\n if (self.directMap[keys + ':' + action]) {\n self.directMap[keys + ':' + action]({}, keys)\n }\n return this\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * unbinds an event to Combokeys\n *\n * the unbinding sets the callback function of the specified key combo\n * to an empty function and deletes the corresponding key in the\n * directMap dict.\n *\n * TODO: actually remove this from the callbacks dictionary instead\n * of binding an empty function\n *\n * the keycombo+action has to be exactly the same as\n * it was defined in the bind method\n *\n * @param {string|Array} keys\n * @param {string} action\n * @returns void\n */\nmodule.exports = function (keys, action) {\n var self = this\n\n return self.bind(keys, function () {}, action)\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * resets all sequence counters except for the ones passed in\n *\n * @param {Object} doNotReset\n * @returns void\n */\nmodule.exports = function (doNotReset) {\n var self = this\n\n doNotReset = doNotReset || {}\n\n var activeSequences = false\n var key\n\n for (key in self.sequenceLevels) {\n if (doNotReset[key]) {\n activeSequences = true\n continue\n }\n self.sequenceLevels[key] = 0\n }\n\n if (!activeSequences) {\n self.nextExpectedAction = false\n }\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * mapping of special keycodes to their corresponding keys\n *\n * everything in this dictionary cannot use keypress events\n * so it has to be here to map to the correct keycodes for\n * keyup/keydown events\n *\n * @type {Object}\n */\nmodule.exports = {\n 8: 'backspace',\n 9: 'tab',\n 13: 'enter',\n 16: 'shift',\n 17: 'ctrl',\n 18: 'alt',\n 20: 'capslock',\n 27: 'esc',\n 32: 'space',\n 33: 'pageup',\n 34: 'pagedown',\n 35: 'end',\n 36: 'home',\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down',\n 45: 'ins',\n 46: 'del',\n 91: 'meta',\n 93: 'meta',\n 173: 'minus',\n 187: 'plus',\n 189: 'minus',\n 224: 'meta'\n}\n\n/**\n * loop through the f keys, f1 to f19 and add them to the map\n * programatically\n */\nfor (var i = 1; i < 20; ++i) {\n module.exports[111 + i] = 'f' + i\n}\n\n/**\n * loop through to map numbers on the numeric keypad\n */\nfor (i = 0; i <= 9; ++i) {\n module.exports[i + 96] = i\n}\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { SpanStatusCode } from '@opentelemetry/api';\n\nimport { TraceKeyValuePair, TraceSearchProps, TraceSearchTag } from '@grafana/data';\n\nimport { KIND, LIBRARY_NAME, LIBRARY_VERSION, STATUS, STATUS_MESSAGE, TRACE_STATE, ID } from '../constants/span';\nimport TNil from '../types/TNil';\nimport { TraceSpan } from '../types/trace';\n\n// filter spans where all filters added need to be true for each individual span that is returned\n// i.e. the more filters added -> the more specific that the returned results are\nexport function filterSpans(searchProps: TraceSearchProps, spans: TraceSpan[] | TNil) {\n if (!spans) {\n return undefined;\n }\n\n let filteredSpans = false;\n if (searchProps.serviceName) {\n spans = getServiceNameMatches(spans, searchProps);\n filteredSpans = true;\n }\n if (searchProps.spanName) {\n spans = getSpanNameMatches(spans, searchProps);\n filteredSpans = true;\n }\n if (searchProps.from || searchProps.to) {\n spans = getDurationMatches(spans, searchProps);\n filteredSpans = true;\n }\n const tagMatches = getTagMatches(spans, searchProps.tags);\n if (tagMatches) {\n spans = tagMatches;\n filteredSpans = true;\n }\n\n if (searchProps.query) {\n const queryMatches = getQueryMatches(searchProps.query, spans);\n if (queryMatches) {\n spans = queryMatches;\n filteredSpans = true;\n }\n }\n\n return filteredSpans ? new Set(spans.map((span: TraceSpan) => span.spanID)) : undefined;\n}\n\nexport function getQueryMatches(query: string, spans: TraceSpan[] | TNil) {\n if (!spans) {\n return undefined;\n }\n\n const queryParts: string[] = [];\n\n // split query by whitespace, remove empty strings, and extract filters\n query\n .split(/\\s+/)\n .filter(Boolean)\n .forEach((w) => {\n queryParts.push(w.toLowerCase());\n });\n\n const isTextInQuery = (queryParts: string[], text: string) =>\n queryParts.some((queryPart) => text.toLowerCase().includes(queryPart));\n\n const isTextInKeyValues = (kvs: TraceKeyValuePair[]) =>\n kvs\n ? kvs.some((kv) => {\n return isTextInQuery(queryParts, kv.key) || isTextInQuery(queryParts, getStringValue(kv.value));\n })\n : false;\n\n const isSpanAMatch = (span: TraceSpan) =>\n isTextInQuery(queryParts, span.operationName) ||\n isTextInQuery(queryParts, span.process.serviceName) ||\n isTextInKeyValues(span.tags) ||\n (span.kind && isTextInQuery(queryParts, span.kind)) ||\n (span.statusCode !== undefined && isTextInQuery(queryParts, SpanStatusCode[span.statusCode])) ||\n (span.statusMessage && isTextInQuery(queryParts, span.statusMessage)) ||\n (span.instrumentationLibraryName && isTextInQuery(queryParts, span.instrumentationLibraryName)) ||\n (span.instrumentationLibraryVersion && isTextInQuery(queryParts, span.instrumentationLibraryVersion)) ||\n (span.traceState && isTextInQuery(queryParts, span.traceState)) ||\n (span.logs !== null &&\n span.logs.some((log) => (log.name && isTextInQuery(queryParts, log.name)) || isTextInKeyValues(log.fields))) ||\n isTextInKeyValues(span.process.tags) ||\n queryParts.some((queryPart) => queryPart === span.spanID);\n\n return spans.filter(isSpanAMatch);\n}\n\nconst getTagMatches = (spans: TraceSpan[], tags: TraceSearchTag[]) => {\n // remove empty/default tags\n tags = tags.filter((tag) => {\n // tag.key === '' when it is cleared via pressing x icon in select field\n return (tag.key && tag.key !== '') || tag.value;\n });\n\n if (tags.length > 0) {\n return spans.filter((span: TraceSpan) => {\n // match against every tag filter\n return tags.every((tag: TraceSearchTag) => {\n if (tag.key && tag.value) {\n if (\n (tag.operator === '=' && checkKeyValConditionForMatch(tag, span)) ||\n (tag.operator === '=~' && checkKeyValConditionForRegex(tag, span)) ||\n (tag.operator === '!=' && !checkKeyValConditionForMatch(tag, span)) ||\n (tag.operator === '!~' && !checkKeyValConditionForRegex(tag, span))\n ) {\n return true;\n }\n return false;\n } else if (tag.key) {\n if (\n span.tags.some((kv) => checkKeyForMatch(tag.key!, kv.key)) ||\n span.process.tags.some((kv) => checkKeyForMatch(tag.key!, kv.key)) ||\n (span.logs && span.logs.some((log) => log.fields.some((kv) => checkKeyForMatch(tag.key!, kv.key)))) ||\n (span.kind && tag.key === KIND) ||\n (span.statusCode !== undefined && tag.key === STATUS) ||\n (span.statusMessage && tag.key === STATUS_MESSAGE) ||\n (span.instrumentationLibraryName && tag.key === LIBRARY_NAME) ||\n (span.instrumentationLibraryVersion && tag.key === LIBRARY_VERSION) ||\n (span.traceState && tag.key === TRACE_STATE) ||\n tag.key === ID\n ) {\n return tag.operator === '=' || tag.operator === '=~' ? true : false;\n }\n return tag.operator === '=' || tag.operator === '=~' ? false : true;\n }\n return false;\n });\n });\n }\n return undefined;\n};\n\nconst checkKeyValConditionForRegex = (tag: TraceSearchTag, span: TraceSpan) => {\n return (\n span.tags.some((kv) => checkKeyAndValueForRegex(tag, kv)) ||\n span.process.tags.some((kv) => checkKeyAndValueForRegex(tag, kv)) ||\n (span.logs && span.logs.some((log) => log.fields.some((kv) => checkKeyAndValueForRegex(tag, kv)))) ||\n (span.kind && tag.key === KIND && tag.value?.includes(span.kind)) ||\n (span.statusCode !== undefined &&\n tag.key === STATUS &&\n tag.value?.includes(SpanStatusCode[span.statusCode].toLowerCase())) ||\n (span.statusMessage && tag.key === STATUS_MESSAGE && tag.value?.includes(span.statusMessage)) ||\n (span.instrumentationLibraryName &&\n tag.key === LIBRARY_NAME &&\n tag.value?.includes(span.instrumentationLibraryName)) ||\n (span.instrumentationLibraryVersion &&\n tag.key === LIBRARY_VERSION &&\n tag.value?.includes(span.instrumentationLibraryVersion)) ||\n (span.traceState && tag.key === TRACE_STATE && tag.value?.includes(span.traceState)) ||\n (tag.key === ID && tag.value?.includes(span.spanID))\n );\n};\n\nconst checkKeyValConditionForMatch = (tag: TraceSearchTag, span: TraceSpan) => {\n return (\n span.tags.some((kv) => checkKeyAndValueForMatch(tag, kv)) ||\n span.process.tags.some((kv) => checkKeyAndValueForMatch(tag, kv)) ||\n (span.logs && span.logs.some((log) => log.fields.some((kv) => checkKeyAndValueForMatch(tag, kv)))) ||\n (span.kind && tag.key === KIND && tag.value === span.kind) ||\n (span.statusCode !== undefined &&\n tag.key === STATUS &&\n tag.value === SpanStatusCode[span.statusCode].toLowerCase()) ||\n (span.statusMessage && tag.key === STATUS_MESSAGE && tag.value === span.statusMessage) ||\n (span.instrumentationLibraryName && tag.key === LIBRARY_NAME && tag.value === span.instrumentationLibraryName) ||\n (span.instrumentationLibraryVersion &&\n tag.key === LIBRARY_VERSION &&\n tag.value === span.instrumentationLibraryVersion) ||\n (span.traceState && tag.key === TRACE_STATE && tag.value === span.traceState) ||\n (tag.key === ID && tag.value === span.spanID)\n );\n};\n\nconst checkKeyForMatch = (tagKey: string, key: string) => {\n return tagKey === key.toString();\n};\n\nconst checkKeyAndValueForMatch = (tag: TraceSearchTag, kv: TraceKeyValuePair) => {\n return tag.key === kv.key && tag.value === getStringValue(kv.value);\n};\n\nconst checkKeyAndValueForRegex = (tag: TraceSearchTag, kv: TraceKeyValuePair) => {\n return kv.key.includes(tag.key || '') && getStringValue(kv.value).includes(tag.value || '');\n};\n\nconst getStringValue = (value: string | number | boolean | undefined) => {\n return value ? value.toString() : '';\n};\n\nconst getServiceNameMatches = (spans: TraceSpan[], searchProps: TraceSearchProps) => {\n return spans.filter((span: TraceSpan) => {\n return searchProps.serviceNameOperator === '='\n ? span.process.serviceName === searchProps.serviceName\n : span.process.serviceName !== searchProps.serviceName;\n });\n};\n\nconst getSpanNameMatches = (spans: TraceSpan[], searchProps: TraceSearchProps) => {\n return spans.filter((span: TraceSpan) => {\n return searchProps.spanNameOperator === '='\n ? span.operationName === searchProps.spanName\n : span.operationName !== searchProps.spanName;\n });\n};\n\nconst getDurationMatches = (spans: TraceSpan[], searchProps: TraceSearchProps) => {\n const from = convertTimeFilter(searchProps?.from || '');\n const to = convertTimeFilter(searchProps?.to || '');\n let filteredSpans: TraceSpan[] = [];\n\n if (from) {\n filteredSpans = spans.filter((span: TraceSpan) => {\n return searchProps.fromOperator === '>' ? span.duration > from : span.duration >= from;\n });\n }\n if (to) {\n const filterForDuration = (span: TraceSpan) =>\n searchProps.toOperator === '<' ? span.duration < to : span.duration <= to;\n filteredSpans =\n filteredSpans.length > 0\n ? filteredSpans.filter((span: TraceSpan) => {\n return filterForDuration(span);\n })\n : spans.filter((span: TraceSpan) => {\n return filterForDuration(span);\n });\n }\n\n return filteredSpans;\n};\n\nexport const convertTimeFilter = (time: string) => {\n if (time.includes('ns')) {\n return parseFloat(time.split('ns')[0]) / 1000;\n } else if (time.includes('us')) {\n return parseFloat(time.split('us')[0]);\n } else if (time.includes('µs')) {\n return parseFloat(time.split('µs')[0]);\n } else if (time.includes('ms')) {\n return parseFloat(time.split('ms')[0]) * 1000;\n } else if (time.includes('s')) {\n return parseFloat(time.split('s')[0]) * 1000 * 1000;\n } else if (time.includes('m')) {\n return parseFloat(time.split('m')[0]) * 1000 * 1000 * 60;\n } else if (time.includes('h')) {\n return parseFloat(time.split('h')[0]) * 1000 * 1000 * 60 * 60;\n }\n return undefined;\n};\n","// Copyright (c) 2020 The Jaeger Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { memoize } from 'lodash';\n\nimport { TraceSpan } from '../types/trace';\n\nexport function _getTraceNameImpl(spans: TraceSpan[]) {\n // Use a span with no references to another span in given array\n // prefering the span with the fewest references\n // using start time as a tie breaker\n let candidateSpan: TraceSpan | undefined;\n const allIDs: Set<string> = new Set(spans.map(({ spanID }) => spanID));\n\n for (let i = 0; i < spans.length; i++) {\n const hasInternalRef =\n spans[i].references &&\n spans[i].references.some(({ traceID, spanID }) => traceID === spans[i].traceID && allIDs.has(spanID));\n if (hasInternalRef) {\n continue;\n }\n\n if (!candidateSpan) {\n candidateSpan = spans[i];\n continue;\n }\n\n const thisRefLength = (spans[i].references && spans[i].references.length) || 0;\n const candidateRefLength = (candidateSpan.references && candidateSpan.references.length) || 0;\n\n if (\n thisRefLength < candidateRefLength ||\n (thisRefLength === candidateRefLength && spans[i].startTime < candidateSpan.startTime)\n ) {\n candidateSpan = spans[i];\n }\n }\n return candidateSpan ? `${candidateSpan.process.serviceName}: ${candidateSpan.operationName}` : '';\n}\n\nexport const getTraceName = memoize(_getTraceNameImpl, (spans: TraceSpan[]) => {\n if (!spans.length) {\n return 0;\n }\n return spans[0].traceID;\n});\n\n// Find header tags according to either old standard (e..g, `http.method`) or the\n// standard OTEL semantic convention, as per https://opentelemetry.io/docs/specs/semconv/http/http-spans\n// (e.g., `http.request.method`). Spans following the OTEL semantic convention are prioritized.\n//\n// Note that we are ignoring these cases:\n// - conventions are mixed, e.g., a span with method in `http.method` but status code in `http.response.status_code`\n// - tags are not in the same span, e.g., method in spans[0] but status in spans[1]\nexport function findHeaderTags(spans: TraceSpan[]) {\n // OTEL semantic convention\n for (let i = 0; i < spans.length; i++) {\n const method = spans[i].tags.filter((tag) => {\n return tag.key === 'http.request.method';\n });\n\n const status = spans[i].tags.filter((tag) => {\n return tag.key === 'http.response.status_code';\n });\n\n const url = spans[i].tags.filter((tag) => {\n return tag.key === 'http.route';\n });\n\n if (method.length > 0 || status.length > 0 || url.length > 0) {\n return { method, status, url };\n }\n }\n\n // Non-standard convention\n for (let i = 0; i < spans.length; i++) {\n const method = spans[i].tags.filter((tag) => {\n return tag.key === 'http.method';\n });\n\n const status = spans[i].tags.filter((tag) => {\n return tag.key === 'http.status_code';\n });\n\n const url = spans[i].tags.filter((tag) => {\n return tag.key === 'http.url' || tag.key === 'http.target' || tag.key === 'http.path';\n });\n\n if (method.length > 0 || status.length > 0 || url.length > 0) {\n return { method, status, url };\n }\n }\n\n return {};\n}\n\nexport const getHeaderTags = memoize(findHeaderTags, (spans: TraceSpan[]) => {\n if (!spans.length) {\n return 0;\n }\n return spans[0].traceID;\n});\n","/* eslint-env node, browser */\n'use strict'\n/**\n * this is a mapping of keys that require shift on a US keypad\n * back to the non shift equivelents\n *\n * this is so you can use keyup events with these keys\n *\n * note that this will only work reliably on US keyboards\n *\n * @type {Object}\n */\nmodule.exports = {\n '~': '`',\n '!': '1',\n '@': '2',\n '#': '3',\n '$': '4',\n '%': '5',\n '^': '6',\n '&': '7',\n '*': '8',\n '(': '9',\n ')': '0',\n '_': '-',\n '+': '=',\n ':': ';',\n '\"': \"'\",\n '<': ',',\n '>': '.',\n '?': '/',\n '|': '\\\\'\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * binds an event to Combokeys\n *\n * can be a single key, a combination of keys separated with +,\n * an array of keys, or a sequence of keys separated by spaces\n *\n * be sure to list the modifier keys first to make sure that the\n * correct key ends up getting bound (the last key in the pattern)\n *\n * @param {string|Array} keys\n * @param {Function} callback\n * @param {string=} action - \"keypress\", \"keydown\", or \"keyup\"\n * @returns void\n */\nmodule.exports = function (keys, callback, action) {\n var self = this\n\n keys = keys instanceof Array ? keys : [keys]\n self.bindMultiple(keys, callback, action)\n return self\n}\n","import { SpanStatusCode } from '@opentelemetry/api';\nimport { uniq } from 'lodash';\n\nimport {\n ID,\n KIND,\n LIBRARY_NAME,\n LIBRARY_VERSION,\n STATUS,\n STATUS_MESSAGE,\n TRACE_STATE,\n} from '../components/constants/span';\nimport { Trace } from '../components/types/trace';\n\nexport const getTraceServiceNames = (trace: Trace) => {\n const serviceNames = trace.spans.map((span) => {\n return span.process.serviceName;\n });\n return uniq(serviceNames).sort();\n};\n\nexport const getTraceSpanNames = (trace: Trace) => {\n const spanNames = trace.spans.map((span) => {\n return span.operationName;\n });\n return uniq(spanNames).sort();\n};\n\nexport const getTraceTagKeys = (trace: Trace) => {\n let keys: string[] = [];\n let logKeys: string[] = [];\n\n trace.spans.forEach((span) => {\n span.tags.forEach((tag) => {\n keys.push(tag.key);\n });\n span.process.tags.forEach((tag) => {\n keys.push(tag.key);\n });\n if (span.logs !== null) {\n span.logs.forEach((log) => {\n log.fields.forEach((field) => {\n logKeys.push(field.key);\n });\n });\n }\n\n if (span.kind) {\n keys.push(KIND);\n }\n if (span.statusCode !== undefined) {\n keys.push(STATUS);\n }\n if (span.statusMessage) {\n keys.push(STATUS_MESSAGE);\n }\n if (span.instrumentationLibraryName) {\n keys.push(LIBRARY_NAME);\n }\n if (span.instrumentationLibraryVersion) {\n keys.push(LIBRARY_VERSION);\n }\n if (span.traceState) {\n keys.push(TRACE_STATE);\n }\n keys.push(ID);\n });\n keys = uniq(keys).sort();\n logKeys = uniq(logKeys).sort();\n\n return [...keys, ...logKeys];\n};\n\nexport const getTraceTagValues = (trace: Trace, key: string) => {\n const values: string[] = [];\n\n trace.spans.forEach((span) => {\n const tagValue = span.tags.find((t) => t.key === key)?.value;\n if (tagValue) {\n values.push(tagValue.toString());\n }\n const processTagValue = span.process.tags.find((t) => t.key === key)?.value;\n if (processTagValue) {\n values.push(processTagValue.toString());\n }\n if (span.logs !== null) {\n span.logs.forEach((log) => {\n const logsTagValue = log.fields.find((t) => t.key === key)?.value;\n if (logsTagValue) {\n values.push(logsTagValue.toString());\n }\n });\n }\n\n switch (key) {\n case KIND:\n if (span.kind) {\n values.push(span.kind);\n }\n break;\n case STATUS:\n if (span.statusCode !== undefined) {\n values.push(SpanStatusCode[span.statusCode].toLowerCase());\n }\n break;\n case STATUS_MESSAGE:\n if (span.statusMessage) {\n values.push(span.statusMessage);\n }\n break;\n case LIBRARY_NAME:\n if (span.instrumentationLibraryName) {\n values.push(span.instrumentationLibraryName);\n }\n break;\n case LIBRARY_VERSION:\n if (span.instrumentationLibraryVersion) {\n values.push(span.instrumentationLibraryVersion);\n }\n break;\n case TRACE_STATE:\n if (span.traceState) {\n values.push(span.traceState);\n }\n break;\n case ID:\n values.push(span.spanID);\n break;\n default:\n break;\n }\n });\n\n return uniq(values).sort();\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { useMount } from 'react-use';\n\nimport { GrafanaTheme2, SelectableValue, toOption, TraceSearchProps, TraceSearchTag } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { AccessoryButton } from '@grafana/plugin-ui';\nimport { Input, Select, Stack, useStyles2 } from '@grafana/ui';\n\nimport { randomId } from '../../../../state/constants';\nimport { getTraceTagKeys, getTraceTagValues } from '../../../utils/tags';\nimport { Trace } from '../../types/trace';\n\ninterface Props {\n search: TraceSearchProps;\n setSearch: (search: TraceSearchProps) => void;\n trace: Trace;\n tagKeys?: Array<SelectableValue<string>>;\n setTagKeys: React.Dispatch<React.SetStateAction<Array<SelectableValue<string>> | undefined>>;\n tagValues: Record<string, Array<SelectableValue<string>>>;\n setTagValues: React.Dispatch<React.SetStateAction<{ [key: string]: Array<SelectableValue<string>> }>>;\n}\n\nexport const SpanFiltersTags = ({ search, trace, setSearch, tagKeys, setTagKeys, tagValues, setTagValues }: Props) => {\n const styles = { ...useStyles2(getStyles) };\n\n const getTagKeys = () => {\n if (!tagKeys) {\n setTagKeys(getTraceTagKeys(trace).map(toOption));\n }\n };\n\n const getTagValues = (key: string) => {\n return getTraceTagValues(trace, key).map(toOption);\n };\n\n useMount(() => {\n if (search.tags) {\n search.tags.forEach((tag) => {\n if (tag.key) {\n setTagValues({\n ...tagValues,\n [tag.id]: getTagValues(tag.key),\n });\n }\n });\n }\n });\n\n const onTagChange = (tag: TraceSearchTag, v: SelectableValue<string>) => {\n setSearch({\n ...search,\n tags: search.tags?.map((x) => {\n return x.id === tag.id ? { ...x, key: v?.value || '', value: undefined } : x;\n }),\n });\n\n const loadTagValues = async () => {\n if (v?.value) {\n setTagValues({\n ...tagValues,\n [tag.id]: getTagValues(v.value),\n });\n } else {\n // removed value\n const updatedValues = { ...tagValues };\n if (updatedValues[tag.id]) {\n delete updatedValues[tag.id];\n }\n setTagValues(updatedValues);\n }\n };\n loadTagValues();\n };\n\n const addTag = () => {\n const tag = {\n id: randomId(),\n operator: '=',\n };\n setSearch({ ...search, tags: [...search.tags, tag] });\n };\n\n const removeTag = (id: string) => {\n let tags = search.tags.filter((tag) => {\n return tag.id !== id;\n });\n if (tags.length === 0) {\n tags = [\n {\n id: randomId(),\n operator: '=',\n },\n ];\n }\n setSearch({ ...search, tags: tags });\n };\n\n return (\n <div>\n {search.tags?.map((tag, i) => (\n <div key={tag.id}>\n <Stack gap={0} width={'auto'} justifyContent={'flex-start'} alignItems={'center'}>\n <div>\n <Select\n aria-label={t('explore.span-filters-tags.aria-label-select-tag-key', 'Select tag key')}\n isClearable\n key={tag.key}\n onChange={(v) => onTagChange(tag, v)}\n onOpenMenu={getTagKeys}\n options={tagKeys || (tag.key ? [tag.key].map(toOption) : [])}\n placeholder={t('explore.span-filters-tags.placeholder-select-tag', 'Select tag')}\n value={tag.key || null}\n />\n </div>\n <div>\n <Select\n aria-label={t('explore.span-filters-tags.aria-label-select-tag-operator', 'Select tag operator')}\n onChange={(v) => {\n setSearch({\n ...search,\n tags: search.tags?.map((x) => {\n return x.id === tag.id ? { ...x, operator: v.value! } : x;\n }),\n });\n }}\n options={[toOption('='), toOption('!='), toOption('=~'), toOption('!~')]}\n value={tag.operator}\n />\n </div>\n\n <span className={styles.tagValues}>\n {(tag.operator === '=' || tag.operator === '!=') && (\n <Select\n aria-label={t('explore.span-filters-tags.aria-label-select-tag-value', 'Select tag value')}\n isClearable\n key={tag.value}\n onChange={(v) => {\n setSearch({\n ...search,\n tags: search.tags?.map((x) => {\n return x.id === tag.id ? { ...x, value: v?.value || '' } : x;\n }),\n });\n }}\n options={tagValues[tag.id] ? tagValues[tag.id] : tag.value ? [tag.value].map(toOption) : []}\n placeholder={t('explore.span-filters-tags.placeholder-select-value', 'Select value')}\n value={tag.value}\n />\n )}\n {(tag.operator === '=~' || tag.operator === '!~') && (\n <Input\n aria-label={t('explore.span-filters-tags.aria-label-input-tag-value', 'Input tag value')}\n onChange={(v) => {\n setSearch({\n ...search,\n tags: search.tags?.map((x) => {\n return x.id === tag.id ? { ...x, value: v?.currentTarget?.value || '' } : x;\n }),\n });\n }}\n placeholder={t('explore.span-filters-tags.placeholder-tag-value', 'Tag value')}\n width={18}\n value={tag.value || ''}\n />\n )}\n </span>\n {(tag.key || tag.value || search.tags.length > 1) && (\n <AccessoryButton\n aria-label={t('explore.span-filters-tags.aria-label-remove-tag', 'Remove tag')}\n variant=\"secondary\"\n icon=\"times\"\n onClick={() => removeTag(tag.id)}\n tooltip={t('explore.span-filters-tags.tooltip-remove-tag', 'Remove tag')}\n />\n )}\n {(tag.key || tag.value) && i === search.tags.length - 1 && (\n <span className={styles.addTag}>\n <AccessoryButton\n aria-label={t('explore.span-filters-tags.aria-label-add-tag', 'Add tag')}\n variant=\"secondary\"\n icon=\"plus\"\n onClick={addTag}\n tooltip={t('explore.span-filters-tags.tooltip-add-tag', 'Add tag')}\n />\n </span>\n )}\n </Stack>\n </div>\n ))}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n addTag: css({\n marginLeft: theme.spacing(1),\n }),\n tagValues: css({\n maxWidth: '200px',\n }),\n});\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * binds multiple combinations to the same callback\n *\n * @param {Array} combinations\n * @param {Function} callback\n * @param {string|undefined} action\n * @returns void\n */\nmodule.exports = function (combinations, callback, action) {\n var self = this\n\n for (var j = 0; j < combinations.length; ++j) {\n self.bindSingle(combinations[j], callback, action)\n }\n}\n","/* eslint-env node, browser */\n'use strict'\n\nmodule.exports = function (element, options) {\n var self = this\n var Combokeys = self.constructor\n\n /**\n * an object of passed options\n *\n * @type { storeInstancesGlobally?: true }\n */\n\n self.options = Object.assign({ storeInstancesGlobally: true }, options || {})\n\n /**\n * a list of all the callbacks setup via Combokeys.bind()\n *\n * @type {Object}\n */\n self.callbacks = {}\n\n /**\n * direct map of string combinations to callbacks used for trigger()\n *\n * @type {Object}\n */\n self.directMap = {}\n\n /**\n * keeps track of what level each sequence is at since multiple\n * sequences can start out with the same sequence\n *\n * @type {Object}\n */\n self.sequenceLevels = {}\n\n /**\n * variable to store the setTimeout call\n *\n * @type {null|number}\n */\n self.resetTimer = null\n\n /**\n * temporary state where we will ignore the next keyup\n *\n * @type {boolean|string}\n */\n self.ignoreNextKeyup = false\n\n /**\n * temporary state where we will ignore the next keypress\n *\n * @type {boolean}\n */\n self.ignoreNextKeypress = false\n\n /**\n * are we currently inside of a sequence?\n * type of action (\"keyup\" or \"keydown\" or \"keypress\") or false\n *\n * @type {boolean|string}\n */\n self.nextExpectedAction = false\n\n self.element = element\n\n self.addEvents()\n\n if (self.options.storeInstancesGlobally) {\n Combokeys.instances.push(self)\n }\n\n return self\n}\n\nmodule.exports.prototype.bind = require('./prototype/bind')\nmodule.exports.prototype.bindMultiple = require('./prototype/bindMultiple')\nmodule.exports.prototype.unbind = require('./prototype/unbind')\nmodule.exports.prototype.trigger = require('./prototype/trigger')\nmodule.exports.prototype.reset = require('./prototype/reset.js')\nmodule.exports.prototype.stopCallback = require('./prototype/stopCallback')\nmodule.exports.prototype.handleKey = require('./prototype/handleKey')\nmodule.exports.prototype.addEvents = require('./prototype/addEvents')\nmodule.exports.prototype.bindSingle = require('./prototype/bindSingle')\nmodule.exports.prototype.getKeyInfo = require('./prototype/getKeyInfo')\nmodule.exports.prototype.pickBestAction = require('./prototype/pickBestAction')\nmodule.exports.prototype.getReverseMap = require('./prototype/getReverseMap')\nmodule.exports.prototype.getMatches = require('./prototype/getMatches')\nmodule.exports.prototype.resetSequences = require('./prototype/resetSequences')\nmodule.exports.prototype.fireCallback = require('./prototype/fireCallback')\nmodule.exports.prototype.bindSequence = require('./prototype/bindSequence')\nmodule.exports.prototype.resetSequenceTimer = require('./prototype/resetSequenceTimer')\nmodule.exports.prototype.detach = require('./prototype/detach')\n\nmodule.exports.instances = []\nmodule.exports.reset = require('./reset')\n\n/**\n * variable to store the flipped version of MAP from above\n * needed to check if we should use keypress or not when no action\n * is specified\n *\n * @type {Object|undefined}\n */\nmodule.exports.REVERSE_MAP = null\n","import { cloneDeep, merge } from 'lodash';\nimport { useEffect, useMemo, useCallback, useState } from 'react';\n\nimport { InterpolateFunction, TraceSearchProps } from '@grafana/data';\nimport { useDispatch, useSelector } from 'app/types/store';\n\nimport { DEFAULT_SPAN_FILTERS, randomId } from '../state/constants';\nimport { changePanelState } from '../state/explorePane';\n\nimport { TraceSpan } from './components/types/trace';\nimport { filterSpans } from './components/utils/filter-spans';\n\n/**\n * Controls the state of search input that highlights spans if they match the search string.\n * Uses global state for Explore (when exploreId is provided) or local state for panels (when no exploreId).\n * @param exploreId - The explore pane ID (optional, for global state management)\n * @param spans - The trace spans to filter\n * @param initialFilters - Initial filters to set\n */\nexport function useSearch(exploreId?: string, spans?: TraceSpan[], initialFilters?: TraceSearchProps) {\n const dispatch = useDispatch();\n\n // Global state logic (for Explore)\n const panelState = useSelector((state) => state.explore.panes[exploreId ?? '']?.panelsState.trace);\n const { spanFilters: globalFilters } = panelState || {};\n\n // Local state logic (for TracesPanel and other non-Explore usage)\n const [localSearch, setLocalSearch] = useState<TraceSearchProps>(() => {\n const merged = merge(cloneDeep(DEFAULT_SPAN_FILTERS), initialFilters ?? {});\n // Ensure tags is always an array\n if (!merged.tags || !Array.isArray(merged.tags)) {\n merged.tags = [{ id: randomId(), operator: '=' }];\n }\n return merged;\n });\n\n // Determine which state to use based on exploreId presence\n const search = exploreId\n ? globalFilters || merge(cloneDeep(DEFAULT_SPAN_FILTERS), initialFilters ?? {})\n : localSearch;\n\n // Ensure tags is always an array for safety\n if (search && (!search.tags || !Array.isArray(search.tags))) {\n search.tags = [{ id: randomId(), operator: '=' }];\n }\n\n // Global state initialization (only when exploreId exists)\n useEffect(() => {\n if (exploreId && !globalFilters) {\n const mergedFilters = merge(cloneDeep(DEFAULT_SPAN_FILTERS), initialFilters ?? {});\n // Ensure tags is always an array\n if (!mergedFilters.tags || !Array.isArray(mergedFilters.tags)) {\n mergedFilters.tags = [{ id: randomId(), operator: '=' }];\n }\n\n dispatch(changePanelState(exploreId, 'trace', { ...panelState, spanFilters: mergedFilters }));\n }\n }, [exploreId, initialFilters, globalFilters, dispatch, panelState]);\n\n // Local state updates (only when no exploreId)\n useEffect(() => {\n if (!exploreId && initialFilters) {\n setLocalSearch((prev) => {\n const merged = merge(cloneDeep(prev), initialFilters);\n // Ensure tags is always an array\n if (!merged.tags || !Array.isArray(merged.tags)) {\n merged.tags = [{ id: randomId(), operator: '=' }];\n }\n return merged;\n });\n }\n }, [exploreId, initialFilters]);\n\n // Function to update span filters (global or local based on exploreId)\n const setSearch = useCallback(\n (newSearch: TraceSearchProps) => {\n if (exploreId) {\n dispatch(changePanelState(exploreId, 'trace', { ...panelState, spanFilters: newSearch }));\n } else {\n setLocalSearch(newSearch);\n }\n },\n [exploreId, dispatch, panelState]\n );\n\n const spanFilterMatches: Set<string> | undefined = useMemo(() => {\n return spans && filterSpans(search, spans);\n }, [search, spans]);\n\n return { search, setSearch, spanFilterMatches };\n}\n\nexport function replaceSearchVariables(replaceVariables: InterpolateFunction, search?: TraceSearchProps) {\n if (!search) {\n return search;\n }\n\n const newSearch = { ...search };\n\n // Ensure tags is always an array\n if (!newSearch.tags || !Array.isArray(newSearch.tags)) {\n newSearch.tags = [{ id: randomId(), operator: '=' }];\n }\n\n if (newSearch.query) {\n newSearch.query = replaceVariables(newSearch.query);\n }\n if (newSearch.serviceNameOperator) {\n newSearch.serviceNameOperator = replaceVariables(newSearch.serviceNameOperator);\n }\n if (newSearch.serviceName) {\n newSearch.serviceName = replaceVariables(newSearch.serviceName);\n }\n if (newSearch.spanNameOperator) {\n newSearch.spanNameOperator = replaceVariables(newSearch.spanNameOperator);\n }\n if (newSearch.spanName) {\n newSearch.spanName = replaceVariables(newSearch.spanName);\n }\n if (newSearch.from) {\n newSearch.from = replaceVariables(newSearch.from);\n }\n if (newSearch.to) {\n newSearch.to = replaceVariables(newSearch.to);\n }\n if (newSearch.tags) {\n newSearch.tags = newSearch.tags.map((tag) => {\n return {\n ...tag,\n key: replaceVariables(tag.key ?? ''),\n value: replaceVariables(tag.value ?? ''),\n };\n });\n }\n\n return newSearch;\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * called to set a 1 second timeout on the specified sequence\n *\n * this is so after each key press in the sequence you have 1 second\n * to press the next key before you have to start over\n *\n * @returns void\n */\nmodule.exports = function () {\n var self = this\n\n clearTimeout(self.resetTimer)\n self.resetTimer = setTimeout(\n function () {\n self.resetSequences()\n },\n 1000\n )\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * Gets info for a specific key combination\n *\n * @param {string} combination key combination (\"command+s\" or \"a\" or \"*\")\n * @param {string=} action\n * @returns {Object}\n */\nmodule.exports = function (combination, action) {\n var self = this\n var keysFromString\n var keys\n var key\n var j\n var modifiers = []\n var SPECIAL_ALIASES\n var SHIFT_MAP\n var isModifier\n\n keysFromString = require('../../helpers/keysFromString')\n // take the keys from this pattern and figure out what the actual\n // pattern is all about\n keys = keysFromString(combination)\n\n SPECIAL_ALIASES = require('../../helpers/special-aliases')\n SHIFT_MAP = require('../../helpers/shift-map')\n isModifier = require('../../helpers/isModifier')\n for (j = 0; j < keys.length; ++j) {\n key = keys[j]\n\n // normalize key names\n if (SPECIAL_ALIASES[key]) {\n key = SPECIAL_ALIASES[key]\n }\n\n // if this is not a keypress event then we should\n // be smart about using shift keys\n // this will only work for US keyboards however\n if (action && action !== 'keypress' && SHIFT_MAP[key]) {\n key = SHIFT_MAP[key]\n modifiers.push('shift')\n }\n\n // if this key is a modifier then add it to the list of modifiers\n if (isModifier(key)) {\n modifiers.push(key)\n }\n }\n\n // depending on what the key combination is\n // we will try to pick the best event for it\n action = self.pickBestAction(key, modifiers, action)\n\n return {\n key: key,\n modifiers: modifiers,\n action: action\n }\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n* should we stop this event before firing off callbacks\n*\n* @param {Event} e\n* @param {Element} element\n* @return {boolean}\n*/\nmodule.exports = function (e, element) {\n // if the element has the class \"combokeys\" then no need to stop\n if ((' ' + element.className + ' ').indexOf(' combokeys ') > -1) {\n return false\n }\n\n var tagName = element.tagName.toLowerCase()\n\n // stop for input, select, and textarea\n return tagName === 'input' || tagName === 'select' || tagName === 'textarea' || element.isContentEditable\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * handles a keydown event\n *\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (e) {\n var self = this\n var characterFromEvent\n var eventModifiers\n\n // normalize e.which for key events\n // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion\n if (typeof e.which !== 'number') {\n e.which = e.keyCode\n }\n characterFromEvent = require('../../helpers/characterFromEvent')\n var character = characterFromEvent(e)\n\n // no character found then stop\n if (character === undefined) {\n return\n }\n\n // need to use === for the character check because the character can be 0\n if (e.type === 'keyup' && self.ignoreNextKeyup === character) {\n self.ignoreNextKeyup = false\n return\n }\n\n eventModifiers = require('../../helpers/eventModifiers')\n self.handleKey(character, eventModifiers(e), e)\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License\n\nexport default class TreeNode<TValue> {\n value: TValue;\n children: Array<TreeNode<TValue>>;\n\n static iterFunction<TValue>(\n fn: ((value: TValue, node: TreeNode<TValue>, depth: number) => TreeNode<TValue> | null) | Function,\n depth = 0\n ) {\n return (node: TreeNode<TValue>) => fn(node.value, node, depth);\n }\n\n static searchFunction<TValue>(search: Function | TreeNode<TValue>) {\n if (typeof search === 'function') {\n return search;\n }\n\n return (value: TValue, node: TreeNode<TValue>) => (search instanceof TreeNode ? node === search : value === search);\n }\n\n constructor(value: TValue, children: Array<TreeNode<TValue>> = []) {\n this.value = value;\n this.children = children;\n }\n\n get depth(): number {\n return this.children.reduce((depth, child) => Math.max(child.depth + 1, depth), 1);\n }\n\n get size() {\n let i = 0;\n this.walk(() => i++);\n return i;\n }\n\n addChild(child: TreeNode<TValue> | TValue) {\n this.children.push(child instanceof TreeNode ? child : new TreeNode(child));\n return this;\n }\n\n find(search: Function | TreeNode<TValue>): TreeNode<TValue> | null {\n const searchFn = TreeNode.iterFunction(TreeNode.searchFunction(search));\n if (searchFn(this)) {\n return this;\n }\n for (let i = 0; i < this.children.length; i++) {\n const result = this.children[i].find(search);\n if (result) {\n return result;\n }\n }\n return null;\n }\n\n getPath(search: Function | TreeNode<TValue>) {\n const searchFn = TreeNode.iterFunction(TreeNode.searchFunction(search));\n\n const findPath = (\n currentNode: TreeNode<TValue>,\n currentPath: Array<TreeNode<TValue>>\n ): Array<TreeNode<TValue>> | null => {\n // skip if we already found the result\n const attempt = currentPath.concat([currentNode]);\n // base case: return the array when there is a match\n if (searchFn(currentNode)) {\n return attempt;\n }\n for (let i = 0; i < currentNode.children.length; i++) {\n const child = currentNode.children[i];\n const match = findPath(child, attempt);\n if (match) {\n return match;\n }\n }\n return null;\n };\n\n return findPath(this, []);\n }\n\n walk(fn: (spanID: TValue, node: TreeNode<TValue>, depth: number) => void, startDepth = 0) {\n type StackEntry = {\n node: TreeNode<TValue>;\n depth: number;\n };\n const nodeStack: StackEntry[] = [];\n let actualDepth = startDepth;\n nodeStack.push({ node: this, depth: actualDepth });\n while (nodeStack.length) {\n const entry: StackEntry = nodeStack[nodeStack.length - 1];\n nodeStack.pop();\n const { node, depth } = entry;\n fn(node.value, node, depth);\n actualDepth = depth + 1;\n let i = node.children.length - 1;\n while (i >= 0) {\n nodeStack.push({ node: node.children[i], depth: actualDepth });\n i--;\n }\n }\n }\n\n paths(fn: (pathIds: TValue[]) => void) {\n type StackEntry = {\n node: TreeNode<TValue>;\n childIndex: number;\n };\n const stack: StackEntry[] = [];\n stack.push({ node: this, childIndex: 0 });\n const paths: TValue[] = [];\n while (stack.length) {\n const { node, childIndex } = stack[stack.length - 1];\n if (node.children.length >= childIndex + 1) {\n stack[stack.length - 1].childIndex++;\n stack.push({ node: node.children[childIndex], childIndex: 0 });\n } else {\n if (node.children.length === 0) {\n const path = stack.map((item) => item.node.value);\n fn(path);\n }\n stack.pop();\n }\n }\n return paths;\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { createSelector } from 'reselect';\n\nimport { TraceSpanData, TraceSpanReference } from '../types/trace';\n\nexport const getSpanId = (span: TraceSpanData) => span.spanID;\nexport const getSpanReferences = (span: TraceSpanData) => span.references || [];\nexport const getSpanReferenceByType = createSelector(\n createSelector(({ span }: { span: TraceSpanData }) => span, getSpanReferences),\n ({ type }: { type: string }) => type,\n (references, type) => references.find((ref: TraceSpanReference) => ref.refType === type)\n);\nexport const getSpanParentId = createSelector(\n (span: TraceSpanData) => getSpanReferenceByType({ span, type: 'CHILD_OF' }),\n (childOfRef) => (childOfRef ? childOfRef.spanID : null)\n);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { createSelector } from 'reselect';\n\nimport { TraceResponse, TraceSpanData } from '../types/trace';\nimport TreeNode from '../utils/TreeNode';\n\nimport { getSpanId } from './span';\n\nexport const getTraceSpans = (trace: TraceResponse) => trace.spans;\n\nexport const getTraceSpansAsMap = createSelector(getTraceSpans, (spans) =>\n spans.reduce((map, span: TraceSpanData) => map.set(getSpanId(span), span), new Map())\n);\n\nexport const TREE_ROOT_ID = '__root__';\n\n/**\n * Build a tree of { value: spanID, children } items derived from the\n * `span.references` information. The tree represents the grouping of parent /\n * child relationships. The root-most node is nominal in that\n * `.value === TREE_ROOT_ID`. This is done because a root span (the main trace\n * span) is not always included with the trace data. Thus, there can be\n * multiple top-level spans, and the root node acts as their common parent.\n *\n * The children are sorted by `span.startTime` after the tree is built.\n *\n * @param {Trace} trace The trace to build the tree of spanIDs.\n * @return {TreeNode} A tree of spanIDs derived from the relationships\n * between spans in the trace.\n */\nexport function getTraceSpanIdsAsTree(trace: TraceResponse, spanMap: Map<string, TraceSpanData> | null = null) {\n const nodesById = new Map(trace.spans.map((span: TraceSpanData) => [span.spanID, new TreeNode(span.spanID)]));\n const spansById = spanMap ?? new Map(trace.spans.map((span: TraceSpanData) => [span.spanID, span]));\n const root = new TreeNode(TREE_ROOT_ID);\n trace.spans.forEach((span: TraceSpanData) => {\n const node = nodesById.get(span.spanID)!;\n if (Array.isArray(span.references) && span.references.length) {\n const { refType, spanID: parentID } = span.references[0];\n if (refType === 'CHILD_OF' || refType === 'FOLLOWS_FROM') {\n const parent = nodesById.get(parentID) || root;\n parent.children?.push(node);\n } else {\n throw new Error(`Unrecognized ref type: ${refType}`);\n }\n } else {\n root.children.push(node);\n }\n });\n const comparator = (nodeA: TreeNode<string>, nodeB: TreeNode<string>) => {\n const a: TraceSpanData | undefined = nodeA?.value ? spansById.get(nodeA.value.toString()) : undefined;\n const b: TraceSpanData | undefined = nodeB?.value ? spansById.get(nodeB.value.toString()) : undefined;\n return +(a?.startTime! > b?.startTime!) || +(a?.startTime === b?.startTime) - 1;\n };\n trace.spans.forEach((span: TraceSpanData) => {\n const node = nodesById.get(span.spanID);\n if (node!.children.length > 1) {\n node?.children.sort(comparator);\n }\n });\n root.children.sort(comparator);\n return root;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const FALLBACK_DAG_MAX_NUM_SERVICES = 100;\nexport const FALLBACK_TRACE_NAME = '<trace-without-root-span>';\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { FALLBACK_DAG_MAX_NUM_SERVICES } from './index';\n\nexport default Object.defineProperty(\n {\n archiveEnabled: false,\n dependencies: {\n dagMaxNumServices: FALLBACK_DAG_MAX_NUM_SERVICES,\n menuEnabled: true,\n },\n linkPatterns: [],\n search: {\n maxLookback: {\n label: '2 Days',\n value: '2d',\n },\n maxLimit: 1500,\n },\n tracking: {\n gaID: null,\n trackErrors: true,\n },\n },\n // fields that should be individually merged vs wholesale replaced\n '__mergeFields',\n { value: ['dependencies', 'search', 'tracking'] }\n);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { get as _get } from 'lodash';\n\nimport defaultConfig from '../../constants/default-config';\n\n/**\n * Merge the embedded config from the query service (if present) with the\n * default config from `../../constants/default-config`.\n */\nexport default function getConfig() {\n return defaultConfig;\n}\n\nexport function getConfigValue(path: string) {\n return _get(getConfig(), path);\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { isEqual as _isEqual } from 'lodash';\n\n// @ts-ignore\nimport { TraceKeyValuePair } from '@grafana/data';\n\nimport { getTraceSpanIdsAsTree } from '../selectors/trace';\nimport { TraceResponse, Trace, TraceSpan, TraceProcess } from '../types/trace';\n// @ts-ignore\nimport TreeNode from '../utils/TreeNode';\nimport { getConfigValue } from '../utils/config/get-config';\n\nimport { getTraceName } from './trace-viewer';\n\n// exported for tests\nexport function deduplicateTags(tags: TraceKeyValuePair[]) {\n const warningsHash: Map<string, string> = new Map<string, string>();\n const dedupedTags: TraceKeyValuePair[] = tags.reduce<TraceKeyValuePair[]>((uniqueTags, tag) => {\n if (!uniqueTags.some((t) => t.key === tag.key && t.value === tag.value)) {\n uniqueTags.push(tag);\n } else {\n warningsHash.set(`${tag.key}:${tag.value}`, `Duplicate tag \"${tag.key}:${tag.value}\"`);\n }\n return uniqueTags;\n }, []);\n const warnings = Array.from(warningsHash.values());\n return { dedupedTags, warnings };\n}\n\n// exported for tests\nexport function orderTags(tags: TraceKeyValuePair[], topPrefixes?: string[]) {\n const orderedTags: TraceKeyValuePair[] = tags?.slice() ?? [];\n const tp = (topPrefixes || []).map((p: string) => p.toLowerCase());\n\n orderedTags.sort((a, b) => {\n const aKey = a.key.toLowerCase();\n const bKey = b.key.toLowerCase();\n\n for (let i = 0; i < tp.length; i++) {\n const p = tp[i];\n if (aKey.startsWith(p) && !bKey.startsWith(p)) {\n return -1;\n }\n if (!aKey.startsWith(p) && bKey.startsWith(p)) {\n return 1;\n }\n }\n\n if (aKey > bKey) {\n return 1;\n }\n if (aKey < bKey) {\n return -1;\n }\n return 0;\n });\n\n return orderedTags;\n}\n\n/**\n * NOTE: Mutates `data` - Transform the HTTP response data into the form the app\n * generally requires.\n */\nexport default function transformTraceData(data: TraceResponse | undefined): Trace | null {\n if (!data?.traceID) {\n return null;\n }\n const traceID = data.traceID.toLowerCase();\n\n let traceEndTime = 0;\n let traceStartTime = Number.MAX_SAFE_INTEGER;\n const spanIdCounts = new Map();\n const spanMap = new Map<string, TraceSpan>();\n // filter out spans with empty start times\n // eslint-disable-next-line no-param-reassign\n data.spans = data.spans.filter((span) => Boolean(span.startTime));\n\n // Sort process tags\n data.processes = Object.entries(data.processes).reduce<Record<string, TraceProcess>>((processes, [id, process]) => {\n processes[id] = {\n ...process,\n tags: orderTags(process.tags),\n };\n return processes;\n }, {});\n\n const max = data.spans.length;\n for (let i = 0; i < max; i++) {\n const span: TraceSpan = data.spans[i] as TraceSpan;\n const { startTime, duration, processID } = span;\n\n let spanID = span.spanID;\n // check for start / end time for the trace\n if (startTime < traceStartTime) {\n traceStartTime = startTime;\n }\n if (startTime + duration > traceEndTime) {\n traceEndTime = startTime + duration;\n }\n // make sure span IDs are unique\n const idCount = spanIdCounts.get(spanID);\n if (idCount != null) {\n // eslint-disable-next-line no-console\n console.warn(`Dupe spanID, ${idCount + 1} x ${spanID}`, span, spanMap.get(spanID));\n if (_isEqual(span, spanMap.get(spanID))) {\n // eslint-disable-next-line no-console\n console.warn('\\t two spans with same ID have `isEqual(...) === true`');\n }\n spanIdCounts.set(spanID, idCount + 1);\n spanID = `${spanID}_${idCount}`;\n span.spanID = spanID;\n } else {\n spanIdCounts.set(spanID, 1);\n }\n span.process = data.processes[processID];\n spanMap.set(spanID, span);\n }\n // tree is necessary to sort the spans, so children follow parents, and\n // siblings are sorted by start time\n const tree = getTraceSpanIdsAsTree(data, spanMap);\n const spans: TraceSpan[] = [];\n const svcCounts: Record<string, number> = {};\n\n tree.walk((spanID: string, node: TreeNode<string>, depth = 0) => {\n if (spanID === '__root__') {\n return;\n }\n if (typeof spanID !== 'string') {\n return;\n }\n const span = spanMap.get(spanID);\n if (!span) {\n return;\n }\n const { serviceName } = span.process;\n svcCounts[serviceName] = (svcCounts[serviceName] || 0) + 1;\n span.relativeStartTime = span.startTime - traceStartTime;\n span.depth = depth - 1;\n span.hasChildren = node.children.length > 0;\n span.childSpanCount = node.children.length;\n span.warnings = span.warnings || [];\n span.tags = span.tags || [];\n span.references = span.references || [];\n\n span.childSpanIds = node.children\n .slice()\n .sort((a, b) => {\n const spanA = spanMap.get(a.value)!;\n const spanB = spanMap.get(b.value)!;\n return spanB.startTime + spanB.duration - (spanA.startTime + spanA.duration);\n })\n .map((each) => each.value);\n\n const tagsInfo = deduplicateTags(span.tags);\n span.tags = orderTags(tagsInfo.dedupedTags, getConfigValue('topTagPrefixes'));\n span.warnings = span.warnings.concat(tagsInfo.warnings);\n span.references.forEach((ref, index) => {\n const refSpan = spanMap.get(ref.spanID);\n if (refSpan) {\n // eslint-disable-next-line no-param-reassign\n ref.span = refSpan;\n if (index > 0) {\n // Don't take into account the parent, just other references.\n refSpan.subsidiarilyReferencedBy = refSpan.subsidiarilyReferencedBy || [];\n refSpan.subsidiarilyReferencedBy.push({\n spanID,\n traceID,\n span,\n refType: ref.refType,\n });\n }\n }\n });\n spans.push(span);\n });\n const traceName = getTraceName(spans);\n const services = Object.keys(svcCounts).map((name) => ({ name, numberOfSpans: svcCounts[name] }));\n return {\n services,\n spans,\n traceID,\n traceName,\n // can't use spread operator for intersection types\n // repl: https://goo.gl/4Z23MJ\n // issue: https://github.com/facebook/flow/issues/1511\n processes: data.processes,\n duration: traceEndTime - traceStartTime,\n startTime: traceStartTime,\n endTime: traceEndTime,\n };\n}\n","import { DataFrame, DataFrameView, TraceSpanRow } from '@grafana/data';\n\nimport transformTraceData from '../components/model/transform-trace-data';\nimport { Trace, TraceProcess, TraceResponse } from '../components/types/trace';\n\nexport function transformDataFrames(frame?: DataFrame): Trace | null {\n if (!frame) {\n return null;\n }\n let data: TraceResponse | null =\n frame.fields.length === 1\n ? // For backward compatibility when we sent whole json response in a single field/value\n frame.fields[0].values[0]\n : transformTraceDataFrame(frame);\n\n if (!data) {\n return null;\n }\n return transformTraceData(data);\n}\n\nexport function transformTraceDataFrame(frame: DataFrame): TraceResponse | null {\n const view = new DataFrameView<TraceSpanRow>(frame);\n const processes: Record<string, TraceProcess> = {};\n for (let i = 0; i < view.length; i++) {\n const span = view.get(i);\n if (!span.spanID) {\n return null;\n }\n if (!processes[span.spanID]) {\n processes[span.spanID] = {\n serviceName: span.serviceName,\n tags: span.serviceTags,\n };\n }\n }\n\n return {\n traceID: view.get(0).traceID,\n processes,\n spans: view.toArray().map((s, index) => {\n const references = [];\n if (s.parentSpanID) {\n references.push({ refType: 'CHILD_OF' as const, spanID: s.parentSpanID, traceID: s.traceID });\n }\n if (s.references) {\n references.push(...s.references.map((reference) => ({ refType: 'FOLLOWS_FROM' as const, ...reference })));\n }\n return {\n ...s,\n duration: s.duration * 1000,\n startTime: s.startTime * 1000,\n processID: s.spanID,\n flags: 0,\n references,\n logs: s.logs?.map((l) => ({ ...l, timestamp: l.timestamp * 1000 })) || [],\n dataFrameRowIndex: index,\n };\n }),\n };\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * binds a key sequence to an event\n *\n * @param {string} combo - combo specified in bind call\n * @param {Array} keys\n * @param {Function} callback\n * @param {string=} action\n * @returns void\n */\nmodule.exports = function (combo, keys, callback, action) {\n var self = this\n\n // start off by adding a sequence level record for this combination\n // and setting the level to 0\n self.sequenceLevels[combo] = 0\n\n /**\n * callback to increase the sequence level for this sequence and reset\n * all other sequences that were active\n *\n * @param {string} nextAction\n * @returns {Function}\n */\n function increaseSequence (nextAction) {\n return function () {\n self.nextExpectedAction = nextAction\n ++self.sequenceLevels[combo]\n self.resetSequenceTimer()\n }\n }\n\n /**\n * wraps the specified callback inside of another function in order\n * to reset all sequence counters as soon as this sequence is done\n *\n * @param {Event} e\n * @returns void\n */\n function callbackAndReset (e) {\n var characterFromEvent\n self.fireCallback(callback, e, combo)\n\n // we should ignore the next key up if the action is key down\n // or keypress. this is so if you finish a sequence and\n // release the key the final key will not trigger a keyup\n if (action !== 'keyup') {\n characterFromEvent = require('../../helpers/characterFromEvent')\n self.ignoreNextKeyup = characterFromEvent(e)\n }\n\n // weird race condition if a sequence ends with the key\n // another sequence begins with\n setTimeout(\n function () {\n self.resetSequences()\n },\n 10\n )\n }\n\n // loop through keys one at a time and bind the appropriate callback\n // function. for any key leading up to the final one it should\n // increase the sequence. after the final, it should reset all sequences\n //\n // if an action is specified in the original bind call then that will\n // be used throughout. otherwise we will pass the action that the\n // next key in the sequence should match. this allows a sequence\n // to mix and match keypress and keydown events depending on which\n // ones are better suited to the key provided\n for (var j = 0; j < keys.length; ++j) {\n var isFinal = j + 1 === keys.length\n var wrappedCallback = isFinal ? callbackAndReset : increaseSequence(action || self.getKeyInfo(keys[j + 1]).action)\n self.bindSingle(keys[j], wrappedCallback, action, combo, j)\n }\n}\n","var off = require('./dom-event').off\nmodule.exports = function () {\n var self = this\n var element = self.element\n\n off(element, 'keypress', self.eventHandler)\n off(element, 'keydown', self.eventHandler)\n off(element, 'keyup', self.eventHandler)\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * handles a character key event\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (character, modifiers, e) {\n var self = this\n var callbacks\n var j\n var doNotReset = {}\n var maxLevel = 0\n var processedSequenceCallback = false\n var isModifier\n var ignoreThisKeypress\n\n callbacks = self.getMatches(character, modifiers, e)\n // Calculate the maxLevel for sequences so we can only execute the longest callback sequence\n for (j = 0; j < callbacks.length; ++j) {\n if (callbacks[j].seq) {\n maxLevel = Math.max(maxLevel, callbacks[j].level)\n }\n }\n\n // loop through matching callbacks for this key event\n for (j = 0; j < callbacks.length; ++j) {\n // fire for all sequence callbacks\n // this is because if for example you have multiple sequences\n // bound such as \"g i\" and \"g t\" they both need to fire the\n // callback for matching g cause otherwise you can only ever\n // match the first one\n if (callbacks[j].seq) {\n // only fire callbacks for the maxLevel to prevent\n // subsequences from also firing\n //\n // for example 'a option b' should not cause 'option b' to fire\n // even though 'option b' is part of the other sequence\n //\n // any sequences that do not match here will be discarded\n // below by the resetSequences call\n if (callbacks[j].level !== maxLevel) {\n continue\n }\n\n processedSequenceCallback = true\n\n // keep a list of which sequences were matches for later\n doNotReset[callbacks[j].seq] = 1\n self.fireCallback(callbacks[j].callback, e, callbacks[j].combo, callbacks[j].seq)\n continue\n }\n\n // if there were no sequence matches but we are still here\n // that means this is a regular match so we should fire that\n if (!processedSequenceCallback) {\n self.fireCallback(callbacks[j].callback, e, callbacks[j].combo)\n }\n }\n\n // if the key you pressed matches the type of sequence without\n // being a modifier (ie \"keyup\" or \"keypress\") then we should\n // reset all sequences that were not matched by this event\n //\n // this is so, for example, if you have the sequence \"h a t\" and you\n // type \"h e a r t\" it does not match. in this case the \"e\" will\n // cause the sequence to reset\n //\n // modifier keys are ignored because you can have a sequence\n // that contains modifiers such as \"enter ctrl+space\" and in most\n // cases the modifier key will be pressed before the next key\n //\n // also if you have a sequence such as \"ctrl+b a\" then pressing the\n // \"b\" key will trigger a \"keypress\" and a \"keydown\"\n //\n // the \"keydown\" is expected when there is a modifier, but the\n // \"keypress\" ends up matching the nextExpectedAction since it occurs\n // after and that causes the sequence to reset\n //\n // we ignore keypresses in a sequence that directly follow a keydown\n // for the same character\n ignoreThisKeypress = e.type === 'keypress' && self.ignoreNextKeypress\n isModifier = require('../../helpers/isModifier')\n if (e.type === self.nextExpectedAction && !isModifier(character) && !ignoreThisKeypress) {\n self.resetSequences(doNotReset)\n }\n\n self.ignoreNextKeypress = processedSequenceCallback && e.type === 'keydown'\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * reverses the map lookup so that we can look for specific keys\n * to see what can and can't use keypress\n *\n * @return {Object}\n */\nmodule.exports = function () {\n var self = this\n var constructor = self.constructor\n var SPECIAL_KEYS_MAP\n\n if (!constructor.REVERSE_MAP) {\n constructor.REVERSE_MAP = {}\n SPECIAL_KEYS_MAP = require('../../helpers/special-keys-map')\n for (var key in SPECIAL_KEYS_MAP) {\n // pull out the numeric keypad from here cause keypress should\n // be able to detect the keys from the character\n if (key > 95 && key < 112) {\n continue\n }\n\n if (SPECIAL_KEYS_MAP.hasOwnProperty(key)) {\n constructor.REVERSE_MAP[SPECIAL_KEYS_MAP[key]] = key\n }\n }\n }\n return constructor.REVERSE_MAP\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * determines if the keycode specified is a modifier key or not\n *\n * @param {string} key\n * @returns {boolean}\n */\nmodule.exports = function (key) {\n return key === 'shift' || key === 'ctrl' || key === 'alt' || key === 'meta'\n}\n","/* eslint-env node, browser */\n'use strict'\nmodule.exports = function () {\n var self = this\n var on = require('./dom-event')\n var element = self.element\n\n self.eventHandler = require('./handleKeyEvent').bind(self)\n\n on(element, 'keypress', self.eventHandler)\n on(element, 'keydown', self.eventHandler)\n on(element, 'keyup', self.eventHandler)\n}\n"],"names":["useMount","fn","module","self","combokeys","callback","e","combo","sequence","preventDefault","stopPropagation","autoColor","theme","hex","base","color","newColor","SpanStatusCode","on","off","element","event","capture","key","modifiers","action","character","sequenceName","combination","level","j","matches","isModifier","modifiersMatch","anyCharCallbacks","deleteCombo","deleteSequence","AccessoryButton","className","props","styles","getButtonStyles","getStyles","CopyIcon","copyText","icon","tooltipTitle","hasCopied","setHasCopied","handleClick","Tooltip","Button","INDENT","inlineRule","objRule","str","rule","Stylize","styleFile","styleClass","cssClass","styleInline","type","doc","jsonMarkup","indent","style","forEach","list","start","end","out","i","visit","obj","keys","copyIconClassName","jsonObjectOrArrayStartRegex","parseIfComplexJson","value","LinkValue","link","children","path","title","onClick","Icon","KeyValuesTable","data","linksGetter","onlyValues","row","markup","jsonTable","links","valueMarkup","info","SPECIAL_KEYS_MAP","SPECIAL_CHARACTERS_MAP","modifiers1","modifiers2","KIND","STATUS","STATUS_MESSAGE","LIBRARY_NAME","LIBRARY_VERSION","TRACE_STATE","ID","getTraceToLogsOptions","traceToLogs","tag","TraceToLogsSettings","options","onOptionsChange","supportedDataSourceTypes","query","tags","customQuery","updateTracesToLogs","ds","getTimeShiftLabel","getTimeShiftTooltip","val","invalidTimeShiftError","v","IdFilter","defaultVal","TraceToLogsSection","suffix","spanMap","currentSpan","returningChildStartTime","lastFinishingChildSpanId","each","followFromSpanIds","followFromSpansDescendantIds","parentSpan","a","findDescendantSpans","spanIds","spanId","span","id","childEndTime","parentEndTime","computeCriticalPath","criticalPath","lastFinishingChildSpan","spanCriticalSection","parentSpanId","reference","criticalPathForTrace","trace","rootSpanId","map","refinedSpanMap","sanitizedSpanMap","error","strToRgb","s","r","g","b","ColorGenerator","colorsHex","filteredColors","getFilteredColors","hash","prevColor","tinycolor","newIndex","chr","getGenerator","colors","clear","getColorByKey","getRgbColorByKey","filtered","redIndex","redIndex2","ITEM_ALPHA","MIN_ITEM_HEIGHT","MAX_TOTAL_HEIGHT","MIN_ITEM_WIDTH","MIN_TOTAL_HEIGHT","MAX_ITEM_HEIGHT","renderIntoCanvas","canvas","items","totalValueWidth","getFillColor","bgColor","fillCache","cHeight","cWidth","itemHeight","itemYChange","ctx","valueWidth","valueOffset","serviceName","x","width","fillStyle","stylesFactory","UnthemedCanvasSpanGraph","elm","STANDARD_DATE_FORMAT","STANDARD_TIME_FORMAT","ONE_MILLISECOND","ONE_SECOND","ONE_MINUTE","ONE_HOUR","ONE_DAY","DEFAULT_MS_PRECISION","UNIT_STEPS","quantizeDuration","duration","floatPrecision","conversionFactor","formatDate","formatTime","formatMillisecondTime","targetDuration","formatSecondTime","formatDuration","primaryUnit","secondaryUnit","microseconds","index","primaryValue","secondaryValue","secondaryValueRounded","primaryUnitString","secondaryUnitString","TickLabels","numTicks","ticks","portion","EUpdateTypes","LEFT_MOUSE_BUTTON","DraggableManager","getBounds","resetBoundsOnResize","rest","button","clientX","eventType","handler","clientXLeft","maxValue","minValue","GraphTicks","Scrubber","isDragging","onMouseDown","onMouseEnter","onMouseLeave","position","xPercent","ViewingLayerResetZoomHoverClassName","ViewingLayerResetZoom","dragTypes","getNextViewLayout","left","right","UnthemedViewingLayer","viewStart","viewEnd","shift","time","update","manager","anchor","preventCursorLine","from","to","layout","height","viewRange","current","cursor","shiftStart","shiftEnd","reframe","haveNextTimeRange","leftInactive","rightInactive","cursorPosition","DEFAULT_HEIGHT","TIMELINE_TICK_INTERVAL","getItem","getItems","memoizedGetitems","SpanGraph","updateNextViewRangeTime","updateViewRangeTime","CanvasSpanGraph","ViewingLayer","validateIntervalRegex","validateInterval","regex","intervalIsInvalid","setIntervalIsInvalid","useDebounce","fieldProps","SearchBarInput","onChange","clearUiFind","IconButton","spanFilterMatches","setFocusedSpanIdForSearch","focusedSpanIndexForSearch","setFocusedSpanIndexForSearch","datasourceType","showSpanFilters","spanMatches","nextResult","buttonEnabled","prevResult","nextResultOnKeyDown","prevResultOnKeyDown","buttonClass","getTooltip","content","getMatchesMetadata","depth","services","metadata","text","matchedServices","spanID","p","buttonStyles","search","setShowSpanFilterMatchesOnly","setShowCriticalPathSpansOnly","clearEnabled","Switch","NextPrevResult","SpanFilters","setSearch","setShowSpanFilters","serviceNames","setServiceNames","spanNames","setSpanNames","tagKeys","setTagKeys","tagValues","setTagValues","prevTraceIdRef","durationRegex","currentTraceId","showMatchesOnly","showCriticalPathSpansOnly","setSpanFiltersSearch","spanSearch","getServiceNames","getSpanNames","collapseLabel","Collapse","Stack","SpanFiltersTags","TracePageSearchBar","TracePageHeader","app","timeZone","datasourceName","datasourceUid","setHeaderHeight","notifyApp","copyTraceIdClicked","setCopyTraceIdClicked","traceContext","extensionLinks","usePluginLinks","extensionComponents","usePluginComponents","method","status","url","traceName","formattedTimestamp","serviceCount","statusColor","copyTraceId","exportTrace","traceFormat","download","config","shareDropdownMenu","Menu","Badge","ButtonGroup","Dropdown","instance","getInstance","local","merge","callbacks","inst","name","keysHandler","Ticks","endTime","showLabels","startTime","labels","viewingDuration","durationAtTick","TimelineRow","TimelineRowCell","widthPercent","mergedStyle","TimelineCollapser","onExpandAll","onExpandOne","onCollapseAll","onCollapseOne","TimelineColumnResizer","min","max","draggerStyle","columnResizeHandleHeight","dragPosition","gripStyle","isDraggingLeft","isDraggingRight","draggerLeft","draggerRight","isOutOfView","mapFromViewSubRange","mapToViewSubRange","getMarkers","isShift","mappedFrom","mappedTo","cls","TimelineViewingLayer","nextProps","boundsInvalidator","viewRangeTime","cusrorPosition","TimelineHeaderRow","nameColumnWidth","onColummWidthChange","PEER_SERVICE","Positions","bufferLen","dataLength","heightGetter","forcedLastI","_max","h","yValue","_i","chg","imin","imax","known","DEFAULT_INITIAL_DRAW","ListView","bottomY","headerHeight","scrollElement","scrollElementTop","listViewOffset","itemOffset","maxStart","minEnd","getIndexFromKey","lowDirtyKey","highDirtyKey","isDirty","nodes","node","itemKey","observed","top","prevProps","useRoot","clientHeight","scrollTop","yStart","yEnd","getKeyFromIndex","initialDraw","itemRenderer","viewBuffer","viewBufferMin","attrs","wrapperProps","scrollerStyle","NONE","DURATION","TAG","SpanBarSettings","selectOptions","SpanBarSection","overlayClassName","popoverRef","PopoverController","showPopper","hidePopper","popperProps","LABEL","SpanLinkType","createSpanLinkFactory","splitOpenFn","traceToLogsOptions","traceToMetricsOptions","traceToProfilesOptions","dataFrame","createFocusSpanLink","dataLinkPostProcessor","scopedVars","scopedVarsFromTrace","hasLinks","f","createSpanLinks","legacyCreateSpanLinkFactory","spanLinks","scopedVarsFromSpan","scopedVarsFromTags","fields","profilesDataSourceSettings","hasConfiguredPyroscopeDS","hasPyroscopeProfile","pyroscopeProfileIdTagKey","shouldCreatePyroscopeLink","field","fieldLinksForExplore","getTimeRangeFromSpan","newSpanLinks","formatDefaultKeys","k","defaultKeys","defaultProfilingKeys","feO11yTagKey","logsDataSourceSettings","isSplunkDS","metricsDataSourceSettings","tagsToUse","getFormattedTags","getQueryForLoki","getQueryForSplunk","getQueryForElasticsearchOrOpensearch","getQueryForFalconLogScale","getQueryForGoogleCloudLogging","getQueryForVictoriaLogs","dataLink","expr","getReferenceTitle","feO11yLink","getLinkForFeO11y","filterByTraceID","filterBySpanID","feO11yAppId","feO11ySessionId","queryArr","lsql","parts","labelValueSign","joinBy","keyValue","timeShift","adjustedStartTime","spanEndMs","adjustedEndTime","traceId","profileTags","divider","LabeledList","label","ReferenceLink","References","openedItems","onItemToggle","interactive","AccordianKeyValues","AccordianReferences","isOpen","onToggle","isEmpty","arrow","HeaderComponent","headerProps","alignIcon","Counter","ShareSpanButton","focusSpanLink","interpolatedParams","linkProps","LINKS_ORDER","MAX_LINKS","ABSOLUTE_LINK_PATTERN","getSpanDetailLinkButtons","createSpanLink","timeRange","linkToProfiles","createLinkModel","profilesDrilldownPluginId","context","getProfileLinkButtonsContext","extensionPointId","pluginLinks","appLink","aIndex","bIndex","aValue","bValue","DropDownMenu","linkModel","DataLinkButton","setIsOpen","menu","ToolbarButton","spanSelector","SpanFlameGraph","traceFlameGraphs","setTraceFlameGraphs","setRedrawListView","traceDuration","sizeRef","containerHeight","useMeasure","profileTag","profileTagValue","getTimeRangeForProfile","spanStartMs","getFlameGraphData","request","DataSourceWithBackend","frame","lastValueFrom","queryFlameGraph","labelSelector","flameGraph","useResourceAttributesExtensionLinks","process","spanTags","attributes","acc","spanAttributes","pairs","SpanDetail","detailState","logItemToggle","logsToggle","processToggle","tagsToggle","traceStartTime","warningsToggle","stackTracesToggle","referencesToggle","referenceItemToggle","isTagsOpen","isProcessOpen","logsState","isWarningsOpen","referencesState","isStackTracesOpen","operationName","relativeStartTime","traceID","logs","warnings","references","stackTraces","overviewItems","getAbsoluteTime","linksComponent","resourceLinksGetter","AccordianLogs","logItem","warning","stackTrace","dateStr","match","KeyValuesSummary","item","logName","highContrast","showSummary","showCountBadge","iconCls","tableFields","showDataSummaryFields","timestamp","log","formattedDuration","truncateLogNameInSummary","formattedLogName","toPercent","toPercentInDecimal","SpanBar","getViewedBounds","shortLabel","longLabel","rpc","labelClassName","setLabel","setShortLabel","setLongLabel","logGroups","posPercent","positionKey","critcalPathViewBounds","criticalPathViewStart","criticalPathViewEnd","renderMenuItems","closeMenu","linkA","linkB","MenuItem","SpanLinksMenu","isMenuOpen","setIsMenuOpen","menuPosition","setMenuPosition","ContextMenu","getFirstAncestor","ref","refType","spanAncestorIds","ancestorIDs","UnthemedSpanTreeOffset","ancestorId","childrenVisible","showChildrenIcon","visibleSpanIds","hasChildren","spanBarClassName","spanBarLabelClassName","nameWrapperClassName","nameWrapperMatchingFilterClassName","viewClassName","nameColumnClassName","showSpanFilterMatchesOnly","animations","backgroundColor","UnthemedSpanBarRow","spanBarOptions","tagKey","columnDivision","isChildrenExpanded","isDetailExpanded","isMatchingFilter","isFocused","noInstrumentedServer","showErrorIcon","hoverIndentGuideIds","addHoverIndentGuideId","removeHoverIndentGuideId","clippingLeft","clippingRight","showServiceName","isParent","viewBounds","labelDetail","hintClassName","SpanTreeOffset","count","UnthemedSpanDetailRow","focusedSpanId","createViewedBoundsFunc","viewMin","viewWindow","spanHasTag","isClientOtel","isClient","isClientSpan","isServerOtel","isServer","isServerSpan","isErrorOtel","isErrorBool","isErrorStr","isErrorSpan","spanContainsErredSpan","spans","parentSpanIndex","findServerChildSpan","spanChildDepth","isKindClient","DEFAULT_HEIGHTS","NUM_TICKS","BUFFER_SIZE","generateRowStates","childrenHiddenIDs","detailStates","findMatchesIDs","section","collapseDepth","rowStates","hidden","getClipping","currentViewRange","zoomStart","zoomEnd","generateRowStatesFromTrace","childSpansMap","memoizedGenerateRowStates","memoizedViewBoundsFunc","memoizedGetClipping","memoizedChildSpansMap","UnthemedVirtualizedTraceView","spanIndex","listView","isDetail","_traceID","_spanID","_isDetail","topOfViewRef","rowState","focusedSpanIdForSearch","currentViewRangeTime","lv","childSpanIds","childrenToggle","detailToggle","spanNameColumnWidth","isCollapsed","rpcSpan","rpcViewBounds","peerServiceKV","kv","prevSpan","allChildSpanIds","findAllDescendants","currentChildSpanIds","eachId","childrenOfCurrent","criticalPathSections","SpanBarRow","detailLogItemToggle","detailLogsToggle","detailProcessToggle","detailReferencesToggle","detailReferenceItemToggle","detailWarningsToggle","detailStackTracesToggle","detailTagsToggle","SpanDetailRow","redrawListView","UnthemedTraceTimelineViewer","setSpanNameColumnWidth","traceTimeline","VirtualizedTraceView","useChildrenState","setChildrenHiddenIDs","expandOne","prevExpandedDepth","expandNextHiddenSpan","newChildrenHiddenIDs","res","collapseOne","shouldDisableCollapse","nearestCollapsedAncestor","curSpan","expandAll","collapseAll","allSpans","hiddenSpansIds","DetailState","oldState","isReferencesOpen","next","useDetailState","setDetailStates","toggleDetail","newDetailStates","old","makeDetailSubsectionToggle","subSection","useHoverIndentGuide","setHoverIndentGuideIds","prevState","newHoverIndentGuideIds","useViewRange","setViewRange","prevRange","TraceView","traceProp","datasource","exploreId","createSpanLinkFromProps","focusedSpanIdFromProps","createFocusSpanLinkFromProps","spanFilters","useSearch","useToggle","focusedSpanIdExplore","createFocusSpanLinkExplore","useFocusSpanLink","instanceSettings","dataLinksContext","state","TraceTimelineViewer","panelState","dispatch","setFocusedSpanId","sameTrace","doNotReset","activeSequences","filterSpans","searchProps","filteredSpans","getServiceNameMatches","getSpanNameMatches","getDurationMatches","tagMatches","getTagMatches","queryMatches","getQueryMatches","queryParts","w","isTextInQuery","queryPart","isTextInKeyValues","kvs","getStringValue","isSpanAMatch","checkKeyValConditionForMatch","checkKeyValConditionForRegex","checkKeyForMatch","checkKeyAndValueForRegex","checkKeyAndValueForMatch","convertTimeFilter","filterForDuration","_getTraceNameImpl","candidateSpan","allIDs","thisRefLength","candidateRefLength","getTraceName","findHeaderTags","getHeaderTags","getTraceServiceNames","getTraceSpanNames","getTraceTagKeys","logKeys","getTraceTagValues","values","tagValue","t","processTagValue","logsTagValue","getTagKeys","getTagValues","onTagChange","updatedValues","addTag","removeTag","combinations","Combokeys","initialFilters","globalFilters","localSearch","setLocalSearch","merged","mergedFilters","prev","newSearch","replaceSearchVariables","replaceVariables","keysFromString","SPECIAL_ALIASES","SHIFT_MAP","tagName","characterFromEvent","eventModifiers","TreeNode","child","result","searchFn","findPath","currentNode","currentPath","attempt","startDepth","nodeStack","actualDepth","entry","stack","paths","childIndex","getSpanId","getSpanReferences","getSpanReferenceByType","getSpanParentId","childOfRef","getTraceSpans","getTraceSpansAsMap","TREE_ROOT_ID","getTraceSpanIdsAsTree","nodesById","spansById","root","parentID","comparator","nodeA","nodeB","FALLBACK_DAG_MAX_NUM_SERVICES","FALLBACK_TRACE_NAME","getConfig","getConfigValue","deduplicateTags","warningsHash","dedupedTags","uniqueTags","orderTags","topPrefixes","orderedTags","tp","aKey","bKey","transformTraceData","traceEndTime","spanIdCounts","processes","processID","idCount","tree","svcCounts","spanA","spanB","tagsInfo","refSpan","transformDataFrames","transformTraceDataFrame","view","DataFrameView","l","increaseSequence","nextAction","callbackAndReset","isFinal","wrappedCallback","maxLevel","processedSequenceCallback","ignoreThisKeypress","constructor"],"sourceRoot":""}
.
Edit
..
Edit
1117.145ac642f59357bc40d8.js
Edit
1117.145ac642f59357bc40d8.js.map
Edit
1118.c684d1aadf16a6c70620.js
Edit
1118.c684d1aadf16a6c70620.js.map
Edit
1122.5fbf0d7cd148c610616d.js
Edit
1122.5fbf0d7cd148c610616d.js.map
Edit
1142.a4b35a0e8699cafd901e.js
Edit
1142.a4b35a0e8699cafd901e.js.map
Edit
1162.81868b3ac499fa5ea04b.js
Edit
1162.81868b3ac499fa5ea04b.js.map
Edit
1183.7444f51e5996a7f23c7d.js
Edit
1183.7444f51e5996a7f23c7d.js.map
Edit
1282.ae38cac1b732d8ac1d96.js
Edit
1282.ae38cac1b732d8ac1d96.js.map
Edit
130.a58aaeea748f37ee6482.js
Edit
130.a58aaeea748f37ee6482.js.map
Edit
1419.59f53ae25085b28e1e11.js
Edit
1419.59f53ae25085b28e1e11.js.map
Edit
1420.e63ce495727f83b8887d.js
Edit
1420.e63ce495727f83b8887d.js.map
Edit
1438.ccdd05d7188edf4191ff.js
Edit
1438.ccdd05d7188edf4191ff.js.map
Edit
1446.fe7b1f4563629b80793f.js
Edit
1446.fe7b1f4563629b80793f.js.map
Edit
1484.3da94e44ecdadcd342d4.js
Edit
1484.3da94e44ecdadcd342d4.js.map
Edit
1492.4026c6e7130c3afdae87.js
Edit
1494.ef220afb67ff6c52c7af.js
Edit
1494.ef220afb67ff6c52c7af.js.map
Edit
1560.538cd2395be11ba4e2c9.js
Edit
1560.538cd2395be11ba4e2c9.js.map
Edit
1579.c391ef869d4f7bfc0d1c.js
Edit
1579.c391ef869d4f7bfc0d1c.js.map
Edit
1646.d7d87a40853795910533.js
Edit
1646.d7d87a40853795910533.js.map
Edit
1710.7db3f56c6714c0c340e0.js
Edit
1710.7db3f56c6714c0c340e0.js.map
Edit
1716.f71f518289da5d2229bc.js
Edit
1716.f71f518289da5d2229bc.js.map
Edit
1740.baf38e7ee007e1a6935e.js
Edit
1740.baf38e7ee007e1a6935e.js.map
Edit
1821.c9a2456dc8d78cf6b02f.js
Edit
1821.c9a2456dc8d78cf6b02f.js.map
Edit
1888.d33142738af4fbf8a230.js
Edit
1888.d33142738af4fbf8a230.js.map
Edit
1914.5f33b3c2133b5bb7ea6e.js
Edit
1914.5f33b3c2133b5bb7ea6e.js.map
Edit
198.65a768ff6c601d19ea3f.js
Edit
198.65a768ff6c601d19ea3f.js.map
Edit
1990.9171129a8deabb59bf30.js
Edit
1990.9171129a8deabb59bf30.js.map
Edit
2018.5ff00ee0456301c1cf43.js
Edit
2018.5ff00ee0456301c1cf43.js.map
Edit
205.2eb73847215c8d021cc9.js
Edit
205.2eb73847215c8d021cc9.js.map
Edit
2077.a5848ca4b4b9fdebca17.js
Edit
2077.a5848ca4b4b9fdebca17.js.map
Edit
2094.97e7f0876201e76a77fd.js
Edit
2094.97e7f0876201e76a77fd.js.map
Edit
2150.7576285186c713978b39.js
Edit
2150.7576285186c713978b39.js.map
Edit
2152.b55841e6f422682a3891.js
Edit
2152.b55841e6f422682a3891.js.map
Edit
221.0fc4d14d0a67f3a25d64.js
Edit
221.0fc4d14d0a67f3a25d64.js.map
Edit
2218.623d73bd0985ddf5f8c4.js
Edit
2218.623d73bd0985ddf5f8c4.js.map
Edit
2223.e65417164a45701ed9dc.js
Edit
2223.e65417164a45701ed9dc.js.map
Edit
2244.70c156ada2487a05595c.js
Edit
2244.70c156ada2487a05595c.js.map
Edit
2278.f887de0a65e1b784ea9f.js
Edit
2278.f887de0a65e1b784ea9f.js.map
Edit
2288.6a65ba08c6c0f4f83435.js
Edit
2288.6a65ba08c6c0f4f83435.js.map
Edit
2311.73e1a2b949d289f5d6c9.js
Edit
2311.73e1a2b949d289f5d6c9.js.map
Edit
2398.d142e32be48079fc63c0.js
Edit
2398.d142e32be48079fc63c0.js.map
Edit
2405.c1b37a7cc8182472f6a6.js
Edit
2405.c1b37a7cc8182472f6a6.js.map
Edit
2446.0418c7ea000998178d8b.js
Edit
2446.0418c7ea000998178d8b.js.map
Edit
2450.d73c024ff7273aebf911.js
Edit
2450.d73c024ff7273aebf911.js.map
Edit
2586.668c65b61e9ea31b5bca.js
Edit
2586.668c65b61e9ea31b5bca.js.map
Edit
265.ed6933785cc750cbd9ed.js
Edit
265.ed6933785cc750cbd9ed.js.map
Edit
2658.7f70ebc378803654a814.js
Edit
2658.7f70ebc378803654a814.js.map
Edit
2686.ae267304ddd1380c30c7.js
Edit
2686.ae267304ddd1380c30c7.js.map
Edit
2692.fa24ada7d987a7ee05f1.js
Edit
2692.fa24ada7d987a7ee05f1.js.map
Edit
2699.b79e57051a1a63376320.js
Edit
2699.b79e57051a1a63376320.js.map
Edit
2710.e1ac8e57578a838f5bd8.js
Edit
2710.e1ac8e57578a838f5bd8.js.map
Edit
2744.d6b14bf01022bdb8eab5.js
Edit
2744.d6b14bf01022bdb8eab5.js.map
Edit
2745.8049d948cb362dfc6cb3.js
Edit
2745.8049d948cb362dfc6cb3.js.map
Edit
2835.01beb5b1a252d779aad7.js
Edit
2835.01beb5b1a252d779aad7.js.map
Edit
2961.4b27b21453fdbb115dd4.js
Edit
2961.4b27b21453fdbb115dd4.js.map
Edit
2962.85c9dc0cca68efab5e0c.js
Edit
2962.85c9dc0cca68efab5e0c.js.map
Edit
2975.e64aaea6ff35a7d3b3fd.js
Edit
2975.e64aaea6ff35a7d3b3fd.js.map
Edit
3003.f51365051eb27cf765d8.js
Edit
3003.f51365051eb27cf765d8.js.map
Edit
3042.44bad7d2d0536000b808.js
Edit
3042.44bad7d2d0536000b808.js.map
Edit
3062.ad5844391370fcc7525a.js
Edit
3062.ad5844391370fcc7525a.js.map
Edit
3082.704af6779ad700a5fa42.js
Edit
3082.704af6779ad700a5fa42.js.map
Edit
3096.aed61083f1ba4803ae84.js
Edit
3096.aed61083f1ba4803ae84.js.map
Edit
3126.10c85e1f02105e470a69.js
Edit
3126.10c85e1f02105e470a69.js.map
Edit
3169.0b88a5a2340f70961599.js
Edit
3169.0b88a5a2340f70961599.js.map
Edit
3171.c79c28e2611563e2dbcb.js
Edit
3171.c79c28e2611563e2dbcb.js.map
Edit
3182.831f754ed3b6f10441a0.js
Edit
3182.831f754ed3b6f10441a0.js.map
Edit
3192.2cb90eadf3399270363e.js
Edit
3192.2cb90eadf3399270363e.js.map
Edit
3217.c6faaa4f5637068f90f3.js
Edit
3217.c6faaa4f5637068f90f3.js.map
Edit
3259.c8e4d6ad93201a56e49f.js
Edit
3259.c8e4d6ad93201a56e49f.js.map
Edit
3284.79c2897655286b0c1f6d.js
Edit
3284.79c2897655286b0c1f6d.js.map
Edit
3303.225dae64cff0c2280c3b.js
Edit
3303.225dae64cff0c2280c3b.js.map
Edit
3326.cabc370d66d7ecfbd2c3.js
Edit
3326.cabc370d66d7ecfbd2c3.js.map
Edit
344.85cff3029cbbb5463c7e.js
Edit
344.85cff3029cbbb5463c7e.js.map
Edit
3466.fda7da0cb4150e59da98.js
Edit
3466.fda7da0cb4150e59da98.js.map
Edit
3474.74dfd856a9528c758a57.js
Edit
3474.74dfd856a9528c758a57.js.map
Edit
348.fd20e2547f12dbed76c7.js
Edit
348.fd20e2547f12dbed76c7.js.map
Edit
3495.9c1ae6f61edf7aef207b.js
Edit
3495.9c1ae6f61edf7aef207b.js.map
Edit
3501.a0ee7c2b24136aa91eb5.js
Edit
3501.a0ee7c2b24136aa91eb5.js.map
Edit
3520.a3c2b474e2dcaf9879fc.js
Edit
3520.a3c2b474e2dcaf9879fc.js.map
Edit
3605.41e3c44dfe2ca2966198.js
Edit
3605.41e3c44dfe2ca2966198.js.map
Edit
362.e5ce68af98ee6713a4e7.js
Edit
362.e5ce68af98ee6713a4e7.js.map
Edit
3622.0b196041f825b42c5233.js
Edit
3622.0b196041f825b42c5233.js.map
Edit
3630.1ffe9229d5c27fd0823a.js
Edit
3630.1ffe9229d5c27fd0823a.js.map
Edit
3659.f5dc1bb19d36546aadb8.js
Edit
3659.f5dc1bb19d36546aadb8.js.map
Edit
3688.ec5e74c60569e9498687.js
Edit
3688.ec5e74c60569e9498687.js.map
Edit
3718.b570aa4fa35f8dfc686e.js
Edit
3718.b570aa4fa35f8dfc686e.js.map
Edit
3726.84ef8bb1304f7adbc7f3.js
Edit
3726.84ef8bb1304f7adbc7f3.js.map
Edit
398.ceeafcf522343c717c4b.js
Edit
398.ceeafcf522343c717c4b.js.map
Edit
4064.e52eb763993ad947e4a1.js
Edit
4064.e52eb763993ad947e4a1.js.map
Edit
407.594046bd73cc88c29e80.js
Edit
407.594046bd73cc88c29e80.js.map
Edit
4113.3fa5432815c4662eb03e.js
Edit
4113.3fa5432815c4662eb03e.js.map
Edit
4114.c4741f0a73781d3f87dc.js
Edit
4114.c4741f0a73781d3f87dc.js.map
Edit
4120.968e1408d894f8515330.js
Edit
4120.968e1408d894f8515330.js.map
Edit
4162.8b8a683fa98d677f9137.js
Edit
4162.8b8a683fa98d677f9137.js.map
Edit
4209.de7f2b850ee1292a67e5.js
Edit
4209.de7f2b850ee1292a67e5.js.map
Edit
4224.cc13db0c6e3f7fdb05c9.js
Edit
4224.cc13db0c6e3f7fdb05c9.js.map
Edit
4251.28e90ad13c8fe749062c.js
Edit
4251.28e90ad13c8fe749062c.js.map
Edit
4334.396d65b7ba31733108e9.js
Edit
4334.396d65b7ba31733108e9.js.map
Edit
4350.6db49924324f8061d361.js
Edit
4350.6db49924324f8061d361.js.map
Edit
4463.24a3e34bed64cbbb8b99.js
Edit
4463.24a3e34bed64cbbb8b99.js.map
Edit
4514.03e966fee9064d7305dd.js
Edit
4514.03e966fee9064d7305dd.js.map
Edit
4564.ea4a09ba96ddbf74a0ee.js
Edit
4564.ea4a09ba96ddbf74a0ee.js.map
Edit
46.7809585ddbb4791e248a.js
Edit
46.7809585ddbb4791e248a.js.map
Edit
4630.54d7f3b9d384c6b95bbc.js
Edit
4630.54d7f3b9d384c6b95bbc.js.map
Edit
4656.a07d832134b096826a58.js
Edit
4656.a07d832134b096826a58.js.map
Edit
468.d3a2ba8b0d226ca1475b.js
Edit
468.d3a2ba8b0d226ca1475b.js.map
Edit
4680.abd86af55b75e75326ab.js
Edit
4680.abd86af55b75e75326ab.js.map
Edit
4691.2f69f76af87a66a1513c.js
Edit
4691.2f69f76af87a66a1513c.js.map
Edit
4698.c9a2c562b12da12dc66e.js
Edit
4698.c9a2c562b12da12dc66e.js.map
Edit
4791.fc3ef0337811ab73b164.js
Edit
4791.fc3ef0337811ab73b164.js.map
Edit
4814.2d8cb562606e508512d8.js
Edit
4814.2d8cb562606e508512d8.js.map
Edit
4824.2da8107f19d58bf153e0.js
Edit
4824.2da8107f19d58bf153e0.js.map
Edit
4839.f4d2edd5c2678ef2b624.js
Edit
4839.f4d2edd5c2678ef2b624.js.map
Edit
4857.4971a98037d2ec3b663d.js
Edit
4857.4971a98037d2ec3b663d.js.map
Edit
4865.be02c1283a83523c4414.js
Edit
4865.be02c1283a83523c4414.js.map
Edit
494.5463fc5a297eaedd150f.js
Edit
494.5463fc5a297eaedd150f.js.map
Edit
4958.226af5f19bf47305a407.js
Edit
4958.226af5f19bf47305a407.js.map
Edit
4962.bbff24c5a85e9314600a.js
Edit
4962.bbff24c5a85e9314600a.js.map
Edit
4964.1f2cc5acc0078feb7b08.js
Edit
4964.1f2cc5acc0078feb7b08.js.map
Edit
4965.ccdc00d808390be53820.js
Edit
4965.ccdc00d808390be53820.js.map
Edit
5065.a2c71dab50ccb4174ee2.js
Edit
5065.a2c71dab50ccb4174ee2.js.map
Edit
5074.92e2d1ae98dcd913506e.js
Edit
5074.92e2d1ae98dcd913506e.js.map
Edit
5091.987ffc33b70121541e5d.js
Edit
5091.987ffc33b70121541e5d.js.map
Edit
5106.581eaf66a6592320d97a.js
Edit
5106.581eaf66a6592320d97a.js.map
Edit
5110.96d49ea826be96c65045.js
Edit
5110.96d49ea826be96c65045.js.map
Edit
5130.cbdddcd716a093bdbaac.js
Edit
5130.cbdddcd716a093bdbaac.js.map
Edit
5196.9b7364caf64a8583ad01.js
Edit
5196.9b7364caf64a8583ad01.js.map
Edit
5198.2cd64d4e16a385dd9b91.js
Edit
5198.2cd64d4e16a385dd9b91.js.map
Edit
5280.2c29942977baa2dfbe0e.js
Edit
5280.2c29942977baa2dfbe0e.js.map
Edit
5364.0288d9c98f74f26b73e7.js
Edit
5364.0288d9c98f74f26b73e7.js.map
Edit
5446.ad01d0b233122dd49849.js
Edit
5446.ad01d0b233122dd49849.js.map
Edit
5550.5bf3e7d23d6b104740fd.js
Edit
5550.5bf3e7d23d6b104740fd.js.map
Edit
5618.909592bbe054b70f2377.js
Edit
5618.909592bbe054b70f2377.js.map
Edit
5648.a1fc2b0cbbca9bfa1d94.js
Edit
5648.a1fc2b0cbbca9bfa1d94.js.map
Edit
5664.c55be32f6d459ac3f3d8.js
Edit
5664.c55be32f6d459ac3f3d8.js.map
Edit
5671.e1e396b75d7b95ef461f.js
Edit
5671.e1e396b75d7b95ef461f.js.map
Edit
5742.117597ec799ab75cb2f4.js
Edit
5742.117597ec799ab75cb2f4.js.map
Edit
5747.b9389680058c12ffba68.js
Edit
5747.b9389680058c12ffba68.js.map
Edit
5757.5a4b7f2368dd09da42be.js
Edit
5786.c45dfaf9e1d969472e5e.js
Edit
5786.c45dfaf9e1d969472e5e.js.map
Edit
5790.29b0a5797fd46e9664f5.js
Edit
5790.29b0a5797fd46e9664f5.js.map
Edit
5923.b9c876b4bf528d8511cb.js
Edit
5923.b9c876b4bf528d8511cb.js.map
Edit
5984.1efdc4bb85100bd19ca9.js
Edit
5984.1efdc4bb85100bd19ca9.js.map
Edit
5995.5c7a375f33ea1cd16daa.js
Edit
5995.5c7a375f33ea1cd16daa.js.map
Edit
6018.befdd11bf701ea71f7bf.js
Edit
6018.befdd11bf701ea71f7bf.js.map
Edit
6029.bdcbf27bcdd36812f646.js
Edit
6029.bdcbf27bcdd36812f646.js.map
Edit
6088.7f526abfdb4003574c68.js
Edit
6088.7f526abfdb4003574c68.js.map
Edit
613.084d33252856771cf6e1.js
Edit
613.084d33252856771cf6e1.js.map
Edit
6185.2a7c893c6b3f2f0dadb8.js
Edit
6185.2a7c893c6b3f2f0dadb8.js.map
Edit
6208.571f272269524cfd14e7.js
Edit
6208.571f272269524cfd14e7.js.map
Edit
6236.30d1fa6aee173c946c50.js
Edit
6236.30d1fa6aee173c946c50.js.map
Edit
6244.64f83fc5d05560979c51.js
Edit
6244.64f83fc5d05560979c51.js.map
Edit
6260.b8be95165766a81dade2.js
Edit
6260.b8be95165766a81dade2.js.map
Edit
630.56b78dcdaeeb9d9c2967.js
Edit
630.56b78dcdaeeb9d9c2967.js.map
Edit
6302.a2ffa52069511df9772f.js
Edit
6302.a2ffa52069511df9772f.js.map
Edit
6315.f4d87fc6f8ae3cb40e38.js
Edit
6315.f4d87fc6f8ae3cb40e38.js.map
Edit
6414.7520859a2d9cc0a63d7f.js
Edit
6414.7520859a2d9cc0a63d7f.js.map
Edit
6446.1d75a8140260005fffbd.js
Edit
6446.1d75a8140260005fffbd.js.map
Edit
6743.67a52a99e2fdd1ae1e10.js
Edit
6743.67a52a99e2fdd1ae1e10.js.map
Edit
6759.0454d3c1e41385379bdc.js
Edit
6759.0454d3c1e41385379bdc.js.map
Edit
6772.0d4a074848bc323be8f8.js
Edit
6772.0d4a074848bc323be8f8.js.map
Edit
680.726adca366b4ecb272db.js
Edit
680.726adca366b4ecb272db.js.map
Edit
6830.a4b0ecf3a6d784ca7609.js
Edit
6830.a4b0ecf3a6d784ca7609.js.map
Edit
6834.0c9ef40e2f2b5428983d.js
Edit
6834.0c9ef40e2f2b5428983d.js.map
Edit
6857.252a60422ee275193aa7.js
Edit
6857.252a60422ee275193aa7.js.map
Edit
6940.b6c74df14413f0188f0d.js
Edit
6940.b6c74df14413f0188f0d.js.map
Edit
6990.d663924714fc213b17c6.js
Edit
6990.d663924714fc213b17c6.js.map
Edit
7018.5a037d2577fedc8d10f1.js
Edit
7018.5a037d2577fedc8d10f1.js.map
Edit
7031.047b15171c23b248efa0.js
Edit
7031.047b15171c23b248efa0.js.map
Edit
7033.141597840e42815ef6a4.js
Edit
7033.141597840e42815ef6a4.js.map
Edit
7048.3746fc9a274bf8ff72f1.js
Edit
7048.3746fc9a274bf8ff72f1.js.map
Edit
7051.604a402d305e093c00c2.js
Edit
7051.604a402d305e093c00c2.js.map
Edit
7061.f18464bcd6c6d7455662.js
Edit
7061.f18464bcd6c6d7455662.js.map
Edit
7080.9cdd1b7a0bf62b48e1fe.js
Edit
7080.9cdd1b7a0bf62b48e1fe.js.map
Edit
7200.d4425528f6cee80f9931.js
Edit
7200.d4425528f6cee80f9931.js.map
Edit
7235.46f071d3e4d0bb976223.js
Edit
7235.46f071d3e4d0bb976223.js.map
Edit
7246.03f5a8496e53f64602e2.js
Edit
7246.03f5a8496e53f64602e2.js.map
Edit
7249.3bea4aaf890f89fdad45.js
Edit
7249.3bea4aaf890f89fdad45.js.map
Edit
7299.cdff402b076dfea09ead.js
Edit
7299.cdff402b076dfea09ead.js.map
Edit
7348.6fd722455e8c7e077815.js
Edit
7348.6fd722455e8c7e077815.js.map
Edit
7396.ded473b7a47dc42fbb59.js
Edit
7396.ded473b7a47dc42fbb59.js.map
Edit
7466.b7c17c526c7b734dd5f7.js
Edit
7466.b7c17c526c7b734dd5f7.js.map
Edit
7539.5f405cae3b15e1e2f6fa.js
Edit
7539.5f405cae3b15e1e2f6fa.js.map
Edit
7585.084552e02c66201a55be.js
Edit
7585.084552e02c66201a55be.js.map
Edit
7626.38819cc0696f2d25cf99.js
Edit
7626.38819cc0696f2d25cf99.js.map
Edit
7651.5024ed8dd1beb08d01ab.js
Edit
7651.5024ed8dd1beb08d01ab.js.map
Edit
7681.7ef7b4f86e99abd7b7e1.js
Edit
7681.7ef7b4f86e99abd7b7e1.js.map
Edit
7691.0ad86f0c686b19ce829e.js
Edit
7691.0ad86f0c686b19ce829e.js.map
Edit
7790.4c141092868e7208a087.js
Edit
7790.4c141092868e7208a087.js.map
Edit
7806.dff3509790e494ca5a45.js
Edit
7806.dff3509790e494ca5a45.js.map
Edit
7836.afe37ef4be354f0a3b91.js
Edit
7836.afe37ef4be354f0a3b91.js.map
Edit
7882.e1721e9d6ac2d421bcda.js
Edit
7882.e1721e9d6ac2d421bcda.js.map
Edit
7886.8499ded396232466be7d.js
Edit
7886.8499ded396232466be7d.js.map
Edit
7887.a6dcfd824d57598ba1c3.js
Edit
7887.a6dcfd824d57598ba1c3.js.map
Edit
7969.a048d8060cabf1aede33.js
Edit
7969.a048d8060cabf1aede33.js.map
Edit
7996.bd232896e4559d37a26f.js
Edit
7996.bd232896e4559d37a26f.js.map
Edit
8016.8145cd87abcdd0646db2.js
Edit
8016.8145cd87abcdd0646db2.js.map
Edit
8018.c31846109f2dff21d8c4.js
Edit
8018.c31846109f2dff21d8c4.js.map
Edit
8056.4e8f71ed4d507f89b487.js
Edit
8056.4e8f71ed4d507f89b487.js.map
Edit
8177.52abd0953ac914f69e26.js
Edit
8177.52abd0953ac914f69e26.js.map
Edit
8220.aeea4a8f0893b3447b56.js
Edit
8220.aeea4a8f0893b3447b56.js.map
Edit
8224.75bd73bf51ff7a2fc4a0.js
Edit
8224.75bd73bf51ff7a2fc4a0.js.map
Edit
8230.d65bce2998eec95c6082.js
Edit
8230.d65bce2998eec95c6082.js.map
Edit
8260.c1da67af19b9259d5651.js
Edit
8260.c1da67af19b9259d5651.js.map
Edit
8271.0ee36e030014244adb47.js
Edit
8271.0ee36e030014244adb47.js.map
Edit
8332.a62e8632a336661f2969.js
Edit
8332.a62e8632a336661f2969.js.map
Edit
8334.1196f5ddcef25711fc25.js
Edit
8334.1196f5ddcef25711fc25.js.map
Edit
8347.de402f9280cd7a316c57.js
Edit
8347.de402f9280cd7a316c57.js.map
Edit
8390.9de755da2e214cc845a3.js
Edit
8390.9de755da2e214cc845a3.js.map
Edit
8393.30e95ae45cbe5455dcda.js
Edit
8393.30e95ae45cbe5455dcda.js.map
Edit
8477.4dad0537d13cf9315e86.js
Edit
8477.4dad0537d13cf9315e86.js.map
Edit
8494.659892f00c9d15ae441a.js
Edit
8494.659892f00c9d15ae441a.js.map
Edit
8530.0460c988ee4a40ce7769.js
Edit
8530.0460c988ee4a40ce7769.js.map
Edit
8542.317c15ed57f68fcf0c97.js
Edit
8542.317c15ed57f68fcf0c97.js.map
Edit
8547.390120a5caf7646e0e3e.js
Edit
8547.390120a5caf7646e0e3e.js.map
Edit
8566.5c8f392bb383ab92eed0.js
Edit
8566.5c8f392bb383ab92eed0.js.map
Edit
8622.5acf73c1485a11dfb0ab.js
Edit
8622.5acf73c1485a11dfb0ab.js.map
Edit
8706.f17afa6bcdfd511d5b03.js
Edit
8706.f17afa6bcdfd511d5b03.js.map
Edit
874.d24410518317d605c708.js
Edit
874.d24410518317d605c708.js.map
Edit
8813.e5137844631f6ddedbce.js
Edit
8813.e5137844631f6ddedbce.js.map
Edit
8856.2720526447b3adb5c75f.js
Edit
8856.2720526447b3adb5c75f.js.map
Edit
886.5f3383e84b10a6530b97.js
Edit
886.5f3383e84b10a6530b97.js.map
Edit
8864.2f4ee982114c25634e55.js
Edit
8864.2f4ee982114c25634e55.js.map
Edit
8902.71f14964ec6cea84dc8e.js
Edit
8902.71f14964ec6cea84dc8e.js.map
Edit
8932.e59e50ddb63414e0f2b9.js
Edit
8932.e59e50ddb63414e0f2b9.js.map
Edit
8990.665213a5c89afd6b2f83.js
Edit
8990.665213a5c89afd6b2f83.js.map
Edit
9034.a32e36472481cbe5d72d.js
Edit
9034.a32e36472481cbe5d72d.js.map
Edit
9038.f03b25f160057d4a0bf6.js
Edit
9038.f03b25f160057d4a0bf6.js.map
Edit
904.b68cd2a0cd6d68c5f1ae.js
Edit
904.b68cd2a0cd6d68c5f1ae.js.map
Edit
9044.441f64d6d946cc93be46.js
Edit
9044.441f64d6d946cc93be46.js.map
Edit
9147.8309cadbc384209d62e5.js
Edit
9147.8309cadbc384209d62e5.js.map
Edit
9150.38487365ffd149b730af.js
Edit
9150.38487365ffd149b730af.js.map
Edit
9292.e6befb57f8f116ad95a8.js
Edit
9292.e6befb57f8f116ad95a8.js.map
Edit
9355.95d7e1782f93f339549e.js
Edit
9355.95d7e1782f93f339549e.js.map
Edit
9388.88d95a230e9432e7037b.js
Edit
9388.88d95a230e9432e7037b.js.map
Edit
9390.c72fcd228017f7647b38.js
Edit
9390.c72fcd228017f7647b38.js.map
Edit
9414.642bfe0d5eb16efd0c16.js
Edit
9414.642bfe0d5eb16efd0c16.js.map
Edit
9449.502f2a824d0203e88d4d.js
Edit
9449.502f2a824d0203e88d4d.js.map
Edit
946.48c5e8c688cf29424295.js
Edit
946.48c5e8c688cf29424295.js.map
Edit
9473.e6fc327da88d88712828.js
Edit
9473.e6fc327da88d88712828.js.map
Edit
9510.1e255e96fe40aad2ed6f.js
Edit
9510.1e255e96fe40aad2ed6f.js.map
Edit
9521.e65411d726c29d77c526.js
Edit
9521.e65411d726c29d77c526.js.map
Edit
9538.a2289ff9ad06e24e391f.js
Edit
9538.a2289ff9ad06e24e391f.js.map
Edit
957.3c35d66aa698d8bdfe05.js
Edit
957.3c35d66aa698d8bdfe05.js.map
Edit
9571.41558d40bff9ea8c0726.js
Edit
9571.41558d40bff9ea8c0726.js.map
Edit
9578.9cfae16465bb9bc1f336.js
Edit
9578.9cfae16465bb9bc1f336.js.map
Edit
968.d4b150f9211c478b7b05.js
Edit
968.d4b150f9211c478b7b05.js.map
Edit
970.46f17b76711e4961a575.js
Edit
970.46f17b76711e4961a575.js.map
Edit
9700.02180b7a06c8a1f7606b.js
Edit
9700.02180b7a06c8a1f7606b.js.map
Edit
9744.aa6baaf988a68fa6a9ba.js
Edit
9744.aa6baaf988a68fa6a9ba.js.map
Edit
9820.6b462d83575efd05c883.js
Edit
9820.6b462d83575efd05c883.js.map
Edit
9838.06bd7dfd4290786f80e3.js
Edit
9838.06bd7dfd4290786f80e3.js.map
Edit
9992.fb08517d3ff77e887443.js
Edit
9992.fb08517d3ff77e887443.js.map
Edit
9996.21c451f22ff76b4bb683.js
Edit
9996.21c451f22ff76b4bb683.js.map
Edit
AdminAuthentication.076c98c6380fd1e42f7e.js
Edit
AdminAuthentication.076c98c6380fd1e42f7e.js.map
Edit
AdminEditOrgPage.8df8167ea6ff8f4803bd.js
Edit
AdminEditOrgPage.8df8167ea6ff8f4803bd.js.map
Edit
AdminListOrgsPage.176dac9ed391bda8952b.js
Edit
AdminListOrgsPage.176dac9ed391bda8952b.js.map
Edit
AdminSettings.7373ed8fa9b943bb2098.js
Edit
AdminSettings.7373ed8fa9b943bb2098.js.map
Edit
AlertGroups.81264e6e5009c36eed6e.js
Edit
AlertGroups.81264e6e5009c36eed6e.js.map
Edit
AlertRuleListIndex.98e7328feeaa2ffe67eb.js
Edit
AlertRuleListIndex.98e7328feeaa2ffe67eb.js.map
Edit
AlertingDisabled.b2c834be0ca4666dd793.js
Edit
AlertingDisabled.b2c834be0ca4666dd793.js.map
Edit
AlertingGroupDetails.3a2c6ef8085b505852e4.js
Edit
AlertingGroupDetails.3a2c6ef8085b505852e4.js.map
Edit
AlertingGroupEdit.69cfe9d5f37a1fc65326.js
Edit
AlertingGroupEdit.69cfe9d5f37a1fc65326.js.map
Edit
AlertingHome.06f307ab9a2a5d8b7f93.js
Edit
AlertingHome.06f307ab9a2a5d8b7f93.js.map
Edit
AlertingImportFromDSRules.f1224bcb622d25e2c94f.js
Edit
AlertingImportFromDSRules.f1224bcb622d25e2c94f.js.map
Edit
AlertingRedirectToRule.9ed1d16829d6833d2827.js
Edit
AlertingRedirectToRule.9ed1d16829d6833d2827.js.map
Edit
AlertingRuleForm.2e69d3f00eb6221e7355.js
Edit
AlertingRuleForm.2e69d3f00eb6221e7355.js.map
Edit
AlertingSettings.7a5f782f877cec4790cb.js
Edit
AlertingSettings.7a5f782f877cec4790cb.js.map
Edit
AlertingTriage.1174f36b4937ad0047c1.js
Edit
AlertingTriage.1174f36b4937ad0047c1.js.map
Edit
BenchmarksPage.ef387f4598ba2b2236ad.js
Edit
BenchmarksPage.ef387f4598ba2b2236ad.js.map
Edit
BookmarksPage.8fe93eb7377073f0c985.js
Edit
BookmarksPage.8fe93eb7377073f0c985.js.map
Edit
ChangePasswordPage.f21b0b1dd107ccd33c1a.js
Edit
ChangePasswordPage.f21b0b1dd107ccd33c1a.js.map
Edit
Connections.949b6389e73bcadb2109.js
Edit
Connections.949b6389e73bcadb2109.js.map
Edit
ContactPoints.9ae2d1927d60c6169b87.js
Edit
ContactPoints.9ae2d1927d60c6169b87.js.map
Edit
CorrelationsFeatureToggle.ec2f1aefce6b456e15eb.js
Edit
CorrelationsFeatureToggle.ec2f1aefce6b456e15eb.js.map
Edit
CorrelationsPage.bd7fcd24ed0b5fe8ac3e.js
Edit
CorrelationsPage.bd7fcd24ed0b5fe8ac3e.js.map
Edit
CreateTeam.429acf93986740280312.js
Edit
CreateTeam.429acf93986740280312.js.map
Edit
DashboardImport.3e9b6f980b81d6f1c755.js
Edit
DashboardImport.3e9b6f980b81d6f1c755.js.map
Edit
DashboardListPage.abeb0c29f072f888f9fb.js
Edit
DashboardListPage.abeb0c29f072f888f9fb.js.map
Edit
DashboardPage.72557fe6dd1a022b7d48.js
Edit
DashboardPage.72557fe6dd1a022b7d48.js.map
Edit
DashboardPageProxy.80adfefad8a885d8e2ef.js
Edit
DashboardPageProxy.80adfefad8a885d8e2ef.js.map
Edit
DashboardScenePage.83fe1fa9509b50120d65.js
Edit
DashboardScenePage.83fe1fa9509b50120d65.js.map
Edit
EditContactPoint.0c33428ddc8ba974d946.js
Edit
EditContactPoint.0c33428ddc8ba974d946.js.map
Edit
EditMuteTiming.8760cc9c77560acf0cd6.js
Edit
EditMuteTiming.8760cc9c77560acf0cd6.js.map
Edit
EditRepositoryPage.d71faaab1af2c8d70a22.js
Edit
EditRepositoryPage.d71faaab1af2c8d70a22.js.map
Edit
EmbeddedDashboard.57de550bce819e3d52e6.js
Edit
EmbeddedDashboard.57de550bce819e3d52e6.js.map
Edit
FileHistoryPage.154ab77c19bbe0ebed20.js
Edit
FileHistoryPage.154ab77c19bbe0ebed20.js.map
Edit
FileStatusPage.36f58cd61202ec603d22.js
Edit
FileStatusPage.36f58cd61202ec603d22.js.map
Edit
FolderAlerting.0b9acb6c42276aaee57d.js
Edit
FolderAlerting.0b9acb6c42276aaee57d.js.map
Edit
FolderLibraryPanelsPage.44f8cabf542ec314d176.js
Edit
FolderLibraryPanelsPage.44f8cabf542ec314d176.js.map
Edit
GettingStartedPage.4bea37f1c9bdcfd0f41b.js
Edit
GettingStartedPage.4bea37f1c9bdcfd0f41b.js.map
Edit
GlobalConfig.1377596507974d18caf6.js
Edit
GlobalConfig.1377596507974d18caf6.js.map
Edit
HistoryPage.4da98f4fa313ee3676ca.js
Edit
HistoryPage.4da98f4fa313ee3676ca.js.map
Edit
LdapSettingsPage.0e9f08d5e59150ecf466.js
Edit
LdapSettingsPage.0e9f08d5e59150ecf466.js.map
Edit
LibraryPanelsPage.824580d7751526c658e2.js
Edit
LibraryPanelsPage.824580d7751526c658e2.js.map
Edit
ListPublicDashboardPage.64c26ffd3ebe6c9076f3.js
Edit
ListPublicDashboardPage.64c26ffd3ebe6c9076f3.js.map
Edit
LoginPage.db48423ed1b455431daa.js
Edit
LoginPage.db48423ed1b455431daa.js.map
Edit
MetricsDrilldownRedirect.fcad4bdff346974952f4.js
Edit
MetricsDrilldownRedirect.fcad4bdff346974952f4.js.map
Edit
MigrateToCloud.5b474ad00e8a3d979750.js
Edit
MigrateToCloud.5b474ad00e8a3d979750.js.map
Edit
NewMuteTiming.2f6302420674f1c73aba.js
Edit
NewMuteTiming.2f6302420674f1c73aba.js.map
Edit
NewOrgPage.be31eaee06e2043d609b.js
Edit
NewOrgPage.be31eaee06e2043d609b.js.map
Edit
NewReceiverView.f1d83eb66a39882b8661.js
Edit
NewReceiverView.f1d83eb66a39882b8661.js.map
Edit
NewSilencePage.2643a48031f7e5d8f376.js
Edit
NewSilencePage.2643a48031f7e5d8f376.js.map
Edit
NotificationPoliciesPage.9333d10ecad1452ebf27.js
Edit
NotificationPoliciesPage.9333d10ecad1452ebf27.js.map
Edit
NotificationsPage.57df4ff5ba1433a4345d.js
Edit
NotificationsPage.57df4ff5ba1433a4345d.js.map
Edit
OrgDetailsPage.7b5835c30585aae81343.js
Edit
OrgDetailsPage.7b5835c30585aae81343.js.map
Edit
PlaylistEditPage.8310e384af659e40c313.js
Edit
PlaylistEditPage.8310e384af659e40c313.js.map
Edit
PlaylistNewPage.f45b642a98a747e28c0d.js
Edit
PlaylistNewPage.f45b642a98a747e28c0d.js.map
Edit
PlaylistPage.9af74957a1cdfb125338.js
Edit
PlaylistPage.9af74957a1cdfb125338.js.map
Edit
PlaylistStartPage.8011a98267ac64c7fa05.js
Edit
PlaylistStartPage.8011a98267ac64c7fa05.js.map
Edit
PluginExtensionsLog.54c02047d569b0c05823.js
Edit
PluginExtensionsLog.54c02047d569b0c05823.js.map
Edit
PluginListPage.e50c18fed21c23ca4ee8.js
Edit
PluginListPage.e50c18fed21c23ca4ee8.js.map
Edit
PluginPage.ae424531bce63dd4721e.js
Edit
PluginPage.ae424531bce63dd4721e.js.map
Edit
ProfileFeatureTogglePage.27378dcbb7520611348e.js
Edit
ProfileFeatureTogglePage.27378dcbb7520611348e.js.map
Edit
ProvisioningWizardPage.c4e4a8f431b4719b0e95.js
Edit
ProvisioningWizardPage.c4e4a8f431b4719b0e95.js.map
Edit
PublicDashboardPage.33d6ec8f685f1b70b9a6.js
Edit
PublicDashboardPage.33d6ec8f685f1b70b9a6.js.map
Edit
RecentlyDeleted.5e0ec16474d939fd9683.js
Edit
RecentlyDeleted.5e0ec16474d939fd9683.js.map
Edit
RecentlyDeletedPage.1dbc2b80b28204de8237.js
Edit
RecentlyDeletedPage.1dbc2b80b28204de8237.js.map
Edit
RepositoryListPage.ec3a0af1cbe2740800bf.js
Edit
RepositoryListPage.ec3a0af1cbe2740800bf.js.map
Edit
RepositoryStatusPage.9aee60589e35a4a19ec2.js
Edit
RepositoryStatusPage.9aee60589e35a4a19ec2.js.map
Edit
SelectOrgPage.910a8d842019a6d7fe93.js
Edit
SelectOrgPage.910a8d842019a6d7fe93.js.map
Edit
SendResetMailPage.513361d6980f98ff8139.js
Edit
SendResetMailPage.513361d6980f98ff8139.js.map
Edit
ServerStats.2830ca154f465dbdecea.js
Edit
ServerStats.2830ca154f465dbdecea.js.map
Edit
ServiceAccountCreatePage.80fcbdd2b7f5aa4e2da1.js
Edit
ServiceAccountCreatePage.80fcbdd2b7f5aa4e2da1.js.map
Edit
ServiceAccountPage.48944056459bb412ff33.js
Edit
ServiceAccountPage.48944056459bb412ff33.js.map
Edit
ServiceAccountsPage.d20b1eb9f87661f10b45.js
Edit
ServiceAccountsPage.d20b1eb9f87661f10b45.js.map
Edit
SignupInvited.fe2c29f380e9888c28cf.js
Edit
SignupInvited.fe2c29f380e9888c28cf.js.map
Edit
SilencesTablePage.b998fdbdcc3d60a81739.js
Edit
SilencesTablePage.b998fdbdcc3d60a81739.js.map
Edit
SnapshotListPage.6feaf24adb92e6a302ec.js
Edit
SnapshotListPage.6feaf24adb92e6a302ec.js.map
Edit
SoloPanelPage.7fc6a934aaadf4c1f84d.js
Edit
SoloPanelPage.7fc6a934aaadf4c1f84d.js.map
Edit
SoloPanelPageOld.bde57e000dd0a0108685.js
Edit
SoloPanelPageOld.bde57e000dd0a0108685.js.map
Edit
SupportBundles.1f46603ad3494624d67a.js
Edit
SupportBundles.1f46603ad3494624d67a.js.map
Edit
SupportBundlesCreate.5eaea61a9713f057277b.js
Edit
SupportBundlesCreate.5eaea61a9713f057277b.js.map
Edit
TeamList.6b088f83e6e8cb66b21d.js
Edit
TeamList.6b088f83e6e8cb66b21d.js.map
Edit
TeamPages.9d8b5dceef8be43c6923.js
Edit
TeamPages.9d8b5dceef8be43c6923.js.map
Edit
Templates.7a02a8497ebca052dcfb.js
Edit
Templates.7a02a8497ebca052dcfb.js.map
Edit
TestStuffPage.982c641592b2f7c9db40.js
Edit
TestStuffPage.982c641592b2f7c9db40.js.map
Edit
ThemePlayground.aeeec77fd8e9c1482f55.js
Edit
ThemePlayground.aeeec77fd8e9c1482f55.js.map
Edit
UserAdminPage.fc4d562eef05d9f59aca.js
Edit
UserAdminPage.fc4d562eef05d9f59aca.js.map
Edit
UserCreatePage.b7036214c66612fb31e9.js
Edit
UserCreatePage.b7036214c66612fb31e9.js.map
Edit
UserInvitePage.4a9bcd4084d7ae454c73.js
Edit
UserInvitePage.4a9bcd4084d7ae454c73.js.map
Edit
UserListPage.a452e1153ae820f58ac9.js
Edit
UserListPage.a452e1153ae820f58ac9.js.map
Edit
UserProfileEditPage.82c11690282e669eabb1.js
Edit
UserProfileEditPage.82c11690282e669eabb1.js.map
Edit
alert-rules-drawer-content.c95bb5ddd3fc813cae92.js
Edit
alert-rules-drawer-content.c95bb5ddd3fc813cae92.js.map
Edit
alert-rules-toolbar-button.0d86c1adae7edb55ff76.js
Edit
alert-rules-toolbar-button.0d86c1adae7edb55ff76.js.map
Edit
alertListPanel.0110106a8d1ab70d65d5.js
Edit
alertListPanel.0110106a8d1ab70d65d5.js.map
Edit
alertmanagerPlugin.2b59de5e7b7a556f87f1.js
Edit
alertmanagerPlugin.2b59de5e7b7a556f87f1.js.map
Edit
annoListPanel.0005a0eab0b05e24d970.js
Edit
annoListPanel.0005a0eab0b05e24d970.js.map
Edit
app.8385deda1df49aa75ec2.js
Edit
app.8385deda1df49aa75ec2.js.map
Edit
assets-manifest.json
Edit
barChartPanel.eecdaeab7d146d477721.js
Edit
barChartPanel.eecdaeab7d146d477721.js.map
Edit
barGaugePanel.6d9e94bbb72ba92a0e9b.js
Edit
barGaugePanel.6d9e94bbb72ba92a0e9b.js.map
Edit
candlestickPanel.af0e0decd06e7b7ab286.js
Edit
candlestickPanel.af0e0decd06e7b7ab286.js.map
Edit
canvasPanel.ddab72fab6e58c3419b2.js
Edit
canvasPanel.ddab72fab6e58c3419b2.js.map
Edit
cloudwatchPlugin.06ef34f60000c4f7ea37.js
Edit
cloudwatchPlugin.06ef34f60000c4f7ea37.js.map
Edit
dark.b66fa87185b9a313ec14.js
Edit
dashListPanel.23b954da0c4888602048.js
Edit
dashListPanel.23b954da0c4888602048.js.map
Edit
dataGridPanel.bb5d4b678cba38dd380b.js
Edit
debugPanel.fff63da32084d7a2e236.js
Edit
debugPanel.fff63da32084d7a2e236.js.map
Edit
elasticsearchPlugin.3f2edb012f5162b48903.js
Edit
elasticsearchPlugin.3f2edb012f5162b48903.js.map
Edit
explore-feature-toggle-page.3de03fa91c88d05cea1c.js
Edit
explore-feature-toggle-page.3de03fa91c88d05cea1c.js.map
Edit
explore.dd32637df83326225e0d.js
Edit
explore.dd32637df83326225e0d.js.map
Edit
flamegraphPanel.cc6c5b4bcd69e406fbb7.js
Edit
flamegraphPanel.cc6c5b4bcd69e406fbb7.js.map
Edit
gaugePanel.5da3c4e39a652e281cc4.js
Edit
gaugePanel.5da3c4e39a652e281cc4.js.map
Edit
gazetteer
Edit
geomapPanel.67ebb4567e9b5fa5074b.js
Edit
gettingStartedPanel.833059170dbbf8d5c4bf.js
Edit
gettingStartedPanel.833059170dbbf8d5c4bf.js.map
Edit
grafana.1492.25120d27db88f863e058.css
Edit
grafana.4350.a45e45977094df4a0bc9.css
Edit
grafana.5790.ffb3a9cd952d3cd7471b.css
Edit
grafana.DashboardPage.a66335f88cd003e4a44f.css
Edit
grafana.DashboardPageProxy.a66335f88cd003e4a44f.css
Edit
grafana.app.1f6473bb54b1e1647be8.css
Edit
grafana.dark.1e8d85816912aadbbba5.css
Edit
grafana.dataGridPanel.c1fc5db1829b1b31eb4d.css
Edit
grafana.geomapPanel.0057d964fa972bb207ec.css
Edit
grafana.light.111a5a99fcebc0962ddc.css
Edit
grafana.livePanel.25120d27db88f863e058.css
Edit
grafana.react-monaco-editor.ffb3a9cd952d3cd7471b.css
Edit
grafana.swagger.d0a2da197b9827204ac1.css
Edit
grafana.tablePanel.25120d27db88f863e058.css
Edit
grafanaPlugin.f21cdb4b84a732cc9dd8.js
Edit
grafanaPlugin.f21cdb4b84a732cc9dd8.js.map
Edit
heatmapPanel.7834b997bc573eddba88.js
Edit
heatmapPanel.7834b997bc573eddba88.js.map
Edit
histogramPanel.9953bfeccf8774500c0c.js
Edit
histogramPanel.9953bfeccf8774500c0c.js.map
Edit
img
Edit
influxdbPlugin.7a899e63be0a65d41e13.js
Edit
influxdbPlugin.7a899e63be0a65d41e13.js.map
Edit
light.827d442410485e491818.js
Edit
livePanel.2a43f499bc746d928d45.js
Edit
livePanel.2a43f499bc746d928d45.js.map
Edit
logsPanel.a328022d248508a083c1.js
Edit
logsPanel.a328022d248508a083c1.js.map
Edit
loki-query-field.f9a0b82b636d4821760c.js
Edit
loki-query-field.f9a0b82b636d4821760c.js.map
Edit
maps
Edit
mixedPlugin.3a69de93f366afbb2f85.js
Edit
newsPanel.c17f40f7c88ea14620e7.js
Edit
newsPanel.c17f40f7c88ea14620e7.js.map
Edit
nodeGraphPanel.f717a9075d994a9a8af4.js
Edit
nodeGraphPanel.f717a9075d994a9a8af4.js.map
Edit
opentsdbPlugin.1795eab1c223ea030c2e.js
Edit
opentsdbPlugin.1795eab1c223ea030c2e.js.map
Edit
pieChartPanel.45166aa6d57d163817ea.js
Edit
pieChartPanel.45166aa6d57d163817ea.js.map
Edit
prometheusPlugin.c3a55eb5353085fc3d2b.js
Edit
prometheusPlugin.c3a55eb5353085fc3d2b.js.map
Edit
radialBarPanel.294c52d497d8f5c2bebb.js
Edit
radialBarPanel.294c52d497d8f5c2bebb.js.map
Edit
runtime.a37cc2f12a959f33871a.js
Edit
runtime.a37cc2f12a959f33871a.js.map
Edit
sql-query-editor.e767d4a2aef360034bd9.js
Edit
sql-query-editor.e767d4a2aef360034bd9.js.map
Edit
statPanel.3a7f191bfb27fd320014.js
Edit
statPanel.3a7f191bfb27fd320014.js.map
Edit
stateTimelinePanel.08d857b143ef89dc195f.js
Edit
stateTimelinePanel.08d857b143ef89dc195f.js.map
Edit
static
Edit
statusHistoryPanel.29f7b8dc01039ba795af.js
Edit
statusHistoryPanel.29f7b8dc01039ba795af.js.map
Edit
swagger.06875a6266679f54141d.js
Edit
swagger.06875a6266679f54141d.js.map
Edit
tablePanel.43861ce2a60617dcd19d.js
Edit
tablePanel.43861ce2a60617dcd19d.js.map
Edit
textPanel.867ee60d01b2039aa159.js
Edit
textPanel.867ee60d01b2039aa159.js.map
Edit
timeseriesPanel.b4a947da450030262a31.js
Edit
timeseriesPanel.b4a947da450030262a31.js.map
Edit
tracesPanel.35bfc3e5ff6bea4212a3.js
Edit
tracesPanel.35bfc3e5ff6bea4212a3.js.map
Edit
trendPanel.001aff2bd153e737c464.js
Edit
trendPanel.001aff2bd153e737c464.js.map
Edit
vis-data.b34535ebabc0fcb91557.js
Edit
vis-data.b34535ebabc0fcb91557.js.map
Edit
vis-network.1b41caf21892c9525709.js
Edit
vis-network.1b41caf21892c9525709.js.map
Edit
welcomeBanner.1a693c9dc02006be4f0b.js
Edit
welcomeBanner.1a693c9dc02006be4f0b.js.map
Edit
xychart.cb20af67a6c495ba6ccd.js
Edit
xychart.cb20af67a6c495ba6ccd.js.map
Edit