shows a runningChart (like for reads) for the recovery speed also shows a progressbar of the health percentage of the cluster with an estimate of how long the recovery might need (unhealthy objects) / (objects per second)
only show them when a recovery is ongoing or there are unhealthy objects Signed-off-by: Dominik Csapak <d.csa...@proxmox.com> --- we could also opt to only show it when there is really recovery going on (recovering_objects_per_sec !== undefined) but in my tests sometimes during recovery, ceph would not return those values intermittently, making the panel flicker, so i opted to show it also when there are unhealthy objects (though i am not opposed to to the first and have some counter to catch intermittent missing values) www/manager6/ceph/Status.js | 63 +++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/www/manager6/ceph/Status.js b/www/manager6/ceph/Status.js index e75fe5c0..7d1474eb 100644 --- a/www/manager6/ceph/Status.js +++ b/www/manager6/ceph/Status.js @@ -188,9 +188,37 @@ Ext.define('PVE.node.CephStatus', { items: [ { flex: 1, - xtype: 'proxmoxGauge', - itemId: 'space', - title: gettext('Usage') + xtype: 'container', + items: [ + { + xtype: 'proxmoxGauge', + itemId: 'space', + title: gettext('Usage') + }, + { + flex: 1, + border: false, + }, + { + xtype: 'container', + itemId: 'recovery', + hidden: true, + padding: 25, + items: [ + { + itemId: 'recoverychart', + xtype: 'pveRunningChart', + title: gettext('Recovery'), + renderer: PVE.Utils.render_bandwidth, + height: 100, + }, + { + xtype: 'progressbar', + itemId: 'recoveryprogress', + }, + ] + }, + ] }, { flex: 2, @@ -297,6 +325,35 @@ Ext.define('PVE.node.CephStatus', { me.writes.addDataPoint(writes); me.readiops.addDataPoint(readiops); me.writeiops.addDataPoint(writeiops); + + let degraded = pgmap.degraded_objects || 0; + let misplaced = pgmap.misplaced_objects || 0; + let unfound = pgmap.unfound_objects || 0; + let unhealthy = degraded + unfound + misplaced; + // update recovery + if (pgmap.recovering_objects_per_sec !== undefined || unhealthy > 0) { + let total = pgmap.misplaced_total || pgmap.unfound_total || pgmap.degraded_total || 0; + if (total === 0) return; + let recovered = (total - unhealthy) || 0; + let speed = pgmap.recovering_bytes_per_sec || 0; + let speedTxt = PVE.Utils.render_bandwidth(speed); + let obj_per_sec = speed / (4*1024*1024); // 4MiB per Object + let duration = Proxmox.Utils.format_duration_human(unhealthy/obj_per_sec); + + let percentage = recovered/total; + let txt = `${(percentage*100).toFixed(2)}%`; + if (speed > 0) { + txt += ` (${speedTxt} - ${duration} left)`; + } + + me.down('#recovery').setVisible(true); + me.down('#recoveryprogress').updateValue(percentage); + me.down('#recoveryprogress').updateText(txt); + me.down('#recoverychart').addDataPoint(speed); + } else { + me.down('#recovery').setVisible(false); + me.down('#recoverychart').addDataPoint(0); + } }, initComponent: function() { -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel