@parca/profile 0.18.0 → 0.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.18.2](https://github.com/parca-dev/parca/compare/@parca/profile@0.18.1...@parca/profile@0.18.2) (2025-06-17)
7
+
8
+ **Note:** Version bump only for package @parca/profile
9
+
10
+ ## [0.18.1](https://github.com/parca-dev/parca/compare/@parca/profile@0.18.0...@parca/profile@0.18.1) (2025-06-17)
11
+
12
+ **Note:** Version bump only for package @parca/profile
13
+
6
14
  # [0.18.0](https://github.com/parca-dev/parca/compare/@parca/profile@0.17.11...@parca/profile@0.18.0) (2025-06-16)
7
15
 
8
16
  ### Features
@@ -15,10 +15,18 @@ interface CommonProps {
15
15
  humanReadableName: string;
16
16
  from: number;
17
17
  to: number;
18
+ selectedSeries?: Array<{
19
+ key: string;
20
+ value: string;
21
+ }>;
22
+ onSelectedSeriesChange?: (series: Array<{
23
+ key: string;
24
+ value: string;
25
+ }>) => void;
18
26
  }
19
27
  type Props = CommonProps & {
20
28
  utilizationMetricsLoading?: boolean;
21
29
  };
22
- declare const AreaChart: ({ transmitData, receiveData, addLabelMatcher, setTimeRange, utilizationMetricsLoading, name, humanReadableName, from, to, }: Props) => JSX.Element;
30
+ declare const AreaChart: ({ transmitData, receiveData, addLabelMatcher, setTimeRange, utilizationMetricsLoading, name, humanReadableName, from, to, selectedSeries, onSelectedSeriesChange, }: Props) => JSX.Element;
23
31
  export default AreaChart;
24
32
  //# sourceMappingURL=Throughput.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Throughput.d.ts","sourceRoot":"","sources":["../../../src/MetricsGraph/UtilizationMetrics/Throughput.tsx"],"names":[],"mappings":"AAqBA,OAAO,EAAC,aAAa,EAAqD,MAAM,mBAAmB,CAAC;AAIpG,OAAO,EAAC,KAAK,kBAAkB,IAAI,YAAY,EAAC,MAAM,uBAAuB,CAAC;AAkB9E,UAAU,WAAW;IACnB,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,eAAe,EAAE,CACf,MAAM,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,GAAG,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,KACvE,IAAI,CAAC;IACV,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAQD,KAAK,KAAK,GAAG,WAAW,GAAG;IACzB,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC,CAAC;AA2dF,QAAA,MAAM,SAAS,gIAUZ,KAAK,KAAG,GAAG,CAAC,OAiCd,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"Throughput.d.ts","sourceRoot":"","sources":["../../../src/MetricsGraph/UtilizationMetrics/Throughput.tsx"],"names":[],"mappings":"AAqBA,OAAO,EAAC,aAAa,EAAqD,MAAM,mBAAmB,CAAC;AAIpG,OAAO,EAAC,KAAK,kBAAkB,IAAI,YAAY,EAAC,MAAM,uBAAuB,CAAC;AAkB9E,UAAU,WAAW;IACnB,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,eAAe,EAAE,CACf,MAAM,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,GAAG,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,KACvE,IAAI,CAAC;IACV,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,CAAC,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IACrD,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,KAAK,IAAI,CAAC;CAChF;AAQD,KAAK,KAAK,GAAG,WAAW,GAAG;IACzB,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC,CAAC;AA8dF,QAAA,MAAM,SAAS,wKAYZ,KAAK,KAAG,GAAG,CAAC,OAmCd,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -49,7 +49,7 @@ function transformToSeries(data, isReceive = false) {
49
49
  values: series.values.sort((a, b) => a[0] - b[0]),
50
50
  }));
51
51
  }
52
- const RawAreaChart = ({ transmitData, receiveData, addLabelMatcher, setTimeRange, width, height, margin, humanReadableName, from, to, }) => {
52
+ const RawAreaChart = ({ transmitData, receiveData, addLabelMatcher, setTimeRange, width, height, margin, humanReadableName, from, to, selectedSeries, onSelectedSeriesChange, }) => {
53
53
  const { timezone } = useParcaContext();
54
54
  const graph = useRef(null);
55
55
  const [dragging, setDragging] = useState(false);
@@ -58,13 +58,16 @@ const RawAreaChart = ({ transmitData, receiveData, addLabelMatcher, setTimeRange
58
58
  const [pos, setPos] = useState([0, 0]);
59
59
  const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);
60
60
  const idForContextMenu = useId();
61
- const [selectedSeries, setSelectedSeries] = useURLState('selectedSeries');
62
61
  const [_, setSelectedTimeframe] = useURLState('gpu_selected_timeframe');
63
62
  const parsedSelectedSeries = useMemo(() => {
64
- if (selectedSeries === undefined) {
63
+ if (selectedSeries == null || selectedSeries.length === 0) {
65
64
  return [];
66
65
  }
67
- return JSON.parse(decodeURIComponent(selectedSeries));
66
+ return selectedSeries.map(s => ({
67
+ key: s.key,
68
+ value: s.value,
69
+ matcherType: '=',
70
+ }));
68
71
  }, [selectedSeries]);
69
72
  const lineStroke = '1px';
70
73
  const lineStrokeHover = '2px';
@@ -231,19 +234,19 @@ const RawAreaChart = ({ transmitData, receiveData, addLabelMatcher, setTimeRange
231
234
  : hovering && highlighted != null && i === highlighted.seriesIndex
232
235
  ? lineStrokeHover
233
236
  : lineStroke, strokeOpacity: isSelected ? 1 : 0.8, onClick: () => {
234
- if (highlighted != null) {
235
- setSelectedSeries(JSON.stringify(highlighted.labels.map(l => ({
237
+ if (highlighted != null && onSelectedSeriesChange != null) {
238
+ onSelectedSeriesChange(highlighted.labels.map(l => ({
236
239
  key: l.name,
237
240
  value: l.value,
238
- }))));
241
+ })));
239
242
  setSelectedTimeframe(undefined);
240
243
  }
241
244
  } }) }, i));
242
245
  })] })] })] }) })] }));
243
246
  };
