@perses-dev/explore 0.47.1 → 0.48.0-rc0

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.
Files changed (93) hide show
  1. package/dist/cjs/components/ExploreManager/ExplorerManagerProvider.js +9 -23
  2. package/dist/cjs/components/ExploreManager/ExplorerManagerProviderWithQueryParams.js +1 -2
  3. package/dist/cjs/components/ExploreManager/MetricsExplorer.js +59 -14
  4. package/dist/cjs/components/ExploreManager/TracesExplorer.js +4 -2
  5. package/dist/cjs/components/ExploreManager/query-params.js +49 -0
  6. package/dist/cjs/components/PrometheusMetricsFinder/PrometheusMetricsFinder.js +209 -0
  7. package/dist/cjs/components/PrometheusMetricsFinder/display/MetricChip.js +61 -0
  8. package/dist/cjs/components/PrometheusMetricsFinder/display/list/MetricList.js +156 -0
  9. package/dist/cjs/components/PrometheusMetricsFinder/filter/FilterInputs.js +232 -0
  10. package/dist/cjs/components/PrometheusMetricsFinder/filter/FinderFilters.js +139 -0
  11. package/dist/cjs/components/PrometheusMetricsFinder/index.js +30 -0
  12. package/dist/cjs/components/PrometheusMetricsFinder/overview/MetricOverview.js +235 -0
  13. package/dist/cjs/components/PrometheusMetricsFinder/overview/tabs/JobTab.js +146 -0
  14. package/dist/cjs/components/PrometheusMetricsFinder/overview/tabs/OverviewTab.js +413 -0
  15. package/dist/cjs/components/PrometheusMetricsFinder/overview/tabs/SimilarTab.js +54 -0
  16. package/dist/cjs/components/PrometheusMetricsFinder/types.js +25 -0
  17. package/dist/cjs/components/PrometheusMetricsFinder/utils.js +202 -0
  18. package/dist/cjs/components/index.js +32 -0
  19. package/dist/cjs/index.js +1 -0
  20. package/dist/components/ExploreManager/ExplorerManagerProvider.d.ts +7 -11
  21. package/dist/components/ExploreManager/ExplorerManagerProvider.d.ts.map +1 -1
  22. package/dist/components/ExploreManager/ExplorerManagerProvider.js +9 -23
  23. package/dist/components/ExploreManager/ExplorerManagerProvider.js.map +1 -1
  24. package/dist/components/ExploreManager/ExplorerManagerProviderWithQueryParams.d.ts.map +1 -1
  25. package/dist/components/ExploreManager/ExplorerManagerProviderWithQueryParams.js +2 -3
  26. package/dist/components/ExploreManager/ExplorerManagerProviderWithQueryParams.js.map +1 -1
  27. package/dist/components/ExploreManager/MetricsExplorer.d.ts.map +1 -1
  28. package/dist/components/ExploreManager/MetricsExplorer.js +59 -14
  29. package/dist/components/ExploreManager/MetricsExplorer.js.map +1 -1
  30. package/dist/components/ExploreManager/TracesExplorer.d.ts.map +1 -1
  31. package/dist/components/ExploreManager/TracesExplorer.js +4 -2
  32. package/dist/components/ExploreManager/TracesExplorer.js.map +1 -1
  33. package/dist/components/ExploreManager/query-params.d.ts +17 -0
  34. package/dist/components/ExploreManager/query-params.d.ts.map +1 -0
  35. package/dist/components/ExploreManager/query-params.js +34 -0
  36. package/dist/components/ExploreManager/query-params.js.map +1 -0
  37. package/dist/components/PrometheusMetricsFinder/PrometheusMetricsFinder.d.ts +30 -0
  38. package/dist/components/PrometheusMetricsFinder/PrometheusMetricsFinder.d.ts.map +1 -0
  39. package/dist/components/PrometheusMetricsFinder/PrometheusMetricsFinder.js +185 -0
  40. package/dist/components/PrometheusMetricsFinder/PrometheusMetricsFinder.js.map +1 -0
  41. package/dist/components/PrometheusMetricsFinder/display/MetricChip.d.ts +3 -0
  42. package/dist/components/PrometheusMetricsFinder/display/MetricChip.d.ts.map +1 -0
  43. package/dist/components/PrometheusMetricsFinder/display/MetricChip.js +53 -0
  44. package/dist/components/PrometheusMetricsFinder/display/MetricChip.js.map +1 -0
  45. package/dist/components/PrometheusMetricsFinder/display/list/MetricList.d.ts +20 -0
  46. package/dist/components/PrometheusMetricsFinder/display/list/MetricList.d.ts.map +1 -0
  47. package/dist/components/PrometheusMetricsFinder/display/list/MetricList.js +135 -0
  48. package/dist/components/PrometheusMetricsFinder/display/list/MetricList.js.map +1 -0
  49. package/dist/components/PrometheusMetricsFinder/filter/FilterInputs.d.ts +23 -0
  50. package/dist/components/PrometheusMetricsFinder/filter/FilterInputs.d.ts.map +1 -0
  51. package/dist/components/PrometheusMetricsFinder/filter/FilterInputs.js +210 -0
  52. package/dist/components/PrometheusMetricsFinder/filter/FilterInputs.js.map +1 -0
  53. package/dist/components/PrometheusMetricsFinder/filter/FinderFilters.d.ts +12 -0
  54. package/dist/components/PrometheusMetricsFinder/filter/FinderFilters.d.ts.map +1 -0
  55. package/dist/components/PrometheusMetricsFinder/filter/FinderFilters.js +85 -0
  56. package/dist/components/PrometheusMetricsFinder/filter/FinderFilters.js.map +1 -0
  57. package/dist/components/PrometheusMetricsFinder/index.d.ts +2 -0
  58. package/dist/components/PrometheusMetricsFinder/index.d.ts.map +1 -0
  59. package/dist/components/PrometheusMetricsFinder/index.js +15 -0
  60. package/dist/components/PrometheusMetricsFinder/index.js.map +1 -0
  61. package/dist/components/PrometheusMetricsFinder/overview/MetricOverview.d.ts +21 -0
  62. package/dist/components/PrometheusMetricsFinder/overview/MetricOverview.d.ts.map +1 -0
  63. package/dist/components/PrometheusMetricsFinder/overview/MetricOverview.js +214 -0
  64. package/dist/components/PrometheusMetricsFinder/overview/MetricOverview.js.map +1 -0
  65. package/dist/components/PrometheusMetricsFinder/overview/tabs/JobTab.d.ts +27 -0
  66. package/dist/components/PrometheusMetricsFinder/overview/tabs/JobTab.d.ts.map +1 -0
  67. package/dist/components/PrometheusMetricsFinder/overview/tabs/JobTab.js +127 -0
  68. package/dist/components/PrometheusMetricsFinder/overview/tabs/JobTab.js.map +1 -0
  69. package/dist/components/PrometheusMetricsFinder/overview/tabs/OverviewTab.d.ts +24 -0
  70. package/dist/components/PrometheusMetricsFinder/overview/tabs/OverviewTab.d.ts.map +1 -0
  71. package/dist/components/PrometheusMetricsFinder/overview/tabs/OverviewTab.js +389 -0
  72. package/dist/components/PrometheusMetricsFinder/overview/tabs/OverviewTab.js.map +1 -0
  73. package/dist/components/PrometheusMetricsFinder/overview/tabs/SimilarTab.d.ts +11 -0
  74. package/dist/components/PrometheusMetricsFinder/overview/tabs/SimilarTab.d.ts.map +1 -0
  75. package/dist/components/PrometheusMetricsFinder/overview/tabs/SimilarTab.js +46 -0
  76. package/dist/components/PrometheusMetricsFinder/overview/tabs/SimilarTab.js.map +1 -0
  77. package/dist/components/PrometheusMetricsFinder/types.d.ts +21 -0
  78. package/dist/components/PrometheusMetricsFinder/types.d.ts.map +1 -0
  79. package/dist/components/PrometheusMetricsFinder/types.js +17 -0
  80. package/dist/components/PrometheusMetricsFinder/types.js.map +1 -0
  81. package/dist/components/PrometheusMetricsFinder/utils.d.ts +18 -0
  82. package/dist/components/PrometheusMetricsFinder/utils.d.ts.map +1 -0
  83. package/dist/components/PrometheusMetricsFinder/utils.js +184 -0
  84. package/dist/components/PrometheusMetricsFinder/utils.js.map +1 -0
  85. package/dist/components/index.d.ts +4 -0
  86. package/dist/components/index.d.ts.map +1 -0
  87. package/dist/components/index.js +17 -0
  88. package/dist/components/index.js.map +1 -0
  89. package/dist/index.d.ts +1 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +1 -0
  92. package/dist/index.js.map +1 -1
  93. package/package.json +13 -9
