import {Fragment} from 'react'; import {RouteComponentProps} from 'react-router'; import styled from '@emotion/styled'; import {LinkButton} from 'sentry/components/button'; import MiniBarChart from 'sentry/components/charts/miniBarChart'; import EmptyMessage from 'sentry/components/emptyMessage'; import FieldGroup from 'sentry/components/forms/fieldGroup'; import Panel from 'sentry/components/panels/panel'; import PanelBody from 'sentry/components/panels/panelBody'; import PanelHeader from 'sentry/components/panels/panelHeader'; import PanelTable from 'sentry/components/panels/panelTable'; import Placeholder from 'sentry/components/placeholder'; import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle'; import {CHART_PALETTE} from 'sentry/constants/chartPalette'; import {t} from 'sentry/locale'; import {MetricsOperation, MetricType, MRI, Organization, Project} from 'sentry/types'; import {getDdmUrl, getReadableMetricType, MetricDisplayType} from 'sentry/utils/metrics'; import {formatMRI, formatMRIField, MRIToField, parseMRI} from 'sentry/utils/metrics/mri'; import {useMetricsData} from 'sentry/utils/metrics/useMetricsData'; import {useMetricsTags} from 'sentry/utils/metrics/useMetricsTags'; import routeTitleGen from 'sentry/utils/routeTitle'; import {CodeLocations} from 'sentry/views/ddm/codeLocations'; import SettingsPageHeader from 'sentry/views/settings/components/settingsPageHeader'; function getSettingsOperationForType(type: MetricType): MetricsOperation { switch (type) { case 'c': return 'sum'; case 's': return 'count_unique'; case 'd': return 'count'; case 'g': return 'count'; default: return 'sum'; } } type Props = { organization: Organization; project: Project; } & RouteComponentProps<{mri: MRI; projectId: string}, {}>; function ProjectMetricsDetails({project, params, organization}: Props) { const {mri} = params; const {type, name, unit} = parseMRI(mri) ?? {}; const operation = getSettingsOperationForType(type ?? 'c'); const field = MRIToField(mri, operation); const {data: tagsData = []} = useMetricsTags(mri, [parseInt(project.id, 10)]); const {data: metricsData, isLoading} = useMetricsData( { datetime: { period: '30d', start: '', end: '', utc: false, }, environments: [], mri, projects: [parseInt(project.id, 10)], op: operation, }, {interval: '1d'} ); const series = [ { seriesName: formatMRIField(field) ?? 'Metric', data: metricsData?.intervals.map((interval, index) => ({ name: interval, value: metricsData.groups[0].series[field][index] ?? 0, })) ?? [], }, ]; const isChartEmpty = series[0].data.every(({value}) => value === 0); const tags = tagsData.sort((a, b) => a.key.localeCompare(b.key)); return ( {t('Open in DDM')} } /> {t('Metric Details')} {name}
{getReadableMetricType(type)}
{unit}
{t('Activity in the last 30 days (by day)')} {isLoading && } {!isLoading && ( )} {!isLoading && isChartEmpty && ( )} {t('Tags')}]} emptyMessage={t('There are no tags for this metric.')} isEmpty={tags.length === 0} isLoading={isLoading} > {tags.map(({key}) => (
{key}
))}
{t('Code Location')}
); } const TableHeading = styled('div')` color: ${p => p.theme.textColor}; `; const MetricName = styled('div')` word-break: break-word; `; export default ProjectMetricsDetails;