前言
DataWorks 近期上线了数据推送功能,能够将数据库查询的数据组织后推送到各渠道 (如钉钉、飞书、企业微信及 Teams),除了能将业务数据组织后推送,也能将数据库自身提供的监控数据组织后推送,这边我们就以 Hologres 为例,定期推播 Hologres 的慢 Query、数据访问量变化等信息,帮助用户掌握 Hologres 状态。
效果图
以下为一段时间内慢 Query 的信息整理,并推送到钉群、飞书、企业微信或 Teams
以下就列出几个 Hologres 诊断 Query 并推送的例子供参考:
实践:查看制造最多慢 Query 的使用者
查询制造最多慢 Query 的使用者,也可以更改 SQL 查询前十名最多慢 Query 数的用户。
以下为 SQL 内容
-- 查出慢 query 最多的 user SELECT usename as topuser, count(1) as topuser_counts FROM hologres.hg_query_log WHERE query_start >= '${date_start}' AND query_start < '${date_end}' AND duration > 1000 group by usename order by topuser_counts desc LIMIT 1 ; -- 统计前 50 笔慢 query SELECT usename ,datname ,duration ,application_name FROM hologres.hg_query_log WHERE query_start >= '${date_start}' AND query_start < '${date_end}' AND duration > 1000 order by duration desc LIMIT 50 ;
以下为推送内容设定
修改耗时的颜色条件判断
推送设置
推送结果
实践:查询近 12 小时消耗比较高的 Query
查询最近某个时间段(如近12小时内)消耗比较高的 Query,也可以根据业务需求修改具体时间,查询目标时间段消耗比较高的Query。(Query ID 可以用来定位,并在 HoloWeb 上查询)
以下为 SQL 内容
SELECT status AS "状态", duration AS "耗时(ms)", query_start AS "开始时间", (read_bytes/1048576)::text || ' MB' AS "读取量", (memory_bytes/1048576)::text || ' MB' AS "内存", (shuffle_bytes/1048576)::text || ' MB' AS "Shuffle", (cpu_time_ms/1000)::text || ' s' AS "CPU时间", physical_reads as "读盘", query_id as "QueryID", query::char(30) FROM hologres.hg_query_log WHERE query_start >= now() - interval '12 hour' and duration > 1000 ORDER BY duration DESC, read_bytes DESC, shuffle_bytes DESC, memory_bytes DESC, cpu_time_ms DESC, physical_reads DESC LIMIT 100;
以下为推送内容设定
推送结果
实践:查看最近 3 小时内每小时的 Query 访问量和数据读取总量
查看最近 3 小时内每小时的 Query 访问量和数据读取总量,用于对比判断每个小时是否有数据量变化。
以下为 SQL 内容
SELECT date_trunc('hour', query_start) AS query_start, count(1) AS query_count, sum(read_bytes/1048576)::text || ' MB' AS read_MB, sum(cpu_time_ms/1000)::text || ' s' AS cpu_time_s FROM hologres.hg_query_log WHERE query_start >= now() - interval '3 h' GROUP BY 1;
以下为推送内容设定
推送结果
实践:查看昨日新增的 Query 数量
查看昨日新增的 Query 数量,时间区段可以更改 SQL,如改为上周、上个月等。
以下为 SQL 内容
SELECT COUNT(1) as "increse_queries" FROM ( SELECT DISTINCT t1.digest FROM hologres.hg_query_log t1 WHERE t1.query_start >= CURRENT_DATE - INTERVAL '1 day' AND t1.query_start < CURRENT_DATE AND NOT EXISTS ( SELECT 1 FROM hologres.hg_query_log t2 WHERE t2.digest = t1.digest AND t2.query_start < CURRENT_DATE - INTERVAL '1 day') AND digest IS NOT NULL ) AS a;
以下为推送内容设定
实践:查看与昨天同一时间对比过去 3 小时的数据访问量情况
查看与昨天同一时间对比过去3小时的数据访问量情况,用于判断相较于昨日是否有数据量访问变化。
以下为 SQL 内容
SELECT query_date, count(1) AS query_count, sum(read_bytes) AS read_bytes, sum(cpu_time_ms) AS cpu_time_ms FROM hologres.hg_query_log WHERE query_start >= now() - interval '180min' GROUP BY query_date UNION ALL SELECT query_date, count(1) AS query_count, sum(read_bytes) AS read_bytes, sum(cpu_time_ms) AS cpu_time_ms FROM hologres.hg_query_log WHERE query_start >= now() - interval '1d 180min' AND query_start <= now() - interval '1d' GROUP BY query_date;
以下为推送内容设定
推送结果
实践:查询最近 30 分钟 Query 各阶段耗时比较高的 Query
查询最近时间段(如最近 30 分钟)Query 各阶段耗时比较高的 Query。您也可以根据业务需求修改具体时间,查询目标时间段 Query 各阶段耗时比较高的 Query。
以下为 SQL 内容
SELECT status AS "状态", duration AS "耗时(ms)", optimization_cost AS "优化耗时(ms)", start_query_cost AS "启动耗时(ms)", get_next_cost AS "执行耗时(ms)", duration - optimization_cost - start_query_cost - get_next_cost AS "其他耗时(ms)", query_id AS "QueryID" FROM hologres.hg_query_log WHERE query_start >= now() - interval '30 min' ORDER BY duration DESC, start_query_cost DESC, optimization_cost, get_next_cost DESC, duration - optimization_cost - start_query_cost - get_next_cost DESC LIMIT 100;
以下为推送内容设定
推送结果
实践:查询最先失败的 Query
查询一段时间内最先失败的 Query,可设定在系统初始化前后,帮助定位问题。
以下为 SQL 内容
SELECT status AS "状态", regexp_replace(message, '\n', ' ')::char(150) AS "报错信息", duration AS "耗时(ms)", query_start AS "开始时间", query_id AS "QueryID", query::char(100) AS "Query" FROM hologres.hg_query_log WHERE query_start BETWEEN '2024-07-10 17:00:00'::timestamptz AND '2024-07-10 17:42:00'::timestamptz + interval '2 min' AND status = 'FAILED' ORDER BY query_start ASC LIMIT 100;
以下为推送内容设定
推送结果
小结
Hologres 提供 Query Logs 查询运行的状态,能利用此数据加工后,透过 DataWorks 数据推送推至渠道。相同地,许多数据库也提供了 Logs 信息供查询,如 MySQL、PostgreSQL 等,皆能利用引擎储存的 Logs 再透过 DataWorks 数据推送推至渠道方便监控,提升引擎运行态的质量。
相关文章
数据推送功能详细介绍 https://help.aliyun.com/zh/dataworks/user-guide/push-data
数据开发工作流 + 数据推送介绍 https://help.aliyun.com/zh/dataworks/user-guide/best-practice-combining-data-push-with-data-development-workflow
使用 DataWorks 建立每日天气预报推送 https://developer.aliyun.com/article/1566970
语雀+通义千问+DataWorks,让AI定期推送每周总结 https://developer.aliyun.com/article/1566971
利用 DataWorks 数据推送定期推播 ClickHouse Query 诊断信息 https://developer.aliyun.com/article/1567458
Hologres 查看 Query Logs https://help.aliyun.com/zh/hologres/user-guide/query-and-analyze-slow-query-logs#section-4g5-hg4-dhj