@@ -0,0 +1,202 @@
1
+ // Copyright 2024 The Perses Authors
2
+ // Licensed under the Apache License, Version 2.0 (the "License");
3
+ // you may not use this file except in compliance with the License.
4
+ // You may obtain a copy of the License at
5
+ //
6
+ // http://www.apache.org/licenses/LICENSE-2.0
7
+ //
8
+ // Unless required by applicable law or agreed to in writing, software
9
+ // distributed under the License is distributed on an "AS IS" BASIS,
10
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ // See the License for the specific language governing permissions and
12
+ // limitations under the License.
13
+ "use strict";
14
+ Object.defineProperty(exports, "__esModule", {
15
+ value: true
16
+ });
17
+ function _export(target, all) {
18
+ for(var name in all)Object.defineProperty(target, name, {
19
+ enumerable: true,
20
+ get: all[name]
21
+ });
22
+ }
23
+ _export(exports, {
24
+ useLabelValues: function() {
25
+ return useLabelValues;
26
+ },
27
+ useLabels: function() {
28
+ return useLabels;
29
+ },
30
+ useMetricMetadata: function() {
31
+ return useMetricMetadata;
32
+ },
33
+ useSeriesStates: function() {
34
+ return useSeriesStates;
35
+ }
36
+ });
37
+ const _react = require("react");
38
+ const _reactquery = require("@tanstack/react-query");
39
+ const _pluginsystem = require("@perses-dev/plugin-system");
40
+ const _types = require("./types");
41
+ function useMetricMetadata(metricName, datasource, enabled) {
42
+ const { data: client } = (0, _pluginsystem.useDatasourceClient)(datasource);
43
+ // histograms and summaries timeseries desc are not always added to prefixed timeseries
44
+ const name = metricName.replace(/(_count|_sum|_bucket)$/, '');
45
+ const { data, isLoading } = (0, _reactquery.useQuery)({
46
+ enabled: !!client && enabled,
47
+ queryKey: [
48
+ 'metricMetadata',
49
+ name
50
+ ],
51
+ queryFn: async ()=>{
52
+ const params = {
53
+ metric: name
54
+ };
55
+ return await client.metricMetadata(params);
56
+ }
57
+ });
58
+ // Find the first result with help text
59
+ const metadata = (0, _react.useMemo)(()=>{
60
+ var _data_data;
61
+ var _data_data_name;
62
+ for (const metric of (_data_data_name = data === null || data === void 0 ? void 0 : (_data_data = data.data) === null || _data_data === void 0 ? void 0 : _data_data[name]) !== null && _data_data_name !== void 0 ? _data_data_name : []){
63
+ if (metric.help.length > 0) {
64
+ return metric;
65
+ }
66
+ }
67
+ return undefined;
68
+ }, [
69
+ data,
70
+ name
71
+ ]);
72
+ return {
73
+ metadata,
74
+ isLoading
75
+ };
76
+ }
77
+ function useLabels(filters, datasource) {
78
+ const { absoluteTimeRange: { start, end } } = (0, _pluginsystem.useTimeRange)();
79
+ const { data: client } = (0, _pluginsystem.useDatasourceClient)(datasource);
80
+ return (0, _reactquery.useQuery)({
81
+ enabled: !!client,
82
+ queryKey: [
83
+ 'labels',
84
+ 'datasource',
85
+ datasource.name,
86
+ 'start',
87
+ start,
88
+ 'end',
89
+ end,
90
+ 'filters',
91
+ ...filters
92
+ ],
93
+ queryFn: async ()=>{
94
+ const params = {
95
+ start: start.valueOf() / 1000,
96
+ end: end.valueOf() / 1000
97
+ };
98
+ if (filters.length) {
99
+ params['match[]'] = [
100
+ `{${(0, _types.computeFilterExpr)(filters)}}`
101
+ ];
102
+ }
103
+ return await client.labelNames(params);
104
+ }
105
+ });
106
+ }
107
+ function useLabelValues(labelName, filters, datasource) {
108
+ const { absoluteTimeRange: { start, end } } = (0, _pluginsystem.useTimeRange)();
109
+ const { data: client } = (0, _pluginsystem.useDatasourceClient)(datasource);
110
+ return (0, _reactquery.useQuery)({
111
+ enabled: !!client,
112
+ queryKey: [
113
+ 'labelValues',
114
+ labelName,
115
+ 'datasource',
116
+ datasource.name,
117
+ 'start',
118
+ start,
119
+ 'end',
120
+ 'filters',
121
+ ...filters
122
+ ],
123
+ queryFn: async ()=>{
124
+ const params = {
125
+ labelName: labelName,
126
+ start: start.valueOf() / 1000,
127
+ end: end.valueOf() / 1000
128
+ };
129
+ if (filters.length) {
130
+ params['match[]'] = [
131
+ `{${(0, _types.computeFilterExpr)(filters)}}`
132
+ ];
133
+ }
134
+ return await client.labelValues(params);
135
+ }
136
+ });
137
+ }
138
+ function useSeriesStates(metricName, filters, datasource) {
139
+ const { absoluteTimeRange: { start, end } } = (0, _pluginsystem.useTimeRange)();
140
+ const { data: client } = (0, _pluginsystem.useDatasourceClient)(datasource);
141
+ const { data: seriesData, isLoading } = (0, _reactquery.useQuery)({
142
+ enabled: !!client,
143
+ queryKey: [
144
+ 'series',
145
+ metricName,
146
+ 'datasource',
147
+ datasource,
148
+ 'start',
149
+ start,
150
+ 'end',
151
+ 'filters',
152
+ ...filters
153
+ ],
154
+ queryFn: async ()=>{
155
+ const params = {
156
+ 'match[]': [
157
+ `{${(0, _types.computeFilterExpr)(filters)}}`
158
+ ],
159
+ start: start.valueOf() / 1000,
160
+ end: end.valueOf() / 1000
161
+ };
162
+ return await client.series(params);
163
+ }
164
+ });
165
+ const labelValueCounters = (0, _react.useMemo)(()=>{
166
+ const result = new Map();
167
+ if ((seriesData === null || seriesData === void 0 ? void 0 : seriesData.data) === undefined) {
168
+ return result;
169
+ }
170
+ for (const series of seriesData.data){
171
+ for (const [label, value] of Object.entries(series)){
172
+ const labelCounters = result.get(label);
173
+ if (labelCounters === undefined) {
174
+ result.set(label, [
175
+ {
176
+ labelValue: value,
177
+ counter: 1
178
+ }
179
+ ]);
180
+ continue;
181
+ }
182
+ const labelValueCounter = labelCounters.find((counter)=>counter.labelValue === value);
183
+ if (labelValueCounter === undefined) {
184
+ labelCounters.push({
185
+ labelValue: value,
186
+ counter: 1
187
+ });
188
+ } else {
189
+ labelValueCounter.counter += 1;
190
+ }
191
+ }
192
+ }
193
+ return result;
194
+ }, [
195
+ seriesData
196
+ ]);
197
+ return {
198
+ series: seriesData === null || seriesData === void 0 ? void 0 : seriesData.data,
199
+ labelValueCounters,
200
+ isLoading
201
+ };
202
+ }
@@ -0,0 +1,32 @@
1
+ // Copyright 2024 The Perses Authors
2
+ // Licensed under the Apache License, Version 2.0 (the "License");
3
+ // you may not use this file except in compliance with the License.
4
+ // You may obtain a copy of the License at
5
+ //
6
+ // http://www.apache.org/licenses/LICENSE-2.0
7
+ //
8
+ // Unless required by applicable law or agreed to in writing, software
9
+ // distributed under the License is distributed on an "AS IS" BASIS,
10
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ // See the License for the specific language governing permissions and
12
+ // limitations under the License.
13
+ "use strict";
14
+ Object.defineProperty(exports, "__esModule", {
15
+ value: true
16
+ });
17
+ _export_star(require("./ExploreManager"), exports);
18
+ _export_star(require("./ExploreToolbar"), exports);
19
+ _export_star(require("./PrometheusMetricsFinder"), exports);
20
+ function _export_star(from, to) {
21
+ Object.keys(from).forEach(function(k) {
22
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
23
+ Object.defineProperty(to, k, {
24
+ enumerable: true,
25
+ get: function() {
26
+ return from[k];
27
+ }
28
+ });
29
+ }
30
+ });
31
+ return from;
32
+ }
package/dist/cjs/index.js CHANGED
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "__esModule", {
15
15
  value: true
16
16
  });
