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

如何创建Azure App Insights客户端?Oracle数据库PL/SQL日志接入需求

通过PL/SQL向Azure App Insights上报日志的方案

Azure App Insights没有官方提供PL/SQL客户端库,你可以直接调用它的Ingestion REST API来实现日志上报,以下是具体步骤和示例:

核心前提

你需要先获取Azure App Insights的两个关键信息:

  • Instrumentation Key:在App Insights资源的"概述"页面可以找到
  • Ingestion端点:通常格式为 https://<region>.in.applicationinsights.azure.com/v2/track(替换<region>为你的App Insights所在区域,比如eastus)

PL/SQL实现步骤

1. 配置数据库权限与网络访问

需要给执行PL/SQL的用户授予UTL_HTTP权限,同时确保Oracle服务器防火墙/ACL允许访问App Insights的Ingestion端点:

GRANT EXECUTE ON UTL_HTTP TO your_db_user;

2. 编写PL/SQL上报日志的过程

以下是一个基础的示例过程,用于发送跟踪日志到App Insights:

CREATE OR REPLACE PROCEDURE send_appinsights_log(
    p_instrumentation_key VARCHAR2,
    p_log_message VARCHAR2,
    p_log_level VARCHAR2 DEFAULT 'Information'
) AS
    l_http_request UTL_HTTP.REQ;
    l_http_response UTL_HTTP.RESP;
    l_ingestion_url VARCHAR2(200) := 'https://eastus.in.applicationinsights.azure.com/v2/track'; -- 替换为你的区域端点
    l_payload CLOB;
    l_current_time VARCHAR2(50);
BEGIN
    -- 生成ISO 8601 UTC格式的当前时间
    SELECT TO_CHAR(SYSTIMESTAMP AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"') 
    INTO l_current_time FROM DUAL;

    -- 构造符合App Insights格式的JSON payload
    l_payload := '[' ||
        '{' ||
            '"name": "Microsoft.ApplicationInsights.' || p_instrumentation_key || '.Trace",' ||
            '"time": "' || l_current_time || '",' ||
            '"iKey": "' || p_instrumentation_key || '",' ||
            '"tags": {' ||
                '"ai.cloud.roleInstance": "Oracle-DB",' ||
                '"ai.internal.sdkVersion": "PL/SQL-Custom/1.0"' ||
            '},' ||
            '"data": {' ||
                '"baseType": "MessageData",' ||
                '"baseData": {' ||
                    '"ver": 2,' ||
                    '"message": "' || REPLACE(p_log_message, '"', '\"') || '",' ||
                    '"severityLevel": "' || p_log_level || '"' ||
                '}' ||
            '}' ||
        '}' ||
    ']';

    -- 发送POST请求
    l_http_request := UTL_HTTP.BEGIN_REQUEST(l_ingestion_url, 'POST');
    UTL_HTTP.SET_HEADER(l_http_request, 'Content-Type', 'application/json');
    UTL_HTTP.SET_HEADER(l_http_request, 'Content-Length', DBMS_LOB.GETLENGTH(l_payload));

    UTL_HTTP.WRITE_TEXT(l_http_request, l_payload);
    l_http_response := UTL_HTTP.GET_RESPONSE(l_http_request);

    -- 调试用:打印响应状态
    DBMS_OUTPUT.PUT_LINE('Response Status: ' || l_http_response.status_code);

    UTL_HTTP.END_RESPONSE(l_http_response);
EXCEPTION
    WHEN OTHERS THEN
        IF UTL_HTTP.IS_RESPONSE_OPEN(l_http_response) THEN
            UTL_HTTP.END_RESPONSE(l_http_response);
        END IF;
        -- 生产环境可将失败日志写入本地表,便于重试
        RAISE;
END;
/

3. 调用示例

BEGIN
    send_appinsights_log(
        p_instrumentation_key => 'your-instrumentation-key-here',
        p_log_message => 'PL/SQL test log from Oracle database',
        p_log_level => 'Warning'
    );
END;
/

关键注意事项

  • JSON格式校验:App Insights对payload格式要求严格,需转义字符串中的双引号,时间必须为UTC时区的ISO 8601格式。
  • 批量上报优化:若需发送大量日志,可将多条日志条目放入同一个JSON数组中发送,减少HTTP请求开销。
  • 代理配置:如果Oracle服务器需通过代理访问外网,可调用UTL_HTTP.SET_PROXY设置代理信息。
  • 异常处理:生产环境建议补充失败日志的本地存储逻辑,避免日志丢失。

内容的提问来源于stack exchange,提问作者Scott Swank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:35:23