diff --git a/static/app/views/detectors/components/forms/metric/visualize.tsx b/static/app/views/detectors/components/forms/metric/visualize.tsx
index 16bb8bd8925774..57f3f245e31e52 100644
--- a/static/app/views/detectors/components/forms/metric/visualize.tsx
+++ b/static/app/views/detectors/components/forms/metric/visualize.tsx
@@ -15,6 +15,8 @@ import {parseFunction} from 'sentry/utils/discover/fields';
import {
AggregationKey,
ALLOWED_EXPLORE_VISUALIZE_AGGREGATES,
+ FieldValueType,
+ getFieldDefinition,
prettifyTagKey,
} from 'sentry/utils/fields';
import {unreachable} from 'sentry/utils/unreachable';
@@ -91,13 +93,27 @@ function renderTag(kind: FieldValueKind): React.ReactNode {
return {text};
}
+const LOGS_NOT_ALLOWED_AGGREGATES = [
+ AggregationKey.FAILURE_RATE,
+ AggregationKey.FAILURE_COUNT,
+];
+
+function getEAPAllowedAggregates(dataset: DetectorDataset): Array<[string, string]> {
+ return ALLOWED_EXPLORE_VISUALIZE_AGGREGATES.filter(aggregate => {
+ if (dataset === DetectorDataset.LOGS) {
+ return !LOGS_NOT_ALLOWED_AGGREGATES.includes(aggregate);
+ }
+ return true;
+ }).map(aggregate => [aggregate, aggregate]);
+}
+
function getAggregateOptions(
dataset: DetectorDataset,
tableFieldOptions: Record>
): Array<[string, string]> {
// For spans dataset, use the predefined aggregates
if (dataset === DetectorDataset.SPANS || dataset === DetectorDataset.LOGS) {
- return ALLOWED_EXPLORE_VISUALIZE_AGGREGATES.map(aggregate => [aggregate, aggregate]);
+ return getEAPAllowedAggregates(dataset);
}
// For other datasets, extract function-type options from tableFieldOptions
@@ -107,7 +123,7 @@ function getAggregateOptions(
// If no function options available, fall back to the predefined aggregates
if (functionOptions.length === 0) {
- return ALLOWED_EXPLORE_VISUALIZE_AGGREGATES.map(aggregate => [aggregate, aggregate]);
+ return getEAPAllowedAggregates(dataset);
}
return functionOptions.sort((a, b) => a[1].localeCompare(b[1]));
@@ -218,15 +234,32 @@ export function Visualize() {
const fieldOptions = useMemo(() => {
// For Spans dataset, use span-specific options from the provider
if (dataset === DetectorDataset.SPANS || dataset === DetectorDataset.LOGS) {
+ // Use field definition to determine what options should be displayed
+ const fieldDefinition = getFieldDefinition(
+ aggregate,
+ dataset === DetectorDataset.SPANS ? 'span' : 'log'
+ );
+ let isTypeAllowed = (_valueType: FieldValueType) => true;
+ if (fieldDefinition?.parameters?.[0]?.kind === 'column') {
+ const columnTypes = fieldDefinition?.parameters[0]?.columnTypes;
+ isTypeAllowed = (valueType: FieldValueType) =>
+ typeof columnTypes === 'function'
+ ? columnTypes({key: '', valueType})
+ : columnTypes.includes(valueType);
+ }
const spanColumnOptions: Array<[string, string]> = [
- ...Object.values(stringSpanTags).map((tag): [string, string] => [
- tag.key,
- prettifyTagKey(tag.name),
- ]),
- ...Object.values(numericSpanTags).map((tag): [string, string] => [
- tag.key,
- prettifyTagKey(tag.name),
- ]),
+ ...(isTypeAllowed(FieldValueType.STRING)
+ ? Object.values(stringSpanTags).map((tag): [string, string] => [
+ tag.key,
+ prettifyTagKey(tag.name),
+ ])
+ : []),
+ ...(isTypeAllowed(FieldValueType.NUMBER)
+ ? Object.values(numericSpanTags).map((tag): [string, string] => [
+ tag.key,
+ prettifyTagKey(tag.name),
+ ])
+ : []),
];
return spanColumnOptions.sort((a, b) => a[1].localeCompare(b[1]));
}
@@ -239,7 +272,7 @@ export function Visualize() {
)
.map((option): [string, string] => [option.value.meta.name, option.value.meta.name])
.sort((a, b) => a[1].localeCompare(b[1]));
- }, [dataset, stringSpanTags, numericSpanTags, aggregateOptions]);
+ }, [dataset, stringSpanTags, numericSpanTags, aggregateOptions, aggregate]);
const fieldOptionsDropdown = useMemo(() => {
return fieldOptions.map(([value, label]) => ({