import { css } from '@emotion/css'; import React from 'react'; import { DataSourceInstanceSettings, DataSourceJsonData, DataSourcePluginOptionsEditorProps, GrafanaTheme2, updateDatasourcePluginJsonDataOption, } from '@grafana/data'; import { ConfigSection } from '@grafana/experimental'; import { Button, InlineField, InlineFieldRow, Input, useStyles2 } from '@grafana/ui'; import { DataSourcePicker } from 'app/features/datasources/components/picker/DataSourcePicker'; import { ConfigDescriptionLink } from '../ConfigDescriptionLink'; import { IntervalInput } from '../IntervalInput/IntervalInput'; import { TagMappingInput } from '../TraceToLogs/TagMappingInput'; import { getTimeShiftLabel, getTimeShiftTooltip, invalidTimeShiftError } from '../TraceToLogs/TraceToLogsSettings'; export interface TraceToMetricsOptions { datasourceUid?: string; tags?: Array<{ key: string; value: string }>; queries: TraceToMetricQuery[]; spanStartTimeShift?: string; spanEndTimeShift?: string; } export interface TraceToMetricQuery { name?: string; query?: string; } export interface TraceToMetricsData extends DataSourceJsonData { tracesToMetrics?: TraceToMetricsOptions; } interface Props extends DataSourcePluginOptionsEditorProps {} export function TraceToMetricsSettings({ options, onOptionsChange }: Props) { const styles = useStyles2(getStyles); return (
updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', { ...options.jsonData.tracesToMetrics, datasourceUid: ds.uid, }) } /> {options.jsonData.tracesToMetrics?.datasourceUid ? ( ) : null} { updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', { ...options.jsonData.tracesToMetrics, spanStartTimeShift: val, }); }} placeholder={'-2m'} isInvalidError={invalidTimeShiftError} /> { updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', { ...options.jsonData.tracesToMetrics, spanEndTimeShift: val, }); }} placeholder={'2m'} isInvalidError={invalidTimeShiftError} /> updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', { ...options.jsonData.tracesToMetrics, tags: v, }) } /> {options.jsonData.tracesToMetrics?.queries?.map((query, i) => (
{ let newQueries = options.jsonData.tracesToMetrics?.queries.slice() ?? []; newQueries[i].name = e.currentTarget.value; updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', { ...options.jsonData.tracesToMetrics, queries: newQueries, }); }} /> { const updatedQueries = (options.jsonData.tracesToMetrics?.queries ?? []).map( (traceToMetricQuery, index) => { return index === i ? { ...traceToMetricQuery, query: e.currentTarget.value } : traceToMetricQuery; } ); updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', { ...options.jsonData.tracesToMetrics, queries: updatedQueries, }); }} />
))}
); } export const TraceToMetricsSection = ({ options, onOptionsChange }: DataSourcePluginOptionsEditorProps) => { let suffix = options.type; suffix += options.type === 'tempo' ? '/configure-tempo-data-source/#trace-to-metrics' : '/#trace-to-metrics'; return ( } isCollapsible={true} isInitiallyOpen={true} > ); }; const getStyles = (theme: GrafanaTheme2) => ({ infoText: css` padding-bottom: ${theme.spacing(2)}; color: ${theme.colors.text.secondary}; `, row: css` label: row; align-items: baseline; `, queryRow: css` label: queryRow; display: flex; flex-flow: wrap; `, });