跳到主要内容

Adhoc 过滤器

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

自动应用于查询

许多数据源直接支持 Adhoc 过滤器。这意味着它们会自动处理将过滤器应用于与您在 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 添加到 SceneVariableSet 的变量数组中。

示例

const scene = new EmbeddedScene({
$variables: new SceneVariableSet({ variables: [filterVar] }),
...
});

自动模式的工作原理

AdHocFiltersVariable 的行为由 applyMode 选项控制。当设置为 auto(默认值)时,对任何过滤器的任何更改都将自动重新触发场景中配置了与 AdHocFiltersVariable 相同数据源 UID 的所有 SceneQueryRunners。数据源实现将处理修改所有查询以包含当前过滤器。

自定义标签和值建议

默认情况下,标签(label)建议将来自 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 标签过滤器表达式,并以逗号分隔。