暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

HyperLogLog 函数上线,PromQL 功能全面升级!|Greptime 双周精选

GreptimeDB 2025-03-06
28

内容概述

作为一个成长中的开源项目,GreptimeDB 的进展离不开来自全球的社区贡献者们,感谢各位!

最近的更新内容如下:

  • 新增大量自定义函数(UDF/UDAF)
    • 支持使用 HyperLogLog 实现近似计数
    • 新增 IP 地址相关函数,如 ipv4_string_to_num
      ipv4_num_to_string
  • PromQL 功能更新
    • 支持 PromQL 嵌套子查询
    • 支持 ignoring
      关键词忽略空列值
    • 新增 topk
      bottomk
      函数用于计算最大/最小的 k 个值
    • 新增 prom_round
      函数以支持向任意值取近似值
  • Bug 修复
    • 修复处于 Follower 状态的 Metasrv 节点处理 DDL 请求导致的报错
    • 修复 Metasrv 重启后 Flownode 无法自动恢复心跳的问题
    • 修复 Bloom Filter 在部分场景下出现地址访问越界的问题

社区贡献者名单

在过去的两周里,GreptimeDB 共合并了 80 个 PR,其中有 3 位独立贡献者,累计 5 个 PR 被成功合并,还有很多待合并的 PR 。

祝贺以下各位在过去 2 周内成为我们最突出的贡献者:

注:按照 GitHub 用户名首字母顺序排列

  • @weyert dashboard#492
  • @xiaoniaoyouhuajiang db#5587
  • @yihong0618 db#5621 db#5620 db#5561

👏 欢迎 @weyert @xiaoniaoyouhuajiang 作为新的贡献者加入到社区,并成功合并了 PR,还有更多来自其他独立贡献者的 PR 正在等待合并。

(图 1:新增贡献者)

🎉 衷心感谢我们所有的成员,贡献者和布道者们!是你们的付出让我们的项目得以成功,也是你们让 GreptimeDB 成为一个更优质的产品。让我们一起努力,建立一个更棒的社区!

PR 亮点

db#5579 新增 HyperLogLog 函数(hll
/hll_merge
/hll_count
)用于近似计数

通过 hll
函数可以通过 HyperLogLog 数据结构将某一列的值聚合为中间状态,后续可以通过 hll_merge
对不同的中间状态进行聚合,最终通过 hll_count
函数实现对不同值的数量的近似计算。一个简单的例子如下:

mysql> CREATE TABLE access_log (
    `url` STRING,
    user_id BIGINT,
    ts TIMESTAMP TIME INDEX
);

mysql> CREATE TABLE access_log_10s (
    `url` STRING,
    time_window timestamp time INDEX,
    state BINARY
);

mysql> INSERT INTO access_log VALUES
         ("/dashboard"1"2025-03-04 00:00:00"),
         ("/dashboard"1"2025-03-04 00:00:01"),
         ("/dashboard"2"2025-03-04 00:00:05"),
         ("/not_found"3"2025-03-04 00:00:11");

-- 将原始数据以 10 秒为窗口进行聚合,并对同一窗口内的 user id 计算 HyperLogLog 状态并写入 access_log_10s 聚合表
mysql> INSERT INTO
    access_log_10s
