From bb0fa4f99abd1ab616ac2f570b67e7d25ae54233 Mon Sep 17 00:00:00 2001 From: Andre Pereira Date: Fri, 19 Jan 2024 14:18:49 +0000 Subject: [PATCH] Data trails: Add datasource picker to Logs tab and disable it (#80892) * wip * Logs are now working * Remove logs tab, for now? --- .../features/trails/ActionTabs/LogsScene.tsx | 95 ++++++++++++++++--- public/app/features/trails/MetricScene.tsx | 2 - public/app/features/trails/shared.ts | 2 + 3 files changed, 86 insertions(+), 13 deletions(-) diff --git a/public/app/features/trails/ActionTabs/LogsScene.tsx b/public/app/features/trails/ActionTabs/LogsScene.tsx index 636f709272c..d223cca2222 100644 --- a/public/app/features/trails/ActionTabs/LogsScene.tsx +++ b/public/app/features/trails/ActionTabs/LogsScene.tsx @@ -1,22 +1,95 @@ -import { PanelBuilders, SceneFlexItem, SceneQueryRunner } from '@grafana/scenes'; +import React from 'react'; + +import { + DataSourceVariable, + PanelBuilders, + SceneComponentProps, + SceneFlexItem, + SceneFlexLayout, + SceneObject, + SceneObjectBase, + SceneObjectState, + SceneQueryRunner, + SceneVariableSet, + VariableValueSelectors, +} from '@grafana/scenes'; +import { Stack } from '@grafana/ui'; import { SelectMetricAction } from '../SelectMetricAction'; -import { LOGS_METRIC } from '../shared'; +import { LOGS_METRIC, VAR_LOGS_DATASOURCE, VAR_LOGS_DATASOURCE_EXPR } from '../shared'; -export function buildLogsScene() { - return new SceneFlexItem({ - $data: new SceneQueryRunner({ +interface LogsSceneState extends SceneObjectState { + initialDS?: string; + controls: SceneObject[]; + body: SceneFlexLayout; +} + +export class LogsScene extends SceneObjectBase { + public constructor(state: Partial) { + const logsQuery = new SceneQueryRunner({ + datasource: { uid: VAR_LOGS_DATASOURCE_EXPR }, queries: [ { refId: 'A', - datasource: { uid: 'gdev-loki' }, expr: '{${filters}} | logfmt', }, ], - }), - body: PanelBuilders.logs() - .setTitle('Logs') - .setHeaderActions(new SelectMetricAction({ metric: LOGS_METRIC, title: 'Open' })) - .build(), + }); + + super({ + $variables: state.$variables ?? getVariableSet(state.initialDS), + controls: state.controls ?? [new VariableValueSelectors({ layout: 'vertical' })], + body: + state.body ?? + new SceneFlexLayout({ + direction: 'column', + children: [ + new SceneFlexItem({ + body: PanelBuilders.logs() + .setTitle('Logs') + .setData(logsQuery) + .setHeaderActions(new SelectMetricAction({ metric: LOGS_METRIC, title: 'Open' })) + .build(), + }), + ], + }), + ...state, + }); + } + + static Component = ({ model }: SceneComponentProps) => { + const { controls, body } = model.useState(); + + return ( + + {controls && ( + + {controls.map((control) => ( + + ))} + + )} + + + ); + }; +} + +function getVariableSet(initialDS?: string) { + return new SceneVariableSet({ + variables: [ + new DataSourceVariable({ + name: VAR_LOGS_DATASOURCE, + label: 'Logs data source', + value: initialDS, + pluginId: 'loki', + }), + ], + }); +} + +export function buildLogsScene() { + return new SceneFlexItem({ + body: new LogsScene({}), }); } diff --git a/public/app/features/trails/MetricScene.tsx b/public/app/features/trails/MetricScene.tsx index 2bf780320cb..951897e2aa2 100644 --- a/public/app/features/trails/MetricScene.tsx +++ b/public/app/features/trails/MetricScene.tsx @@ -18,7 +18,6 @@ import { import { ToolbarButton, Box, Stack, Icon, TabsBar, Tab, useStyles2 } from '@grafana/ui'; import { buildBreakdownActionScene } from './ActionTabs/BreakdownScene'; -import { buildLogsScene } from './ActionTabs/LogsScene'; import { buildMetricOverviewScene } from './ActionTabs/MetricOverviewScene'; import { buildRelatedMetricsScene } from './ActionTabs/RelatedMetricsScene'; import { getAutoQueriesForMetric } from './AutomaticMetricQueries/AutoQueryEngine'; @@ -104,7 +103,6 @@ export class MetricScene extends SceneObjectBase { const actionViewsDefinitions: ActionViewDefinition[] = [ { displayName: 'Overview', value: 'overview', getScene: buildMetricOverviewScene }, { displayName: 'Breakdown', value: 'breakdown', getScene: buildBreakdownActionScene }, - { displayName: 'Logs', value: 'logs', getScene: buildLogsScene }, { displayName: 'Related metrics', value: 'related', getScene: buildRelatedMetricsScene }, ]; diff --git a/public/app/features/trails/shared.ts b/public/app/features/trails/shared.ts index 8854ad44df8..f37f30430dc 100644 --- a/public/app/features/trails/shared.ts +++ b/public/app/features/trails/shared.ts @@ -20,6 +20,8 @@ export const VAR_GROUP_BY = 'groupby'; export const VAR_GROUP_BY_EXP = '${groupby}'; export const VAR_DATASOURCE = 'ds'; export const VAR_DATASOURCE_EXPR = '${ds}'; +export const VAR_LOGS_DATASOURCE = 'logsDs'; +export const VAR_LOGS_DATASOURCE_EXPR = '${logsDs}'; export const LOGS_METRIC = '$__logs__'; export const KEY_SQR_METRIC_VIZ_QUERY = 'sqr-metric-viz-query';