Grafana: 允许模板变量值的自定义映射 -> 显示文本

创建于 2014-11-07  ·  145评论  ·  资料来源: grafana/grafana

用例:您可以基于“ID”属性存储指标,但希望模板变量选择 UI 使用更人性化的标签。 例如,您使用内部域 ID 按域跟踪指标,但希望在模板变量选择器 UI 中使用域的 URL。

@torkelo我可以在实现这一点上有所作为,你对实现有什么想法? 对于我的特定用例,我希望能够提供任意 JS 函数来执行值 -> 文本转换,因为我需要使用外部服务进行查找。 我在想初始实现可能是在定义映射函数的仪表板 JSON 中添加一个配置值。 稍后可以添加 UI 支持,以使用预先构建的映射函数(例如,正则表达式替换)来处理更简单的映射。

与此相关的还有通过 UI 编辑完整仪表板 JSON 的能力,尽管如果这被证明很困难,导出 -> 编辑 -> 导入将作为一种解决方法。

aredashboard aredashboartemplating typfeature-request

最有用的评论

@thinrope正确实施解决方法将是一个非常优雅的修复恕我直言。
如果我们可以在自定义变量中使用 JSON,或者有一个变量类型“JSON”,我们可以在没有 hack 的情况下解决这个问题,我看不出有任何缺点。

所有145条评论

您可以使用脚本仪表板来做到这一点。 但是欢迎您尝试将其实现到常规/保存的 json 仪表板中。

+1

我也可以使用至少一个更简单的版本。 类似于从 A -> B 配置的映射

在我的场景中,我想在变量下拉列表中选择一个实体名称(CustomerName1、CustomerName2 等),但在指标名称方面使用内部数字 ID。
app.requests.$customer1_ID.count

+1

从 #3138 合并

例如,当创建具有值fooBarbaz_quuxInternal的自定义模板变量时,能够让 UI 将复选框显示为“Foo bar”和“Baz”。

这在使用重复行和自定义变量来减少重复时尤其常见,但顶级指标可能对用户不友好。

也可以通过使用正则表达式(如果替换是通用的)来支持查询的模板值(例如石墨属性)。 正则表达式支持已经存在,但它适用于使用的值和标签。 仅将其用于价值将是有价值的。

例如,如果石墨查询扩展kafka.messagesByTopic.myservice_*以用于模板,那么可能希望用户界面去除前缀。 但在实际面板中使用时,应包含前缀。 这可以解决(在 Grafana 2.x 和更高版本中),因为模板变量可以嵌入到度量属性中,因此可以在所有面板和行的所有度量中硬编码前缀,但最好避免这样做。

一旦这些“标签”值存在,能够在面板内访问它们也会很有用。 例如在行和/或面板标题中嵌入变量时。 我们可以让它默认使用标签(如果嵌入在标题字段中),或者可能使用一些替代语法(例如$$Variable或其他一些)

http://play.grafana.org/dashboard/db/test?editview=template显示“变量标签”作为选项。 这个可以关闭吗?

编辑:我误解了这个错误,对不起! :) 继续。

这只是为变量使用友好名称的选项,而不是变量值

+1

+1

+1

+1

+1

+1

这是什么状态?
有可能这样做吗?

这对 3.0 决赛有可能吗?
它看起来像是许多人都在等待的功能。 包括我 :-)

+1
我通常使用对用户来说看起来很糟糕的正则表达式的一部分。

+1

+1

+1
没有这个,正则表达式在模板变量中是不可用的。

+1

+1

+1

+1

+1

+1

@mbell697 @torkelo

我已经为使用 Grafana 的内部服务实现了这一点。 由于我们对主机使用 uuid(因此主机名的更改不会丢失指标历史记录和许多其他内容),因此向用户显示这些 uuid 是不可接受的。 我为我们的用例做了一个特定的补丁,我们检测 uuid 值并使用我们应用程序的 http 端点翻译它们。 这对我们来说效果很好,但我更喜欢做一些通用且上游接受的事情。