244
- const AreaChart = ({ transmitData, receiveData, addLabelMatcher, setTimeRange, utilizationMetricsLoading, name, humanReadableName, from, to, }) => {
247
+ const AreaChart = ({ transmitData, receiveData, addLabelMatcher, setTimeRange, utilizationMetricsLoading, name, humanReadableName, from, to, selectedSeries, onSelectedSeriesChange, }) => {
245
248
  const { isDarkMode } = useParcaContext();
246
249
  const { width, height, margin, heightStyle } = useMetricsGraphDimensions(false, true);
247
- return (_jsx(AnimatePresence, { children: _jsx(motion.div, { className: "w-full relative", initial: { display: 'none', opacity: 0 }, animate: { display: 'block', opacity: 1 }, transition: { duration: 0.5 }, children: utilizationMetricsLoading === true ? (_jsx(MetricsGraphSkeleton, { heightStyle: heightStyle, isDarkMode: isDarkMode, isMini: true })) : (_jsx(RawAreaChart, { transmitData: transmitData, receiveData: receiveData, addLabelMatcher: addLabelMatcher, setTimeRange: setTimeRange, width: width, height: height, margin: margin, name: name, humanReadableName: humanReadableName, from: from, to: to })) }, "area-chart-graph-loaded") }));
250
+ return (_jsx(AnimatePresence, { children: _jsx(motion.div, { className: "w-full relative", initial: { display: 'none', opacity: 0 }, animate: { display: 'block', opacity: 1 }, transition: { duration: 0.5 }, children: utilizationMetricsLoading === true ? (_jsx(MetricsGraphSkeleton, { heightStyle: heightStyle, isDarkMode: isDarkMode, isMini: true })) : (_jsx(RawAreaChart, { transmitData: transmitData, receiveData: receiveData, addLabelMatcher: addLabelMatcher, setTimeRange: setTimeRange, width: width, height: height, margin: margin, name: name, humanReadableName: humanReadableName, from: from, to: to, selectedSeries: selectedSeries, onSelectedSeriesChange: onSelectedSeriesChange })) }, "area-chart-graph-loaded") }));
248
251
  };
249
252
  export default AreaChart;
@@ -14,6 +14,10 @@ interface CommonProps {
14
14
  humanReadableName: string;
15
15
  from: number;
16
16
  to: number;
17
+ onSelectedSeriesChange?: (series: Array<{
18
+ key: string;
19
+ value: string;
20
+ }>) => void;
17
21
  }
18
22
  type Props = CommonProps & {
19
23
  data: MetricSeries[];
@@ -27,6 +31,6 @@ type Props = CommonProps & {
27
31
  setTimeRange: (range: DateTimeRange) => void;
28
32
  utilizationMetricsLoading?: boolean;
29
33
  };
30
- declare const UtilizationMetrics: ({ data, addLabelMatcher, setTimeRange, utilizationMetricsLoading, name, humanReadableName, from, to, }: Props) => JSX.Element;
34
+ declare const UtilizationMetrics: ({ data, addLabelMatcher, setTimeRange, utilizationMetricsLoading, name, humanReadableName, from, to, onSelectedSeriesChange, }: Props) => JSX.Element;
31
35
  export default UtilizationMetrics;
32
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/MetricsGraph/UtilizationMetrics/index.tsx"],"names":[],"mappings":"AAqBA,OAAO,EAAC,aAAa,EAAqD,MAAM,mBAAmB,CAAC;AAKpG,OAAO,EAAC,KAAK,kBAAkB,IAAI,YAAY,EAAC,MAAM,uBAAuB,CAAC;AAO9E,UAAU,WAAW;IACnB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,eAAe,EAAE,CACf,MAAM,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,GAAG,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,KACvE,IAAI,CAAC;IACV,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAQD,KAAK,KAAK,GAAG,WAAW,GAAG;IACzB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,eAAe,EAAE,CACf,MAAM,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,GAAG,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,KACvE,IAAI,CAAC;IACV,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC,CAAC;AAwdF,QAAA,MAAM,kBAAkB,2GASrB,KAAK,KAAG,GAAG,CAAC,OAgCd,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/MetricsGraph/UtilizationMetrics/index.tsx"],"names":[],"mappings":"AAqBA,OAAO,EAAC,aAAa,EAAqD,MAAM,mBAAmB,CAAC;AAIpG,OAAO,EAAC,KAAK,kBAAkB,IAAI,YAAY,EAAC,MAAM,uBAAuB,CAAC;AAO9E,UAAU,WAAW;IACnB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,eAAe,EAAE,CACf,MAAM,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,GAAG,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,KACvE,IAAI,CAAC;IACV,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,KAAK,IAAI,CAAC;CAChF;AAQD,KAAK,KAAK,GAAG,WAAW,GAAG;IACzB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,eAAe,EAAE,CACf,MAAM,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,GAAG,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,KACvE,IAAI,CAAC;IACV,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC,CAAC;AAmcF,QAAA,MAAM,kBAAkB,mIAUrB,KAAK,KAAG,GAAG,CAAC,OAiCd,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -30,6 +30,7 @@ function transformToSeries(data) {
30
30
  const metric = s.labelset.labels.sort((a, b) => a.name.localeCompare(b.name));
31
31
  agg.push({
32
32
  metric,
33
+ isSelected: s.isSelected ?? false,
33
34
  values: s.samples.reduce(function (agg, d) {
34
35
  if (d.timestamp !== undefined && d.value !== undefined) {
35
36
  agg.push([d.timestamp, d.value]);
@@ -59,7 +60,7 @@ const getYAxisUnit = (name) => {
59
60
  return 'percent';
60
61
  }
61
62
  };
62
- const RawUtilizationMetrics = ({ data, addLabelMatcher, setTimeRange, width, height, margin, name, humanReadableName, from, to, }) => {
63
+ const RawUtilizationMetrics = ({ data, addLabelMatcher, setTimeRange, width, height, margin, name, humanReadableName, from, to, onSelectedSeriesChange, }) => {
63
64
  const { timezone } = useParcaContext();
64
65
  const graph = useRef(null);
65
66
  const [dragging, setDragging] = useState(false);
@@ -68,14 +69,7 @@ const RawUtilizationMetrics = ({ data, addLabelMatcher, setTimeRange, width, hei
68
69
  const [pos, setPos] = useState([0, 0]);
69
70
  const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);
70
71
  const idForContextMenu = useId();
71
- const [selectedSeries, setSelectedSeries] = useURLState('selectedSeries');
72
72
  const [_, setSelectedTimeframe] = useURLState('gpu_selected_timeframe');
73
- const parsedSelectedSeries = useMemo(() => {
74
- if (selectedSeries === undefined) {
75
- return [];
76
- }
77
- return JSON.parse(decodeURIComponent(selectedSeries));
78
- }, [selectedSeries]);
79
73
  const lineStroke = '1px';
80
74
  const lineStrokeHover = '2px';
81
75
  const lineStrokeSelected = '3px';
@@ -218,38 +212,27 @@ const RawUtilizationMetrics = ({ data, addLabelMatcher, setTimeRange, width, hei
218
212
  }), _jsx("line", { className: "stroke-gray-300 dark:stroke-gray-500", x1: 0, x2: 0, y1: 0, y2: height - margin }), _jsx("line", { className: "stroke-gray-300 dark:stroke-gray-500", x1: xScale(to), x2: xScale(to), y1: 0, y2: height - margin }), _jsx("g", { transform: `translate(${-margin}, ${(height - margin) / 2}) rotate(270)`, children: _jsx("text", { fill: "currentColor", dy: "-0.7em", className: "text-sm capitalize", textAnchor: "middle", children: humanReadableName }) })] }), _jsxs("g", { className: "x axis", fill: "none", fontSize: "10", textAnchor: "middle", transform: `translate(0,${height - margin})`, children: [xScale.ticks(5).map((d, i) => (_jsxs(Fragment, { children: [_jsxs("g", { className: "tick",
219
213
  /* eslint-disable-next-line @typescript-eslint/restrict-template-expressions */
220
214
  transform: `translate(${xScale(d)}, 0)`, children: [_jsx("line", { y2: 6, className: "stroke-gray-300 dark:stroke-gray-500" }), _jsx("text", { fill: "currentColor", dy: ".71em", y: 9, children: formatDate(d, formatForTimespan(from, to), timezone) })] }, `tick-${i}`), _jsx("g", { children: _jsx("line", { className: "stroke-gray-300 dark:stroke-gray-500", x1: xScale(d), x2: xScale(d), y1: 0, y2: -height + margin }) }, `grid-${i}`)] }, `${i.toString()}-${d.toString()}`))), _jsx("line", { className: "stroke-gray-300 dark:stroke-gray-500", x1: 0, x2: graphWidth, y1: 0, y2: 0 }), _jsx("g", { transform: `translate(${(width - 2.5 * margin) / 2}, ${margin / 2})`, children: _jsx("text", { fill: "currentColor", dy: ".71em", y: 5, className: "text-sm", children: "Time" }) })] }), _jsx("g", { className: "lines fill-transparent", children: series.map((s, i) => {
221
- let isSelected = false;
222
- if (parsedSelectedSeries != null && parsedSelectedSeries.length > 0) {
223
- isSelected = parsedSelectedSeries.every(m => {
224
- for (let i = 0; i < s.metric.length; i++) {
225
- if (s.metric[i].name === m.key && s.metric[i].value === m.value) {
226
- return true;
227
- }
228
- }
229
- return false;
230
- });
231
- }
232
215
  const isLimit = s.metric.findIndex(m => m.name === '__type__' && m.value === 'limit') > -1;
233
216
  const strokeDasharray = isLimit ? '8 4' : '';
234
- return (_jsx("g", { className: "line cursor-pointer", children: _jsx(MetricsSeries, { data: s, line: l, color: getSeriesColor(s.metric), strokeWidth: isSelected
217
+ return (_jsx("g", { className: "line cursor-pointer", children: _jsx(MetricsSeries, { data: s, line: l, color: getSeriesColor(s.metric), strokeWidth: s.isSelected === true
235
218
  ? lineStrokeSelected
236
219
  : hovering && highlighted != null && i === highlighted.seriesIndex
237
220
  ? lineStrokeHover
238
221
  : lineStroke, strokeDasharray: strokeDasharray, xScale: xScale, yScale: yScale, onClick: () => {
239
- if (highlighted != null) {
240
- setSelectedSeries(JSON.stringify(highlighted.labels.map(l => ({
222
+ if (highlighted != null && onSelectedSeriesChange != null) {
223
+ onSelectedSeriesChange(highlighted.labels.map(l => ({
241
224
  key: l.name,
242
225
  value: l.value,
243
- }))));
226
+ })));
244
227
  // reset the selected_timeframe
245
228
  setSelectedTimeframe(undefined);
246
229
  }
247
230
  } }) }, i));
248
231
  }) })] })] }) })] }));
249
232
  };
