如何使用 Kusto 在 Grafana 上执行多图时间序列

2024-01-07

嗯,我想这样做:https://grafana.com/docs/grafana/v9.0/basics/timeseries-dimensions/ https://grafana.com/docs/grafana/v9.0/basics/timeseries-dimensions/,但在 Kusto 上。

问题是我不知道我失败在哪里,独特的一点是我有以下警告:

检测到长格式时间序列,但无法从长格式转换 帧:长系列必须按要转换的时间升序排序。

重点是我的查询返回以下内容:

let test = datatable (Timestamp: datetime, Id: string, Value: dynamic)
[
  datetime(2022-11-09 11:39:25), "machineA", "True",
  datetime(2022-11-09 11:39:30), "machineA", "True",
  datetime(2022-11-09 11:39:35), "machineA", "False",
  datetime(2022-11-09 11:39:36), "machineA", "False",
  datetime(2022-11-09 11:40:03), "machineA", "True",
  datetime(2022-11-09 11:40:03), "machineA", "True",
  datetime(2022-11-09 11:40:04), "machineA", "True",
  datetime(2022-11-09 11:40:05), "machineA", "True",
  datetime(2022-11-09 11:40:25), "machineA", "False",
  datetime(2022-11-09 11:40:25), "machineA", "False",
  datetime(2022-11-09 11:40:26), "machineA", "False",
  datetime(2022-11-09 11:40:27), "machineA", "False",
  datetime(2022-11-09 11:40:37), "machineA", "True",
  datetime(2022-11-09 11:40:47), "machineA", "False",
  datetime(2022-11-09 11:40:57), "machineA", "True",
  datetime(2022-11-09 11:40:59), "machineA", "True",
  datetime(2022-11-09 11:40:25), "machineB", "True",
  datetime(2022-11-09 11:40:30), "machineB", "True",
  datetime(2022-11-09 11:40:35), "machineB", "False",
  datetime(2022-11-09 11:40:36), "machineB", "False",
  datetime(2022-11-09 11:41:03), "machineB", "True",
  datetime(2022-11-09 11:41:03), "machineB", "True",
  datetime(2022-11-09 11:41:04), "machineB", "True",
  datetime(2022-11-09 11:41:05), "machineB", "True",
  datetime(2022-11-09 11:41:25), "machineB", "False",
  datetime(2022-11-09 11:41:25), "machineB", "False",
  datetime(2022-11-09 11:41:26), "machineB", "False",
  datetime(2022-11-09 11:41:27), "machineB", "False",
  datetime(2022-11-09 11:41:37), "machineB", "True",
  datetime(2022-11-09 11:41:47), "machineB", "False",
  datetime(2022-11-09 11:41:57), "machineB", "True",
  datetime(2022-11-09 11:41:59), "machineB", "True",
  datetime(2022-11-09 11:42:25), "machineC", "True",
  datetime(2022-11-09 11:42:30), "machineC", "True",
  datetime(2022-11-09 11:42:35), "machineC", "False",
  datetime(2022-11-09 11:42:36), "machineC", "False",
  datetime(2022-11-09 11:43:03), "machineC", "True",
  datetime(2022-11-09 11:43:03), "machineC", "True",
  datetime(2022-11-09 11:43:04), "machineC", "True",
  datetime(2022-11-09 11:43:05), "machineC", "True",
  datetime(2022-11-09 11:43:25), "machineC", "False",
  datetime(2022-11-09 11:43:25), "machineC", "False",
  datetime(2022-11-09 11:43:26), "machineC", "False",
  datetime(2022-11-09 11:43:27), "machineC", "False",
  datetime(2022-11-09 11:43:37), "machineC", "True",
  datetime(2022-11-09 11:43:47), "machineC", "False",
  datetime(2022-11-09 11:43:57), "machineC", "False",
  datetime(2022-11-09 11:43:59), "machineC", "False",
];
let tiemposCicloBruto = test
    | where Timestamp > ago(100d)
    | partition hint.strategy=native by Id
    (
        order by Timestamp asc // ordenamos ascendentemente
        | extend prev_Timestamp = prev(Timestamp) // extendemos la fecha previa
        | extend prev_Value = prev(Value) // extendemos el valor previo
        | extend duration = 
        iif( // Condicion ternaria
            prev_Value == "True" and Value == "False" // Si anteriormente estaba en funcion y el valor actual es parado, cuenta como tiempo de ciclo
            or prev_Value == "True" and Value == "True", // Si el valor anterior era funcionando y el actual tambien, la maquina sigue funcionando
            Timestamp - prev_Timestamp, // Para ese caso restamos la diferencia de tiempo
            time(null) // Para el caso contrario, devolvemos nulo
        )
        | project Id, Timestamp, duration, Value, prev_Value
    );
