即兴过滤器
即兴过滤器提供了一种非常强大的方式,可以在场景视图中动态更改查询的范围或过滤。与通常控制预定义标签或维度的变量不同,使用即兴过滤器,用户可以控制要过滤哪些键(标签)。
自动应用于查询
即兴过滤器直接由许多数据源支持。这意味着它们会自动将过滤器应用于所有与您在 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
。数据源实现将处理修改所有查询以包含当前过滤器。
自定义标签和值建议
默认情况下,标签(标签)建议将来自 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
设置为 手动
,然后按照您希望的方式使用过滤器。例如,您可以订阅 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 标签过滤器表达式,用逗号分隔。