250
- const UtilizationMetrics = ({ data, addLabelMatcher, setTimeRange, utilizationMetricsLoading, name, humanReadableName, from, to, }) => {
233
+ const UtilizationMetrics = ({ data, addLabelMatcher, setTimeRange, utilizationMetricsLoading, name, humanReadableName, from, to, onSelectedSeriesChange, }) => {
251
234
  const { isDarkMode } = useParcaContext();
252
235
  const { width, height, margin, heightStyle } = useMetricsGraphDimensions(false, true);
253
- return (_jsx(AnimatePresence, { children: _jsx(motion.div, { className: "w-full relative", initial: { display: 'none', opacity: 0 }, animate: { display: 'block', opacity: 1 }, transition: { duration: 0.5 }, children: utilizationMetricsLoading === true ? (_jsx(MetricsGraphSkeleton, { heightStyle: heightStyle, isDarkMode: isDarkMode, isMini: true })) : (_jsx(RawUtilizationMetrics, { data: data, addLabelMatcher: addLabelMatcher, setTimeRange: setTimeRange, width: width, height: height, margin: margin, name: name, humanReadableName: humanReadableName, from: from, to: to })) }, "utilization-metrics-graph-loaded") }));
236
+ return (_jsx(AnimatePresence, { children: _jsx(motion.div, { className: "w-full relative", initial: { display: 'none', opacity: 0 }, animate: { display: 'block', opacity: 1 }, transition: { duration: 0.5 }, children: utilizationMetricsLoading === true ? (_jsx(MetricsGraphSkeleton, { heightStyle: heightStyle, isDarkMode: isDarkMode, isMini: true })) : (_jsx(RawUtilizationMetrics, { data: data, addLabelMatcher: addLabelMatcher, setTimeRange: setTimeRange, width: width, height: height, margin: margin, name: name, humanReadableName: humanReadableName, from: from, to: to, onSelectedSeriesChange: onSelectedSeriesChange })) }, "utilization-metrics-graph-loaded") }));
254
237
  };
255
238
  export default UtilizationMetrics;
@@ -36,6 +36,7 @@ export interface Series {
36
36
  metric: Label[];
37
37
  values: number[][];
38
38
  labelset: string;
39
+ isSelected?: boolean;
39
40
  }
40
41
  declare const MetricsGraph: ({ data, from, to, profile, onSampleClick, addLabelMatcher, setTimeRange, sampleType, sampleUnit, width, height, margin, sumBy, }: Props) => JSX.Element;
41
42
  export default MetricsGraph;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/MetricsGraph/index.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAC,KAAK,EAAiB,aAAa,IAAI,eAAe,EAAC,MAAM,eAAe,CAAC;AACrF,OAAO,EAAC,aAAa,EAAkB,MAAM,mBAAmB,CAAC;AASjE,OAAO,EAAC,sBAAsB,EAAC,MAAM,IAAI,CAAC;AAO1C,UAAU,KAAK;IACb,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACvC,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7F,eAAe,EAAE,CACf,MAAM,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,GAAG,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,KACvE,IAAI,CAAC;IACV,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,QAAA,MAAM,YAAY,qIAcf,KAAK,KAAG,GAAG,CAAC,OA2Bd,CAAC;AAEF,eAAe,YAAY,CAAC;AAE5B,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,MAAM,GAAG,IAKnD,CAAC;AAKF,eAAO,MAAM,eAAe,qIAczB,KAAK,KAAG,GAAG,CAAC,OAmfd,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/MetricsGraph/index.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAC,KAAK,EAAiB,aAAa,IAAI,eAAe,EAAC,MAAM,eAAe,CAAC;AACrF,OAAO,EAAC,aAAa,EAAkB,MAAM,mBAAmB,CAAC;AASjE,OAAO,EAAC,sBAAsB,EAAC,MAAM,IAAI,CAAC;AAO1C,UAAU,KAAK;IACb,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACvC,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7F,eAAe,EAAE,CACf,MAAM,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,GAAG,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,KACvE,IAAI,CAAC;IACV,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,QAAA,MAAM,YAAY,qIAcf,KAAK,KAAG,GAAG,CAAC,OA2Bd,CAAC;AAEF,eAAe,YAAY,CAAC;AAE5B,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,MAAM,GAAG,IAKnD,CAAC;AAKF,eAAO,MAAM,eAAe,qIAczB,KAAK,KAAG,GAAG,CAAC,OAmfd,CAAC"}
@@ -26,7 +26,11 @@ interface MetricsGraphSectionProps {
26
26
  data: UtilizationMetricsType[];
27
27
  }>;
28
28
  utilizationMetricsLoading?: boolean;
29
+ onUtilizationSeriesSelect?: (series: Array<{
30
+ key: string;
31
+ value: string;
32
+ }>) => void;
29
33
  }