tiemposCicloBruto // La consulta para 1d completo tarda entre 1-1.5s
| where isnotnull(duration)
| partition hint.strategy=native by Id ( // partimos por Id
    order by Timestamp asc // debe ser siempre ascendente si no pierde la logica
    | scan declare (y:timespan=time(null), x:timespan=time(null)) with ( // declaramos el scan
        step s1: true => // declaramos el paso
        x=iif(s1.Value == "True" and Value == "True", iif(isnull(s1.x), duration, s1.x)+s1.duration, time(null)), // si tenemos varios True-True consecutivos, sumamos la duracion anterior a la actual, asignandola a X
        y=iif(s1.Value=="False" and Value=="False", duration, // si tenemos el caso de que es False-False, partimos de la duracion
                iif(s1.Value=="True" and Value=="False", s1.x+duration, time(null))); // si tenemos que la maquina estaba funcionando y para, sumamos las duraciones consecutivas de mientras que estaba funcionando
    )
    | extend next_Id=next(Id)
    | extend tiempoCiclo=iif(isempty(next_Id), duration, iif(isnull(y) and prev_Value == "True" and Value=="False", duration+prev(duration), iif(isnotnull(y), y, time(null)))) / 1s // y para aquellos cambios de maquina o para aquellos donde no hubiera valor por casuistica, asignamos la duracion o la duracion+duracion previa
    | where isnotnull(tiempoCiclo) // filtramos
    | project-away prev_Value, x, y, duration, Value, next_Id
)

但我在 KQL Grafana 时间序列图上看不到这些机器分组:

至少,它应该显示与我环境中的机器一样多的内容:


答案包含在您的问题中:

检测到长格式时间序列,但无法从长帧转换:长序列必须按要转换的时间升序排序。

您需要在查询末尾添加排序。就这么简单。

...
| order by Timestamp asc

另请确保在“格式为”下拉列表中选择“时间序列”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Kusto 在 Grafana 上执行多图时间序列 的相关文章

