UNPKG

@grafana/ui

Version:
1 lines • 37.2 kB
{"version":3,"file":"utils.mjs","sources":["../../../../src/graveyard/TimeSeries/utils.ts"],"sourcesContent":["import { isNumber } from 'lodash';\nimport uPlot from 'uplot';\n\nimport {\n DashboardCursorSync,\n DataFrame,\n FieldConfig,\n FieldType,\n formattedValueToString,\n getFieldColorModeForField,\n getFieldSeriesColor,\n getFieldDisplayName,\n getDisplayProcessor,\n FieldColorModeId,\n DecimalCount,\n} from '@grafana/data';\nimport {\n AxisPlacement,\n GraphDrawStyle,\n GraphFieldConfig,\n GraphThresholdsStyleMode,\n VisibilityMode,\n ScaleDirection,\n ScaleOrientation,\n StackingMode,\n GraphTransform,\n AxisColorMode,\n GraphGradientMode,\n} from '@grafana/schema';\n\n// unit lookup needed to determine if we want power-of-2 or power-of-10 axis ticks\n// see categories.ts is @grafana/data\nconst IEC_UNITS = new Set([\n 'bytes',\n 'bits',\n 'kbytes',\n 'mbytes',\n 'gbytes',\n 'tbytes',\n 'pbytes',\n 'binBps',\n 'binbps',\n 'KiBs',\n 'Kibits',\n 'MiBs',\n 'Mibits',\n 'GiBs',\n 'Gibits',\n 'TiBs',\n 'Tibits',\n 'PiBs',\n 'Pibits',\n]);\n\nconst BIN_INCRS = Array(53);\n\nfor (let i = 0; i < BIN_INCRS.length; i++) {\n BIN_INCRS[i] = 2 ** i;\n}\n\nimport { UPlotConfigBuilder, UPlotConfigPrepFn } from '../../components/uPlot/config/UPlotConfigBuilder';\nimport { getScaleGradientFn } from '../../components/uPlot/config/gradientFills';\nimport { getStackingGroups, preparePlotData2 } from '../../components/uPlot/utils';\nimport { buildScaleKey } from '../GraphNG/utils';\n\nconst defaultFormatter = (v: any, decimals: DecimalCount = 1) => (v == null ? '-' : v.toFixed(decimals));\n\nconst defaultConfig: GraphFieldConfig = {\n drawStyle: GraphDrawStyle.Line,\n showPoints: VisibilityMode.Auto,\n axisPlacement: AxisPlacement.Auto,\n};\n\nexport const preparePlotConfigBuilder: UPlotConfigPrepFn<{\n sync?: () => DashboardCursorSync;\n}> = ({\n frame,\n theme,\n timeZones,\n getTimeRange,\n sync,\n allFrames,\n renderers,\n tweakScale = (opts) => opts,\n tweakAxis = (opts) => opts,\n}) => {\n const eventsScope = '__global_';\n\n const builder = new UPlotConfigBuilder(timeZones[0]);\n\n let alignedFrame: DataFrame;\n\n builder.setPrepData((frames) => {\n // cache alignedFrame\n alignedFrame = frames[0];\n\n return preparePlotData2(frames[0], builder.getStackingGroups());\n });\n\n // X is the first field in the aligned frame\n const xField = frame.fields[0];\n if (!xField) {\n return builder; // empty frame with no options\n }\n\n const xScaleKey = 'x';\n let yScaleKey = '';\n\n const xFieldAxisPlacement =\n xField.config.custom?.axisPlacement !== AxisPlacement.Hidden ? AxisPlacement.Bottom : AxisPlacement.Hidden;\n const xFieldAxisShow = xField.config.custom?.axisPlacement !== AxisPlacement.Hidden;\n\n if (xField.type === FieldType.time) {\n builder.addScale({\n scaleKey: xScaleKey,\n orientation: ScaleOrientation.Horizontal,\n direction: ScaleDirection.Right,\n isTime: true,\n range: () => {\n const r = getTimeRange();\n return [r.from.valueOf(), r.to.valueOf()];\n },\n });\n\n // filters first 2 ticks to make space for timezone labels\n const filterTicks: uPlot.Axis.Filter | undefined =\n timeZones.length > 1\n ? (u, splits) => {\n return splits.map((v, i) => (i < 2 ? null : v));\n }\n : undefined;\n\n for (let i = 0; i < timeZones.length; i++) {\n const timeZone = timeZones[i];\n builder.addAxis({\n scaleKey: xScaleKey,\n isTime: true,\n placement: xFieldAxisPlacement,\n show: xFieldAxisShow,\n label: xField.config.custom?.axisLabel,\n timeZone,\n theme,\n grid: { show: i === 0 && xField.config.custom?.axisGridShow },\n filter: filterTicks,\n });\n }\n\n // render timezone labels\n if (timeZones.length > 1) {\n builder.addHook('drawAxes', (u: uPlot) => {\n u.ctx.save();\n\n u.ctx.fillStyle = theme.colors.text.primary;\n u.ctx.textAlign = 'left';\n u.ctx.textBaseline = 'bottom';\n\n let i = 0;\n u.axes.forEach((a) => {\n if (a.side === 2) {\n //@ts-ignore\n let cssBaseline: number = a._pos + a._size;\n u.ctx.fillText(timeZones[i], u.bbox.left, cssBaseline * uPlot.pxRatio);\n i++;\n }\n });\n\n u.ctx.restore();\n });\n }\n } else {\n builder.addScale({\n scaleKey: xScaleKey,\n orientation: ScaleOrientation.Horizontal,\n direction: ScaleDirection.Right,\n range: (u, dataMin, dataMax) => [xField.config.min ?? dataMin, xField.config.max ?? dataMax],\n });\n\n builder.addAxis({\n scaleKey: xScaleKey,\n placement: xFieldAxisPlacement,\n show: xFieldAxisShow,\n label: xField.config.custom?.axisLabel,\n theme,\n grid: { show: xField.config.custom?.axisGridShow },\n formatValue: (v, decimals) => formattedValueToString(xField.display!(v, decimals)),\n });\n }\n\n let customRenderedFields =\n renderers?.flatMap((r) => Object.values(r.fieldMap).filter((name) => r.indicesOnly.indexOf(name) === -1)) ?? [];\n\n let indexByName: Map<string, number> | undefined;\n\n for (let i = 1; i < frame.fields.length; i++) {\n const field = frame.fields[i];\n\n const config: FieldConfig<GraphFieldConfig> = {\n ...field.config,\n custom: {\n ...defaultConfig,\n ...field.config.custom,\n },\n };\n\n const customConfig: GraphFieldConfig = config.custom!;\n\n if (field === xField || (field.type !== FieldType.number && field.type !== FieldType.enum)) {\n continue;\n }\n\n let fmt = field.display ?? defaultFormatter;\n if (field.config.custom?.stacking?.mode === StackingMode.Percent) {\n fmt = getDisplayProcessor({\n field: {\n ...field,\n config: {\n ...field.config,\n unit: 'percentunit',\n },\n },\n theme,\n });\n }\n const scaleKey = buildScaleKey(config, field.type);\n const colorMode = getFieldColorModeForField(field);\n const scaleColor = getFieldSeriesColor(field, theme);\n const seriesColor = scaleColor.color;\n\n // The builder will manage unique scaleKeys and combine where appropriate\n builder.addScale(\n tweakScale(\n {\n scaleKey,\n orientation: ScaleOrientation.Vertical,\n direction: ScaleDirection.Up,\n distribution: customConfig.scaleDistribution?.type,\n log: customConfig.scaleDistribution?.log,\n linearThreshold: customConfig.scaleDistribution?.linearThreshold,\n min: field.config.min,\n max: field.config.max,\n softMin: customConfig.axisSoftMin,\n softMax: customConfig.axisSoftMax,\n centeredZero: customConfig.axisCenteredZero,\n range:\n customConfig.stacking?.mode === StackingMode.Percent\n ? (u: uPlot, dataMin: number, dataMax: number) => {\n dataMin = dataMin < 0 ? -1 : 0;\n dataMax = dataMax > 0 ? 1 : 0;\n return [dataMin, dataMax];\n }\n : field.type === FieldType.enum\n ? (u: uPlot, dataMin: number, dataMax: number) => {\n // this is the exhaustive enum (stable)\n let len = field.config.type!.enum!.text!.length;\n\n return [-1, len];\n\n // these are only values that are present\n // return [dataMin - 1, dataMax + 1]\n }\n : undefined,\n decimals: field.config.decimals,\n },\n field\n )\n );\n\n if (!yScaleKey) {\n yScaleKey = scaleKey;\n }\n\n if (customConfig.axisPlacement !== AxisPlacement.Hidden) {\n let axisColor: uPlot.Axis.Stroke | undefined;\n\n if (customConfig.axisColorMode === AxisColorMode.Series) {\n if (\n colorMode.isByValue &&\n field.config.custom?.gradientMode === GraphGradientMode.Scheme &&\n colorMode.id === FieldColorModeId.Thresholds\n ) {\n axisColor = getScaleGradientFn(1, theme, colorMode, field.config.thresholds);\n } else {\n axisColor = seriesColor;\n }\n }\n\n const axisDisplayOptions = {\n border: {\n show: customConfig.axisBorderShow || false,\n width: 1 / devicePixelRatio,\n stroke: axisColor || theme.colors.text.primary,\n },\n ticks: {\n show: customConfig.axisBorderShow || false,\n stroke: axisColor || theme.colors.text.primary,\n },\n color: axisColor || theme.colors.text.primary,\n };\n\n let incrs: uPlot.Axis.Incrs | undefined;\n\n // TODO: these will be dynamic with frame updates, so need to accept getYTickLabels()\n let values: uPlot.Axis.Values | undefined;\n let splits: uPlot.Axis.Splits | undefined;\n\n if (IEC_UNITS.has(config.unit!)) {\n incrs = BIN_INCRS;\n } else if (field.type === FieldType.enum) {\n let text = field.config.type!.enum!.text!;\n splits = text.map((v: string, i: number) => i);\n values = text;\n }\n\n builder.addAxis(\n tweakAxis(\n {\n scaleKey,\n label: customConfig.axisLabel,\n size: customConfig.axisWidth,\n placement: customConfig.axisPlacement ?? AxisPlacement.Auto,\n formatValue: (v, decimals) => formattedValueToString(fmt(v, decimals)),\n theme,\n grid: { show: customConfig.axisGridShow },\n decimals: field.config.decimals,\n distr: customConfig.scaleDistribution?.type,\n splits,\n values,\n incrs,\n ...axisDisplayOptions,\n },\n field\n )\n );\n }\n\n const showPoints =\n customConfig.drawStyle === GraphDrawStyle.Points ? VisibilityMode.Always : customConfig.showPoints;\n\n let pointsFilter: uPlot.Series.Points.Filter = () => null;\n\n if (customConfig.spanNulls !== true) {\n pointsFilter = (u, seriesIdx, show, gaps) => {\n let filtered = [];\n\n let series = u.series[seriesIdx];\n\n if (!show && gaps && gaps.length) {\n const [firstIdx, lastIdx] = series.idxs!;\n const xData = u.data[0];\n const yData = u.data[seriesIdx];\n const firstPos = Math.round(u.valToPos(xData[firstIdx], 'x', true));\n const lastPos = Math.round(u.valToPos(xData[lastIdx], 'x', true));\n\n if (gaps[0][0] === firstPos) {\n filtered.push(firstIdx);\n }\n\n // show single points between consecutive gaps that share end/start\n for (let i = 0; i < gaps.length; i++) {\n let thisGap = gaps[i];\n let nextGap = gaps[i + 1];\n\n if (nextGap && thisGap[1] === nextGap[0]) {\n // approx when data density is > 1pt/px, since gap start/end pixels are rounded\n let approxIdx = u.posToIdx(thisGap[1], true);\n\n if (yData[approxIdx] == null) {\n // scan left/right alternating to find closest index with non-null value\n for (let j = 1; j < 100; j++) {\n if (yData[approxIdx + j] != null) {\n approxIdx += j;\n break;\n }\n if (yData[approxIdx - j] != null) {\n approxIdx -= j;\n break;\n }\n }\n }\n\n filtered.push(approxIdx);\n }\n }\n\n if (gaps[gaps.length - 1][1] === lastPos) {\n filtered.push(lastIdx);\n }\n }\n\n return filtered.length ? filtered : null;\n };\n }\n\n let { fillOpacity } = customConfig;\n\n let pathBuilder: uPlot.Series.PathBuilder | null = null;\n let pointsBuilder: uPlot.Series.Points.Show | null = null;\n\n if (field.state?.origin) {\n if (!indexByName) {\n indexByName = getNamesToFieldIndex(frame, allFrames);\n }\n\n const originFrame = allFrames[field.state.origin.frameIndex];\n const originField = originFrame?.fields[field.state.origin.fieldIndex];\n\n const dispName = getFieldDisplayName(originField ?? field, originFrame, allFrames);\n\n // disable default renderers\n if (customRenderedFields.indexOf(dispName) >= 0) {\n pathBuilder = () => null;\n pointsBuilder = () => undefined;\n } else if (customConfig.transform === GraphTransform.Constant) {\n // patch some monkeys!\n const defaultBuilder = uPlot.paths!.linear!();\n\n pathBuilder = (u, seriesIdx) => {\n //eslint-disable-next-line\n const _data: any[] = (u as any)._data; // uplot.AlignedData not exposed in types\n\n // the data we want the line renderer to pull is x at each plot edge with paired flat y values\n\n const r = getTimeRange();\n let xData = [r.from.valueOf(), r.to.valueOf()];\n let firstY = _data[seriesIdx].find((v: number | null | undefined) => v != null);\n let yData = [firstY, firstY];\n let fauxData = _data.slice();\n fauxData[0] = xData;\n fauxData[seriesIdx] = yData;\n\n //eslint-disable-next-line\n return defaultBuilder(\n {\n ...u,\n _data: fauxData,\n } as any,\n seriesIdx,\n 0,\n 1\n );\n };\n }\n\n if (customConfig.fillBelowTo) {\n const fillBelowToField = frame.fields.find(\n (f) =>\n customConfig.fillBelowTo === f.name ||\n customConfig.fillBelowTo === f.config?.displayNameFromDS ||\n customConfig.fillBelowTo === getFieldDisplayName(f, frame, allFrames)\n );\n\n const fillBelowDispName = fillBelowToField\n ? getFieldDisplayName(fillBelowToField, frame, allFrames)\n : customConfig.fillBelowTo;\n\n const t = indexByName.get(dispName);\n const b = indexByName.get(fillBelowDispName);\n if (isNumber(b) && isNumber(t)) {\n builder.addBand({\n series: [t, b],\n fill: undefined, // using null will have the band use fill options from `t`\n });\n\n if (!fillOpacity) {\n fillOpacity = 35; // default from flot\n }\n } else {\n fillOpacity = 0;\n }\n }\n }\n\n let dynamicSeriesColor: ((seriesIdx: number) => string | undefined) | undefined = undefined;\n\n if (colorMode.id === FieldColorModeId.Thresholds) {\n dynamicSeriesColor = (seriesIdx) => getFieldSeriesColor(alignedFrame.fields[seriesIdx], theme).color;\n }\n\n builder.addSeries({\n pathBuilder,\n pointsBuilder,\n scaleKey,\n showPoints,\n pointsFilter,\n colorMode,\n fillOpacity,\n theme,\n dynamicSeriesColor,\n drawStyle: customConfig.drawStyle!,\n lineColor: customConfig.lineColor ?? seriesColor,\n lineWidth: customConfig.lineWidth,\n lineInterpolation: customConfig.lineInterpolation,\n lineStyle: customConfig.lineStyle,\n barAlignment: customConfig.barAlignment,\n barWidthFactor: customConfig.barWidthFactor,\n barMaxWidth: customConfig.barMaxWidth,\n pointSize: customConfig.pointSize,\n spanNulls: customConfig.spanNulls || false,\n show: !customConfig.hideFrom?.viz,\n gradientMode: customConfig.gradientMode,\n thresholds: config.thresholds,\n hardMin: field.config.min,\n hardMax: field.config.max,\n softMin: customConfig.axisSoftMin,\n softMax: customConfig.axisSoftMax,\n // The following properties are not used in the uPlot config, but are utilized as transport for legend config\n dataFrameFieldIndex: field.state?.origin,\n });\n\n // Render thresholds in graph\n if (customConfig.thresholdsStyle && config.thresholds) {\n const thresholdDisplay = customConfig.thresholdsStyle.mode ?? GraphThresholdsStyleMode.Off;\n if (thresholdDisplay !== GraphThresholdsStyleMode.Off) {\n builder.addThresholds({\n config: customConfig.thresholdsStyle,\n thresholds: config.thresholds,\n scaleKey,\n theme,\n hardMin: field.config.min,\n hardMax: field.config.max,\n softMin: customConfig.axisSoftMin,\n softMax: customConfig.axisSoftMax,\n });\n }\n }\n }\n\n let stackingGroups = getStackingGroups(frame);\n\n builder.setStackingGroups(stackingGroups);\n\n // hook up custom/composite renderers\n renderers?.forEach((r) => {\n if (!indexByName) {\n indexByName = getNamesToFieldIndex(frame, allFrames);\n }\n let fieldIndices: Record<string, number> = {};\n\n for (let key in r.fieldMap) {\n let dispName = r.fieldMap[key];\n fieldIndices[key] = indexByName.get(dispName)!;\n }\n\n r.init(builder, fieldIndices);\n });\n\n builder.scaleKeys = [xScaleKey, yScaleKey];\n\n // if hovered value is null, how far we may scan left/right to hover nearest non-null\n const hoverProximityPx = 15;\n\n let cursor: Partial<uPlot.Cursor> = {\n // this scans left and right from cursor position to find nearest data index with value != null\n // TODO: do we want to only scan past undefined values, but halt at explicit null values?\n dataIdx: (self, seriesIdx, hoveredIdx, cursorXVal) => {\n let seriesData = self.data[seriesIdx];\n\n if (seriesData[hoveredIdx] == null) {\n let nonNullLft = null,\n nonNullRgt = null,\n i;\n\n i = hoveredIdx;\n while (nonNullLft == null && i-- > 0) {\n if (seriesData[i] != null) {\n nonNullLft = i;\n }\n }\n\n i = hoveredIdx;\n while (nonNullRgt == null && i++ < seriesData.length) {\n if (seriesData[i] != null) {\n nonNullRgt = i;\n }\n }\n\n let xVals = self.data[0];\n\n let curPos = self.valToPos(cursorXVal, 'x');\n let rgtPos = nonNullRgt == null ? Infinity : self.valToPos(xVals[nonNullRgt], 'x');\n let lftPos = nonNullLft == null ? -Infinity : self.valToPos(xVals[nonNullLft], 'x');\n\n let lftDelta = curPos - lftPos;\n let rgtDelta = rgtPos - curPos;\n\n if (lftDelta <= rgtDelta) {\n if (lftDelta <= hoverProximityPx) {\n hoveredIdx = nonNullLft!;\n }\n } else {\n if (rgtDelta <= hoverProximityPx) {\n hoveredIdx = nonNullRgt!;\n }\n }\n }\n\n return hoveredIdx;\n },\n };\n\n if (sync && sync() !== DashboardCursorSync.Off) {\n cursor.sync = {\n key: eventsScope,\n scales: [xScaleKey, null],\n };\n }\n\n builder.setCursor(cursor);\n\n return builder;\n};\n\nexport function getNamesToFieldIndex(frame: DataFrame, allFrames: DataFrame[]): Map<string, number> {\n const originNames = new Map<string, number>();\n frame.fields.forEach((field, i) => {\n const origin = field.state?.origin;\n if (origin) {\n const origField = allFrames[origin.frameIndex]?.fields[origin.fieldIndex];\n if (origField) {\n originNames.set(getFieldDisplayName(origField, allFrames[origin.frameIndex], allFrames), i);\n }\n }\n });\n return originNames;\n}\n"],"names":["_a","_b","i"],"mappings":"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"}