添加指向可以执行映射的 url 的“variable_translation_url”选项是否可以接受? (如果需要,可以使用可选的授权令牌)或指向 javascript src 的 variable_translation_script 可以下载并在需要翻译的地方挂接到 templateValuesSrv.js(如果设置了该选项)?

你能分享你的 templateValuesSrv.js 代码吗? 我想试试。

@ZhuWanShan基本上就是这样:

https://github.com/sangoma/grafana/commit/fa109c23bc92c3121173579afbd87a04d7e2f523

请注意,您会在那里看到 2 种方法。 第一个是更通用的,引入了一个新的模板变量类型'http',带有一个'query'属性,指向一个HTTP url来执行映射(参见_getHttpVariableOptions)。 后来我实现了第二种方法,它检测选项文本(显示值)是否与 UUID 正则表达式匹配,并强制映射使用硬编码的 HTTP 调用返回的 /api/v1/nodes/grafana-hosts/ 的任何变量所有选项的映射。 到目前为止效果很好,只需要了解如何将其转换为通用方法即可。

+1

+1

对于任何感兴趣的人,我都可以通过使用Simple JSON Datasource插件来解决我的特定用例。

也就是说,该插件目前不支持模板变量查询,但我修复问题的拉取请求已合并到 master.xml 中。 该插件的更新 Grafana.net 版本应该会在某个时候发布。

有了它,您可以使用自定义 HTTP 端点作为 Grafana 中的数据源。 他们只需要实现 4 种方法。 当与基于查询的模板变量一起使用时,HTTP 端点将收到一个/search API 请求,并且正文将是一个 JSON 对象,格式为: { "target": "{template query content here}" } 。 您可以根据需要解析查询内容。

从端点返回值数组将创建模板变量值["custom value 1", "custom value 2"]的基础列表,格式如下: [{ "text": "custom value 1", value: 0 }]其中text属性是每个数组项的返回值value属性是返回数组中变量的索引。

或者,您可以返回一个文本/值对象数组[{ "text": "label", "value": 123 }] ,Grafana 将使用text属性作为模板变量的标签,并将value属性作为原始值模板变量。

可以将其他模板变量以正则表达式形式动态注入到查询中,并将它们动态发送到端点进行处理。

这不会解决所有的别名情况,但是拥有一个可用于模板变量的任意 HTTP 数据源,包括将其他模板变量动态注入到模板查询中是一个不错的工具。

我是人。

+1

+1

+1

+1

+1

+1

+1000

+1

+2

拥有这个将非常有用。 实际上,我有一堆同时具有名称和 uuid 的对象。 我想显示名称,但将 uuid 存储在变量中。

如果我们可以做一些类似的事情,那就太好了:

查询(现有):SHOW TAG VALUES FROM "vcd_vm" WITH KEY = "uuid" where "OrgVdc" =~ /^$vDC$/)

标签(新):SHOW TAG VALUES FROM "vcd_vm" WITH KEY = "name" where "uuid" =~ /^$tag$/)

+1

+1

+1

+1

+1

+1

+1

如果“自定义”模板变量将“值”列表和“标签”列表(本质上是自定义哈希/字典)作为输入,那就太好了

+1

+1

这对于官方 cloudwatch 导出器导出的 AWS CloudFront 数据很有用。 CloudFront 的数据按 ID 显示,无人使用。 人类查看图表更容易看到“foo.example.com; bar.example.com”而不是“EAUUWLGUQEPFWV;EVWWU9PGWIB”......

+1

首先,感谢您开发了一款很棒的产品并与全世界分享!

是否有任何迹象表明在未来几个月内实施该计划的可能性有多大? 我只是想权衡继续实施@meverett建议的解决方法或等待这个在多大程度上有意义。

