From b886093fe6aca28e9fedd4cebbb0182f5af2e900 Mon Sep 17 00:00:00 2001 From: Andreas Christou Date: Fri, 16 May 2025 11:53:13 +0100 Subject: [PATCH] Azure Monitor: Support request timeout configuration (#105487) Support request timeout configuration --- .../x/AzureMonitorDataQuery_types.gen.ts | 4 ++ .../kinds/dataquery/types_dataquery_gen.go | 6 +- .../components/ConfigEditor/ConfigEditor.tsx | 61 ++++++++++++++----- .../datasource/azuremonitor/dataquery.cue | 3 + .../datasource/azuremonitor/dataquery.gen.ts | 4 ++ .../grafana-azure-monitor-datasource.json | 4 +- .../datasource/azuremonitor/types/types.ts | 1 + 7 files changed, 66 insertions(+), 17 deletions(-) diff --git a/packages/grafana-schema/src/raw/composable/azuremonitor/dataquery/x/AzureMonitorDataQuery_types.gen.ts b/packages/grafana-schema/src/raw/composable/azuremonitor/dataquery/x/AzureMonitorDataQuery_types.gen.ts index f6cf395b900..86ebaea521a 100644 --- a/packages/grafana-schema/src/raw/composable/azuremonitor/dataquery/x/AzureMonitorDataQuery_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/azuremonitor/dataquery/x/AzureMonitorDataQuery_types.gen.ts @@ -66,6 +66,10 @@ export interface AzureMonitorQuery extends common.DataQuery { * Subscriptions to be queried via Azure Resource Graph. */ subscriptions?: Array; + /** + * Used to configure the HTTP request timeout + */ + timeout?: number; } export const defaultAzureMonitorQuery: Partial = { diff --git a/pkg/tsdb/azuremonitor/kinds/dataquery/types_dataquery_gen.go b/pkg/tsdb/azuremonitor/kinds/dataquery/types_dataquery_gen.go index 174199c4fd7..afe5a24272b 100644 --- a/pkg/tsdb/azuremonitor/kinds/dataquery/types_dataquery_gen.go +++ b/pkg/tsdb/azuremonitor/kinds/dataquery/types_dataquery_gen.go @@ -52,13 +52,15 @@ type AzureMonitorQuery struct { Region *string `json:"region,omitempty"` // Custom namespace used in template variable queries CustomNamespace *string `json:"customNamespace,omitempty"` + // Used only for exemplar queries from Prometheus + Query *string `json:"query,omitempty"` // For mixed data sources the selected datasource is on the query level. // For non mixed scenarios this is undefined. // TODO find a better way to do this ^ that's friendly to schema // TODO this shouldn't be unknown but DataSourceRef | null Datasource any `json:"datasource,omitempty"` - // Used only for exemplar queries from Prometheus - Query *string `json:"query,omitempty"` + // Used to configure the HTTP request timeout + Timeout *float64 `json:"timeout,omitempty"` } // NewAzureMonitorQuery creates a new AzureMonitorQuery object. diff --git a/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/ConfigEditor.tsx b/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/ConfigEditor.tsx index 9e273f101be..0db9064ee63 100644 --- a/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/ConfigEditor.tsx +++ b/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/ConfigEditor.tsx @@ -1,10 +1,10 @@ -import { PureComponent } from 'react'; +import { ChangeEvent, PureComponent } from 'react'; import { DataSourcePluginOptionsEditorProps, SelectableValue, updateDatasourcePluginOption } from '@grafana/data'; import { t } from '@grafana/i18n/internal'; import { ConfigSection, DataSourceDescription } from '@grafana/plugin-ui'; import { getBackendSrv, getTemplateSrv, isFetchError, TemplateSrv, config } from '@grafana/runtime'; -import { Alert, Divider, SecureSocksProxySettings } from '@grafana/ui'; +import { Alert, Divider, Field, Input, SecureSocksProxySettings } from '@grafana/ui'; import ResponseParser from '../../azure_monitor/response_parser'; import { @@ -100,6 +100,23 @@ export class ConfigEditor extends PureComponent { const { options, onOptionsChange } = this.props; const { error } = this.state; + const onTimeoutChange = (e: ChangeEvent) => { + if (e.currentTarget.value?.trim() === '') { + this.updateOptions((options) => ({ + ...options, + jsonData: { ...options.jsonData, timeout: undefined }, + })); + } else { + const newVal = Number(e.currentTarget.value); + if (!Number.isNaN(newVal)) { + this.updateOptions((options) => ({ + ...options, + jsonData: { ...options.jsonData, timeout: newVal }, + })); + } + } + }; + return ( <> { {error.details &&
{error.details}
} )} - {config.secureSocksDSProxyEnabled && ( - <> - - + + + + + + {config.secureSocksDSProxyEnabled && ( - - - )} + )} + + ); } diff --git a/public/app/plugins/datasource/azuremonitor/dataquery.cue b/public/app/plugins/datasource/azuremonitor/dataquery.cue index 1df469a1b2a..f17f05f7de1 100644 --- a/public/app/plugins/datasource/azuremonitor/dataquery.cue +++ b/public/app/plugins/datasource/azuremonitor/dataquery.cue @@ -59,6 +59,9 @@ composableKinds: DataQuery: { // Used only for exemplar queries from Prometheus query?: string + + // Used to configure the HTTP request timeout + timeout?: number } @cuetsy(kind="interface") @grafana(TSVeneer="type") // Defines the supported queryTypes. GrafanaTemplateVariableFn is deprecated diff --git a/public/app/plugins/datasource/azuremonitor/dataquery.gen.ts b/public/app/plugins/datasource/azuremonitor/dataquery.gen.ts index 6a78a43d056..d47e2127266 100644 --- a/public/app/plugins/datasource/azuremonitor/dataquery.gen.ts +++ b/public/app/plugins/datasource/azuremonitor/dataquery.gen.ts @@ -64,6 +64,10 @@ export interface AzureMonitorQuery extends common.DataQuery { * Subscriptions to be queried via Azure Resource Graph. */ subscriptions?: Array; + /** + * Used to configure the HTTP request timeout + */ + timeout?: number; } export const defaultAzureMonitorQuery: Partial = { diff --git a/public/app/plugins/datasource/azuremonitor/locales/en-US/grafana-azure-monitor-datasource.json b/public/app/plugins/datasource/azuremonitor/locales/en-US/grafana-azure-monitor-datasource.json index 2e1718a99ad..ed332ba2226 100644 --- a/public/app/plugins/datasource/azuremonitor/locales/en-US/grafana-azure-monitor-datasource.json +++ b/public/app/plugins/datasource/azuremonitor/locales/en-US/grafana-azure-monitor-datasource.json @@ -72,7 +72,9 @@ }, "config-editor": { "description-additional-settings": "Additional settings are optional settings that can be configured for more control over your data source. This includes Secure Socks Proxy.", - "title-additional-settings": "Additional settings" + "title-additional-settings": "Additional settings", + "title-request-timeout": "Request timeout", + "description-request-timeout": "Set the request timeout in seconds. Default is 30 seconds." }, "current-user-fallback-credentials": { "alert-fallback-credentials-disabled": "Fallback credentials have been disabled. As user-based authentication only inherently supports requests with a user in scope, features such as alerting, recorded queries, or reporting will not function as expected. Please review the <2>documentation for more details.", diff --git a/public/app/plugins/datasource/azuremonitor/types/types.ts b/public/app/plugins/datasource/azuremonitor/types/types.ts index 6601a0edb5d..34b5d6a88cd 100644 --- a/public/app/plugins/datasource/azuremonitor/types/types.ts +++ b/public/app/plugins/datasource/azuremonitor/types/types.ts @@ -41,6 +41,7 @@ export interface AzureMonitorDataSourceJsonData extends AzureDataSourceJsonData appInsightsAppId?: string; enableSecureSocksProxy?: boolean; + timeout?: number; } export interface AzureMonitorDataSourceSecureJsonData extends AzureDataSourceSecureJsonData {