2025-07-24 17:05:09 +01:00

74 lines
2.4 KiB
PL/PgSQL

-- Connect to the grafana database
\connect grafana
-- Create test metrics table
CREATE TABLE IF NOT EXISTS test_metrics (
id SERIAL PRIMARY KEY,
time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
metric VARCHAR(50),
value NUMERIC,
dimension VARCHAR(50)
);
-- Create indexes for better query performance
CREATE INDEX IF NOT EXISTS idx_test_metrics_time ON test_metrics(time);
CREATE INDEX IF NOT EXISTS idx_test_metrics_metric ON test_metrics(metric);
-- Create a function to generate random data
CREATE OR REPLACE FUNCTION generate_random_metrics()
RETURNS TABLE (
metric_time TIMESTAMP WITH TIME ZONE,
metric_name VARCHAR(50),
metric_value NUMERIC,
metric_dimension VARCHAR(50)
) AS $$
BEGIN
RETURN QUERY
SELECT
NOW() - (i || ' minutes')::interval,
(CASE (random() * 2)::integer
WHEN 0 THEN 'response_time'
WHEN 1 THEN 'error_rate'
ELSE 'cpu_usage'
END)::VARCHAR(50),
(random() * 100)::numeric,
(CASE (random() * 2)::integer
WHEN 0 THEN 'api'
WHEN 1 THEN 'web'
ELSE 'mobile'
END)::VARCHAR(50)
FROM generate_series(0, 60) i;
END;
$$ LANGUAGE plpgsql;
-- Insert initial static test data
INSERT INTO test_metrics (time, metric, value, dimension) VALUES
(NOW() - interval '1 hour', 'response_time', 100, 'api'),
(NOW() - interval '50 minutes', 'response_time', 150, 'api'),
(NOW() - interval '40 minutes', 'response_time', 120, 'api'),
(NOW() - interval '30 minutes', 'response_time', 200, 'web'),
(NOW() - interval '20 minutes', 'response_time', 180, 'web'),
(NOW() - interval '10 minutes', 'response_time', 90, 'mobile'),
(NOW(), 'response_time', 110, 'mobile');
-- Insert random test data
INSERT INTO test_metrics (time, metric, value, dimension)
SELECT metric_time, metric_name, metric_value, metric_dimension
FROM generate_random_metrics();
-- Create a view for common aggregations
CREATE OR REPLACE VIEW metric_summaries AS
SELECT
metric,
dimension,
AVG(value) as avg_value,
MAX(value) as max_value,
MIN(value) as min_value,
COUNT(*) as count
FROM test_metrics
WHERE time > NOW() - interval '1 hour'
GROUP BY metric, dimension;
-- Grant necessary permissions
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO grafana;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO grafana;