通过 HTTP 端点实现这一点是对这个问题的高度概括版本的一个巧妙的解决方案,但对于这里描述的许多用例(包括我的)来说似乎有点矫枉过正,其中所需要的只是在适度数量的“友好”上的基本静态映射显示名称”->“不友好的数据库名称”对。

@svet-b fwiw,我们开始使用@meverett的建议,它既无痛又干净。 只需几个小时即可构建数据源插件。

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

@meverett的解决方法效果很好,但在与多值变量一起使用时效果不佳,因为该系列只能用(在我的情况下)influxdb 的标签进行标记。 对那里的解决方法有什么建议吗? :)

+1

+1

+1

+1

+1

大家好,由于这个问题经常遇到,我决定整理一个使用我上面的解决方案的示例 Node.js Web 应用程序。

这是非常基本的,但它完全实现了我在原始评论中提到的模式。 而且,如果您可以将查找数据放入一个不会经常更新的 JSON 文件中,那么它可能对您来说是开箱即用的。

否则,您可以将其用作起点并扩展它以从您想要的任何来源(当然由您编程)访问别名数据,并通过应用程序以 SimpleJson 数据源插件可以使用它的方式提供它它可用于驱动模板变量别名/映射。

示例 Web 应用程序的存储库在此处

希望能帮助到你。 我不时收到一些请求,要求提供更多帮助/解释来设置解决方案。

干杯

+1

+1

感谢您的临时解决方案, @meverett 。 我已经使用 Dockerfile 创建了一个存储库,用于创建一个 Docker 容器来运行您的解决方案。 它设置为在构建时从 Dockerfile 旁边获取自定义data.json 。 希望它可以帮助人们:

https://github.com/shirakaba/GrafanaSimpleJsonValueMapper-docker

+1

+1

+1

当您想对此 +1 时,请记住,您会惹恼当前订阅此问题的 74 人,并希望有人站出来实施修复。
GitHub 添加反应是有原因的……

+1

+1

+1

这会很棒! a 有一个长数值列表,但应该比值本身显示一个对每个人友好的标签
变量:myListOfLongs {名称:丰田值:122321312332,名称:雷诺值:6666666}

+1!

+1

+1
关于 #11534 的任何更新(使用重复面板/行时允许动态标题)

+1

+111111

+1

+1

+1,非常需要这个功能。

+1

+1

+1

+1

+1

这适用于 MySql 和 PostgreSQL:

另一种选择是可以创建键/值变量的查询。 查询应返回名为 __text 和 __value 的两列。 __text 列值应该是唯一的(如果它不是唯一的,则使用第一个值)。 下拉列表中的选项将具有文本和值,允许您将友好名称作为文本,将 id 作为值。 以主机名作为文本,以 id 作为值的示例查询:

SELECT hostname AS __text, id AS __value FROM my_host

http://docs.grafana.org/features/datasources/mysql/#query -variable

我建议自定义变量为:

[{
        "__text": "Server 1",
        "__value": 1
    },
    {
        "__text": "Server 2",
        "__value": 2
    }
]

也许称为 JSON 的新类型?

谢谢@johnymachine! 这与 PostgreSQL 数据源完美配合。

作为对此的扩展,有没有办法检索变量的__text部分? 这对于重复图形非常有用。

@MGinshe ,这对我来说很好用(显示文本使用值):

image

编辑:误解了这个 bug 的初始上下文,忽略下面的评论,它更适用于 #9292

@torkelo @nmaniwa

https://github.com/grafana/grafana/pull/12609似乎实现了大多数人在这里所要求的,有什么理由关闭并且从未合并?

不,那个问题是关于完全不同的东西,还是你链接到错误的问题?

还是没有这方面的消息? 加油,我们在2018年!! 谢谢!

@dmayan@johnymachine回答。 你可以使用这个。

这适用于 MySql 和 PostgreSQL:

另一种选择是可以创建键/值变量的查询。 查询应返回名为 __text 和 __value 的两列。 __text 列值应该是唯一的(如果它不是唯一的,则使用第一个值)。 下拉列表中的选项将具有文本和值,允许您将友好名称作为文本,将 id 作为值。 以主机名作为文本,以 id 作为值的示例查询:

