UNPKG

@netdata/charts

Version:

Netdata frontend SDK and chart utilities

245 lines 13.6 kB
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } import { useMemo, useReducer } from "react"; import { calculateMedian, calculatePercentile, calculateStdDev } from "../../../helpers/statistics"; import { isIncremental } from "../../../helpers/heatmap"; import { useAttributeValue, useChart, useImmediateListener, usePayload } from "../../provider"; import { getPointValue } from "../../../sdk/makeChart/getPointValue"; var nextVersion = function nextVersion(version) { return version + 1; }; var advancedStatKeys = new Set(["median", "stddev", "p95", "range", "volume"]); var responseStatKeys = new Set(["min", "avg", "max", "arp"]); var isValidNumber = function isValidNumber(value) { return value !== null && !isNaN(value) && isFinite(value); }; var getVisibleDimensionId = function getVisibleDimensionId(chart, id) { return chart.isDimensionVisible(id) ? id : chart.getVisibleDimensionIds()[0]; }; var getViewStatValue = function getViewStatValue(chart, id, key, _ref) { var _chart$getAttribute, _stats$key; var abs = _ref.abs, period = _ref.period; if (period !== "window" || isIncremental(chart)) return undefined; var visibleId = getVisibleDimensionId(chart, id); if (!visibleId) return undefined; var dimensionIndex = chart.getDimensionIndex(visibleId); if (typeof dimensionIndex !== "number") return undefined; var stats = (_chart$getAttribute = chart.getAttribute("viewDimensions")) === null || _chart$getAttribute === void 0 ? void 0 : _chart$getAttribute.sts; if (!stats) return undefined; if (key === "range") { var _stats$min, _stats$max; var min = (_stats$min = stats.min) === null || _stats$min === void 0 ? void 0 : _stats$min[dimensionIndex]; var max = (_stats$max = stats.max) === null || _stats$max === void 0 ? void 0 : _stats$max[dimensionIndex]; if (!isValidNumber(min) || !isValidNumber(max)) return undefined; if (abs && (min < 0 || max < 0)) return undefined; return max - min; } if (!responseStatKeys.has(key)) return undefined; var value = (_stats$key = stats[key]) === null || _stats$key === void 0 ? void 0 : _stats$key[dimensionIndex]; if (!isValidNumber(value)) return undefined; if (key !== "arp" && abs) { var _stats$min2, _stats$max2; var _min = (_stats$min2 = stats.min) === null || _stats$min2 === void 0 ? void 0 : _stats$min2[dimensionIndex]; var _max = (_stats$max2 = stats.max) === null || _stats$max2 === void 0 ? void 0 : _stats$max2[dimensionIndex]; if (isValidNumber(_min) && _min < 0 || isValidNumber(_max) && _max < 0) return undefined; } return value; }; var getDirectRowDimensionValue = function getDirectRowDimensionValue(chart, id, row, _ref2) { var dimensionIndex = _ref2.dimensionIndex, _ref2$valueKey = _ref2.valueKey, valueKey = _ref2$valueKey === void 0 ? "value" : _ref2$valueKey, _ref2$abs = _ref2.abs, abs = _ref2$abs === void 0 ? true : _ref2$abs, _ref2$allowNull = _ref2.allowNull, allowNull = _ref2$allowNull === void 0 ? false : _ref2$allowNull; if (dimensionIndex === undefined || isIncremental(chart)) { return chart.getRowDimensionValue(id, row, { valueKey: valueKey, abs: abs, allowNull: allowNull }); } var value = getPointValue(row === null || row === void 0 ? void 0 : row[dimensionIndex + 1], chart.getPayload().point, valueKey); if (typeof value === "undefined") return null; value = allowNull && value === null ? value : abs ? Math.abs(value) : value; return value; }; var getPeriodRows = function getPeriodRows(chart, payload, period) { var data = (payload === null || payload === void 0 ? void 0 : payload.data) || []; if (!data.length) return null; if (period !== "highlight") return data; var _chart$getAttribute2 = chart.getAttribute("overlays"), highlight = _chart$getAttribute2.highlight; if (!(highlight !== null && highlight !== void 0 && highlight.range)) return null; var _highlight$range = _slicedToArray(highlight.range, 2), start = _highlight$range[0], end = _highlight$range[1]; return data.filter(function (row) { var timestamp = row[0] / 1000; return timestamp >= start && timestamp <= end; }); }; var calculateDimensionStats = function calculateDimensionStats(chart, id, rows, _ref3) { var abs = _ref3.abs, includeAdvancedStats = _ref3.includeAdvancedStats, requestedKey = _ref3.requestedKey; if (!(rows !== null && rows !== void 0 && rows.length)) return null; id = getVisibleDimensionId(chart, id); if (!id) return null; var dimensionIndex = chart.getDimensionIndex(id); var includeAdvanced = includeAdvancedStats || advancedStatKeys.has(requestedKey); var values = includeAdvanced ? [] : null; var count = 0; var sum = 0; var min = Infinity; var max = -Infinity; var volume = 0; for (var i = 0; i < rows.length; i++) { var value = getDirectRowDimensionValue(chart, id, rows[i], { dimensionIndex: dimensionIndex, abs: abs, allowNull: true }); if (!isValidNumber(value)) continue; count++; sum += value; volume += Math.abs(value); if (value < min) min = value; if (value > max) max = value; if (values) values.push(value); } if (!count) return null; var avg = sum / count; var stats = { min: min, avg: avg, max: max, arp: 0 }; if (!includeAdvanced) return stats; return _objectSpread(_objectSpread({}, stats), {}, { median: calculateMedian(values), stddev: calculateStdDev(values, avg), p95: calculatePercentile(values, 95), range: max - min, volume: volume }); }; var getLatestIndex = function getLatestIndex(chart, payload) { var all = (payload === null || payload === void 0 ? void 0 : payload.all) || []; if (!all.length) return -1; var hover = chart.getAttribute("hoverX"); var index = hover ? chart.getClosestRow(hover[0]) : -1; return index === -1 ? all.length - 1 : index; }; export var createDimensionValueCache = function createDimensionValueCache(chart) { var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref4$payload = _ref4.payload, payload = _ref4$payload === void 0 ? chart.getPayload() : _ref4$payload, _ref4$period = _ref4.period, period = _ref4$period === void 0 ? "window" : _ref4$period, _ref4$includeAdvanced = _ref4.includeAdvancedStats, includeAdvancedStats = _ref4$includeAdvanced === void 0 ? false : _ref4$includeAdvanced; var latestValues = new Map(); var statsById = new Map(); var rows = getPeriodRows(chart, payload, period); var abs = chart.getAttribute("abs"); var latestIndex = getLatestIndex(chart, payload); var getLatestValue = function getLatestValue(id, valueKey) { var _payload$all; var key = "".concat(id, "\0").concat(valueKey); if (latestValues.has(key)) return latestValues.get(key); var visibleId = getVisibleDimensionId(chart, id); var dimensionIndex = visibleId ? chart.getDimensionIndex(visibleId) : undefined; var value = latestIndex === -1 || !visibleId ? null : getDirectRowDimensionValue(chart, visibleId, payload === null || payload === void 0 || (_payload$all = payload.all) === null || _payload$all === void 0 ? void 0 : _payload$all[latestIndex], { dimensionIndex: dimensionIndex, valueKey: valueKey, abs: abs, allowNull: true }); latestValues.set(key, value); return value; }; var getStats = function getStats(id, requestedKey) { var cached = statsById.get(id); var needsAdvanced = includeAdvancedStats || advancedStatKeys.has(requestedKey); if (cached !== null && cached !== void 0 && cached.stats && Object.prototype.hasOwnProperty.call(cached.stats, requestedKey)) { return cached.stats; } var responseStat = getViewStatValue(chart, id, requestedKey, { abs: abs, period: period }); if (typeof responseStat !== "undefined") { var _stats = _objectSpread(_objectSpread({}, (cached === null || cached === void 0 ? void 0 : cached.stats) || {}), {}, _defineProperty({}, requestedKey, responseStat)); statsById.set(id, { includeAdvanced: (cached === null || cached === void 0 ? void 0 : cached.includeAdvanced) || false, stats: _stats }); return _stats; } if (cached && (!needsAdvanced || cached.includeAdvanced)) return cached.stats; var stats = calculateDimensionStats(chart, id, rows, { abs: abs, includeAdvancedStats: includeAdvancedStats, requestedKey: requestedKey }); statsById.set(id, { includeAdvanced: needsAdvanced, stats: stats }); return stats; }; return { get: function get(id) { var _getStats$valueKey, _getStats; var valueKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "value"; var _ref5 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, _ref5$period = _ref5.period, valuePeriod = _ref5$period === void 0 ? period : _ref5$period; if (valuePeriod === "latest") return getLatestValue(id, valueKey); return (_getStats$valueKey = (_getStats = getStats(id, valueKey)) === null || _getStats === void 0 ? void 0 : _getStats[valueKey]) !== null && _getStats$valueKey !== void 0 ? _getStats$valueKey : null; } }; }; var useVisibleDimensionsVersion = function useVisibleDimensionsVersion(chart) { var _useReducer = useReducer(nextVersion, 0), _useReducer2 = _slicedToArray(_useReducer, 2), version = _useReducer2[0], bumpVersion = _useReducer2[1]; useImmediateListener(function () { return chart.on("visibleDimensionsChanged", bumpVersion); }, [chart]); return version; }; var useDimensionValueCache = function useDimensionValueCache(period) { var _ref6 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref6$includeAdvanced = _ref6.includeAdvancedStats, includeAdvancedStats = _ref6$includeAdvanced === void 0 ? false : _ref6$includeAdvanced; var chart = useChart(); var payload = usePayload(); var hover = useAttributeValue("hoverX"); var overlays = useAttributeValue("overlays"); var abs = useAttributeValue("abs"); var visibleDimensionsVersion = useVisibleDimensionsVersion(chart); return useMemo(function () { return createDimensionValueCache(chart, { payload: payload, period: period, includeAdvancedStats: includeAdvancedStats }); }, [chart, payload, period, includeAdvancedStats, hover, overlays, abs, visibleDimensionsVersion]); }; export default useDimensionValueCache;