跳至主要内容

临时过滤器

临时过滤器提供了一种非常强大的方式来动态更改场景视图中查询的范围或过滤。与通常控制预定义标签或维度的变量不同,使用临时过滤器,用户可以控制要过滤的键(标签)。

自动应用于查询

临时过滤器直接受许多数据源的支持。这意味着它们会自动处理将过滤器应用于所有与您在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实现中获取。标签键和标签值都可以使用两个状态属性进行自定义:getTagKeysProvidergetTagValuesProvider

示例

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 标签过滤器表达式。