欢迎参与 8 月 1 日中午 11 点的线上分享,了解 GreptimeDB 联合处理指标和日志的最新方案! 👉🏻 点击加入

Skip to content
双周报
2025-3-5

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

GreptimeDB 过去两周内的社区内容更新。

内容概述

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

最近的更新内容如下:

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

社区贡献者名单

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

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

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

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

(图 1:GreptimeDB 新晋 Contributor)
(图 1:GreptimeDB 新晋 Contributor)

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

PR 亮点

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

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

sql
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 中支持 topkbottomk 函数

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

sql
mysql> CREATE TABLE cpu_user (
    ts timestamp(3) time 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 子查询的支持。一个简单的示例如下:

sql
-- 创建 metrics 表并写入数据
CREATE TABLE metrics (ts timestamp time INDEX, val double,);
INSERT INTO metrics VALUES (0, 1), (10000, 2);

-- 执行 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/

加入我们的社区

获取 Greptime 最新更新,并与其他用户讨论。

关注我们

订阅 Greptime 邮件列表,及时获得产品最新动态与相关资源。