跳到主要内容

Adhoc 过滤器

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

自动应用于查询

许多数据源直接支持 Adhoc 过滤器。这意味着它们会自动将过滤器应用于与您在 AdHocFiltersVariable 上指定的数据源匹配的所有查询。

步骤 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 标签过滤器表达式,并用逗号分隔。