182a1ba663
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>
272 lines
9.7 KiB
PL/PgSQL
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(); |