Files
ai-contract-platform/scripts/legal_library_monitoring.sql
T
yuqei 182a1ba663 feat: add production deployment guide and monitoring tools
Production deployment:
- Add deployment guide with data migration steps
- Add deployment checklist and rollback plan
- Add performance verification steps

User documentation:
- Add user guide for law library enhancement
- Document new features and coverage areas
- Add FAQ section

Monitoring and alerts:
- Add monitoring SQL script with health checks
- Add alert thresholds configuration
- Add storage and access statistics

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-16 22:31:38 +08:00

272 lines
9.7 KiB
PL/PgSQL

-- 法律库监控SQL脚本
-- 用于监控法律库使用情况和健康状况
-- ============================================
-- 1. 法律库基础统计
-- ============================================
CREATE OR REPLACE VIEW legal_library_stats AS
SELECT
COUNT(*) as total_articles,
COUNT(DISTINCT source_id) as total_laws,
COUNT(CASE WHEN semantic_vector_json IS NOT NULL THEN 1 END) as vectorized_articles,
COUNT(CASE WHEN semantic_vector_json IS NULL THEN 1 END) as pending_vectorization,
ROUND(COUNT(CASE WHEN semantic_vector_json IS NOT NULL THEN 1 END)::numeric / COUNT(*)::numeric * 100, 2) as vectorization_rate,
MAX(updated_at) as last_update,
MAX(semantic_vector_updated_at) as last_vectorization
FROM legal_articles;
-- ============================================
-- 2. 法律类型分布统计
-- ============================================
CREATE OR REPLACE VIEW legal_library_type_stats AS
SELECT
source_type,
COUNT(DISTINCT source_id) as law_count,
COUNT(*) as article_count,
ROUND(COUNT(*)::numeric * 100.0 / SUM(COUNT(*)) OVER ()::numeric, 2) as percentage
FROM legal_articles
GROUP BY source_type
ORDER BY article_count DESC;
-- ============================================
-- 3. 向量化状态监控
-- ============================================
CREATE OR REPLACE VIEW legal_library_vectorization_status AS
SELECT
semantic_vector_version,
COUNT(*) as article_count,
MIN(semantic_vector_updated_at) as first_vectorization,
MAX(semantic_vector_updated_at) as last_vectorization
FROM legal_articles
WHERE semantic_vector_json IS NOT NULL
GROUP BY semantic_vector_version
ORDER BY article_count DESC;
-- ============================================
-- 4. 法律库健康检查
-- ============================================
CREATE OR REPLACE VIEW legal_library_health_check AS
SELECT
'total_articles' as metric,
(SELECT COUNT(*) FROM legal_articles)::text as value,
CASE
WHEN (SELECT COUNT(*) FROM legal_articles) >= 700000 THEN 'healthy'
ELSE 'warning'
END as status
UNION ALL
SELECT
'vectorization_rate' as metric,
ROUND((SELECT COUNT(CASE WHEN semantic_vector_json IS NOT NULL THEN 1 END)::numeric
/ NULLIF((SELECT COUNT(*) FROM legal_articles), 0) * 100), 2)::text || '%' as value,
CASE
WHEN (SELECT COUNT(CASE WHEN semantic_vector_json IS NOT NULL THEN 1 END)::numeric
/ NULLIF((SELECT COUNT(*) FROM legal_articles), 0)) >= 0.99 THEN 'healthy'
WHEN (SELECT COUNT(CASE WHEN semantic_vector_json IS NOT NULL THEN 1 END)::numeric
/ NULLIF((SELECT COUNT(*) FROM legal_articles), 0)) >= 0.90 THEN 'warning'
ELSE 'critical'
END as status
UNION ALL
SELECT
'pending_vectorization' as metric,
(SELECT COUNT(*) FROM legal_articles WHERE semantic_vector_json IS NULL)::text as value,
CASE
WHEN (SELECT COUNT(*) FROM legal_articles WHERE semantic_vector_json IS NULL) = 0 THEN 'healthy'
WHEN (SELECT COUNT(*) FROM legal_articles WHERE semantic_vector_json IS NULL) < 1000 THEN 'warning'
ELSE 'critical'
END as status
UNION ALL
SELECT
'last_update' as metric,
COALESCE(TO_CHAR((SELECT MAX(updated_at) FROM legal_articles), 'YYYY-MM-DD HH24:MI:SS'), 'N/A') as value,
CASE
WHEN (SELECT MAX(updated_at) FROM legal_articles) >= NOW() - INTERVAL '30 days' THEN 'healthy'
WHEN (SELECT MAX(updated_at) FROM legal_articles) >= NOW() - INTERVAL '90 days' THEN 'warning'
ELSE 'critical'
END as status;
-- ============================================
-- 5. 索引状态检查
-- ============================================
CREATE OR REPLACE VIEW legal_library_index_status AS
SELECT
indexname as index_name,
indexdef as definition,
'active' as status
FROM pg_indexes
WHERE tablename = 'legal_articles'
ORDER BY indexname;
-- ============================================
-- 6. 存储空间使用
-- ============================================
CREATE OR REPLACE VIEW legal_library_storage AS
SELECT
pg_size_pretty(pg_total_relation_size('legal_articles')) as total_size,
pg_size_pretty(pg_relation_size('legal_articles')) as table_size,
pg_size_pretty(pg_total_relation_size('legal_articles') - pg_relation_size('legal_articles')) as index_size,
(SELECT COUNT(*) FROM legal_articles) as row_count;
-- ============================================
-- 7. 核心法律完整性检查
-- ============================================
CREATE OR REPLACE VIEW legal_library_core_laws_check AS
SELECT
source_id,
source_title,
COUNT(*) as article_count,
CASE
WHEN COUNT(*) > 0 THEN 'present'
ELSE 'missing'
END as status
FROM legal_articles
WHERE source_id IN (
'LAW-CIVIL-CODE-2020',
'LAW-COMPANY-2023',
'LAW-LABOR-CONTRACT-2012',
'LAW-PIPL-2021',
'LAW-DATA-SECURITY-2021',
'LAW-E-SIGNATURE-2019'
)
GROUP BY source_id, source_title
ORDER BY source_id;
-- ============================================
-- 8. 告警阈值配置
-- ============================================
-- 创建告警配置表
CREATE TABLE IF NOT EXISTS legal_library_alert_thresholds (
id SERIAL PRIMARY KEY,
metric_name VARCHAR(100) UNIQUE NOT NULL,
warning_threshold NUMERIC,
critical_threshold NUMERIC,
description TEXT,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- 插入默认阈值
INSERT INTO legal_library_alert_thresholds (metric_name, warning_threshold, critical_threshold, description)
VALUES
('vectorization_rate', 99.0, 95.0, '向量化完成率'),
('pending_vectorization', 1000, 5000, '待向量化条文数'),
('total_articles', 700000, 500000, '法律条文总数')
ON CONFLICT (metric_name) DO NOTHING;
-- ============================================
-- 9. 使用统计表(可选)
-- ============================================
CREATE TABLE IF NOT EXISTS legal_article_access_log (
id SERIAL PRIMARY KEY,
article_id VARCHAR(255),
source_id VARCHAR(255),
access_type VARCHAR(50), -- 'search', 'review', 'chat', 'view'
user_id VARCHAR(255),
tenant_id VARCHAR(255),
created_at TIMESTAMP DEFAULT NOW()
);
-- 创建访问统计视图
CREATE OR REPLACE VIEW legal_article_access_stats AS
SELECT
source_id,
COUNT(*) as access_count,
COUNT(DISTINCT user_id) as unique_users,
MAX(created_at) as last_accessed
FROM legal_article_access_log
GROUP BY source_id
ORDER BY access_count DESC
LIMIT 20;
-- ============================================
-- 10. 监控查询示例
-- ============================================
-- 查询法律库整体状态
-- SELECT * FROM legal_library_stats;
-- 查询健康检查结果
-- SELECT * FROM legal_library_health_check;
-- 查询向量化进度
-- SELECT * FROM legal_library_vectorization_status;
-- 查询存储使用情况
-- SELECT * FROM legal_library_storage;
-- 查询核心法律完整性
-- SELECT * FROM legal_library_core_laws_check;
-- ============================================
-- 11. 告警检查函数
-- ============================================
CREATE OR REPLACE FUNCTION check_legal_library_alerts()
RETURNS TABLE (
metric VARCHAR(100),
current_value NUMERIC,
threshold NUMERIC,
severity VARCHAR(20),
message TEXT
) AS $$
BEGIN
-- 检查向量化率
RETURN QUERY
SELECT
'vectorization_rate'::VARCHAR(100),
(SELECT COUNT(CASE WHEN semantic_vector_json IS NOT NULL THEN 1 END)::numeric
/ NULLIF(COUNT(*), 0) * 100
FROM legal_articles) as current_value,
t.warning_threshold,
CASE
WHEN (SELECT COUNT(CASE WHEN semantic_vector_json IS NOT NULL THEN 1 END)::numeric
/ NULLIF(COUNT(*), 0) * 100 FROM legal_articles) < t.critical_threshold THEN 'critical'
WHEN (SELECT COUNT(CASE WHEN semantic_vector_json IS NOT NULL THEN 1 END)::numeric
/ NULLIF(COUNT(*), 0) * 100 FROM legal_articles) < t.warning_threshold THEN 'warning'
ELSE 'ok'
END::VARCHAR(20),
CASE
WHEN (SELECT COUNT(CASE WHEN semantic_vector_json IS NOT NULL THEN 1 END)::numeric
/ NULLIF(COUNT(*), 0) * 100 FROM legal_articles) < t.critical_threshold
THEN '向量化率严重不足,请立即处理'
WHEN (SELECT COUNT(CASE WHEN semantic_vector_json IS NOT NULL THEN 1 END)::numeric
/ NULLIF(COUNT(*), 0) * 100 FROM legal_articles) < t.warning_threshold
THEN '向量化率偏低,建议检查'
ELSE '向量化率正常'
END::TEXT
FROM legal_library_alert_thresholds t
WHERE t.metric_name = 'vectorization_rate';
-- 检查待向量化数量
RETURN QUERY
SELECT
'pending_vectorization'::VARCHAR(100),
(SELECT COUNT(*) FROM legal_articles WHERE semantic_vector_json IS NULL)::numeric,
t.warning_threshold,
CASE
WHEN (SELECT COUNT(*) FROM legal_articles WHERE semantic_vector_json IS NULL) > t.critical_threshold THEN 'critical'
WHEN (SELECT COUNT(*) FROM legal_articles WHERE semantic_vector_json IS NULL) > t.warning_threshold THEN 'warning'
ELSE 'ok'
END::VARCHAR(20),
CASE
WHEN (SELECT COUNT(*) FROM legal_articles WHERE semantic_vector_json IS NULL) > t.critical_threshold
THEN '待向量化条文过多,请立即处理'
WHEN (SELECT COUNT(*) FROM legal_articles WHERE semantic_vector_json IS NULL) > t.warning_threshold
THEN '有待向量化条文,建议处理'
ELSE '向量化完成'
END::TEXT
FROM legal_library_alert_thresholds t
WHERE t.metric_name = 'pending_vectorization';
END;
$$ LANGUAGE plpgsql;
-- 使用示例
-- SELECT * FROM check_legal_library_alerts();