+
+
+ - Altinity plugin for ClickHouse
- Amazon Athena
- Amazon Redshift
- Amazon Timestream
@@ -209,7 +214,6 @@ If you've confirmed one of these data sources work with public dashboards, let u
- Azure Data Explorer Datasource
- Azure Monitor
- CSV
- - CloudWatch
- DB2 Datasource
- Databricks
- Datadog
@@ -231,12 +235,13 @@ If you've confirmed one of these data sources work with public dashboards, let u
- OPC UA (Unified Architecture)
- Open Distro for Elasticsearch
- OpenSearch
- - Orbit
- - SAP HANA®
+ - OpenTSDB
|
+ - Orbit
+ - SAP HANA®
- Salesforce
- Sentry
- ServiceNow
diff --git a/pkg/services/publicdashboards/commands/generate_datasources/generate.go b/pkg/services/publicdashboards/commands/generate_datasources/generate.go
index 2c6f50cb39d..072fc9f21e7 100644
--- a/pkg/services/publicdashboards/commands/generate_datasources/generate.go
+++ b/pkg/services/publicdashboards/commands/generate_datasources/generate.go
@@ -12,6 +12,11 @@ import (
var grafanaDatasources = []string{expr.DatasourceType, "datasource"}
+// there are some datasources that have backend flag as true but don't call /ds/query endpoint
+var unsupportedDataSourcesMap = map[string]bool{
+ "cloudwatch": true,
+}
+
type listPluginResponse struct {
Items []struct {
Slug string `json:"slug"`
@@ -40,7 +45,7 @@ func GetCompatibleDatasources(baseUrl string) ([]string, error) {
// we only consider a datasource to be supported when alerting and backend are both true
var supported []string
for _, datasource := range datasources {
- if datasource.Alerting && datasource.Backend {
+ if datasource.Alerting && datasource.Backend && !unsupportedDataSourcesMap[datasource.Slug] {
supported = append(supported, datasource.Slug)
}
}
diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/ConfigPublicDashboard.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/ConfigPublicDashboard.tsx
index fd68bfe2f9f..8def97feb8c 100644
--- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/ConfigPublicDashboard.tsx
+++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/ConfigPublicDashboard.tsx
@@ -30,11 +30,8 @@ import { NoUpsertPermissionsAlert } from '../ModalAlerts/NoUpsertPermissionsAler
import { SaveDashboardChangesAlert } from '../ModalAlerts/SaveDashboardChangesAlert';
import { UnsupportedDataSourcesAlert } from '../ModalAlerts/UnsupportedDataSourcesAlert';
import { UnsupportedTemplateVariablesAlert } from '../ModalAlerts/UnsupportedTemplateVariablesAlert';
-import {
- dashboardHasTemplateVariables,
- generatePublicDashboardUrl,
- getUnsupportedDashboardDatasources,
-} from '../SharePublicDashboardUtils';
+import { dashboardHasTemplateVariables, generatePublicDashboardUrl } from '../SharePublicDashboardUtils';
+import { useGetUnsupportedDataSources } from '../useGetUnsupportedDataSources';
import { Configuration } from './Configuration';
import { EmailSharingConfiguration } from './EmailSharingConfiguration';
@@ -60,7 +57,8 @@ const ConfigPublicDashboard = () => {
const dashboardState = useSelector((store) => store.dashboard);
const dashboard = dashboardState.getModel()!;
const dashboardVariables = dashboard.getVariables();
- const unsupportedDataSources = getUnsupportedDashboardDatasources(dashboard.panels);
+
+ const { unsupportedDataSources } = useGetUnsupportedDataSources(dashboard);
const { data: publicDashboard, isFetching: isGetLoading } = useGetPublicDashboardQuery(dashboard.uid);
const [update, { isLoading: isUpdateLoading }] = useUpdatePublicDashboardMutation();
diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/CreatePublicDashboard/CreatePublicDashboard.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/CreatePublicDashboard/CreatePublicDashboard.tsx
index 47d19c2cfa5..7d768f751f8 100644
--- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/CreatePublicDashboard/CreatePublicDashboard.tsx
+++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/CreatePublicDashboard/CreatePublicDashboard.tsx
@@ -14,7 +14,8 @@ import { shareDashboardType } from '../../utils';
import { NoUpsertPermissionsAlert } from '../ModalAlerts/NoUpsertPermissionsAlert';
import { UnsupportedDataSourcesAlert } from '../ModalAlerts/UnsupportedDataSourcesAlert';
import { UnsupportedTemplateVariablesAlert } from '../ModalAlerts/UnsupportedTemplateVariablesAlert';
-import { dashboardHasTemplateVariables, getUnsupportedDashboardDatasources } from '../SharePublicDashboardUtils';
+import { dashboardHasTemplateVariables } from '../SharePublicDashboardUtils';
+import { useGetUnsupportedDataSources } from '../useGetUnsupportedDataSources';
import { AcknowledgeCheckboxes } from './AcknowledgeCheckboxes';
@@ -31,8 +32,8 @@ const CreatePublicDashboard = ({ isError }: { isError: boolean }) => {
const hasWritePermissions = contextSrv.hasPermission(AccessControlAction.DashboardsPublicWrite);
const dashboardState = useSelector((store) => store.dashboard);
const dashboard = dashboardState.getModel()!;
- const unsupportedDataSources = getUnsupportedDashboardDatasources(dashboard.panels);
+ const { unsupportedDataSources } = useGetUnsupportedDataSources(dashboard);
const [createPublicDashboard, { isLoading: isSaveLoading }] = useCreatePublicDashboardMutation();
const disableInputs = !hasWritePermissions || isSaveLoading || isError;
diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ModalAlerts/UnsupportedDataSourcesAlert.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ModalAlerts/UnsupportedDataSourcesAlert.tsx
index 59ab568675b..5a81e84764c 100644
--- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ModalAlerts/UnsupportedDataSourcesAlert.tsx
+++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ModalAlerts/UnsupportedDataSourcesAlert.tsx
@@ -23,7 +23,7 @@ export const UnsupportedDataSourcesAlert = ({ unsupportedDataSources }: { unsupp
sources may not function properly: {unsupportedDataSources}.
Read more about supported data sources
diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx
index 07e30e97e3b..cdf09b0bcb8 100644
--- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx
+++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.test.tsx
@@ -1,5 +1,7 @@
import { DataSourceRef, DataQuery } from '@grafana/data/src/types/query';
+import { DataSourceWithBackend } from '@grafana/runtime';
import { updateConfig } from 'app/core/config';
+import { mockDataSource } from 'app/features/alerting/unified/mocks';
import { PanelModel } from 'app/features/dashboard/state/PanelModel';
import { VariableModel } from 'app/features/variables/types';
@@ -11,6 +13,29 @@ import {
getUnsupportedDashboardDatasources,
} from './SharePublicDashboardUtils';
+const mockDS = mockDataSource({
+ name: 'mock-ds',
+ type: 'mock-ds-type',
+});
+
+jest.mock('@grafana/runtime/src/services/dataSourceSrv', () => {
+ return {
+ getDataSourceSrv: () => ({
+ get: () =>
+ Promise.resolve(
+ new DataSourceWithBackend({
+ ...mockDS,
+ meta: {
+ ...mockDS.meta,
+ alerting: true,
+ backend: true,
+ },
+ })
+ ),
+ }),
+ };
+});
+
describe('dashboardHasTemplateVariables', () => {
it('false', () => {
let variables: VariableModel[] = [];
@@ -50,7 +75,7 @@ describe('publicDashboardPersisted', () => {
});
describe('getUnsupportedDashboardDatasources', () => {
- it('itIsSupported', () => {
+ it('itIsSupported', async () => {
const pm = {
targets: [
{
@@ -65,10 +90,11 @@ describe('getUnsupportedDashboardDatasources', () => {
] as DataQuery[],
} as PanelModel;
const panelArray: PanelModel[] = [pm];
- expect(getUnsupportedDashboardDatasources(panelArray)).toEqual([]);
+ const unsupportedDataSources = await getUnsupportedDashboardDatasources(panelArray);
+ expect(unsupportedDataSources).toEqual([]);
});
- it('itIsNotSupported', () => {
+ it('itIsNotSupported', async () => {
const pm = {
targets: [
{
@@ -77,6 +103,8 @@ describe('getUnsupportedDashboardDatasources', () => {
] as DataQuery[],
} as PanelModel;
const panelArray: PanelModel[] = [pm];
- expect(getUnsupportedDashboardDatasources(panelArray)).toEqual(['blah']);
+ const unsupportedDataSources = await getUnsupportedDashboardDatasources(panelArray);
+
+ expect(unsupportedDataSources).toEqual(['blah']);
});
});
diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.ts b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.ts
index a40cce2731b..cca26eb7724 100644
--- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.ts
+++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils.ts
@@ -1,4 +1,6 @@
+import { DataSourceWithBackend } from '@grafana/runtime';
import { getConfig } from 'app/core/config';
+import { getDatasourceSrv } from 'app/features/plugins/datasource_srv';
import { VariableModel } from 'app/features/variables/types';
import { PanelModel } from '../../../state';
@@ -50,14 +52,21 @@ export const publicDashboardPersisted = (publicDashboard?: PublicDashboard): boo
/**
* Get unique datasource names from all panels that are not currently supported by public dashboards.
*/
-export const getUnsupportedDashboardDatasources = (panels: PanelModel[]): string[] => {
+export const getUnsupportedDashboardDatasources = async (panels: PanelModel[]): Promise => {
let unsupportedDS = new Set();
for (const panel of panels) {
for (const target of panel.targets) {
- let ds = target?.datasource?.type;
- if (ds && !supportedDatasources.has(ds)) {
- unsupportedDS.add(ds);
+ const dsType = target?.datasource?.type;
+ if (dsType) {
+ if (!supportedDatasources.has(dsType)) {
+ unsupportedDS.add(dsType);
+ } else {
+ const ds = await getDatasourceSrv().get(target.datasource);
+ if (!(ds instanceof DataSourceWithBackend)) {
+ unsupportedDS.add(dsType);
+ }
+ }
}
}
}
diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SupportedPubdashDatasources.ts b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SupportedPubdashDatasources.ts
index 68d73f2ab4e..10b92f939be 100644
--- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SupportedPubdashDatasources.ts
+++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SupportedPubdashDatasources.ts
@@ -2,11 +2,13 @@
export const supportedDatasources = new Set([
'__expr__',
+ 'apache-iotdb-datasource',
'aquaqanalytics-kdbbackend-datasource',
- 'cloudwatch',
+ 'axiomhq-axiom-datasource',
+ 'cnos-cnosdb-datasource',
'datasource',
'dlopes7-appdynamics-datasource',
- 'doitintl-bigquery-datasource',
+ 'dvelop-odata-datasource',
'elasticsearch',
'frser-sqlite-datasource',
'grafadruid-druid-datasource',
@@ -20,11 +22,13 @@ export const supportedDatasources = new Set([
'grafana-db2-datasource',
'grafana-dynatrace-datasource',
'grafana-es-open-distro-datasource',
+ 'grafana-falconlogscale-datasource',
'grafana-github-datasource',
'grafana-gitlab-datasource',
'grafana-honeycomb-datasource',
'grafana-iot-sitewise-datasource',
'grafana-jira-datasource',
+ 'grafana-looker-datasource',
'grafana-mock-datasource',
'grafana-mongodb-datasource',
'grafana-newrelic-datasource',
@@ -46,6 +50,7 @@ export const supportedDatasources = new Set([
'grafana-x-ray-datasource',
'graphite',
'hadesarchitect-cassandra-datasource',
+ 'influxdata-flightsql-datasource',
'influxdb',
'innius-grpc-datasource',
'kniepdennis-neo4j-datasource',
@@ -55,13 +60,19 @@ export const supportedDatasources = new Set([
'mssql',
'mysql',
'nagasudhirpulla-api-datasource',
+ 'needleinajaystack-haystack-datasource',
'opentsdb',
'postgres',
'prometheus',
+ 'quickwit-quickwit-datasource',
'redis-datasource',
'sentinelone-dataset-datasource',
+ 'sneller-sneller-datasource',
+ 'spiceai-spicexyz-datasource',
+ 'stackdriver',
'tdengine-datasource',
'vertamedia-clickhouse-datasource',
'vertica-grafana-datasource',
+ 'ydbtech-ydb-datasource',
'yesoreyeram-infinity-datasource',
]);
diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/useGetUnsupportedDataSources.ts b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/useGetUnsupportedDataSources.ts
new file mode 100644
index 00000000000..0ccbc99dbfd
--- /dev/null
+++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/useGetUnsupportedDataSources.ts
@@ -0,0 +1,21 @@
+import { useEffect, useState } from 'react';
+
+import { DashboardModel } from 'app/features/dashboard/state';
+
+import { getUnsupportedDashboardDatasources } from './SharePublicDashboardUtils';
+
+export const useGetUnsupportedDataSources = (dashboard: DashboardModel) => {
+ const [unsupportedDataSources, setUnsupportedDataSources] = useState([]);
+
+ useEffect(() => {
+ const fetchUnsupportedDataSources = async () => {
+ return await getUnsupportedDashboardDatasources(dashboard.panels);
+ };
+
+ fetchUnsupportedDataSources().then((dsList) => {
+ setUnsupportedDataSources(dsList);
+ });
+ }, [dashboard.panels]);
+
+ return { unsupportedDataSources };
+};
|