30
- export declare function MetricsGraphSection({ showMetricsGraph, setDisplayHideMetricsGraphButton, heightStyle, querySelection, profileSelection, comparing, sumBy, defaultSumByLoading, queryClient, queryExpressionString, setTimeRangeSelection, selectQuery, selectProfile, query, setNewQueryExpression, utilizationMetrics, utilizationMetricsLoading, }: MetricsGraphSectionProps): JSX.Element;
34
+ export declare function MetricsGraphSection({ showMetricsGraph, setDisplayHideMetricsGraphButton, heightStyle, querySelection, profileSelection, comparing, sumBy, defaultSumByLoading, queryClient, queryExpressionString, setTimeRangeSelection, selectQuery, selectProfile, query, setNewQueryExpression, utilizationMetrics, utilizationMetricsLoading, onUtilizationSeriesSelect, }: MetricsGraphSectionProps): JSX.Element;
31
35
  export {};
32
36
  //# sourceMappingURL=MetricsGraphSection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MetricsGraphSection.d.ts","sourceRoot":"","sources":["../../src/ProfileSelector/MetricsGraphSection.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAQ,kBAAkB,EAAC,MAAM,eAAe,CAAC;AACxD,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAC,KAAK,EAAC,MAAM,eAAe,CAAC;AAEpC,OAAO,EAAyB,gBAAgB,EAAC,MAAM,IAAI,CAAC;AAI5D,OAAO,EAAC,cAAc,EAAE,KAAK,kBAAkB,IAAI,sBAAsB,EAAC,MAAM,SAAS,CAAC;AAE1F,UAAU,wBAAwB;IAChC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gCAAgC,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,cAAc,CAAC;IAC/B,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,kBAAkB,CAAC;IAChC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,WAAW,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7C,aAAa,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,KAAK,EAAE,KAAK,CAAC;IACb,qBAAqB,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,kBAAkB,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,kBAAkB,CAAC,EAAE,KAAK,CAAC;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,iBAAiB,EAAE,MAAM,CAAC;QAC1B,IAAI,EAAE,sBAAsB,EAAE,CAAC;KAChC,CAAC,CAAC;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,wBAAgB,mBAAmB,CAAC,EAClC,gBAAgB,EAChB,gCAAgC,EAChC,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,KAAK,EACL,mBAAmB,EACnB,WAAW,EACX,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,EACX,aAAa,EACb,KAAK,EACL,qBAAqB,EACrB,kBAAkB,EAClB,yBAAyB,GAC1B,EAAE,wBAAwB,GAAG,GAAG,CAAC,OAAO,CAgMxC"}