SELECT hostname AS __text, id AS __value FROM my_host

http://docs.grafana.org/features/datasources/mysql/#query -variable

我建议自定义变量为:

[{
      "__text": "Server 1",
      "__value": 1
  },
  {
      "__text": "Server 2",
      "__value": 2
  }
]

也许称为 JSON 的新类型?

我不使用 MySQL 也不使用 PostgreSQL。 这应该是 Grafana 的一个特性。 不是
某种黑客行为。

谢谢!

El jue.,9 月 27 日。 de 2018 05:52,Muhammad Hendri [email protected]
说明:

@dmayan https://github.com/dmayan已回答。 你可以使用这个。

这适用于 MySql 和 PostgreSQL:

另一种选择是可以创建键/值变量的查询。 查询
应该返回名为 __text 和 __value 的两列。 文本
列值应该是唯一的(如果它不是唯一的,那么第一个值是
用过的)。 下拉列表中的选项将具有允许的文本和值
你有一个友好的名称作为文本和一个 id 作为值。 一个例子
以主机名作为文本和 id 作为值的查询:

从 my_host 中选择主机名作为 __text,id 作为 __value

http://docs.grafana.org/features/datasources/mysql/#query -variable

我建议自定义变量为:

[{
"__text": "服务器 1",
“__值”:1
},
{
"__text": "服务器 2",
“__值”:2
}
]

也许称为 JSON 的新类型?


你收到这个是因为你被提到了。
直接回复此邮件,在 GitHub 上查看
https://github.com/grafana/grafana/issues/1032#issuecomment-425011676
或使线程静音
https://github.com/notifications/unsubscribe-auth/AWcYqEwxjXiXE07uM0ZG-A284TghEIR2ks5ufJG4gaJpZM4C4cjS
.

非常有用的功能,如果这个功能在那里,它可以帮助我们很多。 因为石墨不能存储汉字。 所以我们在 Graphite 中必须使用英文,但是我们真的很想在 grafana 仪表盘中显示中文,这样用户体验会好很多。

希望这个功能能很快实现。

我设法通过使用两个变量来进行 ID->name 映射。 第一个变量列出所有可能的 ID(值),而第二个变量列出与 ID 匹配的名称(显示文本)。 这不是理想的或漂亮的,但它确实有效。

我认为它被称为嵌套变量。 然后您可以隐藏其中一个变量选择器。

+1

+1

@FdeFabricio你用过 InfluxDB? 更改另一个值时它会自动更新一个值吗? 如果是这样,你是怎么做到的?

@bassie1995

你用过 InfluxDB 吗?

是的

更改另一个值时它会自动更新一个值吗?

是的

如果是这样,你是怎么做到的?