SELECT
    `url`,
    date_bin("10s" :: INTERVAL, ts) AS time_window,
    hll(`user_id`AS state
FROM
    access_log
GROUP BY
    `url`,
    time_window;

-- 最终使用 hll_count 函数对 HyperLogLog 中的数据进行近似计数
mysql> SELECT
    `url`,
    time_window,
    hll_count(state) AS approx_count
FROM
    access_log_10s;

-- 最终结果如下:
-- +------------+---------------------+--------------+
-- | url        | time_window         | approx_count |
-- +------------+---------------------+--------------+
-- | /dashboard | 2025-03-04 00:00:00 | 2            |
-- | /not_found | 2025-03-04 00:00:10 | 1            |
-- +------------+---------------------+--------------+         

复制

db#5602 在 PromQL 中支持 topk
bottomk
函数

在指标监控场景中,常常需要在指定时间窗口内计算指标值最大或者最小的若干条数据。本 PR 实现了 topk
bottomk
函数用于快速实现此功能:

mysql> CREATE TABLE cpu_user (
    ts timestamp(3time INDEX,
    host STRING,
    idc STRING,
    val FLOAT,
    PRIMARY KEY(host, idc)
);

mysql> INSERT INTO
    TABLE cpu_user
VALUES
    (0'host1'"idc1"1.0),
    (0'host2'"idc1"2.0),
    (0'host3'"idc2"3.0),
    (5000'host1'"idc1"1.0),
    (5000'host2'"idc1"4.0),
    (5000'host3'"idc2"1.0),
    (10000'host1'"idc1"3.0),
    (10000'host2'"idc1"5.0),
    (10000'host3'"idc2"3.0),
    (15000'host1'"idc1"1.0),
    (15000'host2'"idc1"2.0),
    (15000'host3'"idc2"3.0);

-- 通过 topk 函数计算每个时间窗口内指标值最高的 1 行数据
mysql> TQL EVAL (0, 15, '5s') topk(1, cpu_user);

-- 结果如下:
-- +------+-------+------+---------------------+
-- | val  | host  | idc  | ts                  |
-- +------+-------+------+---------------------+
-- |    3 | host3 | idc2 | 1970-01-01 00:00:00 |
-- |    4 | host2 | idc1 | 1970-01-01 00:00:05 |
-- |    5 | host2 | idc1 | 1970-01-01 00:00:10 |
-- |    3 | host3 | idc2 | 1970-01-01 00:00:15 |
-- +------+-------+------+---------------------+

复制

db#5606 在 PromQL 支持子查询

之前版本的 GreptimeDB 无法通过 PromQL 执行子查询(如 sum_over_time(metrics[50s:10s])
)。在本 PR  中增加了对 PromQL 子查询的支持。

一个简单的示例如下:

-- 创建 metrics 表并写入数据
CREATE TABLE metrics (ts timestamp time INDEX, val double,);
INSERT INTO metrics VALUES (01), (100002);

-- 执行 PromQL 子查询
TQL EVAL (10, 10, '1s') sum_over_time(metric_total [50s:10s]);

-- 结果如下:
-- +---------------------+----------------------------------+
-- | ts                  | prom_sum_over_time(ts_range,val) |
-- +---------------------+----------------------------------+
-- | 1970-01-01 00:00:10 |                                3 |
-- +---------------------+----------------------------------+

复制

Good First Issue

db#5613 支持函数别名

某些函数可能有多个名称,例如,ipv4_num_to_string
也被称为 inet_ntoa
。我们可以在我们的 UDF 框架和实现中支持设置函数名称别名。

  • 难度:中等
  • 关键字:UDF

关于 Greptime

Greptime 格睿科技专注于为可观测、物联网及车联网等领域提供实时、高效的数据存储和分析服务,帮助客户挖掘数据的深层价值。目前基于云原生的时序数据库 GreptimeDB 已经衍生出多款适合不同用户的解决方案,更多信息或 demo 展示请联系下方小助手(微信号:greptime)。

欢迎对开源感兴趣的朋友们参与贡献和讨论,从带有 good first issue 标签的 issue 开始你的开源之旅吧~期待在开源社群里遇见你!添加小助手微信即可加入“技术交流群”与志同道合的朋友们面对面交流哦~


Star us on GitHub Now: https://github.com/GreptimeTeam/greptimedb
官网:https://greptime.cn/
文档:https://docs.greptime.cn/
Twitter: https://twitter.com/Greptime
Slack: https://greptime.com/slack
LinkedIn: https://www.linkedin.com/company/greptime/

往期精彩文章:

点击「阅读原文」,立即体验 GreptimeDB!

文章转载自GreptimeDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论