From a1ff68a25a09e06d6e0c34912833824292bceba8 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Thu, 13 Oct 2022 10:09:33 -0700 Subject: [PATCH] Added Metrics Home Page and date picker Signed-off-by: Sean Li --- .../public/components/app.tsx | 18 +++ .../public/components/common/side_nav.tsx | 5 + .../components/metrics/helpers/utils.tsx | 43 +++++++ .../public/components/metrics/index.tsx | 109 ++++++++++++++++++ 4 files changed, 175 insertions(+) create mode 100644 dashboards-observability/public/components/metrics/helpers/utils.tsx create mode 100644 dashboards-observability/public/components/metrics/index.tsx diff --git a/dashboards-observability/public/components/app.tsx b/dashboards-observability/public/components/app.tsx index 307a0edcf..4102663c7 100644 --- a/dashboards-observability/public/components/app.tsx +++ b/dashboards-observability/public/components/app.tsx @@ -17,6 +17,7 @@ import { Home as CustomPanelsHome } from './custom_panels/home'; import { EventAnalytics } from './event_analytics'; import { Main as NotebooksHome } from './notebooks/components/main'; import { Home as TraceAnalyticsHome } from './trace_analytics/home'; +import { Home as MetricsHome } from './metrics/index'; interface ObservabilityAppDeps { CoreStartProp: CoreStart; @@ -59,6 +60,23 @@ export const App = ({ <> + { + chrome.setBreadcrumbs([ + parentBreadcrumb, + { text: 'Metrics', href: '#/metrics/' }, + ]); + return ( + + ); + }} + /> { diff --git a/dashboards-observability/public/components/common/side_nav.tsx b/dashboards-observability/public/components/common/side_nav.tsx index 0f63ed243..52684b97f 100644 --- a/dashboards-observability/public/components/common/side_nav.tsx +++ b/dashboards-observability/public/components/common/side_nav.tsx @@ -88,6 +88,11 @@ export function ObservabilitySideBar(props: { children: React.ReactNode }) { id: 5, href: '#/notebooks', }, + { + name: 'Metrics', + id: 6, + href: '#/metrics', + }, ], }, ]; diff --git a/dashboards-observability/public/components/metrics/helpers/utils.tsx b/dashboards-observability/public/components/metrics/helpers/utils.tsx new file mode 100644 index 000000000..775b04118 --- /dev/null +++ b/dashboards-observability/public/components/metrics/helpers/utils.tsx @@ -0,0 +1,43 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import dateMath from '@elastic/datemath'; +import { ShortDate } from '@elastic/eui'; +import { DurationRange } from '@elastic/eui/src/components/date_picker/types'; +import _ from 'lodash'; +import { Moment } from 'moment-timezone'; +import { PPL_DATE_FORMAT, PPL_INDEX_REGEX } from '../../../../common/constants/shared'; +import PPLService from '../../../services/requests/ppl'; +import React from 'react'; + +export const convertDateTime = (datetime: string, isStart = true, formatted = true) => { + let returnTime: undefined | Moment; + if (isStart) { + returnTime = dateMath.parse(datetime); + } else { + returnTime = dateMath.parse(datetime, { roundUp: true }); + } + + if (formatted) return returnTime!.format(PPL_DATE_FORMAT); + return returnTime; +}; + +export const onTimeChange = ( + start: ShortDate, + end: ShortDate, + recentlyUsedRanges: DurationRange[], + setRecentlyUsedRanges: React.Dispatch>, + setStart: React.Dispatch>, + setEnd: React.Dispatch> +) => { + const recentlyUsedRange = recentlyUsedRanges.filter((recentlyUsedRange) => { + const isDuplicate = recentlyUsedRange.start === start && recentlyUsedRange.end === end; + return !isDuplicate; + }); + recentlyUsedRange.unshift({ start, end }); + setStart(start); + setEnd(end); + setRecentlyUsedRanges(recentlyUsedRange.slice(0, 9)); +}; diff --git a/dashboards-observability/public/components/metrics/index.tsx b/dashboards-observability/public/components/metrics/index.tsx new file mode 100644 index 000000000..bc66a1c00 --- /dev/null +++ b/dashboards-observability/public/components/metrics/index.tsx @@ -0,0 +1,109 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + EuiPage, + EuiPageBody, + EuiPageHeader, + EuiPageHeaderSection, + EuiSpacer, + EuiSuperDatePicker, + EuiSuperDatePickerProps, + EuiText, + EuiTitle, + EuiTabbedContent, + OnRefreshChangeProps, + OnRefreshProps, + OnTimeChangeProps, + ShortDate, + EuiPageContentBody, + EuiFlexGroup, + EuiFlexItem, +} from '@elastic/eui'; +import { DurationRange } from '@elastic/eui/src/components/date_picker/types'; +import React, { Fragment, useState } from 'react'; +import { StaticContext } from 'react-router-dom'; +import { Route, RouteComponentProps } from 'react-router-dom'; +import { uiSettingsService } from '../../../common/utils'; +import { ChromeBreadcrumb, CoreStart } from '../../../../../src/core/public'; +import { ObservabilitySideBar } from '../common/side_nav'; +import { onTimeChange } from './helpers/utils'; + +export interface MetricsProps { + http: CoreStart['http']; + chrome: CoreStart['chrome']; + parentBreadcrumb: ChromeBreadcrumb; + renderProps: RouteComponentProps; +} + +export const Home = ({ + http, + chrome, + parentBreadcrumb, + renderProps, +}: MetricsProps) => { + const [recentlyUsedRanges, setRecentlyUsedRanges] = useState([]); + const [start, setStart] = useState('now-30m'); + const [end, setEnd] = useState('now'); + const [dateDisabled, setDateDisabled] = useState(false); + + const onRefreshFilters = (startTime: ShortDate, endTime: ShortDate) => { + // if (!isDateValid(convertDateTime(startTime), convertDateTime(endTime, false), setToast)) { + // return; + // } + + console.log('refreshed date picker'); + }; + + const onDatePickerChange = (props: OnTimeChangeProps) => { + onTimeChange( + props.start, + props.end, + recentlyUsedRanges, + setRecentlyUsedRanges, + setStart, + setEnd + ); + onRefreshFilters(props.start, props.end); + }; + + return ( + <> + ( +
+ + + + + +

Metrics

+
+
+
+ + + + + + + +
+
+
+ )} + /> + + ); +};