From 2a4afe524c6c675f7f3fca108215ff296e9a9606 Mon Sep 17 00:00:00 2001 From: tm-efosso Date: Tue, 13 Jan 2026 16:20:44 -0500 Subject: [PATCH 1/3] feat(TmRdsAuroraMysqlServerless): Feat dashboard for database slow queries --- src/databases/rds-aurora-mysql-dashboard.ts | 68 ++++++++++++++++++++ src/databases/rds-aurora-mysql-serverless.ts | 24 ++++++- 2 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 src/databases/rds-aurora-mysql-dashboard.ts diff --git a/src/databases/rds-aurora-mysql-dashboard.ts b/src/databases/rds-aurora-mysql-dashboard.ts new file mode 100644 index 0000000..0c57654 --- /dev/null +++ b/src/databases/rds-aurora-mysql-dashboard.ts @@ -0,0 +1,68 @@ +import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';; +import { Construct } from 'constructs'; + +interface TmRdsAuroraMysqlDashboardProps { + clusterIdentifier: string; + dashboardName?: string; +} + +export class TmRdsAuroraMysqlDashboard extends Construct { + constructor(scope: Construct, id: string, props: TmRdsAuroraMysqlDashboardProps) { + super(scope, id); + + const logGroupName = `/aws/rds/cluster/${props.clusterIdentifier}/slowquery`; + + // 1. Création du Dashboard + const dashboard = new cloudwatch.Dashboard(this, 'RdsAuroraMysqlDashboard', { + dashboardName: props.dashboardName || 'MysqlDashboards', + }); + + // 2. Widget : Top 20 des requêtes les plus lentes (Tableau) + const slowQueryList = new cloudwatch.LogQueryWidget({ + title: "Top 20 Slowest Queries", + logGroupNames: [logGroupName], + view: cloudwatch.LogQueryVisualizationType.TABLE, + width: 24, + height: 8, + queryString: ` + fields @timestamp + | filter @message like /Query_time:/ + | parse @message "# Query_time: * Lock_time: * Rows_sent: * Rows_examined: *" + as query_time, lock_time, rows_sent, rows_examined + | sort query_time desc + | limit 20 + `, + }); + + + // 3. Widget : Évolution du temps de réponse moyen (Graphique) + const latencyOverTime = new cloudwatch.LogQueryWidget({ + title: "Average Latency (seconds) over time", + logGroupNames: [logGroupName], + view: cloudwatch.LogQueryVisualizationType.LINE, + width: 12, + height: 6, + queryString: ` + fields @timestamp, @message + | parse @message "Query_time: * " as duration + | stats avg(duration) by bin(5m) + `, + }); + + // 4. Widget : Volume de requêtes lentes par minute + const volumeWidget = new cloudwatch.LogQueryWidget({ + title: "Slow Query Count per minute", + logGroupNames: [logGroupName], + view: cloudwatch.LogQueryVisualizationType.BAR, + width: 12, + height: 6, + queryString: ` + stats count(*) by bin(1m) + `, + }); + + // Organisation du Dashboard : Une ligne pour les graphiques, une ligne pour le tableau + dashboard.addWidgets(latencyOverTime, volumeWidget); + dashboard.addWidgets(slowQueryList); + } +} \ No newline at end of file diff --git a/src/databases/rds-aurora-mysql-serverless.ts b/src/databases/rds-aurora-mysql-serverless.ts index 30633ae..788f6f5 100644 --- a/src/databases/rds-aurora-mysql-serverless.ts +++ b/src/databases/rds-aurora-mysql-serverless.ts @@ -32,6 +32,25 @@ export class TmRdsAuroraMysqlServerless extends rds.DatabaseCluster { props?: TmRdsAuroraMysqlServerlessProps, ) { + // Définir l'engine + const clusterEngine = rds.DatabaseClusterEngine.auroraMysql({ + version: rds.AuroraMysqlEngineVersion.VER_3_08_1, + }); + + // Parameter group par défaut + const defaultParameterGroup = new rds.ParameterGroup(scope, `${id}ParametersGroup`, { + engine: clusterEngine, + parameters: { + sql_mode: 'NO_ENGINE_SUBSTITUTION', + max_connections: '500', + wait_timeout: '60', + // Activer les slow query logs + slow_query_log: '1', + long_query_time: '3', + log_output: 'FILE', + }, + }); + const performanceInsightRetention = rds.PerformanceInsightRetention.DEFAULT; // Conditionally create the writer instance props const writerProps = props?.provisionedInstanceType @@ -47,9 +66,8 @@ export class TmRdsAuroraMysqlServerless extends rds.DatabaseCluster { * The default properties for the RDS Aurora MySQL Serverless database cluster. */ const defaultProps: rds.DatabaseClusterProps = { - engine: rds.DatabaseClusterEngine.auroraMysql({ - version: rds.AuroraMysqlEngineVersion.VER_3_05_2, - }), + engine: clusterEngine, + parameterGroup: defaultParameterGroup, writer: writerProps, credentials: rds.Credentials.fromUsername('admin'), // The master credentials for the database // to true in production From def31bc3d8a89b043e7cbbee63a74f600c249407 Mon Sep 17 00:00:00 2001 From: tm-efosso Date: Tue, 13 Jan 2026 16:34:11 -0500 Subject: [PATCH 2/3] feat(TmRdsAuroraMysqlServerless): Feat dashboard for database slow queries --- src/databases/rds-aurora-mysql-dashboard.ts | 11 +++++------ src/databases/rds-aurora-mysql-serverless.ts | 6 +++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/databases/rds-aurora-mysql-dashboard.ts b/src/databases/rds-aurora-mysql-dashboard.ts index 0c57654..7a3ac04 100644 --- a/src/databases/rds-aurora-mysql-dashboard.ts +++ b/src/databases/rds-aurora-mysql-dashboard.ts @@ -12,12 +12,12 @@ export class TmRdsAuroraMysqlDashboard extends Construct { const logGroupName = `/aws/rds/cluster/${props.clusterIdentifier}/slowquery`; - // 1. Création du Dashboard + // Dashboard creation const dashboard = new cloudwatch.Dashboard(this, 'RdsAuroraMysqlDashboard', { - dashboardName: props.dashboardName || 'MysqlDashboards', + dashboardName: props.dashboardName || 'MysqlDashboard', }); - // 2. Widget : Top 20 des requêtes les plus lentes (Tableau) + // 2. Widget : Top 20 slowest queries (Table) const slowQueryList = new cloudwatch.LogQueryWidget({ title: "Top 20 Slowest Queries", logGroupNames: [logGroupName], @@ -35,7 +35,7 @@ export class TmRdsAuroraMysqlDashboard extends Construct { }); - // 3. Widget : Évolution du temps de réponse moyen (Graphique) + // 3. Widget : average response time (Graphic) const latencyOverTime = new cloudwatch.LogQueryWidget({ title: "Average Latency (seconds) over time", logGroupNames: [logGroupName], @@ -49,7 +49,7 @@ export class TmRdsAuroraMysqlDashboard extends Construct { `, }); - // 4. Widget : Volume de requêtes lentes par minute + // 4. Widget : slow queries volume per minute const volumeWidget = new cloudwatch.LogQueryWidget({ title: "Slow Query Count per minute", logGroupNames: [logGroupName], @@ -61,7 +61,6 @@ export class TmRdsAuroraMysqlDashboard extends Construct { `, }); - // Organisation du Dashboard : Une ligne pour les graphiques, une ligne pour le tableau dashboard.addWidgets(latencyOverTime, volumeWidget); dashboard.addWidgets(slowQueryList); } diff --git a/src/databases/rds-aurora-mysql-serverless.ts b/src/databases/rds-aurora-mysql-serverless.ts index 788f6f5..44b6fe0 100644 --- a/src/databases/rds-aurora-mysql-serverless.ts +++ b/src/databases/rds-aurora-mysql-serverless.ts @@ -32,19 +32,19 @@ export class TmRdsAuroraMysqlServerless extends rds.DatabaseCluster { props?: TmRdsAuroraMysqlServerlessProps, ) { - // Définir l'engine + // Define default engine const clusterEngine = rds.DatabaseClusterEngine.auroraMysql({ version: rds.AuroraMysqlEngineVersion.VER_3_08_1, }); - // Parameter group par défaut + // Default Parameter group const defaultParameterGroup = new rds.ParameterGroup(scope, `${id}ParametersGroup`, { engine: clusterEngine, parameters: { sql_mode: 'NO_ENGINE_SUBSTITUTION', max_connections: '500', wait_timeout: '60', - // Activer les slow query logs + // Enable slow query logs slow_query_log: '1', long_query_time: '3', log_output: 'FILE', From 105e44c2e0d453fa43d1bce4676fe0beeae3043f Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 13 Jan 2026 21:40:30 +0000 Subject: [PATCH 3/3] chore: self mutation Signed-off-by: github-actions --- src/databases/rds-aurora-mysql-dashboard.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/databases/rds-aurora-mysql-dashboard.ts b/src/databases/rds-aurora-mysql-dashboard.ts index 7a3ac04..94b599d 100644 --- a/src/databases/rds-aurora-mysql-dashboard.ts +++ b/src/databases/rds-aurora-mysql-dashboard.ts @@ -19,7 +19,7 @@ export class TmRdsAuroraMysqlDashboard extends Construct { // 2. Widget : Top 20 slowest queries (Table) const slowQueryList = new cloudwatch.LogQueryWidget({ - title: "Top 20 Slowest Queries", + title: 'Top 20 Slowest Queries', logGroupNames: [logGroupName], view: cloudwatch.LogQueryVisualizationType.TABLE, width: 24, @@ -37,7 +37,7 @@ export class TmRdsAuroraMysqlDashboard extends Construct { // 3. Widget : average response time (Graphic) const latencyOverTime = new cloudwatch.LogQueryWidget({ - title: "Average Latency (seconds) over time", + title: 'Average Latency (seconds) over time', logGroupNames: [logGroupName], view: cloudwatch.LogQueryVisualizationType.LINE, width: 12, @@ -51,7 +51,7 @@ export class TmRdsAuroraMysqlDashboard extends Construct { // 4. Widget : slow queries volume per minute const volumeWidget = new cloudwatch.LogQueryWidget({ - title: "Slow Query Count per minute", + title: 'Slow Query Count per minute', logGroupNames: [logGroupName], view: cloudwatch.LogQueryVisualizationType.BAR, width: 12,