-- 法律库监控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();