Tempo: Use feature toggle to control TraceQL streaming (#72288)

Rename traceql streaming feature toggle. Remove the manual toggle from Options component and use the feature toggle
This commit is contained in:
Andre Pereira 2023-07-26 14:33:16 +01:00 committed by GitHub
parent c3d6f795ea
commit 89092a1e69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 13 additions and 43 deletions

View File

@ -124,7 +124,7 @@ Experimental features might be changed or removed without prior notice.
| `awsDatasourcesTempCredentials` | Support temporary security credentials in AWS plugins for Grafana Cloud customers | | `awsDatasourcesTempCredentials` | Support temporary security credentials in AWS plugins for Grafana Cloud customers |
| `toggleLabelsInLogsUI` | Enable toggleable filters in log details view | | `toggleLabelsInLogsUI` | Enable toggleable filters in log details view |
| `mlExpressions` | Enable support for Machine Learning in server-side expressions | | `mlExpressions` | Enable support for Machine Learning in server-side expressions |
| `disableTraceQLStreaming` | Disables the option to stream the response of TraceQL queries of the Tempo data source | | `traceQLStreaming` | Enables response streaming of TraceQL queries of the Tempo data source |
| `grafanaAPIServer` | Enable Kubernetes API Server for Grafana resources | | `grafanaAPIServer` | Enable Kubernetes API Server for Grafana resources |
| `featureToggleAdminPage` | Enable admin page for managing feature toggles from the Grafana front-end | | `featureToggleAdminPage` | Enable admin page for managing feature toggles from the Grafana front-end |
| `awsAsyncQueryCaching` | Enable caching for async queries for Redshift and Athena. Requires that the `useCachingService` feature toggle is enabled and the datasource has caching and async query support enabled | | `awsAsyncQueryCaching` | Enable caching for async queries for Redshift and Athena. Requires that the `useCachingService` feature toggle is enabled and the datasource has caching and async query support enabled |

View File

@ -110,7 +110,7 @@ export interface FeatureToggles {
transformationsRedesign?: boolean; transformationsRedesign?: boolean;
toggleLabelsInLogsUI?: boolean; toggleLabelsInLogsUI?: boolean;
mlExpressions?: boolean; mlExpressions?: boolean;
disableTraceQLStreaming?: boolean; traceQLStreaming?: boolean;
grafanaAPIServer?: boolean; grafanaAPIServer?: boolean;
featureToggleAdminPage?: boolean; featureToggleAdminPage?: boolean;
awsAsyncQueryCaching?: boolean; awsAsyncQueryCaching?: boolean;

View File

@ -51,10 +51,6 @@ export interface TempoQuery extends common.DataQuery {
* @deprecated Query traces by span name * @deprecated Query traces by span name
*/ */
spanName?: string; spanName?: string;
/**
* Use the streaming API to get partial results as they are available
*/
streaming?: boolean;
} }
export const defaultTempoQuery: Partial<TempoQuery> = { export const defaultTempoQuery: Partial<TempoQuery> = {

View File

@ -633,8 +633,8 @@ var (
Owner: grafanaAlertingSquad, Owner: grafanaAlertingSquad,
}, },
{ {
Name: "disableTraceQLStreaming", Name: "traceQLStreaming",
Description: "Disables the option to stream the response of TraceQL queries of the Tempo data source", Description: "Enables response streaming of TraceQL queries of the Tempo data source",
Stage: FeatureStageExperimental, Stage: FeatureStageExperimental,
FrontendOnly: true, FrontendOnly: true,
Owner: grafanaObservabilityTracesAndProfilingSquad, Owner: grafanaObservabilityTracesAndProfilingSquad,

View File

@ -91,7 +91,7 @@ awsDatasourcesTempCredentials,experimental,@grafana/aws-datasources,false,false,
transformationsRedesign,GA,@grafana/observability-metrics,false,false,false,true transformationsRedesign,GA,@grafana/observability-metrics,false,false,false,true
toggleLabelsInLogsUI,experimental,@grafana/observability-logs,false,false,false,true toggleLabelsInLogsUI,experimental,@grafana/observability-logs,false,false,false,true
mlExpressions,experimental,@grafana/alerting-squad,false,false,false,false mlExpressions,experimental,@grafana/alerting-squad,false,false,false,false
disableTraceQLStreaming,experimental,@grafana/observability-traces-and-profiling,false,false,false,true traceQLStreaming,experimental,@grafana/observability-traces-and-profiling,false,false,false,true
grafanaAPIServer,experimental,@grafana/grafana-app-platform-squad,false,false,false,false grafanaAPIServer,experimental,@grafana/grafana-app-platform-squad,false,false,false,false
featureToggleAdminPage,experimental,@grafana/grafana-operator-experience-squad,false,false,true,false featureToggleAdminPage,experimental,@grafana/grafana-operator-experience-squad,false,false,true,false
awsAsyncQueryCaching,experimental,@grafana/aws-datasources,false,false,false,false awsAsyncQueryCaching,experimental,@grafana/aws-datasources,false,false,false,false

1 Name Stage Owner requiresDevMode RequiresLicense RequiresRestart FrontendOnly
91 transformationsRedesign GA @grafana/observability-metrics false false false true
92 toggleLabelsInLogsUI experimental @grafana/observability-logs false false false true
93 mlExpressions experimental @grafana/alerting-squad false false false false
94 disableTraceQLStreaming traceQLStreaming experimental @grafana/observability-traces-and-profiling false false false true
95 grafanaAPIServer experimental @grafana/grafana-app-platform-squad false false false false
96 featureToggleAdminPage experimental @grafana/grafana-operator-experience-squad false false true false
97 awsAsyncQueryCaching experimental @grafana/aws-datasources false false false false

View File

@ -375,9 +375,9 @@ const (
// Enable support for Machine Learning in server-side expressions // Enable support for Machine Learning in server-side expressions
FlagMlExpressions = "mlExpressions" FlagMlExpressions = "mlExpressions"
// FlagDisableTraceQLStreaming // FlagTraceQLStreaming
// Disables the option to stream the response of TraceQL queries of the Tempo data source // Enables response streaming of TraceQL queries of the Tempo data source
FlagDisableTraceQLStreaming = "disableTraceQLStreaming" FlagTraceQLStreaming = "traceQLStreaming"
// FlagGrafanaAPIServer // FlagGrafanaAPIServer
// Enable Kubernetes API Server for Grafana resources // Enable Kubernetes API Server for Grafana resources

View File

@ -121,9 +121,6 @@ type TempoQuery struct {
// @deprecated Query traces by span name // @deprecated Query traces by span name
SpanName *string `json:"spanName,omitempty"` SpanName *string `json:"spanName,omitempty"`
// Use the streaming API to get partial results as they are available
Streaming *bool `json:"streaming,omitempty"`
} }
// TempoQueryType search = Loki search, nativeSearch = Tempo search for backwards compatibility // TempoQueryType search = Loki search, nativeSearch = Tempo search for backwards compatibility

View File

@ -44,8 +44,6 @@ composableKinds: DataQuery: {
serviceMapIncludeNamespace?: bool serviceMapIncludeNamespace?: bool
// Defines the maximum number of traces that are returned from Tempo // Defines the maximum number of traces that are returned from Tempo
limit?: int64 limit?: int64
// Use the streaming API to get partial results as they are available
streaming?: bool
filters: [...#TraceqlFilter] filters: [...#TraceqlFilter]
} @cuetsy(kind="interface") @grafana(TSVeneer="type") } @cuetsy(kind="interface") @grafana(TSVeneer="type")

View File

@ -48,10 +48,6 @@ export interface TempoQuery extends common.DataQuery {
* @deprecated Query traces by span name * @deprecated Query traces by span name
*/ */
spanName?: string; spanName?: string;
/**
* Use the streaming API to get partial results as they are available
*/
streaming?: boolean;
} }
export const defaultTempoQuery: Partial<TempoQuery> = { export const defaultTempoQuery: Partial<TempoQuery> = {

View File

@ -223,10 +223,10 @@ export class TempoDatasource extends DataSourceWithBackend<TempoQuery, TempoJson
app: options.app ?? '', app: options.app ?? '',
grafana_version: config.buildInfo.version, grafana_version: config.buildInfo.version,
query: queryValue ?? '', query: queryValue ?? '',
streaming: appliedQuery.streaming, streaming: config.featureToggles.traceQLStreaming,
}); });
if (appliedQuery.streaming) { if (config.featureToggles.traceQLStreaming) {
subQueries.push(this.handleStreamingSearch(options, targets.traceql)); subQueries.push(this.handleStreamingSearch(options, targets.traceql));
} else { } else {
subQueries.push( subQueries.push(
@ -260,10 +260,10 @@ export class TempoDatasource extends DataSourceWithBackend<TempoQuery, TempoJson
app: options.app ?? '', app: options.app ?? '',
grafana_version: config.buildInfo.version, grafana_version: config.buildInfo.version,
query: queryValue ?? '', query: queryValue ?? '',
streaming: targets.traceqlSearch[0].streaming, streaming: config.featureToggles.traceQLStreaming,
}); });
if (targets.traceqlSearch[0].streaming) { if (config.featureToggles.traceQLStreaming) {
subQueries.push(this.handleStreamingSearch(options, targets.traceqlSearch, queryValue)); subQueries.push(this.handleStreamingSearch(options, targets.traceqlSearch, queryValue));
} else { } else {
subQueries.push( subQueries.push(

View File

@ -1,8 +1,7 @@
import React from 'react'; import React from 'react';
import { EditorField, EditorRow } from '@grafana/experimental'; import { EditorField, EditorRow } from '@grafana/experimental';
import { config } from '@grafana/runtime'; import { AutoSizeInput } from '@grafana/ui';
import { AutoSizeInput, Switch } from '@grafana/ui';
import { QueryOptionGroup } from 'app/plugins/datasource/prometheus/querybuilder/shared/QueryOptionGroup'; import { QueryOptionGroup } from 'app/plugins/datasource/prometheus/querybuilder/shared/QueryOptionGroup';
import { DEFAULT_LIMIT } from '../datasource'; import { DEFAULT_LIMIT } from '../datasource';
@ -18,22 +17,11 @@ export const TempoQueryBuilderOptions = React.memo<Props>(({ onChange, query })
query.limit = DEFAULT_LIMIT; query.limit = DEFAULT_LIMIT;
} }
if (!query.hasOwnProperty('streaming')) {
query.streaming = !config.featureToggles.disableTraceQLStreaming;
}
const onLimitChange = (e: React.FormEvent<HTMLInputElement>) => { const onLimitChange = (e: React.FormEvent<HTMLInputElement>) => {
onChange({ ...query, limit: parseInt(e.currentTarget.value, 10) }); onChange({ ...query, limit: parseInt(e.currentTarget.value, 10) });
}; };
const onStreamingChange = (e: React.FormEvent<HTMLInputElement>) => {
onChange({ ...query, streaming: e.currentTarget.checked });
};
const collapsedInfoList = [`Limit: ${query.limit || DEFAULT_LIMIT}`]; const collapsedInfoList = [`Limit: ${query.limit || DEFAULT_LIMIT}`];
if (!config.featureToggles.disableTraceQLStreaming) {
collapsedInfoList.push(`Streaming: ${query.streaming ? 'Yes' : 'No'}`);
}
return ( return (
<> <>
@ -50,11 +38,6 @@ export const TempoQueryBuilderOptions = React.memo<Props>(({ onChange, query })
value={query.limit} value={query.limit}
/> />
</EditorField> </EditorField>
{!config.featureToggles.disableTraceQLStreaming && (
<EditorField label="Stream response" tooltip="Stream the query response to receive partial results sooner">
<Switch value={query.streaming || false} onChange={onStreamingChange} />
</EditorField>
)}
</QueryOptionGroup> </QueryOptionGroup>
</EditorRow> </EditorRow>
</> </>