diff --git a/pkg/datasource/models.go b/pkg/datasource/models.go index 493dce6..6f3cc1b 100644 --- a/pkg/datasource/models.go +++ b/pkg/datasource/models.go @@ -75,9 +75,10 @@ type QueryFilter struct { // QueryOptions model type QueryOptions struct { - ShowDisabledItems bool `json:"showDisabledItems"` - DisableDataAlignment bool `json:"disableDataAlignment"` - UseZabbixValueMapping bool `json:"useZabbixValueMapping"` + ShowDisabledItems bool `json:"showDisabledItems"` + DisableDataAlignment bool `json:"disableDataAlignment"` + UseZabbixValueMapping bool `json:"useZabbixValueMapping"` + UseTrends string `json:"useTrends"` } // QueryOptions model diff --git a/pkg/datasource/zabbix.go b/pkg/datasource/zabbix.go index 7afb908..857b874 100644 --- a/pkg/datasource/zabbix.go +++ b/pkg/datasource/zabbix.go @@ -108,7 +108,7 @@ func (ds *ZabbixDatasourceInstance) queryNumericDataForItems(ctx context.Context func (ds *ZabbixDatasourceInstance) applyDataProcessing(ctx context.Context, query *QueryModel, series []*timeseries.TimeSeriesData, DBPostProcessing bool) ([]*data.Frame, error) { consolidateBy := ds.getConsolidateBy(query) - useTrend := ds.isUseTrend(query.TimeRange) + useTrend := ds.isUseTrend(query.TimeRange, query) // Sort trend data (in some cases Zabbix API returns it unsorted) if useTrend { @@ -199,7 +199,7 @@ func (ds *ZabbixDatasourceInstance) getConsolidateBy(query *QueryModel) string { func (ds *ZabbixDatasourceInstance) getHistotyOrTrend(ctx context.Context, query *QueryModel, items []*zabbix.Item, trendValueType string) (zabbix.History, error) { timeRange := query.TimeRange - useTrend := ds.isUseTrend(timeRange) + useTrend := ds.isUseTrend(timeRange, query) if useTrend { result, err := ds.zabbix.GetTrend(ctx, items, timeRange) @@ -212,8 +212,8 @@ func (ds *ZabbixDatasourceInstance) getHistotyOrTrend(ctx context.Context, query return ds.zabbix.GetHistory(ctx, items, timeRange) } -func (ds *ZabbixDatasourceInstance) isUseTrend(timeRange backend.TimeRange) bool { - if !ds.Settings.Trends { +func (ds *ZabbixDatasourceInstance) isUseTrend(timeRange backend.TimeRange, query *QueryModel) bool { + if query.Options.UseTrends == "false" { return false } @@ -223,8 +223,7 @@ func (ds *ZabbixDatasourceInstance) isUseTrend(timeRange backend.TimeRange) bool toSec := timeRange.To.Unix() rangeSec := float64(toSec - fromSec) - if (fromSec < time.Now().Add(-trendsFrom).Unix()) || (rangeSec > trendsRange.Seconds()) { - return true - } - return false + trendTimeRange := (fromSec < time.Now().Add(-trendsFrom).Unix()) || (rangeSec > trendsRange.Seconds()) + useTrendsToggle := query.Options.UseTrends == "true" || ds.Settings.Trends + return trendTimeRange && useTrendsToggle } diff --git a/src/datasource/components/QueryEditor.tsx b/src/datasource/components/QueryEditor.tsx index aee3227..1842e4c 100644 --- a/src/datasource/components/QueryEditor.tsx +++ b/src/datasource/components/QueryEditor.tsx @@ -69,6 +69,7 @@ const getDefaultQuery: () => Partial = () => ({ skipEmptyValues: false, disableDataAlignment: false, useZabbixValueMapping: false, + useTrends: 'default', }, table: { skipEmptyValues: false, @@ -103,7 +104,9 @@ export interface ZabbixQueryEditorProps extends QueryEditorProps {} export const QueryEditor = ({ query, datasource, onChange, onRunQuery }: ZabbixQueryEditorProps) => { - query = { ...getDefaultQuery(), ...query }; + const queryDefaults = getDefaultQuery(); + query = { ...queryDefaults, ...query }; + query.options = { ...queryDefaults.options, ...query.options }; const { queryType } = query; if (queryType === c.MODE_PROBLEMS || queryType === c.MODE_TRIGGERS) { const defaults = getProblemsQueryDefaults(); diff --git a/src/datasource/components/QueryEditor/QueryOptionsEditor.tsx b/src/datasource/components/QueryEditor/QueryOptionsEditor.tsx index 76f622f..87b6d11 100644 --- a/src/datasource/components/QueryEditor/QueryOptionsEditor.tsx +++ b/src/datasource/components/QueryEditor/QueryOptionsEditor.tsx @@ -26,6 +26,12 @@ const sortOptions: Array> = [ { label: 'Severity', value: 'severity' }, ]; +const trendsOptions: Array> = [ + { label: 'Default', value: 'default' }, + { label: 'True', value: 'true' }, + { label: 'False', value: 'false' }, +]; + interface Props { queryType: string; queryOptions: ZabbixQueryOptions; @@ -93,6 +99,15 @@ export const QueryOptionsEditor = ({ queryType, queryOptions, onChange }: Props) const renderMetricOptions = () => { return ( <> + +