Add materialized view healthmonitoring functions.
This commit is contained in:
parent
aa2475dfaf
commit
1a25408db0
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
8
.idea/c77_dbh.iml
generated
Normal file
8
.idea/c77_dbh.iml
generated
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
12
.idea/dataSources.xml
generated
Normal file
12
.idea/dataSources.xml
generated
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
||||||
|
<data-source source="LOCAL" name="dbh@localhost" uuid="e6d48ef9-469b-4fa4-92fd-4f4cfdf528c0">
|
||||||
|
<driver-ref>postgresql</driver-ref>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
|
||||||
|
<jdbc-url>jdbc:postgresql://localhost:5432/dbh</jdbc-url>
|
||||||
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
|
</data-source>
|
||||||
|
</component>
|
||||||
|
</project>
|
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/c77_dbh.iml" filepath="$PROJECT_DIR$/.idea/c77_dbh.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
19
.idea/php.xml
generated
Normal file
19
.idea/php.xml
generated
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="MessDetectorOptionsConfiguration">
|
||||||
|
<option name="transferred" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PHPCSFixerOptionsConfiguration">
|
||||||
|
<option name="transferred" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PHPCodeSnifferOptionsConfiguration">
|
||||||
|
<option name="highlightLevel" value="WARNING" />
|
||||||
|
<option name="transferred" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PhpStanOptionsConfiguration">
|
||||||
|
<option name="transferred" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PsalmOptionsConfiguration">
|
||||||
|
<option name="transferred" value="true" />
|
||||||
|
</component>
|
||||||
|
</project>
|
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
98
health_functions.sql
Normal file
98
health_functions.sql
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
CREATE OR REPLACE FUNCTION public.c77_dbh_get_mv_health()
|
||||||
|
RETURNS JSON AS $$
|
||||||
|
BEGIN
|
||||||
|
RETURN (
|
||||||
|
SELECT json_agg(
|
||||||
|
json_build_object(
|
||||||
|
'metric', 'Materialized View Refresh',
|
||||||
|
'mv_name', mv_name,
|
||||||
|
'status', CASE
|
||||||
|
WHEN refresh_mv_time_last > refresh_mv_time_max * 0.9 THEN 'Red'
|
||||||
|
WHEN refresh_mv_time_last > (refresh_mv_time_total / GREATEST(refresh_count, 1)) * 1.2 THEN 'Yellow'
|
||||||
|
ELSE 'Green'
|
||||||
|
END,
|
||||||
|
'severity', CASE
|
||||||
|
WHEN refresh_mv_time_last > refresh_mv_time_max * 0.9 THEN 5
|
||||||
|
WHEN refresh_mv_time_last > (refresh_mv_time_total / GREATEST(refresh_count, 1)) * 1.2 THEN 3
|
||||||
|
ELSE 1
|
||||||
|
END,
|
||||||
|
'insight', CASE
|
||||||
|
WHEN refresh_mv_time_last > refresh_mv_time_max * 0.9 THEN 'Refreshes are critically slow compared to historical max.'
|
||||||
|
WHEN refresh_mv_time_last > (refresh_mv_time_total / GREATEST(refresh_count, 1)) * 1.2 THEN 'Refreshes are slower than average.'
|
||||||
|
ELSE 'Refreshes are performing normally.'
|
||||||
|
END,
|
||||||
|
'action', CASE
|
||||||
|
WHEN refresh_mv_time_last > refresh_mv_time_max * 0.9 THEN 'Investigate immediately; consider optimizing queries or resources.'
|
||||||
|
WHEN refresh_mv_time_last > (refresh_mv_time_total / GREATEST(refresh_count, 1)) * 1.2 THEN 'Review refresh schedule or resource usage.'
|
||||||
|
ELSE 'No action needed.'
|
||||||
|
END,
|
||||||
|
'last_refresh_time', refresh_mv_time_last::text,
|
||||||
|
'refresh_count', refresh_count
|
||||||
|
)
|
||||||
|
)
|
||||||
|
FROM public.c77_dbh_mv_stats
|
||||||
|
);
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION public.c77_dbh_get_mv_details(p_mv_name text)
|
||||||
|
RETURNS JSON AS $$
|
||||||
|
BEGIN
|
||||||
|
RETURN (
|
||||||
|
SELECT json_build_object(
|
||||||
|
'metric', 'Materialized View Refresh',
|
||||||
|
'mv_name', mv_name,
|
||||||
|
'status', CASE
|
||||||
|
WHEN refresh_mv_time_last > refresh_mv_time_max * 0.9 THEN 'Red'
|
||||||
|
WHEN refresh_mv_time_last > (refresh_mv_time_total / GREATEST(refresh_count, 1)) * 1.2 THEN 'Yellow'
|
||||||
|
ELSE 'Green'
|
||||||
|
END,
|
||||||
|
'severity', CASE
|
||||||
|
WHEN refresh_mv_time_last > refresh_mv_time_max * 0.9 THEN 5
|
||||||
|
WHEN refresh_mv_time_last > (refresh_mv_time_total / GREATEST(refresh_count, 1)) * 1.2 THEN 3
|
||||||
|
ELSE 1
|
||||||
|
END,
|
||||||
|
'insight', CASE
|
||||||
|
WHEN io_rate > 50 THEN 'Refreshes are slower due to high I/O load.'
|
||||||
|
WHEN cpu_usage > 80 THEN 'Refreshes are slower due to high CPU usage.'
|
||||||
|
WHEN ram_usage > 90 THEN 'Refreshes are slower due to memory constraints.'
|
||||||
|
ELSE 'Refreshes are performing normally.'
|
||||||
|
END,
|
||||||
|
'action', CASE
|
||||||
|
WHEN io_rate > 50 THEN 'Optimize I/O or schedule during off-peak hours.'
|
||||||
|
WHEN cpu_usage > 80 THEN 'Increase CPU capacity or optimize queries.'
|
||||||
|
WHEN ram_usage > 90 THEN 'Adjust memory settings (e.g., work_mem).'
|
||||||
|
ELSE 'No action needed.'
|
||||||
|
END,
|
||||||
|
'details', json_build_object(
|
||||||
|
'last_refresh_time', refresh_mv_time_last::text,
|
||||||
|
'avg_refresh_time', (refresh_mv_time_total / GREATEST(refresh_count, 1))::text,
|
||||||
|
'min_refresh_time', refresh_mv_time_min::text,
|
||||||
|
'max_refresh_time', refresh_mv_time_max::text,
|
||||||
|
'refresh_count', refresh_count,
|
||||||
|
'cpu_usage', cpu_usage::text || '%',
|
||||||
|
'ram_usage', ram_usage::text || '%',
|
||||||
|
'io_rate', io_rate::text || ' MB/s',
|
||||||
|
'bottleneck', CASE
|
||||||
|
WHEN io_rate > 50 THEN 'I/O'
|
||||||
|
WHEN cpu_usage > 80 THEN 'CPU'
|
||||||
|
WHEN ram_usage > 90 THEN 'RAM'
|
||||||
|
ELSE 'None'
|
||||||
|
END,
|
||||||
|
'explanations', json_build_object(
|
||||||
|
'last_refresh_time', 'Last refresh duration compared to historical min/max.',
|
||||||
|
'io_rate', 'High I/O rate indicates disk operations are limiting performance.',
|
||||||
|
'cpu_usage', 'High CPU usage suggests processing power is the bottleneck.',
|
||||||
|
'ram_usage', 'High memory usage may cause disk spills, slowing refreshes.'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
FROM public.c77_dbh_mv_stats
|
||||||
|
CROSS JOIN LATERAL (
|
||||||
|
-- Placeholder system stats; replace with real data later
|
||||||
|
SELECT 40 AS cpu_usage, 60 AS ram_usage, 80 AS io_rate
|
||||||
|
) AS sys
|
||||||
|
WHERE mv_name = p_mv_name
|
||||||
|
);
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
Loading…
x
Reference in New Issue
Block a user