Operação
Operação & observabilidade
Checklist de erros comuns, consultas prontas para troubleshooting e consumo de IA, e onde acompanhar custo/saúde do ambiente sem precisar de nenhuma ferramenta extra.
O ambiente registra, em TB_26AI_TECH_LOG, cada chamada feita ao Generative AI e aos
embeddings — sucesso ou erro — para que a operação do dia a dia não dependa de abrir um chamado
toda vez que algo não funcionar de primeira. Use as consultas desta página para diagnosticar
rapidamente qualquer problema, e o checklist abaixo para os casos mais comuns.
Checklist de erros comuns
| Sintoma | Causa provável | Como confirmar/corrigir |
|---|---|---|
ORA-00942 em qualquer objeto TB_26AI_TECH_* | Conectado como ADMIN em vez de AMPMINSIGHTS. | Rode SELECT USER FROM DUAL; — tem que voltar AMPMINSIGHTS. Reconecte e repita a seção que falhou. |
| "AI Insight"/chat sempre retorna um texto genérico de indisponibilidade | Credencial OCI_CRED ausente ou quebrada. | SELECT credential_name FROM user_credentials WHERE credential_name = 'OCI_CRED'; — se não retornar linha, refaça a Seção 3 conectado como AMPMINSIGHTS. Depois, confira o motivo exato na consulta de "Erros recentes" abaixo. |
| Erro de rede/timeout ao chamar o Generative AI | ACL de rede (Seção 1.6) não cobre o host correto. | SELECT host, privilege FROM dba_host_aces WHERE principal = 'AMPMINSIGHTS'; — deve listar inference.generativeai.us-chicago-1.oci.oraclecloud.com com RESOLVE e CONNECT. |
ORA-20404 ("Object not found", domínio oci.my$cloud_domain) | Perfil de SELECT AI usando a região "de casa" do tenancy em vez da região do Generative AI. | A região do Generative AI já vem fixa (us-chicago-1) na Seção 5.3 do Passo a passo: banco de dados — não troque pelo valor de OCI_REGION. |
O que TB_26AI_TECH_LOG guarda
Toda chamada a Generative AI/embeddings feita pelas funções internas do ampmInsights grava uma
linha nesta tabela — sucesso ou erro, sem exceção. Guarda metadados de uso (função de origem,
provider, modelo, duração, tamanho do prompt/resposta em caracteres, usuário, e o
SQLCODE/SQLERRM quando há erro) — deliberadamente não guarda o
prompt ou a resposta completos, só o tamanho, por privacidade e para não inchar a tabela.
Consultas prontas
SELECT log_ts, calling_object, operation, provider, model_name,
error_code, error_message
FROM TB_26AI_TECH_LOG
WHERE status = 'ERROR'
AND log_ts >= SYSTIMESTAMP - INTERVAL '24' HOUR
ORDER BY log_ts DESC;
SELECT TRUNC(log_ts) AS dia, calling_object, model_name,
COUNT(*) AS total,
SUM(CASE WHEN status = 'ERROR' THEN 1 ELSE 0 END) AS erros,
ROUND(100 * SUM(CASE WHEN status = 'ERROR' THEN 1 ELSE 0 END) / COUNT(*), 1) AS pct_erro
FROM TB_26AI_TECH_LOG
GROUP BY TRUNC(log_ts), calling_object, model_name
ORDER BY dia DESC, pct_erro DESC;
SELECT log_ts, calling_object, operation, model_name, duration_ms, status
FROM TB_26AI_TECH_LOG
WHERE duration_ms IS NOT NULL
ORDER BY duration_ms DESC
FETCH FIRST 20 ROWS ONLY;
SELECT l.log_ts, l.source_type, l.source_id, l.error_message,
v.asset_name, v.definition_name
FROM TB_26AI_TECH_LOG l
LEFT JOIN TB_26AI_TECH_v2 v ON v.rowid = CHARTOROWID(l.source_id)
WHERE l.status = 'ERROR'
AND l.source_id IS NOT NULL
ORDER BY l.log_ts DESC;
DECLARE
v_days TB_26AI_TECH_PARAMS.PARAM_VALUE%TYPE;
BEGIN
SELECT param_value INTO v_days FROM TB_26AI_TECH_PARAMS WHERE param_name = 'AI_LOG_RETENTION_DAYS';
DELETE FROM TB_26AI_TECH_LOG WHERE log_ts < SYSTIMESTAMP - NUMTODSINTERVAL(v_days, 'DAY');
COMMIT;
END;
/
Ferramentas nativas — sem código novo
ADB Performance Hub
Saúde do banco (CPU, I/O, sessões, SQL Monitor) direto no Console OCI, sem instrumentação extra.
OCI Cost Analysis
Custo real do Generative AI, filtrado por serviço/compartimento — complementa o TB_26AI_TECH_LOG (que dá contagem/latência, não valor faturado).
Activity Reports (páginas 10020-10026)
Atividade de usuário/sessão e erros não tratados do APEX, já vêm prontas na aplicação (apex_activity_log).
O botão "Gerar Insights em Lote" cria um job que roda a cada 20 segundos processando os
registros pendentes. Ele mesmo verifica, a cada execução, se ainda há registros com
insight_report nulo e se auto-remove
(DBMS_SCHEDULER.stop_job/drop_job) quando não sobra nada para processar
— não é necessário clicar em "parar" manualmente ao final de um lote. Para confirmar, rode
SELECT job_name, state FROM dba_scheduler_jobs WHERE job_name = 'JOB_26AI_TECH_VULNERABILIDADE';
— não deve retornar linha depois que o processamento terminar.