1
+ {"version":3,"file":"MetricsGraphSection.d.ts","sourceRoot":"","sources":["../../src/ProfileSelector/MetricsGraphSection.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAQ,kBAAkB,EAAC,MAAM,eAAe,CAAC;AACxD,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAC,KAAK,EAAC,MAAM,eAAe,CAAC;AAEpC,OAAO,EAAyB,gBAAgB,EAAC,MAAM,IAAI,CAAC;AAI5D,OAAO,EAAC,cAAc,EAAE,KAAK,kBAAkB,IAAI,sBAAsB,EAAC,MAAM,SAAS,CAAC;AAE1F,UAAU,wBAAwB;IAChC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gCAAgC,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,cAAc,CAAC;IAC/B,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,kBAAkB,CAAC;IAChC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,WAAW,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7C,aAAa,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,KAAK,EAAE,KAAK,CAAC;IACb,qBAAqB,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,kBAAkB,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,kBAAkB,CAAC,EAAE,KAAK,CAAC;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,iBAAiB,EAAE,MAAM,CAAC;QAC1B,IAAI,EAAE,sBAAsB,EAAE,CAAC;KAChC,CAAC,CAAC;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,yBAAyB,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,KAAK,IAAI,CAAC;CACnF;AAED,wBAAgB,mBAAmB,CAAC,EAClC,gBAAgB,EAChB,gCAAgC,EAChC,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,KAAK,EACL,mBAAmB,EACnB,WAAW,EACX,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,EACX,aAAa,EACb,KAAK,EACL,qBAAqB,EACrB,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,GAC1B,EAAE,wBAAwB,GAAG,GAAG,CAAC,OAAO,CAmMxC"}
@@ -17,7 +17,7 @@ import { MergedProfileSelection } from '..';
17
17
  import UtilizationMetricsGraph from '../MetricsGraph/UtilizationMetrics';
18
18
  import AreaChart from '../MetricsGraph/UtilizationMetrics/Throughput';
19
19
  import ProfileMetricsGraph, { ProfileMetricsEmptyState } from '../ProfileMetricsGraph';
20
- export function MetricsGraphSection({ showMetricsGraph, setDisplayHideMetricsGraphButton, heightStyle, querySelection, profileSelection, comparing, sumBy, defaultSumByLoading, queryClient, queryExpressionString, setTimeRangeSelection, selectQuery, selectProfile, query, setNewQueryExpression, utilizationMetrics, utilizationMetricsLoading, }) {
20
+ export function MetricsGraphSection({ showMetricsGraph, setDisplayHideMetricsGraphButton, heightStyle, querySelection, profileSelection, comparing, sumBy, defaultSumByLoading, queryClient, queryExpressionString, setTimeRangeSelection, selectQuery, selectProfile, query, setNewQueryExpression, utilizationMetrics, utilizationMetricsLoading, onUtilizationSeriesSelect, }) {
21
21
  const handleTimeRangeChange = (range) => {
22
22
  const from = range.getFromMs();
23
23
  const to = range.getToMs();
@@ -85,12 +85,12 @@ export function MetricsGraphSection({ showMetricsGraph, setDisplayHideMetricsGra
85
85
  return (_jsxs("div", { children: [utilizationMetrics.map(({ name, humanReadableName, data }) => {
86
86
  if (name !== 'gpu_pcie_throughput_transmit_bytes' &&
87
87
  name !== 'gpu_pcie_throughput_receive_bytes') {
88
- return (_jsx(_Fragment, { children: _jsx(UtilizationMetricsGraph, { data: data, addLabelMatcher: addLabelMatcher, setTimeRange: handleTimeRangeChange, utilizationMetricsLoading: utilizationMetricsLoading, name: name, humanReadableName: humanReadableName, from: querySelection.from, to: querySelection.to }, name) }));
88
+ return (_jsx(_Fragment, { children: _jsx(UtilizationMetricsGraph, { data: data, addLabelMatcher: addLabelMatcher, setTimeRange: handleTimeRangeChange, utilizationMetricsLoading: utilizationMetricsLoading, name: name, humanReadableName: humanReadableName, from: querySelection.from, to: querySelection.to, onSelectedSeriesChange: onUtilizationSeriesSelect }, name) }));
89
89
  }
90
90
  return null;
91
91
  }), throughputMetrics.length > 0 && (_jsx(AreaChart, { transmitData: throughputMetrics.find(metric => metric.name === 'gpu_pcie_throughput_transmit_bytes')
92
92
  ?.data ?? [], receiveData: throughputMetrics.find(metric => metric.name === 'gpu_pcie_throughput_receive_bytes')
93
- ?.data ?? [], addLabelMatcher: addLabelMatcher, setTimeRange: handleTimeRangeChange, name: throughputMetrics[0].name, humanReadableName: throughputMetrics[0].humanReadableName, from: querySelection.from, to: querySelection.to, utilizationMetricsLoading: utilizationMetricsLoading }))] }));
93
+ ?.data ?? [], addLabelMatcher: addLabelMatcher, setTimeRange: handleTimeRangeChange, name: throughputMetrics[0].name, humanReadableName: throughputMetrics[0].humanReadableName, from: querySelection.from, to: querySelection.to, utilizationMetricsLoading: utilizationMetricsLoading, selectedSeries: undefined, onSelectedSeriesChange: onUtilizationSeriesSelect }))] }));
94
94
  };
