From 7f68005af57748c46429af972e4214a5ab88ce7a Mon Sep 17 00:00:00 2001 From: Hariom Gupta Date: Sun, 2 Mar 2025 08:34:06 +0000 Subject: [PATCH 01/13] add recharts to scatterplot Signed-off-by: Hariom Gupta --- package-lock.json | 243 +++++++++++++++++- packages/jaeger-ui/package.json | 1 + .../SearchResults/ScatterPlot.css | 4 - .../SearchResults/ScatterPlot.jsx | 159 +++++++++--- 4 files changed, 357 insertions(+), 50 deletions(-) diff --git a/package-lock.json b/package-lock.json index e7f957060d..504408f62f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4554,23 +4554,48 @@ "@types/node": "*" } }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, "node_modules/@types/d3-color": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dev": true, "license": "MIT", "dependencies": { "@types/d3-color": "*" } }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, "node_modules/@types/d3-selection": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", @@ -4578,6 +4603,27 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, "node_modules/@types/d3-zoom": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", @@ -6985,6 +7031,15 @@ "node": ">=6" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -7854,6 +7909,12 @@ "dev": true, "license": "MIT" }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, "node_modules/decode-uri-component": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", @@ -8306,6 +8367,16 @@ "utila": "~0.4" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dom-scroll-into-view": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz", @@ -9553,7 +9624,6 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, "license": "MIT" }, "node_modules/events": { @@ -9707,6 +9777,15 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-equals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -11160,6 +11239,15 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/interpret": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", @@ -16594,6 +16682,21 @@ "react": "^16.3.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react-test-renderer": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.3.1.tgz", @@ -16609,6 +16712,22 @@ "react": "^18.3.1" } }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/react-vis": { "version": "1.11.12", "resolved": "https://registry.npmjs.org/react-vis/-/react-vis-1.11.12.tgz", @@ -16768,6 +16887,38 @@ "node": ">=8.10.0" } }, + "node_modules/recharts": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.1.tgz", + "integrity": "sha512-v8PUTUlyiDe56qUj82w/EDVuzEFXwEHp9/xOowGAZwfLjB9uAy3GllQVIYMWF6nU+qibx85WF75zD7AjqoT54Q==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -19364,6 +19515,89 @@ "node": ">= 0.8" } }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/victory-vendor/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/victory-vendor/node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -20127,7 +20361,7 @@ "@jaegertracing/plexus": "0.2.0", "@pyroscope/flamegraph": "0.21.4", "@sentry/browser": "9.0.0", - "antd": "^5.24.0", + "antd": "^5.23.3", "chance": "^1.0.10", "classnames": "^2.5.1", "combokeys": "^3.0.0", @@ -20159,6 +20393,7 @@ "react-vis": "1.11.12", "react-vis-force": "^0.3.1", "react-window": "^1.8.10", + "recharts": "^2.15.1", "redux": "^5.0.1", "redux-actions": "2.6.5", "redux-first-history": "^5.2.0", diff --git a/packages/jaeger-ui/package.json b/packages/jaeger-ui/package.json index 3c63582779..88c955802e 100644 --- a/packages/jaeger-ui/package.json +++ b/packages/jaeger-ui/package.json @@ -81,6 +81,7 @@ "react-vis": "1.11.12", "react-vis-force": "^0.3.1", "react-window": "^1.8.10", + "recharts": "^2.15.1", "redux": "^5.0.1", "redux-actions": "2.6.5", "redux-first-history": "^5.2.0", diff --git a/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ScatterPlot.css b/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ScatterPlot.css index 8e649c25f2..96b9b35d0a 100644 --- a/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ScatterPlot.css +++ b/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ScatterPlot.css @@ -14,10 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -.TraceResultsScatterPlot .rv-xy-plot__series.rv-xy-plot__series--mark { - cursor: pointer; -} - .scatter-plot-hint { color: #444; background: #f8f8f8; diff --git a/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ScatterPlot.jsx b/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ScatterPlot.jsx index af92462c00..61e14d49e6 100644 --- a/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ScatterPlot.jsx +++ b/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ScatterPlot.jsx @@ -15,14 +15,41 @@ import React, { useRef, useState, useLayoutEffect } from 'react'; import dayjs from 'dayjs'; import PropTypes from 'prop-types'; -import { XYPlot, XAxis, YAxis, MarkSeries, Hint } from 'react-vis'; +import { + ScatterChart, + Scatter, + XAxis, + YAxis, + Tooltip, + ResponsiveContainer, + ZAxis, + Label, + Dot, +} from 'recharts'; import { FALLBACK_TRACE_NAME } from '../../../constants'; import { ONE_MILLISECOND, formatDuration } from '../../../utils/date'; -import 'react-vis/dist/style.css'; import './ScatterPlot.css'; +const CustomTooltip = ({ active, payload }) => { + if (active && payload && payload.length) { + return ( +
+

{payload[0].payload.name || FALLBACK_TRACE_NAME}

+
+ ); + } + return null; +}; + +const RenderDot = ({ cx, cy, fill, size }) => { + const maxSize = Math.min(300, size); + return ( + + ); +}; + export default function ScatterPlot({ data, onValueClick, @@ -33,16 +60,6 @@ export default function ScatterPlot({ const containerRef = useRef(null); const [containerWidth, setContainerWidth] = useState(0); - const [overValue, setValueOver] = useState(null); - - const onValueOver = value => { - setValueOver(value); - }; - - const onValueOut = () => { - setValueOver(null); - }; - useLayoutEffect(() => { function updateContainerWidth() { if (containerRef.current) { @@ -58,37 +75,95 @@ export default function ScatterPlot({ return () => window.removeEventListener('resize', updateContainerWidth); }, []); + const xMin = Math.min(...data.map(d => d.x)); + const xMax = Math.max(...data.map(d => d.x)); + + /* + This function generates unique ticks for the x-axis. + It ensures that the ticks are unique by checking if the label for a given tick value has already been used. + If it has, the tick is not added to the list of ticks. + */ + const generateUniqueTicks = (min, max, count) => { + const step = (max - min) / (count - 1); + const ticks = []; + const seenLabels = new Set(); + + for (let i = 0; i < count; i++) { + const value = min + step * i; + ticks.push(value); + } + + return ticks.filter(tick => { + const label = dayjs(tick / ONE_MILLISECOND).format('hh:mm:ss a'); + if (seenLabels.has(label)) { + return false; + } + seenLabels.add(label); + return true; + }); + }; + return ( -
- {containerWidth && ( - - dayjs(t / ONE_MILLISECOND).format('hh:mm:ss a')} - /> - formatDuration(t)} /> - - {overValue && ( - -

{overValue.name || FALLBACK_TRACE_NAME}

-
- )} -
+
+ {containerWidth > 0 && ( + + + dayjs(t / ONE_MILLISECOND).format('hh:mm:ss a')} + tick={{ fontSize: 11 }} + axisLine={{ stroke: '#e6e6e9', strokeWidth: 2 }} + tickLine={{ stroke: '#e6e6e9', strokeWidth: 1 }} + allowDecimals={false} + interval="equidistantPreserveStart" + /> + formatDuration(t)} + tick={{ fontSize: 11 }} + axisLine={{ stroke: '#e6e6e9', strokeWidth: 2 }} + tickLine={{ stroke: '#e6e6e9', strokeWidth: 1 }} + tickCount={4} + allowDecimals={false} + domain={['auto', 'auto']} + > + + + } cursor={false} isAnimationActive={false} /> + { + return { + ...point, + fill: point.color, + }; + })} + onClick={onValueClick} + shape={} + fill={point => point.fill} + /> + + )}
); From f9222723ef88f108fbe9f0c358d88c49b87121fd Mon Sep 17 00:00:00 2001 From: Hariom Gupta Date: Sun, 2 Mar 2025 09:11:14 +0000 Subject: [PATCH 02/13] add style changes Signed-off-by: Hariom Gupta --- .../SearchResults/ScatterPlot.jsx | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ScatterPlot.jsx b/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ScatterPlot.jsx index 61e14d49e6..e3aefceb1a 100644 --- a/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ScatterPlot.jsx +++ b/packages/jaeger-ui/src/components/SearchTracePage/SearchResults/ScatterPlot.jsx @@ -122,18 +122,26 @@ export default function ScatterPlot({ domain={[xMin, xMax]} ticks={generateUniqueTicks(xMin, xMax, 10)} tickFormatter={t => dayjs(t / ONE_MILLISECOND).format('hh:mm:ss a')} - tick={{ fontSize: 11 }} + tick={{ fontSize: 11, dy: 5 }} axisLine={{ stroke: '#e6e6e9', strokeWidth: 2 }} tickLine={{ stroke: '#e6e6e9', strokeWidth: 1 }} allowDecimals={false} interval="equidistantPreserveStart" - /> + > +
@@ -4413,64 +4476,71 @@ exports[` render lower than 0.1 error rate 1`] = ` className="ops-container" >
- - + + + + + + + + + + + + +
@@ -4496,64 +4566,71 @@ exports[` render lower than 0.1 error rate 1`] = ` className="ops-container" >
- - + + + + + + + + + + + + +
@@ -4579,64 +4656,71 @@ exports[` render lower than 0.1 error rate 1`] = ` className="ops-container" >
- - + + + + + + + + + + + + +
@@ -5463,64 +5547,71 @@ exports[` render lower than 0.1 request rate value 1`] = className="ops-container" >
- - + + + + + + + + + + + + +
@@ -5546,64 +5637,71 @@ exports[` render lower than 0.1 request rate value 1`] = className="ops-container" >
- - + + + + + + + + + + + + +
@@ -5629,64 +5727,71 @@ exports[` render lower than 0.1 request rate value 1`] = className="ops-container" >
- - + + + + + + + + + + + + +
@@ -6513,64 +6618,71 @@ exports[` render request rate number with more than 2 dec className="ops-container" >
- - + + + + + + + + + + + + +
@@ -6596,64 +6708,71 @@ exports[` render request rate number with more than 2 dec className="ops-container" >
- - + + + + + + + + + + + + +
@@ -6679,64 +6798,71 @@ exports[` render request rate number with more than 2 dec className="ops-container" >
- - + + + + + + + + + + + + +
@@ -7563,64 +7689,71 @@ exports[` render some values in the table 1`] = ` className="ops-container" >
- - + + + + + + + + + + + + +
@@ -7646,64 +7779,71 @@ exports[` render some values in the table 1`] = ` className="ops-container" >
- - + + + + + + + + + + + + +
@@ -7729,64 +7869,71 @@ exports[` render some values in the table 1`] = ` className="ops-container" >
- - + + + + + + + + + + + + +