如何创建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
相关产品推荐
相关产品推荐

