import {Fragment, useCallback} from 'react';
import {addErrorMessage, addSuccessMessage} from 'sentry/actionCreators/indicator';
import Alert from 'sentry/components/alert';
import Panel from 'sentry/components/panels/panel';
import PanelBody from 'sentry/components/panels/panelBody';
import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
import {t} from 'sentry/locale';
import type {MetricsExtractionRule} from 'sentry/types/metrics';
import type {Project} from 'sentry/types/project';
import {hasCustomMetricsExtractionRules} from 'sentry/utils/metrics/features';
import routeTitleGen from 'sentry/utils/routeTitle';
import {useNavigate} from 'sentry/utils/useNavigate';
import useOrganization from 'sentry/utils/useOrganization';
import SettingsPageHeader from 'sentry/views/settings/components/settingsPageHeader';
import TextBlock from 'sentry/views/settings/components/text/textBlock';
import {
createCondition,
explodeAggregateGroup,
type FormData,
MetricsExtractionRuleForm,
} from 'sentry/views/settings/projectMetrics/metricsExtractionRuleForm';
import {useCreateMetricsExtractionRules} from 'sentry/views/settings/projectMetrics/utils/api';
const INITIAL_DATA: FormData = {
spanAttribute: null,
aggregates: ['count'],
tags: ['release', 'environment'],
conditions: [createCondition()],
};
const PAGE_TITLE = t('Configure Metric');
function ExtractMetric({project}: {project: Project}) {
const navigate = useNavigate();
const organization = useOrganization();
const createExtractionRuleMutation = useCreateMetricsExtractionRules(
organization.slug,
project.slug
);
const handleSubmit = useCallback(
(
formData: FormData,
onSubmitSuccess: (data: FormData) => void,
onSubmitError: (error: any) => void
) => {
const data = formData as FormData;
const extractionRule: MetricsExtractionRule = {
spanAttribute: data.spanAttribute!,
tags: data.tags,
aggregates: data.aggregates.flatMap(explodeAggregateGroup),
unit: 'none',
conditions: data.conditions,
};
createExtractionRuleMutation.mutate(
{
metricsExtractionRules: [extractionRule],
},
{
onSuccess: () => {
onSubmitSuccess(data);
addSuccessMessage(t('Metric extraction rule created'));
navigate(-1);
},
onError: error => {
const message = error?.responseJSON?.detail
? (error.responseJSON.detail as string)
: t('Unable to save your changes.');
onSubmitError(message);
addErrorMessage(message);
},
}
);
onSubmitSuccess(data);
},
[createExtractionRuleMutation, navigate]
);
if (!hasCustomMetricsExtractionRules(organization)) {
return {t("You don't have access to this feature")};
}
return (
{t('Configure tracking of span attributes as metrics.')}
navigate(-1)}
submitLabel={t('Confirm')}
onSubmit={handleSubmit}
requireChanges
/>
);
}
export default ExtractMetric;