您创建一个查询类型变量,该变量选择与已选择的值匹配的项目(例如SELECT "name" FROM playlists WHERE ("id" =~ /^$playlist_id$/) 。所以现在您将有两个变量:一个带有 ID,另一个带有名称。

@bassie1995 @FdeFabricio你也可以反过来做:

  • 一个可见变量,可让您选择播放列表名称(即 Girl Power)
  • 一个隐藏变量,从名称中查找播放列表 ID(类似于SELECT "id" FROM playlists WHERE ("name" =~ /^$playlist_name$/)

这样,您的用户会看到按名称选择播放列表的选项,但播放列表 ID 是隐藏的。 您仍然可以以编程方式访问播放列表 ID,以搜索播放列表项目等。

来自 PostgreSQL/MySQL 数据源的__name__value语法仍然是理想的,因为它可以防止任何 id->name 歧义,并减少所需的数据库查询数量。 它应该是 IMO 的基本功能。

我根据上面@johnymachine的评论找到了另一种解决方法。 某些数据源对此提供支持。 如果您的数据源不支持它,您可以创建一个 MySQL 数据库,在其中添加数据并编写查询以返回 __value 和 __text。 如果数据是静态的,这在我的情况下是状态(地理状态)。 对于任何想要为自定义变量定义此功能的人,我认为这是一个很好的解决方法,并且可能是一个更好的解决方案。 它允许将所有变量列表存储在 1 个位置并更轻松地更改。 唯一的缺点是它需要安装 MySQL。

从 TSDB 中选择 SingleChar 作为 __value、ShortName 作为 __text。 State

我应该添加此解决方案适用于重复的图形、重复的行以及变量是否具有多选功能。 上面使用 2 个变量来显示“Girl Power”的示例在这些情况下不起作用。

我只是在摆弄这个问题,发现了一个有点hackinsh的解决方法......
我需要一个哈希,在 Perl 表示法中写成:
Perl %units = ( 'μSv/h' => 1.0, 'mrem/h' => 0.1 );
我创建了一个仪表板变量Type : Custom , Values separated by comma : mrem/h, μSv/h然后像这样编辑JSON Model
JSON { "allValue": null, "current": { "tags": [], "text": "mrem/h", "value": "0.1" }, "hide": 0, "includeAll": false, "label": null, "multi": false, "name": "units", "options": [ { "selected": true, "text": "mrem/h", "value": "0.1" }, { "selected": false, "text": "μSv/h", "value": "1.0" } ], "query": "mrem/h, μSv/h", "skipUrlSync": false, "type": "custom" }

虽然这确实有效(一段时间),但通过 GUI 编辑仪表板会将其更改回非工作状态:-|

如果您有另一个可以提供数据的系统,则另一种解决此问题的方法:

使用 JSON 数据源插件,我正在使用: https ://grafana.com/plugins/simpod-json-datasource

在某些具有所需数据的系统中仅实施/健康检查端点和/search端点。 /search端点应返回如下所示的 JSON: [{ "text": "A Human Name", "value": "123456" }, ...]text属性将出现在变量选择下拉列表中, value将在指标查询中使用。

然后设置你的仪表板变量来查询这个新的数据源,这有点难,但你可以使用数据源的target字段来告诉后端如果你有多个数据集你想使用它应该返回什么。

对此+1。 我真的很想要一种方法来做到这一点,但不依赖于后端(我们使用石墨)。

+1 任何可行的解决方案?

@BlackRider97请看一下上面的评论 - PostgreSQL 有几种可行的解决方案(可能还有 MySQL、MSSQL 等)。

解决方案一: https ://github.com/grafana/grafana/issues/1032#issuecomment -409124505

解决方案2: https ://github.com/grafana/grafana/issues/1032#issuecomment -453242766

@thinrope正确实施解决方法将是一个非常优雅的修复恕我直言。
如果我们可以在自定义变量中使用 JSON,或者有一个变量类型“JSON”,我们可以在没有 hack 的情况下解决这个问题,我看不出有任何缺点。

+1 对此有任何更新吗?

+1

+1

这绝对是一个必须具备的功能。
我使用变量在主机名上使用正则表达式过滤一些主机。 由于我的服务器在主机名中包含模式,因此我可以使用正则表达式来获取给定组的所有服务器的列表。 我不想显示一个丑陋的正则表达式,而是显示一个漂亮的名称,例如“A 组服务器”作为下拉菜单的标签。

在自定义值中输入此值的方法可能很简单:
label1:value1, value2, label3:value3, label5:value5

标签是可选的。 如果字符串中存在: ,则:之前的所有内容都是标签,之后的所有内容都是值。
如果我们需要在标签名称或值中使用: ,我们应该有一种方法来转义它,就像我们可以为,字符做的那样。

如果您有另一个可以提供数据的系统,则另一种解决此问题的方法:

使用 JSON 数据源插件,我正在使用: https ://grafana.com/plugins/simpod-json-datasource

在某些具有所需数据的系统中仅实施/健康检查端点和/search端点。 /search端点应返回如下所示的 JSON: [{ "text": "A Human Name", "value": "123456" }, ...]text属性将出现在变量选择下拉列表中, value将在指标查询中使用。

然后设置你的仪表板变量来查询这个新的数据源,这有点难,但你可以使用数据源的target字段来告诉后端如果你有多个数据集你想使用它应该返回什么。

我做了这个实现,它对我有用,但我坚持标记趋势(传说)......我得到 id(数字)或未定义或其他一些废话。
你能建议吗?

+1

我现在也在我公司的 Grafana 中使用@mbell697描述的 JSON-hack。 但恕我直言,似乎有一个奇怪的正则表达式问题。

我设置了一个小型 python 烧瓶应用程序,它为我提供了石墨查询所需的组,我的搜索数据看起来像

@app.route('/search', methods=['POST'])
def search():
    data = [
        {"text": "fs-servers", "value": "{FS-server-1,FS-server-2,FS-server-3}"},
        {"text": "db-a-servers", "value": "{db-server-1,}"},
        {"text": "db-b-servers", "value": "{db-server-2,db-server-3}"}
    ]
    return jsonify(data)

因此,在仪表板中,我使用 json-source 创建了一个名为“group”的查询变量,然后尝试使用/fs-.*/使用正则表达式字段过滤“fs-servers”组 - 但这不起作用正如预期的那样 - 在摆弄之后,我认识到正则表达式以某种方式应用于“值”——而不是“文本”字段。 有人可能有一些解决方法或想法吗?

+1

+1

我对此的要求:

在我们的例子中,我想到了同一事物的两种变体。 我们想要的本质上是别名。 在这两种情况下,仪表板所有者都希望为用户提供一个易于最终用户理解的模板变量列表。 但是,查询中使用的值是基础值。

示例 1 - 简单的一对一名称转换。 因此,在这种情况下,我们将数字国家代码发布为度量值。 但知道一个人会记住数字代码。 所以我们要显示“美国”或“加拿大”

{“美国”==“01”}
{“加拿大”==“02”}

如果选择“加拿大”,则传递给任何查询的模板变量值为“02”

示例 2 - 是一对多映射。 在内部,我们有部署阶段,例如 s0、s1、s2、s3、s4。 然而,最终用户可以将其用作“开发、测试、产品”
所以他们想将它们映射为:

{ "开发" == ["s1"] }
{ "测试版" == ["s2", "s3"] }
{ "prod" == ["s4", "s5", "s6"] } 或者更好的 "prod" == s[456]

因此,如果选择了“prod”,则将“s4,s5,s6”传递给查询

从查询的角度来看(以示例 2 为例),其中变量名为 stageVar
并且度量标签名称是阶段:

我们没有看到太多需要 aliasBy() 之类的调用,但更多的是:
阶段=〜$ {stageVar。 值:正则表达式}
别名($stageVar.label)

按选定的模板变量值过滤结果。 当然,有人可能会尝试在 aliasBy() 函数中使用它,但如果它是一个语法错误,那很好。 我不希望您神奇地修复传递给需要单个值的函数的数组的转换。

至于映射,我认为让用户静态定义这些就足够了。
理想情况下,您可以向 MT 查询以获取需要映射的值列表,例如“01”、“02”、“03”,然后您可以轻松添加映射/别名。 未映射的值将进入“默认”存储桶。

+1

+1

我很惊讶这没有被包括在内——我花了很多时间试图弄清楚这个“显而易见”的事情是如何做到的,最终我在这里找到了发现它不存在的方法。

如上所述的动态重写的能力将非常棒。 但是,我什至对作为“自定义”字段的扩展版本的短期 hack(或永久“简单”模型)感到满意,它将选择静态映射到单选或多选结果。

我们的例子是国家代码。 我们经常希望根据地理区域而不是国家来查看系统集群。 但是我们只在 Prometheus 服务器中存储国家代码作为密钥。 所以现在,如果我想查看北美的所有系统,我必须从近 100 个国家/地区的基于查询的选项列表中手动选择 US、CA、MX。 我什至无法告诉你我花了多少时间选择欧洲、亚洲或非洲的每个国家来进行分析。 几乎值得为每个区域设置完全不同的仪表板,这很荒谬,但却是解决硬编码图表问题的唯一方法。 使用映射创建一个全新的数据库,然后进行隐藏查询似乎也非常非常不理想。

我的发烧梦:
看起来这将是一个“自定义列表”选项,作为一种可能的新型变量。 如果选中,自定义列表将开始为空,但看起来非常像今天的“自定义”模型。 将出现一个“添加”按钮。 单击“添加”将创建一个包含“显示值:”和“搜索值:”的两字段输入数组,其中每个都可以填写。“显示值”将是用户想要在选择列表中显示的任何内容 - 在我们的案例,“北美”。 然后“搜索值”将是查询中显示的内容 - 再次,在北美的这个示例中,它将是“us,ca,mx”。 在任何时候,“删除”图标(垃圾桶?)都会远程控制各个线路。 再次单击“添加”按钮将创建一个新的配对,直到用户完成他们的选项列表。 “多值”和“全选”选项将保留,类似于现有的自定义模型。

我很惊讶这没有被包括在内——我花了很多时间试图弄清楚这个“显而易见”的事情是如何做到的,最终我在这里找到了发现它不存在的方法。

我通过创建 MySQL 数据库解决了这个问题,我在下拉列表中创建了一个包含我想要的项目的表,例如欧洲、北美等。在第二个字段中,我有一个正则表达式,它将匹配我想要匹配的条目。 然后将 MySQL 添加为数据源并使用它们创建变量。 这是一个 hack,但实际上效果很好。 我几乎用它来做你想做的事情。

我很欣赏这个聪明的黑客,但对我们来说这并不是一个真正的解决方案。 设置一个全新的数据库(我们根本不使用 MySQL,这意味着在操作上这是不可能的)来执行一个非常静态的简单键/值替换似乎需要跳过很多障碍。

我对此进行了更多的考虑,并且有一种比我上面描述的更优雅的方式来提供此功能。 我称之为“变量宏”。 This again looks like a Custom list, except it allows the administrator to specify that when one (or more) of these macros are selected, then the Variables named will be set, and the Values given will be appended to the existing set of values. 这将完全是一个 UI 驱动的模型,根本不会改变实际的变量概念——它只会在现有变量之上创建一个自动完成糖层。 这使其向后兼容,无需创建或集成到查询中的其他变量。

设置变量的宏将允许用户在选择它们时查看值,然后允许用户打开每个变量并查看/操作选择或数据,而不是像我之前的评论那样创建单独的变量意味着。 这会更直观。

例子:

因此,一个名为“North America - Primary Cluster”的变量宏会将我的“Country”变量设置为“us,ca,mx”,并将我的“Cluster:”变量设置为“primary”。 如果我要拉下每个命名变量(或者不拉下,如果它们被隐藏),这些设置将是可见的,因此我可以在 Country: 列表中添加或减去国家/地区,只要我没有再次触摸 Macro 变量下拉列表。

可能存在“设置前清除命名变量”的布尔值,因此如果在此宏的选择列表中进行了更改,则指定变量的任何其他设置都将被清除。 这对于您可能包含先前设置的内容并不明显的列表可能很有用。 我想如果选择了多个变量宏选项,那么如果存在特定值的竞争设置,则要检查的列表中的最后一个“获胜”; 没有办法解决这个问题。 (有争议的是,应该逐个变量指定此清除操作,但这听起来有点混乱……但是是吗?)

这又是我的假设示例,其中我有“国家”和“集群”的预先存在的变量。

变量宏名称:区域

名称 1:北美 - 主集群
设置前清除命名变量:Y
变量 1:国家
值1:我们,ca,mx
变量 2:集群
值2:初级

Name2:北欧 - 次要集群
设置前清除命名变量:Y
变量 1:国家
值 1:se,fi,no,dk,is
变量 2:集群
值2:次要

我很欣赏这个聪明的黑客,但对我们来说这并不是一个真正的解决方案。 设置一个全新的数据库(我们根本不使用 MySQL,这意味着在操作上这是不可能的)来执行一个非常静态的简单键/值替换似乎需要跳过很多障碍。

我期待你会说这样的话。 现实情况是您要求进行 hack,而此 hack 确实解决了问题,设置起来并不困难,而且将来扭转也不难。 实际上,我发现将 MySQL 放在那里非常方便,因为我们不断向其中添加新数据集,这是一个方便跟踪和更新它们的地方。 如果您考虑一下,如果您要在多个仪表板中使用这些数据集并希望集中维护它们,那么它们需要存储在某个地方。 如果您的时间序列数据库无法存储它们,那么您需要进行一些设置来存储它们。 因此,拥有 MySQL 实际上是非常有意义的。 额外的好处是它也很容易自动化 MySQL 的填充。

如果您有 PostgreSQL,则无需为映射创建实际表,您可以执行以下操作:

SELECT *
FROM
(
    VALUES
        ('London server 1', 'london_srv_1'),
        ('London server 2', 'london_srv_2'),
        ('New York server 1', 'ny_srv_1'),
        ('New York server 2', 'ny_srv_2')
) AS t (__text, __value)

但它不适用于数值:

SELECT * FROM (VALUES ('OK', '0'), ('ERROR', '1')) AS t (__text, __value)

加载仪表板时:

imagen

选择另一个参数时

imagen

选择时:OK + ERROR

imagen

如果您想要数值,则需要删除单引号,否则将其解释为文本,即

SELECT * FROM ( VALUES ( 'OK', 0), ( 'ERROR', 1) ) AS t (__text, __value)

感谢@GlennMatthys glenn 的回答,但我已经找到了问题所在。

SELECT * FROM ( VALUES ('OK', 0), ('Warning', 1), ('Critical', 2) ) AS t (__text, __value)

在以下位置配置多值:

imagen

它发生
imagen

选择 3 个状态
imagen

和多值关闭:

imagen

GlennMatthys - 您的解决方案非常完美,非常感谢

对于 MySQL,它的:
SELECT * FROM ( VALUES row('a', 1), row('b', 2) ) AS t (__text, __value)

Mariadb呢? 它对我不起作用(mariaDB 版本:10.5.5)

SELECT * FROM ( VALUES row('a', 1), row('b', 2) ) AS t (__text, __value);
ERROR 1064 (42000)..............

或者之前的那个:

SELECT * FROM ( VALUES ( 'OK', 0), ( 'Warning', 1), ('Critical', 2) ) AS t (__text, __value);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your 
MariaDB server version for the right syntax to use near '(__text, __value)' at line 1

看起来 Values 语句不再可用...

还是我做错了什么?

@radoeka对于较旧的 MariaDB/MySQL

SELECT * FROM
(
    SELECT 'London server 1' AS '__text', 'london_srv_1' AS '__value'
    UNION ALL SELECT 'London server 2', 'london_srv_2'
    UNION ALL SELECT 'New York server 1', 'ny_srv_1'
    UNION ALL SELECT 'New York server 2', 'ny_srv_2'
) AS t;

@GlennMatthys哇哇哇,反应真快! 这有效。
我以为我正在运行一个相当新版本的 mariadb,但事实并非如此(使用只有 2 个月大的 linux 发行版)。
谢谢。

Prometheus 似乎不支持此功能。

将此问题重新打开为 #27829 只能解决静态数据的问题。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

victorhooi picture victorhooi  ·  3评论

Azef1 picture Azef1  ·  3评论

jackmeagher picture jackmeagher  ·  3评论

ericuldall picture ericuldall  ·  3评论

SATHVIKRAJU picture SATHVIKRAJU  ·  3评论