随机推荐

  • DacPac 错误太大 - 但我的文件只有 406kb

    我正在尝试将我的数据库上传到 SQL Azure 我已创建 DCA 包并开始上传过程 但是 我立即收到以下错误 指定的 DacPac 太大 允许的最大 DacPac 大小为 5242880 字节 我不明白为什么上传文件为 406KB 时会出
  • iOS:删除 UINavigationBar 动画

    我们的应用程序有一个 UINavigationBar 上面有图像 当我们转到 推送 到另一个屏幕然后单击后退按钮时 导航栏上的图像在重新出现时似乎会从左到右进行动画处理 这有点让人分心 如何删除这个后退按钮动画 我们尝试更改 segue A
  • 抽屉导航在 Windows Phone 8.1 中有时无法工作[RT] [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用抽屉布局找到代码msdn https code msdn microsoft com windowsapps Windows
  • .NET Core 2.0 中 IServiceCollection 缺少扩展方法 AddJwtBearerAuthentication()

    我已使用以下说明将我的项目从 Core 1 1 更新到 Core 2 0https blogs msdn microsoft com webdev 2017 08 14 announcing asp net core 2 0 https b
  • 如何使用 AWS AppSync 进行无服务器开发?

    我有一个关于开发无服务器应用程序的一般性问题AWS 应用程序同步 https aws amazon com appsync 尤其 我们正在考虑为一个小项目采用无服务器 我想知道人们在创建 无服务器 应用程序时通常如何设置他们的开发环境 我已
  • 调整

    我有一个包含子菜单的菜单 它的 HTML 源代码如下所示 ul li a href Menu 1 a ul li a href Item 1 a a a li li a href Subitem 1 a ul li a href Subsu
  • 是否可以在 Typescript 中定义非空数组类型?

    我有一个数字列表 我知道这些数字永远不会为空 是否可以在 Typescript 中定义一个永远不为空的数组 我知道像这样的元组是可能的 number number 但这不起作用 因为我的数组可以是任何大小 我想我正在寻找的是NonEmpty
  • 无法计算 Vim 中的匹配数

    如何计算 Vim 中的匹配数 例如 对于文本
  • 谷歌大查询中行之间的差异

    我目前正在尝试计算谷歌大查询中行之间的差异 我实际上有一个有效的查询 SELECT id record time level lag level lag as diff FROM SELECT id record time level LA
  • Java 8 使用 Lambda 过滤数组

    我有一个double 我想在一行中过滤掉 创建一个没有的新数组 负值而不添加for循环 使用 Java 8 lambda 表达式可以实现这一点吗 在 python 中 使用生成器将是这样的 i for i in x if i gt 0 在
  • 为什么不能在类声明中使用“is_base_of”(不完整类型)?

    我完全明白为什么会这样cannot work class Base class A static assert std is base of
  • Android - getAdapterPosition() 在删除项目后返回 -1

    标题说明了一切 我有一个RecyclerView它用于动态存储值 但一次只能存储一项 该项目包含 3TextViews 当我正常添加所有项目时 它可以工作 但是当我添加 x 项目 然后删除最后一项 然后单击 提交 时 应用程序崩溃 I do
  • 正则表达式 - 将匹配的文本移动到行的前面

    我一直在使用正则表达式 在 textmate 查找和替换工具中 将我收到的值表重新格式化为 PHP 数组 我已经完成了大部分工作 但仍在为最后的改变而苦苦挣扎 当前状态 subSectors 1 Crop Animal Production
  • 从 NodeJS 查询 Oracle 数据库中的大数据集

    我目前正在开展一个工作项目 其中我有一个 Oracle 10 数据库表 其中包含约 310K 的给予或获取 10 30K 行 目标是在有角度的前端中显示这些行 但是通过 NodeJS 返回所有这些行需要花费大量时间 鉴于我是第一次使用 No
  • 仅允许访客在 WooCommerce 中结帐特定产品

    以下代码将自定义字段添加到管理产品设置 以在产品级别管理访客结账 Display Guest Checkout Field add action woocommerce product options general product dat
  • 如何在角度应用程序的故事书中加载全局scss文件?

    我正在尝试加载故事书中的自定义全局样式文件 theme default scss 虽然我的组件正在故事书中加载 但样式没有被应用 我遵循了本教程故事书官方文档 https storybook js org docs configuratio
  • 为什么VARCHAR需要长度指定?

    为什么我们总是需要指定VARCHAR length 而不是仅仅VARCHAR 无论如何它都是动态的 UPD 我特别困惑的是它是强制性的 例如在 MySQL 中 VARCHAR 的 长度 不是内容的长度 而是内容的最大长度 VARCHAR 的
  • Pandas:替换字符串列值

    我有一个 pandas 数据框 其中有一个我正在尝试格式化的成本列 基本上 替换字符串并将其标准化 因为成本值是从不同来源提取的 还有一些 NaN 这是一些示例数据 2 75 nan 4 150000 25 00 4 50 我有以下代码 用
  • 在tomcat中配置内容安全策略

    我读到了有关配置 实现 Content Security Policy 标头的信息 并且遇到了两种执行此操作的方法 使用实现 Filter 的自定义过滤器 如下所示this https stackoverflow com questions
  • 如何使用 Kusto 在 Grafana 上执行多图时间序列

    嗯 我想这样做 https grafana com docs grafana v9 0 basics timeseries dimensions https grafana com docs grafana v9 0 basics time