95
95
  return (_jsxs("div", { className: cx('relative', { 'py-4': !showMetricsGraph }), children: [setDisplayHideMetricsGraphButton != null ? (_jsxs("button", { onClick: () => setDisplayHideMetricsGraphButton(!showMetricsGraph), className: cx('hidden px-3 py-1 text-sm font-medium text-gray-700 dark:text-gray-200 bg-gray-100 rounded-md hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:bg-gray-900 z-10', showMetricsGraph && 'absolute right-0 bottom-3 !flex', !showMetricsGraph && 'relative !flex ml-auto'), children: [showMetricsGraph ? 'Hide' : 'Show', " Metrics Graph"] })) : null, showMetricsGraph && (_jsx(_Fragment, { children: _jsx("div", { style: { height: heightStyle }, children: querySelection.expression !== '' &&
96
96
  querySelection.from !== undefined &&
@@ -20,6 +20,7 @@ interface ProfileSelectorFeatures {
20
20
  disableProfileTypesDropdown?: boolean;
21
21
  }
22
22
  export interface UtilizationMetrics {
23
+ isSelected: boolean;
23
24
  labelset: {
24
25
  labels: Array<{
25
26
  name: string;
@@ -56,6 +57,10 @@ interface ProfileSelectorProps extends ProfileSelectorFeatures {
56
57
  }>;
57
58
  utilizationMetricsLoading?: boolean;
58
59
  utilizationLabels?: UtilizationLabels;
60
+ onUtilizationSeriesSelect?: (series: Array<{
61
+ key: string;
62
+ value: string;
63
+ }>) => void;
59
64
  }
60
65
  export interface IProfileTypesResult {
61
66
  loading: boolean;
@@ -63,6 +68,6 @@ export interface IProfileTypesResult {
63
68
  error?: RpcError;
64
69
  }
65
70
  export declare const useProfileTypes: (client: QueryServiceClient) => IProfileTypesResult;
66
- declare const ProfileSelector: ({ queryClient, querySelection, selectProfile, selectQuery, closeProfile, enforcedProfileName, profileSelection, comparing, navigateTo, showMetricsGraph, showSumBySelector, showProfileTypeSelector, disableExplorativeQuerying, setDisplayHideMetricsGraphButton, utilizationMetrics, utilizationMetricsLoading, utilizationLabels, }: ProfileSelectorProps) => JSX.Element;
71
+ declare const ProfileSelector: ({ queryClient, querySelection, selectProfile, selectQuery, closeProfile, enforcedProfileName, profileSelection, comparing, navigateTo, showMetricsGraph, showSumBySelector, showProfileTypeSelector, disableExplorativeQuerying, setDisplayHideMetricsGraphButton, utilizationMetrics, utilizationMetricsLoading, utilizationLabels, onUtilizationSeriesSelect, }: ProfileSelectorProps) => JSX.Element;
67
72
  export default ProfileSelector;
68
73
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ProfileSelector/index.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAC,QAAQ,EAAE,cAAc,EAAuC,MAAM,OAAO,CAAC;AAErF,OAAO,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAC;AAElD,OAAO,EAAC,oBAAoB,EAAE,kBAAkB,EAAC,MAAM,eAAe,CAAC;AAUvE,OAAO,EAAC,KAAK,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAC,gBAAgB,EAAC,MAAM,IAAI,CAAC;AASpC,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,uBAAuB;IAC/B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE;QACR,MAAM,EAAE,KAAK,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;SACf,CAAC,CAAC;KACJ,CAAC;IACF,OAAO,EAAE,KAAK,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,iBAAiB;IAChC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,2BAA2B,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjE,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,UAAU,oBAAqB,SAAQ,uBAAuB;IAC5D,WAAW,EAAE,kBAAkB,CAAC;IAChC,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,WAAW,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,gCAAgC,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,KAAK,CAAC;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,iBAAiB,EAAE,MAAM,CAAC;QAC1B,IAAI,EAAE,kBAAkB,EAAE,CAAC;KAC5B,CAAC,CAAC;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC;CAClB;AAED,eAAO,MAAM,eAAe,WAAY,kBAAkB,KAAG,mBAkB5D,CAAC;AAEF,QAAA,MAAM,eAAe,2UAkBlB,oBAAoB,KAAG,GAAG,CAAC,OAkN7B,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ProfileSelector/index.tsx"],"names":[],"mappings":"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"}
@@ -39,7 +39,7 @@ export const useProfileTypes = (client) => {
39
39
  }, [client, metadata, loading]);
40
40
  return { loading, data: result, error };
41
41
  };
42
- const ProfileSelector = ({ queryClient, querySelection, selectProfile, selectQuery, closeProfile, enforcedProfileName, profileSelection, comparing, navigateTo, showMetricsGraph = true, showSumBySelector = true, showProfileTypeSelector = true, disableExplorativeQuerying = false, setDisplayHideMetricsGraphButton, utilizationMetrics, utilizationMetricsLoading, utilizationLabels, }) => {
42
+ const ProfileSelector = ({ queryClient, querySelection, selectProfile, selectQuery, closeProfile, enforcedProfileName, profileSelection, comparing, navigateTo, showMetricsGraph = true, showSumBySelector = true, showProfileTypeSelector = true, disableExplorativeQuerying = false, setDisplayHideMetricsGraphButton, utilizationMetrics, utilizationMetricsLoading, utilizationLabels, onUtilizationSeriesSelect, }) => {
43
43
  const { loading: profileTypesLoading, data: profileTypesData, error, } = useProfileTypes(queryClient);
44
44
  const { heightStyle } = useMetricsGraphDimensions(comparing, utilizationMetrics != null);
45
45
  const { viewComponent } = useParcaContext();
@@ -142,6 +142,6 @@ const ProfileSelector = ({ queryClient, querySelection, selectProfile, selectQue
142
142
  const sumByRef = useRef(null);
143
143
  return (_jsx(UtilizationLabelsProvider, { value: { ...utilizationLabels }, children: _jsxs(_Fragment, { children: [_jsxs("div", { className: "mb-2 flex", children: [_jsx(QueryControls, { showProfileTypeSelector: showProfileTypeSelector, showSumBySelector: showSumBySelector, disableExplorativeQuerying: disableExplorativeQuerying, profileTypesData: profileTypesData, profileTypesLoading: profileTypesLoading, selectedProfileName: selectedProfileName, setProfileName: setProfileName, setMatchersString: setMatchersString, setQueryExpression: setQueryExpression, query: query, queryBrowserRef: queryBrowserRef, timeRangeSelection: timeRangeSelection, setTimeRangeSelection: setTimeRangeSelection, searchDisabled: searchDisabled, queryBrowserMode: queryBrowserMode, setQueryBrowserMode: setQueryBrowserMode, advancedModeForQueryBrowser: advancedModeForQueryBrowser, setAdvancedModeForQueryBrowser: setAdvancedModeForQueryBrowser, queryClient: queryClient, sumByRef: sumByRef, labels: labels, sumBySelection: sumBySelection ?? [], sumBySelectionLoading: sumBySelectionLoading, setUserSumBySelection: setUserSumBySelection, profileType: profileType, profileTypesError: error, viewComponent: viewComponent }), comparing && (_jsx("div", { children: _jsx(IconButton, { onClick: () => closeProfile(), icon: _jsx(CloseIcon, {}) }) }))] }), _jsx(MetricsGraphSection, { showMetricsGraph: showMetricsGraph, setDisplayHideMetricsGraphButton: setDisplayHideMetricsGraphButton, heightStyle: utilizationMetrics !== undefined && utilizationMetrics?.length > 0
144
144
  ? 'auto'
145
- : heightStyle, querySelection: querySelection, profileSelection: profileSelection, comparing: comparing, sumBy: querySelection.sumBy ?? defaultSumBy ?? [], defaultSumByLoading: defaultSumByLoading, queryClient: queryClient, queryExpressionString: queryExpressionString, setTimeRangeSelection: setTimeRangeSelection, selectQuery: selectQuery, selectProfile: selectProfile, query: query, setQueryExpression: setQueryExpression, setNewQueryExpression: setNewQueryExpression, utilizationMetrics: utilizationMetrics, utilizationMetricsLoading: utilizationMetricsLoading })] }) }));
145
+ : heightStyle, querySelection: querySelection, profileSelection: profileSelection, comparing: comparing, sumBy: querySelection.sumBy ?? defaultSumBy ?? [], defaultSumByLoading: defaultSumByLoading, queryClient: queryClient, queryExpressionString: queryExpressionString, setTimeRangeSelection: setTimeRangeSelection, selectQuery: selectQuery, selectProfile: selectProfile, query: query, setQueryExpression: setQueryExpression, setNewQueryExpression: setNewQueryExpression, utilizationMetrics: utilizationMetrics, utilizationMetricsLoading: utilizationMetricsLoading, onUtilizationSeriesSelect: onUtilizationSeriesSelect })] }) }));
146
146
  };
147
147
  export default ProfileSelector;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parca/profile",
3
- "version": "0.18.0",
3
+ "version": "0.18.2",
4
4
  "description": "Profile viewing libraries",
5
5
  "dependencies": {
6
6
  "@headlessui/react": "^1.7.19",
@@ -77,5 +77,5 @@
77
77
  "access": "public",
78
78
  "registry": "https://registry.npmjs.org/"
79
79
  },
80
- "gitHead": "a31286be85fb81561b8f56a85244ad55c39fa8ef"
80
+ "gitHead": "d32c2be676d39ea179551b46c464324627be27d0"
81
81
  }
@@ -52,6 +52,8 @@ interface CommonProps {
52
52
  humanReadableName: string;
53
53
  from: number;
54
54
  to: number;
55
+ selectedSeries?: Array<{key: string; value: string}>;
56
+ onSelectedSeriesChange?: (series: Array<{key: string; value: string}>) => void;
55
57
  }
56
58
 
57
59
  type RawAreaChartProps = CommonProps & {
@@ -112,6 +114,8 @@ const RawAreaChart = ({
112
114
  humanReadableName,
113
115
  from,
114
116
  to,
117
+ selectedSeries,
118
+ onSelectedSeriesChange,
115
119
  }: RawAreaChartProps): JSX.Element => {
116
120
  const {timezone} = useParcaContext();
117
121
  const graph = useRef(null);
@@ -121,15 +125,18 @@ const RawAreaChart = ({
121
125
  const [pos, setPos] = useState([0, 0]);
122
126
  const [isContextMenuOpen, setIsContextMenuOpen] = useState<boolean>(false);
123
127
  const idForContextMenu = useId();
124
- const [selectedSeries, setSelectedSeries] = useURLState<string>('selectedSeries');
125
128
  const [_, setSelectedTimeframe] = useURLState('gpu_selected_timeframe');
126
129
 
127
130
  const parsedSelectedSeries: Matcher[] = useMemo(() => {
128
- if (selectedSeries === undefined) {
131
+ if (selectedSeries == null || selectedSeries.length === 0) {
129
132
  return [];
130
133
  }
131
134
 
132
- return JSON.parse(decodeURIComponent(selectedSeries));
135
+ return selectedSeries.map(s => ({
136
+ key: s.key,
137
+ value: s.value,
138
+ matcherType: '=' as const,
139
+ }));
133
140
  }, [selectedSeries]);
134
141
 
135
142
  const lineStroke = '1px';
@@ -513,14 +520,12 @@ const RawAreaChart = ({
513
520
  }
514
521
  strokeOpacity={isSelected ? 1 : 0.8}
515
522
  onClick={() => {
516
- if (highlighted != null) {
517
- setSelectedSeries(
518
- JSON.stringify(
519
- highlighted.labels.map(l => ({
520
- key: l.name,
521
- value: l.value,
522
- }))
523
- )
523
+ if (highlighted != null && onSelectedSeriesChange != null) {
524
+ onSelectedSeriesChange(
525
+ highlighted.labels.map(l => ({
526
+ key: l.name,
527
+ value: l.value,
528
+ }))
524
529
  );
525
530
  setSelectedTimeframe(undefined);
526
531
  }
@@ -547,6 +552,8 @@ const AreaChart = ({
547
552
  humanReadableName,
548
553
  from,
549
554
  to,
555
+ selectedSeries,
556
+ onSelectedSeriesChange,
550
557
  }: Props): JSX.Element => {
551
558
  const {isDarkMode} = useParcaContext();
552
559
  const {width, height, margin, heightStyle} = useMetricsGraphDimensions(false, true);
@@ -575,6 +582,8 @@ const AreaChart = ({
575
582
  humanReadableName={humanReadableName}
576
583
  from={from}
577
584
  to={to}
585
+ selectedSeries={selectedSeries}
586
+ onSelectedSeriesChange={onSelectedSeriesChange}
578
587
  />
579
588
  )}
580
589
  </motion.div>
@@ -20,7 +20,6 @@ import throttle from 'lodash.throttle';
20
20
  import {useContextMenu} from 'react-contexify';
21
21
 
22
22
  import {DateTimeRange, MetricsGraphSkeleton, useParcaContext, useURLState} from '@parca/components';
23
- import {Matcher} from '@parca/parser';
24
23
  import {formatDate, formatForTimespan, getPrecision, valueFormatter} from '@parca/utilities';
25
24
 
26
25
  import MetricsSeries from '../../MetricsSeries';
@@ -41,6 +40,7 @@ interface CommonProps {
41
40
  humanReadableName: string;
42
41
  from: number;
43
42
  to: number;
43
+ onSelectedSeriesChange?: (series: Array<{key: string; value: string}>) => void;
44
44
  }
45
45
 
46
46
  type RawUtilizationMetricsProps = CommonProps & {
@@ -69,6 +69,7 @@ function transformToSeries(data: MetricSeries[]): Series[] {
69
69
  const metric = s.labelset.labels.sort((a, b) => a.name.localeCompare(b.name));
70
70
  agg.push({
71
71
  metric,
72
+ isSelected: s.isSelected ?? false,
72
73
  values: s.samples.reduce<number[][]>(function (agg: number[][], d: MetricsSample) {
73
74
  if (d.timestamp !== undefined && d.value !== undefined) {
74
75
  agg.push([d.timestamp, d.value]);
@@ -112,6 +113,7 @@ const RawUtilizationMetrics = ({
112
113
  humanReadableName,
113
114
  from,
114
115
  to,
116
+ onSelectedSeriesChange,
115
117
  }: RawUtilizationMetricsProps): JSX.Element => {
116
118
  const {timezone} = useParcaContext();
117
119
  const graph = useRef(null);
@@ -121,17 +123,8 @@ const RawUtilizationMetrics = ({
121
123
  const [pos, setPos] = useState([0, 0]);
122
124
  const [isContextMenuOpen, setIsContextMenuOpen] = useState<boolean>(false);
123
125
  const idForContextMenu = useId();
124
- const [selectedSeries, setSelectedSeries] = useURLState<string>('selectedSeries');
125
126
  const [_, setSelectedTimeframe] = useURLState('gpu_selected_timeframe');
126
127
 
127
- const parsedSelectedSeries: Matcher[] = useMemo(() => {
128
- if (selectedSeries === undefined) {
129
- return [];
130
- }
131
-
132
- return JSON.parse(decodeURIComponent(selectedSeries));
133
- }, [selectedSeries]);
134
-
135
128
  const lineStroke = '1px';
136
129
  const lineStrokeHover = '2px';
137
130
  const lineStrokeSelected = '3px';
@@ -470,18 +463,6 @@ const RawUtilizationMetrics = ({
470
463
  </g>
471
464
  <g className="lines fill-transparent">
472
465
  {series.map((s, i) => {
473
- let isSelected = false;
474
- if (parsedSelectedSeries != null && parsedSelectedSeries.length > 0) {
475
- isSelected = parsedSelectedSeries.every(m => {
476
- for (let i = 0; i < s.metric.length; i++) {
477
- if (s.metric[i].name === m.key && s.metric[i].value === m.value) {
478
- return true;
479
- }
480
- }
481
- return false;
482
- });
483
- }
484
-
485
466
  const isLimit =
486
467
  s.metric.findIndex(m => m.name === '__type__' && m.value === 'limit') > -1;
487
468
  const strokeDasharray = isLimit ? '8 4' : '';
@@ -493,7 +474,7 @@ const RawUtilizationMetrics = ({
493
474
  line={l}
494
475
  color={getSeriesColor(s.metric)}
495
476
  strokeWidth={
496
- isSelected
477
+ s.isSelected === true
497
478
  ? lineStrokeSelected
498
479
  : hovering && highlighted != null && i === highlighted.seriesIndex
499
480
  ? lineStrokeHover
@@ -503,14 +484,12 @@ const RawUtilizationMetrics = ({
503
484
  xScale={xScale}
504
485
  yScale={yScale}
505
486
  onClick={() => {
506
- if (highlighted != null) {
507
- setSelectedSeries(
508
- JSON.stringify(
509
- highlighted.labels.map(l => ({
510
- key: l.name,
511
- value: l.value,
512
- }))
513
- )
487
+ if (highlighted != null && onSelectedSeriesChange != null) {
488
+ onSelectedSeriesChange(
489
+ highlighted.labels.map(l => ({
490
+ key: l.name,
491
+ value: l.value,
492
+ }))
514
493
  );
515
494
  // reset the selected_timeframe
516
495
  setSelectedTimeframe(undefined);
@@ -537,6 +516,7 @@ const UtilizationMetrics = ({
537
516
  humanReadableName,
538
517
  from,
539
518
  to,
519
+ onSelectedSeriesChange,
540
520
  }: Props): JSX.Element => {
541
521
  const {isDarkMode} = useParcaContext();
542
522
  const {width, height, margin, heightStyle} = useMetricsGraphDimensions(false, true);
@@ -564,6 +544,7 @@ const UtilizationMetrics = ({
564
544
  humanReadableName={humanReadableName}
565
545
  from={from}
566
546
  to={to}
547
+ onSelectedSeriesChange={onSelectedSeriesChange}
567
548
  />
568
549
  )}
569
550
  </motion.div>
@@ -68,6 +68,7 @@ export interface Series {
68
68
  metric: Label[];
69
69
  values: number[][];
70
70
  labelset: string;
71
+ isSelected?: boolean;
71
72
  }
72
73
 
73
74
  const MetricsGraph = ({
@@ -46,6 +46,7 @@ interface MetricsGraphSectionProps {
46
46
  data: UtilizationMetricsType[];
47
47
  }>;
48
48
  utilizationMetricsLoading?: boolean;
49
+ onUtilizationSeriesSelect?: (series: Array<{key: string; value: string}>) => void;
49
50
  }
50
51
 
51
52
  export function MetricsGraphSection({
@@ -66,6 +67,7 @@ export function MetricsGraphSection({
66
67
  setNewQueryExpression,
67
68
  utilizationMetrics,
68
69
  utilizationMetricsLoading,
70
+ onUtilizationSeriesSelect,
69
71
  }: MetricsGraphSectionProps): JSX.Element {
70
72
  const handleTimeRangeChange = (range: DateTimeRange): void => {
71
73
  const from = range.getFromMs();
@@ -176,6 +178,7 @@ export function MetricsGraphSection({
176
178
  humanReadableName={humanReadableName}
177
179
  from={querySelection.from}
178
180
  to={querySelection.to}
181
+ onSelectedSeriesChange={onUtilizationSeriesSelect}
179
182
  />
180
183
  </>
181
184
  );
@@ -199,6 +202,8 @@ export function MetricsGraphSection({
199
202
  from={querySelection.from}
200
203
  to={querySelection.to}
201
204
  utilizationMetricsLoading={utilizationMetricsLoading}
205
+ selectedSeries={undefined}
206
+ onSelectedSeriesChange={onUtilizationSeriesSelect}
202
207
  />
203
208
  )}
204
209
  </div>
@@ -55,6 +55,7 @@ interface ProfileSelectorFeatures {
55
55
  }
56
56
 
57
57
  export interface UtilizationMetrics {
58
+ isSelected: boolean;
58
59
  labelset: {
59
60
  labels: Array<{
60
61
  name: string;
@@ -93,6 +94,7 @@ interface ProfileSelectorProps extends ProfileSelectorFeatures {
93
94
  }>;
94
95
  utilizationMetricsLoading?: boolean;
95
96
  utilizationLabels?: UtilizationLabels;
97
+ onUtilizationSeriesSelect?: (series: Array<{key: string; value: string}>) => void;
96
98
  }
97
99
 
98
100
  export interface IProfileTypesResult {
@@ -139,6 +141,7 @@ const ProfileSelector = ({
139
141
  utilizationMetrics,
140
142
  utilizationMetricsLoading,
141
143
  utilizationLabels,
144
+ onUtilizationSeriesSelect,
142
145
  }: ProfileSelectorProps): JSX.Element => {
143
146
  const {
144
147
  loading: profileTypesLoading,
@@ -345,6 +348,7 @@ const ProfileSelector = ({
345
348
  setNewQueryExpression={setNewQueryExpression}
346
349
  utilizationMetrics={utilizationMetrics}
347
350
  utilizationMetricsLoading={utilizationMetricsLoading}
351
+ onUtilizationSeriesSelect={onUtilizationSeriesSelect}
348
352
  />
349
353
  </>
350
354
  </UtilizationLabelsProvider>