The KloudMate Agent can connect directly to your database using a dedicated monitoring user to collect deep query metrics, execution plans, and schema metadata. This approach provides the richest level of database insight — including per-query latency breakdowns, explain plans, and wait event analysis — across both self-hosted and managed database services.
Connect as a user with admin privileges (for RDS/Aurora, use the master user):
CREATE USER IF NOT EXISTS 'kloudmate'@'%' IDENTIFIED BY '';-- Limit connections to prevent exhausting the poolALTER USER 'kloudmate'@'%' WITH MAX_USER_CONNECTIONS 5;
-- PROCESS: See all running threads and queries-- REPLICATION CLIENT: Check replication lag and binary log position-- SELECT on perf_schema: Read query digest stats, wait events, etc.GRANT REPLICATION CLIENT ON *.* TO 'kloudmate'@'%';GRANT PROCESS ON *.* TO 'kloudmate'@'%';GRANT SELECT ON performance_schema.* TO 'kloudmate'@'%';
Create a dedicated schema and the helper procedures the agent uses:
CREATE SCHEMA IF NOT EXISTS kloudmate;GRANT EXECUTE ON kloudmate.* TO 'kloudmate'@'%';
Enable Performance Schema, Consumers
On RDS/Aurora/Cloud SQL, you cannot permanently enable performance_schema consumers via config. This procedure lets the agent enable them at runtime:
DELIMITER $$CREATE PROCEDURE IF NOT EXISTS kloudmate.enable_events_statements_consumers()SQL SECURITY DEFINERBEGIN UPDATE performance_schema.setup_consumers SET enabled = 'YES' WHERE name LIKE 'events_statements_%'; UPDATE performance_schema.setup_consumers SET enabled = 'YES' WHERE name = 'events_waits_current';END $$DELIMITER ;GRANT EXECUTE ON PROCEDURE kloudmate.enable_events_statements_consumers TO 'kloudmate'@'%';
Explain Statement
Collects JSON execution plans for sampled queries:
DELIMITER $$CREATE PROCEDURE IF NOT EXISTS kloudmate.explain_statement(IN query TEXT)SQL SECURITY DEFINERBEGIN SET @explain := CONCAT('EXPLAIN FORMAT=json ', query); PREPARE stmt FROM @explain; EXECUTE stmt; DEALLOCATE PREPARE stmt;END $$DELIMITER ;GRANT EXECUTE ON PROCEDURE kloudmate.explain_statement TO 'kloudmate'@'%';
-- Check performance_schema is enabledSELECT @@performance_schema;-- Check consumers are activeSELECT name, enabled FROM performance_schema.setup_consumers WHERE name LIKE 'events_statements_%' OR name = 'events_waits_current';-- Check query digests are being collectedSELECT COUNT(*) FROM performance_schema.events_statements_summary_by_digest;-- Verify procedures existSHOW PROCEDURE STATUS WHERE db = 'kloudmate';-- Test explainCALL kloudmate.explain_statement('SELECT 1');
Create a dedicated schema and the SECURITY DEFINER wrapper functions:
CREATE SCHEMA IF NOT EXISTS kloudmate;GRANT USAGE ON SCHEMA kloudmate TO kloudmate;GRANT USAGE ON SCHEMA public TO kloudmate;
pg_stat_activity Wrapper
Ensures full visibility into all sessions’ query text (required on RDS where non-superusers have restricted access):
CREATE OR REPLACE FUNCTION kloudmate.pg_stat_activity()RETURNS SETOF pg_stat_activityAS $$ SELECT * FROM pg_catalog.pg_stat_activity;$$LANGUAGE sqlSECURITY DEFINER;
pg_stat_statements Wrapper
Ensures full visibility into all query statistics:
CREATE OR REPLACE FUNCTION kloudmate.pg_stat_statements()RETURNS SETOF pg_stat_statementsAS $$ SELECT * FROM pg_stat_statements;$$LANGUAGE sqlSECURITY DEFINER;
Explain Statement
Collects JSON execution plans for sampled queries:
CREATE OR REPLACE FUNCTION kloudmate.explain_statement( l_query TEXT, OUT explain JSON)RETURNS SETOF JSONAS $$DECLARE curs REFCURSOR; plan JSON;BEGIN OPEN curs FOR EXECUTE pg_catalog.concat('EXPLAIN (FORMAT JSON) ', l_query); LOOP FETCH curs INTO plan; EXIT WHEN NOT FOUND; RETURN QUERY SELECT plan; END LOOP; CLOSE curs; RETURN;END;$$LANGUAGE plpgsqlSECURITY DEFINER;
Safe way to reset pg_stat_statements counters without direct superuser access:
CREATE OR REPLACE FUNCTION kloudmate.pg_stat_statements_reset()RETURNS VOIDAS $$ SELECT pg_stat_statements_reset();$$LANGUAGE sqlSECURITY DEFINER;
Replication Monitoring Only needed on the primary / writer instance for monitoring replication lag:
CREATE OR REPLACE FUNCTION kloudmate.pg_stat_replication()RETURNS SETOF pg_stat_replicationAS $$ SELECT * FROM pg_catalog.pg_stat_replication;$$LANGUAGE sqlSECURITY DEFINER;
-- Check pg_stat_statements is loadedSELECT count(*) FROM pg_stat_statements;-- Check functions existSELECT routine_name FROM information_schema.routines WHERE routine_schema = 'kloudmate';-- Test pg_stat_activity wrapperSELECT count(*) FROM kloudmate.pg_stat_activity();-- Test explainSELECT * FROM kloudmate.explain_statement('SELECT 1');-- Check track_activity_query_sizeSHOW track_activity_query_size;-- Check track_io_timingSHOW track_io_timing;
DROP PROCEDURE IF EXISTS kloudmate.enable_events_statements_consumers;DROP PROCEDURE IF EXISTS kloudmate.explain_statement;DROP SCHEMA IF EXISTS kloudmate;DROP USER IF EXISTS 'kloudmate'@'%';
DROP FUNCTION IF EXISTS kloudmate.pg_stat_activity();DROP FUNCTION IF EXISTS kloudmate.pg_stat_statements();DROP FUNCTION IF EXISTS kloudmate.explain_statement(TEXT);DROP FUNCTION IF EXISTS kloudmate.pg_stat_statements_reset();DROP FUNCTION IF EXISTS kloudmate.pg_stat_replication();DROP SCHEMA IF EXISTS kloudmate;DROP USER IF EXISTS kloudmate;