17
17
  _export_star(require("./views"), exports);
18
+ _export_star(require("./components"), exports);
18
19
  function _export_star(from, to) {
19
20
  Object.keys(from).forEach(function(k) {
20
21
  if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
@@ -1,24 +1,20 @@
1
1
  import { ReactNode } from 'react';
2
- import { QueryDefinition } from '@perses-dev/core';
3
- interface ExplorerState {
2
+ interface ExplorerState<T> {
4
3
  explorer: string;
5
- tab: number;
6
- queries: QueryDefinition[];
4
+ data: T;
7
5
  }
8
- interface ExplorerManagerContextType {
6
+ interface ExplorerManagerContextType<T> {
9
7
  /** observability signal, for example metrics or traces */
10
8
  explorer: string;
11
- tab: number;
12
- queries: QueryDefinition[];
9
+ data: T;
13
10
  setExplorer: (explorer: string) => void;
14
- setTab: (tab: number) => void;
15
- setQueries: (queries: QueryDefinition[]) => void;
11
+ setData: (data: T) => void;
16
12
  }
17
13
  interface ExplorerManagerProviderProps {
18
14
  children: ReactNode;
19
- store?: [ExplorerState, (state: ExplorerState) => void];
15
+ store?: [ExplorerState<unknown>, (state: ExplorerState<unknown>) => void];
20
16
  }
21
17
  export declare function ExplorerManagerProvider({ children, store: externalStore }: ExplorerManagerProviderProps): import("react/jsx-runtime").JSX.Element;
22
- export declare function useExplorerManagerContext(): ExplorerManagerContextType;
18
+ export declare function useExplorerManagerContext<T>(): ExplorerManagerContextType<T>;
23
19
  export {};
24
20
  //# sourceMappingURL=ExplorerManagerProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExplorerManagerProvider.d.ts","sourceRoot":"","sources":["../../../src/components/ExploreManager/ExplorerManagerProvider.tsx"],"names":[],"mappings":"AAaA,OAAc,EAAiB,SAAS,EAAwB,MAAM,OAAO,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,UAAU,0BAA0B;IAClC,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,UAAU,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;CAClD;AAID,UAAU,4BAA4B;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC,CAAC;CACzD;AAED,wBAAgB,uBAAuB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,4BAA4B,2CAgCvG;AAED,wBAAgB,yBAAyB,IAAI,0BAA0B,CAMtE"}
1
+ {"version":3,"file":"ExplorerManagerProvider.d.ts","sourceRoot":"","sources":["../../../src/components/ExploreManager/ExplorerManagerProvider.tsx"],"names":[],"mappings":"AAaA,OAAc,EAAiB,SAAS,EAAwB,MAAM,OAAO,CAAC;AAE9E,UAAU,aAAa,CAAC,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,CAAC,CAAC;CAGT;AAED,UAAU,0BAA0B,CAAC,CAAC;IACpC,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,CAAC,CAAC;IACR,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;CAC5B;AAID,UAAU,4BAA4B;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;CAC3E;AAED,wBAAgB,uBAAuB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,4BAA4B,2CA8BvG;AAED,wBAAgB,yBAAyB,CAAC,CAAC,KAAK,0BAA0B,CAAC,CAAC,CAAC,CAM5E"}
@@ -19,53 +19,39 @@ export function ExplorerManagerProvider({ children, store: externalStore }) {
19
19
  // local store in case external store is not provided by prop
20
20
  const localStore = useState({
21
21
  explorer: 'metrics',
22
- tab: 0,
23
- queries: []
22
+ data: {}
24
23
  });
25
24
  // use store provided by 'store' prop if available, otherwise use local store
26
25
  const [explorerState, setExplorerState] = externalStore ? externalStore : localStore;
27
- const { explorer, tab, queries } = explorerState;
26
+ const { explorer, data } = explorerState;
28
27
  function setExplorer(newExplorer) {
29
28
  // store current explorer state
30
29
  explorerStateCache[explorer] = {
31
- tab,
32
- queries
30
+ data
33
31
  };
34
32
  setExplorerStateCache(explorerStateCache);
35
33
  var _explorerStateCache_newExplorer;
36
34
  // restore previous explorer state (if any)
37
35
  const state = (_explorerStateCache_newExplorer = explorerStateCache[newExplorer]) !== null && _explorerStateCache_newExplorer !== void 0 ? _explorerStateCache_newExplorer : {
38
- tab: 0,
39
- queries: []
36
+ data: {}
40
37
  };
41
38
  setExplorerState({
42
39
  explorer: newExplorer,
43
- tab: state.tab,
44
- queries: state.queries
40
+ data: state.data
45
41
  });
46
42
  }
47
- function setTab(newTab) {
43
+ function setData(newData) {
48
44
  setExplorerState({
49
45
  explorer,
50
- tab: newTab,
51
- queries
52
- });
53
- }
54
- function setQueries(newQueries) {
55
- setExplorerState({
56
- explorer,
57
- tab,
58
- queries: newQueries
46
+ data: newData
59
47
  });
60
48
  }
61
49
  return /*#__PURE__*/ _jsx(ExplorerManagerContext.Provider, {
62
50
  value: {
63
51
  explorer,
64
- tab,
65
- queries,
52
+ data,
66
53
  setExplorer,
67
- setTab,
68
- setQueries
54
+ setData
69
55
  },
70
56
  children: children
71
57
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ExploreManager/ExplorerManagerProvider.tsx"],"sourcesContent":["// Copyright 2024 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, { createContext, ReactNode, useContext, useState } from 'react';\nimport { QueryDefinition } from '@perses-dev/core';\n\ninterface ExplorerState {\n explorer: string;\n tab: number;\n queries: QueryDefinition[];\n}\n\ninterface ExplorerManagerContextType {\n /** observability signal, for example metrics or traces */\n explorer: string;\n tab: number;\n queries: QueryDefinition[];\n setExplorer: (explorer: string) => void;\n setTab: (tab: number) => void;\n setQueries: (queries: QueryDefinition[]) => void;\n}\n\nconst ExplorerManagerContext = createContext<ExplorerManagerContextType | undefined>(undefined);\n\ninterface ExplorerManagerProviderProps {\n children: ReactNode;\n store?: [ExplorerState, (state: ExplorerState) => void];\n}\n\nexport function ExplorerManagerProvider({ children, store: externalStore }: ExplorerManagerProviderProps) {\n // cache the state of currently not rendered explore UIs\n const [explorerStateCache, setExplorerStateCache] = useState<Record<string, Omit<ExplorerState, 'explorer'>>>({});\n // local store in case external store is not provided by prop\n const localStore = useState<ExplorerState>({ explorer: 'metrics', tab: 0, queries: [] });\n // use store provided by 'store' prop if available, otherwise use local store\n const [explorerState, setExplorerState] = externalStore ? externalStore : localStore;\n const { explorer, tab, queries } = explorerState;\n\n function setExplorer(newExplorer: string) {\n // store current explorer state\n explorerStateCache[explorer] = { tab, queries };\n setExplorerStateCache(explorerStateCache);\n\n // restore previous explorer state (if any)\n const state = explorerStateCache[newExplorer] ?? { tab: 0, queries: [] };\n setExplorerState({ explorer: newExplorer, tab: state.tab, queries: state.queries });\n }\n\n function setTab(newTab: number) {\n setExplorerState({ explorer, tab: newTab, queries });\n }\n\n function setQueries(newQueries: QueryDefinition[]) {\n setExplorerState({ explorer, tab, queries: newQueries });\n }\n\n return (\n <ExplorerManagerContext.Provider value={{ explorer, tab, queries, setExplorer, setTab, setQueries }}>\n {children}\n </ExplorerManagerContext.Provider>\n );\n}\n\nexport function useExplorerManagerContext(): ExplorerManagerContextType {\n const ctx = useContext(ExplorerManagerContext);\n if (ctx === undefined) {\n throw new Error('No ExplorerManagerContext found. Did you forget a Provider?');\n }\n return ctx;\n}\n"],"names":["React","createContext","useContext","useState","ExplorerManagerContext","undefined","ExplorerManagerProvider","children","store","externalStore","explorerStateCache","setExplorerStateCache","localStore","explorer","tab","queries","explorerState","setExplorerState","setExplorer","newExplorer","state","setTab","newTab","setQueries","newQueries","Provider","value","useExplorerManagerContext","ctx","Error"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAEjC,OAAOA,SAASC,aAAa,EAAaC,UAAU,EAAEC,QAAQ,QAAQ,QAAQ;AAmB9E,MAAMC,uCAAyBH,cAAsDI;AAOrF,OAAO,SAASC,wBAAwB,EAAEC,QAAQ,EAAEC,OAAOC,aAAa,EAAgC;IACtG,wDAAwD;IACxD,MAAM,CAACC,oBAAoBC,sBAAsB,GAAGR,SAA0D,CAAC;IAC/G,6DAA6D;IAC7D,MAAMS,aAAaT,SAAwB;QAAEU,UAAU;QAAWC,KAAK;QAAGC,SAAS,EAAE;IAAC;IACtF,6EAA6E;IAC7E,MAAM,CAACC,eAAeC,iBAAiB,GAAGR,gBAAgBA,gBAAgBG;IAC1E,MAAM,EAAEC,QAAQ,EAAEC,GAAG,EAAEC,OAAO,EAAE,GAAGC;IAEnC,SAASE,YAAYC,WAAmB;QACtC,+BAA+B;QAC/BT,kBAAkB,CAACG,SAAS,GAAG;YAAEC;YAAKC;QAAQ;QAC9CJ,sBAAsBD;YAGRA;QADd,2CAA2C;QAC3C,MAAMU,QAAQV,CAAAA,kCAAAA,kBAAkB,CAACS,YAAY,cAA/BT,6CAAAA,kCAAmC;YAAEI,KAAK;YAAGC,SAAS,EAAE;QAAC;QACvEE,iBAAiB;YAAEJ,UAAUM;YAAaL,KAAKM,MAAMN,GAAG;YAAEC,SAASK,MAAML,OAAO;QAAC;IACnF;IAEA,SAASM,OAAOC,MAAc;QAC5BL,iBAAiB;YAAEJ;YAAUC,KAAKQ;YAAQP;QAAQ;IACpD;IAEA,SAASQ,WAAWC,UAA6B;QAC/CP,iBAAiB;YAAEJ;YAAUC;YAAKC,SAASS;QAAW;IACxD;IAEA,qBACE,KAACpB,uBAAuBqB,QAAQ;QAACC,OAAO;YAAEb;YAAUC;YAAKC;YAASG;YAAaG;YAAQE;QAAW;kBAC/FhB;;AAGP;AAEA,OAAO,SAASoB;IACd,MAAMC,MAAM1B,WAAWE;IACvB,IAAIwB,QAAQvB,WAAW;QACrB,MAAM,IAAIwB,MAAM;IAClB;IACA,OAAOD;AACT"}
1
+ {"version":3,"sources":["../../../src/components/ExploreManager/ExplorerManagerProvider.tsx"],"sourcesContent":["// Copyright 2024 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, { createContext, ReactNode, useContext, useState } from 'react';\n\ninterface ExplorerState<T> {\n explorer: string;\n data: T;\n // tab: number;\n // queries: QueryDefinition[];\n}\n\ninterface ExplorerManagerContextType<T> {\n /** observability signal, for example metrics or traces */\n explorer: string;\n data: T;\n setExplorer: (explorer: string) => void;\n setData: (data: T) => void;\n}\n\nconst ExplorerManagerContext = createContext<ExplorerManagerContextType<unknown> | undefined>(undefined);\n\ninterface ExplorerManagerProviderProps {\n children: ReactNode;\n store?: [ExplorerState<unknown>, (state: ExplorerState<unknown>) => void];\n}\n\nexport function ExplorerManagerProvider({ children, store: externalStore }: ExplorerManagerProviderProps) {\n // cache the state of currently not rendered explore UIs\n const [explorerStateCache, setExplorerStateCache] = useState<\n Record<string, Omit<ExplorerState<unknown>, 'explorer'>>\n >({});\n // local store in case external store is not provided by prop\n const localStore = useState<ExplorerState<unknown>>({ explorer: 'metrics', data: {} });\n // use store provided by 'store' prop if available, otherwise use local store\n const [explorerState, setExplorerState] = externalStore ? externalStore : localStore;\n const { explorer, data } = explorerState;\n\n function setExplorer(newExplorer: string) {\n // store current explorer state\n explorerStateCache[explorer] = { data };\n setExplorerStateCache(explorerStateCache);\n\n // restore previous explorer state (if any)\n const state = explorerStateCache[newExplorer] ?? { data: {} };\n setExplorerState({ explorer: newExplorer, data: state.data });\n }\n\n function setData(newData: unknown) {\n setExplorerState({ explorer, data: newData });\n }\n\n return (\n <ExplorerManagerContext.Provider value={{ explorer, data, setExplorer, setData }}>\n {children}\n </ExplorerManagerContext.Provider>\n );\n}\n\nexport function useExplorerManagerContext<T>(): ExplorerManagerContextType<T> {\n const ctx = useContext(ExplorerManagerContext);\n if (ctx === undefined) {\n throw new Error('No ExplorerManagerContext found. Did you forget a Provider?');\n }\n return ctx as ExplorerManagerContextType<T>;\n}\n"],"names":["React","createContext","useContext","useState","ExplorerManagerContext","undefined","ExplorerManagerProvider","children","store","externalStore","explorerStateCache","setExplorerStateCache","localStore","explorer","data","explorerState","setExplorerState","setExplorer","newExplorer","state","setData","newData","Provider","value","useExplorerManagerContext","ctx","Error"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAEjC,OAAOA,SAASC,aAAa,EAAaC,UAAU,EAAEC,QAAQ,QAAQ,QAAQ;AAiB9E,MAAMC,uCAAyBH,cAA+DI;AAO9F,OAAO,SAASC,wBAAwB,EAAEC,QAAQ,EAAEC,OAAOC,aAAa,EAAgC;IACtG,wDAAwD;IACxD,MAAM,CAACC,oBAAoBC,sBAAsB,GAAGR,SAElD,CAAC;IACH,6DAA6D;IAC7D,MAAMS,aAAaT,SAAiC;QAAEU,UAAU;QAAWC,MAAM,CAAC;IAAE;IACpF,6EAA6E;IAC7E,MAAM,CAACC,eAAeC,iBAAiB,GAAGP,gBAAgBA,gBAAgBG;IAC1E,MAAM,EAAEC,QAAQ,EAAEC,IAAI,EAAE,GAAGC;IAE3B,SAASE,YAAYC,WAAmB;QACtC,+BAA+B;QAC/BR,kBAAkB,CAACG,SAAS,GAAG;YAAEC;QAAK;QACtCH,sBAAsBD;YAGRA;QADd,2CAA2C;QAC3C,MAAMS,QAAQT,CAAAA,kCAAAA,kBAAkB,CAACQ,YAAY,cAA/BR,6CAAAA,kCAAmC;YAAEI,MAAM,CAAC;QAAE;QAC5DE,iBAAiB;YAAEH,UAAUK;YAAaJ,MAAMK,MAAML,IAAI;QAAC;IAC7D;IAEA,SAASM,QAAQC,OAAgB;QAC/BL,iBAAiB;YAAEH;YAAUC,MAAMO;QAAQ;IAC7C;IAEA,qBACE,KAACjB,uBAAuBkB,QAAQ;QAACC,OAAO;YAAEV;YAAUC;YAAMG;YAAaG;QAAQ;kBAC5Eb;;AAGP;AAEA,OAAO,SAASiB;IACd,MAAMC,MAAMvB,WAAWE;IACvB,IAAIqB,QAAQpB,WAAW;QACrB,MAAM,IAAIqB,MAAM;IAClB;IACA,OAAOD;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExplorerManagerProviderWithQueryParams.d.ts","sourceRoot":"","sources":["../../../src/components/ExploreManager/ExplorerManagerProviderWithQueryParams.tsx"],"names":[],"mappings":"AAaA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAWzC,UAAU,2CAA2C;IACnD,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,sCAAsC,CAAC,EAAE,QAAQ,EAAE,EAAE,2CAA2C,2CAI/G"}
1
+ {"version":3,"file":"ExplorerManagerProviderWithQueryParams.d.ts","sourceRoot":"","sources":["../../../src/components/ExploreManager/ExplorerManagerProviderWithQueryParams.tsx"],"names":[],"mappings":"AAaA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUzC,UAAU,2CAA2C;IACnD,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,sCAAsC,CAAC,EAAE,QAAQ,EAAE,EAAE,2CAA2C,2CAI/G"}
@@ -12,15 +12,14 @@
12
12
  // limitations under the License.
13
13
  import { jsx as _jsx } from "react/jsx-runtime";
14
14
  import React from 'react';
15
- import { createEnumParam, JsonParam, NumberParam, useQueryParams, withDefault } from 'use-query-params';
15
+ import { createEnumParam, JsonParam, useQueryParams, withDefault } from 'use-query-params';
16
16
  import { ExplorerManagerProvider } from './ExplorerManagerProvider';
17
17
  const exploreQueryConfig = {
18
18
  explorer: withDefault(createEnumParam([
19
19
  'metrics',
20
20
  'traces'
21
21
  ]), 'metrics'),
22
- tab: withDefault(NumberParam, 0),
23
- queries: withDefault(JsonParam, [])
22
+ data: withDefault(JsonParam, {})
24
23
  };
25
24
  export function ExplorerManagerProviderWithQueryParams({ children }) {
26
25
  const [queryParams, setQueryParams] = useQueryParams(exploreQueryConfig);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ExploreManager/ExplorerManagerProviderWithQueryParams.tsx"],"sourcesContent":["// Copyright 2024 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, { ReactNode } from 'react';\n\nimport { createEnumParam, JsonParam, NumberParam, useQueryParams, withDefault } from 'use-query-params';\nimport { ExplorerManagerProvider } from './ExplorerManagerProvider';\n\nconst exploreQueryConfig = {\n explorer: withDefault(createEnumParam(['metrics', 'traces']), 'metrics'),\n tab: withDefault(NumberParam, 0),\n queries: withDefault(JsonParam, []),\n};\n\ninterface ExplorerManagerProviderWithQueryParamsProps {\n children: ReactNode;\n}\n\nexport function ExplorerManagerProviderWithQueryParams({ children }: ExplorerManagerProviderWithQueryParamsProps) {\n const [queryParams, setQueryParams] = useQueryParams(exploreQueryConfig);\n\n return <ExplorerManagerProvider store={[queryParams, setQueryParams]}>{children}</ExplorerManagerProvider>;\n}\n"],"names":["React","createEnumParam","JsonParam","NumberParam","useQueryParams","withDefault","ExplorerManagerProvider","exploreQueryConfig","explorer","tab","queries","ExplorerManagerProviderWithQueryParams","children","queryParams","setQueryParams","store"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAEjC,OAAOA,WAA0B,QAAQ;AAEzC,SAASC,eAAe,EAAEC,SAAS,EAAEC,WAAW,EAAEC,cAAc,EAAEC,WAAW,QAAQ,mBAAmB;AACxG,SAASC,uBAAuB,QAAQ,4BAA4B;AAEpE,MAAMC,qBAAqB;IACzBC,UAAUH,YAAYJ,gBAAgB;QAAC;QAAW;KAAS,GAAG;IAC9DQ,KAAKJ,YAAYF,aAAa;IAC9BO,SAASL,YAAYH,WAAW,EAAE;AACpC;AAMA,OAAO,SAASS,uCAAuC,EAAEC,QAAQ,EAA+C;IAC9G,MAAM,CAACC,aAAaC,eAAe,GAAGV,eAAeG;IAErD,qBAAO,KAACD;QAAwBS,OAAO;YAACF;YAAaC;SAAe;kBAAGF;;AACzE"}
1
+ {"version":3,"sources":["../../../src/components/ExploreManager/ExplorerManagerProviderWithQueryParams.tsx"],"sourcesContent":["// Copyright 2024 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, { ReactNode } from 'react';\n\nimport { createEnumParam, JsonParam, useQueryParams, withDefault } from 'use-query-params';\nimport { ExplorerManagerProvider } from './ExplorerManagerProvider';\n\nconst exploreQueryConfig = {\n explorer: withDefault(createEnumParam(['metrics', 'traces']), 'metrics'),\n data: withDefault(JsonParam, {}),\n};\n\ninterface ExplorerManagerProviderWithQueryParamsProps {\n children: ReactNode;\n}\n\nexport function ExplorerManagerProviderWithQueryParams({ children }: ExplorerManagerProviderWithQueryParamsProps) {\n const [queryParams, setQueryParams] = useQueryParams(exploreQueryConfig);\n\n return <ExplorerManagerProvider store={[queryParams, setQueryParams]}>{children}</ExplorerManagerProvider>;\n}\n"],"names":["React","createEnumParam","JsonParam","useQueryParams","withDefault","ExplorerManagerProvider","exploreQueryConfig","explorer","data","ExplorerManagerProviderWithQueryParams","children","queryParams","setQueryParams","store"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAEjC,OAAOA,WAA0B,QAAQ;AAEzC,SAASC,eAAe,EAAEC,SAAS,EAAEC,cAAc,EAAEC,WAAW,QAAQ,mBAAmB;AAC3F,SAASC,uBAAuB,QAAQ,4BAA4B;AAEpE,MAAMC,qBAAqB;IACzBC,UAAUH,YAAYH,gBAAgB;QAAC;QAAW;KAAS,GAAG;IAC9DO,MAAMJ,YAAYF,WAAW,CAAC;AAChC;AAMA,OAAO,SAASO,uCAAuC,EAAEC,QAAQ,EAA+C;IAC9G,MAAM,CAACC,aAAaC,eAAe,GAAGT,eAAeG;IAErD,qBAAO,KAACD;QAAwBQ,OAAO;YAACF;YAAaC;SAAe;kBAAGF;;AACzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"MetricsExplorer.d.ts","sourceRoot":"","sources":["../../../src/components/ExploreManager/MetricsExplorer.tsx"],"names":[],"mappings":"AAkFA,wBAAgB,eAAe,4CAsB9B"}
1
+ {"version":3,"file":"MetricsExplorer.d.ts","sourceRoot":"","sources":["../../../src/components/ExploreManager/MetricsExplorer.tsx"],"names":[],"mappings":"AA0FA,wBAAgB,eAAe,4CAkD9B"}
@@ -15,6 +15,8 @@ import { Box, Stack, Tab, Tabs } from '@mui/material';
15
15
  import { DataQueriesProvider, MultiQueryEditor, useSuggestedStepMs } from '@perses-dev/plugin-system';
16
16
  import useResizeObserver from 'use-resize-observer';
17
17
  import { Panel } from '@perses-dev/dashboards';
18
+ import { DEFAULT_PROM } from '@perses-dev/prometheus-plugin';
19
+ import { PrometheusMetricsFinder } from '../PrometheusMetricsFinder';
18
20
  import { PANEL_PREVIEW_HEIGHT } from './constants';
19
21
  import { useExplorerManagerContext } from './ExplorerManagerProvider';
20
22
  function TimeSeriesPanel({ queries }) {
@@ -61,7 +63,7 @@ function TimeSeriesPanel({ queries }) {
61
63
  function MetricDataTable({ queries }) {
62
64
  const height = PANEL_PREVIEW_HEIGHT;
63
65
  // map TimeSeriesQueryDefinition to Definition<UnknownSpec>
64
- const definitions = (queries !== null && queries !== void 0 ? queries : []).map((query)=>{
66
+ const definitions = queries.map((query)=>{
65
67
  return {
66
68
  kind: query.spec.plugin.kind,
67
69
  spec: query.spec.plugin.spec
@@ -96,23 +98,19 @@ function MetricDataTable({ queries }) {
96
98
  });
97
99
  }
98
100
  export function MetricsExplorer() {
99
- const { tab, queries, setTab, setQueries } = useExplorerManagerContext();
101
+ const { data: { tab = 'table', queries = [], datasource = DEFAULT_PROM, filters = [], exploredMetric = undefined }, setData } = useExplorerManagerContext();
100
102
  return /*#__PURE__*/ _jsxs(Stack, {
101
103
  gap: 2,
102
104
  sx: {
103
105
  width: '100%'
104
106
  },
105
107
  children: [
106
- /*#__PURE__*/ _jsx(MultiQueryEditor, {
107
- queryTypes: [
108
- 'TimeSeriesQuery'
109
- ],
110
- onChange: setQueries,
111
- queries: queries
112
- }),
113
108
  /*#__PURE__*/ _jsxs(Tabs, {
114
109
  value: tab,
115
- onChange: (_, state)=>setTab(state),
110
+ onChange: (_, state)=>setData({
111
+ tab: state,
112
+ queries
113
+ }),
116
114
  variant: "scrollable",
117
115
  sx: {
118
116
  borderBottom: 1,
@@ -120,21 +118,68 @@ export function MetricsExplorer() {
120
118
  },
121
119
  children: [
122
120
  /*#__PURE__*/ _jsx(Tab, {
121
+ value: "table",
123
122
  label: "Table"
124
123
  }),
125
124
  /*#__PURE__*/ _jsx(Tab, {
125
+ value: "graph",
126
126
  label: "Graph"
127
+ }),
128
+ /*#__PURE__*/ _jsx(Tab, {
129
+ value: "finder",
130
+ label: "Finder"
127
131
  })
128
132
  ]
129
133
  }),
130
134
  /*#__PURE__*/ _jsxs(Stack, {
131
135
  gap: 1,
132
136
  children: [
133
- tab === 0 && /*#__PURE__*/ _jsx(MetricDataTable, {
134
- queries: queries
137
+ tab === 'table' && /*#__PURE__*/ _jsxs(Stack, {
138
+ children: [
139
+ /*#__PURE__*/ _jsx(MultiQueryEditor, {
140
+ queryTypes: [
141
+ 'TimeSeriesQuery'
142
+ ],
143
+ onChange: (state)=>setData({
144
+ tab,
145
+ queries: state
146
+ }),
147
+ queries: queries
148
+ }),
149
+ /*#__PURE__*/ _jsx(MetricDataTable, {
150
+ queries: queries
151
+ })
152
+ ]
153
+ }),
154
+ tab === 'graph' && /*#__PURE__*/ _jsxs(Stack, {
155
+ children: [
156
+ /*#__PURE__*/ _jsx(MultiQueryEditor, {
157
+ queryTypes: [
158
+ 'TimeSeriesQuery'
159
+ ],
160
+ onChange: (state)=>setData({
161
+ tab,
162
+ queries: state
163
+ }),
164
+ queries: queries
165
+ }),
166
+ /*#__PURE__*/ _jsx(TimeSeriesPanel, {
167
+ queries: queries
168
+ })
169
+ ]
135
170
  }),
136
- tab === 1 && /*#__PURE__*/ _jsx(TimeSeriesPanel, {
137
- queries: queries
171
+ tab === 'finder' && /*#__PURE__*/ _jsx(Stack, {
172
+ children: /*#__PURE__*/ _jsx(PrometheusMetricsFinder, {
173
+ onChange: (state)=>setData({
174
+ tab,
175
+ ...state
176
+ }),
177
+ value: {
178
+ datasource,
179
+ filters,
180
+ exploredMetric
181
+ }
182
+ })
138
183
  })
139
184
  ]
140
185
  })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ExploreManager/MetricsExplorer.tsx"],"sourcesContent":["// Copyright 2024 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { QueryDefinition } from '@perses-dev/core';\nimport { Box, Stack, Tab, Tabs } from '@mui/material';\nimport { DataQueriesProvider, MultiQueryEditor, useSuggestedStepMs } from '@perses-dev/plugin-system';\nimport useResizeObserver from 'use-resize-observer';\nimport { Panel } from '@perses-dev/dashboards';\nimport { PANEL_PREVIEW_HEIGHT } from './constants';\nimport { useExplorerManagerContext } from './ExplorerManagerProvider';\n\nfunction TimeSeriesPanel({ queries }: { queries: QueryDefinition[] }) {\n const { width, ref: boxRef } = useResizeObserver();\n const height = PANEL_PREVIEW_HEIGHT;\n\n const suggestedStepMs = useSuggestedStepMs(width);\n\n // map TimeSeriesQueryDefinition to Definition<UnknownSpec>\n const definitions = queries.length\n ? queries.map((query) => {\n return {\n kind: query.spec.plugin.kind,\n spec: query.spec.plugin.spec,\n };\n })\n : [];\n\n return (\n <Box ref={boxRef} height={height}>\n <DataQueriesProvider definitions={definitions} options={{ suggestedStepMs, mode: 'range' }}>\n <Panel\n panelOptions={{\n hideHeader: true,\n }}\n definition={{\n kind: 'Panel',\n spec: { queries: queries, display: { name: '' }, plugin: { kind: 'TimeSeriesChart', spec: {} } },\n }}\n />\n </DataQueriesProvider>\n </Box>\n );\n}\n\nfunction MetricDataTable({ queries }: { queries: QueryDefinition[] }) {\n const height = PANEL_PREVIEW_HEIGHT;\n\n // map TimeSeriesQueryDefinition to Definition<UnknownSpec>\n const definitions = (queries ?? []).map((query) => {\n return {\n kind: query.spec.plugin.kind,\n spec: query.spec.plugin.spec,\n };\n });\n\n return (\n <Box height={height}>\n <DataQueriesProvider definitions={definitions} options={{ mode: 'instant' }}>\n <Panel\n panelOptions={{\n hideHeader: true,\n }}\n definition={{\n kind: 'Panel',\n spec: { queries: queries, display: { name: '' }, plugin: { kind: 'TimeSeriesTable', spec: {} } },\n }}\n />\n </DataQueriesProvider>\n </Box>\n );\n}\n\nexport function MetricsExplorer() {\n const { tab, queries, setTab, setQueries } = useExplorerManagerContext();\n\n return (\n <Stack gap={2} sx={{ width: '100%' }}>\n <MultiQueryEditor queryTypes={['TimeSeriesQuery']} onChange={setQueries} queries={queries} />\n\n <Tabs\n value={tab}\n onChange={(_, state) => setTab(state)}\n variant=\"scrollable\"\n sx={{ borderBottom: 1, borderColor: 'divider' }}\n >\n <Tab label=\"Table\" />\n <Tab label=\"Graph\" />\n </Tabs>\n <Stack gap={1}>\n {tab === 0 && <MetricDataTable queries={queries} />}\n {tab === 1 && <TimeSeriesPanel queries={queries} />}\n </Stack>\n </Stack>\n );\n}\n"],"names":["Box","Stack","Tab","Tabs","DataQueriesProvider","MultiQueryEditor","useSuggestedStepMs","useResizeObserver","Panel","PANEL_PREVIEW_HEIGHT","useExplorerManagerContext","TimeSeriesPanel","queries","width","ref","boxRef","height","suggestedStepMs","definitions","length","map","query","kind","spec","plugin","options","mode","panelOptions","hideHeader","definition","display","name","MetricDataTable","MetricsExplorer","tab","setTab","setQueries","gap","sx","queryTypes","onChange","value","_","state","variant","borderBottom","borderColor","label"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/ExploreManager/MetricsExplorer.tsx"],"sourcesContent":["// Copyright 2024 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { QueryDefinition } from '@perses-dev/core';\nimport { Box, Stack, Tab, Tabs } from '@mui/material';\nimport { DataQueriesProvider, MultiQueryEditor, useSuggestedStepMs } from '@perses-dev/plugin-system';\nimport useResizeObserver from 'use-resize-observer';\nimport { Panel } from '@perses-dev/dashboards';\nimport { DEFAULT_PROM } from '@perses-dev/prometheus-plugin';\nimport { PrometheusMetricsFinder } from '../PrometheusMetricsFinder';\nimport { FinderQueryParams } from '../PrometheusMetricsFinder/types';\nimport { PANEL_PREVIEW_HEIGHT } from './constants';\nimport { useExplorerManagerContext } from './ExplorerManagerProvider';\n\ninterface MetricsExplorerQueryParams extends FinderQueryParams {\n tab?: string;\n queries?: QueryDefinition[];\n}\n\nfunction TimeSeriesPanel({ queries }: { queries: QueryDefinition[] }) {\n const { width, ref: boxRef } = useResizeObserver();\n const height = PANEL_PREVIEW_HEIGHT;\n\n const suggestedStepMs = useSuggestedStepMs(width);\n\n // map TimeSeriesQueryDefinition to Definition<UnknownSpec>\n const definitions = queries.length\n ? queries.map((query) => {\n return {\n kind: query.spec.plugin.kind,\n spec: query.spec.plugin.spec,\n };\n })\n : [];\n\n return (\n <Box ref={boxRef} height={height}>\n <DataQueriesProvider definitions={definitions} options={{ suggestedStepMs, mode: 'range' }}>\n <Panel\n panelOptions={{\n hideHeader: true,\n }}\n definition={{\n kind: 'Panel',\n spec: { queries: queries, display: { name: '' }, plugin: { kind: 'TimeSeriesChart', spec: {} } },\n }}\n />\n </DataQueriesProvider>\n </Box>\n );\n}\n\nfunction MetricDataTable({ queries }: { queries: QueryDefinition[] }) {\n const height = PANEL_PREVIEW_HEIGHT;\n\n // map TimeSeriesQueryDefinition to Definition<UnknownSpec>\n const definitions = queries.map((query) => {\n return {\n kind: query.spec.plugin.kind,\n spec: query.spec.plugin.spec,\n };\n });\n\n return (\n <Box height={height}>\n <DataQueriesProvider definitions={definitions} options={{ mode: 'instant' }}>\n <Panel\n panelOptions={{\n hideHeader: true,\n }}\n definition={{\n kind: 'Panel',\n spec: { queries: queries, display: { name: '' }, plugin: { kind: 'TimeSeriesTable', spec: {} } },\n }}\n />\n </DataQueriesProvider>\n </Box>\n );\n}\n\nexport function MetricsExplorer() {\n const {\n data: { tab = 'table', queries = [], datasource = DEFAULT_PROM, filters = [], exploredMetric = undefined },\n setData,\n } = useExplorerManagerContext<MetricsExplorerQueryParams>();\n\n return (\n <Stack gap={2} sx={{ width: '100%' }}>\n <Tabs\n value={tab}\n onChange={(_, state) => setData({ tab: state, queries })}\n variant=\"scrollable\"\n sx={{ borderBottom: 1, borderColor: 'divider' }}\n >\n <Tab value=\"table\" label=\"Table\" />\n <Tab value=\"graph\" label=\"Graph\" />\n <Tab value=\"finder\" label=\"Finder\" />\n </Tabs>\n <Stack gap={1}>\n {tab === 'table' && (\n <Stack>\n <MultiQueryEditor\n queryTypes={['TimeSeriesQuery']}\n onChange={(state) => setData({ tab, queries: state })}\n queries={queries}\n />\n <MetricDataTable queries={queries} />\n </Stack>\n )}\n {tab === 'graph' && (\n <Stack>\n <MultiQueryEditor\n queryTypes={['TimeSeriesQuery']}\n onChange={(state) => setData({ tab, queries: state })}\n queries={queries}\n />\n <TimeSeriesPanel queries={queries} />\n </Stack>\n )}\n {tab === 'finder' && (\n <Stack>\n <PrometheusMetricsFinder\n onChange={(state) => setData({ tab, ...state })}\n value={{ datasource, filters, exploredMetric }}\n />\n </Stack>\n )}\n </Stack>\n </Stack>\n );\n}\n"],"names":["Box","Stack","Tab","Tabs","DataQueriesProvider","MultiQueryEditor","useSuggestedStepMs","useResizeObserver","Panel","DEFAULT_PROM","PrometheusMetricsFinder","PANEL_PREVIEW_HEIGHT","useExplorerManagerContext","TimeSeriesPanel","queries","width","ref","boxRef","height","suggestedStepMs","definitions","length","map","query","kind","spec","plugin","options","mode","panelOptions","hideHeader","definition","display","name","MetricDataTable","MetricsExplorer","data","tab","datasource","filters","exploredMetric","undefined","setData","gap","sx","value","onChange","_","state","variant","borderBottom","borderColor","label","queryTypes"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TracesExplorer.d.ts","sourceRoot":"","sources":["../../../src/components/ExploreManager/TracesExplorer.tsx"],"names":[],"mappings":"AAwFA,wBAAgB,cAAc,4CAiC7B"}
1
+ {"version":3,"file":"TracesExplorer.d.ts","sourceRoot":"","sources":["../../../src/components/ExploreManager/TracesExplorer.tsx"],"names":[],"mappings":"AA4FA,wBAAgB,cAAc,4CAwC7B"}
@@ -117,7 +117,7 @@ function TracingGanttChartPanel({ queries }) {
117
117
  }
118
118
  export function TracesExplorer() {
119
119
  var _queries_, _queries_1, _queries_2;
120
- const { queries, setQueries } = useExplorerManagerContext();
120
+ const { data: { queries = [] }, setData } = useExplorerManagerContext();
121
121
  // map TraceQueryDefinition to Definition<UnknownSpec>
122
122
  const definitions = queries.length ? queries.map((query)=>{
123
123
  return {
@@ -138,7 +138,9 @@ export function TracesExplorer() {
138
138
  queryTypes: [
139
139
  'TraceQuery'
140
140
  ],
141
- onChange: setQueries,
141
+ onChange: (newQueries)=>setData({
142
+ queries: newQueries
143
+ }),
142
144
  queries: queries
143
145
  }),
144
146
  /*#__PURE__*/ _jsx(ErrorBoundary, {