diff --git a/dashboards/dashboards/MySQL/MySQL_InnoDB_Compression_Details.json b/dashboards/dashboards/MySQL/MySQL_InnoDB_Compression_Details.json index 81ed8aa4816..4df5c00c76a 100644 --- a/dashboards/dashboards/MySQL/MySQL_InnoDB_Compression_Details.json +++ b/dashboards/dashboards/MySQL/MySQL_InnoDB_Compression_Details.json @@ -809,10 +809,9 @@ "steppedLine": false, "targets": [ { - "expr": "avg by (service_name) ((sum(rate(mysql_info_schema_innodb_cmp_compress_time_seconds_total{service_name=~\"$service_name\"}[$interval])) by (service_name) or\nsum(irate(mysql_info_schema_innodb_cmp_compress_time_seconds_total{service_name=~\"$service_name\"}[5m])) by (service_name))) /\nsum(count(node_cpu_seconds_total{mode=\"user\", node_name=~\"$node_name\"}) by (node_name)) *100", + "expr": "avg by (service_name) ((sum by (service_name, node_name) (rate(mysql_info_schema_innodb_cmp_compress_time_seconds_total{service_name=~\"$service_name\"}[$interval])) or\nsum by (service_name, node_name) (irate(mysql_info_schema_innodb_cmp_compress_time_seconds_total{service_name=~\"$service_name\"}[5m]))) /\non (node_name) group_left () count by (node_name) (node_cpu_seconds_total{mode=\"user\", node_name=~\"$node_name\"}) * 100)", "format": "time_series", "hide": false, - "interval": "1h", "intervalFactor": 1, "legendFormat": "{{service_name}}", "refId": "C" @@ -918,9 +917,8 @@ "steppedLine": false, "targets": [ { - "expr": "avg by (node_name) ((sum(rate(mysql_info_schema_innodb_cmp_uncompress_time_seconds_total{service=~\"$service_name\"}[$interval])) by (service_name) or\nsum(irate(mysql_info_schema_innodb_cmp_uncompress_time_seconds_total{instance=~\"$service_name\"}[5m])) by (service_name))) /\nsum(count(node_cpu_seconds_total{mode=\"user\", node_name=~\"$node_name\"}) by (node_name)) * 100", + "expr": "avg by (service_name) ((sum by (service_name, node_name) (rate(mysql_info_schema_innodb_cmp_uncompress_time_seconds_total{service_name=~\"$service_name\"}[$interval])) or\nsum by (service_name, node_name) (irate(mysql_info_schema_innodb_cmp_uncompress_time_seconds_total{service_name=~\"$service_name\"}[5m]))) /\non (node_name) group_left () count by (node_name) (node_cpu_seconds_total{mode=\"user\", node_name=~\"$node_name\"}) * 100)", "format": "time_series", - "interval": "1h", "intervalFactor": 1, "legendFormat": "{{service_name}}", "refId": "B" @@ -1563,7 +1561,7 @@ "pluginVersion": "8.3.5", "targets": [ { - "expr": "avg by (node_name) ((mysql_global_variables_innodb_buffer_pool_size{service_name=~\"$service_name\"} * 100)) /\non (node_name) (max by () (container_spec_memory_limit_bytes{node_name=~\"$node_name\",id=~\"/kubepods.*\",container!~\"POD|pmm-client|\"}) or \nmax by () (node_memory_MemTotal_bytes{node_name=~\"$node_name\"}))", + "expr": "avg by (node_name) ((mysql_global_variables_innodb_buffer_pool_size{service_name=~\"$service_name\"} * 100)) /\non (node_name) (max by (node_name) (container_spec_memory_limit_bytes{node_name=~\"$node_name\",id=~\"/kubepods.*\",container!~\"POD|pmm-client|\"}) or \nmax by (node_name) (node_memory_MemTotal_bytes{node_name=~\"$node_name\"}))", "refId": "A" } ], @@ -1652,7 +1650,7 @@ "type": "stat" }, { - "description": "", + "description": "Checkpoint age relative to the redo log size. On MySQL 8.0.30 and newer the denominator is the total InnoDB redo log capacity. Older servers expose only the legacy status variables, so the panel falls back to the sync flush threshold (Innodb_checkpoint_max_age), which is smaller than the capacity and therefore reports a higher percentage for the same workload.", "fieldConfig": { "defaults": { "color": { @@ -1723,7 +1721,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) ((max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or \nmax_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[5m])) / (max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[5m])))", + "expr": "avg by (service_name) (max_over_time(mysql_innodb_redo_log_checkpoint_age_ratio{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_innodb_redo_log_checkpoint_age_ratio{service_name=~\"$service_name\"}[5m]) or\n((max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[5m])) /\n(max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[5m]))) or\n((max_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[5m])) /\n(max_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[5m]))))", "format": "time_series", "interval": "$interval", "intervalFactor": 1, diff --git a/dashboards/dashboards/MySQL/MySQL_InnoDB_Details.json b/dashboards/dashboards/MySQL/MySQL_InnoDB_Details.json index ac7f5fa784f..617c5bad583 100644 --- a/dashboards/dashboards/MySQL/MySQL_InnoDB_Details.json +++ b/dashboards/dashboards/MySQL/MySQL_InnoDB_Details.json @@ -251,7 +251,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (node_name) ((mysql_global_variables_innodb_buffer_pool_size{service_name=~\"$service_name\"} * 100)) / \non (node_name) (max by () (container_spec_memory_limit_bytes{node_name=~\"$node_name\",id=~\"/kubepods.*\",container!~\"POD|pmm-client|\"}) or \nmax by () (node_memory_MemTotal_bytes{node_name=~\"$node_name\"}))", + "expr": "avg by (node_name) ((mysql_global_variables_innodb_buffer_pool_size{service_name=~\"$service_name\"} * 100)) / \non (node_name) (max by (node_name) (container_spec_memory_limit_bytes{node_name=~\"$node_name\",id=~\"/kubepods.*\",container!~\"POD|pmm-client|\"}) or \nmax by (node_name) (node_memory_MemTotal_bytes{node_name=~\"$node_name\"}))", "format": "time_series", "interval": "5m", "intervalFactor": 1, @@ -346,7 +346,7 @@ "type": "stat" }, { - "description": "", + "description": "Checkpoint age relative to the redo log size. On MySQL 8.0.30 and newer the denominator is the total InnoDB redo log capacity. Older servers expose only the legacy status variables, so the panel falls back to the sync flush threshold (Innodb_checkpoint_max_age), which is smaller than the capacity and therefore reports a higher percentage for the same workload.", "fieldConfig": { "defaults": { "color": { @@ -417,7 +417,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) ((max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or \nmax_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[5m])) / (max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[5m])))", + "expr": "avg by (service_name) (max_over_time(mysql_innodb_redo_log_checkpoint_age_ratio{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_innodb_redo_log_checkpoint_age_ratio{service_name=~\"$service_name\"}[5m]) or\n((max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[5m])) /\n(max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[5m]))) or\n((max_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[5m])) /\n(max_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[5m]))))", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -6439,7 +6439,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (node_name) ((mysql_global_variables_innodb_buffer_pool_size{service_name=~\"$service_name\"} * 100)) / \non (node_name) (max by () (container_spec_memory_limit_bytes{node_name=~\"$node_name\",id=~\"/kubepods.*\",container!~\"POD|pmm-client|\"}) or \nmax by () (node_memory_MemTotal_bytes{node_name=~\"$node_name\"}))", + "expr": "avg by (node_name) ((mysql_global_variables_innodb_buffer_pool_size{service_name=~\"$service_name\"} * 100)) / \non (node_name) (max by (node_name) (container_spec_memory_limit_bytes{node_name=~\"$node_name\",id=~\"/kubepods.*\",container!~\"POD|pmm-client|\"}) or \nmax by (node_name) (node_memory_MemTotal_bytes{node_name=~\"$node_name\"}))", "format": "time_series", "interval": "5m", "intervalFactor": 1, @@ -7689,7 +7689,7 @@ "calculatedInterval": "2m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) (rate(mysql_global_status_buffer_pool_page_changes_total_pool_page_changes_total{service_name=~\"$service_name\", operation=\"made_young\"}[$interval]) or irate(mysql_global_status_buffer_pool_page_changes_total{service_name=~\"$service_name\", operation=\"made_young\"}[5m]))", + "expr": "avg by (service_name) (rate(mysql_global_status_buffer_pool_page_changes_total{service_name=~\"$service_name\", operation=\"made_young\"}[$interval]) or irate(mysql_global_status_buffer_pool_page_changes_total{service_name=~\"$service_name\", operation=\"made_young\"}[5m]))", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -7702,7 +7702,7 @@ "calculatedInterval": "2m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) (rate(mysql_global_status_buffer_pool_page_changes_total_pool_page_changes_total{service_name=~\"$service_name\", operation=\"made_not_young\"}[$interval]) or irate(mysql_global_status_buffer_pool_page_changes_total{service_name=~\"$service_name\", operation=\"made_not_young\"}[5m]))", + "expr": "avg by (service_name) (rate(mysql_global_status_buffer_pool_page_changes_total{service_name=~\"$service_name\", operation=\"made_not_young\"}[$interval]) or irate(mysql_global_status_buffer_pool_page_changes_total{service_name=~\"$service_name\", operation=\"made_not_young\"}[5m]))", "format": "time_series", "hide": false, "interval": "$interval", @@ -10008,14 +10008,14 @@ }, { "aliasColors": { - "Max Checkpoint Age": "#BF1B00", + "Redo Log Capacity / Max Checkpoint Age": "#BF1B00", "Uncheckpointed Bytes": "#E0752D" }, "bars": false, "dashLength": 10, "dashes": false, "decimals": 2, - "description": "**InnoDB Checkpoint Age**\n\nThe maximum checkpoint age is determined by the total length of all transaction log files (innodb_log_file_size).\n\nWhen the checkpoint age reaches the maximum checkpoint age, blocks are flushed syncronously. The rules of the thumb is to keep one hour of traffic in those logs and let the checkpointing perform its work as smooth as possible. If you don't do this, InnoDB will do synchronous flushing at the worst possible time, ie when you are busiest.\n\n**Notice**: InnoDB_checkpoint_max_age variable was removed in Percona Server for MySQL 8.0.13-4 due to a change in MySQL. It was restored in 8.0.21-12.", + "description": "**InnoDB Checkpoint Age**\n\nOn MySQL 8.0.30 and newer the limit series is the total InnoDB redo log capacity (innodb_redo_log_capacity). Older servers expose only the legacy status variables, so it falls back to the sync flush threshold (Innodb_checkpoint_max_age), which is smaller than the capacity.\n\nWhen the checkpoint age reaches that limit, blocks are flushed synchronously. The rule of thumb is to keep one hour of traffic in those logs and let the checkpointing perform its work as smooth as possible. If you don't do this, InnoDB will do synchronous flushing at the worst possible time, ie when you are busiest.\n\n**Notice**: the Innodb_checkpoint_max_age status variable was removed in Percona Server for MySQL 8.0.13-4 due to a change in MySQL. It was restored in 8.0.21-12.", "editable": true, "error": false, "fieldConfig": { @@ -10063,7 +10063,7 @@ "renderer": "flot", "seriesOverrides": [ { - "alias": "Max Checkpoint Age", + "alias": "Redo Log Capacity / Max Checkpoint Age", "color": "#BF1B00", "fill": 0 } @@ -10076,7 +10076,7 @@ "calculatedInterval": "2m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) (max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or \nmax_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[5m]))", + "expr": "avg by (service_name) (max_over_time(mysql_innodb_redo_log_checkpoint_age_bytes{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_innodb_redo_log_checkpoint_age_bytes{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[5m]))", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -10089,11 +10089,11 @@ "calculatedInterval": "2m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) (max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[5m]))", + "expr": "avg by (service_name) (max_over_time(mysql_innodb_redo_log_capacity_bytes{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_innodb_redo_log_capacity_bytes{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[5m]))", "format": "time_series", "interval": "$interval", "intervalFactor": 1, - "legendFormat": "Max Checkpoint Age", + "legendFormat": "Redo Log Capacity / Max Checkpoint Age", "metric": "", "refId": "B", "step": 300 @@ -10852,7 +10852,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) ((rate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor_total_pages{service_name=~\"$service_name\"}[$interval]) or irate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor_total_pages{service_name=~\"$service_name\"}[5m])))", + "expr": "avg by (service_name) ((rate(mysql_innodb_metrics_buffer_flush_neighbor_pages_total{service_name=~\"$service_name\"}[$interval]) or rate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor_total_pages{service_name=~\"$service_name\"}[$interval])) or (irate(mysql_innodb_metrics_buffer_flush_neighbor_pages_total{service_name=~\"$service_name\"}[5m]) or irate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor_total_pages{service_name=~\"$service_name\"}[5m])))", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -10933,7 +10933,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) ((rate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor{service_name=~\"$service_name\"}[$interval]) or irate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor{service_name=~\"$service_name\"}[5m]))) ", + "expr": "avg by (service_name) ((rate(mysql_innodb_metrics_buffer_flush_neighbor_batches_total{service_name=~\"$service_name\"}[$interval]) or rate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor{service_name=~\"$service_name\"}[$interval])) or (irate(mysql_innodb_metrics_buffer_flush_neighbor_batches_total{service_name=~\"$service_name\"}[5m]) or irate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor{service_name=~\"$service_name\"}[5m]))) ", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -11014,7 +11014,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) ((rate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor_total_pages{service_name=~\"$service_name\"}[$interval])/(rate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor{service_name=~\"$service_name\"}[$interval]))) or (irate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor_total_pages{service_name=~\"$service_name\"}[5m])/(irate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor{service_name=~\"$service_name\"}[5m]))))", + "expr": "avg by (service_name) (((rate(mysql_innodb_metrics_buffer_flush_neighbor_pages_total{service_name=~\"$service_name\"}[$interval]) or rate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor_total_pages{service_name=~\"$service_name\"}[$interval])) / (rate(mysql_innodb_metrics_buffer_flush_neighbor_batches_total{service_name=~\"$service_name\"}[$interval]) or rate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor{service_name=~\"$service_name\"}[$interval]))) or ((irate(mysql_innodb_metrics_buffer_flush_neighbor_pages_total{service_name=~\"$service_name\"}[5m]) or irate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor_total_pages{service_name=~\"$service_name\"}[5m])) / (irate(mysql_innodb_metrics_buffer_flush_neighbor_batches_total{service_name=~\"$service_name\"}[5m]) or irate(mysql_info_schema_innodb_metrics_buffer_buffer_flush_neighbor{service_name=~\"$service_name\"}[5m]))))", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -11422,7 +11422,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) ((rate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[$interval])) or (irate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[5m])))", + "expr": "avg by (service_name) (rate(mysql_innodb_redo_log_current_lsn{service_name=~\"$service_name\"}[$interval]) or\nirate(mysql_innodb_redo_log_current_lsn{service_name=~\"$service_name\"}[5m]) or\nrate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[$interval]) or\nirate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[5m]))", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -11817,7 +11817,7 @@ "type": "stat" }, { - "description": "", + "description": "Checkpoint age relative to the redo log size. On MySQL 8.0.30 and newer the denominator is the total InnoDB redo log capacity. Older servers expose only the legacy status variables, so the panel falls back to the sync flush threshold (Innodb_checkpoint_max_age), which is smaller than the capacity and therefore reports a higher percentage for the same workload.", "fieldConfig": { "defaults": { "color": { @@ -11887,7 +11887,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) ((max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or \nmax_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[5m])) / (max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[5m]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[5m])))", + "expr": "avg by (service_name) (max_over_time(mysql_innodb_redo_log_checkpoint_age_ratio{service_name=~\"$service_name\"}[$interval]) or\nmax_over_time(mysql_innodb_redo_log_checkpoint_age_ratio{service_name=~\"$service_name\"}[5m]) or\n((max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"$service_name\"}[5m])) /\n(max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"$service_name\"}[5m]))) or\n((max_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"$service_name\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"$service_name\"}[5m])) /\n(max_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"$service_name\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[$interval]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"$service_name\"}[5m]))))", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -12814,7 +12814,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) (((rate(mysql_global_status_innodb_os_log_written{service_name=~\"$service_name\"}[$interval]) or irate(mysql_global_status_innodb_os_log_written{service_name=~\"$service_name\"}[5m]))/((rate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[$interval])) or (irate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[5m])))))\n", + "expr": "avg by (service_name) ((rate(mysql_innodb_redo_log_written_bytes_total{service_name=~\"$service_name\"}[$interval]) or\nirate(mysql_innodb_redo_log_written_bytes_total{service_name=~\"$service_name\"}[5m]) or\nrate(mysql_global_status_innodb_os_log_written{service_name=~\"$service_name\"}[$interval]) or\nirate(mysql_global_status_innodb_os_log_written{service_name=~\"$service_name\"}[5m])) /\n(rate(mysql_innodb_redo_log_current_lsn{service_name=~\"$service_name\"}[$interval]) or\nirate(mysql_innodb_redo_log_current_lsn{service_name=~\"$service_name\"}[5m]) or\nrate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[$interval]) or\nirate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[5m])))", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -12978,7 +12978,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) (sum((rate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[$interval]) or irate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[5m]))) / sum((rate(mysql_info_schema_innodb_metrics_transaction_trx_rw_commits_total{service_name=~\"$service_name\"}[$interval]) or irate(mysql_info_schema_innodb_metrics_transaction_trx_rw_commits_total{service_name=~\"$service_name\"}[5m]))))", + "expr": "avg by (service_name) (sum(rate(mysql_innodb_redo_log_current_lsn{service_name=~\"$service_name\"}[$interval]) or\nirate(mysql_innodb_redo_log_current_lsn{service_name=~\"$service_name\"}[5m]) or\nrate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[$interval]) or\nirate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[5m])) /\nsum(rate(mysql_innodb_metrics_transactions_read_write_committed_total{service_name=~\"$service_name\"}[$interval]) or\nirate(mysql_innodb_metrics_transactions_read_write_committed_total{service_name=~\"$service_name\"}[5m]) or\nrate(mysql_info_schema_innodb_metrics_transaction_trx_rw_commits_total{service_name=~\"$service_name\"}[$interval]) or\nirate(mysql_info_schema_innodb_metrics_transaction_trx_rw_commits_total{service_name=~\"$service_name\"}[5m])))", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -14043,7 +14043,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) ((rate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[$interval])) or (irate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[5m])))", + "expr": "avg by (service_name) (rate(mysql_innodb_redo_log_current_lsn{service_name=~\"$service_name\"}[$interval]) or\nirate(mysql_innodb_redo_log_current_lsn{service_name=~\"$service_name\"}[5m]) or\nrate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[$interval]) or\nirate(mysql_global_status_innodb_lsn_current{service_name=~\"$service_name\"}[5m]))", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -17121,7 +17121,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) ((rate(mysql_info_schema_innodb_metrics_purge_purge_upd_exist_or_extern_records_total{service_name=~\"$service_name\"}[$interval])+rate(mysql_info_schema_innodb_metrics_purge_purge_del_mark_records_total{service_name=~\"$service_name\"}[$interval]))/(rate(mysql_info_schema_innodb_metrics_purge_purge_invoked_total{service_name=~\"$service_name\"}[$interval])\r))", + "expr": "avg by (service_name) ((((rate(mysql_innodb_metrics_purge_updated_records_total{service_name=~\"$service_name\"}[$interval]) or rate(mysql_info_schema_innodb_metrics_purge_purge_upd_exist_or_extern_records_total{service_name=~\"$service_name\"}[$interval])) + (rate(mysql_innodb_metrics_purge_delete_marked_records_total{service_name=~\"$service_name\"}[$interval]) or rate(mysql_info_schema_innodb_metrics_purge_purge_del_mark_records_total{service_name=~\"$service_name\"}[$interval]))) / (rate(mysql_innodb_metrics_purge_invocations_total{service_name=~\"$service_name\"}[$interval]) or rate(mysql_info_schema_innodb_metrics_purge_purge_invoked_total{service_name=~\"$service_name\"}[$interval]))) or (((irate(mysql_innodb_metrics_purge_updated_records_total{service_name=~\"$service_name\"}[5m]) or irate(mysql_info_schema_innodb_metrics_purge_purge_upd_exist_or_extern_records_total{service_name=~\"$service_name\"}[5m])) + (irate(mysql_innodb_metrics_purge_delete_marked_records_total{service_name=~\"$service_name\"}[5m]) or irate(mysql_info_schema_innodb_metrics_purge_purge_del_mark_records_total{service_name=~\"$service_name\"}[5m]))) / (irate(mysql_innodb_metrics_purge_invocations_total{service_name=~\"$service_name\"}[5m]) or irate(mysql_info_schema_innodb_metrics_purge_purge_invoked_total{service_name=~\"$service_name\"}[5m]))))", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -18477,7 +18477,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) ((rate( mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_added_total{service_name=~\"$service_name\"}[$interval]) or irate( mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_added_total{service_name=~\"$service_name\"}[5m]))/(rate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_pages_added_total{service_name=~\"$service_name\"}[$interval]) or irate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_pages_added_total{service_name=~\"$service_name\"}[5m]))\r)\n", + "expr": "avg by (service_name) (((rate(mysql_innodb_metrics_adaptive_hash_rows_added_total{service_name=~\"$service_name\"}[$interval]) or rate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_added_total{service_name=~\"$service_name\"}[$interval])) or (irate(mysql_innodb_metrics_adaptive_hash_rows_added_total{service_name=~\"$service_name\"}[5m]) or irate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_added_total{service_name=~\"$service_name\"}[5m]))) / ((rate(mysql_innodb_metrics_adaptive_hash_pages_added_total{service_name=~\"$service_name\"}[$interval]) or rate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_pages_added_total{service_name=~\"$service_name\"}[$interval])) or (irate(mysql_innodb_metrics_adaptive_hash_pages_added_total{service_name=~\"$service_name\"}[5m]) or irate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_pages_added_total{service_name=~\"$service_name\"}[5m]))))\n", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -18561,7 +18561,7 @@ "calculatedInterval": "10m", "datasourceErrors": {}, "errors": {}, - "expr": "avg by (service_name) ((rate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_searches_total{service_name=~\"$service_name\"}[$interval]) or irate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_searches_btree_total{service_name=~\"$service_name\"}[5m]))/\r\n((rate( mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_added_total{service_name=~\"$service_name\"}[$interval]) or irate( mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_added_total{service_name=~\"$service_name\"}[5m]))+ (rate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_removed_total{service_name=~\"$service_name\"}[$interval]) or irate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_removed_total{service_name=~\"$service_name\"}[5m]))+\r\n(rate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_updated_total{service_name=~\"$service_name\"}[$interval]) or irate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_updated_total{service_name=~\"$service_name\"}[5m])))\r)\n\n", + "expr": "avg by (service_name) (((rate(mysql_innodb_metrics_adaptive_hash_searches_total{service_name=~\"$service_name\"}[$interval]) or rate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_searches_total{service_name=~\"$service_name\"}[$interval])) or (irate(mysql_innodb_metrics_adaptive_hash_searches_total{service_name=~\"$service_name\"}[5m]) or irate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_searches_total{service_name=~\"$service_name\"}[5m]))) /\n(((rate(mysql_innodb_metrics_adaptive_hash_rows_added_total{service_name=~\"$service_name\"}[$interval]) or rate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_added_total{service_name=~\"$service_name\"}[$interval])) or (irate(mysql_innodb_metrics_adaptive_hash_rows_added_total{service_name=~\"$service_name\"}[5m]) or irate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_added_total{service_name=~\"$service_name\"}[5m]))) + ((rate(mysql_innodb_metrics_adaptive_hash_rows_removed_total{service_name=~\"$service_name\"}[$interval]) or rate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_removed_total{service_name=~\"$service_name\"}[$interval])) or (irate(mysql_innodb_metrics_adaptive_hash_rows_removed_total{service_name=~\"$service_name\"}[5m]) or irate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_removed_total{service_name=~\"$service_name\"}[5m]))) +\n((rate(mysql_innodb_metrics_adaptive_hash_rows_updated_total{service_name=~\"$service_name\"}[$interval]) or rate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_updated_total{service_name=~\"$service_name\"}[$interval])) or (irate(mysql_innodb_metrics_adaptive_hash_rows_updated_total{service_name=~\"$service_name\"}[5m]) or irate(mysql_info_schema_innodb_metrics_adaptive_hash_index_adaptive_hash_rows_updated_total{service_name=~\"$service_name\"}[5m])))))\n\n", "format": "time_series", "interval": "$interval", "intervalFactor": 1, diff --git a/dashboards/dashboards/MySQL/MySQL_Instance_Summary.json b/dashboards/dashboards/MySQL/MySQL_Instance_Summary.json index 6ddf8f9839d..a386c8bb252 100644 --- a/dashboards/dashboards/MySQL/MySQL_Instance_Summary.json +++ b/dashboards/dashboards/MySQL/MySQL_Instance_Summary.json @@ -2988,6 +2988,22 @@ "title": "Query Cache", "type": "row" }, + { + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 118 + }, + "id": 9002, + "options": { + "content": "ℹ️ **Query Cache was removed in Oracle MySQL 8.0 and Percona Server 8.0, so empty charts are expected there. MariaDB still ships a query cache, but it is disabled by default, so charts stay empty unless `query_cache_type` is enabled.**", + "mode": "markdown" + }, + "pluginVersion": "8.3.5", + "transparent": true, + "type": "text" + }, { "aliasColors": {}, "bars": false, @@ -3007,10 +3023,10 @@ "fillGradient": 0, "grid": {}, "gridPos": { - "h": 8, + "h": 7, "w": 12, "x": 0, - "y": 118 + "y": 121 }, "hiddenSeries": false, "id": 46, @@ -3125,10 +3141,10 @@ "fillGradient": 0, "grid": {}, "gridPos": { - "h": 8, + "h": 7, "w": 12, "x": 12, - "y": 118 + "y": 121 }, "height": "", "hiddenSeries": false, @@ -3271,7 +3287,7 @@ "h": 1, "w": 24, "x": 0, - "y": 126 + "y": 128 }, "id": 392, "panels": [], @@ -3299,7 +3315,7 @@ "h": 8, "w": 12, "x": 0, - "y": 127 + "y": 129 }, "hiddenSeries": false, "id": 43, @@ -3403,7 +3419,7 @@ "h": 8, "w": 12, "x": 12, - "y": 127 + "y": 129 }, "hiddenSeries": false, "id": 41, @@ -3514,7 +3530,7 @@ "h": 1, "w": 24, "x": 0, - "y": 135 + "y": 137 }, "id": 393, "panels": [], @@ -3543,7 +3559,7 @@ "h": 8, "w": 12, "x": 0, - "y": 136 + "y": 138 }, "hiddenSeries": false, "id": 44, @@ -3694,7 +3710,7 @@ "h": 8, "w": 12, "x": 12, - "y": 136 + "y": 138 }, "hiddenSeries": false, "id": 42, @@ -3801,7 +3817,7 @@ "h": 1, "w": 24, "x": 0, - "y": 144 + "y": 146 }, "id": 394, "panels": [], @@ -3830,7 +3846,7 @@ "h": 8, "w": 24, "x": 0, - "y": 145 + "y": 147 }, "hiddenSeries": false, "id": 54, @@ -3952,7 +3968,7 @@ "h": 1, "w": 24, "x": 0, - "y": 153 + "y": 155 }, "id": 291, "panels": [ diff --git a/dashboards/dashboards/MySQL/MySQL_Instances_Compare.json b/dashboards/dashboards/MySQL/MySQL_Instances_Compare.json index f7a1dc5dcd6..dc4dab91e2d 100644 --- a/dashboards/dashboards/MySQL/MySQL_Instances_Compare.json +++ b/dashboards/dashboards/MySQL/MySQL_Instances_Compare.json @@ -3348,6 +3348,22 @@ }, "id": 391, "panels": [ + { + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 33 + }, + "id": 9003, + "options": { + "content": "ℹ️ **Query Cache was removed in Oracle MySQL 8.0 and Percona Server 8.0, so empty charts are expected there. MariaDB still ships a query cache, but it is disabled by default, so charts stay empty unless `query_cache_type` is enabled.**", + "mode": "markdown" + }, + "pluginVersion": "8.3.5", + "transparent": true, + "type": "text" + }, { "aliasColors": {}, "bars": false, @@ -3376,7 +3392,7 @@ "h": 8, "w": 24, "x": 0, - "y": 35 + "y": 36 }, "hiddenSeries": false, "id": 46, @@ -3503,7 +3519,7 @@ "h": 8, "w": 24, "x": 0, - "y": 43 + "y": 44 }, "height": "", "hiddenSeries": false, diff --git a/dashboards/dashboards/MySQL/MySQL_Instances_Overview.json b/dashboards/dashboards/MySQL/MySQL_Instances_Overview.json index 53373263e28..bec00f4730d 100644 --- a/dashboards/dashboards/MySQL/MySQL_Instances_Overview.json +++ b/dashboards/dashboards/MySQL/MySQL_Instances_Overview.json @@ -5665,7 +5665,7 @@ "type": "stat" }, { - "description": "", + "description": "Query Cache was removed in Oracle MySQL 8.0 and Percona Server 8.0, so no data is expected there. MariaDB still ships a query cache, but it is disabled by default, so data appears only when `query_cache_type` is enabled.", "fieldConfig": { "defaults": { "color": { @@ -6176,6 +6176,22 @@ }, "id": 391, "panels": [ + { + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 29 + }, + "id": 9001, + "options": { + "content": "ℹ️ **Query Cache was removed in Oracle MySQL 8.0 and Percona Server 8.0, so empty charts are expected there. MariaDB still ships a query cache, but it is disabled by default, so charts stay empty unless `query_cache_type` is enabled.**", + "mode": "markdown" + }, + "pluginVersion": "8.3.5", + "transparent": true, + "type": "text" + }, { "aliasColors": {}, "bars": true, @@ -6198,7 +6214,7 @@ "h": 8, "w": 12, "x": 0, - "y": 30 + "y": 32 }, "hiddenSeries": false, "id": 46, @@ -6324,7 +6340,7 @@ "h": 8, "w": 12, "x": 12, - "y": 30 + "y": 32 }, "id": 421, "links": [], diff --git a/dashboards/dashboards/MySQL/MySQL_Performance_Schema_Details.json b/dashboards/dashboards/MySQL/MySQL_Performance_Schema_Details.json index 848a5ba7163..011f2be44ed 100644 --- a/dashboards/dashboards/MySQL/MySQL_Performance_Schema_Details.json +++ b/dashboards/dashboards/MySQL/MySQL_Performance_Schema_Details.json @@ -363,7 +363,7 @@ "dashLength": 10, "dashes": false, "decimals": 2, - "description": "The Performance Schema status variables provide information about instrumentation that could not be loaded or created due to memory constraints.", + "description": "The Performance Schema status variables provide information about instrumentation that could not be loaded or created due to memory constraints.\n\nOnly instrumentation whose lost counter is non-zero is plotted, so an empty panel means nothing was lost. The counter is cumulative, so instrumentation that lost events before the selected range stays visible as a flat zero line, and zero samples between events remain visible.", "editable": true, "error": false, "fieldConfig": { @@ -423,7 +423,7 @@ "targets": [ { "exemplar": true, - "expr": "increase(mysql_global_status_performance_schema_lost_total{service_name=~\"$service_name\"}[$interval])> 0 or increase(mysql_global_status_performance_schema_lost_total{service_name=~\"$service_name\"}[5m]) > 0", + "expr": "(increase(mysql_global_status_performance_schema_lost_total{service_name=~\"$service_name\"}[$interval]) or increase(mysql_global_status_performance_schema_lost_total{service_name=~\"$service_name\"}[5m]))\nand on (service_name, instrumentation) (max_over_time(mysql_global_status_performance_schema_lost_total{service_name=~\"$service_name\"}[$__range]) > 0)", "format": "time_series", "interval": "$interval", "intervalFactor": 1, diff --git a/dashboards/dashboards/MySQL/MySQL_Table_Details.json b/dashboards/dashboards/MySQL/MySQL_Table_Details.json index eb96f024b6c..8352846ccbf 100644 --- a/dashboards/dashboards/MySQL/MySQL_Table_Details.json +++ b/dashboards/dashboards/MySQL/MySQL_Table_Details.json @@ -439,16 +439,15 @@ "editable": true, "error": false, "gridPos": { - "h": 2, + "h": 3, "w": 24, "x": 0, "y": 18 }, - "height": "50px", "id": 44, "links": [], "options": { - "content": "The next two graphs are available only for [Percona Server](https://per.co.na/5_6_diagnostics_user_stat) and [MariaDB](https://mariadb.com/kb/en/mariadb/user-statistics/) and require `userstat` variable turned on.", + "content": "Table activity uses `INFORMATION_SCHEMA.TABLE_STATISTICS` on [Percona Server](https://per.co.na/5_6_diagnostics_user_stat) and [MariaDB](https://mariadb.com/kb/en/mariadb/user-statistics/) when `userstat` is enabled. On Oracle MySQL, including MySQL 9.7, it uses `performance_schema.table_io_waits_summary_by_table`. Both sources require per-table statistics collection, which PMM disables for services with more tables than the configured table statistics limit.", "mode": "markdown" }, "pluginVersion": "8.3.5", @@ -462,7 +461,7 @@ "h": 1, "w": 24, "x": 0, - "y": 20 + "y": 21 }, "id": 58, "panels": [], @@ -490,7 +489,7 @@ "h": 8, "w": 24, "x": 0, - "y": 21 + "y": 22 }, "hiddenSeries": false, "id": 48, @@ -530,7 +529,7 @@ "calculatedInterval": "2m", "datasourceErrors": {}, "errors": {}, - "expr": "topk(5, avg by (service_name,schema,table) (rate(mysql_info_schema_table_statistics_rows_read_total{service_name=~\"$service_name\"}[$interval]))>0) or \ntopk(5, avg by (service_name,schema,table) (irate(mysql_info_schema_table_statistics_rows_read_total{service_name=~\"$service_name\"}[5m]))>0)", + "expr": "topk(5, (avg by (service_name, schema, table) (rate(mysql_info_schema_table_statistics_rows_read_total{service_name=~\"$service_name\"}[$interval])) or avg by (service_name, schema, table) (label_replace(rate(mysql_perf_schema_table_io_waits_total{service_name=~\"$service_name\", operation=\"fetch\"}[$interval]), \"table\", \"$1\", \"name\", \"(.*)\"))) > 0) or topk(5, (avg by (service_name, schema, table) (irate(mysql_info_schema_table_statistics_rows_read_total{service_name=~\"$service_name\"}[5m])) or avg by (service_name, schema, table) (label_replace(irate(mysql_perf_schema_table_io_waits_total{service_name=~\"$service_name\", operation=\"fetch\"}[5m]), \"table\", \"$1\", \"name\", \"(.*)\"))) > 0)", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -580,7 +579,7 @@ "h": 1, "w": 24, "x": 0, - "y": 29 + "y": 30 }, "id": 59, "panels": [], @@ -608,7 +607,7 @@ "h": 8, "w": 24, "x": 0, - "y": 30 + "y": 31 }, "hiddenSeries": false, "id": 42, @@ -650,7 +649,7 @@ "calculatedInterval": "2m", "datasourceErrors": {}, "errors": {}, - "expr": "topk(5, avg by (service_name,schema,table) (rate(mysql_info_schema_table_statistics_rows_changed_total{service_name=~\"$service_name\"}[$interval])>0)) or topk(5, avg by (service_name,schema,table) (irate(mysql_info_schema_table_statistics_rows_changed_total{service_name=~\"$service_name\"}[5m]))>0)", + "expr": "topk(5, (avg by (service_name, schema, table) (rate(mysql_info_schema_table_statistics_rows_changed_total{service_name=~\"$service_name\"}[$interval])) or sum by (service_name, schema, table) (label_replace(rate(mysql_perf_schema_table_io_waits_total{service_name=~\"$service_name\", operation=~\"insert|update|delete\"}[$interval]), \"table\", \"$1\", \"name\", \"(.*)\"))) > 0) or topk(5, (avg by (service_name, schema, table) (irate(mysql_info_schema_table_statistics_rows_changed_total{service_name=~\"$service_name\"}[5m])) or sum by (service_name, schema, table) (label_replace(irate(mysql_perf_schema_table_io_waits_total{service_name=~\"$service_name\", operation=~\"insert|update|delete\"}[5m]), \"table\", \"$1\", \"name\", \"(.*)\"))) > 0)", "format": "time_series", "interval": "$interval", "intervalFactor": 1, @@ -700,7 +699,7 @@ "h": 1, "w": 24, "x": 0, - "y": 38 + "y": 39 }, "id": 60, "panels": [], @@ -721,7 +720,7 @@ "h": 7, "w": 24, "x": 0, - "y": 39 + "y": 40 }, "height": "", "hideTimeOverride": true, @@ -998,7 +997,7 @@ "h": 1, "w": 24, "x": 0, - "y": 46 + "y": 47 }, "id": 293, "panels": [ @@ -2283,7 +2282,7 @@ "h": 1, "w": 24, "x": 0, - "y": 47 + "y": 48 }, "id": 291, "panels": [ diff --git a/managed/data/checks/mysql_innodb_redo_logs_not_sized_correctly.yml b/managed/data/checks/mysql_innodb_redo_logs_not_sized_correctly.yml index 04090c4880d..bf261bf6728 100644 --- a/managed/data/checks/mysql_innodb_redo_logs_not_sized_correctly.yml +++ b/managed/data/checks/mysql_innodb_redo_logs_not_sized_correctly.yml @@ -19,11 +19,11 @@ checks: range: 168h step: 5m - type: METRICS_INSTANT - query: avg by (service_name) (mysql_global_variables_innodb_log_files_in_group{service_name=~"{{.ServiceName}}"} * mysql_global_variables_innodb_log_file_size{service_name=~"{{.ServiceName}}"}) + query: avg by (service_name) (mysql_global_variables_innodb_redo_log_capacity{service_name=~"{{.ServiceName}}"}) or avg by (service_name) (mysql_global_variables_innodb_log_files_in_group{service_name=~"{{.ServiceName}}"} * mysql_global_variables_innodb_log_file_size{service_name=~"{{.ServiceName}}"}) parameters: lookback: 5m - type: METRICS_RANGE - query: " (avg by (service_name) (max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"{{.ServiceName}}\"}[1h]) or max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"{{.ServiceName}}\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"{{.ServiceName}}\"}[1h]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"{{.ServiceName}}\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"{{.ServiceName}}\"}[1h]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"{{.ServiceName}}\"}[5m]))) * 100 / (avg by (service_name) (max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"{{.ServiceName}}\"}[1h]) or max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"{{.ServiceName}}\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"{{.ServiceName}}\"}[1h]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"{{.ServiceName}}\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"{{.ServiceName}}\"}[1h]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"{{.ServiceName}}\"}[5m])))\"" + query: " (avg by (service_name) (max_over_time(mysql_innodb_redo_log_checkpoint_age_ratio{service_name=~\"{{.ServiceName}}\"}[1h]) or max_over_time(mysql_innodb_redo_log_checkpoint_age_ratio{service_name=~\"{{.ServiceName}}\"}[5m])) * 100) or (avg by (service_name) (max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"{{.ServiceName}}\"}[1h]) or max_over_time(mysql_global_status_innodb_checkpoint_age{service_name=~\"{{.ServiceName}}\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"{{.ServiceName}}\"}[1h]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_lsn_checkpoint_age_total{service_name=~\"{{.ServiceName}}\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"{{.ServiceName}}\"}[1h]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_lsn_checkpoint_age{service_name=~\"{{.ServiceName}}\"}[5m]))) * 100 / (avg by (service_name) (max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"{{.ServiceName}}\"}[1h]) or max_over_time(mysql_global_status_innodb_checkpoint_max_age{service_name=~\"{{.ServiceName}}\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"{{.ServiceName}}\"}[1h]) or max_over_time(mysql_info_schema_innodb_metrics_recovery_log_max_modified_age_async{service_name=~\"{{.ServiceName}}\"}[5m]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"{{.ServiceName}}\"}[1h]) or max_over_time(mysql_info_schema_innodb_metrics_log_log_max_modified_age_async{service_name=~\"{{.ServiceName}}\"}[5m])))\"" parameters: range: 168h step: 5m @@ -43,30 +43,49 @@ checks: redo_log_size = 0 logsWritten = [] - redo_log_size = int(docs[2][0]["value"][1]) + # MySQL 8.0.30 replaced innodb_log_file_size/innodb_log_files_in_group with + # innodb_redo_log_capacity, and MySQL 9.x dropped the legacy variables + # entirely. Both spellings are queried, but if neither is exposed there is + # no size to compare the written redo against, so bail out instead of + # falling through with a zero size and flagging every sample as a spike. + if len(docs[2]) == 0: + return None + redo_log_size = int(float(docs[2][0]["value"][1])) + if redo_log_size <= 0: + return None + if len(docs[1]) == 0 or len(docs[1][0]["values"]) == 0: + return None + + # Sample values arrive as strings and increase() can yield fractional + # results, so parse them as floats. int() would reject "123.5". for row in docs[1][0]["values"]: - logsWritten.append(row[1]) - logs_written_tot = int(logs_written_tot) + int(row[1]) - if logs_written_max < int(row[1]): - logs_written_max = int(row[1]) - cnt = int(cnt) + 1 - if int(row[1]) > redo_log_size: - cnt_high = int(cnt_high) + 1 - logs_written_avg = logs_written_tot / int(cnt) / 1024 / 1024 + logs_written = float(row[1]) + logsWritten.append(logs_written) + logs_written_tot = logs_written_tot + logs_written + if logs_written_max < logs_written: + logs_written_max = logs_written + cnt = cnt + 1 + if logs_written > redo_log_size: + cnt_high = cnt_high + 1 + logs_written_avg = logs_written_tot / cnt / 1024 / 1024 checkpoint_age_usage_perc = [] chkpt_alert = 0 - for row in docs[3][0]["values"]: - checkpoint_age_usage_perc.append(row[1]) - if float(row[1]) > 80: - chkpt_alert = int(chkpt_alert) + 1 + # Checkpoint age samples are optional. Without them only the + # checkpoint age error below is skipped, the write volume warning + # still applies since it needs docs[1] and docs[2] only. + if len(docs[3]) > 0: + for row in docs[3][0]["values"]: + checkpoint_age_usage_perc.append(row[1]) + if float(row[1]) > 80: + chkpt_alert = chkpt_alert + 1 if chkpt_alert > 1: return { "summary": "Redo log size check.", "read_more": "https://percona.com/blog", - "description": "Current total redo log size is {}M. It is noted that the checkpoint age is utilizing more than 80% of maximum checkpoint age. In such cases the blocks are flushed synchronously and can cause the degraded performance. It is important to revise the redo_log_size. The average logs written in past 24h is {}M with spikes above redo_log_size being {}% of total samples with max written redolog size being {}M.".format(int(redo_log_size/1024/1024),int(logs_written_avg), int(cnt_high*100/cnt),int(logs_written_max/1024/1024)), + "description": "Current total redo log size is {}M. It is noted that the checkpoint age is utilizing more than 80% of the total redo log capacity (of the maximum checkpoint age on servers older than MySQL 8.0.30). In such cases the blocks are flushed synchronously and can cause the degraded performance. It is important to revise the redo_log_size. The average redo written per hour over the past 7 days is {}M with spikes above redo_log_size being {}% of total samples with max written redolog size being {}M.".format(int(redo_log_size/1024/1024),int(logs_written_avg), int(cnt_high*100/cnt),int(logs_written_max/1024/1024)), "severity": "error", "labels": { "mysql_version": "{}".format(version), @@ -78,7 +97,7 @@ checks: return { "summary": "Redo log size check.", "read_more": "https://percona.com/blog", - "description": "Current total redo log size is {}M. The relo log written are more than the configured though this hasn't caused system degradation. The average logs written in past 24h is {}M with spikes above redo_log_size being {}% of total samples with max written redolog size being {}M. ".format(int(redo_log_size/1024/1024),int(logs_written_avg), int(cnt_high*100/cnt),int(logs_written_max/1024/1024)), + "description": "Current total redo log size is {}M. The relo log written are more than the configured though this hasn't caused system degradation. The average redo written per hour over the past 7 days is {}M with spikes above redo_log_size being {}% of total samples with max written redolog size being {}M. ".format(int(redo_log_size/1024/1024),int(logs_written_avg), int(cnt_high*100/cnt),int(logs_written_max/1024/1024)), "severity": "warning", "labels": { "mysql_version": "{}".format(version),