@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.
- package/dist/cjs/components/ExploreManager/ExplorerManagerProvider.js +9 -23
- package/dist/cjs/components/ExploreManager/ExplorerManagerProviderWithQueryParams.js +1 -2
- package/dist/cjs/components/ExploreManager/MetricsExplorer.js +59 -14
- package/dist/cjs/components/ExploreManager/TracesExplorer.js +4 -2
- package/dist/cjs/components/ExploreManager/query-params.js +49 -0
- package/dist/cjs/components/PrometheusMetricsFinder/PrometheusMetricsFinder.js +209 -0
- package/dist/cjs/components/PrometheusMetricsFinder/display/MetricChip.js +61 -0
- package/dist/cjs/components/PrometheusMetricsFinder/display/list/MetricList.js +156 -0
- package/dist/cjs/components/PrometheusMetricsFinder/filter/FilterInputs.js +232 -0
- package/dist/cjs/components/PrometheusMetricsFinder/filter/FinderFilters.js +139 -0
- package/dist/cjs/components/PrometheusMetricsFinder/index.js +30 -0
- package/dist/cjs/components/PrometheusMetricsFinder/overview/MetricOverview.js +235 -0
- package/dist/cjs/components/PrometheusMetricsFinder/overview/tabs/JobTab.js +146 -0
- package/dist/cjs/components/PrometheusMetricsFinder/overview/tabs/OverviewTab.js +413 -0
- package/dist/cjs/components/PrometheusMetricsFinder/overview/tabs/SimilarTab.js +54 -0
- package/dist/cjs/components/PrometheusMetricsFinder/types.js +25 -0
- package/dist/cjs/components/PrometheusMetricsFinder/utils.js +202 -0
- package/dist/cjs/components/index.js +32 -0
- package/dist/cjs/index.js +1 -0
- package/dist/components/ExploreManager/ExplorerManagerProvider.d.ts +7 -11
- package/dist/components/ExploreManager/ExplorerManagerProvider.d.ts.map +1 -1
- package/dist/components/ExploreManager/ExplorerManagerProvider.js +9 -23
- package/dist/components/ExploreManager/ExplorerManagerProvider.js.map +1 -1
- package/dist/components/ExploreManager/ExplorerManagerProviderWithQueryParams.d.ts.map +1 -1
- package/dist/components/ExploreManager/ExplorerManagerProviderWithQueryParams.js +2 -3
- package/dist/components/ExploreManager/ExplorerManagerProviderWithQueryParams.js.map +1 -1
- package/dist/components/ExploreManager/MetricsExplorer.d.ts.map +1 -1
- package/dist/components/ExploreManager/MetricsExplorer.js +59 -14
- package/dist/components/ExploreManager/MetricsExplorer.js.map +1 -1
- package/dist/components/ExploreManager/TracesExplorer.d.ts.map +1 -1
- package/dist/components/ExploreManager/TracesExplorer.js +4 -2
- package/dist/components/ExploreManager/TracesExplorer.js.map +1 -1
- package/dist/components/ExploreManager/query-params.d.ts +17 -0
- package/dist/components/ExploreManager/query-params.d.ts.map +1 -0
- package/dist/components/ExploreManager/query-params.js +34 -0
- package/dist/components/ExploreManager/query-params.js.map +1 -0
- package/dist/components/PrometheusMetricsFinder/PrometheusMetricsFinder.d.ts +30 -0
- package/dist/components/PrometheusMetricsFinder/PrometheusMetricsFinder.d.ts.map +1 -0
- package/dist/components/PrometheusMetricsFinder/PrometheusMetricsFinder.js +185 -0
- package/dist/components/PrometheusMetricsFinder/PrometheusMetricsFinder.js.map +1 -0
- package/dist/components/PrometheusMetricsFinder/display/MetricChip.d.ts +3 -0
- package/dist/components/PrometheusMetricsFinder/display/MetricChip.d.ts.map +1 -0
- package/dist/components/PrometheusMetricsFinder/display/MetricChip.js +53 -0
- package/dist/components/PrometheusMetricsFinder/display/MetricChip.js.map +1 -0
- package/dist/components/PrometheusMetricsFinder/display/list/MetricList.d.ts +20 -0
- package/dist/components/PrometheusMetricsFinder/display/list/MetricList.d.ts.map +1 -0
- package/dist/components/PrometheusMetricsFinder/display/list/MetricList.js +135 -0
- package/dist/components/PrometheusMetricsFinder/display/list/MetricList.js.map +1 -0
- package/dist/components/PrometheusMetricsFinder/filter/FilterInputs.d.ts +23 -0
- package/dist/components/PrometheusMetricsFinder/filter/FilterInputs.d.ts.map +1 -0
- package/dist/components/PrometheusMetricsFinder/filter/FilterInputs.js +210 -0
- package/dist/components/PrometheusMetricsFinder/filter/FilterInputs.js.map +1 -0
- package/dist/components/PrometheusMetricsFinder/filter/FinderFilters.d.ts +12 -0
- package/dist/components/PrometheusMetricsFinder/filter/FinderFilters.d.ts.map +1 -0
- package/dist/components/PrometheusMetricsFinder/filter/FinderFilters.js +85 -0
- package/dist/components/PrometheusMetricsFinder/filter/FinderFilters.js.map +1 -0
- package/dist/components/PrometheusMetricsFinder/index.d.ts +2 -0
- package/dist/components/PrometheusMetricsFinder/index.d.ts.map +1 -0
- package/dist/components/PrometheusMetricsFinder/index.js +15 -0
- package/dist/components/PrometheusMetricsFinder/index.js.map +1 -0
- package/dist/components/PrometheusMetricsFinder/overview/MetricOverview.d.ts +21 -0
- package/dist/components/PrometheusMetricsFinder/overview/MetricOverview.d.ts.map +1 -0
- package/dist/components/PrometheusMetricsFinder/overview/MetricOverview.js +214 -0
- package/dist/components/PrometheusMetricsFinder/overview/MetricOverview.js.map +1 -0
- package/dist/components/PrometheusMetricsFinder/overview/tabs/JobTab.d.ts +27 -0
- package/dist/components/PrometheusMetricsFinder/overview/tabs/JobTab.d.ts.map +1 -0
- package/dist/components/PrometheusMetricsFinder/overview/tabs/JobTab.js +127 -0
- package/dist/components/PrometheusMetricsFinder/overview/tabs/JobTab.js.map +1 -0
- package/dist/components/PrometheusMetricsFinder/overview/tabs/OverviewTab.d.ts +24 -0
- package/dist/components/PrometheusMetricsFinder/overview/tabs/OverviewTab.d.ts.map +1 -0
- package/dist/components/PrometheusMetricsFinder/overview/tabs/OverviewTab.js +389 -0
- package/dist/components/PrometheusMetricsFinder/overview/tabs/OverviewTab.js.map +1 -0
- package/dist/components/PrometheusMetricsFinder/overview/tabs/SimilarTab.d.ts +11 -0
- package/dist/components/PrometheusMetricsFinder/overview/tabs/SimilarTab.d.ts.map +1 -0
- package/dist/components/PrometheusMetricsFinder/overview/tabs/SimilarTab.js +46 -0
- package/dist/components/PrometheusMetricsFinder/overview/tabs/SimilarTab.js.map +1 -0
- package/dist/components/PrometheusMetricsFinder/types.d.ts +21 -0
- package/dist/components/PrometheusMetricsFinder/types.d.ts.map +1 -0
- package/dist/components/PrometheusMetricsFinder/types.js +17 -0
- package/dist/components/PrometheusMetricsFinder/types.js.map +1 -0
- package/dist/components/PrometheusMetricsFinder/utils.d.ts +18 -0
- package/dist/components/PrometheusMetricsFinder/utils.d.ts.map +1 -0
- package/dist/components/PrometheusMetricsFinder/utils.js +184 -0
- package/dist/components/PrometheusMetricsFinder/utils.js.map +1 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +17 -0
- package/dist/components/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +13 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/PrometheusMetricsFinder/overview/MetricOverview.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 { Checkbox, FormControlLabel, Skeleton, Stack, StackProps, Tab, Tabs, Tooltip } from '@mui/material';\nimport { useMemo, useState } from 'react';\nimport { DatasourceSelector, Definition, QueryDefinition, UnknownSpec } from '@perses-dev/core';\nimport { Panel } from '@perses-dev/dashboards';\nimport useResizeObserver from 'use-resize-observer';\nimport { DataQueriesProvider, useSuggestedStepMs } from '@perses-dev/plugin-system';\nimport HelpCircleOutlineIcon from 'mdi-material-ui/HelpCircleOutline';\nimport { computeFilterExpr, LabelFilter } from '../types';\nimport { useMetricMetadata } from '../utils';\nimport { OverviewTab } from './tabs/OverviewTab';\nimport { JobTab } from './tabs/JobTab';\nimport { SimilarTab } from './tabs/SimilarTab';\n\nexport interface OverviewPanelProps extends StackProps {\n metricName: string;\n datasource: DatasourceSelector;\n filters: LabelFilter[];\n type?: string;\n isLoading?: boolean;\n}\n\nexport function OverviewPanel({ metricName, datasource, filters, type, isLoading, ...props }: OverviewPanelProps) {\n const { width, ref: panelRef } = useResizeObserver();\n const suggestedStepMs = useSuggestedStepMs(width);\n\n const [rateEnabled, setRateEnabled] = useState(true);\n\n const { queries, definitions }: { queries: QueryDefinition[]; definitions: Array<Definition<UnknownSpec>> } =\n useMemo(() => {\n const expr =\n type === 'counter' || (rateEnabled && (type === undefined || type === 'summary' || type === 'histogram'))\n ? `rate({__name__=\"${metricName}\", ${computeFilterExpr(filters)}}[5m])`\n : `{__name__=\"${metricName}\", ${computeFilterExpr(filters)}}`;\n\n const queries = [\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n datasource: datasource,\n query: expr,\n },\n },\n },\n },\n ];\n\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 { queries, definitions };\n }, [datasource, filters, metricName, rateEnabled, type]);\n\n if (isLoading) {\n return (\n <Stack {...props}>\n <Skeleton variant=\"rectangular\" height=\"100%\" />\n </Stack>\n );\n }\n\n return (\n <Stack ref={panelRef} alignItems=\"end\" {...props}>\n {(type === undefined || type === 'summary' || type === 'histogram') && (\n <FormControlLabel\n control={<Checkbox size=\"small\" />}\n label=\"Enable rate\"\n checked={rateEnabled}\n onChange={(_, checked) => setRateEnabled(checked)}\n />\n )}\n <DataQueriesProvider definitions={definitions} options={{ suggestedStepMs, mode: 'range' }}>\n <Panel\n panelOptions={{\n hideHeader: true,\n }}\n definition={{\n kind: 'Panel',\n spec: {\n queries: queries,\n display: { name: '' },\n plugin: { kind: 'TimeSeriesChart', spec: {} },\n },\n }}\n />\n </DataQueriesProvider>\n </Stack>\n );\n}\n\nexport interface MetricOverviewProps extends StackProps {\n metricName: string;\n datasource: DatasourceSelector;\n filters: LabelFilter[];\n isMetadataEnabled?: boolean;\n onExplore?: (metricName: string) => void;\n onFiltersChange: (filters: LabelFilter[]) => void;\n}\n\nexport function MetricOverview({\n metricName,\n datasource,\n filters,\n isMetadataEnabled,\n onExplore,\n onFiltersChange,\n ...props\n}: MetricOverviewProps) {\n const [tab, setTab] = useState(0);\n const { metadata, isLoading: isMetadataLoading } = useMetricMetadata(metricName, datasource);\n\n const filtersWithMetricName: LabelFilter[] = useMemo(() => {\n const result = filters.filter((filter) => filter.label !== '__name__');\n result.push({ label: '__name__', labelValues: [metricName], operator: '=' });\n return result;\n }, [filters, metricName]);\n\n function handleFilterAdd(filter: LabelFilter) {\n onFiltersChange([...filters, filter]);\n }\n\n function handleExplore(metricName: string, tab?: number) {\n onExplore?.(metricName);\n if (tab !== undefined) {\n setTab(tab);\n }\n }\n\n return (\n <Stack sx={{ width: '100%' }} {...props}>\n <OverviewPanel\n metricName={metricName}\n filters={filters}\n datasource={datasource}\n type={metadata?.type}\n height=\"250px\"\n isLoading={isMetadataEnabled && isMetadataLoading}\n />\n <Tabs\n value={tab}\n onChange={(_, state) => setTab(state)}\n variant=\"scrollable\"\n sx={{ borderBottom: 1, borderColor: 'divider' }}\n >\n <Tab label=\"Overview\" />\n <Tab\n label=\"Job related metrics\"\n icon={\n <Tooltip title=\"All metrics scraped from the same job\" placement=\"top\">\n <HelpCircleOutlineIcon />\n </Tooltip>\n }\n iconPosition=\"end\"\n />\n <Tab\n label=\"Similar metrics\"\n icon={\n <Tooltip title=\"All metrics matching current filters\" placement=\"top\">\n <HelpCircleOutlineIcon />\n </Tooltip>\n }\n iconPosition=\"end\"\n />\n </Tabs>\n <Stack gap={1}>\n {tab === 0 && (\n <OverviewTab\n metricName={metricName}\n datasource={datasource}\n filters={filtersWithMetricName}\n onFilterAdd={handleFilterAdd}\n />\n )}\n {tab === 1 && (\n <JobTab\n filters={filtersWithMetricName}\n datasource={datasource}\n isMetadataEnabled={isMetadataEnabled}\n onExplore={(metricName) => handleExplore(metricName, 0)}\n />\n )}\n {tab === 2 && (\n <SimilarTab\n filters={filtersWithMetricName}\n datasource={datasource}\n isMetadataEnabled={isMetadataEnabled}\n onExplore={(metricName) => handleExplore(metricName, 0)}\n />\n )}\n </Stack>\n </Stack>\n );\n}\n"],"names":["Checkbox","FormControlLabel","Skeleton","Stack","Tab","Tabs","Tooltip","useMemo","useState","Panel","useResizeObserver","DataQueriesProvider","useSuggestedStepMs","HelpCircleOutlineIcon","computeFilterExpr","useMetricMetadata","OverviewTab","JobTab","SimilarTab","OverviewPanel","metricName","datasource","filters","type","isLoading","props","width","ref","panelRef","suggestedStepMs","rateEnabled","setRateEnabled","queries","definitions","expr","undefined","kind","spec","plugin","query","map","variant","height","alignItems","control","size","label","checked","onChange","_","options","mode","panelOptions","hideHeader","definition","display","name","MetricOverview","isMetadataEnabled","onExplore","onFiltersChange","tab","setTab","metadata","isMetadataLoading","filtersWithMetricName","result","filter","push","labelValues","operator","handleFilterAdd","handleExplore","sx","value","state","borderBottom","borderColor","icon","title","placement","iconPosition","gap","onFilterAdd"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { DatasourceSelector } from '@perses-dev/core';
|
|
2
|
+
import { StackProps } from '@mui/material';
|
|
3
|
+
import { LabelFilter } from '../../types';
|
|
4
|
+
export interface JobList extends StackProps {
|
|
5
|
+
job: string;
|
|
6
|
+
filters: LabelFilter[];
|
|
7
|
+
datasource: DatasourceSelector;
|
|
8
|
+
isMetadataEnabled?: boolean;
|
|
9
|
+
onExplore: (metricName: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function JobList({ job, filters, datasource, isMetadataEnabled, onExplore, ...props }: JobList): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export interface JobSection extends StackProps {
|
|
13
|
+
jobs: string[];
|
|
14
|
+
filters: LabelFilter[];
|
|
15
|
+
datasource: DatasourceSelector;
|
|
16
|
+
isMetadataEnabled?: boolean;
|
|
17
|
+
onExplore: (metricName: string) => void;
|
|
18
|
+
}
|
|
19
|
+
export declare function JobSection({ jobs, filters, datasource, isMetadataEnabled, onExplore, ...props }: JobSection): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export interface JobTabProps extends StackProps {
|
|
21
|
+
filters: LabelFilter[];
|
|
22
|
+
datasource: DatasourceSelector;
|
|
23
|
+
isMetadataEnabled?: boolean;
|
|
24
|
+
onExplore: (metricName: string) => void;
|
|
25
|
+
}
|
|
26
|
+
export declare function JobTab({ filters, datasource, isMetadataEnabled, onExplore, ...props }: JobTabProps): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
//# sourceMappingURL=JobTab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JobTab.d.ts","sourceRoot":"","sources":["../../../../../src/components/PrometheusMetricsFinder/overview/tabs/JobTab.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAOL,UAAU,EAEX,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,OAAO,2CA2BpG;AAED,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,2CAuC3G;AAED,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,WAAW,2CA6BlG"}
|
|
@@ -0,0 +1,127 @@
|
|
|
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
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
+
import { CircularProgress, FormControl, InputLabel, MenuItem, Select, Stack, Typography } from '@mui/material';
|
|
15
|
+
import { useMemo, useState } from 'react';
|
|
16
|
+
import { MetricList } from '../../display/list/MetricList';
|
|
17
|
+
import { useLabelValues } from '../../utils';
|
|
18
|
+
export function JobList({ job, filters, datasource, isMetadataEnabled, onExplore, ...props }) {
|
|
19
|
+
const filtersWithJobWithoutName = useMemo(()=>{
|
|
20
|
+
const result = filters.filter((filter)=>filter.label !== '__name__' && filter.label !== 'job');
|
|
21
|
+
result.push({
|
|
22
|
+
label: 'job',
|
|
23
|
+
labelValues: [
|
|
24
|
+
job
|
|
25
|
+
],
|
|
26
|
+
operator: '='
|
|
27
|
+
});
|
|
28
|
+
return result;
|
|
29
|
+
}, [
|
|
30
|
+
filters,
|
|
31
|
+
job
|
|
32
|
+
]);
|
|
33
|
+
const { data, isLoading } = useLabelValues('__name__', filtersWithJobWithoutName, datasource);
|
|
34
|
+
if (isLoading) {
|
|
35
|
+
return /*#__PURE__*/ _jsx(Stack, {
|
|
36
|
+
width: "100%",
|
|
37
|
+
sx: {
|
|
38
|
+
alignItems: 'center',
|
|
39
|
+
justifyContent: 'center'
|
|
40
|
+
},
|
|
41
|
+
children: /*#__PURE__*/ _jsx(CircularProgress, {})
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
var _data_data;
|
|
45
|
+
return /*#__PURE__*/ _jsx(MetricList, {
|
|
46
|
+
metricNames: (_data_data = data === null || data === void 0 ? void 0 : data.data) !== null && _data_data !== void 0 ? _data_data : [],
|
|
47
|
+
datasource: datasource,
|
|
48
|
+
filters: filtersWithJobWithoutName,
|
|
49
|
+
isMetadataEnabled: isMetadataEnabled,
|
|
50
|
+
onExplore: onExplore,
|
|
51
|
+
...props
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export function JobSection({ jobs, filters, datasource, isMetadataEnabled, onExplore, ...props }) {
|
|
55
|
+
var _jobs_;
|
|
56
|
+
const [currentJob, setCurrentJob] = useState((_jobs_ = jobs[0]) !== null && _jobs_ !== void 0 ? _jobs_ : '');
|
|
57
|
+
if (!currentJob) {
|
|
58
|
+
return /*#__PURE__*/ _jsx(Typography, {
|
|
59
|
+
children: "Something went wrong..."
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return /*#__PURE__*/ _jsxs(Stack, {
|
|
63
|
+
gap: 2,
|
|
64
|
+
...props,
|
|
65
|
+
children: [
|
|
66
|
+
jobs.length > 2 && /*#__PURE__*/ _jsxs(FormControl, {
|
|
67
|
+
fullWidth: true,
|
|
68
|
+
children: [
|
|
69
|
+
/*#__PURE__*/ _jsx(InputLabel, {
|
|
70
|
+
id: "job-select-label",
|
|
71
|
+
children: "Job"
|
|
72
|
+
}),
|
|
73
|
+
/*#__PURE__*/ _jsx(Select, {
|
|
74
|
+
labelId: "job-select-label",
|
|
75
|
+
id: "job-select",
|
|
76
|
+
label: "Job",
|
|
77
|
+
variant: "outlined",
|
|
78
|
+
value: currentJob,
|
|
79
|
+
onChange: (e)=>setCurrentJob(e.target.value),
|
|
80
|
+
children: jobs.map((job)=>/*#__PURE__*/ _jsx(MenuItem, {
|
|
81
|
+
value: job,
|
|
82
|
+
children: job
|
|
83
|
+
}, job))
|
|
84
|
+
})
|
|
85
|
+
]
|
|
86
|
+
}),
|
|
87
|
+
currentJob && /*#__PURE__*/ _jsx(JobList, {
|
|
88
|
+
job: currentJob,
|
|
89
|
+
filters: filters,
|
|
90
|
+
datasource: datasource,
|
|
91
|
+
isMetadataEnabled: isMetadataEnabled,
|
|
92
|
+
onExplore: onExplore
|
|
93
|
+
})
|
|
94
|
+
]
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
export function JobTab({ filters, datasource, isMetadataEnabled, onExplore, ...props }) {
|
|
98
|
+
const { data: jobData, isLoading: isJobLoading } = useLabelValues('job', filters, datasource);
|
|
99
|
+
if (isJobLoading) {
|
|
100
|
+
return /*#__PURE__*/ _jsx(Stack, {
|
|
101
|
+
width: "100%",
|
|
102
|
+
sx: {
|
|
103
|
+
alignItems: 'center',
|
|
104
|
+
justifyContent: 'center'
|
|
105
|
+
},
|
|
106
|
+
children: /*#__PURE__*/ _jsx(CircularProgress, {})
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
if (!(jobData === null || jobData === void 0 ? void 0 : jobData.data) || jobData.data.length === 0) {
|
|
110
|
+
return /*#__PURE__*/ _jsx(Stack, {
|
|
111
|
+
...props,
|
|
112
|
+
children: /*#__PURE__*/ _jsx(Typography, {
|
|
113
|
+
children: "No jobs found"
|
|
114
|
+
})
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return /*#__PURE__*/ _jsx(JobSection, {
|
|
118
|
+
jobs: jobData.data,
|
|
119
|
+
filters: filters,
|
|
120
|
+
datasource: datasource,
|
|
121
|
+
isMetadataEnabled: isMetadataEnabled,
|
|
122
|
+
onExplore: onExplore,
|
|
123
|
+
...props
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
//# sourceMappingURL=JobTab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/components/PrometheusMetricsFinder/overview/tabs/JobTab.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 { DatasourceSelector } from '@perses-dev/core';\nimport {\n CircularProgress,\n FormControl,\n InputLabel,\n MenuItem,\n Select,\n Stack,\n StackProps,\n Typography,\n} from '@mui/material';\nimport { useMemo, useState } from 'react';\nimport { MetricList } from '../../display/list/MetricList';\nimport { LabelFilter } from '../../types';\nimport { useLabelValues } from '../../utils';\n\nexport interface JobList extends StackProps {\n job: string;\n filters: LabelFilter[];\n datasource: DatasourceSelector;\n isMetadataEnabled?: boolean;\n onExplore: (metricName: string) => void;\n}\n\nexport function JobList({ job, filters, datasource, isMetadataEnabled, onExplore, ...props }: JobList) {\n const filtersWithJobWithoutName: LabelFilter[] = useMemo(() => {\n const result = filters.filter((filter) => filter.label !== '__name__' && filter.label !== 'job');\n result.push({ label: 'job', labelValues: [job], operator: '=' });\n return result;\n }, [filters, job]);\n\n const { data, isLoading } = useLabelValues('__name__', filtersWithJobWithoutName, datasource);\n\n if (isLoading) {\n return (\n <Stack width=\"100%\" sx={{ alignItems: 'center', justifyContent: 'center' }}>\n <CircularProgress />\n </Stack>\n );\n }\n\n return (\n <MetricList\n metricNames={data?.data ?? []}\n datasource={datasource}\n filters={filtersWithJobWithoutName}\n isMetadataEnabled={isMetadataEnabled}\n onExplore={onExplore}\n {...props}\n />\n );\n}\n\nexport interface JobSection extends StackProps {\n jobs: string[];\n filters: LabelFilter[];\n datasource: DatasourceSelector;\n isMetadataEnabled?: boolean;\n onExplore: (metricName: string) => void;\n}\n\nexport function JobSection({ jobs, filters, datasource, isMetadataEnabled, onExplore, ...props }: JobSection) {\n const [currentJob, setCurrentJob] = useState<string>(jobs[0] ?? '');\n\n if (!currentJob) {\n return <Typography>Something went wrong...</Typography>;\n }\n\n return (\n <Stack gap={2} {...props}>\n {jobs.length > 2 && (\n <FormControl fullWidth>\n <InputLabel id=\"job-select-label\">Job</InputLabel>\n <Select\n labelId=\"job-select-label\"\n id=\"job-select\"\n label=\"Job\"\n variant=\"outlined\"\n value={currentJob}\n onChange={(e) => setCurrentJob(e.target.value)}\n >\n {jobs.map((job) => (\n <MenuItem key={job} value={job}>\n {job}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )}\n {currentJob && (\n <JobList\n job={currentJob}\n filters={filters}\n datasource={datasource}\n isMetadataEnabled={isMetadataEnabled}\n onExplore={onExplore}\n />\n )}\n </Stack>\n );\n}\n\nexport interface JobTabProps extends StackProps {\n filters: LabelFilter[];\n datasource: DatasourceSelector;\n isMetadataEnabled?: boolean;\n onExplore: (metricName: string) => void;\n}\n\nexport function JobTab({ filters, datasource, isMetadataEnabled, onExplore, ...props }: JobTabProps) {\n const { data: jobData, isLoading: isJobLoading } = useLabelValues('job', filters, datasource);\n\n if (isJobLoading) {\n return (\n <Stack width=\"100%\" sx={{ alignItems: 'center', justifyContent: 'center' }}>\n <CircularProgress />\n </Stack>\n );\n }\n\n if (!jobData?.data || jobData.data.length === 0) {\n return (\n <Stack {...props}>\n <Typography>No jobs found</Typography>\n </Stack>\n );\n }\n\n return (\n <JobSection\n jobs={jobData.data}\n filters={filters}\n datasource={datasource}\n isMetadataEnabled={isMetadataEnabled}\n onExplore={onExplore}\n {...props}\n />\n );\n}\n"],"names":["CircularProgress","FormControl","InputLabel","MenuItem","Select","Stack","Typography","useMemo","useState","MetricList","useLabelValues","JobList","job","filters","datasource","isMetadataEnabled","onExplore","props","filtersWithJobWithoutName","result","filter","label","push","labelValues","operator","data","isLoading","width","sx","alignItems","justifyContent","metricNames","JobSection","jobs","currentJob","setCurrentJob","gap","length","fullWidth","id","labelId","variant","value","onChange","e","target","map","JobTab","jobData","isJobLoading"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { DatasourceSelector } from '@perses-dev/core';
|
|
2
|
+
import { StackProps } from '@mui/material';
|
|
3
|
+
import { LabelFilter, LabelValueCounter } from '../../types';
|
|
4
|
+
export interface LabelValuesRowProps extends StackProps {
|
|
5
|
+
label: string;
|
|
6
|
+
valueCounters: LabelValueCounter[];
|
|
7
|
+
onFilterAdd: (filter: LabelFilter) => void;
|
|
8
|
+
orderBy?: 'asc' | 'amount';
|
|
9
|
+
}
|
|
10
|
+
export declare function LabelValuesRow({ label, valueCounters, onFilterAdd, ...props }: LabelValuesRowProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export interface LabelValuesTableProps extends StackProps {
|
|
12
|
+
labelValueCounters: Map<string, LabelValueCounter[]>;
|
|
13
|
+
isLoading?: boolean;
|
|
14
|
+
onFilterAdd: (filter: LabelFilter) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function LabelValuesTable({ labelValueCounters, isLoading, onFilterAdd, ...props }: LabelValuesTableProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export interface OverviewTabProps extends StackProps {
|
|
18
|
+
metricName: string;
|
|
19
|
+
datasource: DatasourceSelector;
|
|
20
|
+
filters: LabelFilter[];
|
|
21
|
+
onFilterAdd: (filter: LabelFilter) => void;
|
|
22
|
+
}
|
|
23
|
+
export declare function OverviewTab({ metricName, datasource, filters, onFilterAdd, ...props }: OverviewTabProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=OverviewTab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OverviewTab.d.ts","sourceRoot":"","sources":["../../../../../src/components/PrometheusMetricsFinder/overview/tabs/OverviewTab.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAWL,UAAU,EAKX,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAY,MAAM,aAAa,CAAC;AAKvE,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,WAAW,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAC3C,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC5B;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,KAAK,EAAE,EAAE,mBAAmB,2CAkIlG;AAED,MAAM,WAAW,qBAAsB,SAAQ,UAAU;IACvD,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC5C;AAED,wBAAgB,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,KAAK,EAAE,EAAE,qBAAqB,2CAiC/G;AAED,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,WAAW,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC5C;AAED,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,2CA4CvG"}
|
|
@@ -0,0 +1,389 @@
|
|
|
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
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
14
|
+
import { useMemo, useState } from 'react';
|
|
15
|
+
import { Autocomplete, Button, CircularProgress, Divider, IconButton, MenuItem, Select, Skeleton, Stack, TextField, Typography, useMediaQuery, useTheme } from '@mui/material';
|
|
16
|
+
import PlusIcon from 'mdi-material-ui/Plus';
|
|
17
|
+
import CheckIcon from 'mdi-material-ui/Check';
|
|
18
|
+
import CloseIcon from 'mdi-material-ui/Close';
|
|
19
|
+
import { ListboxComponent } from '../../filter/FilterInputs';
|
|
20
|
+
import { useMetricMetadata, useSeriesStates } from '../../utils';
|
|
21
|
+
import { MetricChip } from '../../display/MetricChip';
|
|
22
|
+
export function LabelValuesRow({ label, valueCounters, onFilterAdd, ...props }) {
|
|
23
|
+
const [isAddingFilter, setIsAddingFilter] = useState(false);
|
|
24
|
+
const [operator, setOperator] = useState('=');
|
|
25
|
+
const [value, setValue] = useState('');
|
|
26
|
+
const [showAllValues, setShowAllValues] = useState(false);
|
|
27
|
+
const isMobileSize = useMediaQuery(useTheme().breakpoints.down('md'));
|
|
28
|
+
const displayedValueCounters = useMemo(()=>{
|
|
29
|
+
if (showAllValues) {
|
|
30
|
+
return valueCounters;
|
|
31
|
+
}
|
|
32
|
+
return valueCounters.slice(0, 5);
|
|
33
|
+
}, [
|
|
34
|
+
showAllValues,
|
|
35
|
+
valueCounters
|
|
36
|
+
]);
|
|
37
|
+
return /*#__PURE__*/ _jsxs(Stack, {
|
|
38
|
+
sx: {
|
|
39
|
+
width: '100%'
|
|
40
|
+
},
|
|
41
|
+
direction: isMobileSize ? 'column' : 'row',
|
|
42
|
+
alignItems: "center",
|
|
43
|
+
gap: 2,
|
|
44
|
+
...props,
|
|
45
|
+
children: [
|
|
46
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
47
|
+
sx: {
|
|
48
|
+
width: '100%',
|
|
49
|
+
height: '100%'
|
|
50
|
+
},
|
|
51
|
+
justifyContent: "space-between",
|
|
52
|
+
alignContent: "center",
|
|
53
|
+
direction: isMobileSize ? 'column' : 'row',
|
|
54
|
+
children: [
|
|
55
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
56
|
+
sx: {
|
|
57
|
+
fontFamily: 'monospace'
|
|
58
|
+
},
|
|
59
|
+
pl: isMobileSize ? 0 : 1,
|
|
60
|
+
children: label
|
|
61
|
+
}),
|
|
62
|
+
/*#__PURE__*/ _jsx(Stack, {
|
|
63
|
+
direction: "row",
|
|
64
|
+
gap: 1,
|
|
65
|
+
alignItems: "center",
|
|
66
|
+
children: isAddingFilter ? /*#__PURE__*/ _jsxs(_Fragment, {
|
|
67
|
+
children: [
|
|
68
|
+
/*#__PURE__*/ _jsxs(Select, {
|
|
69
|
+
size: "small",
|
|
70
|
+
value: operator,
|
|
71
|
+
variant: "outlined",
|
|
72
|
+
onChange: (event)=>{
|
|
73
|
+
setOperator(event.target.value);
|
|
74
|
+
},
|
|
75
|
+
children: [
|
|
76
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
77
|
+
value: "=",
|
|
78
|
+
children: "="
|
|
79
|
+
}),
|
|
80
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
81
|
+
value: "!=",
|
|
82
|
+
children: "!="
|
|
83
|
+
}),
|
|
84
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
85
|
+
value: "=~",
|
|
86
|
+
children: "=~"
|
|
87
|
+
}),
|
|
88
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
89
|
+
value: "!~",
|
|
90
|
+
children: "!~"
|
|
91
|
+
})
|
|
92
|
+
]
|
|
93
|
+
}),
|
|
94
|
+
/*#__PURE__*/ _jsx(Autocomplete, {
|
|
95
|
+
freeSolo: true,
|
|
96
|
+
limitTags: 1,
|
|
97
|
+
disableClearable: true,
|
|
98
|
+
options: valueCounters.map((counters)=>counters.labelValue),
|
|
99
|
+
value: value,
|
|
100
|
+
ListboxComponent: ListboxComponent,
|
|
101
|
+
sx: {
|
|
102
|
+
width: 250
|
|
103
|
+
},
|
|
104
|
+
renderInput: (params)=>{
|
|
105
|
+
return /*#__PURE__*/ _jsx(TextField, {
|
|
106
|
+
...params,
|
|
107
|
+
label: "Value",
|
|
108
|
+
variant: "outlined",
|
|
109
|
+
fullWidth: true,
|
|
110
|
+
size: "small"
|
|
111
|
+
});
|
|
112
|
+
},
|
|
113
|
+
onInputChange: (_, newValue)=>{
|
|
114
|
+
setValue(newValue);
|
|
115
|
+
}
|
|
116
|
+
}),
|
|
117
|
+
/*#__PURE__*/ _jsx(IconButton, {
|
|
118
|
+
"aria-label": "confirm",
|
|
119
|
+
onClick: ()=>{
|
|
120
|
+
onFilterAdd({
|
|
121
|
+
label,
|
|
122
|
+
labelValues: [
|
|
123
|
+
value
|
|
124
|
+
],
|
|
125
|
+
operator
|
|
126
|
+
});
|
|
127
|
+
setIsAddingFilter(false);
|
|
128
|
+
},
|
|
129
|
+
children: /*#__PURE__*/ _jsx(CheckIcon, {})
|
|
130
|
+
}),
|
|
131
|
+
/*#__PURE__*/ _jsx(IconButton, {
|
|
132
|
+
"aria-label": "cancel",
|
|
133
|
+
onClick: ()=>{
|
|
134
|
+
setIsAddingFilter(false);
|
|
135
|
+
},
|
|
136
|
+
children: /*#__PURE__*/ _jsx(CloseIcon, {})
|
|
137
|
+
})
|
|
138
|
+
]
|
|
139
|
+
}) : /*#__PURE__*/ _jsx(Button, {
|
|
140
|
+
startIcon: /*#__PURE__*/ _jsx(PlusIcon, {}),
|
|
141
|
+
"aria-label": "add filter",
|
|
142
|
+
onClick: ()=>setIsAddingFilter(true),
|
|
143
|
+
children: "Add filter"
|
|
144
|
+
})
|
|
145
|
+
})
|
|
146
|
+
]
|
|
147
|
+
}),
|
|
148
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
149
|
+
sx: {
|
|
150
|
+
width: '100%'
|
|
151
|
+
},
|
|
152
|
+
gap: 0.5,
|
|
153
|
+
children: [
|
|
154
|
+
/*#__PURE__*/ _jsx(Stack, {
|
|
155
|
+
direction: "row",
|
|
156
|
+
gap: 2,
|
|
157
|
+
children: /*#__PURE__*/ _jsxs(Typography, {
|
|
158
|
+
variant: "subtitle1",
|
|
159
|
+
children: [
|
|
160
|
+
valueCounters.length,
|
|
161
|
+
" values"
|
|
162
|
+
]
|
|
163
|
+
})
|
|
164
|
+
}),
|
|
165
|
+
/*#__PURE__*/ _jsx(Stack, {
|
|
166
|
+
sx: {
|
|
167
|
+
overflow: isMobileSize ? 'auto' : 'unset'
|
|
168
|
+
},
|
|
169
|
+
children: displayedValueCounters.map((labelValueCounter)=>/*#__PURE__*/ _jsxs(Stack, {
|
|
170
|
+
direction: "row",
|
|
171
|
+
gap: 2,
|
|
172
|
+
children: [
|
|
173
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
174
|
+
sx: {
|
|
175
|
+
fontFamily: 'monospace',
|
|
176
|
+
':hover': {
|
|
177
|
+
backgroundColor: 'rgba(127,127,127,0.35)',
|
|
178
|
+
cursor: 'pointer'
|
|
179
|
+
},
|
|
180
|
+
textWrap: isMobileSize ? 'nowrap' : 'unset'
|
|
181
|
+
},
|
|
182
|
+
color: (theme)=>theme.palette.success.main,
|
|
183
|
+
onClick: ()=>onFilterAdd({
|
|
184
|
+
label,
|
|
185
|
+
labelValues: [
|
|
186
|
+
labelValueCounter.labelValue
|
|
187
|
+
],
|
|
188
|
+
operator: '='
|
|
189
|
+
}),
|
|
190
|
+
children: labelValueCounter.labelValue
|
|
191
|
+
}),
|
|
192
|
+
/*#__PURE__*/ _jsxs(Typography, {
|
|
193
|
+
sx: {
|
|
194
|
+
textWrap: 'nowrap'
|
|
195
|
+
},
|
|
196
|
+
children: [
|
|
197
|
+
"(",
|
|
198
|
+
labelValueCounter.counter,
|
|
199
|
+
" series)"
|
|
200
|
+
]
|
|
201
|
+
})
|
|
202
|
+
]
|
|
203
|
+
}, `${label}-${labelValueCounter.labelValue}`))
|
|
204
|
+
}),
|
|
205
|
+
/*#__PURE__*/ _jsx(Stack, {
|
|
206
|
+
width: "100%",
|
|
207
|
+
textAlign: isMobileSize ? 'center' : 'unset',
|
|
208
|
+
children: showAllValues ? /*#__PURE__*/ _jsx(Button, {
|
|
209
|
+
variant: "text",
|
|
210
|
+
sx: {
|
|
211
|
+
width: 'fit-content'
|
|
212
|
+
},
|
|
213
|
+
onClick: ()=>setShowAllValues(false),
|
|
214
|
+
children: "Hide full values"
|
|
215
|
+
}) : /*#__PURE__*/ _jsx(_Fragment, {
|
|
216
|
+
children: valueCounters.length > 5 && /*#__PURE__*/ _jsxs(Button, {
|
|
217
|
+
variant: "text",
|
|
218
|
+
sx: {
|
|
219
|
+
width: 'fit-content'
|
|
220
|
+
},
|
|
221
|
+
onClick: ()=>setShowAllValues(true),
|
|
222
|
+
children: [
|
|
223
|
+
"Show ",
|
|
224
|
+
valueCounters.length - 5,
|
|
225
|
+
" more values"
|
|
226
|
+
]
|
|
227
|
+
})
|
|
228
|
+
})
|
|
229
|
+
})
|
|
230
|
+
]
|
|
231
|
+
})
|
|
232
|
+
]
|
|
233
|
+
}, label);
|
|
234
|
+
}
|
|
235
|
+
export function LabelValuesTable({ labelValueCounters, isLoading, onFilterAdd, ...props }) {
|
|
236
|
+
const labels = useMemo(()=>{
|
|
237
|
+
return [
|
|
238
|
+
...labelValueCounters.keys()
|
|
239
|
+
].sort();
|
|
240
|
+
}, [
|
|
241
|
+
labelValueCounters
|
|
242
|
+
]);
|
|
243
|
+
if (isLoading) {
|
|
244
|
+
return /*#__PURE__*/ _jsx(Stack, {
|
|
245
|
+
width: "100%",
|
|
246
|
+
sx: {
|
|
247
|
+
alignItems: 'center',
|
|
248
|
+
justifyContent: 'center'
|
|
249
|
+
},
|
|
250
|
+
children: /*#__PURE__*/ _jsx(CircularProgress, {})
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
return /*#__PURE__*/ _jsxs(Stack, {
|
|
254
|
+
sx: {
|
|
255
|
+
width: '100%'
|
|
256
|
+
},
|
|
257
|
+
divider: /*#__PURE__*/ _jsx(Divider, {
|
|
258
|
+
flexItem: true,
|
|
259
|
+
orientation: "horizontal"
|
|
260
|
+
}),
|
|
261
|
+
gap: 2,
|
|
262
|
+
...props,
|
|
263
|
+
children: [
|
|
264
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
265
|
+
gap: 2,
|
|
266
|
+
direction: "row",
|
|
267
|
+
sx: {
|
|
268
|
+
width: '100%'
|
|
269
|
+
},
|
|
270
|
+
children: [
|
|
271
|
+
/*#__PURE__*/ _jsx(Stack, {
|
|
272
|
+
sx: {
|
|
273
|
+
width: '100%'
|
|
274
|
+
},
|
|
275
|
+
children: /*#__PURE__*/ _jsx(Typography, {
|
|
276
|
+
variant: "h3",
|
|
277
|
+
children: "Label"
|
|
278
|
+
})
|
|
279
|
+
}),
|
|
280
|
+
/*#__PURE__*/ _jsx(Stack, {
|
|
281
|
+
sx: {
|
|
282
|
+
width: '100%'
|
|
283
|
+
},
|
|
284
|
+
children: /*#__PURE__*/ _jsx(Typography, {
|
|
285
|
+
variant: "h3",
|
|
286
|
+
children: "Values"
|
|
287
|
+
})
|
|
288
|
+
})
|
|
289
|
+
]
|
|
290
|
+
}),
|
|
291
|
+
labels.map((label)=>{
|
|
292
|
+
var _labelValueCounters_get;
|
|
293
|
+
return /*#__PURE__*/ _jsx(LabelValuesRow, {
|
|
294
|
+
label: label,
|
|
295
|
+
valueCounters: (_labelValueCounters_get = labelValueCounters.get(label)) !== null && _labelValueCounters_get !== void 0 ? _labelValueCounters_get : [],
|
|
296
|
+
onFilterAdd: onFilterAdd
|
|
297
|
+
}, label);
|
|
298
|
+
})
|
|
299
|
+
]
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
export function OverviewTab({ metricName, datasource, filters, onFilterAdd, ...props }) {
|
|
303
|
+
const { metadata, isLoading: isMetadataLoading } = useMetricMetadata(metricName, datasource);
|
|
304
|
+
const { series, labelValueCounters, isLoading } = useSeriesStates(metricName, filters, datasource);
|
|
305
|
+
var _metadata_type, _series_length;
|
|
306
|
+
return /*#__PURE__*/ _jsxs(Stack, {
|
|
307
|
+
gap: 2,
|
|
308
|
+
...props,
|
|
309
|
+
children: [
|
|
310
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
311
|
+
direction: "row",
|
|
312
|
+
gap: 3,
|
|
313
|
+
mt: 1,
|
|
314
|
+
justifyContent: "space-between",
|
|
315
|
+
children: [
|
|
316
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
317
|
+
gap: 1,
|
|
318
|
+
children: [
|
|
319
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
320
|
+
variant: "h1",
|
|
321
|
+
sx: {
|
|
322
|
+
fontFamily: 'monospace'
|
|
323
|
+
},
|
|
324
|
+
children: metricName
|
|
325
|
+
}),
|
|
326
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
327
|
+
children: "Description:"
|
|
328
|
+
}),
|
|
329
|
+
isMetadataLoading ? /*#__PURE__*/ _jsx(Skeleton, {
|
|
330
|
+
variant: "text",
|
|
331
|
+
width: 180
|
|
332
|
+
}) : /*#__PURE__*/ _jsx(Typography, {
|
|
333
|
+
style: {
|
|
334
|
+
fontStyle: (metadata === null || metadata === void 0 ? void 0 : metadata.help) ? 'initial' : 'italic'
|
|
335
|
+
},
|
|
336
|
+
children: metadata ? metadata.help : 'unknown'
|
|
337
|
+
})
|
|
338
|
+
]
|
|
339
|
+
}),
|
|
340
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
341
|
+
gap: 1,
|
|
342
|
+
justifyContent: "center",
|
|
343
|
+
children: [
|
|
344
|
+
isLoading ? /*#__PURE__*/ _jsx(Skeleton, {
|
|
345
|
+
variant: "rounded",
|
|
346
|
+
width: 75
|
|
347
|
+
}) : /*#__PURE__*/ _jsx(MetricChip, {
|
|
348
|
+
label: (_metadata_type = metadata === null || metadata === void 0 ? void 0 : metadata.type) !== null && _metadata_type !== void 0 ? _metadata_type : 'unknown'
|
|
349
|
+
}),
|
|
350
|
+
/*#__PURE__*/ _jsxs(Typography, {
|
|
351
|
+
children: [
|
|
352
|
+
"Result:",
|
|
353
|
+
' ',
|
|
354
|
+
isLoading ? /*#__PURE__*/ _jsx(Skeleton, {
|
|
355
|
+
variant: "text",
|
|
356
|
+
width: 20,
|
|
357
|
+
sx: {
|
|
358
|
+
display: 'inline-block'
|
|
359
|
+
}
|
|
360
|
+
}) : /*#__PURE__*/ _jsxs("strong", {
|
|
361
|
+
children: [
|
|
362
|
+
(_series_length = series === null || series === void 0 ? void 0 : series.length) !== null && _series_length !== void 0 ? _series_length : 0,
|
|
363
|
+
" series"
|
|
364
|
+
]
|
|
365
|
+
})
|
|
366
|
+
]
|
|
367
|
+
})
|
|
368
|
+
]
|
|
369
|
+
})
|
|
370
|
+
]
|
|
371
|
+
}),
|
|
372
|
+
(series === null || series === void 0 ? void 0 : series.length) === 0 ? /*#__PURE__*/ _jsx(Stack, {
|
|
373
|
+
...props,
|
|
374
|
+
children: /*#__PURE__*/ _jsx(Typography, {
|
|
375
|
+
sx: {
|
|
376
|
+
color: (theme)=>theme.palette.warning.main
|
|
377
|
+
},
|
|
378
|
+
children: "No series found with current filters."
|
|
379
|
+
})
|
|
380
|
+
}) : /*#__PURE__*/ _jsx(LabelValuesTable, {
|
|
381
|
+
labelValueCounters: labelValueCounters,
|
|
382
|
+
onFilterAdd: onFilterAdd,
|
|
383
|
+
isLoading: isLoading
|
|
384
|
+
})
|
|
385
|
+
]
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
//# sourceMappingURL=OverviewTab.js.map
|