diff --git a/docs/sources/explore/trace-integration.md b/docs/sources/explore/trace-integration.md index dad3dbf68f6..736653f0815 100644 --- a/docs/sources/explore/trace-integration.md +++ b/docs/sources/explore/trace-integration.md @@ -117,8 +117,6 @@ You can navigate from a span in a trace view directly to metrics relevant for th ### Trace to profiles -{{< docs/experimental product="Trace to profiles" featureFlag="traceToProfiles" >}} - Using Trace to profiles, you can use Grafana’s ability to correlate different signals by adding the functionality to link between traces and profiles. Refer to the [relevant documentation](/docs/grafana/latest/datasources/tempo/configure-tempo-data-source#trace-to-profiles) for configuration instructions. diff --git a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md index 77905cdde32..a2afcb03447 100644 --- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md +++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md @@ -137,8 +137,6 @@ Experimental features might be changed or removed without prior notice. | `traceQLStreaming` | Enables response streaming of TraceQL queries of the Tempo data source | | `metricsSummary` | Enables metrics summary queries in the Tempo data source | | `featureToggleAdminPage` | Enable admin page for managing feature toggles from the Grafana front-end | -| `traceToProfiles` | Enables linking between traces and profiles | -| `tracesEmbeddedFlameGraph` | Enables embedding a flame graph in traces | | `permissionsFilterRemoveSubquery` | Alternative permission filter implementation that does not use subqueries for fetching the dashboard folder | | `angularDeprecationUI` | Display new Angular deprecation-related UI features | | `sseGroupByDatasource` | Send query to the same datasource in a single request when using server side expressions. The `cloudWatchBatchQueries` feature toggle should be enabled if this used with CloudWatch. | diff --git a/docs/sources/shared/datasources/tempo-traces-to-profiles.md b/docs/sources/shared/datasources/tempo-traces-to-profiles.md index 2a2d9658158..5dd6ec9e05f 100644 --- a/docs/sources/shared/datasources/tempo-traces-to-profiles.md +++ b/docs/sources/shared/datasources/tempo-traces-to-profiles.md @@ -16,8 +16,6 @@ labels: -{{< docs/experimental product="Trace to profiles" featureFlag="traceToProfiles" >}} - Using Trace to profiles, you can use Grafana’s ability to correlate different signals by adding the functionality to link between traces and profiles. **Trace to profiles** lets you link your Grafana Pyroscope data source to tracing data. diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index 9891545e5f3..b8b42c5d003 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -108,8 +108,6 @@ export interface FeatureToggles { featureToggleAdminPage?: boolean; awsAsyncQueryCaching?: boolean; splitScopes?: boolean; - traceToProfiles?: boolean; - tracesEmbeddedFlameGraph?: boolean; permissionsFilterRemoveSubquery?: boolean; prometheusConfigOverhaulAuth?: boolean; configurableSchedulerTick?: boolean; diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index 1e907012324..fb46e3b506c 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -769,22 +769,6 @@ var ( HideFromAdminPage: true, // This is internal work to speed up dashboard search, and is not ready for wider use Created: time.Date(2023, time.July, 21, 12, 0, 0, 0, time.UTC), }, - { - Name: "traceToProfiles", - Description: "Enables linking between traces and profiles", - Stage: FeatureStageExperimental, - FrontendOnly: true, - Owner: grafanaObservabilityTracesAndProfilingSquad, - Created: time.Date(2023, time.November, 1, 12, 0, 0, 0, time.UTC), - }, - { - Name: "tracesEmbeddedFlameGraph", - Description: "Enables embedding a flame graph in traces", - Stage: FeatureStageExperimental, - FrontendOnly: true, - Owner: grafanaObservabilityTracesAndProfilingSquad, - Created: time.Date(2023, time.November, 2, 12, 0, 0, 0, time.UTC), - }, { Name: "permissionsFilterRemoveSubquery", Description: "Alternative permission filter implementation that does not use subqueries for fetching the dashboard folder", diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index ae6f790f10a..5be13229c43 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -89,8 +89,6 @@ grafanaAPIServerEnsureKubectlAccess,experimental,@grafana/grafana-app-platform-s featureToggleAdminPage,experimental,@grafana/grafana-operator-experience-squad,2023-07-18,false,false,true,false awsAsyncQueryCaching,GA,@grafana/aws-datasources,2023-07-21,false,false,false,false splitScopes,GA,@grafana/identity-access-team,2023-07-21,false,false,true,false -traceToProfiles,experimental,@grafana/observability-traces-and-profiling,2023-11-01,false,false,false,true -tracesEmbeddedFlameGraph,experimental,@grafana/observability-traces-and-profiling,2023-11-02,false,false,false,true permissionsFilterRemoveSubquery,experimental,@grafana/backend-platform,2023-08-02,false,false,false,false prometheusConfigOverhaulAuth,GA,@grafana/observability-metrics,2023-07-21,false,false,false,false configurableSchedulerTick,experimental,@grafana/alerting-squad,2023-07-26,false,false,true,false diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index 94df72a85f4..07db84fb428 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -367,14 +367,6 @@ const ( // Support faster dashboard and folder search by splitting permission scopes into parts FlagSplitScopes = "splitScopes" - // FlagTraceToProfiles - // Enables linking between traces and profiles - FlagTraceToProfiles = "traceToProfiles" - - // FlagTracesEmbeddedFlameGraph - // Enables embedding a flame graph in traces - FlagTracesEmbeddedFlameGraph = "tracesEmbeddedFlameGraph" - // FlagPermissionsFilterRemoveSubquery // Alternative permission filter implementation that does not use subqueries for fetching the dashboard folder FlagPermissionsFilterRemoveSubquery = "permissionsFilterRemoveSubquery" diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/SpanFlameGraph.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/SpanFlameGraph.tsx index 88351d5dcca..b8c435175b0 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/SpanFlameGraph.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/SpanFlameGraph.tsx @@ -145,7 +145,7 @@ export default function SpanFlameGraph(props: SpanFlameGraphProps) { ); useEffect(() => { - if (config.featureToggles.traceToProfiles && !Object.keys(traceFlameGraphs).includes(profileTagValue)) { + if (!Object.keys(traceFlameGraphs).includes(profileTagValue)) { let profilesDataSourceSettings: DataSourceInstanceSettings | undefined; if (traceToProfilesOptions && traceToProfilesOptions?.datasourceUid) { profilesDataSourceSettings = getDatasourceSrv().getInstanceSettings(traceToProfilesOptions.datasourceUid); diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.test.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.test.tsx index f937dcd3810..2594bdec00b 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.test.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.test.tsx @@ -20,7 +20,7 @@ import React from 'react'; import { createDataFrame, DataSourceInstanceSettings } from '@grafana/data'; import { data } from '@grafana/flamegraph'; -import { config, DataSourceSrv, setDataSourceSrv } from '@grafana/runtime'; +import { DataSourceSrv, setDataSourceSrv } from '@grafana/runtime'; import { pyroscopeProfileIdTagKey } from '../../../createSpanLink'; import traceGenerator from '../../demo/trace-generators'; @@ -242,8 +242,6 @@ describe('', () => { }); it('renders the flame graph', async () => { - config.featureToggles.tracesEmbeddedFlameGraph = true; - render(); await act(async () => { expect(screen.getByText(/16.5 Bil/)).toBeInTheDocument(); diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.tsx index abfde5fe3b6..e9dc3ba0c00 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.tsx @@ -397,19 +397,18 @@ export default function SpanDetail(props: SpanDetailProps) { createFocusSpanLink={createFocusSpanLink} /> )} - {config.featureToggles.tracesEmbeddedFlameGraph && - span.tags.some((tag) => tag.key === pyroscopeProfileIdTagKey) && ( - - )} + {span.tags.some((tag) => tag.key === pyroscopeProfileIdTagKey) && ( + + )} {/* TODO: fix keyboard a11y */} {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */} diff --git a/public/app/features/explore/TraceView/createSpanLink.test.ts b/public/app/features/explore/TraceView/createSpanLink.test.ts index a40e81e00e7..9c0c81fa9fe 100644 --- a/public/app/features/explore/TraceView/createSpanLink.test.ts +++ b/public/app/features/explore/TraceView/createSpanLink.test.ts @@ -8,7 +8,7 @@ import { DataFrame, } from '@grafana/data'; import { TraceToLogsOptionsV2, TraceToMetricsOptions } from '@grafana/o11y-ds-frontend'; -import { config, DataSourceSrv, setDataSourceSrv, setTemplateSrv } from '@grafana/runtime'; +import { DataSourceSrv, setDataSourceSrv, setTemplateSrv } from '@grafana/runtime'; import { DatasourceSrv } from 'app/features/plugins/datasource_srv'; import { LinkSrv, setLinkSrv } from '../../panel/panellinks/link_srv'; @@ -1280,7 +1280,6 @@ describe('createSpanLinkFactory', () => { setLinkSrv(new LinkSrv()); setTemplateSrv(new TemplateSrv()); - config.featureToggles.traceToProfiles = true; }); it('with default keys when tags not configured', () => { diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryOptions.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryOptions.tsx index b31b6d42281..7db169674b8 100644 --- a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryOptions.tsx +++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryOptions.tsx @@ -2,7 +2,6 @@ import { css } from '@emotion/css'; import React from 'react'; import { CoreApp, GrafanaTheme2, SelectableValue } from '@grafana/data'; -import { config } from '@grafana/runtime'; import { useStyles2, RadioButtonGroup, MultiSelect, Input } from '@grafana/ui'; import { Query } from '../types'; @@ -87,21 +86,19 @@ export function QueryOptions({ query, onQueryChange, app, labels }: Props) { }} /> - {config.featureToggles.traceToProfiles && ( - Sets the span ID from which to search for profiles.}> - ) => { - onQueryChange({ - ...query, - spanSelector: event.currentTarget.value !== '' ? [event.currentTarget.value] : [], - }); - }} - /> - - )} + Sets the span ID from which to search for profiles.}> + ) => { + onQueryChange({ + ...query, + spanSelector: event.currentTarget.value !== '' ? [event.currentTarget.value] : [], + }); + }} + /> + Sets the maximum number of nodes to return in the flamegraph.}> { ) : null} - {config.featureToggles.traceToProfiles && ( - <> - - - - )} + + + | undefined; - if (traceToProfilesOptions?.datasourceUid) { - profilesDataSourceSettings = getDataSourceSrv().getInstanceSettings(traceToProfilesOptions.datasourceUid); - } + const traceToProfilesData: TraceToProfilesData | undefined = instanceSettings?.jsonData; + const traceToProfilesOptions = traceToProfilesData?.tracesToProfiles; + let profilesDataSourceSettings: DataSourceInstanceSettings | undefined; + if (traceToProfilesOptions?.datasourceUid) { + profilesDataSourceSettings = getDataSourceSrv().getInstanceSettings(traceToProfilesOptions.datasourceUid); + } - if (traceToProfilesOptions && profilesDataSourceSettings) { - const customQuery = traceToProfilesOptions.customQuery ? traceToProfilesOptions.query : undefined; - const dataLink: DataLink = { - title: RelatedProfilesTitle, - url: '', - internal: { - datasourceUid: profilesDataSourceSettings.uid, - datasourceName: profilesDataSourceSettings.name, - query: { - labelSelector: customQuery ? customQuery : '{${__tags}}', - groupBy: [], - profileTypeId: traceToProfilesOptions.profileTypeId ?? '', - queryType: 'profile', - spanSelector: ['${__span.tags["pyroscope.profile.id"]}'], - refId: 'profile', - }, + if (traceToProfilesOptions && profilesDataSourceSettings) { + const customQuery = traceToProfilesOptions.customQuery ? traceToProfilesOptions.query : undefined; + const dataLink: DataLink = { + title: RelatedProfilesTitle, + url: '', + internal: { + datasourceUid: profilesDataSourceSettings.uid, + datasourceName: profilesDataSourceSettings.name, + query: { + labelSelector: customQuery ? customQuery : '{${__tags}}', + groupBy: [], + profileTypeId: traceToProfilesOptions.profileTypeId ?? '', + queryType: 'profile', + spanSelector: ['${__span.tags["pyroscope.profile.id"]}'], + refId: 'profile', }, - origin: DataLinkConfigOrigin.Datasource, - }; + }, + origin: DataLinkConfigOrigin.Datasource, + }; - frame.fields.forEach((field: Field) => { - if (field.name === 'tags') { - field.config.links = [dataLink]; - } - }); - } + frame.fields.forEach((field: Field) => { + if (field.name === 'tags') { + field.config.links = [dataLink]; + } + }); } let data = [...response.data];