You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL函数执行结果未在Azure Log Analytics审计日志中显示

问题描述

我想要调度运行PostgreSQL查询,让Azure Monitor基于查询结果生成自定义指标,当结果返回1时触发邮件告警。目前不清楚如何将SQL查询结果发送到Log Analytics工作区,从而通过Kusto查询语言(KQL)在Azure Monitor中自动创建自定义指标。

补充说明

我尝试创建了一个函数,并基于该函数的执行结果创建自定义指标告警规则,但遇到问题:Log Analytics工作区的审计日志未显示函数执行的返回结果。

我的函数代码

CREATE OR REPLACE FUNCTION get_partman_details()
RETURNS integer AS

$func$

DECLARE

count integer;

BEGIN

count := (SELECT count(*)::int FROM cron.job_run_details WHERE  status!='succeeded');

return count;

END

$func$  LANGUAGE plpgsql;

执行函数语句

select get_partman_details();

执行结果为1

Log Analytics工作区中的审计日志内容

LOG: AUDIT: SESSION,3,1,FUNCTION,EXECUTE,FUNCTION,public.get_partman_details,select get_partman_details();
解决方案

核心问题说明

审计日志仅记录操作事件的执行行为,不会存储查询的返回结果,因此无法直接通过审计日志获取函数的输出值来创建告警。需要通过以下方式将查询结果主动推送至Log Analytics:

方案1:用Azure Functions/逻辑应用推送结果

  1. 创建Azure Functions(或逻辑应用),配置定时触发器(比如每5分钟执行一次)。
  2. 在函数中编写代码连接PostgreSQL,执行select get_partman_details()获取结果。
  3. 调用Log Analytics数据收集API,将结果以自定义日志的形式发送到工作区,数据格式示例:
    {
        "TimeGenerated": "<当前时间戳>",
        "FailureCount": <函数返回值>
    }
    
  4. 在Log Analytics中会生成对应的自定义表(如PostgreSQLCustomMetrics_CL)。

方案2:PostgreSQL内部调度+脚本推送

  1. 使用pg_cron创建定时任务,执行包含查询和推送逻辑的脚本(比如Python脚本):
    SELECT cron.schedule('check-partman-failures', '*/5 * * * *', $$
        \! python3 /path/to/push_to_loganalytics.py
    $$);
    
  2. 在Python脚本中执行PostgreSQL查询,获取结果后调用Log Analytics API发送数据。

方案3:利用PostgreSQL诊断设置(仅Azure托管实例)

  1. 修改函数,添加RAISE NOTICE输出结果:
    CREATE OR REPLACE FUNCTION get_partman_details()
    RETURNS integer AS
    $func$
    DECLARE
    count integer;
    BEGIN
    count := (SELECT count(*)::int FROM cron.job_run_details WHERE  status!='succeeded');
    RAISE NOTICE 'Partman failure count: %', count;
    return count;
    END
    $func$  LANGUAGE plpgsql;
    
  2. 在Azure门户中开启PostgreSQL实例的诊断设置,将PostgreSQLLogs类别发送到Log Analytics工作区。
  3. 在Log Analytics中用KQL提取NOTICE中的数值:
    PostgreSQLLogs
    | where Message contains 'Partman failure count:'
    | extend FailureCount = toint(split(Message, ': ')[1])
    | where FailureCount == 1
    

创建告警规则

无论采用哪种方案,最后都需要在Azure Monitor中创建日志告警规则:

  • 选择对应的Log Analytics工作区,输入上述KQL查询。
  • 设置触发条件为“查询结果数大于0”,配置评估频率(比如每5分钟,查看过去5分钟的数据)。
  • 关联邮件通知的动作组,当满足条件时自动发送告警邮件。

内容的提问来源于stack exchange,提问作者Hieu Hoang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:05:33