diff --git a/package.json b/package.json
index dde41b0fe6e..118d5477b93 100644
--- a/package.json
+++ b/package.json
@@ -254,7 +254,7 @@
"@grafana/aws-sdk": "0.0.44",
"@grafana/data": "workspace:*",
"@grafana/e2e-selectors": "workspace:*",
- "@grafana/experimental": "1.1.0",
+ "@grafana/experimental": "1.4.2",
"@grafana/faro-core": "1.0.2",
"@grafana/faro-web-sdk": "1.0.2",
"@grafana/google-sdk": "0.1.1",
diff --git a/public/app/core/components/ConfigDescriptionLink.tsx b/public/app/core/components/ConfigDescriptionLink.tsx
new file mode 100644
index 00000000000..c2cecc84cd9
--- /dev/null
+++ b/public/app/core/components/ConfigDescriptionLink.tsx
@@ -0,0 +1,47 @@
+import { css } from '@emotion/css';
+import React from 'react';
+
+import { GrafanaTheme2 } from '@grafana/data';
+import { useStyles2 } from '@grafana/ui';
+
+type Props = {
+ description: string;
+ suffix: string;
+ feature: string;
+};
+
+export function ConfigDescriptionLink(props: Props) {
+ const { description, suffix, feature } = props;
+ const text = `Learn more about ${feature}`;
+ const styles = useStyles2(getStyles);
+
+ return (
+
+ {description}
+
+ {text}
+
+
+ );
+}
+
+const getStyles = (theme: GrafanaTheme2) => {
+ return {
+ container: css({
+ color: theme.colors.text.secondary,
+ a: css({
+ color: theme.colors.text.link,
+ textDecoration: 'underline',
+ marginLeft: '5px',
+ '&:hover': {
+ textDecoration: 'none',
+ },
+ }),
+ }),
+ };
+};
diff --git a/public/app/core/components/Divider.tsx b/public/app/core/components/Divider.tsx
new file mode 100644
index 00000000000..7e062fd6165
--- /dev/null
+++ b/public/app/core/components/Divider.tsx
@@ -0,0 +1,25 @@
+import { css } from '@emotion/css';
+import React from 'react';
+
+import { GrafanaTheme2 } from '@grafana/data';
+import { useStyles2 } from '@grafana/ui';
+
+export const Divider = ({ hideLine = false }) => {
+ const styles = useStyles2(getStyles);
+
+ if (hideLine) {
+ return
;
+ }
+
+ return
;
+};
+
+const getStyles = (theme: GrafanaTheme2) => ({
+ divider: css`
+ margin: ${theme.spacing(4, 0)};
+ `,
+ dividerHideLine: css`
+ border: none;
+ margin: ${theme.spacing(3, 0)};
+ `,
+});
diff --git a/public/app/core/components/DocsLinkButton.tsx b/public/app/core/components/DocsLinkButton.tsx
deleted file mode 100644
index fb476deea10..00000000000
--- a/public/app/core/components/DocsLinkButton.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import React from 'react';
-
-import { LinkButton } from '@grafana/ui';
-
-type Props = {
- hrefSuffix: string;
-};
-
-export function DocsLinkButton(props: Props) {
- const { hrefSuffix } = props;
- const tooltip = 'Learn more in the Grafana docs';
-
- return (
-
- );
-}
diff --git a/public/app/core/components/NodeGraphSettings.tsx b/public/app/core/components/NodeGraphSettings.tsx
index 459beda1aeb..deaf1e62467 100644
--- a/public/app/core/components/NodeGraphSettings.tsx
+++ b/public/app/core/components/NodeGraphSettings.tsx
@@ -7,9 +7,10 @@ import {
GrafanaTheme2,
updateDatasourcePluginJsonDataOption,
} from '@grafana/data';
+import { ConfigSubSection } from '@grafana/experimental';
import { InlineField, InlineFieldRow, InlineSwitch, useStyles2 } from '@grafana/ui';
-import { DocsLinkButton } from './DocsLinkButton';
+import { ConfigDescriptionLink } from './ConfigDescriptionLink';
export interface NodeGraphOptions {
enabled?: boolean;
@@ -26,13 +27,6 @@ export function NodeGraphSettings({ options, onOptionsChange }: Props) {
return (
-
Node graph
-
-
- {`Show or hide the node graph visualization`}
-
-
-
{
+ return (
+
+ }
+ >
+
+
+ );
+};
+
const getStyles = (theme: GrafanaTheme2) => ({
infoText: css`
label: infoText;
diff --git a/public/app/core/components/TraceToLogs/TraceToLogsSettings.tsx b/public/app/core/components/TraceToLogs/TraceToLogsSettings.tsx
index 68b9c9011c1..775bae9adc8 100644
--- a/public/app/core/components/TraceToLogs/TraceToLogsSettings.tsx
+++ b/public/app/core/components/TraceToLogs/TraceToLogsSettings.tsx
@@ -1,16 +1,11 @@
import { css } from '@emotion/css';
import React, { useCallback, useMemo } from 'react';
-import {
- DataSourceJsonData,
- DataSourceInstanceSettings,
- DataSourcePluginOptionsEditorProps,
- GrafanaTheme2,
-} from '@grafana/data';
+import { DataSourceJsonData, DataSourceInstanceSettings, DataSourcePluginOptionsEditorProps } from '@grafana/data';
+import { ConfigSection } from '@grafana/experimental';
import { DataSourcePicker } from '@grafana/runtime';
-import { InlineField, InlineFieldRow, Input, useStyles2, InlineSwitch } from '@grafana/ui';
-
-import { DocsLinkButton } from '../DocsLinkButton';
+import { InlineField, InlineFieldRow, Input, InlineSwitch } from '@grafana/ui';
+import { ConfigDescriptionLink } from 'app/core/components/ConfigDescriptionLink';
import { TagMappingInput } from './TagMappingInput';
@@ -71,7 +66,6 @@ export function getTraceToLogsOptions(data?: TraceToLogsData): TraceToLogsOption
interface Props extends DataSourcePluginOptionsEditorProps {}
export function TraceToLogsSettings({ options, onOptionsChange }: Props) {
- const styles = useStyles2(getStyles);
const supportedDataSourceTypes = [
'loki',
'elasticsearch',
@@ -108,13 +102,6 @@ export function TraceToLogsSettings({ options, onOptionsChange }: Props) {
return (
-
Trace to logs
-
-
- Navigate from a trace span to the selected data source's logs
-
-
-
({
- infoText: css`
- padding-bottom: ${theme.spacing(2)};
- color: ${theme.colors.text.secondary};
- `,
-});
+export const TraceToLogsSection = ({ options, onOptionsChange }: DataSourcePluginOptionsEditorProps) => {
+ return (
+
+ }
+ isCollapsible={true}
+ isInitiallyOpen={true}
+ >
+
+
+ );
+};
diff --git a/public/app/core/components/TraceToMetrics/TraceToMetricsSettings.tsx b/public/app/core/components/TraceToMetrics/TraceToMetricsSettings.tsx
index 2e6a12662e1..52bf8a8c6c0 100644
--- a/public/app/core/components/TraceToMetrics/TraceToMetricsSettings.tsx
+++ b/public/app/core/components/TraceToMetrics/TraceToMetricsSettings.tsx
@@ -7,10 +7,11 @@ import {
GrafanaTheme2,
updateDatasourcePluginJsonDataOption,
} from '@grafana/data';
+import { ConfigSection } from '@grafana/experimental';
import { DataSourcePicker } from '@grafana/runtime';
import { Button, InlineField, InlineFieldRow, Input, useStyles2 } from '@grafana/ui';
-import { DocsLinkButton } from '../DocsLinkButton';
+import { ConfigDescriptionLink } from '../ConfigDescriptionLink';
import { TagMappingInput } from '../TraceToLogs/TagMappingInput';
export interface TraceToMetricsOptions {
@@ -37,13 +38,6 @@ export function TraceToMetricsSettings({ options, onOptionsChange }: Props) {
return (
-
Trace to metrics
-
-
- Navigate from a trace span to the selected data source's metrics
-
-
-
{
+ return (
+
+ }
+ isCollapsible={true}
+ isInitiallyOpen={true}
+ >
+
+
+ );
+};
+
const getStyles = (theme: GrafanaTheme2) => ({
infoText: css`
padding-bottom: ${theme.spacing(2)};
@@ -226,6 +239,8 @@ const getStyles = (theme: GrafanaTheme2) => ({
align-items: baseline;
`,
queryRow: css`
+ label: queryRow;
display: flex;
+ flex-flow: wrap;
`,
});
diff --git a/public/app/features/explore/TraceView/components/settings/SpanBarSettings.tsx b/public/app/features/explore/TraceView/components/settings/SpanBarSettings.tsx
index a59323f27ad..4ce04b8e60b 100644
--- a/public/app/features/explore/TraceView/components/settings/SpanBarSettings.tsx
+++ b/public/app/features/explore/TraceView/components/settings/SpanBarSettings.tsx
@@ -8,8 +8,9 @@ import {
toOption,
updateDatasourcePluginJsonDataOption,
} from '@grafana/data';
+import { ConfigSubSection } from '@grafana/experimental';
import { InlineField, InlineFieldRow, Input, Select, useStyles2 } from '@grafana/ui';
-import { DocsLinkButton } from 'app/core/components/DocsLinkButton';
+import { ConfigDescriptionLink } from 'app/core/components/ConfigDescriptionLink';
export interface SpanBarOptions {
type?: string;
@@ -32,13 +33,6 @@ export default function SpanBarSettings({ options, onOptionsChange }: Props) {
return (
-
Span bar
-
-
- Add additional info next to the service and operation on a span bar row in the trace view
-
-
-