临时过滤器
临时过滤器提供了一种非常强大的方式来动态更改场景视图中查询的范围或过滤。与通常控制预定义标签或维度的变量不同,使用临时过滤器,用户可以控制要过滤的键(标签)。
自动应用于查询
临时过滤器直接受许多数据源的支持。这意味着它们会自动处理将过滤器应用于所有与您在AdHocFiltersVariable
上指定的数据源 UID 相匹配的查询。
步骤 1. 创建 AdHocFiltersVariable
首先定义AdHocFiltersVariable
。
const filtersVar = new AdHocFiltersVariable({
name: 'Filters',
datasource: {
type: 'prometheus',
uid: '<PROVIDE_GRAFANA_DS_UID>',
},
// You don't need to set baseFilters, but they're useful if you want to limit label suggestions to only those you deem relevant for the scene.
// These are not shown in the UI.
baseFilters: [{ key: '__name__', operator: '=', value: 'ALERTS', condition: '' }],
// If you want to have any default filters added by default, you can specify those here.
filters: []
});
接下来,将此filtersVar
添加到场景变量集的变量数组中。
示例
const scene = new EmbeddedScene({
$variables: new SceneVariableSet({ variables: [filterVar] }),
...
});
自动模式的工作原理
AdHocFiltersVariable
的行为由applyMode
选项控制。当设置为auto
(默认值)时,任何对任何过滤器的更改都会自动重新触发场景中所有配置了与AdHocFiltersVariable
相同数据源 UID 的SceneQueryRunners
。数据源实现将处理修改所有查询以包含当前过滤器。
自定义标签和值建议
默认情况下,标签(标签)建议将来自数据源的getTagKeys
实现。在获取建议时,您应该考虑现有的过滤器和baseFilters
,以便过滤器还可以影响其他过滤器的建议标签和值。其他过滤器被考虑在内的这种行为是新的,并非所有数据源都支持它。
值从数据源的getTagValues
实现中获取。标签键和标签值都可以使用两个状态属性进行自定义:getTagKeysProvider
和getTagValuesProvider
。
示例
const filterSet = new AdHocFiltersVariable({
name: 'Filters',
datasource: {
type: 'prometheus',
uid: '<PROVIDE_GRAFANA_DS_UID>',
},
getTagKeysProvider: () => {
return Promise.resolve({
replace: true,
values: [
{ text: 'service_namespace', value: 'service_namespace' },
{ text: 'technology', value: 'technology' },
]
});
},
getTagValuesProvider: (set: AdHocFilterSet, filter: AdHocVariableFilter) => {
// Customize value look up
return Promise.resolve({ replace: false, values: [] });
},
});
使用这两个函数,您可以完全自定义键和值查找。使用返回对象上的replace
属性,您可以控制结果是否应替换默认实现(结果),或者是否应使用例如来自另一个数据源的键/标签来扩展默认结果。
手动模式
如果您不希望将过滤器应用于与AdHocFiltersVariable
相同数据源的所有查询,并且想要更多地控制将过滤器应用于哪些查询,您可以将applyMode
设置为manual
,然后根据需要使用过滤器。例如,您可以订阅AdHocFiltersVariable
状态,然后使用过滤器以某种有趣的方式修改场景。
作为查询表达式中普通变量的过滤器的另一种方式。
示例
$variables: new SceneVariableSet({
variables: [
new AdHocFiltersVariable({
name: 'filters',
applyMode: 'manual',
datasource: { uid: 'gdev-prometheus' },
filters: [{ key: 'job', operator: '=', value: 'grafana', condition: '' }],
}),
],
}),
使用此变量,您现在可以通过将其用作普通变量来轻松地在特定查询中使用过滤器。
示例
new SceneQueryRunner({
datasource: { uid: 'gdev-prometheus' },
queries: [
{
refId: 'A',
expr: 'ALERTS{$filters}',
format: 'table',
instant: true,
},
],
})
此类配置的查询包含变量表达式$filters
。您可以更改变量的名称。默认情况下,AdHocFiltersVariable
将渲染过滤器到以逗号分隔的有效 Prometheus 标签过滤器表达式。